INPUT ANALOGICO: Esempio JOYSTICK
Costruire il seguente circuito (serve un JOYSTICK e un Led)
Ricordate di collegare il catodo (-) del diodo LED su GND e l’anodo (+) all’uscita digitale 13 (volendo possiamo omettere il led sfruttando il fatto che il PIN 13 è connesso al L-LED di Arduini. Ecco l'immagine del circuito
La lettura dei valori relativi ai due assi è di tipo analogico ed avviene attraverso i pin A0 ed A4 con il comando analogRead( pin ). Per catturare il segnale proveniente dal pulsante connesso alla leva del joystick devo 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 abbiamo già incontrato parlando dell’ADC ( convertitore analogico digitale ) di arduino a 10bit. Gli stessi valori vengono letti sul pin A4 spostando il joystick verso il basso (da 512 circa a 0) o verso l’alto (da 512 circa a 1023).
Codice Sorgente A
I pin digitali di Arduino sono per default impostati come
pin di INPUT, perciò non è necessario dichiararli esplicitamente come input con
il comando pinMode(). Nel caso si debba utilizzarli come pin di uscita è
indispensabile impostare il pin come OUTPUT tramite il comando pinMode(pin,
OUTPUT). I pin configurati come INPUT si dice che sono in uno
stato di alta impedenza.
Il processore Atmega, presente sulla scheda Arduino, è dotato su ogni ingresso
digitale, di una resistenza di pull-up da 20KOhm che viene abilitata via software
quando imposto il PIN come INPUT. Le istruzioni sono le seguenti:
pinMode(pin, INPUT); // imposta
'pin' come input
digitalWrite(pin, HIGH); // attiva la resistenza di pull-up,
Le resistenze di pull-up vengono normalmente utilizzate per gestire degli input
come ad esempio gli interruttori.
I pin configurati come OUTPUT sono detti a bassa impedenza e sono in
grado di fornire 40 mA (milliampere) ad altri dospositivi o circuiti. Questa è
una corrente sufficiente per accendere un LED (non dimenticate di inserire in
serie una resistenza), ma non è una corrente sufficiente per pilotare la maggior
parte dei relè, bobine o motori.
I cortocircuiti sui piedini di Arduino possono danneggiare o distruggere i pin
di output o danneggiare l’intero chip Atmega. Quando si ha la necessità di
utilizzare i pin come output per collegare dispositivi esterni è buona prassi
inserire in serie al pin un resistore da 470 Ohm o 1 KOhm.
/* ----------------------------------------------------------------------------------- Scopo del programma è leggere gli spostamenti del JOYSTICK ----------------------------------------------------------------------------------- */ const byte Pin_VRx = 0; // Pin Asse Orizzontale const byte Pin_VRy = 4; // Pin Asse Verticale const byte Pin_SW = 6; // Pin del bottone sul Joystick const byte Pin_LED = 13; // Pin del LED L di Arduino byte statoBottone; void setup() { // I pin di INPUT posso anche non dichiararli pinMode(Pin_SW, INPUT); // Inizializzo il pin del pulsante del JOYSTICK digitalWrite(Pin_SW,HIGH); // Setto la resistenza di pull-up pinMode(Pin_LED, OUTPUT); // Inizializzo il pin del LED digitalWrite(Pin_LED,LOW); // Spengo il LED Serial.begin(9600); // Inizializzo la comunicazione seriale } void loop() { unsigned int valueX,valueY; int scaleX,scaleY; // LETTURA PARAMETRI statoBottone=digitalRead(Pin_SW); // Leggo lo stato del pulsante del joystick valueX = analogRead(Pin_VRx); // Legge la posizione del joystick orizzontale valueY = analogRead(Pin_VRy); // Legge la posizione del joystick verticale // SCALO I VALORI IN UN OPPORTUNO RANGE (utile didatticamente) scaleX = map(valueX, 0, 1023, -5, 5); scaleY = map(valueY, 0, 1023, -5, 5); // Creo le stringhe di output in 2 modi (String che char []) a scopo didattico char Linea2[32]; snprintf(Linea2, 32, "Scalato(X,Y)=(%d,%d)", scaleX, scaleY); String Linea="(X,Y)=("+String(valueX)+","+String(valueY)+") - " + Linea2; Serial.println(Linea); if (statoBottone==LOW) // è premuto digitalWrite(Pin_LED,HIGH); // Accendo il LED se schiaccio il pulsante else digitalWrite(Pin_LED,LOW); // Accendo il LED se schiaccio il pulsante }
Codice Sorgente B
Per le impostazioni delle direzioni utilizziamo questo schema:
/* ----------------------------------------------------------------------------------- Scopo del programma è visualizzare la direzione degli spostamenti del JOYSTICK ----------------------------------------------------------------------------------- */ #define THRESHOLD_LOW 350 #define THRESHOLD_HIGH 650 const byte Pin_VRx = 0; // Pin inteso qui come verticale const byte Pin_VRy = 4; // Pin inteso qui come orizzontale const byte Pin_SW = 6; // Pin del bottone sul Joystick int x_position; int y_position; char Prec_x_direction = '\0'; // lettura orizzontale nel precedente loop char Prec_y_direction = '\0'; // lettura verticale nel precedente loop char Prec_b_state = '\0'; // stato del bottone nel precedente loop void setup() { pinMode(Pin_SW, INPUT); // Inizializzo il pin del pulsante del JOYSTICK digitalWrite(Pin_SW,HIGH); // Setto la resistenza di pull-up Serial.begin(9600); } void loop () { char x_direction = '\0'; char y_direction = '\0'; char b_state = '\0'; // Pin_VRx è abbinato con y e viceversa per // via dell'interpretazione diversa che do ai // movimenti del joystick x_position = analogRead(Pin_VRy); y_position = analogRead(Pin_VRx); b_state=digitalRead(Pin_SW); // Leggo lo stato del pulsante del joystick // Stabilisco la direzione e stato bottone if (x_position > THRESHOLD_HIGH) x_direction = 'R'; // Destra else if (x_position < THRESHOLD_LOW) x_direction = 'L'; // Sinistra else x_direction = 'C'; // Riposo if (y_position > THRESHOLD_HIGH) y_direction = 'U'; // Alto else if (y_position < THRESHOLD_LOW) y_direction = 'D'; // Basso else y_direction = 'C'; // Riposo if (digitalRead(Pin_SW)==LOW) b_state='P'; // è premuto else b_state='-'; if (Prec_x_direction != x_direction || Prec_y_direction != y_direction || Prec_b_state != b_state) Serial.println(String(x_direction)+String(y_direction)+String(b_state)); Prec_x_direction = x_direction; Prec_y_direction = y_direction; Prec_b_state=b_state; delay(50); }
Sfruttando il codice di Arduino precedente posso far muovere una pallina in EXCEL. Per provare basta scaricare il file seguente: supporto\Arduino-JoyStick.xls