Cześć
W dzisiejszym artykule zajmiemy się obsługą modułu Funduino Joystick. Możemy go zakupić TUTAJ.
Moduł składa się z dwuosiowego Joysticka oraz 5 przycisków. Możemy go używać do sterowania w wielu projektach.
Shield ma wbudowane wejścia na ekran z Nokii 5110 oraz moduł radiowy nRF24L01.
Podłączenie
Podłączenie modułu jest banalnie proste, ponieważ ogranicza się tylko do nałożenia shield’a na Arduino.
Schemat podłączenia pinów wygląda tak
Kod
Odczyt aktualnego położenia Joysticka
Odczyt aktualnego położenia Joysticka jest bardzo prosty. Ponieważ działa on na takiej samej zasadzie jaką stosujemy w odczycie danych z potencjometru. Czyli sygnał wejściowy możemy odczytać za pomocą funkcji
1 |
analogRead(); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const byte X = 0;//definiowanie zmiennych X i Y oraz przypisanie pinów const byte Y = 1; void setup() { Serial.begin(9600); } void loop() { Serial.print("x:"); Serial.print(analogRead(X)); //wypisanie na ekranie wartości z pinu 0(zmiennej x) Serial.print(" "); Serial.print("y:"); Serial.print(analogRead(Y)); Serial.print(" "); Serial.println(); } |
W monitorze szeregowym otrzymamy wartości w zakresie od 0 do 1023 z osi X oraz Y.
Sprawdzenie aktualnego stanu przycisków
Aby sprawdzić stan przycisku musimy najpierw skonfigurować Arduino tak aby rozpoznać przyciski.
1 2 3 4 5 |
const byte PIN_BUTTON_SELECT = 2; const byte PIN_BUTTON_RIGHT = 3; const byte PIN_BUTTON_UP = 4; const byte PIN_BUTTON_DOWN = 5; const byte PIN_BUTTON_LEFT = 6; |
Aby sprawdzić czy przycisk został naciśnięty skorzystamy z funkcji If, Else.
Mamy możliwość odczytu wartości przycisku także przy pomocy funkcji digitalRead()
Przycisk jest wciśnięty gdy na danym pinie jest stan Niski (LOW) gdy jest stan wysoki (HIGH) oznacza to że przycisk nie jest wciśnięty
1 2 3 4 5 |
if (digitalRead(PIN_BUTTON_LEFT) == LOW) { // Przycisk jest wciśnięty } else { // Przycisk nie jest wciśnięty } |
Poniżej kod zwracający wartość wszystkich przycisków, które są dostępne w module.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
const byte PIN_BUTTON_SELECT = 2; const byte PIN_BUTTON_RIGHT = 3; const byte PIN_BUTTON_UP = 4; const byte PIN_BUTTON_DOWN = 5; const byte PIN_BUTTON_LEFT = 6; void setup() { Serial.begin(9600); pinMode(PIN_BUTTON_RIGHT, INPUT); digitalWrite(PIN_BUTTON_RIGHT, HIGH); pinMode(PIN_BUTTON_LEFT, INPUT); digitalWrite(PIN_BUTTON_LEFT, HIGH); pinMode(PIN_BUTTON_UP, INPUT); digitalWrite(PIN_BUTTON_UP, HIGH); pinMode(PIN_BUTTON_DOWN, INPUT); digitalWrite(PIN_BUTTON_DOWN, HIGH); pinMode(PIN_BUTTON_SELECT, INPUT); digitalWrite(PIN_BUTTON_SELECT, HIGH); } void loop() { Serial.print("l:"); Serial.print(digitalRead(PIN_BUTTON_LEFT)); Serial.print(" "); Serial.print("r:"); Serial.print(digitalRead(PIN_BUTTON_RIGHT)); Serial.print(" "); Serial.print("u:"); Serial.print(digitalRead(PIN_BUTTON_UP)); Serial.print(" "); Serial.print("d:"); Serial.print(digitalRead(PIN_BUTTON_DOWN)); Serial.print(" "); Serial.print("s:"); Serial.print(digitalRead(PIN_BUTTON_SELECT)); Serial.print(" "); Serial.println(); } |
Pełny kod
Teraz przedstawię Ci połączenie funkcji sprawdzania stanu przycisków oraz odczytu danych z joysticka. Program jest bardzo oczywisty (o ile czytałeś poprzednie części kursu)
Kod wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#define X A0 #define Y A1 int joystick[6]; int upbut = 2; int rightbut = 3; int downbut = 4; int leftbut = 5; void setup() { Serial.begin(9600); pinMode(upbut,INPUT); digitalWrite(upbut,LOW); pinMode(rightbut,INPUT); digitalWrite(upbut,LOW); pinMode(downbut,INPUT); digitalWrite(downbut,LOW); pinMode(leftbut,INPUT); digitalWrite(leftbut,LOW); } void loop() { joystick[0] = analogRead(X); joystick[1] = analogRead(Y); joystick[2] = digitalRead(upbut); joystick[3] = digitalRead(rightbut); joystick[4] = digitalRead(downbut); joystick[5] = digitalRead(leftbut); Serial.print("X = "); Serial.print(analogRead(X)); Serial.print(" Y = "); Serial.print(analogRead(Y)); Serial.print(" Up = "); Serial.print(digitalRead(upbut)); Serial.print(" Right = "); Serial.print(digitalRead(rightbut)); Serial.print(" Down = "); Serial.print(digitalRead(downbut)); Serial.print(" Left = "); Serial.println(digitalRead(leftbut)); } |
W monitorze szeregowym będą wyświetlane informację dotyczące wszystkich wartości w tym module(przycisków oraz joysticka)
Aktualny kierunek joysticka
Bardzo ciekawą funkcją jest odczytanie aktualnego kierunku joysticka.
Joystick może być wyśrodkowany lub położony w jednym z ośmiu kierunków (do góry, w prawo i w górę, w prawo, w prawo i w dół, w dół, w lewo, w dół i w lewo, lewo do góry)
Zakres joysticka to 0-1023 w takim razie wyśrodkowanie będzie mniej więcej przybierało wartość 511-512. Wartość może być odrobinę niedokładna. Z tego powodu musimy określić swoisty próg wartości. ja zastosuję 505-515.
1 2 |
const int X_THRESHOLD_LOW = 505; const int X_THRESHOLD_HIGH = 515; |
Następnie musimy zmapować naszą wartość w każdym wymiarze.
Rozpoczynamy to ustawiając kierunek w każdym wymiarze na 0 (na środku). Następnie używamy if/else w celu sprawdzenia czy wartość pozycji w każdym wymiarze jest powyżej czy poniżej wartości progowych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
x_direction = 0; y_direction = 0; x_position = analogRead(PIN_ANALOG_X); y_position = analogRead(PIN_ANALOG_Y); if (x_position > X_THRESHOLD_HIGH) { x_direction = 1; } else if (x_position < X_THRESHOLD_LOW) { x_direction = -1; } if (y_position > Y_THRESHOLD_HIGH) { y_direction = 1; } else if (y_position < Y_THRESHOLD_LOW) { y_direction = -1; } |
Tutaj używamy if else do wypisania kierunku w monitorze szeregowym.
Kod jest bardzo prosty dlatego nie będę zagłębiał się w jego tłumaczenie.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
const byte PIN_ANALOG_X = 0; const byte PIN_ANALOG_Y = 1; const int X_THRESHOLD_LOW = 505; const int X_THRESHOLD_HIGH = 515; const int Y_THRESHOLD_LOW = 505; const int Y_THRESHOLD_HIGH = 515; int x_position; int y_position; int x_direction; int y_direction; void setup() { Serial.begin(9600); } void loop () { x_direction = 0; y_direction = 0; x_position = analogRead(PIN_ANALOG_X); y_position = analogRead(PIN_ANALOG_Y); if (x_position > X_THRESHOLD_HIGH) { x_direction = 1; } else if (x_position < X_THRESHOLD_LOW) { x_direction = -1; } if (y_position > Y_THRESHOLD_HIGH) { y_direction = 1; } else if (y_position < Y_THRESHOLD_LOW) { y_direction = -1; } if (x_direction == -1) { if (y_direction == -1) { Serial.println("lewo i dol"); } else if (y_direction == 0) { Serial.println("lewo"); } else { Serial.println("lewo gora"); } } else if (x_direction == 0) { if (y_direction == -1) { Serial.println("dol"); } else if (y_direction == 0) { Serial.println("srodek"); } else { Serial.println("gora"); } } else { if (y_direction == -1) { Serial.println("prawo dol"); } else if (y_direction == 0) { Serial.println("prawo"); } else { Serial.println("prawo gora"); } } |
W następnym artykule zajmiemy się połączeniem modułu nRF24l01 wraz z modułem. Czyli stworzymy Joystick, który później będziemy mogli zastosować w wielu projektach 🙂
Poradnik powstaje dzięki współpracy ze sklepem internetowym XBot.pl – roboty to lubią
[su_button url=”https://roboblog.eu/2016/03/12/nrf24l01/” size=”7″]Poprzednia część kursu[/su_button]
Jako przykład podałem kody, które dostajemy od producenta.