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.
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
// 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.
One thought on “Arduino joystick”