Arduino e sensori analogici

Da GolemWiki.
Versione del 31 ott 2012 alle 17:49 di Giulio (discussione | contributi) (bozza)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
File:Analogpin.gif
Piedini analogici
File:Analogsig.gif
Segnale analogico

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.

File:Trimmer-schema.gif
Funzionamento di un potenziometro

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.

Arduino-trimmer.gif
//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);
}
File:Fotores.jpg
Fotoresistenza: completamente illuminata ha una resistenza di circa 20K, mentre se si trova al buio di 500Ω

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.