Costruire un gamepad per Steam con Arduino

arduino game controller

Oggi riprendiamo in mano il nostro Arduino per un piccolo progetto con diversi aspetti interessanti. Costruiremo un gamepad da utilizzare su Steam, la nota piattaforma videoludica di Valve! Come facilmente intuibile è più un articolo dimostrativo che una vera applicazione utilizzabile ma niente vi vieta di estendere quanto vi mostrerò per realizzare un vero e proprio controller con tutte le funzionalità del caso.
Questo articolo nasce come un primo passo verso la realizzazione di un volante bluetooth controllabile sfruttando il giroscopio di un dispositivo Android. Vi terrò aggiornati nelle prossime settimane.
Quanto segue si riferisce ad un sistema Windows ma, con i dovuti accorgimenti, dovrebbe essere compatibile anche su Linux.
DISCLAIMER: l'articolo prevede di flashare il chip di comunicazione di Arduino per renderlo riconoscibile come un gamepad USB. La procedura è sicura e reversibile ma non ci assumiamo in nessun caso alcuna responsabilità in caso di problemi o malfunzionamenti.

UnoJoy - trasformare Arduino in un controller USB

Come prima cosa scaricate l'ultima versione di UnoJoy, una libreria che grazie ad un apposito firmware trasformerà Arduino in un dispositivo rilevabile come un joystick USB. Per utilizzare UnoJoy occorre come prima cosa installare gli appositi driver eseguendo il file InstallUnoJoyDrivers.bat che trovate nella cartella appena scaricata.
Installate anche l'Atmel FLIP tool che servirà ad UnoJoy per poter flashare il firmware sul chip di comunicazione di Arduino.
La procedura per flashare il firmware è semplice e reversibile. Con la scheda connessa al computer come prima cosa occorre mettere Arduino in modalità DFU (Device Firmware Update) facendo un contatto tra i due pin più a sinistra del gruppo di sei pin sporgenti che si trovano accanto alla presa USB. Potete vedere i due pin in figura.
Uno-front-DFU-reset
Facendo un contatto tra questi due pin i vari led di Arduino si illumineranno brevemente.
A questo punto eseguite il file di UnoJoy TurnIntoAJoystick.bat e dopo aver disconnesso e riconnesso Arduino a computer, questo verrà rilevato come JoyStick invece che come Arduino.
Per tornare ad avere un Arduino standard la procedura è identica ma il file da eseguire questa volta è TurnIntoAnArduino.bat.
Dato che non sarà più possibile caricare codice su Arduino una volta flashato il firmware di UnoJoy, occorrerà cambiare tra le due modalità ogni volta che vorrete mettere mano al codice e caricare un nuovo sketch sulla scheda.

Un semplice gamepad con Arduino

Adesso vediamo come creare un semplice gamepad con Arduino. Utilizzeremo solamente un potenziometro per illustrare come simulare una manopola analogica ed un push button per simulare la pressione di un pulsante sul pad.
Montiamo potenziometro e bottone, assicurandoci di utilizzare una resistenza da 10K ohm per collegare il bottone.
In figura è riportato lo schema completo dove abbiamo collegato il potenziometro al Digital pin 3 ed il bottone al 2.
gamepad_arduino_bb

Per quanto riguarda il codice dobbiamo utilizzare la libreria UnoJoy quindi occorre copiare il file UnoJoy.h nella cartella dove andrete a salvare lo sketch.
Lo sketch è piuttosto semplice: dopo aver inizializzato i pin durante il setup vengono letti continuamente i dati da potenziometro e push button e vengono mappati rispettivamente sull'asse x dell'analogico sinistro e sul pulsante X del controller (UnoJoy simula una controller PS3).


#include "UnoJoy.h"

void setup(){
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  setupUnoJoy();
}

void loop(){
  // Leggiamo i comandi
  dataForController_t controllerData = getControllerData();

  //Inviamo i comandi al controller
  setControllerData(controllerData);
}

dataForController_t getControllerData(void){
  // Inizializziamo i dati del controller con input nulli
  dataForController_t controllerData = getBlankDataForController();
  
  // Mappiamo i dati dal potenziometro sull'asse X dell'analogico sinistro.
  // Dal momomento che analogRead(pin) ritorna un valore a 10 bit occorre
  // effettuare uno shift per tralasciare i 2 bit meno significativi. 
  controllerData.leftStickX = analogRead(A2) >> 2;

  // Mappiamo i dati del pulsante sul pulsante X
  // Il valore deve essere negato perché il pulsante è attivo quando il segnale è basso
  controllerData.crossOn = !digitalRead(2);

  return controllerData;
}

Utilizziamo il controller su Steam

Per poter utilizzare il controller su Steam occorre un ulteriore passaggio. La maggior parte dei giochi su Steam riconosce come gamepad solamente quello di XBOX360, dobbiamo quindi ingannarlo in modo da fargli credere che il nostro Arduino sia proprio quel gamepad. Fortunatamente esiste un pratico programma capace di mappare un qualunque controller USB su un gamepad per XBOX360 virtuale: x360ce.
Scaricate la versione a 64bit o a 32bit a seconda del gioco che volete giocare.
Una volta estratto, copiate il file x360ce.exe nella cartella contenente l'eseguibile del gioco (tipicamente su Steam sarà qualcosa del tipo C:\Program Files (x86)\Steam\steamapps\common\NOMEGIOCO\ ma potrebbe anche essere una sottocartella). Fate partire x360ce.exe che avete appena copiato e questo riconoscerà la presenza di un JoyStick USB. Quando ve lo chiederà fategli cercare una configurazione online e aggiustate i tasti in modo opportuno aiutandovi con l'immagine del gamepad. Se premete il pulsante o girate il potenziometro il corrispettivo tasto sul gamepad si illuminerà di verde come mostrato in figura.

gamepad

Se avete problemi a capire quali bottoni x360ce sta effettivamente ricevendo potete controllare nella tab a destra chiamata "UnoJoy Joystick" che vi mostrerà quali valori sta leggendo.

Salvate il tutto e avviate il gioco, siete pronti ad usare il vostro nuovo e comodissimo gamepad! Se decidete di provarlo fateci sapere l'esito e mandateci foto o video della vostra creazione.

BONUS: vi lascio con una piccola anticipazione. Questo è il primo video del controller che sto cercando di realizzare sfruttando i sensori di un tablet Android, utilizzandolo come se fosse un volante Bluetooth per giocare a Rocket League. Ovviamente c'è ancora molto da lavorare, purtroppo UnoJoy e Bluetooth sembrano non gradirsi a vicenda. La macchina dovrebbe avanzare quando inclino il tablet in avanti.

Federico Becattini

Dottorando in computer vision. Appassionato di informatica e elettronica fai da te, specialmente se per applicazioni futili. Tormenta i suoi amici e colleghi con idee geniali spesso non riconosciute come tali.

Costruire un gamepad per Steam con Arduino ultima modifica: 2016-06-07T12:30:29+00:00 da Federico Becattini


Advertisment ad adsense adlogger