Beamfollower- czyli robot podążający za światłem

Beamfollower, robot uganiający się za światłem.

Wstęp

Złożony i gotowy do jazdy robot

Robot z zestawu to nie tylko line follower. Może on być również użyty do budowy światłoluba, czyli robota podążającego za światłem. Do tego celu posłużą nam wolne miejsca na płytce RoboBoard, w które wlutujemy fototranzystory wraz z rezystorami. Teoretycznie można też użyć fotorezystorów, jednak są one znacznie mniej dokładne. Jeśli jesteście gotowi to rozpocznijmy montaż i ożywienie naszego światłoluba.

Montaż

Jeśli zdecydowaliście się na montaż wszystkich elementów podczas składania Robo Board, ten etap można pominąć.
Montaż rozpoczniemy od wlutowania dwóch rezystorów ograniczających. Oznaczone są one jako R6 oraz R7 i mają wartość równą 10k(kolor brązowy czerwony czarny czarny brązowy). Kolejną czynnością jest wlutowanie rzędu trzech kątowych goldpinów. Ostatnim krokiem jest montaż fototranzystorów. Tu mała uwaga, uważajcie aby nie przegrzać fototranzystora.

Wlutowany fototranzystor wraz z rezystorem

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

Nasze czujniki połączymy z Arduino za pomocą wlutowanych goldpinów. Tak jak w przypadku Line Followera potrzebna będzie taśma łącząca czujniki z mózgiem naszego robota. Jeśli jest ona za krótka (tak jak w naszym przypadku), nic nie stoi na przeszkodzie, aby ją złączyć z inną. Do PINu 1 i 2 podłączamy kable koloru szarego i białego, a następnie łączymy je z żółtym i zielonym. Pamiętajmy który kabel ma jaki kolor, w przeciwnym wypadku nasz robot po uruchomieniu może bać się światła i zacząć uciekać od niego. Prawidłowe podłączenie listwy goldpin wygląda tak:

Podłaczenie fototranzystora
Połączenie przewodów

Ostatnią rzeczą, zakładając, że silniki są nadal połączone z MotorShieldem, jest podłączenie zasilania do czujników.

Połączenie z MotorShieldem

Kod

Korzystamy z biblioteki napisanej przez kogoś ze społeczności Arduino do obsługi Motor Shielda, którą można pobrać tutaj.

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);
}
}

Odnośniki