Všestrannost Arduina mě nepřestává překvapovat. Poslední příčina překvapení je možnost použít modely Arduino Leonardo a Micro jako HID (human interface device). Prostě jako polohovací zařízení k počítači.
1. Představení
Arduino je jednodeskový počítač založený na mikrokontrolerech ATmega. Základní představeni modelu Leonardo / Micro.
Pro své účely jsem zvolil klon Arduino Pro Micro s cenou kolem 100 ,- Kč za kus.
Arduino se dodává se dvěmi DuPont lištami, které je nutné připájet k desce. Kratší konektory jsem prostrčil z vrchu desky a mikropájkou zapájel.Tím máme hardware připraven a můžeme přejít k softwaru.
2. Arduino Joystick Library
Jedná se o Arduino knihovnu, která přidá jeden nebo více joysticků do seznamu HID zařízení počítače. Autorem je Matthew Heironimus a knihovnu naleznete na autorově GitHubu ve verzi 2.0.5. Vyžaduje minimálně Arduino IDE 1.6.6.
Instalaci můžete provést ručně stažením z GitHubu nebo instalací z Arduino IDE.
3. Instalace Joystick Library
V Arduino IDE zvolíme z horního menu: Projekt -> Přidat knihovnu -> Spravovat knihovny
V Manažeru knihoven zadáme do filtru vyhledávání Joystick a nalistujeme Joystick Library. Vybereme a vybereme tlačítko Instalace.
Knihovna má několik jednoduchých příkladů, na kterých si vyzkoušíte jednotlivé funkce.
4. Ovladač pro Arcade machine
Mým cílem bylo vytvořit ovladače joysticku a 10 tlačítek pro projekt Arcade machine.
Sketch ArcadeFirstJoystick.ino je upravený příklad z knihovny GamepadExample.ino, kde jsem dodefinoval k joysticku ještě 10 tlačítek.
// Simple joystick with 10 buttons (8 + 2 for player mode and selection) for arcade machine - RetrOrangePi. // // Version: 0.02 // 0.02 - defined for specific connection with 8 buttons // 0.01 - basic tests with joystick // // The digital pins 2 - 10 and 14 - 16 are grounded when they are pressed. // Pin 2 = RIGHT // Pin 3 = LEFT // Pin 4 = DOWN // Pin 5 = UP // Pin 6 = button 1 // Pin 7 = button 2 // Pin 8 = button 3 // Pin 9 = button 4 // Pin 10 = button 5 // Pin 14 = button 6 // Pin 15 = button 7 // Pin 16 = button 8 // Pin A0 = select button // Pin A1 = player button // // NOTE: This sketch file is for use with Arduino Leonardo and // Arduino Micro only. // //-------------------------------------------------------------------- #include <Joystick.h> Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 10, 0, // Button Count, Hat Switch Count true, true, false, // X and Y, but no Z Axis false, false, false, // No Rx, Ry, or Rz false, false, // No rudder or throttle false, false, false); // No accelerator, brake, or steering const int joystickButtonCount = 4; const int firstButtonLineCount = 9;//2 - 10 const int secondButtonLineCount = 3;//14 - 16 const int thirdButtonLineCount = 2;//A0 - A1 const int totalButtonCount = firstButtonLineCount + secondButtonLineCount + thirdButtonLineCount; #define DEBUG 1 void setup() { #ifdef DEBUG Serial.begin(115200); #endif //DEBUG // Initialize Button Pins pinMode(2, INPUT_PULLUP);//right pinMode(3, INPUT_PULLUP);//left pinMode(4, INPUT_PULLUP);//down pinMode(5, INPUT_PULLUP);//up pinMode(6, INPUT_PULLUP);//button 1 pinMode(7, INPUT_PULLUP);//button 2 pinMode(8, INPUT_PULLUP);//button 3 pinMode(9, INPUT_PULLUP);//button 4 pinMode(10, INPUT_PULLUP);//button 5 pinMode(14, INPUT_PULLUP);//button 6 pinMode(15, INPUT_PULLUP);//button 7 pinMode(16, INPUT_PULLUP);//button 8 pinMode(A0, INPUT_PULLUP);//select button pinMode(A1, INPUT_PULLUP);//player button // Initialize Joystick Library Joystick.begin(); Joystick.setXAxisRange(-1, 1); Joystick.setYAxisRange(-1, 1); } // Last state of the buttons int lastButtonState[totalButtonCount] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void loop() { // Read pin values from first button line 2 - 10 for (int index = 0; index < firstButtonLineCount; index++) { int currentButtonState = !digitalRead(index + 2);//first pin is 2 #ifdef DEBUG //Serial.print("Testing pin:"); //Serial.println(index + 2); #endif //DEBUG if (currentButtonState != lastButtonState[index]) { #ifdef DEBUG Serial.println("State changed for:"); Serial.println(index + 2); #endif //DEBUG switch (index) { case 3: // UP if (currentButtonState == 1) { Joystick.setYAxis(-1); } else { Joystick.setYAxis(0); } break; case 0: // RIGHT if (currentButtonState == 1) { Joystick.setXAxis(1); } else { Joystick.setXAxis(0); } break; case 2: // DOWN if (currentButtonState == 1) { Joystick.setYAxis(1); } else { Joystick.setYAxis(0); } break; case 1: // LEFT if (currentButtonState == 1) { Joystick.setXAxis(-1); } else { Joystick.setXAxis(0); } break; case 4: // FIRE default: Joystick.setButton(index - 4, currentButtonState); break; } lastButtonState[index] = currentButtonState; } } // Read pin values from second button line 14-16 for (int index = 0; index < secondButtonLineCount; index++) { int currentButtonState = !digitalRead(index + 14);//first pin is 14 #ifdef DEBUG //Serial.print("Testing pin:"); //Serial.println(index + 14); #endif //DEBUG if (currentButtonState != lastButtonState[index + firstButtonLineCount])//continue in first button line { #ifdef DEBUG Serial.println("State changed for:"); Serial.println(index + 14); #endif //DEBUG switch (index) { default: Joystick.setButton(index + firstButtonLineCount - joystickButtonCount, currentButtonState);//continue as button 6 break; } lastButtonState[index + firstButtonLineCount] = currentButtonState; } } // Read pin values from third button line A0-A1 as D18-D19 for (int index = 0; index < thirdButtonLineCount; index++) { int currentButtonState = !digitalRead(index + 18);//first pin is 18 #ifdef DEBUG //Serial.print("Testing pin:"); //Serial.println(index + 18); #endif //DEBUG if (currentButtonState != lastButtonState[index + firstButtonLineCount + secondButtonLineCount])//continue in first and second button line { #ifdef DEBUG Serial.println("State changed for:"); Serial.println(index + 18); #endif //DEBUG switch (index) { default: Joystick.setButton(index + firstButtonLineCount + secondButtonLineCount - joystickButtonCount, currentButtonState);//continue as button 6 break; } lastButtonState[index + firstButtonLineCount + secondButtonLineCount] = currentButtonState; } } delay(10); }
Program přeložíme a nahrajeme do Arduina. Po nahrání nám počítač začne vyhledávat ovladač pro nové zařízení.
5. Test ovladače
Ovladač si můžeme ve Windows vyzkoušet pomocí GameControlleru (Joy.cpl). K Arduino Micro připojíme jednotlivá tlačítka a joystick (Pin 2, 3, 4, 5).
Přez Start tlačítko dáme vyhledat Joy.cpl.
Po nastartování GameControlleru bychom měli vidět jméno našeho nového HIDu.
Poklepáním na položku v seznamu se nám otevře záložka, kde si budeme moci ověřit funkčnost. Kříž by měl skákat podle pohybu joysticku a tlačítka by se měla rozsvěcet podle stisku.
Pokud něco nefunguje, zkontrolujeme zapojení popřípadě debugujeme kód.