Joystick per Arduino: Input Shield

Nell’ultimo ordine di materiale per i tutorial del sito ho anche ordinato un joystick per arduino: la Input Shield

Input Shield joystick

Questa scheda di espansione integra un joystick per arduino e 3 pulsanti, è concepita per essere l’ultima schiedl da inserire nel tuo progetto infatti i connettori sono presenti solo nella parte bassa della shield.

Ti offre la possibilità di saldare un connettore din femmina o dei cavi diretti in corrispondenza delle uscite digitali (visibili in foto) e di collegare gli input analogici A2-A5 a sensori esterni utilizzando il connettore, din maschio, posto sul retro della shield in cui sono presenti altri 2 pin: +5v e Gnd.

Un’altro connettore, questa volta composto da din femmina, posto a ridosso del pulsante bleu che presenta le connesioni Tx ed RX oltre ad un +5v e Gnd.

Lo schema del Joystick

Sul sito della DFROBOT è possibile trovare oltre alla presentazione della shield anche lo schema, in perfetta ottica Arduino e open-source:

Input Shield joystick

Nello schema puoi facilmente intuire i collegamenti in quanto molto semplici, il joystick è composto da 2 potenziometri da 10K ciascuno collegati alla leva del joystick stessa e a loro volta connessi sia ai terminali +5v e Gnd sia ad uno dei pin analogici A0 ed A1.

Il pulsante connesso alla leva del joystick è collegato al pin 5 di arduino mediante una resistenza di pull-up di 10Kohm proveniente dai +5v.

Il pulsante rosso (B) è collegato al pin 3 ed il pulsante Bleu (C) è collegato al pin 4 entrambi mediante la propria resistenza di pull-up da 10Kohm

Funzionamento del Joystick

Ora che conosci come è collegato ad arduino puoi comprendere che la lettura dei valori relativi ai due assi è di tipo analogico ed avviene attraverso i pin A0 ed A1 con il comando analogRead( pin ) e per catturare il segnale proveniente dai pulsanti, sia quello connesso alla leva del joystick, sia i pulsanti B e C dovrai utilizzare il comando digitalRead( pin ).

Spostando il joystick dal punto centrale dell’asse X verso destra il suo valore varia da circa 512 a 0, spostandolo verso sinistra varia da 512 a 1023. Questo è il campo si escursione che hai già incontrato parlando dei potenziometri in generale e dell’ADC ( convertitore analogico digitale ) di arduino a 10bit.

Gli stessi valori li leggi sul pin A1 spostando il joystick verso il basso o verso l’alto.

I pulsanti invece danno sempre valore 1 in quanto la loro connessione attraversa la resistenza da 10Kohm e va al polo +5v di arduino e alla pressione ti restituiscono il valore 0 perché cortocircuitati a massa (gnd).

Lo sketch del joystick

ho realizzato uno schetch molto semplice che ha lo scopo di renderti più chiaro il funzionamento del joystick e dei valori rilevati e non di perdersi in tecnicismi di programmazione complessi, sarai tu poi a destinare questo joystick al tuo progetto adattando lo sketch alle tue esigenze.

Ecco lo sketch:

#define asseX A0
#define asseY A1
#define buttB 3
#define buttC 4
#define buttA 5

void setup() {
  pinMode( asseX,INPUT );
  pinMode( asseY,INPUT );
  pinMode( buttA,INPUT );
  pinMode( buttB,INPUT );
  pinMode( buttC,INPUT );

  Serial.begin( 9600 );
}

void loop() {

  Serial.print( "Asse X: " );
  Serial.print( analogRead( asseX ) );
  Serial.print( " Asse Y: " );
  Serial.print( analogRead( asseY ) );
  Serial.print( " Butt A: " );
  Serial.print( digitalRead( buttA ) );
  Serial.print( " Butt B: " );
  Serial.print( digitalRead( buttB ) );
  Serial.print( " Butt C:" );
  Serial.print( digitalRead( buttC ) );
  Serial.print( "\n" );

  delay( 300 );
}

I comandi utilizzati sono davvero pochi e semplici, le linee 01-05 ti servono a definire i pin attraverso cui la input shield comunica con arduino, come hai visto nel paragrafo dedicato allo schema i pin A0 e A1 sono connessi agli assi X ed Y e i bottoni B,C ed A sono rispettivamente connessi ai pin 3,4 e 5;

linee 08-12: imposti la modalità di comunicazione tra Arduino e i singoli pin della input shield, tale modalità è sempre INPUT in quanto sono tutti segnali che ricevi;

linea 14: imposta una comunicazione seriale in cui vedrai i valori mentre lo sketch è in eseguzione e muovi il joystick o premi i pulsanti;

linee 19-20: scrivi nel monitor seriale i valori letti sui canali analogici analogRaed() e sui canali digitali digitalRead();

linea 21: attendi un tempo di 300 millisecondi tra un ciclo di loop ed il successivo, questo ti permette di vedere a video in modo chiaro i valori letti da arduino.

Ho raccolto alcune schermate relative al funzionamenti dello sketch:

input shield

in questa prima i valori dei pulsanti A,B e C variano da 1 a 0, quando vedi 0 è perché io ho premuto il pulsante corrispondente;

input shield

in questa seconda immagine vedi il valore dell’asse X passare da 0 a circa 500 e poi andar su fino a 1023;

input shield

nell’ultima immagine ho ripreso i valori letti sull’asse Y mentre il joystick era a sinistra e poi a destra.

Questo semplice tutorial sulla input shield ed il jystick per arduino è di esempio e vuole stimolare la tua creatività ad utilizzarlo nei tuoi progetti, sai che se ti occorre aiuto su questa shield puoi commentare questo articolo ed io cercherò di darti le giuste dritte per risolvere il tuo problema.

Buon divertimento !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/joystick-per-arduino-input-shield.html

19 comments

Skip to comment form

    • Federico on 18 gennaio 2013 at 14:05
    • Reply

    Ciao, grazie innanzitutto per il tutorial molto chiaro e semplice. Mi manca però l’ultimo anello per completare un progetto che sto sviluppando, ovvero utilizzare il tutto per interfacciarmi con un software di simulazione (chiamiamolo gioco per semplicità). In sostanza non capisco come utilizzare i dati del serial.print per utilizzarli come imput dal gioco. Mi sono orientato subito su Arduino perchè ho la necessità di inserire come imput anche dei potenziometri slider. Ti ringrazio anticipatamente.

    1. Ciao Federico,
      l’oggetto Serial usa il metodo print() con cui scrive sulla seriale del tuo Pc/Mac.
      Lato Pc/Mac dovrai leggerlo come segnale di tipo seriale.

      Mauro

    • Leonardo on 27 febbraio 2013 at 12:55
    • Reply

    Ciao Mauro, è la prima volta che ti scrivo in quanto ho acquistato un kit di arduino solamente un mesetto fa ma ho lettò già i tuoi tutorial e ti devo fare i miei complimenti per la chiarezza e soprattutto per la semplicità con il quale spieghi alcuni argomenti in modo dettagliato.
    Veniamo al mio problemino… vorrei ruotare un cubo generato in processing con un joystick PS3 collegato ad arduino. Ho generato il cubo,riesco a leggere i dati corretamente dal joystick con arduino e ora vorrei far leggere a processing tali dati tramite seriale…. COME FACCIO A DISTINGUERE I DATI LUNGO L ASSE X E QUELLI LUNGO L ASSE Y?
    Spero tu mi possa aiutare…. lo sketch di arduino è uguale a quello fatto da te qui di seguito ti posto lo sketch da me fatto in processing:

    import processing.serial.*;
    Serial porta;
    int xpos = 250; //definisco la posizione iniziale del mio cubo//
    int ypos = 250;
    int scale = 90;

    float xrotate=0.0; //valore della rotazione che devo leggere tramite seriale//
    float yrotate=0.0;
    float zrotate=0.0;

    void setup()
    {
    size(500,500,P3D);
    println(Serial.list());
    porta= new Serial (this,Serial.list()[0],9600);
    noStroke(); //elimino gli spigoli del cubo//
    background(0); //sfondo nero//
    colorMode(RGB,1); //coloro il cubo//
    }

    void draw()
    {
    pushMatrix();
    translate(xpos,ypos,-30); //posiziono il cubo//
    rotateX(yrotate);
    rotateY(xrotate);
    rotateZ(zrotate);
    scale(scale);

    beginShape(QUADS);
    fill(0,1,1); vertex(-1,1,1);
    fill(1,1,1); vertex(1,1,1);
    fill(1,0,1); vertex(1,-1,1);
    fill(0,0,1); vertex(-1,-1,1);

    fill(1,1,1); vertex(1,1,1);
    fill(1,1,0); vertex(1,1,-1);
    fill(1,0,0); vertex(1,-1,-1);
    fill(1,0,1); vertex(1,-1,1);

    fill(1,1,0); vertex(1,1,-1);
    fill(0,1,0); vertex(-1,1,-1);
    fill(0,0,0); vertex(-1,-1,-1);
    fill(1,0,0); vertex(1,-1,-1);

    fill(0,1,0); vertex(-1,1,-1);
    fill(0,1,1); vertex(-1,1,1);
    fill(0,0,1); vertex(-1,-1,1);
    fill(0,0,0); vertex(-1,-1,-1);

    fill(0,1,0); vertex(-1,1,-1);
    fill(1,1,0); vertex(1,1,-1);
    fill(1,1,1); vertex(1,1,1);
    fill(0,1,1); vertex(-1,1,1);

    fill(0,0,0); vertex(-1,-1,-1);
    fill(1,0,0); vertex(1,-1,-1);
    fill(1,0,1); vertex(1,-1,1);
    fill(0,0,1); vertex(-1,-1,1);
    endShape();

    popMatrix();
    }

    1. Ciao Leonardo,
      mi stupisce il tuo commento, nei complimenti mi dici che i miei esempi sono chiari, realizzi un codice molto ben fatto e … poi … mi fai una domanda banale?

      Forse non ho capito il tuo problema, l’asse X e l’asse Y nello sketch sono bene distinti:

      analogRead( asseX )
      analogRead( asseY )

      Se ho frainteso la domanda riscrivimela, cercherò di darti una risposta più esauriente.
      Mauro

        • Leonardo on 28 febbraio 2013 at 14:27
        • Reply

        Scusami forse mi sono spiegato male…. in definitiva non so come far leggere a PROCESSING i valori di x e quelli di y che sono posizionati su una stessa riga di testo…. con il codice così fatto in PROCESSING riesco a fargli leggere le righe tramite seriale…. ma so che sia le lettere che i numeri li legge come riga di testo e quindi un numero o lettera per volta(tipo se il valore di x è 513 lui legge 5 poi 1 poi 3 come stringhe differenti)… come faccio a fargli leggere 513 a numero?
        Spero mi sia spiegato meglio…. In ogni caso scusami per il disturbo 😀 è che sono alle prime armi come pratica sia su arduino che processing….

        1. Ciao Leonardo,
          ora mi è più chiaro.
          Non conosco PROCESSING tuttavia Arduino è derivato da processing per cui il concetto dovrebbe essere simile, io procederei scrivendo da Arduino una linea tipo:

          X|Y es.: 512|348@540|348@…

          dove 512 è X e 348 Y, ovviamente letti dall’analogico.

          Su processing leggi un buffer seriale e quando incontri | sai che il valore letto fino a quel momento è X, quando incontri @ il valore letto è Y e così via.

          Mauro

            • Leonardo on 28 febbraio 2013 at 17:37

            grazie mille….. ho fatto qualche passetto in più con i tuoi consigli…. 🙂

    • giacomo on 20 settembre 2013 at 16:32
    • Reply

    Ciao Mauro, potresti fare un esempio con il comando del servomotore ? .. per far vedere come muoverlo ??? Grzie mille

    1. Ciao Giacomo,
      vuoi realizzare un controllo servo con questa shield ?
      Mi sembra di aver già pubblicato un progetto simile hai verificato nel blog?

      Mauro

    • Paolo on 20 novembre 2013 at 22:59
    • Reply

    Ciao Mauro, il joystick da tè descritto scorre solo su 2 binari (orizzontale e verticale) o anche in diagonale(quindi restituisce valori intermedi sia per la X sia per la Y contemporaneamente) . Dalla prova che hai fatto non si capisce. Grazie per la risposta

    1. Ciao Paolo,
      il joystick è in grado di spostarsi in tutte le direzioni.
      Le posizioni intermedie tra X ed Y restituiscono valori sia su un asse sia sull’altro.

      Mauro

    • Matteo on 27 marzo 2016 at 18:45
    • Reply

    Ciao, senti io sto facendo un progetto di macchina telecomandata con un motore dc pilotandolo con l298n, come posso fare a regolare la rotazione dei motori con il joestick(assey alto: motore va marcia avanti, basso: motore va marcia indietro, grazie…

    1. Ciao Matteo,
      se hai letto bene come funziona il Joystick e come scrivere uno sketch per il controllo dei motori avrai chiaro come mettere in relazione i due concetti che li uniscono.
      Se non ti sono chiari ti invito a legere altri articoli dedicati al controllo di robot via Joystick e a comprenderne le funzionalità ed il codice.

        • Matteo on 29 marzo 2016 at 17:12
        • Reply

        Ciao Mauro,
        Grazie….io ho provato a farlo però quando faccio partire il programma il motore parte subito e se porto il joestick verso il basso il motore aumenta la velocità, se lo porto verso l’alto il motore si ferma…non so capire bene dove ho sbagliato…se te mi potresti dare un aiuto…grazie

        1. Ciao Matteo,
          prova a leggere i valori del Joystick vedrai che in posizione centrale hai circa 512 come valore su pin analogico e spostandoti verso il basso vai a 1023 mentre verso l’alto vai a 0, che rimappati su 0-255 sono 0=alto; 127=centrale; 255=basso
          Quando avrai compreso questo, che trovi ben spiegato nei miei tutorial, il resto sarà facile.

    • Carmine on 14 aprile 2016 at 23:04
    • Reply

    salve, ho utilizzato il suo codice per controllare tramite joystick un servomotore, ma quando provo a farlo funzionare, il motore risponde soltanto quando clicco il joystick e non risponde in nessun altro movimento. quale potrebbe essere il problema?

    1. Ciao Carmine,
      verifica con il monitor seriale quali valori leggi dal joystick.

    • Stefano on 30 dicembre 2016 at 12:51
    • Reply

    Ciao Mauro, vorrei chiederti quale tipo di Arduino utilizzare per simulare un joystick. Va bene anche la uno o solo la Leonardo?
    Ho provato con la uno ma non riesco ad entrare in modalità dfu x programmarla.

    1. Ciao Stefano,
      io ti consiglio una board come la leonardo o simile che non abbia il convertitore USB-Seriale ma sia tutto integrato nel microcontrollore e supporti le librerie Mouse se vuoi che sia riconosciuta dal tuo computer come mouse.
      Se lo scopo del tuo joystick non è essere connesso ad un computer puoi tranquillamente usare la Uno e usare altre interfacce di collegamento.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.