Arduino – impiego sensori analogici e taratura statica

Supponiamo di disporre di un sensore per una determinata grandezza ambientale e di volerlo impiegare con Arduino per misurarla. Il principio di funzionamento del sensore è sicuramente la variazione di una certa grandezza (es. resistenza) in funzione del parametro ambientale che si vuole misurare. Spesso però parametro da misurare e grandezza in uscita non sono legati da una relazione di proporzionalità, ma seguono una curva che può essere regolare oppure no.

Nel caso di un termistore NTC impiegato per la misura della temperatura, il principio su cui si basa è la variazione della sua resistenza in funzione della temperatura a cui è sottoposto. NTC (Negative Temperature Coefficient) sta ad indicare che la sua resistenza segue un andamento decrescente all’aumentare della temperatura. Sebbene questo andamento segua una curva monotona strettamente decrescente, la cui regolarità è di tipo esponenziale (come in figura), spesso potrebbe non essere così nel caso di altri sensori. Ecco quindi come fare per implementarne uno generico.

1 – Interfacciamento Arduino a sensore

I sensori modificano la loro grandezza in funzione di un dato parametro ambientale, ma è necessario poter convertire questa in una grandezza che possa essere riconosciuta in modo diretto da un microcontrollore: la tensione.
Variazione di resistenza può essere associata ad una variazione di tensione impiegando un partitore di tensione, dove le tensioni Va e Vb ai capi delle rispettive resistenze Ra e Rb sono date dalla ripartizione della tensione complessiva in modo proporzionale al loro valore resistivo.

La tensione in uscita Vo segue quindi la relazione

\displaystyle Vo = \frac{Vi*Rb}{Ra+Rb}

Solitamente Rb costituisce la caratteristica del sensore (variabile), mentre Ra è una resistenza fissa di valore scelto in modo che la variazione della tensione Vo rientri in un intervallo di larghezza sufficiente per consentire un buon apprezzamento della misura. Vi in tal caso sarà la tensione 5V stabilizzata fornita da Arduino.

Nel mio caso intendo impiegare il termistore per misurare temperature comprese tra 2°C e 100°C: ho quindi misurato il suo valore resistivo a questi casi estremi, ottenendo Rt(2^\circ C)=161k\Omega e Rt(100^\circ C)=3k\Omega. Procedendo per tentativi ho scelto Ra = 22k\Omega, valore che permette la più elevata differenza tra la tensione minima e massima ottenibile dal partitore nell’intervallo di queste temperature:

\displaystyle Vo(min) = \frac{Vi*Rt(100^\circ C)}{Ra+Rt(100^\circ C)} = \frac{5V*3k\Omega}{22k\Omega+3k\Omega} = 0,6V

\displaystyle Vo(max) = \frac{Vi*Rt(2^\circ C)}{Ra+Rt(2^\circ C)} = \frac{5V*161k\Omega}{22k\Omega+161k\Omega} = 4,4V

E’ un intervallo molto ampio rispetto a quello misurabile da Arduino (0-5V) che permette di apprezzare la misura in modo ottimale.

L’interfacciamento con Arduino consiste nel collegare l’uscita del partitore ad un ingresso analogico della scheda. Per evitare misure imprecise è consigliabile alimentare Arduino esternamente, in quanto alimentandolo solo tramite USB ho spesso notato che la tensione fornita era inferiore a 5V.

Per leggere quindi la tensione in ingresso sul pin analogico è sufficiente impiegare la funzione analogRead(pin), che nel seguente sketch memorizza il valore nella variabile val. Notare che questa funzione non ci restituisce l’esatto valore della tensione in volt applicata all’ingresso, ma un valore intero campionato su un intervallo da 0 a 1023 proporzionato all’intervallo da 0V a 5V, secondo la relazione:

\displaystyle val(Vo) = \frac{Vo}{5V}*1023

Nel caso in esame la tensione campionata è compresa tra 122 per 100°C e 900 per 2°C.

Il seguente sketch si occupa di misurare e stampare a monitor seriale a intervalli di 3 secondi, la tensione campionata.

17,372 total views, 4 views today