Zaloguje się
or
Tel +48 698 615 740

Sterowanie robotem przy pomocy kontrolera bezprzewodowego

15 listopada, 2021

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 ODBIORNIKANAZWAPINY ARDUINO
7CLKA3
1DATA0
2CMDA1
6ATT/SELA2
4GNDGND
5PWR3.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.

Pliki do pobrania

Sticky
Możliwość komentowania Sterowanie robotem przy pomocy kontrolera bezprzewodowego została wyłączona
Adrian Wojtala

Adrian Wojtala

Ma 21 lat. Studiuje informatykę na Uniwersytecie DSW, ukończył technikum o profilu technik-informatyk. Interesuje się programowaniem i w przyszłości ma plan zostać back-end developerem. Swoją przygodę z Arduino rozpoczął podczas praktyk od września 2021 r.

Comments are closed.

Strona korzysta z plików cookies w celu realizacji usługi i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.