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.

Arduino Gamepad Shield

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.

Schéma zapojení Arduino Gamepad Shieldu

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

FB tw

Další podobné články