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:

Podłączenie fototranzystora

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ć.

Podłączenie fototranzystora w praktyce

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:

Gotowy moduł, 2 w jednym

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

Gotowy moduł, 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