W artykule zostanie omówiony montaż oraz programowanie robota tak aby była możliwość sterowania go przez pada.
Spis treści
- Podłączenie odbiornika kontrolera do robota
- Programowanie robota
- Konfiguracja robota
- Pliki do pobrania
Podłączenie odbiornika kontrolera do robota
Zajmiemy się podłączeniem odbiornika od pada(osobny artykuł na temat kontrolera znajdziesz tutaj), podpinamy przewody żeńskie zgodnie z tabelką oraz schematem który znajduje się poniżej.
PINY ODBIORNIKA | NAZWA | PINY ARDUINO |
7 | CLK | A3 |
1 | DAT | A0 |
2 | CMD | A1 |
6 | ATT/SEL | A2 |
4 | GND | GND |
5 | PWR | 3.3V |
Moduł od kontrolera trzymamy skierowany płaską stroną do góry, a zaokrągloną do dołu, piny liczymy od lewej strony.
Po dokonaniu połączenia, możemy przejść do zaprogramowania arduino tak aby obsługiwał pada.
Programowanie robota
Zaczynamy od importowania biblioteki obsługującej pada(możesz pobrać ją klikając tutaj), dla tych którzy mają problemy z połączeniem się do jego modułu zalecam włączenie trybu debugowania biblioteki, dokładniej jest to opisane w osobnym artykule na temat kontrolera który znajdziesz tutaj.
Definiujemy piny do których jest podpięty odbiornik, oraz piny silników, będą one bardzo ważne żeby nasz robot jeździł prawidłowo.
#include <PS2X_lib.h> #define CLK A3 #define DAT A0 #define CMD A1 #define SEL A2 //silnik 1 #define out1 11 #define out2 10 //silnik 2 #define out3 9 #define out4 8 //silnik 3 #define out5 7 #define out6 6 //silnik 4 #define out7 5 #define out8 4
Gdyby wasz robot był podpięty do innych pinów, możecie je tutaj zmienić, ale konfigurowanie robota omówimy na końcu. Tworzymy obiekt pad, ustawiamy wyjścia do silników, tworzymy zmienną error i przypisujemy do niej kod błędu jeżeli takowy wystąpił.
PS2X pad;//stworzenie obiektu pad int error = 0;//zadeklarowanie zmiennej error void setup() { delay(300); pinMode(out1, OUTPUT);//ustawienie out1 jako wyjście pinMode(out2, OUTPUT);//ustawienie out2 jako wyjście pinMode(out3, OUTPUT);//ustawienie out3 jako wyjście pinMode(out4, OUTPUT);//ustawienie out4 jako wyjście pinMode(out5, OUTPUT);//ustawienie out5 jako wyjście pinMode(out6, OUTPUT);//ustawienie out6 jako wyjście pinMode(out7, OUTPUT);//ustawienie out7 jako wyjście pinMode(out8, OUTPUT);//ustawienie out8 jako wyjście error = pad.config_gamepad(CLK, CMD, SEL, DAT);//jeżeli wystąpi błąd przypisz go do zmiennej error }
Przechodzimy do funkcji głównej, wykorzystamy tam funkcje, aby kod był bardziej przejrzysty, oraz łatwiejszy do skonfigurowania pod swojego robota. Cała funkcja loop będzie wyglądała następująco.
void loop() { if(error == 1) {//jeżeli wystąpił błąd wróć i spróbuj połączyć się z kontrolerem ponownie return; } pad.read_gamepad();//wczytanie kontrolera int galkaY = pad.Analog(PSS_LY);//utworzenie zmiennej galkaY która odpowiada za przetrzymywanie wartości ruch lewej gałki osi Y int galkaX = pad.Analog(PSS_LX);//utworzenie zmiennej galkaY która odpowiada za przetrzymywanie wartości ruch lewej gałki osi X if(galkaY < 108) { jedzDoPrzodu();//funkcja odpowiadająca za ruch do przodu } else if (galkaY > 148) { jedzDoTylu();//funkcja odpowiadająca za ruch do tylu } else if (galkaY == 128) { stoj();//funkcja odpowiadająca za wyłączenie silników } if(galkaX < 108) { skrecLewo();//funkcja odpowiadająca za skręcanie w lewo } else if(galkaX > 148) { skrecPrawo();//funkcja odpowiadająca za skręcanie w prawo } if(pad.Button(PSB_CROSS)) { obrotLewo();//funkcja odpowiadająca za obrót w lewo } else if (pad.Button(PSB_CIRCLE)) { obrotPrawo();//funkcja odpowiadająca za obrót w prawo } delay(50); }
Wszystkie funkcje umieszczamy pod naszą główną, odpowiadają one za sterowanie.
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 jedzDoTylu() { digitalWrite(out1, HIGH); digitalWrite(out2, LOW); digitalWrite(out3, HIGH); digitalWrite(out4, LOW); digitalWrite(out5, HIGH); digitalWrite(out6, LOW); digitalWrite(out7, HIGH); digitalWrite(out8, LOW); } 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); } void obrotLewo() { digitalWrite(out1, LOW); digitalWrite(out2, HIGH); digitalWrite(out3, LOW); digitalWrite(out4, HIGH); digitalWrite(out5, HIGH); digitalWrite(out6, LOW); digitalWrite(out7, HIGH); digitalWrite(out8, LOW); } void obrotPrawo() { digitalWrite(out1, HIGH); digitalWrite(out2, LOW); digitalWrite(out3, HIGH); digitalWrite(out4, LOW); digitalWrite(out5, LOW); digitalWrite(out6, HIGH); digitalWrite(out7, LOW); digitalWrite(out8, HIGH); } void stoj() { digitalWrite(out1, LOW); digitalWrite(out2, LOW); digitalWrite(out3, LOW); digitalWrite(out4, LOW); digitalWrite(out5, LOW); digitalWrite(out6, LOW); digitalWrite(out7, LOW); digitalWrite(out8, LOW); }
Cały gotowy kod jest dostępny do pobrania tutaj.
Konfiguracja robota
Musimy teraz odpowiednio przystosować kod pod naszego robota, ponieważ w miejsca w które wpięliśmy silniki mogą się różnić od tych w programie, wytłumaczę teraz jak to zrobić, nie będzie to bardzo trudne. Pamiętajmy o tym, aby włożyć akumulatorki, ponieważ bez nich nasze silniki nie ruszą.
Na początku musimy wgrać powyższy kod do arduino, kiedy już to zrobimy, łączymy pada, podnosimy robota i dajemy lewą gałkę do przodu, wszystkie cztery silniki powinny zacząć się obracać, mogą się kręcić w różne strony, dlatego musimy ustalić przód naszego robota np. miejsce w którym są akumulatorki. Jeżeli koła kręcą się w prawą stronę do akumulatorków, znaczy, że jest odpowiednio, jeżeli w przeciwną musimy zmienić numery pinów, zaczynamy od kabelka który idzie od silnika do modułu, patrzymy na module do jakich wyjść mamy wpięte są dwie opcje OUT1 i OUT2, albo OUT3 i OUT4. Szukamy teraz w miejscu logic input(patrz schemat) IN1, IN2, IN3 i IN4, odpowiadają one naszym wyjścią, teraz dla przykładu jeżeli mamy wpięte przewody od silnika do OUT1 i OUT2 patrzymy na IN1 i IN2, sprawdzamy do jakich pinów idą do arduino, przypuśćmy że do 11 i 10, to teraz musimy zamienić miejscami te piny w naszym kodzie w następujący sposób.
#define out1 11 → #define out1 10
#define out2 10 → #define out2 11
To powinno zmienić kierunek obrotów naszego silnika, kiedy zrobicie już tak, aby wszystkie obracały się w jednym kierunku, możemy przejść do skręcania w lewo i prawo.
Zaczynamy od ustawienia naszej gałki w lewo, ustawiamy robota przodem i sprawdzamy czy skręca w lewo(koła mogą się kręcić po prawej stronie), jeżeli tak, to wszystko jest poprawnie, jeżeli nie musimy zamienić miejscami nasze funkcje w taki sposób.
Obecny stan
if(galkaX < 108) { skrecLewo();//funkcja odpowiadająca za skręcanie w lewo } else if(galkaX > 148) { skrecPrawo();//funkcja odpowiadająca za skręcanie w prawo }
Zamienione miejscami
if(galkaX < 108) { skrecPrawo();//funkcja odpowiadająca za skręcanie w prawo } else if(galkaX > 148) { skrecLewo();//funkcja odpowiadająca za skręcanie w lewo }
Po zamianie wszystko powinno działać prawidłowo i tym sposobem ukończyliśmy konfigurowanie naszego robota.