genere |
DATA |
generalità |
Note |
distribuzione |
RADIO |
2010 |
Errore su arduino CIRC10 |
|
Ari vinci – genz bullettin |
Più che una nota tecnica questo QTC vorrebbe essere un warning, un avviso, per i radioamatori che avendo acquistato un kit ARDUINO per i loro progetti hanno intenzione di provare l’esempio CIRC-10 che dovrebbe servire a misurare la temperatura.
Ebbene ho notato che il kit da me ricevuto mostra di usare un integrato tipo LM335 e dopo aver letto il data-sheet dell’integrato si intuisce che il circuito suggerito per il suo impiego è errato.
Con una breve ricerca ho capito che il kit originale impiegava un sensore di temperatura tipo TMP36 che si adatta bene al circuito proposto nella documentazione. Da notare che anche il software proposto è adatto al TMP36 mentre non farebbe bene il suo lavoro con un LM335.
Poiché il kit che ho ricevuto contiene effettivamente un LM335 ho pensato di far buona cosa per altri OM suggerendo il corretto circuito di impiego e il software di riferimento. I link dove reperire i data-sheet dei due integrati sono:
http://www.datasheetcatalog.org/datasheet/analogdevices/32847740TMP35_6_7_c.pdf per TMP36.
http://www.datasheetcatalog.org/datasheet/nationalsemiconductor/DS005698.PDF per LM335.
In soldoni la differenza è la seguente: il TMP36 è un dispositivo a tre terminali di cui uno collegato a terra, uno all’alimentazione ed il terzo riporta una tensione in uscita proporzionale secondo una precisa formula alla temperatura del chip. L’ LM335 invece pare essere più primitivo del precedente essendo uno zener complesso che ai suoi capi presenta una tensione di break-down proporzionale alla temperatura. Il terzo piedino serve per calibrare il chip con una temperatura di riferimento. In pratica entrambi presentano una variazione di tensione di circa 10 millivolt per grado centigrado, ma il TMP consuma una corrente notevolmente inferiore al LM335. Per l’uso hobbistico il LM335 è abbastanza preciso senza necessità di calibrazione, ma richiede un circuito diverso dal TM.
Il data-sheet indica la formula che esprime la tensione per una data temperatura in gradi Kelvin, formula che adattata per il programma ci permetterà di risalire alla temperatura misurando la tensione. La tensione viene misurata da un ingresso analogico di ARDUINO.
La formula si riferisce a gradi Kelvin, e a un valore di
riferimento di 298.15°K (
dove Tx=temperatura da
misurare, V@T25 è 2.93 Volt, come indicato nel data-sheet. La figura seguente
mostra un grafico per i valori di Temp da 0 a 100°C creato con la formula
precedente.
Volendo far calcolare la temperatura a ARDUINO bisogna esprimere
la formula seguente in funzione della tensione, e cioè: . Per completezza a questo valore va sottratto 273.15 per
ottenere il valore in gradi Centigradi
Il circuito più semplice da usare consiste in una resistenza che alimenta il chip dal positivo alimentazione in modo che nel range di temperatura misurabile la corrente di zener rimanga entro i valori di 400uA ÷ 5mA come suggerito dal costruttore. Un buon valore è 1500 ohm perché al variare della tensione in corrispondenza a temperature tra -20 e 100°C la corrente rimane tra 840 micro e 1.6 milliampere, con V+=5. Il terzo piedino può essere lasciato disconnesso.
Il chip LM335 genera una tensione proporzionale alla temperatura. La tensione viene misurata dal convertitore A/D di ARDUINO. Per questi due valori dichiaro due variabili “analogiche” tipo float, dette volt e gradiC.
L’uscita del convertitore è un numero intero che può essere contenuto in una variabile INT, cntAD.
Come si vede dal listato che segue all’interno della routine “loop” ci sono le formule prima citate.
Per trasformare i conteggi che sono ottenuti dall’istruzione “cntAD = analogRead(0);” in Volt li moltiplico per il fondo scala (5V) e divido per 1023. poi calcolo i gradi centigradi.
Le istruzioni seguenti servono a scrivere i risultati su un display a cristalli liquidi da due righe per 16 caratteri. Alcune delle istruzioni precedenti si riferiscono alla inizializzazione del display. Nel kit di arduino ci sono numerosi esempi di come impiegarlo. Chi vuol far prima può usare la console seriale che è parte del programma.
// include the library code:
#include <LiquidCrystal.h>
// LCD CONST:
const int numRows = 2;
const int numCols = 16;
// VAR GLOB:
int cntAD = 0;
float volt = 0;
float gradiC = 0;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(numCols,numRows);
// Print a message to the LCD.
lcd.print("cntAD Volt gr. C");
}
void loop() {
cntAD = analogRead(0);
volt = cntAD * 5.0 / 1023.0; // 0..5 volt
gradiC = (volt /(2.98/298.15))-273.15;
delay(1000); // wait for a second
// set the cursor to column 0, line 1
lcd.setCursor(0, 1);
lcd.print(cntAD,HEX);
lcd.setCursor(6, 1);
lcd.print(volt);
lcd.setCursor(11, 1);
lcd.print(gradiC);
}
Per usare il display LCD: collegare il suo pin 1 al comune; pin2 a +5V; pin3 al cursore di un potenziometro (incluso nel kit); il pot va anche al +5v e al comune; pin4 di LCD a pin12 di ARDUINO; pin5 al comune; pin6 al pin11 di ARDUINO; i pin 11 12 13 14 LCD rispettivamente ai pin 5 4 3 2 di ARDUINO. Il pin analog0 di arduino va alla giunzione tra LM335 e la resistenza da 1500 ohm. È tutto per l’hardware, che funziona alimentato dalla presa USB di programmazione di ARDUINO.
Il convertitore AD di arduino fornisce 1024 valori discreti per un fondo scala di 5 Volt. Fanno quasi 5 milliVolt per conteggio. Poiché la tensione varia di 10 millivolt per grado la risoluzione massima di questo termometro sarà di circa mezzo grado. Non è un gran chè. Ulteriori discussioni sulla formula da usare sono pura pignoleria, vediamo perché.
Per chi è poco pratico faccio un esempio con un AD converter di fantasia da 2 bit solamente. In questo modo i numeri che posso esprimere sono solo 4. 0 decimale o esadecimale= 00 binario; 1 = 01; 2 = 10; 3 = 11.
A questo convertitore posso applicare una tensione tra 0 e 9 volt, per facilità di conti. Un simile convertitore sarebbe poco pratico, ovvio, ma ci fa capire che un valore analogico in ingresso tra 0 e 1.5 Volt sarebbe interpretato come 00 in uscita. Un valore tra 1.5 e 4.5 centrato su 3 Volt darebbe un uscita di 01, e così via. E’ evidente una incertezza nelle misura di circa tre Volt.
Se questo è l’hardware come scrivere il software per far dire al computer il corretto valore misurato? Applicando una semplice proporzione cioè 9V sta a 3 conteggi come x sta al conteggio effettivamente misurato (9V:3=xV:cnt) che evidenziando xV = 9*cnt/3 permette di assegnare il giusto valore acquisito ad una variabile chiamata xV tramite il valore di conteggi cnt.
L’ A/D converter di ARDUINO è capace di assegnare alla tensione
di ingresso nel range tra 0 e 5 volt una serie di valori numerici compresi tra
0 e 1023. (1023 dec, 3FF esadecimale, 10 bit). Si intuisce che essendo il range
in ingresso diviso in più parti che non 3 l’incertezza di misura diventa più
piccola. La risoluzione, o anche dico l’incertezza, è pari a . Nel caso di 2 bit e 9V era 9/(2^2-1)=3 volt, nel caso di ARDUINO
5/(2^10-1) = 5/1023 = 4.8875……millivolt.
Le istruzioni di ARDUINO dicono che il fondo scala è 5 Volt, quindi assegnato al valore 3FF o 1023. supponendo il caso che invece fosse assegnato un po’ più in su, cioè a 400 hex o 1024 allora sarebbe giusto dividere per 1024.
5/1024 fa ….4.8828etc millivolt. È la precisione che l’hardware permette. Poiché a circa 5 millivolt corrisponde mezzo grado centigrado, /1023 o /1024 cambia qualcosa nella pratica??
Un termometro con una risoluzione di mezzo grado è buono appena per l’utilizzo hobbistico. In realtà il microcomputer ATMEL che usa ARDUINO è capace di una risoluzione maggiore che non 10 bit ma per poterla sfruttare si dovrebbe rinunciare alla facilità della programmazione ad alto livello e passare all’assembler.
La complicazione che ne segue porrebbe in discussione anche l’utilizzo dello stesso ARDUINO che è stato progettato per rendere la vita facile al programmatore inesperto. Quindi complimenti agli ideatori di questa comoda piattaforma di sperimentazione che è ARDUINO.
Si potrebbe però trasporre il valore di tensione utile a misurare da 5°C a45°C (2.75V-3.15V) a 0-5V con l’uso di un operazionale, complicazione che aumenterebbe la risoluzione del termometro a scapito del range di temperatura misurato.
Ho scritto questa nota a Termoli, in albergo, dopo aver divorato da Nicolino un ottimo brodetto alla termolese (porzione per due persone). Per cui buona fortuna oltre che buon divertimento. 73 de Alessandro IZ5AGZ.