Robot na arduino – samojezdna platforma

Jakiś czas temu zostałem poproszony o recenzję Kursu arduino od podstaw. Autor, Tomasz Kubisztal, na kolejnych filmach video pokazuje i omawia programy obsługujące wyświetlacze, czujniki itp., by na koniec zbudować jeżdżącego robota, który omija przeszkody. Zabawka spodobała mi się na tyle, że postanowiłem zbudować podobną. Na początku nieco odstraszyła mnie wartość poszczególnych modułów – według opisu – 250zł. Sprawdziłem ceny części na ebayu i stwierdziłem, że da się taniej. Dużo taniej.

Części do budowy robota

Robot z kursu arduino składa się z 4 modułów, które bez problemu można kupić u chińskich sprzedawców. Jak kupować na ebayu, pisałem tutaj: Tanie zakupy w Chinach.

Arduino Uno, Motor Shield R3, HC-SR04, platforma 3-kołowa

Części składowe to:

  • 3-kołowa platforma jeżdżąca, na ebayu pod nazwą Motor Smart Robot Car Chasis Kit za 39,18zł;
  • Arduino Uno, chiński klon za 28,51zł;
  • Motor Shield R3 za 22,19zł;
  • czujnik ultradźwiękowy HC-SR04 za 3,78zł.

Całość kosztowała 93,66zł, czyli dużo mniej w porównaniu z gotowym robotem za 250zł, którego moduły były pewnie kupowane w polskich sklepach. Kupiłem też inny (tańszy) moduł do sterowania silnikami, ale w tym projekcie jest to bez naczenia. Wadą zakupów na drugim końcu świata jest oczywiście czas dostawy – relacjonowałem to na facebooku, google+ i twitterze.

Budowa robota

Mając wszystkie moduły, zacząłem składać je w całość. Prace można podzielić na dwie grupy – montaż mechaniki i odpowiednie połączenia elektryczne modułów. Zacząłem od skręcania platformy. Na początek usunąłem wszystkie ochronne papierki, które przeciwdziałają zarysowaniu części podczas transportu. Przed przykręceniem silników do platformy, przylutowałem do nich kabelki, zakończone goldpinami dodatkowo zaizolowanymi koszulkami termokurczliwymi. Przykręcając metalowe płytki do przekładni, należy zrobić to z wyczuciem, tak by nie odkształcić plastikowej obudowy, co może blokować wewnętrzy mechanizm. Tylne kółko skrętne montuje się za pośrednictwem gwintowanych tulejek dystansowych. Moje złożone podwozie wygląda tak:

Podwozie robota arduino

Do platformy trzeba przykręcić Arduino Uno z płytką Motor Shield, podpiąć ultradźwiękowy czujnik odległości i zamontować baterie. Ja najpierw jednak zmodyfikowałem program z Kursu Arduino, adaptując go do swojej bazy sprzętowej i zrobiłem testy z podpiętymi prowizorycznie modułami.

Platforma i moduły do budowy robota

Już na tym etapie napotkałem kilka problemów. Chińskie Arduino Uno nie chciało poprawnie sterować układem L298D na płytce Motor Shield. Okazało się, że winne są zimne luty na gniazdach goldpinów, punkty lutownicze w ogóle nie trzymały się padów na laminacie. Trzeba było odessać starą cynę, miejsca lutowania posmarować pastą i na nowo zlutować. Kolejny problem to błędne sterowanie jednym z silników – tu również winne były zimne luty, tym razem na układzie L298D. Wystarczyła odrobina pasty lutowniczej i rozgrzany grot, by wszystko wróciło do normy. Moduły były naprawdę tanie, więc nie byłem zbytnio zdziwiony napotkanymi usterkami, a przy ich usuwaniu dogłębnie analizowałem kod programu i schemat elektryczny, ucząc się czegoś nowego.

Po testach “prowizorki”, przyszedł czas na właściwy montaż. Podobnie jak w Kursie, zdecydowałem się na zastosowanie dodatkowej platformy, do której przykręciłem Arduino UNO złożone w kanapkę z Motor Shield. Wykorzystałem plastikową płytkę i śruby M3x30. Zamiast typowych baterii AA w koszyczku, wykorzystałem ogniwa Li-Ion ze starej baterii z laptopa w konfiguracji 2p2s, przytwierdzone trytką do platformy.

Platforma z kołami - boczny widok

Z przodu przykręciłem plastikowy kątownik, do którego przymocowałem ultradźwiękowy czujnik za pomocą piankowej taśmy dwustrunnej. Nie przyklejałem płytki czujnika, a obudowy konektorów kabelków.

Robot z arduino - przód

Do podłączenia jest w sumie 10 kabelków, wszystkie do płytki Motor Shield. Zasilanie z akumulatorków, około 8V doprowadziłem do złącza śrubowego Vin i GND – jest ono używane do zasilania silników i poprzez stabilizator pozostałą elektronikę. Można też wpiąć te kabelki do gniazd na goldpiny – Vin i GND w części POWER, jednak złącza śrubowe wydają się solidniejsze. Zasilanie prawego silnika podłączyłem do punktów A+ i A-, lewego do B+ i B-. Jeśli okaże się, że zamiast do przodu robot kręci się wokół własnej osi, wystarczy zamienić miejscami kabelki silnika (odwrócić polaryzację) lub zmienić kierunek obrotów w kodzie. Zasilanie czujnika HC-SR04 trzeba dołączyć do +5V i GND, ECHO do 4 pinu, TRIG do 7. To również można zmienić w kodzie. Wszystkie połączenia można zobaczyć na zdjęciu:

Robot z użyciem Arduino - widok z góry

Całość tworzy całkiem zwartą konstrukcję, która bez szwanku wytrzymuje zderzenia ze ścianą, co nie raz sprawdziłem :).

Kod programu

Nigdy wcześniej nie programowałem Arduino, więc poszedłem na łatwiznę i wykorzystałem kod jeżdzącego robota z Kursu. Musiałem go nieco zmodyfikować z uwagi inny Motor Shield, wymagający odmiennego sterowania. Żeby nie było zbyt łatwo, zamiast biblioteki NewPing, użyłem bliźniaczej HCSR04Ultrasonic. Kod wygląda tak:

/* ********** Jezdzaca platforma - robot na arduino ********* */
#include <Ultrasonic.h>

// definicje dla HCSR04
 #define TRIGGER_PIN 7
 #define ECHO_PIN 4
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

// silnik lewy
 const int kierunekLewy=12;
 const int hamulecLewy=9;
 const int predkoscLewy=3;

//silnik prawy
 const int kierunekPrawy=13;
 const int hamulecPrawy=8;
 const int predkoscPrawy=11;

//ustawienia
 void setup()
 {
 Serial.begin(9600);
 pinMode(kierunekLewy,OUTPUT);
 pinMode(kierunekPrawy,OUTPUT);
 pinMode(hamulecLewy,OUTPUT);
 pinMode(hamulecPrawy,OUTPUT);
 pinMode(predkoscLewy,OUTPUT);
 pinMode(predkoscPrawy,OUTPUT);
 }

//petla glowna programu
 void loop()
 {
 float cmMsec;
 long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

//Serial.print("CM: ");
//Serial.print(cmMsec);

doPrzodu();
 delay(50);

if (cmMsec<=30)
 {
 doTylu();
 delay(500);
 }
 }

void doPrzodu()
 {
 analogWrite(predkoscLewy,100);
 analogWrite(predkoscPrawy,105);
//Lewy do przodu
 digitalWrite(kierunekLewy,HIGH);
 digitalWrite(hamulecLewy,LOW);
//Prawy do przodu
 digitalWrite(kierunekPrawy,HIGH);
 digitalWrite(hamulecPrawy,LOW);
 }

void doTylu()
 {
 analogWrite(predkoscLewy,200);
 analogWrite(predkoscPrawy,0);
//Lewy do przodu
 digitalWrite(kierunekLewy,LOW);
 digitalWrite(hamulecLewy,LOW);
//Prawy stop
 digitalWrite(kierunekPrawy,HIGH);
 digitalWrite(hamulecPrawy,HIGH);
 }

UWAGA! Arduino podłączone do komputera za pomocą kabelka USB musi mieć odłączoną baterię!.

Nie będę tu dokładnie opisywał co jak działa, w skrócie – główna pętla zaczyna się od pobrania z czujnika odległości, następnie następuje wywołanie podprogramu doPrzodu na 50 milisekund, następnie sprawdzany jest warunek czy zmierzona odległość to równo lub mniej niż 30cm, jeśli tak, następuje skok do doTylu, gdzie lewy silnik kręci się do tyłu przez 500ms a prawy stoi – robot cofa i skręca. Jeśli odległość jest większa niż 30cm, robot jedzie do przodu. W praktyce wygląda to tak:

Jeśli przeszkoda jest na wprost czujnika – robot wykrywa ją, cofa z obrotem i jedzie na wprost. Gorzej jeśli przedmiot czy ściana nie znajdują się prostopadle – wtedy często następuje kraksa. Kod jest bardzo prosty i można, a nawet trzeba nieco na nim poeksperymentować i ulepszyć.

Mój robot kosztował ~100zł, czy można go zbudować jeszcze taniej? Pewnie tak, samemu budując platformę, a Arduino zastępując choćby atmegą 8 i tranzystorowym mostkiem H. W takim rozwiązaniu warto wykorzystać gotowy czujnik HC-SR04, który kosztuje ok. 4zł.

Możesz również polubić…

7 komentarzy

  1. SpeX pisze:

    Czemu twojego robota trochę ciągnie na bok?

    • Wojtek pisze:

      Wynika to z niedoskonałości przekładni. Koryguje się to w linijkach analogWrite(predkoscLewy,100);
      i
      analogWrite(predkoscPrawy,105);
      podając różne współczynniki wypełnienia, tak by robot jechał prosto.

  2. techfreak.pl pisze:

    Też chciałem kupić ta platformę i w zasadzie to samo napisać 😀 Pozdrawiam 🙂

  3. A mógłbym się dowiedzieć gdzie za taką cenę kupić sterownik?

  4. A i czy ktoś by pomógł mi nanieść na to ustawienia pod czujnik US-015 2-400cm.

Leave a Reply

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.