Samojezdny, dwukołowy robot z Intel Galileo

Samojezdny, dwukołowy robot z Intel Galileo
Pobierz PDF Download icon

Od czasu pojawienia się na rynku mikroelektromechanicznych akcelerometrów, dużą popularnością wśród pokazowych aplikacji firm oraz projektów studenckich cieszą się maszyny, które są w stanie utrzymać w pionie, wbrew grawitacji, długie, pionowe konstrukcje. Ten bardzo widowiskowy pokaz możliwości inżynierskich wcale nie jest trudny do realizacji, a przy zastosowaniu gotowych komputerków jednopłytkowych, jego przygotowanie sprowadza się do połączenia ze sobą komponentów i dostosowania oprogramowania. Elementem wyróżniającym niniejszy projekt od pozostałych jest użycie w nim płytki Intel Galileo, która pozwala na uruchomienie na niej systemu operacyjnego Windows. Jest to także ciekawy przykład zastosowania algorytmu PID.

Omawiany projekt został wykorzystany z użyciem komponentów Lego, które ułatwiają montaż elementów. Ustawienie samojezdnego robota monitorowane jest za pomocą żyroskopu i akcelerometru - obu monitorujących ruch w trzech wymiarach. Całość pracuje pod kontrolą systemu operacyjnego Windows 8.1.

Komponenty

Fotografia 1. Gotowy robot w pionie

Sercem urządzenia jest płytka Intel Galileo. Model ten wyposażony jest w procesor Intel Quark X1000, taktowany zegarem 400 MHz i w 256 MB pamięci RAM. Galileo jest podłączone do płytki DFRduino L298P motor shield, będącej elementem napędzającym silniki kół robota. DFRduino jest płytką kompatybilną z Arduino i pozwala dostarczać do 2 A prądu do dwóch silników.

Maksymalny pobór mocy płytki to 25 W, a jej wymiary to 55×55 mm. Jako napędy kółek autor zastosował dwa stałoprądowe silniczki LEGO 8882 Power function XL, zasilane napięciem 9 V. Użycie innych silniczków nie powinno stanowić problemu, a modele z LEGO są o tyle wygodne w użyciu, że dobrze pasują do reszty elementów konstrukcyjnych.

Zamiast samodzielnie lutować miniaturowe czujniki, dostępne w obudowach SMD i LGA oraz układy ich zasilania, autor skorzystał z gotowej płytki SparkFun IMU Fusion Board, na której zainstalowane są właśnie 3-osiowy akcelerometr ADXL345 firmy Analog Devices i 3-osiowy żyroskop IMU 3000 firmy Invensense. Sygnały z płytki SparkFun IMU Fusion Board są wyprowadzone na goldpiny, które łatwo podłączyć do innych elementów konstrukcji poprzez interfejs I²C.

Ponieważ robot jest mobilny, konieczne było wyposażenie go w źródło energii. Wybór padł na akumulator 8,4 V, złożony z 6 ogniw, które łącznie mają pojemność 3700 mAh. Źródło to ma na tyle dużą rezystancję wewnętrzną, że jego napięcie wyjściowe istotnie się zmienia, w zależności od poboru prądu. W związku z tym autor użył płytkę z obniżającą przetwornicą napięcia, uzyskując w ten sposób stabilne 5 V do zasilania całego zestawu. Przetwornica bazuje na układzie LM2596 firmy Texas Instruments.

Pozostałe elementy, potrzebne do wykonania projektu to przewody, wtyczki (m.in. do zasilania płytki Galileo) oraz klocki LEGO Technics.

Montaż i połączenia

Realizując projekt, wykonawca staje przed wyborem lokalizacji poszczególnych elementów, z których wszystkie - ze względu na stosowanie modułów - zajmują pewną niemałą przestrzeń i trochę ważą. A ponieważ urządzenie w istotnej mierze opiera się na mechanice, czynniki te mają znaczenie.

Najcięższym elementem jest akumulator i mogłoby się wydawać, że by utrzymać jak największą stabilność robota, powinien być on umieszczona jak najniżej - zaraz przy kołach, by obniżyć środek ciężkości. Jednakże w praktyce, jeśli robot z założenia ma być niestabilny i dopiero zastosowanie odpowiednich algorytmów ma powodować utrzymanie pionowej pozycji maszyny, okazuje się, że korzystniej jest umieścić "baterię" wyżej - o ile tylko użyte silniczki będą mieć odpowiednio duży moment obrotowy.

Fotografia 2. Płytka Intel Galileo

Fotografia 3. Silniczek LEGO 8882 Power XL

Taka konstrukcja sprawia, że układ zachowuje się bardziej tak, jak odwrotne wahadło, które całkiem łatwo można kontrolować algorytmem PID. Wątpliwości może budzić też kwestia lokalizacji sensorów. W wielu projektach tego typu są one montowane na dole robota, blisko kół.

Jednakże i w tym przypadku okazuje się, że lepiej jest je umieścić wyżej, gdyż przy niższej pozycji, ruch w poziomie zbytnio zakłóca odczyty, powodując niemożność poprawnego reagowania na przechylenie robota. W praktyce umieszczenie czujników mniej więcej na wysokości 60% konstrukcji od kół, czyli w środku masy urządzenia, dało znacznie lepsze rezultaty.

Fotografia 4. Płytka DFRduino L298P motor shield

Fotografia 5. Przetwornica obniżająca z układem LM2596 i wyświetlaczem diodowym

Płytkę Galileo podłączono do DFRduino L298P Shield z użyciem pinów 4, 5 dla silniczka pierwszego oraz 6 i 7 dla drugiego silniczka. Piny 4 i 7 zostały wykorzystane do przesyłania informacji o kierunku obrotu, a piny 5 i 6 o prędkości (z użyciem sygnału PWM).

Płytkę DFRduino podłączono do silniczków za pomocą konektorów śrubowych oraz do dodatkowego zasilania (terminal PWRIN). Płytkę z czujnikami podłączono do wyprowadzeń A4 i A5 Galileo, przez które (interfejsem I²C) przesyłane są odczyty z sensorów (piny SCL i SDA płytki firmy SparkFun).

Fotografia 6. Płytka z sensorami Sparkfun IMU Fusion board

Fotografia 7. Intel Galileo z kartą Wi-Fi

W nowszej wersji oprogramowania Windows, zamiast wyprowadzeń A4 i A5 można użyć pinów SCL i SDA, dostępnych na Galileo, do podłączenia ich do analogicznie oznaczonych wyprowadzeń modułu IMU Fusion Board. Zasilanie modułu z czujnikami zostało pociągnięte bezpośrednio z Galileo.

Wyprowadzenie akumulatora podłączone zostało na wejście płytki stabilizatora, a ustabilizowane napięcie 5 V podłączono do gniazda zasilania Galileo oraz - jak wcześniej wspomniano - do terminalu PWRIN płytki DFRduino.

Polecenia i sygnały

Listing 1. Przykładowy kod programu sterującego silnikami kół

Program dla robota został napisany w C#, ale wymagana jest znajomość tego języka tylko na podstawowym poziomie. Nie ma tu złożonych konstrukcji, które korzystałyby z dobrodziejstw C#, a jedynie proste, obiektowe komendy, takie jak w C++. Dopiero próba realizacji komunikacji z użytkownikiem wymaga użycia poleceń i bibliotek typowych dla C#.

Sterowanie napędem kół poprzez DFRduino jest dosyć proste - przykład został przedstawiony na listingu 1. Wystarczy określić piny, którymi przesyłane są informacje sterujące, ustawić je do trybu pracy jako wyjścia, a następnie w pętli przesyłać odpowiednie wartości.

Sygnał wysoki na pinach sterujących kierunkiem oznacza jazdę do przodu, a niski - jazdę wstecz. Wypełnienie sygnału PWM równe 255 (100%) oznacza maksymalną szybkość obrotu, a 0 (0%) zatrzymanie koła. Wartości pośrednie odpowiadają liniowo szybkościom obrotów.

Odczyt z czujników jest nieco bardziej skomplikowany - został przedstawiony na listingu 2. Autor użył biblioteki Wire.h do komunikacji z użyciem interfejsu I²C. Ponadto przygotował funkcję writeTo(), która wywołuje wybrane urządzenie oraz pod wskazany adres przesyła dane i kończy transmisję.

Posługuje się tą funkcją do wprowadzenia ustawień początkowych w funkcji setup(). Ustawia parametry pracy żyroskopu, przekazuje do żyroskopu informacje o akcelerometrze (żyroskop pośredniczy w komunikacji z akcelerometrem) oraz konfiguruje akcelerometr. Po wprowadzeniu wszystkich ustawień jest uruchamiana funkcja loop(), w której nawiązywane jest połączenie z żyroskopem i cyklicznie prowadzone są odczyty 12 bajtów danych, które umieszczane są w buforze.

Algorytm

Listing 2. Przykład odczytu danych z czujników robota

Opisany dotąd fragment projektu obejmuje wszystko, co konieczne do sterowania pracą dwóch silników i odczytywania informacji z sensorów, ale nie mówi nic na temat tego, jak właściwie należy reagować na przechylenia i o ile obracać koła.

Za te obliczenia odpowiada algorytm PID (proporcjonalno-całkująco-różniczkujący), znany wszystkim inżynierom, którzy zajmują się automatyką. Nie będziemy tu wyjaśniać jego zawiłości - były one już zgrubnie opisywane przy okazji innych projektów, np. w numerze 10/2007 Elektroniki Praktycznej.

W skrócie mówiąc, algorytm PID pozwala sterowanemu systemowi na osiąganie zadanych wartości w oparciu o zmieniające się warunki. Algorytm tego typu monitoruje stan czujników, określa odchylenia wartości aktualnych od zadanych oraz szybkość ich narastania lub spadania, po czym ustala siłę oddziaływań, mających doprowadzić monitorowane wartości do pożądanego stanu.

W naszym przypadku pożądanym stanem jest sytuacja, gdy robot stoi pionowo. Akcelerometry pozwalają określić, jak szybko kąt ustawienia robota się zmienia, a żyroskop sprawdza, na ile odległy jest od zadanego. Regulowana jest też prędkość ruchu robota, by ten mógł jeździć zgodnie z poleceniami.

Listing 3. Główny kod gotowego programu robota

Implementacja algorytmu PID wymaga dobrania odpowiednich wartości współczynników do realizowanego zadania (po trzech na każdą monitorowaną wartość). Optymalny dobór wartości tych współczynników jest sztuką, której można się nauczyć z czasem, metodą prób i błędów oraz korzystając z powszechnie dostępnych poradników odnośnie strategii ich określania.

Warto jeszcze rzucić okiem na główny fragment kodu gotowego programu. Został on przedstawiony na listingu 3. Po załadowaniu bibliotek i zdefiniowaniu wszystkich potrzebnych obiektów, konfigurowane są poszczególne z nich, a w tym - podawane są parametry regulatorów kąta i prędkości.

Pierwsza z wartości parametru (P - proporcjonalny) dla regulatora kąta jest ujemna, by od razu uwzględnić bezwładność podczas przyspieszenia robota w wybranym kierunku. Następnie, w głównej pętli, odbywa się kalibracja żyroskopu oraz określenie długości pojedynczego cyklu pracy.

Ta druga wartość jest potrzebna po to, by regulatory pracowały jak najbardziej w czasie rzeczywistym, tj. by kolejne zadawane przez algorytm wartości były podawane w równych odstępach czasu. Ponieważ Intel Galileo jest w stanie wykonywać program szybciej niż jest to potrzebne, autor wprowadził dodatkową pętlę opóźniającą, w której sprawdza czy nadszedł już czas kolejnej iteracji algorytmu; pętla ta jest pusta i przerywana dopiero, gdy ten czas nadszedł.

Za każdym razem, gdy konieczne jest wykonanie kolejnej iteracji algorytmu PID, odczytywane są wartości kąta z żyroskopu. Na ich podstawie określana jest chwilowa, docelowa wartość kąta oraz docelowa wartość prędkości kół. Ta ostatnia jest przekazywana do obiektu sterującego pracą silników i zapisywana na stosie na potrzeby kolejnej iteracji.

Uzupełnieniem kodu jest obsługa klawiatury, za której pomocą przekazywane są polecenia - czy to zmiany kierunku ruchu, czy zakończenia programu. Polecenie wczytujące komendy z klawiatury również znajduje się w głównej pętli programu.

Podsumowanie

Zademonstrowany projekt nie jest szczególnie innowacyjny, ale pokazuje, że tego typu aplikację można wykonać nie tylko na popularnym Raspberry Pi czy Arduino, ale także na platformach intelowskich, a co najc iekawsze - z użyciem systemu operacyjnego Windows.

Tu niestety pojawia się problem, którego autorowi projektu nie udało się rozwiązać pod Windowsem. Robot w opisanej wersji jest sterowany przez podłączoną do niego klawiaturę przewodową, co niewątpliwie silnie ogranicza jego ruchy. Oczywiście system Windows można dosyć łatwo skonfigurować do pracy z klawiaturą bezprzewodową, ale znacznie wygodniejszym rozwiązaniem byłoby sterowanie robota przez sieć.

Autor podjął takie próby, korzystając z połączenia przewodowego, co wcale nie rozwiązywało problemu "smyczy", choć praktyka pokazała, że zastosowanie niestandardowego, płaskiego przewodu ethernetowego ułatwia ruchy robota. W takiej konfiguracji polecenia z klawiatury są przesyłane przez sieć do konsoli systemu i z niej odczytywane.

Najbardziej problematyczne okazało się używanie bezprzewodowej karty sieciowej Wi-Fi pod systemem Windows 8.1. To duża szkoda, gdyż płytka Galileo ma na sobie złącze mini PCI Express, które pozwoliłoby zainstalować niedrogi, szybki moduł Wi-Fi czy Bluetooth.

Niestety autorowi nie udało się skonfigurować takiej karty pod Windows, mimo że pod linuksem (dystrybucja Yocto Linux) funkcjonowała bez problemu. Być może w Windows 10, który jest obecnie promowany przez Microsoft do wszelkich aplikacji Internetu Przedmiotów nie sprawiałby problemu.

Marcin Karbowniczek, EP

Artykuł ukazał się w
Elektronika Praktyczna
listopad 2015
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe

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

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