// QuickShot Joystick to Keyboard Converter // For the Arduino Leonardo // For more information and the previous version, see: // http://www.idogendel.com/en/archives/290 // by Ido Gendel, 2015. Share and enjoy! // 5 inputs: Up, Down, Left, Right and Fire #define INPUTS 5 // Comment the next line to disable autofire #define RAPID_FIRE_ON // Number of milliseconds between auto-fire events #define RAPID_FIRE_SPACING 100 struct tJSInput { byte pin; boolean state; boolean isButton; byte key; unsigned long lastSendTime; } JSInput[INPUTS] = {{8, 0, false, 232, 0}, {9, 0, false, 226, 0}, {10, 0, false, 228, 0}, {11, 0, false, 230, 0}, {12, 0, true, 229, 0}}; void setup() { pinMode(13, OUTPUT); for (int j = 0; j < INPUTS; j++) { pinMode(JSInput[j].pin, INPUT_PULLUP); JSInput[j].state = digitalRead(JSInput[j].pin); } // for // Time for re-programming in case of trouble delay(4000); digitalWrite(13, HIGH); // "active" Indication Keyboard.begin(); } // setup void loop() { for (int j = 0; j < INPUTS; j++) { if (digitalRead(JSInput[j].pin) != JSInput[j].state) { JSInput[j].state = !JSInput[j].state; if (JSInput[j].state) Keyboard.release(JSInput[j].key); else { Keyboard.press(JSInput[j].key); JSInput[j].lastSendTime = millis(); } // else } #if defined RAPID_FIRE_ON else // is it a long-pressed button? if (JSInput[j].isButton && (!JSInput[j].state) && (millis() - JSInput[j].lastSendTime > RAPID_FIRE_SPACING)) { // re-press Keyboard.release(JSInput[j].key); JSInput[j].lastSendTime = millis(); Keyboard.press(JSInput[j].key); } // if #endif } // for delay(5); } // loop