La shield con display tft di cui hai letto un articolo lunedì presenta anche un un joystick da cui il titolo di questo articolo: 1,8″ shield joystick.
Trovo particolarmente utili le shield che inglobano sia un display: lcd/tft/ecc.. sia un joystick in quanto puoi utilizzarle al meglio nel tuo progetto con l’aggiunta di pochissimi componenti esterni e per la maggior parte di sensori.
In pratica l’abbinamento di un joystick o di pulsanti al display ti permetti di avere sia la parte visiva del tuo progetto sia quella di controllo in un unica shield.
Come funziona la 1,8″ shield joystick
Il joystick presente sulla shield non è di tipo proporzionale come quello installato su altre shield specifiche, si tratta di un joystick che potrei definire digitale, consentimi la definizione anche se non corretta :-), ossia ogni posizione assume valore 0 o 1 in funzione della posizione della leva.
In pratica è più come 4 pulsanti, dispoati a croce, tutti connessi ad una leva la cui posizione determina il pulsante che viene premuto. A questi devi aggiungere il pulsante centrale ossia la possibilità di premere la leva stessa causando la chiusura di un 5 pulsante.
Come sono collegati i pulsanti del 1,8″ shield joystick
Un aspetto interessante che la 1,8″ shield joystick condivide con la KeyPad LCD del medesimo produttore hardware è il fatto che tutti i pulsanti che, in questo caso, compongono il joystick sono connessi a delle resistenze di valore differente il cui scopo è poter collegare ad un solo pin di arduino l’intero gruppo di pulsanti.
Nella Keypad LCD tutti i pulsanti sono collegati al pin A0, vedi articolo dedicato alla keypad LCD, nella 1,8″ shield joystick il joystick è collegato al pin A3.
Per leggere quindi il valore di ciascun pulsante alla pressione o posizione della leva puoi utilizzare sia lo sketch presentato nell’articolo della keypad LCD sia lo sketch presente in questo articolo.
Lo sketch di test
Tra gli esempi riportati nel sito del costruttore ho trovato uno sketch di test benfatto:
void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } #define Neutral 0 #define Press 1 #define Up 2 #define Down 3 #define Right 4 #define Left 5 // Check the joystick position int CheckJoystick() { int joystickState = analogRead(3); if (joystickState < 50) return Left; if (joystickState < 150) return Down; if (joystickState < 250) return Press; if (joystickState < 500) return Right; if (joystickState < 650) return Up; return Neutral; } void loop() { int joy = CheckJoystick(); switch (joy) { case Left: Serial.println("Left"); break; case Right: Serial.println("Right"); break; case Up: Serial.println("Up"); break; case Down: Serial.println("Down"); break; case Press: Serial.println("Press"); break; } }
lo sketch è semplice in quanto il suo scopo è riconoscere in quale direzione hai spostato la leva o se hai premuto la stessa.
La posizione della 1,8″ shield joystick deve essere quella mostrata in figura:
in modo che la posizione ed il valore restituiro dallo sketch corrispondano.
Ecco in particolare come funziona lo sketch:
linee 01-05: definisci la funzione, obligatoria, setup() con l’inizializzazione del monitor seriale;
linee 07-12: definisci sei costanti, una per ciascuna posizione del joystick più la posizione centrale e la pressione del pulsante centrale ed associa a ciascuna un valore intero;
linea 15: definisci la funzione di tipo integer, ossia che restituirà un valore intero, denominata CheckJoystick();
linea 17: imposta il valore della variabile joystickState con il valore letto sul pin A3, che puoi anche scrivere come 3 in quanto si tratta di una lettura anlogica e quindi non crea confusione con il pin 3 digitale;
linee 19-23: confronta il valore letto sul pin analogico A3 con un valore numerico predefinito e quando il valore è inferiore al numero di confronto ritorna la costante corrispondente. Il principio su cui si basa è che se il pin A3 riporta come volare analogico 230 tale valore sarà superiore a 150 ( linea 20 ) per cui il programma procede ma inferiore a 250 ( linea 21 ) per cui il programma restituisce Press che corrisponde a 1 ( linea 08 );
linea 24: se il valore letto dalla linea 17 è maggiore di 650 vuol dire che il joystick non si è spostato dalla posizione neutra e non è stato premuto alcun pulsante per cui ritorna Neutral che corrisponde a 0;
linea 27: definisci la funzione, obligatoria, loop() che arduino esegue ciclicamente;
linea 29: richiami la funzione CheckJoystick() ed assegni il valore restituito alla variabile joy;
linea 30: definisci con switch un elenco di scelte possibili basate sul valore della variabile joy;
linee 32-34: se il valore di Joy è identico a quello della costante Left scrivi sul monitor seriale “Left”;
linee 35-46: si comportano come le linee 32-34 confrontando il valore di Joy con tutte le altre costanti definite.
Il risultato del test eseguito su arduino e sulla 1,8 shield joystick dovrebbe essere simile al seguente:
Buon test !!!