ArduinoProgetti elettronica

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:

      

 

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.

MST-Admin

Appassionato di elettronica, elettrotecnica generale e programmazione. Fondatore del progetto MST-tutorial, desideroso di condividere con voi l'entusiasmo per l'innovazione tecnologica e la sperimentazione di novità tecniche in questi campi.

Articoli Correlati

Pulsante per tornare all'inizio