RC ohjattu 600l roska-astia

ref Kennel Helsinki

Arduino RC-vastarikoodi nyt myös githubissa: https://github.com/rambo/Arduino_rcreceiver/blob/master/Arduino_rcreceiver.ino

----
Moi 
Saanen sanoa muutaman sanan.
Teimme Robosodan puitteissa joskus vähän vastaavan projektin, mm radio-ohjattava jääkaappi ja pesukone. 
Käytimme noissa akkuporakoneen moottoreita. Moottorit pitää modata jotta saadaan momenttisäätö pois. Täällä hyvä ohje: http://www.kolumbus.fi/rex/akkuporan_modaus_ohjeet.html
Nopeudensäätimien tyyppiä en muista mutta jokin jenkkiläisen robokaupan säädin, hyvä mutta kallis. Akkuporakonee moottorille voisi riittää hyvin esim. Robbe Rookie 25 säädin. Edullinen pakilla varustettu säädin. Jokaiselle moottorille yksi. Ohjaus noille säätimille esim GWS:n V-tail mikserin kautta, jos radio- ohjaimessa  ei ole tuota ominaisuutta. V-mikserillä saadaan aikaiseksi ns. tankki ohjaus.  Minulta löytyis ainakin tuo V-mikseri ja varmaan pari rookie säädintäkin lainaan. Rungon moottoreille, pyörille ja muulle roipeelle teimme yksinkertaisesti puusta. Akkuna 12V 18Ah lyijyakku.
Muuten olen niin kiinni muissa projekteissa etten pysty auttamaan rakennusprojektissa, vaikka mieli tekisikin. 

T:Petri 
----

v-mikseri tehty Arduino softassa (kts padin loppu), H-sillat (aka nopeudensäätimet) on Arduinon päällä shieldissä (12A jatkuvaa virtaa per moottori kertaa 2 moottoria)

/Rambo
----

Tilanne 2013.05.11
Tilanne 2013.05.09
Tilanne 2013.05.07

Astia läbillä, ja pohdittu on:

Kokeillaan: polkupyörän rattaat kiinni takarenkaisiin josta ketju sisään ja Biltema CD12 ruuvinvääntimellä pyöritellään toista ratasta

rambolla on pololun motor driver shieldi (muistaakseni VNH5019) jolla voi ohjata ruuvinvääntimien moottoreita kuhan kaivellaan johdot esiin (ja otetaan syöttö autonakusta).

jaronekolta saatiin lainaa radiolaitteet, kytketään arduun joka tulkkaa signaalit moottoriohjaimelle.

Otin yhden pyörän irti tarkasteltavaksi (pajassa). jos ruuvivääntimessä on kiristettävä sokka voisi olla mahdollista kiinnittää se suoraan pyörän akseliin ilman välityksiä jolloin vetäviä pyöriä voisi kääntää. Olen helatorstaina paikalla jos rakennetaan hökötys silloin. Mulla on hakatty lennokkisofta odroidille jolla voi ohjata pololulua joystickillä wlanin yli.

Mitä jos polkupyörän ratas ottaisi suoraan kiinni maahan eikä pyörään?

http://www.biltema.fi/fi/Tyokalut/Sahkotyokalut/Porakone-akkukayttoinen/Porakone-ja-ruuvinvaannin-CD-12-V-17358/

http://www.pololu.com/catalog/product/2502



Voisin tuoda torstaina vähän omia robokamoja labille, niistä voisi olla jotain iloa. Löytyy tehokkaita moottorinohjaimia ja yksi robotti minkä saisi esim. suoraan pultattua roskiksen pohjaan kiinni.  --Eipou

Heitin keskiviikkona labille kaksi vanerilevyä ja kaksi noita tusinavääntimiä Biltemasta..

Moottorit renkaiden vieressä ei mielestäni toimi, koska ne saattaa ottaa kipeetä kuvaustilanteessa ja näkyvätkin aika ilkeästi. Rakennelman olisi hyvä olla sellainen, että koko Labin varikkotiimin ei tarvitse päivystää kuvauspaikalla.

Hankittavaa olisi ainakin vielä: 
Lanttu

---------BEGIN: Arduino RC vastaanotto ja Pololu ohjaussofta ----
// Get this from https://github.com/pololu/Dual-VNH5019-Motor-Shield
#include "DualVNH5019MotorShield.h"
DualVNH5019MotorShield md;
// Get this from https://github.com/rambo/PinChangeInt_userData
#include "PinChangeInt_userData.h"

#define SERVO_MIDDLE 1500

// To hold data for reach RC input pin.
typedef struct {
    const uint8_t pin;
    volatile unsigned long start_micros;
    volatile unsigned long stop_micros;
    volatile boolean new_data;
    uint16_t servo_position; // microseconds
} RCInput;

// Initialize the inputs to an array
RCInput inputs[] = {
    { A4, 0, 0, false, SERVO_MIDDLE }, // Forward/backward
    { A5, 0, 0, false, SERVO_MIDDLE }, // Left/right
};
const uint8_t inputs_len = sizeof(inputs) / sizeof(RCInput);

// Speeds for the left & right motors
int16_t left_speed = 0;
int16_t right_speed = 0;

// Called whenever a control pulse ends
void rc_pulse_low(void* inptr)
{
    RCInput* input = (RCInput*)inptr;
    input->stop_micros = micros();
    input->new_data = true;
}

// Called whenever a control pulse starts
void rc_pulse_high(void* inptr)
{
    RCInput* input = (RCInput*)inptr;
    input->new_data = false;
    input->start_micros = micros();
}

// Calculates the servo position, called from the mainloop whenever there is new data
void calc_servo_position(void* inptr)
{
    RCInput* input = (RCInput*)inptr;
    input->servo_position = (uint16_t)(input->stop_micros - input->start_micros);
    input->new_data = false;
}

int16_t clip_md_speed(int16_t spd)
{
    if (spd > 400)
    {
        spd = 400;
    }
    if (spd < -400)
    {
        spd = -400;
    }
    return spd;
}

int16_t map_rc_to_speed(uint16_t servo_position)
{
    return clip_md_speed(servo_position - SERVO_MIDDLE);
}

void stopIfFault()
{
  if (md.getM1Fault())
  {
    Serial.println(F("M1 fault"));
    md.setSpeeds(0,0);
    while(1);
  }
  if (md.getM2Fault())
  {
    Serial.println(F("M2 fault"));
    md.setSpeeds(0,0);
    while(1);
  }
}


void setup()
{
    Serial.begin(115200);
    Serial.println(F("RC controlled dual VNH5019 Motor Shield"));
    md.init();
    
    // Attach pin change interrupts for the RCInputs
    for (uint8_t i=0; i < inputs_len; i++)
    {
        PCintPort::attachInterrupt(inputs[i].pin, &rc_pulse_high, RISING, &inputs[i]);
        PCintPort::attachInterrupt(inputs[i].pin, &rc_pulse_low, FALLING, &inputs[i]);
    }
    Serial.println(F("Booted"));
}

volatile unsigned long last_report_time = millis();
int16_t lrspeed = 0;
int16_t fbspeed = 0;
void loop()
{
    // Stop and hang if motor driver has fault
    stopIfFault();

    // Check inputs for new data
    for (uint8_t i=0; i < inputs_len; i++)
    {
        if (inputs[i].new_data)
        {
            calc_servo_position(&inputs[i]);
        }
    }

    lrspeed = map_rc_to_speed(inputs[1].servo_position);
    if (lrspeed != 0)
    {
        left_speed = lrspeed;
        right_speed = -1 * lrspeed;
    }
    else
    {
        left_speed = 0;
        right_speed = 0;
    }
    fbspeed = map_rc_to_speed(inputs[0].servo_position);
    left_speed += fbspeed;
    right_speed += fbspeed;


    // Set speeds
    left_speed = clip_md_speed(left_speed);
    right_speed = clip_md_speed(right_speed);
    md.setSpeeds(left_speed, right_speed);

    // Report positions every second
    if (millis() - last_report_time > 200)
    {
        for (uint8_t i=0; i < inputs_len; i++)
        {
            Serial.print(F("Channel "));
            Serial.print(i, DEC);
            Serial.print(F(" position "));
            Serial.print(inputs[i].servo_position, DEC);
            Serial.print(F(" speed "));
            Serial.println(map_rc_to_speed(inputs[i].servo_position), DEC);
        }
        Serial.print(F("Left motor speed "));
        Serial.println(left_speed, DEC);
        Serial.print(F("Right motor speed "));
        Serial.println(right_speed, DEC);
        last_report_time = millis();
    }
}
---------END: Arduino RC vastaanotto ja Pololu ohjaussofta ----