La scorsa settimana ho acquistato una joystick shield prodotta da sparkfun ed ho fatto qualche test realizzando un tutorial joystick shield per arduino.
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
ho collegato il potenziometro come mostrato nello schema seguente:
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:
8 commenti
Vai al modulo dei commenti
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.
Autore
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.
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.
Autore
Ciao Sergio,
come vedi sin dalla prima immagine si tratta di una shield per arduino e non per raspberry.
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
Autore
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.
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…….
Autore
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.