/* * Simple Atari joystick adapter (joystick HID) for learning purposes * McGurk 6.9.2016 */ #include "Joystick2.h" // Here we define Arduino pins we use. Along with these we have to connect joystick ground to Arduino GND. // Because of Arduino internal pullup resistor off state is 1. Moving joystick switches corresponding pin to ground and then it is 0. #define UP 2 // 9-pin D-connector pin 1 #define DOWN 3 // 9-pin D-connector pin 2 #define LEFT 4 // 9-pin D-connector pin 3 #define RIGHT 5 // 9-pin D-connector pin 4 #define BUTTON 6 // 9-pin D-connector pin 6 // 9-pin D-connector pin 8 to GND // We keep record how everything was last time, so we can compare if anything have changed. (1 = off, 0 = on) byte lastUP = 1; byte lastDOWN = 1; byte lastLEFT = 1; byte lastRIGHT = 1; byte lastBUTTON = 1; byte newUP = 1; byte newDOWN = 1; byte newLEFT = 1; byte newRIGHT = 1; byte newBUTTON = 1; void setup() { pinMode(UP, INPUT_PULLUP); pinMode(DOWN, INPUT_PULLUP); pinMode(LEFT, INPUT_PULLUP); pinMode(RIGHT, INPUT_PULLUP); pinMode(BUTTON, INPUT_PULLUP); Joystick[0].begin(false); } // We use this flag to indicate if anything changes. byte flag = 0; void loop() { // Read joystick state (1 = off, 0 = on). newUP = digitalRead(UP); newDOWN = digitalRead(DOWN); newLEFT = digitalRead(LEFT); newRIGHT = digitalRead(RIGHT); newBUTTON = digitalRead(BUTTON); // Check if anything changed. This way we don't have to send anything to USB if nothing happened after last time. if (newUP != lastUP) { lastUP = newUP; flag = 1; } if (newDOWN != lastDOWN) { lastDOWN = newDOWN; flag = 1; } if (newLEFT != lastLEFT) { lastLEFT = newLEFT; flag = 1; } if (newRIGHT != lastRIGHT) { lastRIGHT = newRIGHT; flag = 1; } if (newBUTTON != lastBUTTON) { lastBUTTON = newBUTTON; flag = 1; } // If anythings changed, build and send new state. if (flag) { // Clear directions and buttons before start building new state. Joystick[0].setYAxis(0); Joystick[0].setXAxis(0); Joystick[0].setButton(0, 0); // Build new state according what we read earlier. // We need exclamation mark in these if-conditions, because swithes are active low (0 = on, 1 = off). if (!newUP) { Joystick[0].setYAxis(-127); //UP } if (!newDOWN) { Joystick[0].setYAxis(127); //DOWN } if (!newLEFT) { Joystick[0].setXAxis(-127); //LEFT } if (!newRIGHT) { Joystick[0].setXAxis(127); //RIGHT } if (!newBUTTON) { Joystick[0].setButton(0, 1); //BUTTON } // Everything is ready. Send state. Before this point, we haven't send any joystick directions to USB. Joystick[0].sendState(); // Remember to clear flag. flag = 0; } // Little 1ms breathing break. delayMicroseconds(1000); }