Kurs budowy robotów – #9 – ekspander I/O, serwo

Kurs budowy robotów – #9 – ekspander I/O, serwo

Zbliżamy się do końca kursu budowy robotów, pora omówić więc pozostałe możliwości naszego shieldu, które będą przydatne podczas dalszego rozbudowywania robotów!

Zajmiemy się ekspanderem pinów oraz złączem dla serwomechanizmu modelarskiego. 

Zgodnie z zapowiedzią, artykuł ten jest dodatkiem do kursu (pierwotnie miało go nie być), więc wyjątkowo użyję tutaj również elementów spoza zestawu. Dodatkowe podzespoły były omawiane w kursie podstaw Arduino. Wszyscy, którzy mają zestaw do tamtej serii (oraz kilka przewodów połączeniowych) będą mogli wykonać opisywane projekty!

Przykładowy, dodatkowy projekt - ruchomy czujnik odległości.

Przykładowy, dodatkowy projekt - ruchomy czujnik odległości.

Dodatek 1: Sterowanie serwomechanizmem

Nasz shield wyposażony jest w układ DRV, który pozwala sterować dwoma silnikami DC. Oprócz tego możemy podłączyć do niego jeszcze jeden napęd - serwomechanizm modelarski. Działanie serw opisane zostało już podczas kursu podstaw programowania Arduino (odcinek 5).

Najczęściej serwomechanizmy zasila się z około 5V. Każdy silnik (czyli również serwo) pobiera stosunkowo duży prąd, który może zakłócać działanie elektroniki. Dlatego absolutnie nie można zasilać serwomechanizmu z "5V", które znajduje się na pinach Arduino.

Dla bezpieczeństwa układu na pokładzie shieldu znajduje się dodatkowy stabilizator napięcia, który odpowiedzialny jest wyłącznie za zasilanie napędu podłączonego do złącza SERVO. Zastosowany układ to LM1117 w obudowie SOT223, który może dostarczyć do 800mA prądu. Wartość ta będzie wystarczająca dla większości serwomechanizmów typu micro.

Podczas dalszej części artykułu wykorzystałem serwomechanizm modelarski typu micro, który był częścią zestawu do kursu podstaw programowania Arduino. Napęd ten będzie idealnie pasował do otworu przygotowanego w przedniej części podwozia.

Następnie trzeba przymocować napęd do podstawy. Można to zrobić na kilka sposób. Najprościej za pomocą gumki (jak na zdjęciu poniżej). Druga opcja to wykorzystanie małych wkrętów dołączanych z serwomechanizmami - można je wkręcić w sklejkę.

Jeśli powyższe rozwiązania się nie sprawdzą, to warto poszukać małych śrubek z nakrętkami M2, które pozwolą przykręcić serwo do podstawy - będzie to najmocniejsze połączenie.

Gdy serwo będzie zamocowane wystarczy podłączyć je do gniazda SERVO. Przewód jest na tyle długi, że spokojnie można poprowadzić go pod spodem robota. We wtyczce znajdziemy najczęściej przewody w następujących kolorach

  • Czarny/brązowy - podłączamy do G (GND)
  • Czerwony - podłączamy do Vcc
  • Pomarańczowy/żółty - podłączamy do wyprowadzenia opisanego jako PWM.
Podłączenie przewodów od serwa.

Podłączenie przewodów od serwa.

Gdy serwo jest gotowe możemy przejść do napisania programu testowego. Ograniczę się tutaj do wklejenia gotowego programu. Osoby, które nie miały wcześniej styczności z serwami odsyłam do kursu podstaw Arduino. Program testowy, który zmienia pozycję serwa wygląda następująco:

Działanie kodu w praktyce:

Serwo z przodu robota przydaje się w wielu przypadkach. Można przykładowo zamontować tam czujniki lub mocne diody, którymi pojazd będzie oświetlał swoje otoczenie. Łącząc elementy z kursu Arduino można stworzyć ruchomy czujnik skanujący otoczenie - tym właśnie się zajmiemy!

Ruchomy czujnik skanujący otoczenie

Naszym sensorem odległości będzie popularny czujnik ultradźwiękowy HC-SR04, który został dokładnie opisany w #9 części kursu Arduino. Jeśli nie mamy pod ręką żadnego mocowania do tego czujnika, to można poradzić sobie na dwa sposoby.

Pierwszym z nich jest przytwierdzenie orczyka serwomechanizmu do czujnika za pomocą gumek. Rozwiązanie to jest najmniej inwazyjne, ale może być zbyt delikatne. Druga opcja to odrobina kleju na gorąco (tzw. hotglue).

Kolejny krok, to podłączenie czujnika. Aby mógł on obracać się swobodnie proponuję przewody poprowadzić swobodnie górą robota. Czujnik można podłączyć do dowolnych pinów. Idealnie sprawdzi się tutaj listwa na shieldzie opisana jako DIGITAL (obok przycisku).

Połączenie użyte w dalszej części artykułu to:

  • Vcc z czujnika → 5V
  • GND z czujnika  → GND
  • ECHO z czujnika  → pin D8
  • TRIG z czujnika  → pin D7

Program obsługi czujnika

Zadaniem programu będzie mądre unikać przeszkód. Pojazd powinien jechać do przodu, aż napotka przeszkodę. W tym momencie serwomechanizm obróci czujnik w lewo/prawo i sprawdzi, z której strony jest pusto. Następnie robot obróci się w daną stronę i dalej będzie jechał prosto.

Zacznijmy od szkieletu programu, który zawiera wszystkie niezbędne deklaracje. Funkcje, które są odpowiedzialne za sterowanie silnikami oraz funkcję, która zwraca odległość od przeszkody.

Teraz możemy zacząć uzupełniać program. Aby artykuł był czytelniejszy będę teraz pokazywał jedynie zawartość pętli loop. Cały program (wraz z powyższymi funkcjami) wkleję na samym końcu, aby nikt nie miał żadnych wątpliwości, co do jego formy.

Zaczynamy od warunku, który sprawdza, czy przed robotem jest przeszkoda. Jeśli jej nie ma, to chcemy jechać do przodu.

Teraz skupmy się na przypadku, gdy przeszkoda jest wykryta. Najlepiej wtedy zatrzymać robota oraz skierować czujnik w prawo. Następnie proponuje zatrzymać całość np. na 800 ms, aby wszelkie drgania w robocie ustały (mogłoby to fałszować pomiary czujnika).

Następnie sprawdzamy, czy po prawej stronie robota jest pusto. Jeśli tak, to obracamy pojazd:

Jeśli po prawej stronie jest przeszkoda, to czujnik obracamy w lewo (do pozycji 160) i ponownie sprawdzamy otoczenie robota. Jeśli jest pusto, to skręcamy właśnie tam.

Na sam koniec warunku sprawdzającego obecność przeszkód po bokach trzeba koniecznie wyprostować czujnik tak, aby znów spoglądał do przodu. Cały program wygląda następująco:

Zachowanie robota w praktyce widoczne jest na poniższym wideo:

To tylko jedno zastosowanie serwomechanizmu. Na pewno każdy z Was znajdzie jeszcze wiele zadań dla tego dodatku. Tymczasem pora sprawdzić ostatnią funkcjonalność naszej płytki!

Dodatek 2: ekspander pinów

Ilość pinów dostępnych w Arduino jest ograniczona. Na szczęście jeśli zabraknie wolnych wyjść nie trzeba dodawać do projektu kolejnego kontrolera. Wtedy bardzo przydają się ekspandery pinów.

Układy te komunikują się z mikrokontrolerem za pomocą jednego z popularnych interfejsów komunikacyjnych (najczęściej I2C) i pozwalają dodać do Arduino kilka kolejnych wejść/wyjść.

Zestaw elementów do kursu

 999+ pozytywnych opinii  Gwarancja pomocy  Wysyłka w 24h

Części pozwalające wykonać ćwiczenia z kursu budowy robotów dostępne są w formie gotowych zestawów! W komplecie znajdują się elementy mechaniczne (w tym koła i silniki), baterie oraz shield!

Zamów w Botland.com.pl »

Układ MCP2308

Na pokładzie naszego shielda znajduje się układ MCP2308, który komunikuje się z Arduino za pomocą interfejsu I2C wyprowadzonego na pinach A4 oraz A5. Aby komunikacja przebiegała poprawnie piny te muszą zostać podciągnięte do dodatniej szyny zasilania przez rezystory.

Ekspander MCP2308.

Ekspander MCP2308.

Układ posiada 20 wyprowadzeń, ich dokładny opis znaleźć można w dokumentacji układu. Jednak na ten moment najważniejsze są piny:

  • 1-2, dzięki którym układ komunikuje się z Arduino
  • 3-5, piny adresowe (w naszym wypadku zwarte do masy) ustalają adres pod jakim będziemy komunikować się z ekspanderem. W naszej konfiguracji z układem będzie można "rozmawiać" pod adresem 0x20 (zapis szesnastkowy)
  • 12-19, piny, które będą służyły za dodatkowe, uniwersalne wejścia/wyjścia.
Wyprowadzenia ekspandera portów.

Wyprowadzenia ekspandera portów.

Układ został umieszczony w lewym górnym rogu shieldu, a jego wyprowadzenia umieszczone są na krawędzi płytki. Gdyby zaszła potrzeba w przyszłości podłączenia innego układu, który korzysta z komunikacji przez I2C, to w tym celu należy skorzystać ze złącza opisanego jako I2C (na prawo od układu MCP2308).

Biblioteka do obsługi ekspandera

Do pracy z układem MCP2308 polecam bibliotekę udostępnianą przez firmę Adafruit. Wszystkie pliki dostępne są na GitHubie. Na tym etapie kursu każdy powinien już wiedzieć jak samodzielnie zainstalować bibliotekę (jeśli nie, to zalecam powrót do poprzednich artykułów).

Dodatkowe wejścia

Zacznijmy od wykorzystania dodatkowych pinów w roli wejść. Na początek wystarczy podłączyć do ekspandera jeden z czujników krańcowych. Jedno z wyprowadzeń podłączamy do pinu nr 0, a drugie do masy. Przykładowe podłączenie widoczne jest na poniższym zdjęciu:

Podłączenie czujnika do dodatkowego wejścia.

Podłączenie czujnika do dodatkowego wejścia.

Program musi oczywiście zaczynać się od dołączenia biblioteki oraz zadeklarowania układu:

Biblioteka domyślnie przyjmuje, że ekspander jest skonfigurowany do pracy pod adresem 0x20 dlatego nie musimy go podawać. W innych bibliotekach może być inaczej, trzeba o tym pamiętać, ponieważ błędny adres układu to najczęstsza przyczyna problemów w komunikacji przez I2C.

W kolejnym kroku za pomocą  znajomo brzmiącego polecenia ekspander.pinMode() możliwe jest ustalenie kierunku pracy wybranego pinu. Niestety funkcja ta pozwala jedynie określić, czy pin ma działać jako wejście/wyjście. Dla nas ważne jest, aby włączyć również dodatkowo wewnętrzne podciągnięcie wejścia (przez rezystor) do dodatniej szyny zasilania. Dlatego musimy skorzystać z drugiego polecenia ekspander.pullUp().

Uzupełniona funkcja setup() będzie wyglądać następująco:

Teraz w pętli loop() możemy sprawdzić czy ekspander działa poprawnie. Najprościej będzie, gdy stan czujnika (wciśnięty/puszczony) będziemy sygnalizować za pomocą diody podłączonej do pinu Arduino nr 13. Sprawdzenia stanu wejścia dokonamy za pomocą ekspander.digitalRead().

Cały program będzie wyglądał więc następująco:

Działanie programu w praktyce widoczne jest na poniższych zdjęciach:

Dodatkowe wyjścia

Analogicznie możemy wykorzystać piny ekspandera w roli uniwersalnych wyjść cyfrowych. Dla testu do pinów ekspandera nr 0-3 podłączyłem 4 diody. W tym celu wykorzystałem LEDy, płytkę stykową oraz rezystory.

Podłączenie diod do ekspandera.

Podłączenie diod do ekspandera.

Przykładowy program włączający diody podłączone do tych pinów będzie wyglądał następująco:

Działanie programu w praktyce widoczne jest poniżej:

Miganie diodami na dodatkowych pinach.

Miganie diodami na dodatkowych pinach.

Reasumując, ekspander pozwala nam szybko dodać do układu dodatkowe piny. Trzeba jednak pamiętać podczas programowania, aby rozróżniać ich numerację! Czym innym będzie pin nr 0 z Arduino, a czym innym pin nr 0 z ekspandera.

Oczywiście powyższe programy, to jedynie proste przykłady. Do ekspandera można podłączyć wiele różnych peryferiów. Dla testu proponuję np. podłączyć do niego dwa mechaniczne czujniki przeszkód (krańcówki) i napisać jeszcze raz program prostego omijania przeszkód. Dokładnie tak, jak robiliśmy to w #5 części kursu budowy robotów.

Podsumowanie

Teraz nasz shield nie skrywa już żadnych tajemnic! W poprzednich artykułach omówione zostały wszystkie peryferia, które są w niego wbudowane. Na pewno nie jeden raz zaskoczycie mnie swoją kreatywnością i rozbudujecie robota o zupełnie nowe funkcje! Koniecznie dajcie znać w komentarzach, jeśli uda Wam się dodać do niego coś ciekawego.

W kolejnym artykule będzie krótkie podsumowanie kursu. Zdradzę część planów na przyszłość. Zarówno podwozie robota, jak i shield pojawią się jeszcze w wielu artykułach na Forbocie!

Czy artykuł był pomocny? Oceń go:

Średnia ocena 4.8 / 5. Głosów łącznie: 25

Nawigacja kursu

Autor kursu: Damian (Treker) Szymański

Załączniki

arduino, ekspander, kurs, kursBudowyRobotow, serwo, serwomechanizm

Trwa ładowanie komentarzy...