Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Kurs Raspberry Pi!Jesteś zainteresowany kursem Raspberry Pi? Wybierz najciekawsze tematy, które opiszemy »

Kurs budowy robotów – #7 – line follower, czyli bolid F1

Roboty 14.02.2017 Damian (Treker)

Podczas siódmej części kursu budowy robotów zajmiemy się line followerami. Zawody, które są organizowane dla tych konstrukcji można nazwać wyścigami F1 Świata robotów!

Tym razem roboty będą mogły jeździć całkowicie autonomicznie po specjalnym torze wyklejonym ze zwykłej, czarnej taśmy izolacyjnej!

Nawigacja serii artykułów:
« poprzednia częśćnastępna część »

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Na początku wspomnę, że temat line followerów darzę zdecydowanie największą sympatią! Kilka lat temu budowałem takie konstrukcje i startowałem z nimi na licznych zawodach robotów.

Zaczynałem od prostych i nieporadnych pojazdów, aż doszedłem do momentu, w którym moje konstrukcje wygrywały zawody. Jestem więc chyba dobrym przykładem, że budowa takich robotów (nawet najprostszych) pozwala rozwijać swoje umiejętności! Poniżej dwa zdjęcia: po lewej jeden z pierwszych moich line followerów (2010), a po prawej jeden z ostatnich (2014).

Czym są line followery?

Line followery, jak nazwa wskazuje, są konstrukcjami, które podążają za linią, która wyznacza tor jazdy. Często organizowane są zawody, do których zgłasza się swoje roboty. Wygrywa konstruktor najszybszego pojazdu.

Oczywiście pojazdy nie są zdalnie sterowane,
więc muszą samodzielnie odnaleźć się na trasie.

Przykładowy przejazd jednego z moich robotów:

Budowa toru do line followera

Trasa, na której odbywają się wyścigi najczęściej wyznaczana jest przez czarną linię (o szerokości od 15 do 20 mm), którą umieszcza się na białym podłożu. Możliwa jest też odwrotna wersja, czyli biała linia na czarnym tle – wariant ten jest jednak obecnie rzadko spotykany.

Do budowy domowego toru potrzebne będą:

  • podłoże: wariant idealny, to białe płyty meblowe MDF/HDF. Jednak na początku równie dobrze sprawdzi się biały karton/brystol. W ostateczności mogą być nawet panele lub inna twarda, jasna podłoga.
  • czarna linia: tutaj, niezależnie od podłoża, należy wykorzystać czarną taśmę izolacyjną, która sprawdza się w takim zastosowaniu idealnie.

Druga, rzadziej spotykana, metoda wykonywania tras dla line followerów, to tzw. „bannery„. Chodzi o wydruk toru na materiale, z którego wykonywane są wielkoformatowe reklamy, które często można spotkać np. na płotach.

Na początku trzeba zacząć od prostszych i małych torów. Warto znaleźć kawałek wolnej podłogi (lub wykorzystać brystol) i wykleić tor. Na początek koniecznie zaczynamy od czegoś łatwego – np. od prostokąta z mocno zaokrąglonymi rogami lub elipsy. Oczywiście nie musi być to zrobione idealnie równo – wręcz przeciwnie.

Należy unikać ostrych zakrętów,
na początku najlepiej skupić się na łukach!

Przykład mojego toru widoczny jest poniżej. Specjalnie wybrałem podłogę, która nie ma jednolitego koloru i może sprawiać problemy, oznacza to bowiem, że jeśli u mnie robot zadziała poprawnie, to nie ma opcji, aby u innych osób sprawiał problemy! Jeśli tylko macie taką możliwość, to wybierzcie jednak coś w jednolitym kolorze…

Przykładowy testowy tor do line followera.

„Tor” został wykonany z jednego kawałka taśmy izolacyjnej. Podczas wyklejania linii taśmę można delikatnie naciągać, co pozwoli formować łuki. Nie należy jednak przesadzać z jej rozciąganiem, ponieważ może to doprowadzić do zwężeń i przebarwień. Trzeba też pamiętać, aby nie zostawiać przyklejonego do podłogi toru na bardzo długo. Po kilkunastu dniach taśma podczas odrywania możesz zostawić trudne do usunięcia ślady!

Zestaw elementów do budowy robota

Gwarancja pomocy na forum dla osób, które kupią poniższy zestaw!

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!


Kup w Botlandzie »

Czujniki i zasada wykrywania linii

Zanim przejdziemy do montażu czujników warto uświadomić sobie jak robot „widzi linię”. Pojazdy oświetlają trasę (w świetle widzialnym lub IR), a następnie sprawdzają ile światła odbiło się od trasy. Od białej trasy odbije się zdecydowanie więcej światła, niż od czarnej linii.

Robot poszukuje więc miejsc, w których do czujników wraca mniej światła!

Do tego zadania wykorzystamy sensory, które podczas poprzedniej części kursu pozwoliły na zbudowanie robota Światłoluba. Tym razem konieczne jest założenie zworek, które włączą diody świecące – to właśnie one doświetlą trasę!

Czujnik z założoną zworką.

Za pomocą wbudowanego w czujnik potencjometru możliwa jest regulacja jasności diody. Bardziej zaawansowanym czytelnikom wyjaśniam dlaczego zdecydowaliśmy się na taką konfigurację:

  • Dlaczego kolorowa dioda (zamiast IR)?
    Dzięki temu znacznie łatwiej sprawdzić, czy czujnik faktycznie działa oraz gdzie pada światło emitowane przez nadajnik.
  • Dlaczego regulacja jasności diody, a nie dzielnika napięcia przy fotorezystorze?
    Po prostu gołym okiem widać wtedy efekt regulacji. Czujniki miały być proste i przyjazne początkującym tak, aby szybko można było wyłapać problemy.

Podłączenie czujników do robota

Na początku należy zamocować czujniki. Tym razem muszą „patrzeć w dół”, czyli na naszą trasę. Powinny być również blisko siebie (na szerokość taśmy izolacyjnej), która wyznacza trasę. Tutaj idealnie sprawdzą się otwory przygotowane z przodu robota:

Mocowanie czujników linii z przodu robota.

Przewody można wygodnie przełożyć przez te same otwory, którymi doprowadzamy sygnały do silników. Oczywiście podłączenie pozostaje bez zmian (złącza ADC_L i ADC_R na shieldzie). Jeśli ktoś obawia się zbyt dużej ilości przewodów w okolicy silników, to można je docisnąć do sklejki za pomocą zwykłej gumki, tak jak jest to widoczne poniżej:

Przykład zamocowania przewodów za pomocą gumki.

Test i kalibracja czujników

Pora sprawdzić działanie czujników w praktyce – musimy nauczyć robota reagować na linię. Do tego przyda nam się „kawałek trasy”, czyli np. kartka z paskiem czarnej taśmy izolacyjnej:

Robot na testowym kawałku trasy np. z kartki A4.

Na początku zacznijmy od prostego testu. Wystarczy wyświetlać informacje na temat wartości odczytanej przez ADC. Proponuję na razie zająć się tylko jednym czujnikiem:

Praktycznie od razu powinna być zauważalna różnica między odczytami, gdy robot stoi czujnikiem na linii oraz w sytuacji, gdy sensor jej nie widzi. Będzie to wyglądało np. następująco:

W każdym przypadku uzyskane odczyty
mogą się znacznie różnić od prezentowanych powyżej.

Wszystko zależy od ustawienia czujników oraz podłoża, na którym są testowane. Najważniejsze, aby była widoczna różnica między odczytami wykonanymi na czarnej oraz białej powierzchni. Już 50-100 jednostek ADC wystarczy do dalszych prac.

W przypadku problemów z uzyskaniem odpowiednich odczytów powinno zacząć się od regulacji jasności, z jaką świeci dioda. Oczywiście w tym celu korzystamy z potencjometru wbudowanego w czujnik. Dodatkowo warto osłonić fotorezystory kawałkiem rurki termokurczliwej.

Fotorezystory osłonięte rurkami termokurczliwymi.

Nałożenie jej (i delikatne zaciśnięcie przez podgrzanie) na fotorezystorach powinno zwiększyć różnicę między odczytami. Zabieg ten uodporni również robota na czynniki zewnętrzne (np. światło słoneczne, które wpadając przez okno oświetli dodatkowo kawałek trasy).


Zanim przejdziesz dalej upewnij się, że drugi czujnik również
działa poprawnie! Zapisz wartości, jakie zwraca przetwornik ADC
w przypadku umieszczenia czujnika nad linią oraz poza nią.

W moim przypadku zanotowałem następujące wartości (uśrednione dla obu czujników):

  • czujnik nad linią: 930
  • czujnik poza linią: 680

Implementacja prostego komparatora

Teraz należy dobrać ręcznie wartość ADC, od której będziemy uznawać, że czujnik wykrył linię. Robot będzie się poruszał, więc nie możemy ustalić sztywnych granic. Odczyty czujników będą cały czas się zmieniać, dlatego najlepiej ustalić wartość graniczną.

Na podstawie wcześniej zanotowanych informacji uznałem, że każdy przypadek powyżej 850 robot ma identyfikować jako czarną linię. Po wybraniu wartości granicznej najlepiej od razu dodać do programu odpowiednią stałą:

Dla wygody dodajmy teraz dwie funkcje, które będą zwracały informację na temat stanu czujników. Najlepiej przyjąć, że 1 oznacza linię, a 0 jej brak. Funkcje będą więc pełniły rolę komparatorów.

Funkcje zwracają tylko 1 (prawdę) lub 0 (fałsz), więc mogą być typu boolean:

Teraz koniecznie trzeba sprawdzić, czy oba czujniki działają poprawnie. W tym celu w pętli loop() będziemy odpytywać sensory, czy widzą linię. Aby test był „bardziej mobilny” oprócz UARTa wykorzystamy buzzer (dla lewego czujnika) i diodę (dla prawego czujnika).

Cały program może wyglądać następująco:

Zanim przejdziesz dalej upewnij się, że oba czujniki działają poprawnie! Aby uniknąć później wielu problemów trzeba sprawdzić, czy aktualnie ustawiona GRANICA spełnia swoje zadanie.

W tej chwili poprawne działanie programu, to:

  • oba czujniki na białej powierzchni – buzzer i dioda wyłączone
  • oba czujniki na czarnej powierzchni  – buzzer i dioda włączone
  • linia pod lewym czujnikiem – buzzer włączony, dioda wyłączona
  • linia pod prawym czujnikiem – buzzer wyłączony, dioda włączona.

Teraz przejdziemy do napisania 3 prostych algorytmów,
dzięki którym robot będzie mógł śledzić linię.

Wariant 1: line follower z jednym czujnikiem

Tak wiem, że mamy w robocie założone już 2 czujniki, warto jednak dla ciekawostki sprawdzić jak zachowa się robot śledzący linię jednym czujnikiem. Z takim zadaniem często mierzą się osoby, które budują roboty z klocków LEGO (w zestawach najczęściej jest tylko jeden czujnik linii).

Tak naprawdę, to nie da się śledzić linii
z wykorzystaniem jednego czujnika!

Można jednak śledzić krawędź linii! Jeśli postawimy robota obok lewej krawędzi linii, to program powinien realizować następujące operacje:

  1. Jeśli czujnik widzi linię: jedź łukiem w lewo,
  2. Jeśli czujnik nie widzi linii: jedź łukiem w prawo.

Dzięki temu robot będzie „odbijał się” od lewej krawędzi linii!

Na potrzeby testu odłączyłem czujnik prawy (wystarczyło odpiąć przewód). Program:

Działanie programu w praktyce widoczne jest na poniższym filmie:

Może pewnym nadużyciem byłoby powiedzieć, że robot na filmie jedzie płynnie… Jednak na pewno realizuje swoje zadanie, czyli podąża po naklejonej linii. Oczywiście regulując prędkości silników można jeszcze sporo wyregulować i poprawić wyniki robota!

Wariant 2: line follower z dwoma czujnikami

Teraz skorzystamy z dwóch czujników, więc ponownie podłączamy przewód od prawego sensora. Tym razem rozsuniemy czujniki na bok (zgodnie z poniższym zdjęciem) tak, aby w momencie, gdy robot stoi idealnie na linii żaden z sensorów jej nie widział.

Dzięki temu minimalny zjazd z trasy będzie
„alarmował” Arduino, że należy zacząć skręcać!

Nowe ustawienie czujników – widok od spodu.

Tym razem program powinien działać następująco:

  1. Jeśli żaden z czujników nie widzi linii: jazda do przodu.
  2. Jeśli czujnik lewy widzi linię: jazda po łuku w lewo.
  3. Jeśli czujnik prawy widzi linię: jazda po łuku w prawo.

Patrząc na robota od góry, będzie to wyglądało więc następująco:

Program realizujący takie zadanie może wyglądać następująco:

Działanie programu w praktyce widoczne jest na poniższym filmie:

Robota można lepiej wyregulować zmieniając rozchylenie czujników oraz prędkości z jakimi się porusza. Niestety szybko dojdziemy do sytuacji, w której pojazd na zakręcie „nie wyrobi”. Mimo skręcania i tak wyjedzie za trasę. Niestety przy obecnej konfiguracji po wyjechaniu za linię oba czujniki zobaczą „białe podłoże” więc… robot pojedzie prosto!

Podczas budowania line followerów należy zdecydowanie unikać wariantu,
gdy robot będąc idealnie na linii nie widzi jej żadnym czujnikiem!

Rozwiązaniem tego problemu jest kolejna konfiguracja robota!

Wariant 3: line follower z dwoma czujnikami v2

Tym razem również skorzystamy z dwóch czujników, jednak postaramy się zbliżyć je do siebie. Dzięki temu podczas jazdy idealnie „po linii” oba czujniki będą ją widziały. Minimalne odchylenie od poprawnego toru jazdy sprawi, że robot zacznie korygować swój ruch.

Nowe ustawienie czujników.

Tym razem program powinien działać następująco:

  1. Jeśli oba czujniki widzą linię: jazda do przodu.
  2. Jeśli czujnik lewy nie widzi linii: jazda po łuku w prawo.
  3. Jeśli czujnik prawy nie widzi linii: jazda po łuku w lewo.

Patrząc na robota od góry, będzie to wyglądało więc następująco:

Przykładowy program realizujący to zadanie widoczny jest poniżej:

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

Inne konfiguracje robota

Podczas budowy line followera duży wpływ na efekt finalny ma rozmieszczenie czujników. W tym robocie bardzo łatwo regulować rozmieszczenie czujników ich rozchylanie na boki (tak jak robiliśmy to podczas opisywanych przykładów).

Przykładowe rozmieszczenie
czujników z tyłu robota.

Równie ciekawe zmiany zachowania można również uzyskać poprzez umieszczenie czujników po drugiej stornie robota (zamiana przodu z tyłem). Jeśli robot będzie jeździł odwrotnie, to sensory będą umieszczone znacznie dalej od osi napędowej. Dzięki temu mniejsze ruchy kół wystarczą do tego, aby nakierować robota na właściwy tor.

Podsumowanie

Mam nadzieję, że po tym artykule każdy będzie już wiedział jak line follower śledzi linię! Zachęcam wszystkich do testów i prób ustawiania jak największej prędkości. Koniecznie pochwalcie się w komentarzach filmami, które pokazują Wasze roboty w akcji!

Omówione zagadnienia, to dopiero wstęp. Do szybszej i płynnej jazdy potrzebna jest większa ilość czujników oraz bardziej rozbudowane algorytmy. W przyszłości pojawi się zestaw dodatkowych sensorów do naszego robota – wtedy zainteresowani tym tematem będę mogli pójść krok dalej!

Autor kursu: Damian (Treker) Szymański
Ilustracje: Piotr Adamczyk

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Powiadomienia o nowych, darmowych artykułach!

Komentarze

Arturek1988

19:14, 15.02.2017

#1

Witam mam pytanie odnośnie expandera portów na mostku H ponieważ trochę zmodernizowałem troszkę swojego robocika a nie potrafię się skomunikować z tymi pinami mogę prosić o pomoc wiem ze expander prawdopodobnie znajduje się na adresie 0x20 ale nie wiem jak nim sterować.

leepa79

22:40, 15.02.2017

#2

Treker mam nadzieję, że choroba odpuściła ;) jak nie to życzę szybkiego powrotu do zdrowia.

Dałem dziś wycisk robotowi. Trasa z paneli, nierówna. Słabe oświetlenie, ale dał radę. Kod - wariant 3 - jedynie dostosowałem 'GRANICA' do panujących warunków. Przy prędkościach prawy/rewyMotor ponad (50) wyskakuje na takiej powierzchni z trasy. Myślę, że na równym podłożu i lepszym oświetleniu da radę więcej.

Treker
Autor wpisu
Administrator

15:56, 16.02.2017

#3

Arturek1988, ekspander portów również zostanie omówiony przy okazji kursu (możliwe, że w tym celu ukarze się jeszcze jedna, dodatkowa część). Jeśli dobrze w tej chwili pamiętam, to jest to ekspander MCP23008, który faktycznie odnaleźć można na adresie 0x20. Jego obsługa powinna przebiegać w sposób standardowy, ciężko mi powiedzieć, co może być u Ciebie nie tak - szczególnie, że nie rozumiem tego fragmentu z mostkiem H. Najłatwiej będzie chyba jak poczekasz do publikacji odpowiedniej części kursu budowy robotów i porównasz wtedy programy ;)

leepa79 napisał/a:

Treker mam nadzieję, że choroba odpuściła

Nie tyle odpuściła, co chyba nie dałem się jej złapać do końca ;)

Super filmik, faktycznie robot działa dobrze (jak na takie nierówności) no i super radzi sobie ze skrzyżowaniem!

Raf11

19:04, 19.02.2017

#4

Zainspirowany Elektroprzewodnikiem (https://www.youtube.com/user/ElektroPrzewodnik) zmodyfikowałem trochę mojego potwora, a mianowicie dodałem możliwość sterowania smartfonem. Choć "dodanie" to może niewłaściwe słowo, gdyż musiałem najpierw odjąć Arduino i Shielda i dodać ESP8266 oraz sterownik silników DRV8835 (nie wiem jeszcze jak do Arduino dodać WiFi a Bluetootha nie mam w swoich zasobach).

Jak widać na filmiku takie połączenie działa, lecz wymaga jeszcze kalibracji bo czasami potwór jest trochę zrywny (muszę wypróbować jeszcze inny smartfon lub tablet gdyż to może być wina akcelerometru).

Może Autor kursu zrobiłby dodatkowy odcinek o tym jak do shielda dołączyć WiFi lub Bluetooth i sterować nim zdalnie (ze smartfona)? To tylko taka mała sugestia, gdyż może to kogoś zainteresować (mnie akurat interesuje).

Treker
Autor wpisu
Administrator

19:13, 19.02.2017

#5

Raf11, oczywiście, że mam taki plan! Gdy kurs dobiegnie końca zajmiemy się rozbudowywaniem robota o nowe możliwości. Na pewno przyjdzie wtedy moment, w którym zajmiemy się komunikacją bezprzewodową z telefonami :)

Raf11

20:18, 19.02.2017

#6

Treker napisał/a:

Raf11, oczywiście, że mam taki plan! Gdy kurs dobiegnie końca zajmiemy się rozbudowywaniem robota o nowe możliwości. Na pewno przyjdzie wtedy moment, w którym zajmiemy się komunikacją bezprzewodową z telefonami :)

To się cieszę i czekam z niecierpliwością :)

Elektrotechnik

13:38, 25.02.2017

#7

Kiedy na botlandzie pojawią się zestawy ?

Treker
Autor wpisu
Administrator

13:47, 25.02.2017

#8

Elektrotechnik, witam na forum :)

Aktualnie Botland zmienia siedzibę (zgodnie z informacją na ich stronie), więc jak tylko zakończy się przeprowadzka, to sukcesywnie będą uzupełniane braki w zestawach. Mam nadzieję, że w najbliższym tygodniu będą już dostępne :)

Arturek1988

23:47, 26.02.2017

#9

Gratulacje Raf11 myŚlałem o tym samym i

też oczekuje na taki kurs

a puki co wrzucam filmik z mojego line followera

Treker
Autor wpisu
Administrator

10:29, 27.02.2017

#10

Arturek1988, super tor :) Widzę, że dołożyłeś wyświetlacz - również mamy takie plany na przyszłość, więc inni będą mogli pójść w Twoje ślady.

Arturek1988

21:12, 27.02.2017

#11

Dla zainteresowanych wrzucam jeszcze kod w tej konfiguracji gdy zakręt jest zbyt ostry i robot zgubi linie skręci ostro w ostatnim znanym kierunku co sprawia że wraca na zagubioną linie nawet przy wiekszej predkosci

akt_R, akt_L są typu int zadeklarowane przed pętlą/globalnie by pamiętać ostatni kierunek

{

if (leftSensor() == 1 && rightSensor() == 1)

{ //Jesli oba czujniki widza linie

akt_R=40;

akt_L=40;

}

else if ((leftSensor() == 0) && (rightSensor() == 1))

{ //Jesli lewy czujnik nie widzi linii

akt_L=50; //Jazda po łuku w prawo

akt_R=10;

}

else if ((rightSensor() == 0) && (leftSensor() == 1))

{ //Jesli prawy czujnik nie widzi linii

akt_L=10; //Jazda po łuku w lewo

akt_R=50;

}

else// jestem poza trasą

{

if (akt_L>akt_R) //jezeli ostatnio w lewo

{

akt_L=50; //ostro w lewo

akt_R=-40;

}

else if (akt_R>akt_L) //jezeli ostatnio w prawo

{

akt_L=-40; //ostro w prawo

akt_R=50;

}

else //start szukam lini

{

akt_L=30;

akt_R=30;

}

}

leftMotor(akt_L);

rightMotor(akt_R);

}

__________

Komentarz dodany przez: Treker

_kod

[ Dodano: 27-02-2017, 23:53 ]

Już poprawione

Zobacz powyższe komentarze na forum

FORBOT Damian Szymański © 2006 - 2017 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.