Pin analogico.
Perché leggere un segnale analogico? Il microcontrollore può fungere da voltmetro, misurare la propria tensione di alimentazione, ad esempio da una batteria, può misurare la corrente attraverso uno shunt (se si conosce la legge di Ohm), misurare la resistenza e anche lavorare con potenziometri (torsionali, lineari, joystick, ...).
I pin analogici possono prendere una tensione da 0V (GND) a una tensione di riferimento e convertirla in un valore digitale. ADC su AVR ed esp8266 ha 10 bit, cioè otteniamo la tensione misurata come un numero da 0 a 1023.
La funzione che digitalizza la tensione si chiama analogRead(pin). Prende un numero di pin analogico come argomento e restituisce la tensione digitalizzata. Il pin stesso deve essere configurato come INPUT (ingresso).
Esempio (Arduino Nano) - leggere la tensione dal pin A0:
int value1 = analogRead(0);
int value2 = analogRead(A0);
int value3 = analogRead(14);
Ha senso memorizzare il valore risultante in una variabile di tipo int, perché il valore è compreso tra 0 e 1023.
Nota: non applicare al pin analogico una tensione superiore alla tensione di alimentazione dell'microcontrollore.
Tensione di riferimento (per AVR Arduino).
La tensione di riferimento gioca un ruolo importante nella misura di un segnale analogico, perché da essa dipendono la tensione massima misurata e, in generale, la possibilità e la precisione di convertire il valore ottenuto 0-1023 in Volt. Studiamo la funzione analogReference(mode), dove mode:
- DEFAULT: la tensione di riferimento è uguale alla tensione di alimentazione dell'microcntrollore. Attivo per impostazione predefinita.
- INTERNAL: sorgente di riferimento di tensione
interna per 1.1V (per ATmega168 o ATmega328P) e 2.56V (per ATmega8).
- INTERNAL1V1: sorgente di riferimento di tensione interna per 1.1V
(solo Arduino Mega).
- INTERNAL2V56: sorgente di riferimento di tensione interna per 2.56V (solo Arduino Mega).
- EXTERNAL: il riferimento sarà la tensione applicata al pin AREF.
Dopo aver modificato il riferimento di tensione (chiamando analogReference()), le prime misurazioni potrebbero essere instabili. Il valore 1023 della funzione analogRead() corrisponderà alla tensione di riferimento selezionata o a una tensione superiore ad essa.
In modalità DEFAULT, possiamo digitalizzare la tensione da 0 alla tensione di alimentazione VCC. Se la tensione di alimentazione è 4,5 Volt e forniamo 4,5 Volt, otterremo un valore digitalizzato di 1023. Se forniamo 5 Volt, otterremo di nuovo 1023, perché al di sopra della tensione di riferimento. Questa regola continua a funzionare, l'importante è non superare i 5,5 volt. Come misurare una tensione più alta, leggi sotto.
Per quanto riguarda la precisione: quando alimentato da 5V e modalità DEFAULT, otteniamo una precisione di misurazione della tensione di (5 / 1024) ~ 4,9 millivolt. Impostando INTERNAL possiamo misurare la tensione da 0V a 1.1V con una precisione di (1.1 / 1024) ~0.98 millivolt.
Per quanto riguarda il riferimento di tensione esterno: non è possibile applicare una tensione inferiore a 0V (negativo) o superiore a 5,5V come riferimento esterno al pin AREF. Inoltre, quando si collega una tensione di riferimento esterna, è necessario chiamare analogReference(EXTERNAL) prima della prima chiamata alla funzione analogRead() (a partire dall'inizio del programma), altrimenti si può danneggiare il microcontrollore.
Per passare "al volo" tra tensioni di riferimento interne ed esterne, puoi collegarlo ad AREF tramite un resistore da ~5 kΩ. L'ingresso AREF ha una propria resistenza di 32 kΩ, quindi il riferimento effettivo sarà calcolato dalla formula AREF = V * 32 / (R + 32), dove R è la resistenza del resistore (kΩ) attraverso cui la tensione di riferimento V (Volt) è collegato. Ad esempio, per 2,5 V otteniamo 2,5 * 32 / (32 + 5) = ~2,2 V tensione di riferimento reale.