Cerca

modulo attività

modulo tecnica

Utilizzare i sensori con Arduino/GenuinoArduinoUnoA

I sensori sono componenti elettronici che producono una tensione che dipende da un fenomeno fisico (posizione, angolo, temperatura, luce, suono, pressione, concentrazione di sostanze ....)

Con i sensori i circuiti elettronici possono essere messi in grado di modificare il proprio funzonamento in base ad un fenomeno fisico.

La scheda Arduino ha ingressi analogici e digitali che sono previsti per essere collegati a dei sensori in modo che il software possa tenere conto dei valori che assumono le grandezze fisiche e agire di conseguenza come previsto dal programmatore.

Un'ampia spiegazione si trova a questo link.

In questo articolo si trattano questioni d'uso dei sensori analogici.

Ingressi analogici di Arduino, digitalizzazione e sensori.

La scheda Arduino ha sei pin di ingresso analogico A0-A5.

Funzionano solo da ingressi e quindi per usarli non c'è bisogno di alcuna dichiarazione.

 

Uso degli ingressi analogci

Un ingresso analogico ammette tensioni variabili da 0 a 5V (che è la tensione di alimentazione di Arduino/Genuino).

 

Un convertitore Analogico-Digitale interno, detto ADC, converte una tensione nella gamma 0-5V in un numero intero a 10 bit, quindi in un numero intero nella gamma 0-1023.

La relazione é di diretta proporzonalità ed è:A0 vs Vu

Vu : 5 = num-digitale : 1023

dove Vu è la tensione in uscita del sensore ed è rappresentata dal grafico a destra:

Il numero digitale è per forza approssimato in quanto i valori che può assumere la tensione Vu sono infiniti mentre il convertitore ne fornisce 1024.

Per saperne di più leggi "Convertitore Analogico Digitale"

Per conoscere il numero digitale convertito, data la tensione, l'espressione è:

num-digitale = Vu * 1023 /5

e si approssima al numero intero più vicino. 

 

Con l'istruzione

analogRead(sensorPin);

la scheda Arduino/Genuino effettua la conversione del valore di tensione presente sul pin Analogico (indicato da sensorPin) ..... e nient'altro ... il valore non è ancora acquisito dal software!

Perchè il programma possa tenere conto del valore letto ed utilizzarlo occorre fare in modo che una variabile, per esempio "sensorValue", assuma quel valore; questo lo si fa con l'struzione di assegnazione:

sensorValue = analogRead(sensorPin);

 

L'uscita del sensore analogico deve essere accoppiata all'ingresso analogico della scheda Arduino con le seguenti precauzioni:

- dato che la scheda Arduino Uno viene alimentata a 5V non si devono avere tensioni agli ingressi analogici inferiori a 0V e superiori a 5V;

- per sfruttare al meglio la conversione è bene che la gamma delle tensioni in uscita dal sensore sia prossima a 0-5V (nota 1);

- l'impedenza di uscita del sensore può essere molto elevata in quanto l'ingresso analogico non assorbe praticamente corrente avendo un'impedenza di ingresso con valori intorno a 100 - 200MΩ.

Un panoramica di sensori la si trova qui, su wikipedia.


Sensori analogici generatori di tensione.

Alcuni sensori analogici producono essi stessi una tensione che viene utilizzata così come è se rispetta i requisiti di accoppiamento di cui sopra, altrimenti si usa un amplificatore di tensione oppure un riduttore.

Sono tali i sensori come le testine magnetiche o piezolelettriche dei riproduttori sonori, i microfoni, le dinamo tachimetriche, molti circuti integrati a semiconduttori come i sensori attivi di temperatura ...

 

Sensori Analogici a partitore di tensionepartitoreV

Molti sensori vengono realizzati utilizzando la proprietà di far dipendere la propria resistenza elettrica da grandezze fisiche ambientali, talvolta vengono detti sensori ohmici:

- i termistori hanno una resistenza elettrica che dipende dalla temperatura

- le LDR hanno una resistenza elettrica che dipende dalla luce (esattamente dall'illuminamento, i lux)

In tal caso li si collega in serie ad un altro resistore nella configurazione detta a partitore di tensione dove R1 o R2 è il sensore e l'altro è il resitore aggiunto ed è di valore fisso, che va scelto in modo da ottimizzare la sensibilità del sensore (spesso si usa un trimmer per aggiutare la resistenza).

In questo modo la tensione Vu dipende dal valore delle due resistenze come segue:

 Vu = VG*R2/(R1+R2)

A seconda se il sensore si metta nella posizione R1 o nella posizione R2 si hanno due comportamenti opposti:

Se il sensore occupa la posizione di R1, quando aumenta la sua resistenza Vu diminuisce

Se il sensore occupa la posizione di R2, quando aumenta la sua resistenza, la Vu aumenta

Per ripassare il funzionamento del partitore di tensione vai qui.

Il valore letto e convertito dalla porta analogica sarà utilizzato dal software tipicamernte in due modi diversi:

- viene confrontato con un valore fisso, detto di soglia, per consentire un cambio di funzionamento con l'istruzione "se/altrimenti" come nell'esempio seguente dove, per rendere automatico il passaggio del funzonamento da notturno a diurno di un semaforo, viene usata una LDR per misurare la luminosità del cielo. Se il valore sem_giorno è maggiore di 500 vuol dire che c'è luce, cioè è giorno, per cui viene chiamata la procedura per il giorno altrimenti viene chiamata la procedura per la notte:

if (valoreGiorno>500)
{
procedura sem_giorno();
}
else
{
procedura sem_notte();
}

 

- viene utilizzatoper avere valori diversi da trattare o per produrre effetti su uscite analogiche come nell'esempio seguente dove il valore di ingresso della gamma 0-1023 viene ricondotto alla gamma 0-255 e poi nviato a comandare una uscita PWM (Esempi/AnalogInOutSerial):

void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);

.........

}

Alcuni esempi

MIchele Maffucci: link

Antonio Mancuso: link

Mauro Alfieri: link

 

Ovviamente gli ingressi analogici si possono usare anche con S4A.

Un elenco di sensori per Arduino lo trovi nel blog di Antonio Mancuso.

 

Note

nota 1: se la gamma delle tensioni è inferiore non si sfrutteranno tutti i bit a disposizione e la conversione, di fatto non sarà a 10 bit. Se la gamma delle tensioni in uscita del sensore è, poniamo, 0-1V, di fatto si sfrutta un quinto della gamma e la conversione produrrà valori nella gamma 0-205 come se fosse una conversione a 8 bit!