Tutorial joystick shield per arduino

La scorsa settimana ho acquistato una joystick shield prodotta da sparkfun ed ho fatto qualche test realizzando un tutorial joystick shield per arduino.

joystick shield sparkfun

La shield è dotata di un joystick a due assi con pulsante centrale e quattro pulsanti ciascuno connesso ad un pin digitale.

Come sai il mio spirito makers mi spinge a smontare e rimaneggiare le shield ed in questo caso mi ha ispirato la presenza al centro della joystick shield dei fori tipici di una basetta millefori in cui ho saldato un potenziometro aggiuntivo da 10Kohm

Come è fatta la joystick shield

Sul sito del produttore trovi tutta la documentazione necessaria ad usare questa shield

La Joystick shield è composta da:

  • un joystick a due assi in cui ciascun asse è collegato ad un potenziometro connesso ai pin A0 ed A1
  • un pulsante connesso al joystick connesso al pin 2
  • quattro pulsanti connessi rispettivamente ai pin 3 (right), 4 (up), 5 (down), 6 (left)

e la mia personale modifica:

  • un potenziometro da 10Kohm collegato al pin analogico A2

joystick shield potenziometro

ho collegato il potenziometro come mostrato nello schema seguente:

joystick shield connection

Lo sketch di test

Lo sketch che ho utilizzato per il test della joystick shield for arduino è molto simile a quello proposto dal produttore della shield, leggermente moficato per potre leggere anche il potenziometro che ho aggiunto:

/*
 * Joystick Shield Tets
 *
 * Autore: Alfieri Mauro
 * Twitter: @mauroalfieri
 *
 * http://www.sparkfun.com/commerce/product_info.php?products_id=9490 
 *
 * created Nov. 15, 2014
 * by Mauro Alfieri
 */

const byte PIN_BUTTON_SELECT = 2;

const byte PIN_BUTTON_RIGHT = 3;
const byte PIN_BUTTON_UP = 4;
const byte PIN_BUTTON_DOWN = 5;
const byte PIN_BUTTON_LEFT = 6;

const byte PIN_ANALOG_X = A0;
const byte PIN_ANALOG_Y = A1;
const byte PIN_ANALOG_P = A2;

byte i=0;

void setup(void)
{
  pinMode(PIN_BUTTON_SELECT, INPUT);  digitalWrite(PIN_BUTTON_SELECT, HIGH);
  pinMode(PIN_BUTTON_RIGHT, INPUT);   digitalWrite(PIN_BUTTON_RIGHT, HIGH);
  pinMode(PIN_BUTTON_UP, INPUT);      digitalWrite(PIN_BUTTON_UP, HIGH);
  pinMode(PIN_BUTTON_DOWN, INPUT);    digitalWrite(PIN_BUTTON_DOWN, HIGH);
  pinMode(PIN_BUTTON_LEFT, INPUT);    digitalWrite(PIN_BUTTON_LEFT, HIGH);
  
  pinMode(PIN_ANALOG_X, INPUT);
  pinMode(PIN_ANALOG_Y, INPUT);
  pinMode(PIN_ANALOG_P, INPUT);

  Serial.begin(9600);
}

void loop(void) {
  if (i== 30) {
  Serial.print("SELECT, RIGHT, UP, DOWN, LEFT, ANALOG_X, ANALOG_Y,ANALOG_P\n");
  i=0;
  }
  
  Serial.print(digitalRead(PIN_BUTTON_SELECT));
  Serial.print(",");
  Serial.print(digitalRead(PIN_BUTTON_RIGHT));
  Serial.print(",");
  Serial.print(digitalRead(PIN_BUTTON_UP));
  Serial.print(",");
  Serial.print(digitalRead(PIN_BUTTON_DOWN));
  Serial.print(",");
  Serial.print(digitalRead(PIN_BUTTON_LEFT));
  Serial.print(",");
  Serial.print(analogRead(PIN_ANALOG_X));
  Serial.print(",");
  Serial.print(analogRead(PIN_ANALOG_Y));
  Serial.print(",");
  Serial.print(analogRead(PIN_ANALOG_P));
  Serial.print("\n");
  
  delay(100);
  i++;
}

come vedi nella prima parte ho definito delle costanti di tipo byte una per ciascun pin connesso.

linea 24: definisci una variabile di tipo byte in che userai come contatore interno al loop(), vedrai in seguito a cosa serve;

linee 26-39: imposta la funzione setup() il cui scopo è definire la modalità di funzionamento di ciascun pin, impostare HIGH il valore dei pin digitali, attivando in questo modo la resistenza di pull-up e attivare il canale di comunicazione seriale a 9600 baud;

linee 42-46: è qui che usi il contatore “i” verificando quando il suo valore è uguale a 30, in questo caso scrivi sul monitor seriale la linea di intestazione “SELECT, RIGHT, UP, DOWN, LEFT, ANALOG_X, ANALOG_Y,ANALOG_P\n” e imposta nuovamente a 0 il valore di “i”;

linee 48-63: scrivi sul monitor di rete i valori letti dai singoli pin della joystick shield;

linea 65: attendi 100 millisecondi tra un esecuzione di un ciclo di loop() ed il successivo;

linea 66: incrementa il contatore “i” di un valore;

Il risultato del test lo puoi vedere nel video riportato di seguito:

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/tutorial-joystick-shield-per-arduino.html

8 commenti

Vai al modulo dei commenti

    • Michele il 25 Novembre 2014 alle 18:54
    • Rispondi

    Ciao, volevo chiederti il voltaggio di uscita di arduino nano e arduino mini pro che non riesco a trovere queste specifiche grazie per l’ aiuto.

    1. Ciao Michele, la tua domanda é inserita nell’articolo sbagliato. Tuttavia hai provato a leggere nel sito ufficiale arduino ? Ci sono le schede prodotti di entrambi con tutte le caratteristiche.

    • Sergio il 18 Gennaio 2016 alle 14:51
    • Rispondi

    Ciao Mauro,
    complimenti per il blog ti volevo chiedere se era possibile utilizzare il joystick shield collegandolo direttamente con il raspberry e in caso affermativo mi sapresti dire come posso fare grazie.

    1. Ciao Sergio,
      come vedi sin dalla prima immagine si tratta di una shield per arduino e non per raspberry.

    • Maurizio il 7 Novembre 2016 alle 12:56
    • Rispondi

    Ciao Mauro, vorrei sapere se questo sketch può essere usato su Arduino Leonardo per simulare un joyestik composto da tre potenziometri e due pulsanti, praticamente mi sono auto costruito volante, pedaliera e cambio sequenziale per un simulatore di guida usando dei semplici potenziometri da 10 k. In parte sono riuscito, nel senso che ho due assi nel controllerà e non tre. Grazie

    1. Ciao Maurizio,
      non mi è chiaro come funzioni un Joystick a 3 assi, tuttavia dipende da come interpoli le 3 coordinate per trasformarle in 2 coordinate ( X ed Y ) da passare al tuo computer.

    • Andrea Cristini il 28 Gennaio 2021 alle 00:14
    • Rispondi

    Ciao Mauro mi sono avvicinato da poco ad arduino essendo un videomajker per passione volevo creare tipo una macchina radiocomandata da questo joystick shield . ho preso due arduino +joystick shield +adafruit motorshield v2 a cui collegare il servo per le ruote sterzanti e un motoriduttore dc per la ruota posteriore + due moduli rf24 per comunicare tra i due arduino, qui viene il difficile se non impossibile al momento per me. ho provato alcuni file esempio simili al mio progetto ma non comunicano via rf…….

    1. Ciao Andrea,
      il tuo progetto è interessante, sarò onesto nel dirti che ho acquistato anche io, in passato, i moduli rf24 ma al momento non li ho ancora utilizzati per alcun progetto.
      Non ti prometto nulla ma nelle prossime settimane potrei provarli e scriverci un articolo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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