W artykule zostanie omówione zaprogramowanie oraz podłączenie czujników do robota z którego utworzymy line-followera. Będzie on podążał za czarną linią która będzie na białym tle.
Spis treści
- Zamontowanie czujników do “podstawy”
- Podłączenie czujników
- Zaprogramowanie line-followera
- Konfigurowanie czujników
- Pliki do pobrania
Zamontowanie czujników do “podstawy”
Do zbudowania line-followera potrzebujemy zapoznać się z wcześniejszym artykułem dotyczącego podłączenia zasilania robota, oraz z tym jak sterować szybkością , możecie to zrobić tutaj. Nasz line-follower będzie się różnił tym, że nie nie ma potrzeby podłączenia do niego pada, ponieważ trasę będzie mu wyznaczać czarna taśma, na białej powierzchni. Nowością będą tylko czujniki kolorów które pozwolą odróżnić białe od czarnego.
Podłączenie czujników
Zaczniemy od zapoznania się ze schematem podłączenia czujników.
PINY CZUJNIKA | PINY ARDUINO |
S0 | A0, A6 |
S1 | A1, A7 |
S2 | A3, 4 |
S3 | A2, 5 |
OUT | A4, 2 |
VCC | +5V |
GND | GND |
W pinach arduino są po dwa piny ponieważ mamy dwa czujniki, także podłączamy je zgodnie z powyższą tabelą.
Zaprogramowanie line-followera
Po podłączeniu czujników zajmiemy się kodem, wykorzystamy tutaj funkcję których używaliśmy w artykule z podłączania i wykorzystania modułów silnika w robocie, ale na razie zacznijmy od początku.
Definiujemy wszystkie silniki, oraz dwa czujniki w następujący sposób
//silnik 1 #define out1 13 #define out2 12 //silnik 2 #define out3 10 #define out4 11 //silnik 3 #define out5 9 #define out6 8 //silnik 4 #define out7 6 #define out8 7 //obroty silnika #define PWM 3 //czujnik 1 #define S0 A0 #define S1 A1 #define S2 A3 #define S3 A2 #define sensorOut A4 //czujnik 2 #define S00 A6 #define S01 A7 #define S02 4 #define S03 5 #define sensor 2
Silniki dostosowujemy pod swoje piny, aby wszystkie ruszały się w prawidłową stronę również jest to omówione w jaki sposób to zrobić w artykule z podłączania i wykorzystania modułów silnika w robocie.
Kiedy nasze koła kręcą się tak jak chcemy przechodzimy do funkcji setup gdzie ustawiamy wszystkie wejścia i wyjścia, Serial.begin() przyda nam się do późniejszego testowania.
void setup() { Serial.begin(9600); pinMode(out1, OUTPUT); pinMode(out2, OUTPUT); pinMode(out3, OUTPUT); pinMode(out4, OUTPUT); pinMode(out5, OUTPUT); pinMode(out6, OUTPUT); pinMode(out7, OUTPUT); pinMode(out8, OUTPUT); pinMode(PWM, OUTPUT); pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut, INPUT); pinMode(S00, OUTPUT); pinMode(S01, OUTPUT); pinMode(S02, OUTPUT); pinMode(S03, OUTPUT); pinMode(sensor, INPUT); digitalWrite(S0, HIGH); digitalWrite(S1, LOW); digitalWrite(S00, HIGH); digitalWrite(S01, LOW); }
Przejdźmy teraz do głównej funkcji loop, gdzie zaprogramujemy całość, nie będzie ona zbyt długa ze względu na to, że będziemy używać funkcji
void loop() { analogWrite(PWM, 75);//ustawiamy prędkość int lewy = zrobPomiar(S2, S3, sensorOut);//wywołujemy funkcje która zrobi nam pomiar dla pierwszego czujnika int prawy = zrobPomiar(S02, S03, sensor);//wywołujemy funkcje która zrobi nam pomiar dla drugiego czujnika if (lewy > 20 && prawy < 17 ) {//jeżeli lewy czujnik widzi wartość powyżej 20 (taśmę), a prawy wartość poniżej 17(białe), to skręć w lewo analogWrite(PWM, 85); skrecLewo(); } else if (lewy < 17 && prawy > 20) {//jeżeli lewy czujnik widzi wartość poniżej 17 (białe), a prawy wartość powyżej 20(taśmę), to skręć w prawo analogWrite(PWM, 85); skrecPrawo(); } else {//w przeciwnym wypadku jedz prosto jedzDoPrzodu(); } }
Poniżej podaję jeszcze funkcje które będą niezbędne do działania naszego programu, wklejamy je pod funkcją loop.
int zrobPomiar(int x, int y, int z) { int frequencyRed = 0, frequencyGreen = 0, frequencyBlue = 0, suma = 0; digitalWrite(x, LOW);//x = s2 digitalWrite(y, LOW);//y = s3 frequencyRed = pulseIn(z, LOW);//z = out digitalWrite(x, HIGH); digitalWrite(y, HIGH); frequencyGreen = pulseIn(z, LOW); digitalWrite(x, LOW); digitalWrite(y, HIGH); frequencyBlue = pulseIn(z, LOW); suma = frequencyRed + frequencyGreen + frequencyBlue; return suma; } void jedzDoPrzodu() { digitalWrite(out1, LOW); digitalWrite(out2, HIGH); digitalWrite(out3, LOW); digitalWrite(out4, HIGH); digitalWrite(out5, LOW); digitalWrite(out6, HIGH); digitalWrite(out7, LOW); digitalWrite(out8, HIGH); } void skrecLewo() { digitalWrite(out1, LOW); digitalWrite(out2, HIGH); digitalWrite(out3, LOW); digitalWrite(out4, HIGH); digitalWrite(out5, LOW); digitalWrite(out6, LOW); digitalWrite(out7, LOW); digitalWrite(out8, LOW); } void skrecPrawo() { digitalWrite(out1, LOW); digitalWrite(out2, LOW); digitalWrite(out3, LOW); digitalWrite(out4, LOW); digitalWrite(out5, LOW); digitalWrite(out6, HIGH); digitalWrite(out7, LOW); digitalWrite(out8, HIGH); }
Konfigurowanie czujników
Aby ustawić prawidłowe wartości w instrukcjach warunkowych musimy skalibrować naszego robota i ustalić który czujnik to lewy, a który prawy, jako tester przygotujmy białą kartkę z naklejonym kawałkiem taśmy, następnie przesuwamy taśmę najpierw w lewą stronę, później w prawą i na środek pomiędzy czujnik, sprawdzamy wtedy jakie wyniki zwracają nam czujniki i dostosowujemy do tego wartości w instrukcjach if, w moim wypadku było to powyżej 20 czarne, a poniżej 17 białe. Wartości odczytujemy z monitora portów szeregowych.
Po poprawnym skalibrowaniu, nasz robot powinien śledzić czarną linię. Cały kod znajduje się do pobrania poniżej.