Dwukołowy robot balansujący sterowany przez Arduino

Dwukołowy robot balansujący sterowany przez Arduino

Utrzymywanie równowagi nie jest takie proste. Pewne przysłowie mówi, że „koń ma cztery nogi i też się potknie”, a co w przypadku robota, który ma tylko dwa koła i to ustawione w jednej osi? Zaprezentowany projekt jest przykładem tego, że trudny problem można rozwiązać w ciekawy sposób. W tym przypadku postawa robota jest kontrolowana przy użyciu czujnika ultradźwiękowego.

Roboty balansujące to kategoria maszyn, które wyróżniają się utrzymywaniem pewnego systemu mechanicznego w tzw. równowadze chwiejnej. Jest to stan, w którym ruch maszyny, powoduje powstanie takich składowych siły, które dalej wypychają ją ze stanu równowagi. Przykładem może być tutaj np. balansowanie piłki na palcu – chwila zawahania i piłka spada na ziemię. Balansowanie jest tutaj aktywne – cały czas musimy dokonywać drobnych korekt pozycji, aby piłka pozostawała na czubku palca. System taki pracuje w zamkniętej pętli sprzężenia zwrotnego – obserwując układ widzimy, jakie musimy dokonać korekty, aby pozostał on w równowadze.

W artykule prezentujemy konstrukcję samobalansującego robota na kółkach, który jest sterowany przez moduł Arduino UNO i ultradźwiękowy czujnik odległości. Dzięki pracy w zamkniętej pętli sprzężenia zwrotnego, robot jest w stanie utrzymać stabilną pionową postawę.

Potrzebne elementy

Do budowy robota potrzebne będą następujące komponenty:

  • moduł Arduino UNO,
  • sterowniki silników typu L293D (Dual H-Bridge Texas Instruments),
  • czujnik ultradźwiękowy typu HC-SR04,
  • silnik prądu stałego 12 V z przekładnią,
  • płytka stykowa i przewody połączeniowe,
  • zasilacz 9 V, 1 A.

Napęd i konstrukcja mechaniczna

Pojazd napędzany jest dwoma silnikami prądu stałego, zintegrowanymi z przekładniami, które redukują obroty. Dzięki temu zwiększa się moment obrotowy silnika, a układ nie wymaga żadnej dodatkowej „skrzyni biegów” czy przekładni, która miałaby dopasować prędkość obrotową do wymagań aplikacji. Dzięki zastosowaniu dwóch niezależnych silników można dodatkowo sterować w prosty sposób kierunkiem poruszania się maszyny.

Na osiach silników, za motoreduktorem, zainstalowane są koła. Dzięki instalacji kół bezpośrednio na osi silnika, nie ma potrzeby stosowania dodatkowych elementów mechanicznych, które utrzymywałyby osie kół. Na fotografii 1 pokazano zastosowane silniki z kołami zamontowanymi bezpośrednio na osiach.

Fotografia 1. Silniki ze zintegrowanymi przekładniami z założonymi na osiach kołami

Po przygotowaniu silników można przystąpić do budowy „ciała” robota. Wykonane jest ono z rurek PCV. Centralnym elementem w dolnej części jest trójnik PCV. Będzie on służył do instalacji silników ale wcześniej należy je okablować. Przewody wyjdą z górnego otworu, a w bocznych montujemy silniki, tak jak pokazano na fotografii 2. Przewlekamy po dwa przewody, najlepiej w kontrastowych kolorach, takich jak czerwony i czarny. Z górnego otworu wychodzić muszą cztery przewody, a po bokach po dwa, które podłączamy do zacisków silników. Następnie silniki instalowane są w trójniku. Jeśli mamy szczęście, to silniki da się zainstalować na wcisk, jeśli nie, to można użyć kleju na ciepło lub gumowych podkładek – tak zrobił autor projektu. Zmontowane „podwozie” robota, pokazano na fotografii 2.

Fotografia 2. Zmontowane podwozie robota

Finalnym elementem konstrukcji jest pionowa rura z wysięgnikiem na sensor. Te elementy także wykonane są z rurek i kształtek PCV. W centralnym otworze trójnika instalowana jest centralna kolumna pojazdu. Przewody zasilające silniki przechodzą jej środkiem. Długość tego elementu nie jest krytyczna, ale nie może on być zbyt długi, gdyż długa dźwignia utrudni działanie systemu – silniki będą miały zbyt mały moment, aby zbalansować przechylanie się robota. Na końcu pionowej rury należy zainstalować kolanko, za którym znajduje się kolejny, znacznie krótszy, kawałek rurki. Na nim zainstalowany zostanie sensor ultradźwiękowy.

Przewody przeprowadzone są środkiem rurek i wychodzą na samym ich końcu. Ułatwia to zebranie ich wszystkich w jednym miejscu i podłączenie do modułu Arduino. Na fotografii 3 pokazano gotowe, zmontowane podwozie robota.

Fotografia 3. Zmontowana cała konstrukcja robota

Elektronika sterująca

Na rysunku 1 pokazano schemat ideowy układu sterującego robotem. Kluczowym elementem jest moduł Arduino UNO z mikrokontrolerem, który steruje całym systemem. Do mikrokontrolera podłączony jest pojedynczy sensor ultradźwiękowy – miernik odległości. Jeden przetwornik piezoelektryczny pełni rolę emitera – emituje on paczkę fal o częstotliwości powyżej akustycznej, najczęściej jest to około 40 kHz. Paczka ta odbija się od przeszkód przed sensorem i wraca do czujnika, który wykrywa jej dotarcie za pomocą drugiego przetwornika piezoelektrycznego na płytce. Czas pomiędzy wysłaniem paczki, a jej powrotem jest proporcjonalny do odległości pomiędzy sensorem, a przeszkodą.

Rysunek 1. Schemat układu sterującego robotem

Do sterowania silnikami zastosowano scalony sterownik typu L293B. Jest to podwójny, zintegrowany mostek H, pozwalający na sterowanie silnikiem w obu kierunkach, z płynne regulowaną prędkością obrotową, poprzez zastosowanie modulacji wypełnienia przebiegu prostokątnego – PWM. Ten scalony driver silników elektrycznych zawiera w sobie cztery drivery mocy, które pozwalają na sterowanie silnikiem. Pojedynczy driver pozwala na przepuszczanie prądu w jednym kierunku. Z dwóch takich elementów, połączonych z obu stron do silnika DC (lub dowolnego innego obciążenia), można zbudować układ, który pozwoli kontrolować przepływ prądu przez silnik w obu kierunkach, umożliwiając mu obracanie się w obie strony. Układ taki nazywa się mostkiem H.

Na rysunku 2 pokazano przykładową aplikację drivera silników L293B – po lewej stronie dołączono pojedynczy silnik w topologii mostka H, co pozwala mu na obroty w obu kierunkach, a po prawej stronie dołączono dwa silniki asymetrycznie, co pozwala na obracanie nimi tylko w jednym kierunku.

Rysunek 2. Różne sposoby podłączenia silników elektrycznych do sterownika L293B

Zasada działania

Koncepcja samobalansującego robota jest prosta. Konstrukcja wykorzystuje czujnik ultradźwiękowy, który mierzy odległość od ziemi przed nim. Jeśli odległość jest mniejsza niż ustalona, oznacza to, że robot jest pochylony do przodu bardziej, niż powinien. Jeżeli odległość ta jest większa, niż ustalono, oznacza to z kolei, że robot odchylony jest do tyłu.

Do kontrolowania pochylenia służą silniki robota. Jeśli jest on pochylony do przodu, musi ruszyć silnikami tak, jakby chciał jechać do tyłu. Jeśli pochylony jest do tyłu, analogicznie pojechać musi do przodu. Tarcie pomiędzy kołami, a podłożem spowoduje poruszenie się robota, zanim zacznie on jechać. Opisana metoda balansowania jest identyczna, jak metoda, której używa człowiek, balansujący np. piłką na dłoni, czy na palcu. Jeśli piłka spada w którąkolwiek stronę, dłoń musi poruszyć się w tę stronę.

Oczywiście, algorytm ten nie ma nieskończonych możliwości. Z uwagi na ograniczoną moc silników, istnieje taki punkt, poza którym robot nie będzie w stanie już powrócić do stanu równowagi. Silniki powinny mieć dużo więcej mocy, aby działanie systemu było na prawdę szybkie i responsywne.

Nie jest to jedyna metoda na zbudowanie balansującego urządzenia. Można użyć bezwładnościowej jednostki pomiarowej (IMU) MPU-6050. Układ taki integruje w sobie akcelerometr i żyroskop, co pozwala na śledzenie przeciążeń robota i jego położenia względem ziemi w czasie rzeczywistym i reagowanie na pochylanie się urządzenia.

Zastosowanie zamiast tego czujnika ultradźwiękowego ma ogromną zaletę w postaci istotnie niższej ceny.

Oprogramowanie

Oprogramowanie dla mikrokontrolera tego robota zostało napisane w Arduino IDE. Prosty szkic, kontrolujący podstawową funkcję robota – balansowanie, zgodnie z opisanym algorytmem – zamieszczony jest na listingu 1. Jak każdy szkic Arduino, firmware robota podzielone jest na dwie podstawowe sekcje: setup() oraz loop(). Pierwsza część to konfiguracja – sekcja ta jest uruchamiana jednorazowo, aby ustawić wszystkie porty, jako wejścia/wyjścia itp. Sekcja loop() to nieskończona pętla – zapisane w nim polecenia są cyklicznie powtarzane.

Listing 1. Listing programu sterującego samobalansującym robotem

int ip3 = 2;
int ip4 = 3;
int t = 8;
int e = 9;
int height = 27;


void setup() {
// Konfiguracja pinów sensora odległości
 pinMode(t, OUTPUT);   // pin trigger
 pinMode(e, INPUT);    // pin echo

// Konfiguracja pinów sterujących silnikami
 pinMode(ip3,OUTPUT);
 pinMode(ip4,OUTPUT);
}

float distance(){
 float duration, cm;
 digitalWrite(t, LOW);
 delayMicroseconds(2);
 digitalWrite(t, HIGH);
 delayMicroseconds(5);
 digitalWrite(t, LOW);
 duration = pulseIn(e, HIGH);
 cm = duration / 29 / 2;
 return cm;        //odległość w centymetrach
}


void loop() {
 float dis = distance();=
 if (dis > height) {
   digitalWrite(ip3,LOW);
   digitalWrite(ip4,HIGH);  
 }
 else if(dis < height) {
   digitalWrite(ip3,HIGH);
   digitalWrite(ip4,LOW);
 }
}

W pierwszej kolejności program mierzy odległość. W tym celu uruchamiana jest funkcja distance(), która zdefiniowana jest powyżej sekcji pętli. Następnie, jeśli odległość jest większa niż ustalony próg height to uruchamiane są silniki w jedną stronę, a jeśli jest mniejszy niż próg, to w drugą stronę.

Pomiar odległości jest bardzo prosty. Najpierw program generuje impuls ultradźwiękowy, załączając na 5 mikrosekund wyjście odpowiedzialne za transmiter ultradźwięków, a następnie czeka na przyjście impulsu odbitego, mierząc jednocześnie czas. Następnie czas przeliczany jest na odległość – wartość czasu jest dzielona przez 29 (czyli pomnożona razy 0,0345 – to prędkość dźwięku w centymetrach (w tej jednostce funkcja zwraca pomiar) na mikrosekundę – w takiej jednostce mierzone jest opóźnienie.

Podsumowanie

Użycie sensora ultradźwiękowego to tylko jedna z możliwości realizacji tego rodzaju algorytmu. Alternatywą dla pomiaru odległości od gruntu jest zastosowanie modułu inercyjnego, np. z sześcioma osiami swobody, zawierającego trójosiowy akcelerometr i trójosiowy żyroskop. Autor projektu twierdzi, że algorytm zaimplementowany w projekcie nie jest optymalny. Poprawę działania systemu można uzyskać przez dodanie algorytmu PID do kontroli silników. Pomimo tego zaprezentowana platforma jest ciekawą zabawką, a jednocześnie może być inspiracją dla bardziej zaawansowanych konstrukcji robotów balansujących.

Nikodem Czechowski, EP

Źródło:
https://bit.ly/3Api5jU
https://bit.ly/3NEWiaZ

Artykuł ukazał się w
Elektronika Praktyczna
lipiec 2022

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje kwiecień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów