Beam Follower czyli robot z Arduino goni światło
Zasada działania:
W tym przypadku robot zamiast podążać za linią goni światło latarki – zupełnie jak kot, który stara się złapać plamkę lasera. Tak jak wcześniej wykorzystamy falową naturę światła. Mianowicie, naszymi czujnikami natężenia światła będą fototranzystory wrażliwe na podczerwień. Dlaczego takie? Bo działają ;) Światło latarki zawiera sporo promieniowania podczerwonego. Teoretycznie można też użyć fotorezystorów, jednak są one znacznie mniej dokładne.
Podłączenie:

Jak widać, nie należy ono do bardzo skomplikowanych. Krótsza nóżka do masy, dłuższa do wejścia analogowego w arduino i rezystora. Jak pamiętacie, w module optycznym Line Followera zostawiłem dwa wolne wyprowadzenia. Wykorzystamy je teraz ;) Fototranzystory bez najmniejszego problemu można wlutować w płytkę, na której znajdują się transoptory. Jak widać, na poprzednio zlutowane transoptory nałożyłem warstwę taśmy izolacyjnej aby uniknąć zwarć.

Oczywiście, równie dobrze możecie w ogóle tego nie lutować, tylko wykorzystać płytkę stykową BB-170 przymocowaną np. gumką recepturką do korpusu. To już od Was zależy ;)
Niezależnie od tego, który sposób wybierzecie, nie ustawcie czujników za daleko od siebie, szerokość płytki BB-170 jest optymalna. Poza tym ustawcie je pod kątem do siebie, to zwiększy różnicę między ilością światła padającą na oba fototranzystory.
Moduł linefollowera z dodatkowymi fototranzystorami:

Moduł linefollowera z dodatkowymi fototranzystorami, widok z dołu:

Program, czyli co robot myśli:
Deklaracja zmiennych. „left” i „right” to numery pinów analogowych do których będziemy podłączać czujniki. Tak jak poprzednio, „predkosc” i „predkosc2” to wartości wypełnienia PWM i trzeba je dopasować samodzielnie. Z kolei dwie ostatnie deklaracje odpowiadają za czułość robota. Zbyt mała czułość sprawi, że robot nie będzie jechał za światłem, zbyt duża z kolei – że będzie jechał za nim bardzo wolno. Sprawdźcie sami: w miejsce „wartoscmax” wpiszcie 1000 i zobaczcie co się stanie ;)
#include <MotorShield.h> MS_DCMotor prawy(MOTOR_A); MS_DCMotor lewy(MOTOR_B); #define left 2 #define right 3 #define predkosc 150 #define predkosc2 100 //predkosc przy skrecaniu #define wartoscmin 0 #define wartoscmax 700
Funkcja odpowiadająca za zapis pomiaru do struktury i jednoczesnemu zaokrągleniu wyniku. Funkcja map() pozwala przeliczyć jakiś zbiór wartości na inny, wg wzoru podanego na stronie. Zmniejszenie przedziału sprawia, że zaokrąglamy odczyty z fototranzystorów.
void zmierz(struct Pomiary &odczyt) { odczyt.lewy = map(analogRead(left), 0, 1023, wartoscmin, wartoscmax); odczyt.prawy = map(analogRead(right), 0, 1023, wartoscmin, wartoscmax); }
Funkcja sterująca. Dzięki wcześniejszemu zaokrągleniu odczytów możemy zastosować najprostsze rozwiązanie – sprawdzenie czy napięcie na lewym fototranzystorze jest większe/mniejsze/równe napięciu na prawym. W ten sposób wiemy, po której stronie jest jaśniej.
void steruj(struct Pomiary odczyt) { // jesli fototranzystor jest wpięty między analog pin i masę if(odczyt.lewy == odczyt.prawy) { prawy.setSpeed(predkosc); lewy.setSpeed(predkosc); } if(odczyt.lewy < odczyt.prawy) { //wiecej swiatla po lewej prawy.setSpeed(predkosc2); lewy.setSpeed(0); } if(odczyt.lewy > odczyt.prawy) { //wiecej swiatla po prawej prawy.setSpeed(0); lewy.setSpeed(predkosc2); } }
Na koniec…
Program możecie ściągnąć tutaj. Tak jak wcześniej, zachęcam do modyfikowania tego projektu ;)
Jest to przykładowa konstrukcja, dla naszego zestawu Robo Kit