Arduino Gamepad Shield

Arduino Gamepad Shield je přídavný modul, s kterým můžeme proměnit Arduino v herní ovladač. Tento shield obsahuje velké množství vstupních prvků, mezi které patří tlačítka, analogový joystick a několik konektorů pro další zařízení. Co se týká zmíněných tlačítek, tak se na shieldu nachází čtyři větší tlačítka s barevnými hmatníky, dvě menší tlačítka a speciální tlačítko, které je aktivované stiskem kloboučku analogového joysticku. Analogový joystick pak funguje na principu změny odporu v osách X a Y. A jak bylo zmíněno, na Gamepad Shieldu se nachází taktéž konektor pro připojení displeje Nokia 5110, komunikačního modulu nRF24LN01 a Bluetooth modulu společně s propojovacími piny. Na modrých propojovacích pinech tak máme přístup ke sběrnici I2C a na žlutých pinech máme vyvedena všechna tlačítka a joystick. Posledním prvkem na modulu je přepínač použitého napětí, kdy můžeme volit mezi 5 a 3,3 V. Toto je důležité v závislosti na použité desce, kdy já pro Arduino UNO používám napětí 5V, ale například pro desku Wemos D1 bychom přepnuli na napětí 3,3 V.

Pro úspěšné propojení Gamepad Shieldu s Arduinem stačí tento shield zapojit do Arduino desky a zvolit správné napájecí napětí podle použité desky.

Ukázkový kód obsahuje ukázku využití všech dostupných tlačítek a joysticku. Na jeho začátku se nachází nastavení čísel všech propojovacích pinů pro tlačítka a osy joysticku. V podprogramu setup nejprve nastavíme rychlost komunikace po sériové lince a následně nastavíme všechny vstupy. V nekonečné smyčce loop si vždy na začátku vytvoříme proměnnou, podle které se bude řídit délka pauzy po každém běhu. Následně provedeme kontrolu stavu digitálního vstupu pro každé tlačítko. V případě detekce stisku jakéhokoliv z tlačítek pak vypíšeme příslušnou zprávu a zároveň nastavíme proměnnou pro změnu délky pauzy. Po kontrole všech tlačítek načteme stav analogových vstupů do příslušných proměnných a poté provedeme jejich přemapování na jiný rozsah. Pro dosažení středu na souřadnicích [0, 0] byl zvolen takový postup, že celý rozsah analogového vstupu nejprve zmenšíme na rozsah 0 až 51 a poté odečteme polovinu. Tím získáme střed v nule a maxima -25 a +25. Po přepočtení souřadnic tyto informace vypíšeme na sériovou linku a na konci programu zkontrolujeme délku pauzy před novým během smyčky. Pokud bylo stisknuto alespoň jedno tlačítko, zahájíme pauzu o délce 200 milisekund pro eliminaci zákmitů tlačítek, v opačném případě pak pauza trvá pouze 100 milisekund.

// Gamepad Shield

// nastavení čísel propojovacích pinů
#define tlacitkoA 2
#define tlacitkoB 3
#define tlacitkoC 4
#define tlacitkoD 5
#define tlacitkoE 6
#define tlacitkoF 7
#define tlacitkoK 8
#define joystickX A0
#define joystickY A1

void setup() {
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
  // inicializace všech vstupů
  pinMode(tlacitkoA, INPUT);
  pinMode(tlacitkoB, INPUT);
  pinMode(tlacitkoC, INPUT);
  pinMode(tlacitkoD, INPUT);
  pinMode(tlacitkoE, INPUT);
  pinMode(tlacitkoF, INPUT);
  pinMode(tlacitkoK, INPUT);
  pinMode(joystickX, INPUT);
  pinMode(joystickY, INPUT);
}

void loop() {
  // proměnná, podle které se řídí délka pauzy
  int stiskPauza = 0;
  // kontrola pro každé tlačítko, kdy při
  // jeho stisknutí vypíšeme hlášku
  // a nastavíme pauzu
  if (!digitalRead(tlacitkoA)) {
    Serial.println("Stisknuto tlacitko A.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoB)) {
    Serial.println("Stisknuto tlacitko B.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoC)) {
    Serial.println("Stisknuto tlacitko C.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoD)) {
    Serial.println("Stisknuto tlacitko D.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoE)) {
    Serial.println("Stisknuto tlacitko E.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoF)) {
    Serial.println("Stisknuto tlacitko F.");
    stiskPauza = 1;
  }
  if (!digitalRead(tlacitkoK)) {
    Serial.println("Stisknuto tlacitko K.");
    stiskPauza = 1;
  }
  // načtení stavu analogových pinů do proměnných
  int osaX = analogRead(joystickX);
  int osaY = analogRead(joystickY);
  // přepočet z celého rozsahu na rozsah -25 až 25,
  // pro větší rozsah nulové pozice je zvolen
  // přepočet na lichý počet čísel a odečtení poloviny
  int souradniceX = map(osaX, 0, 1024, 0, 51) - 25;
  int souradniceY = map(osaY, 0, 1024, 0, 51) - 25;
  // vytištění informací o přepočtené souřadnici joysticku
  Serial.print("X: ");
  Serial.print(souradniceX);
  Serial.print(" | Y: ");
  Serial.print(souradniceY);
  Serial.println();
  // pokud bylo stisknuto alespoň jedno tlačítko,
  // nastav delší pauzu, v opačném případě jen 100 ms
  if (stiskPauza) {
    delay(200);
  } else {
    delay(100);
  }
}

Po nahrání programu do Arduino desky s připojeným Gamepad Shieldem dostaneme například tento výsledek:

X: 0 | Y: 0
X: 0 | Y: 0
Stisknuto tlacitko B.
X: 0 | Y: 0
Stisknuto tlacitko B.
Stisknuto tlacitko C.
X: -12 | Y: 25
Stisknuto tlacitko A.
Stisknuto tlacitko D.
X: 21 | Y: 25
Stisknuto tlacitko A.
Stisknuto tlacitko D.
X: 25 | Y: -3

Arduino Gamepad Shield je pěkný vstupní modul, který nám umožňuje vytvořit z Arduino desky ovladač pro různé aplikace. Například můžeme vytvořit bezdrátový herní ovladač s využitím konektoru na modul nRF24L01 nebo si připojit displej Nokia 5110 a nahrát přímo do Arduina nějakou hru. Ale samozřejmě můžeme využít všechny prvky na shieldu nejen na hry, ale také třeba jako ovladač v menu zařízení či kontrolér pro robota. Velkou výhodou je pak také přítomný přepínač mezi napětími 3,3 a 5 Voltů, díky čemuž můžeme Gamepad Shield připojit na velké množství Arduino desek.

 

Seznam použitých komponent:

http://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html

http://dratek.cz/arduino/920-arduino-gamepad-shield-1421009449.html

Další podobné články