Arduino Leonardo: realizziamo un gamepad
Sfruttiamo le librerie arduino per generare un controller basato su Atmega32u8
Con il seguente tutorial si vuole costruire un gamepad da gioco economico dotato di pulsantiera e di Joystick. Il sistema presentato è modificabile ed espandibile a seconda delle vostre esigenze e viene riconosciuto senza problemi dai sistemi operativi Microsoft Windows 10 (previo installazione driver Arduino), macOS e sistemi GNU/Linux.
Per il progetto è stato scelto di utilizzare un joystick analogico (stile Playstation) ma è gestito a livello software come un joystick a contatti (stile vecchi cabinati). Di seguito è riportato il materiale necessario alla realizzazione del gamepad:
- Arduino Leonardo https://amzn.to/2XCJBEF (o compatibile https://amzn.to/2Tgm5Pg)
- 10 Pulsanti da gamepad https://amzn.to/2C5g7WS (numero di pulsanti variabile dalle proprie esigenze)
- Joystick analogico https://amzn.to/2Tq7zVu
Descrizione:
I pulsanti, normalmente aperti, se premuti porteranno uno stato logico LOW al microcontrollore. Tale stato, per esser correttamente letto, necessita dell’attivazione software delle resistenze di pull-up. Queste ultime possono essere inserite anche fisicamente nel progetto, ma in tal caso sarà d’obbligo non attivare quelle interne del microcontrollore. Quando il microcontrollore riceverà l’informazione LOW da un pulsante, invierà l’informazione sulla seriale usb. Il joystick, invece, funziona semplicemente con soglie analogiche di attivazione: su/giù e destra/sinistra sono gestiti con parametri da 0 a 300 e da 700 a 1024. La zona considerata centrale è compresa tra 300 e 700.
Schema elettrico (download):
Sketch (download):
#include <joystick.h> //impostare il pin dove sono collegati i pulsanti int pulsante1=0; int pulsante2=1; int pulsante3=2; int pulsante4=3; int pulsante5=4; int pulsante6=5; int pulsante7=6; int pulsante8=7; int pulsante9=8; int pulsante10=9; 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 void setup() { //dichiaro input ed imposto resistenza interna di pull-up pinMode(pulsante1, INPUT_PULLUP); pinMode(pulsante2, INPUT_PULLUP); pinMode(pulsante3, INPUT_PULLUP); pinMode(pulsante4, INPUT_PULLUP); pinMode(pulsante5, INPUT_PULLUP); pinMode(pulsante6, INPUT_PULLUP); pinMode(pulsante7, INPUT_PULLUP); pinMode(pulsante8, INPUT_PULLUP); pinMode(pulsante9, INPUT_PULLUP); pinMode(pulsante10, INPUT_PULLUP); Joystick.begin(); Joystick.setXAxisRange(-1, 1); Joystick.setYAxisRange(-1, 1); } void loop() { //imposto soglia sensibilità nel caso in cui il joystick sia analogico anzichè a contatto //la soglia di attivazione è: 0-300 700-1024 mentre 300-700 rappresenza la posizione centrale if (analogRead(A1) < 300) { Joystick.setXAxis(1); } if (analogRead(A1) > 700) { Joystick.setXAxis(-1); } if ((analogRead(A1) > 300) && (analogRead(A1) < 700)) { Joystick.setXAxis(0); } if (analogRead(A0) < 300) { Joystick.setYAxis(1); } if (analogRead(A0) > 700) { Joystick.setYAxis(-1); } if ((analogRead(A0) > 300) && (analogRead(A0) < 700)) { Joystick.setYAxis(0); } //se premuti, i pulsanti mandano a LOW gli ingressi i quali restituiscono stato logico HIGH sul comando gamepad if(digitalRead(pulsante1) == LOW){Joystick.setButton(0, HIGH);}else{Joystick.setButton(0, LOW);} if(digitalRead(pulsante2) == LOW){Joystick.setButton(1, HIGH);}else{Joystick.setButton(1, LOW);} if(digitalRead(pulsante3) == LOW){Joystick.setButton(2, HIGH);}else{Joystick.setButton(2, LOW);} if(digitalRead(pulsante4) == LOW){Joystick.setButton(3, HIGH);}else{Joystick.setButton(3, LOW);} if(digitalRead(pulsante5) == LOW){Joystick.setButton(4, HIGH);}else{Joystick.setButton(4, LOW);} if(digitalRead(pulsante6) == LOW){Joystick.setButton(5, HIGH);}else{Joystick.setButton(5, LOW);} if(digitalRead(pulsante7) == LOW){Joystick.setButton(6, HIGH);}else{Joystick.setButton(6, LOW);} if(digitalRead(pulsante8) == LOW){Joystick.setButton(7, HIGH);}else{Joystick.setButton(7, LOW);} if(digitalRead(pulsante9) == LOW){Joystick.setButton(8, HIGH);}else{Joystick.setButton(8, LOW);} if(digitalRead(pulsante10) == LOW){Joystick.setButton(9, HIGH);}else{Joystick.setButton(9, LOW);} delay(10); }
Realizzato il cablaggio e caricato lo sketch con l’apposito IDE Arduino saremo pronti ad utilizzare il nostro gamepad con i nostri giochi.