/* * Skrolli 2016.4 - skrolli.fi/numerot * * Atari-joystickin USB-adapteri Skrolli-lehteen * tekijä Jarno Lehtinen */ #include "Joystick.h" // Määritellään, mihin Arduinon IO-pinneihin 9-napainen // D-liitin on kytketty #define UP 2 // D-liittimen pin 1 (ylös) #define DOWN 3 // D-liittimen pin 2 (alas) #define LEFT 4 // D-liittimen pin 3 (vasemmalle) #define RIGHT 5 // D-liittimen pin 4 (oikealle) #define BUTTON 6 // D-liittimen pin 6 (tulitusnappi) // Lisäksi pitää kytkeä D-liittimen pin 8 (maa) Arduinon // GND:hen. // Pidetään kirjaa edellisestä joystickin tilasta, jotta // voimme tarkastaa, onko uusi tila erilainen. Koska // käytämme Arduinon sisäisiä ylösvetovastuksia, auki // oleva kytkin antaa arvon 1, ja suljettu kytkin vetää // signaalin maahan antaen arvoksi 0 (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() { // Määritetään käytettävät pinnit sisääntuloiksi ja // aktivoidaan ylösvetovastukset. pinMode(UP, INPUT_PULLUP); pinMode(DOWN, INPUT_PULLUP); pinMode(LEFT, INPUT_PULLUP); pinMode(RIGHT, INPUT_PULLUP); pinMode(BUTTON, INPUT_PULLUP); // Aktivoidaan USB-joystick. Joystick.begin(false); } // Apumuuttuja, joka toimii lippuna sille, onko tila // muuttunut. byte flag = 0; void loop() { // Lue joystickin tämänhetkinen tila newUP = digitalRead(UP); newDOWN = digitalRead(DOWN); newLEFT = digitalRead(LEFT); newRIGHT = digitalRead(RIGHT); newBUTTON = digitalRead(BUTTON); // Tarkistetaan, onko uusi tila sama kuin edellinen // tila. Näin meidän ei tarvitse lähettää USB:llä // tietoa joystickin tilasta kuin silloin, kun // joystickin tila on muuttunut. 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; } // Jos lippu on ylhäällä, tila on muuttunut ja se pitää // käsitellä if (flag) { // Kun rakennamme uutta tilaa, otamme lähtökohdaksi // nollatilan Joystick.setYAxis(0); Joystick.setXAxis(0); Joystick.setButton(0, 0); // Rakennetaan uusi tila luettujen uusien arvojen // perusteella. if-lauseissa tarvitsemme huutomerkkiä // ehdon kääntämiseen päinvastaiseksi, koska 0 = on, // 1 = off. if (!newUP) { Joystick.setYAxis(-127); // ylös } if (!newDOWN) { Joystick.setYAxis(127); // alas } if (!newLEFT) { Joystick.setXAxis(-127); // vasemmalle } if (!newRIGHT) { Joystick.setXAxis(127); // oikealle } if (!newBUTTON) { Joystick.setButton(0, 1); // tulitusnappi } // Kaikki valmista varsinaisen tilan lähettämiseen // USB:llä. Ennen tätä hetkeä ei USB:llä ole // siirtynyt vielä mitään. Joystick.sendState(); // Lippu pitää muistaa nollata, kun uusi tila on // käsitelty. flag = 0; } // Pidetään yhden millisekunnin hengähdystauko. delayMicroseconds(1000); }