Arduino

Arduino: input analogici con analogRead() e map()

Tutorial alla corretta lettura e gestione degli ingressi analogici

In questa guida potremo osservare come un microcontrollore preleva le informazioni analogiche e come noi possiamo gestirle a livello software. Se prendiamo in esame una board ArduinoUNO, ad esempio, essa è basata sul microcontrollore ATmega328PU il quale possiede 6 ingressi analogici denominati A0 A1 A2 A3 A4 A5.

Nelle schede ArduinoUNO ogni singolo ingresso analogico possiede una risoluzione di 10 bit, ciò significa che avremo il valore massimo di 1023 corrispondente alla tensione 5V e il valore minimo 0 corrispondente a 0V. L’informazione analogica, ovviamente, potrà assumere tutti i valori da 0 a 1023 a seconda della tensione applicata all’ingresso analogico. Per prelevare l’informazione basta utilizzare la seguente funzione e memorizzarla all’interno di una variabile integer.

nome_variabile = analogRead(A0);

La difficoltà nasce quando vogliamo gestire il valore letto poiché non è corretto gestirlo tramite una semplice proporzione matematica. Infatti per gestire tale informazione numerica viene sfruttata la funzione map().

Questa funzione permette di scalare i valori da 0 a 1023 secondo due estremi che possiamo decidere noi. La struttura da adottare è la seguente:

nome_variabile_scalata = map(nome_variabile_analogica, 0, 1023, nuovo_estremo_minimo, nuovo_estremo_massimo);

Se ad esempio vogliamo scalare i parametri in un intervallo compreso tra 10 e 20 il codice da utilizzare sarà:

nome_variabile_scalata = map(nome_variabile_analogica, 0, 1023, 10, 20);

ESEMPIO

Nel seguente esempio si vuole gestire la luminosità di un led sfruttando l’uscita PWM 3. L’uscita della porta dovrà essere legata alla lettura analogica del terminale A0.

NB. per gestire l’uscita PWM è necessario utilizzare la funziona analogWrite che prevede la gestione di 1 byte (quindi valori compresi tra 0 e 255).

Schema elettrico:

Sketch:

int pin_LED = 3; //associo la variabile pin_LED al pin 3
int valore_letto = 0;  //creo una variabile ausiliaria pari a 0

void setup(){
  pinMode(LED, OUTPUT); // dichiaro il pin 3 come OUTPUT
}

void loop(){
  valore_letto = analogRead(A0);     // effettuo lettura su pin analogico A0 e memorizzo il valore nella variabile valore_letto

         // valore_letto può assumere valori da 0 a 1023

   valore_letto = map(valore_letto, 0 , 1023, 0, 255);

         // valore_letto ora è stato scalato tra gli estremi 0 e 255

   analogWrite(LED, valore_letto); //attivo uscita digitale PWM pilotata dalla variabile valore_letto
   delay(10); // viene inserito un piccolo delay per migliorare la stabilità del sistema
}

È inoltre possibile incrementare l’accuratezza dei dati ottenuti attraverso gli ingressi analogici andando a modificare (operazione non possibile per tutte le schede arduino) la qualità di risoluzione della lettura. Per chi fosse interessato è possibile continuare la lettura nel seguente articolo:

MST-Admin

Appassionato di elettronica, elettrotecnica generale e programmazione. Fondatore del progetto MST-tutorial, desideroso di condividere con voi l'entusiasmo per l'innovazione tecnologica e la sperimentazione di novità tecniche in questi campi.

Articoli Correlati

Pulsante per tornare all'inizio