Robotas iš žaislinės mašinėlės

IMG1716

Šį šeštadienį lankiausi Birmingemo Howduino – vienos dienos hakerių susitikime. Nelabai žinojau ko tikėtis iš tokio tipo įvykio, todėl ir važiavau be jokios išankstinės nuostatos. :) Po trumpo organizacinio pristatymo apie 11 val. ryto prasidėjo darbas: vieni dalyviai išsiskirstė į mokymo grupes, kiti ėmėsi dirbti prie savo projektų.

Mano užduotis

Mano tos dienos tikslas buvo šią radijo bangom valdomą mašinėlę paversti į kliūtis apvažiuojantį robotą.

IMG1710

Šiam projektui anksčiau įsigytą mašiną palikau namie, nes ši – daug mažesnė, kompaktiškesnė ir naudoja mažiau energijos. Ji taipogi yra varoma dviem atskirais varikliukais, valdančiais po vieną ratų pusę.

Pradedam ardymą!

IMG1711

Viršuje – išardytos mašinėlės nuotrauka. Pats žaislas tikrai geros kokybės, nes su juo galima važinėti per purvą ir net plaukti vandeniu. Ką gali žinoti, gal ir šiai savybei rasim robotizuotą pritaikymą. :) Nuo mašinėlės važiuoklės dalies einančius laidus nukirpau maždaug ties viduriu ir prilitavau ilgesnius, kad galėčiau eksperimentuoti. Visą radijo bangom valdomą elektroniką atidėjau į šalį. Galbūt ją panaudosiu vėliau, kai galėsiu padaryti dvigubą mašinėlės valdymą: perjungiamą tarp valdymo radijo bangom arba robotizuoto.

IMG1712

Trumpa pertraukėlė: mano darbo stalas. Labai nervino prastas apšvietimas, bet atmosfera buvo puiki: apie 40 hakerių vienoje vietoje besidalinančių idėjomis ir elektronikos dalimis. Visi nuolat prie ko nors dirbo, žiūrėjo kaip sekėsi kitiems ar patys pasakojo savo problemas ir įspūdžius.

IMG1713

Viskas paruošta testavimui: apversta važiuoklė, kad betestuojant nenuriedėtų kartu su visom elektroninėm dalim, L293D varikliukų valdymo mikroschema ant prototipinės plokštės, Arduino MEGA, SRF05 atstumo detektorius ant servo. Beje, servo nebuvo naudojamas, nes būčiau nesuspėjęs laiku užbaigti, kadangi būtų tekę rašyti daug sudėtingesnį kodą norint padaryti atstumo detektorių besisukiojantį 180 laipsnių kampu.

Kodas

Dalį kodo pasiskolinau iš LuckyLarry’s Obstacle avoidance robot.

const int numOfReadings = 10; // number of readings to take/ items in the array
int readings[numOfReadings];  // stores the distance readings in an array
int arrayIndex = 0;           // arrayIndex of the current item in the array
int total = 0;                // stores the cumlative total
int averageDistance = 0;      // stores the average value
unsigned long distance = 0;

const int motor1Pin1 = 2;    // H-bridge leg 1
const int motor1Pin2 = 3;    // H-bridge leg 2
const int motor2Pin1 = 4;    // H-bridge leg 3
const int motor2Pin2 = 5;    // H-bridge leg 4
const int enable1Pin = 9;    // H-bridge enable pin
const int enable2Pin = 10;   // H-bridge enable pin
const int ledPin = 13;       // LED

#define echoPin 6             // the SRF04's echo pin
#define initPin 7             // the SRF04's init pin
unsigned long pulseTime = 0;  // variable for reading the pulse
long servoAngle = 90;         // variable for reading the pulse
int servoDirection = 1;

void setup() {
  pinMode(ledPin, OUTPUT);

  // set all the other pins you're using as outputs:
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);

  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(enable2Pin, OUTPUT);

  // set enablePin high so that motor can turn on:
  digitalWrite(enable1Pin, HIGH);
  digitalWrite(enable2Pin, HIGH);

  // make the init pin an output:
  pinMode(initPin, OUTPUT);
  // make the echo pin an input:
  pinMode(echoPin, INPUT);

  for (int thisReading = 0; thisReading < numOfReadings; thisReading++)
  {
    readings[thisReading] = 0;
  }

  // blink the LED 3 times. This should happen only once.
  // if you see the LED blink three times, it means that the module
  // reset itself,. probably because the motor caused a brownout
  // or a short.
  blink(ledPin, 3, 100);
}

void loop() {
  digitalWrite(initPin, HIGH);         // send 10 microsecond pulse
  delayMicroseconds(10);               // wait 10 microseconds before turning off
  digitalWrite(initPin, LOW);          // stop sending the pulse
  pulseTime = pulseIn(echoPin, HIGH);  // Look for a return pulse, it should be high as the pulse goes low-high-low
  distance = pulseTime/58;             // Distance = pulse time / 58 to convert to cm.
  total= total - readings[arrayIndex]; // subtract the last distance
  readings[arrayIndex] = distance;     // add distance reading to array
  total= total + readings[arrayIndex]; // add the reading to the total
  arrayIndex = arrayIndex + 1;         // go to the next item in the array

  // At the end of the array (10 items) then start again
  if (arrayIndex >= numOfReadings)  {
    arrayIndex = 0;
  }

  averageDistance = total / numOfReadings;      // calculate the average distance
  delay(10);

  // check the average distance and move accordingly

  if (averageDistance <= 20){
    // go backwards
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, HIGH);
    digitalWrite(motor2Pin2, LOW);

  }

  if (averageDistance <= 60 && averageDistance > 20) {
    // turn
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, LOW);
  }

  if (averageDistance > 60)   {
    // go forward
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);

  }

}

/*
blinks an LED
*/
void blink(int whatPin, int howManyTimes, int milliSecs) {
  int i = 0;
  for ( i = 0; i < howManyTimes; i++) {
    digitalWrite(whatPin, HIGH);
    delay(milliSecs/2);
    digitalWrite(whatPin, LOW);
    delay(milliSecs/2);
  }
}

Šis kodas nuolat seka vidutinį atstumą iki artimiausio objekto:

  • Jeigu atstumas daugiau nei 60cm, tuomet robotas juda į priekį;
  • Jeigu atstumas tarp 20cm ir 60cm, robotas bando apvažiuoti sukdamas į kairę;
  • Jeigu atstumas mažiau už 20cm, robotas juda atgal.

Veikia!

Ištestuotavus ir pataisius keleta smulkmenų robotas surinktas ant stalo ir veikia!

IMG1714

Važinėjančio roboto video:

Flickr Video

Kas toliau?

Iki mano visų idėjų įgyvendinimo dar teks padirbėti:

  • Reikia išnaudoti servo, kad robotas geriau matytų aplinką;
  • Išspręsti problemas dėl greito baterijų išeikvojimo, nes staiga keičiant varikliukų sukimosi kryptį  kenčia baterijos;
  • Padaryti, kad robotukas sustotų ir apsidarytų įvertindamas atstumus;
  • Susikurtų atminty aplinkos žemėlapį;
  • Sugebėtų susirasti įkroviklį ir jame pakrauti baterijas kai nusėda;
  • Mėgtų arba bijotų stiprios šviesos.

Ką sukūrė kiti?

Kiti dalyviai daugiausia eksperimentavo su šviesa ir bandė valdyti kompiuterį su Arduino.

IMG1721 IMG1720 IMG1718 IMG1722 IMG1717 IMG1726

Daugiau apie Howduino galite pasiskaityti ir pasižiūrėti:

Būtinai parašysiu kaip sekėsi toliau hakinti mašinėlę.

Jeigu šis įrašas patiko, nepatingėkit pakomentuoti arba užsiprenumeruoti RSS srautą.

10 komentarų

  1. Arvydai sveikinu su pirmu robotu! Dėl tavo tolimesnių tikslų, tai galiu pasakyti, kad tau reikia tik foto-diodo ir robotas jau reaguos į šviesą/tamsą. Dėl kitų planų nelabai ką galiu pasiūlyti.
    Taip pat norėjau paklausti, koks čia kodo plug-in’as? Nes man irgi ne už ilgo reikės. Mano arduino plokštė pasimetė Anglijoje, vakar persiuntė (registruotu paštu) tai manau jau tikrai greit gausiu.
    Kaip matau, protui naudoji kroną (9v) o varikliams AA? Ar ten kažkas kitaip padaryta?

    • Ačiū už sveikinimus. :) Visus reikiamus komponentus robotui turiu, kartu su visa krūva foto rezistorių. Laiko tik trūksta, kaip visada. :)

      Nesupratau, klausimo dėl kodo plug-in’o. Ką turi omeny? Kodas yra palyginus paprastas, dar tik iš LuckyLarry gavau patobulintą vidutinio atstumo skaičiavimo altoritmą, tai bandysiu jį panaudoti. Viskas kas naudojama programoje yra dalis Arduino platformos.

      Taip, smegenys naudoja 9V kroną, o varikliukai ryja 3AA. Dar namie grįžęs pasibandžiau su 4AA baterijom, tai robotukas daug smagiau važiuoja ir net sugeba be problemų apsisukti vietoje.

      • Dėl kodo kalbėjau apie jo atvaizdavimą wordpress’e.
        Ta prasme plug’iną skirtą WordPress’ui, ne robotui.

        Aš dabar tikrinu datasheetus (sensorių, variklių draivų.) Bandau išsirinkti kas man tiktų, nes variklis papuolė labai galingas, ima du amperus srovės, standartų neužtenka, o papildomos mikroshemos už ~50 lt pirkti nesinori.

        O platformą gavau išvis beprotiškai fantastišką. Nikko mašina (RC) lietuvoj apie 300 litų, ebay gavau su perdegusiais kandikais už 15 svarų. Yra serva, variklis. Naujas akumuliatorius, įkroviklis.
        Korpusas irgi „hacker friendly“ vietoj lempų įdėsiu IR diodus, ant bamperio TSOP’us ir viskas bus super. Tiksliau tikiuosi, kad bus super.

  2. Rimtai suvaikėję, kaip penkiamečiai šokinėja su tuo tušinuku aplink robotą.. :D Visai priminė baisią paskaitą mechanatronikos, kur visi tokie susirinkę ir žaidžia su jais.. cypauja kaip vaikų darželyje.. :))

  3. Atgalinis pranešimas: arvydas.net » Blog Archive » Roboto logika

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *