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:

Cortesemente, prima di inserire i commenti leggi il regolamento

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

6 comments

Skip to comment form

    • Michele on 25 novembre 2014 at 18:54
    • Reply

    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 on 18 gennaio 2016 at 14:51
    • Reply

    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 on 7 novembre 2016 at 12:56
    • Reply

    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.

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.