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