KursyPoradnikiInspirujące DIYForum

Kurs budowy robotów – #6 – Światłolub (sterowanie latarką)

Kurs budowy robotów – #6 – Światłolub (sterowanie latarką)

Gdy Arduino nie było jeszcze popularne, dużo początkujących szukało poradników opisujących budowę robotów bez mikrokontrolerów.

Popularnym wyborem był wtedy światłolub, czyli robot, który jechał w kierunku światła. W praktyce oznaczało to możliwość zdalnego sterowania za pomocą latarki!

W związku z taką popularnością światłolubów nie mogłem pominąć tego projektu podczas pisania kursu budowy robotów. Oczywiście nie będziemy rezygnować z mikrokontrolera, również tym razem sercem naszego pojazdu będzie Arduino UNO!

Czujniki dla światłoluba

Aby robot mógł podążać w kierunku najsilniejszego źródła światła potrzebne są dwa czujniki. Jeden z nich należy zamocować po lewej stronie robota, a drugi po prawej.

Oczywiście najlepiej w roli prostych czujników oświetlenia sprawdzą się fotorezystory. Elementy te zmieniają swój opór w zależności od ilości padającego na nie światła. Do tej pory korzystaliśmy z nich m.in. podczas kursu podstaw elektroniki (poziom 2) oraz kursu programowania Arduino.

Działanie fotorezystora w praktyce.

Działanie fotorezystora w praktyce.

W zestawach do kursu budowy robota znajdują się gotowe czujniki analogowe z fotorezystorami, więc nie trzeba przejmować się dobieraniem wartości rezystora do dzielnika napięcia itd.

Gotowe zestawy do kursów Forbota

 Komplet elementów  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 »

Podłączenie czujników

Czujniki, których użyjemy do budowy światłoluba widoczne są na poniższym zdjęciu. W zależności od momentu zakupu zestawu mogą one delikatnie różnić się kształtem lub kolorem. Na pewno będą jednak miały na swoim pokładzie fotorezystor!

Czujniki z fotorezystorami.

Czujniki z fotorezystorami.

Płytki z czujnikami należy zamocować z przodu robota. Można to zrobić w różnych konfiguracjach. Dla lepszego efektu warto jednak rozstawić je stosunkowo daleko od siebie. Podczas dalszych testów będzie wykorzystywane następujące ustawienie (na dwóch wysokich dystansach):

Czujniki podłączamy do gniazd, których używaliśmy podczas poprzedniego odcinka kursu, czyli ADC_L oraz ADC_R. Podczas wpinania wtyczki należy się upewnić, czy robimy to we właściwą stronę. Najlepiej sprawdzić, czy przewód od masy (GND) trafi we właściwe miejsce na płytce.

Podczas tego projektu będziemy wykorzystywać czujniki w najprostszej formie, czyli bez założonej zworki (między diodą, a fotorezystorem). Można ją jednak na chwile założyć dla testu. Jeśli całość jest podłączona poprawnie, to dioda będzie świecić na niebiesko:

Test czujników przez UART

Zacznijmy od prostego programu, który sprawdzi działanie czujników. Oczywiście bazujemy na szkicach, które powstały wcześniej. Czujniki są podłączone pod te same piny, w które wcześniej podpinaliśmy krańcówki. Dodajemy nowe definicje, aby nie myliły nam się czujniki (i ich strony):

Tym razem wejścia będą odczytywane analogowo, więc NIE deklarujemy ich jako wejścia typu INPUT_PULLUP. Bazowy szkic programu powinien wyglądać następująco:

Na początku warto sprawdzić, czy czujniki działają poprawnie. Posłużymy się komunikacją przez UART, aby co 250 ms wysyłać do komputera informacje o aktualnym stanie czujników:

Po jego uruchomieniu w monitorze portu szeregowego powinny ukazać się aktualne odczyty. Im ciemniej nad danym czujnikiem (zasłonięcie ręką), tym wskazywana wartość będzie większa.

Podgląd wartości czujników światła.

Podgląd wartości czujników światła.

Wiemy, że światłolub, który lubi światło... powinien jechać w stronę gdzie jest go więcej, czyli tam gdzie czujnik pokazuje niższą wartość. Oczywiście można porównywać powyższe wartości, jednak na takim podglądzie będą one cały czas mało czytelne.


Zdecydowanie łatwiej będzie, jeśli obliczymy różnicę odczytanych wartości. Nowa pętla loop() powinna wyglądać następująco:

Teraz odczyty będą łatwiejsze do interpretacji. Jeśli wynik jest dodatni, to znaczy, że po prawej stronie robota jest jaśniej (i tam mamy pojechać). Jeśli wynik będzie ujemny, to skręcimy w lewo. Co więcej im większa będzie liczba (pomijając znak) tym większa różnica będzie między czujnikami, czyli można skręcać szybciej.

Podgląd różnicy między czujnikami.

Podgląd różnicy między czujnikami.

Łatwo skojarzyć to z osią liczbową, na której wartości ujemne są po lewej stronie, a dodatnie po prawej. Gdy nasza różnica będzie w okolicy 0, to robot może jechać prosto, a gdy różnica będzie odbiegać od 0, tym reakcja pojazdu musi być mocniejsza.

Zachowanie robota uzależnione od wyliczonej różnicy (wartości na osi przykładowe).

Zachowanie robota uzależnione od wyliczonej różnicy (wartości na osi przykładowe).

Podążanie za światłem "w miejscu"

Na początku najlepiej rozpocząć od testu w miejscu. Niech robot obraca się w kierunku silnego źródła światła. Tak najłatwiej będzie wykryć ewentualne pomyłki typu zamiana stron.

Przykładowa realizacja tego zadania widoczna jest poniżej. Oprócz pomiaru wartości, w pętli loop() liczymy różnicę i w zależności od jej wartości kręcimy się w lewo lub w prawo:

Pora chwycić w dłoń latarkę, telefon z latarką lub inne źródło punktowego światła i zacząć testy! Przykładowy efekt działania tego programu widoczny jest poniżej:

Wersja 1: Prosty program Światłoluba

Wystarczy teraz rozbudować trochę warunek, aby robot podążał już sam za światłem. Tak, jak było zaznaczone na osi liczbowej, dla wartości bliskich zera można jechać prosto.

Działanie robota widoczne jest poniżej:

Zadanie dodatkowe 6.1

Dodaj procedurę startową, w której robot szybko miga diodą podłączoną do pinu 13, a dopiero po oświetleniu z bliska jednego czujnika zaczyna 3 razy pikać buzzerem i dopiero rusza. W ramach rozwiązania zadania oprócz kodu umieszczajcie w komentarzach swoje filmy!

Wersja 2: Płynna jazda Światłoluba

Powyższy kod był prosty, ale robot nie zachowywał się najlepiej. Na zmiany światła reagował nagłymi obrotami. Oczywiście program można rozbudować o kolejne warunki, które wprowadzają kilka stanów pośrednich. Powinno to złagodzić jazdę robota.

Skrajne wartości zmiennej różnica pojawiają się dość rzadko. Oczywiście zależy to również od warunków, w których testuje się robota. Przy bardzo ciemnym pomieszczeniu i bardzo mocnej latarce na pewno częściej osiągniemy wartości skrajne.

Dodałem więc dwie definicje, które określają dopuszczalne wartości zmiennej:

Po zbliżeniu latarki bardzo blisko robota możliwe było przekroczenie tych zakresów. Aby uniknąć problemów warto zabezpieczyć się przed tym odpowiednimi warunkami. Tuż po obliczeniu wartości zmiennej różnica dodałem fragment sprawdzający, czy nie wychodzi ona poza przyjęty zakres:

Dzięki temu, w skrajnych przypadkach, gdy zmienna przyjmie wartość poza zakresem (np. 350), to zostanie ona ustalona na bezpieczne 300. Mechanizm ten przyda się też podczas testów robota.


Jak już było mówione, wartość zmiennej różnica informuje nas o "sile" z jaką robot powinien zacząć skręcać. Najlepiej więc wykorzystać tę informację i bezpośrednio przełożyć ją na obroty silników. Idealnie sprawdzi się tutaj funkcja map()!

Dzięki tej linijce w zmianaPredkosci zapisana będzie wartość z zakresu od -40 do 40. Wartość taką można już przełożyć na prędkości silników. Teraz wystarczy wyliczoną zmianę dodać do prędkości jednego z silników, a odjąć od drugiego:

Wpisane tutaj "30" jest prędkością z jaką robot będzie jechał prosto (gdy odczyty z czujników będą do siebie zbliżone). Zarówno ta "30", jak i zakres od -40 do 40 dobrałem podczas testów.

Cały kod programu dostępny jest poniżej:

Działanie układu w praktyce przedstawione jest na poniższym filmie. Jak widać zachowanie robota jest teraz znacznie łagodnejsze. Odpowiednie skalowanie różnicy w odczytach czujników pozwala odpowiednio dobierać "siłę skrętu" z jaką powinien reagować robot. Teraz można nawet pokusić się o jazdę slalomem po torze przeszkód!

Zadanie dodatkowe 6.2

Sprawdź, jaki wpływ na zachowanie robota mają zmiany:

  • zakresu zmiennej różnica (w artykule było od -300 do 300),
  • zakresu prędkości dodawane/odejmowanej do silników (w artykule było od -40 do 40).

Jak i dlaczego obliczana jest prędkość silników?

Może nie każdy będzie od razu wiedział, dlaczego obliczoną wartość dodałem do jednego silnika, a odjąłem od drugiego. Najlepiej rozpatrzeć to na przykładzie. Załóżmy, że zdecydowanie silniejsze światło jest po prawej stronie robota, co sprawiło, że zmienna różnica przyjęła wartość 300.

Po jej przeskalowaniu, w zmiennej zmianaPredkosci znajdzie się wartość 40. Jeśli teraz dodamy ją do prędkości lewego silnika (30+40=70), a odejmiemy od prędkości prawego silnika (30-40=-10), to robot skręci w prawo - czyli dokładnie tam gdzie powinien.

Analogicznie dla przeciwnej sytuacji (silne światło po lewej stronie) w zmiennej różnica mamy -300, co po przeskalowaniu da nam -40. Dodając tę wartość do prędkości silnika lewego otrzymamy teraz 30 + (-40) = -10. Natomiast dla silnika prawego 30 - (-40) = 70, czyli robot skręci w lewo.

 

Podsumowanie

Jeśli wszystko poszło dobrze, to każdy z Was ma już na swoim koncie najpopularniejszego robota, poczciwego światłoluba! Chyba każdy przyzna, że zdalne sterowanie pojazdem za pomocą latarki, to niecodzienne rozwiązanie.

W kolejnym artykule zajmiemy się równie popularnymi robotami typu LineFollower, które potrafią poruszać się po specjalnie przygotowanej trasie bez niczyjej pomocy! Na razie, w ramach zadania domowego zachęcam każdego do wyregulowania swojego światłoluba, dobrania nowych prędkości i nagrania krótkiego wideo z jazdy Waszej konstrukcji!

Czy wpis był pomocny? Oceń go:

Średnia ocena 4.9 / 5. Głosów łącznie: 64

Nikt jeszcze nie głosował, bądź pierwszy!

Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!

Nawigacja kursu

Autor kursu: Damian (Treker) Szymański

arduino, kursBudowyRobotow, robot, światłolub

Trwa ładowanie komentarzy...