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.

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:

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.

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.

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.

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:

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ł.

Wojtek

Zobacz komentarze

    • 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.

  • Też chciałem kupić ta platformę i w zasadzie to samo napisać :D Pozdrawiam :)

    • No to masz gotowca, skopiuj i gotowe :) Śledze opisy Twoich zabawek, bo chętnie bym sklecił coś latającego :)

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

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

Ostatnie posty

Tani moduł IoT z kamerką ESP32 CAM – pierwsze uruchomienie

Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…

3 dni temu

Aktualizacja oprogramowania w stacji lutowniczej AiXun T3A

Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…

3 tygodnie temu

Programator USB AVR ISP z Arduino Nano

Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…

4 tygodnie temu

Tester elementów elektronicznych na atmega – aktualizacja firmware’u

W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…

2 miesiące temu

Wzmacniacz słuchawkowy Lovely Cube – popularny klon Lehmanna

Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…

2 miesiące temu

Podsumowanie 2023 roku

Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…

3 miesiące temu