Beam Follower

Jak zbudować robota, który będzie kierował się w stronę światła?

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:

<a href="schemat1.jpg><img class="img-responsive" src="schemat1-male.jpg></a>

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. W dalszej części wykorzystamy moduł Line Followera, więc zbudowanie tego układu jest konieczne, do przejścia dalej. 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ć.

Pamiętajcie, że jeśli nie chcecie lutować układu, zawsze możecie skorzystać z płytki prototypowej takiej jak ta. Jej szerokość jest optymalna, jeśli chodzi o rozstaw fototranzystorów. Poza tym ustawcie je pod kątem do siebie, to zwiększy różnicę między ilością światła padającą na oba czujniki.

Podłączenie fototranzystora w praktyce Gotowy moduł, dwa w jednym 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. Zachęcam do modyfikowania tego projektu ;)

Konstrukcja została zbudowana na bazie zestawu RoboKit