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