Arduino e sensori analogici
Dai piedini analog si possono leggere tensioni variabili da 0 a 5v, che Arduino trasforma in valori da 0 a 1023: il sensore analogico più facile da trovare è il potenziometro, come quello per regolare il volume delle casse. Fisicamente è composto da 3 piedini ed al suo interno è presente una striscia di materiale resistente: se il potenziometro è da 20KΩ, quella striscia resiste 20KΩ; i piedini laterali sono collegati alle due estremità di questa striscia, mentre quello centrale è collegato ad un perno che può muoversi a contatto quando giri la manopola (vedi figura sotto). Se non sai che resistenza può produrre il tuo potenziometro collega il multimetro in funzione ohmetro ai piedini laterali e puoi leggerne il valore.
Elettronicamente, il potenziometro è un partitore di tensione: se lo alimenti dai piedini laterali, collegandolo ad una batteria, dal piedino centrale potrai leggere con il multimetro in modalità voltmetro una tensione che varia ruotando la manopola. Prova adesso a collegare il potenziometro ad Arduino: un piedino laterale a massa e l'altro a 5v, mentre quello centrale al piedino analog 0.
//analogico.ino const short sensore = 0; const short led = 13; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { Serial.print("Lettura: "); Serial.print(map(analogRead(sensore),0,1023,0,5)); Serial.println(" V"); delay(200); }
Caricato il listato apri il serial monitor di Arduino, cliccando sul bottone 15px e vedrai apparire la tensione sul piedino. Ruotando da una parte il potenziometro puoi incrementare fino a 5v, mentre ruotandolo dall'altra decresce fino a 0. Per adesso non ti preoccupare di come abbiamo fatto a comunicare col computer, ne parleremo nelle prossime pagine.
Per leggere il sensore si utilizza la funzione analogRead(sensore)
, analoga a quella usata per il bottone, che come avrai visto legge il valore campionato dal convertitore analogico digitale del microchip.
Il convertitore analogico digitale (ADC) ha una risoluzione a 10 bit: questo significa che converte la tensione 0-5v
in valori 0-1023. Per scoprire il valore originario della tensione presente sul piedino basta fare una semplice proporzione, svolta in automatico dalla funzione map.
Resistenze variabili: come fare un crepuscolare
Tutte le resistenze variabili vanno combinate con una seconda resistenza, a formare un partitore di tensione: un piedino va collegato a massa, l'altro ai 5V attraverso la seconda resistenza. Alcune resistenze variabili sono i sensori di pressione, le termoresistenze, le fotoresistenze (si può intuire dai nomi a cosa servano); con questo schema puoi provare a realizzare un crepuscolare, ma se vuoi usare un altro dei sensori di cui parlavo prima, rimane quasi invariato.
//crepuscolare.ino const short sensore = 0; const short led = 13; int soglia = 300; void setup() { pinMode(led, OUTPUT); } void loop() { if (analogRead(sensore) > soglia) digitalWrite(led,LOW); else digitalWrite(led,HIGH); }
In questo programma il led 13 si accende se viene letto un valore inferiore alla soglia, che ho impostato a 300; questo valore dipende dal sensore che usi: può variare anche da fotoresistenza a fotoresistenza; quindi ti chiederai come trovare un valore limite per far accendere il led... se sul componente è stampato un codice puoi provare a cercare il datasheet, in modo da avere i dati abbastanza precisi, altrimenti tester alla mano e passa alle prove empiriche, come nell'imamgine sopra. Se hai tempo puoi anche caricare un programma di test e farti inviare sul computer (come ho fatto prima col potenziometro) i valori.
Un consiglio... in questi casi è comodo usare un trimmer al posto della resistenza fissa: così puoi regolare il tuo crepuscolare (o qualsiasi altro progetto sia) senza dover intervenire sul programma.
Altri sensori analogici: leggere la temperatura
Alcuni componenti sono già pronti all'uso perché ripartiscono la tensione senza troppi problemi, quindi basta alimentarli e leggere l'output dall'apposito piedino, per esempio l'accelerometro ADXL335 e il termometro TMP36, tanto per citare alcuni modelli; Vediamo un esempio
Dopo averlo collegato, bisogna interpretare il segnale ricevuto: il datasheet dice che lo 0°C è a 500 mV, e ogni grado Celsius sono 10 mV; 510 mV sarà 1°C, 600 mV 10°C. Quindi:
temperatura = (volt - 0.500)/0.010
Ma i pin analogici non danno i valori in millivolt, quindi bisogna convertire: dividendo l'output per 204.6, si ottiene il valore in volt; in conclusione
temperatura = (output/204.6 - 0.500)/0.010
//termostato.ino const short sensore = 0; const short led = 13; int soglia = 18; //18 gradi celsius void setup() { pinMode(led, OUTPUT); } void loop() { if ((analogRead(sensore)/204.6 - 0.500)/0.010 > soglia) digitalWrite(led,LOW); else digitalWrite(led,HIGH); }
Un semplice programma che simula un termostato: il led si accende se la temperatura scende sotto la soglia impostata in gradi centigradi.