Ago 182012
 
Eccoci giunti all’ultima puntata base su Arduino. Nelle puntate precedenti abbiamo utilizzato gli ingressi digitali, le uscite digitali e le uscite analogiche (PWM). Mancano, si fa per dire, solamente gli ingressi analogici dopodichè non ci resta che alzare l’asticella del livello di complessità e approfondimento leggermente più in alto. A cosa servono gli ingressi analogici di Arduino? Servono a misurare una tensione compresa fra 0 e 5V con una precisione di 10bit, ovvero una suddivisione in 1024 valori (da 0 a 1023) ossia 4.88mV. Quindi il discorso è semplice. Colleghiamo una tensione fra 0 e 5V ad uno degli ingressi analogici e Arduino la può misurare con una precisione di 4.88mV. Con questa tecnica possiamo collegare tutta una serie di di nuovi dispositivi che vanno dai sensori di luminosità, ai potensiometri, sensori di temperatura e quant’altro vi venga in mente.
Anche in questa lezione l’esempio sarà molto semplice per restare concentrati sul succo della lezione, poi nelle prossima puntata cercherò di riprendere tutti i concetti visti sinora per raggrupparli insieme ed approfondirli ulteriormente. Oggi vediamo come collegare un semplice sensore di luminosità e, visto che sinora non l’abbiamo ancora fatto, sfruttiamo la porta USB per inviare i valori letti al PC.

Porta seriale

Partiamo proprio da ques’ultimo punto. Se osserviamo la nostra scheda Arduino vediamo che i pin digitali 0 e 1 sono contrassegnati rispettivamente con Rx e Tx ossia la ricezione e trasmissione dei dati seriali. Questo significa che questi due pin possono essere utilizzati per traferire dati su una porta seriale verso altri dispositivi. Ovviamente nel caso vengano impiegati per questo scopo non possono essere usati in contemporanea anche per l’utilizzo come pin digitali generici. Vi potrebbero sorgere delle domande, del tipo “ma non dovevamo usare la porta usb?” oppure “ma non dovremmo mica interfacciare quei due pin con una porta usb?”. In realtà non dobbiamo fare proprio nulla perchè Arduino ha già tutto quello che ci serve. In pratica la porta USB condivide i pin 0 e 1 per cui inviando dati su quei pin essi sono visti dalla porta usb e viceversa per cui possiamo utilizzarle a nostro piacimento. L’unico accorgimento sarà appunto quello di non usare i pin 0 e 1 come pin digitali quando usiamo la porta usb per comunicare col PC. Faccio notare che sulla scheda, vicino al led della porta 13, ci sono altri due piccoli led contrassegnati proprio con Rx e Tx e che si illuminano quando facciamo transitare dati attraverso la porta USB motivo per cui in questo nostro esempio li vedrete in attività.
Ora potremmo decidere di usare qualche software di nostra scelta per visualizzare i dati che transitano dalla porta USB, ma in realtà il tool di sviluppo di Arduino già integra questa possibilità, infatti basta andare su Tools->Serial Monitor ed il gioco è fatto. Questa opportunità è generalmente sfruttata per fare il debug delle nostre applicazioni in quanto ci mette a disposizione un modo molto semplice per comunicare con la scheda.

Fotoresistore (LDR – CDS)

Ora vediamo il sensore di luminosità. Qui vicino ne vedete una foto. E’ composto da una parte piatta ove è posta la serpentina che “capta” la luce, e dai due piedini per il collegamento al circuito. Questo componente non è altro che una resistenza variabile, ossia il valore di resistenza cambia in modo inversamente proporzionale con il mutare della quantità di luce che lo colpisce. Per questo motivo se noi misuriamo la resistenza  con Arduino ricaviamo la quantità di luce che abbiamo nel nostro ambiente. Come lo colleghiamo? Molto semplice. Preleviamo i 5V dall’uscita 5V di Arduino e colleghiamo l’altro polo ad uno degli ingressi analogici di Arduino stesso. Ovviamente ci troviamo nel caso più semplice in assoluto, se avessimo avuto ad esempio un sensore alimentato a 12V con uscita fra -10 e +10V il discorso si complicava notevolmente, ma vediamo di fare piccoli passi, un po’ per volta. Vedrete comunque che pur nella sua semplicità anche questo circuito avrà bisogno di alcuni aggiustamenti e fra poco vedrete perchè. Per questo motivo vi dico di non fare nulla, per ora, ci avviciniamo passo a passo allo schema finale. Se invece preferite testare tutto il percorso fate pure, acquisirete maggior padronanza dell’argomento.
Anche i fotoresistori non sono tutti uguali per cui a parità di luminosità, modelli diversi avranno valori di resistenza differenti. Mediamente, comunque, partiamo da valori di pochi Ohm con massima luminosità, per arrivare a 20-50, sino a 200K o più con scarsa luminosità per salire fino a qualche decina di MegaOhm, dopo una decina di minuti di buio completo. Come sempre noi avremo già il nostro fotoresistore nel cassetto o l’abbiamo comperato a caso non avendo idea di cosa fosse o lo abbiamo preso con qualche kit di cui abbiamo perso ogni riferimento tecnico. Indipendentemente da ciò lo schema a lato non dovrebbe presentare problemi di funzionamento, anche senza sapere i valori di resistenza: con il buio abbiamo un’alta resistenza per cui la tensione misurata sarà vicina allo zero e con tanta luce la resistenza sarà molto bassa e la tensione misurata sarà prossima ai 5V. Allora non ci resta che provare. Costruisco il circuito qui a lato e proviamo uno sketch semplice, semplice. Fa’ al coso nostro l’esempio “AnalogInput” presente di base nel tool di sviluppo di Arduino a cui facciamo alcune modifiche.

Due parole sulla sketch

Vale la pena spendere due parole in più sul listato anche se è tutto commentato. Intanto vi faccio notare nel setup l’istruzione Serial.begin(9600) che apre la porta seriale a 9600baud. Finchè non viene data questa istruzione non è possibile inviare dati sulla porta seriale.
La funzione analogRead è quella che ci consente di leggere il valore analogico dal pin prescelto, come vedete si usa in modo del tutto identico a quanto avviene per i pin digitali.
Altra cosa da notare è che nelle istruzioni delay abbiamo inserito un ritardo pari al valore letto dal fotoresistore, in questo modo il valore varia da 0 a 1023 in base alla lettura analogica così si modifica la velocità di lampeggiamento del led  a seconda della luminosità ambientale.
L’istruzione Serial.print() serve ad inviare sulla porta seriale i dati che desideriamo. La println fà la stessa cosa ma dopo la stampa manda a capo su una nuova linea, altrimenti tutti i valori verrebbero riportati uno dietro l’altro.
int Fotoreistenza = 0;     // Utilizzo del pin 0 per la lettura dei valori del fotoresistore.
int Led = 13;             // Pin 13 per l'utilizzo del LED interno
int Valore = 0;          // Variable usata per memorizzare il valore letto dal fotoresistore

void setup() 
{
 Serial.begin(9600);      // Inizializzo la seriale   
 pinMode(Led , OUTPUT);  // il pin del LED è usato come OUTPUT:  
}

void loop() {

  Valore = analogRead(Fotoreistenza );        // Legger il valore da fotoresistore    
  digitalWrite(Led , HIGH);                  // Accende il LED interno
  delay(Valore);                            // Interrompe il programma per un numero di millisecondi pari a quanto letto dal fotoresistore
  Serial.print("Valore luminosità = ");
  Serial.printll(Valore);                 // Stampo nella seriale il valore letto dal fotoresistore (si noti che qui ho usato la println)
  digitalWrite(Led , LOW);               // Spegne il LED interno   
  delay(Valore);                        // Interrompe il programma per un numero di millisecondi pari a quanto letto dal fotoresistore
}
Ora se testiamo il circuito cosa succede? Facciamo un paio di prove sia con il resistore in piena luce che coperto per simulare il buio. Che valori otteniamo? Nel mio caso ho avuto valori compresi fra circa 900 e 1023, peraltro con chiara evidenza di una notevole instabilità della misura.  Balza all’occhio che pur avendo testato le due situazioni estreme, non copriamo tutta la scala di valori compresi fra 0 e 1023, questo perchè la nostra semplice applicazione non sfrutta tutta tutta la scala di valori della resistenza fotosensibile, anzi, ne sfrutta una piccolissima parte. Quindi dobbiamo trovare un modo per normalizzare la scala del fotoresistore a quella del nostro ingresso analogico, ossia fare in modo di sfruttare tutta la scala di Arduino per leggere i valori di resistenza utili ai fini pratici. Come facciamo?

Partitore di tensione

Il partitore di tensione è una tecnica basilare dell’elettronica che consiste nell’usare due resistenze in serie per ottenere un valore di tensione voluto. Lo schema è molto semplice, simile a quello qui vicino. La tensione V2 sarà prelevata fra V2 e Gnd e può essere calcolata con la classica formula: V2=V1*R2/(R1+R2). La prima cosa interessante da notare è che il fotoresistore può essere messo a scelta sia al posto di R1 che al posto di R2 ma, in base alla posizione assunta, cambierà il risultato finale, infatti l’aumento di R1 comporta una riduzione di V2, mentre l’aumento di R2 comporta un aumento di V2.

L’altra cosa che possiamo dire è che una delle due resistnze è il nostro fotoresistore e ci basta un multimetro per conoscerne i valori: vi basterà collegare il fotoresistore al vostro tester e leggere i valori al buio completo e sotto la luce di una lampadina o in pieno sole. Si noti comunque  che anche prendendo due fotoresisori identici, questi avranno risposte leggermente diverse in quanto la tecnica produttiva è poco precisa e anche nello stesso lotto di produzione ci saranno fotoresistori con caratteristiche leggermente diverse.

Nel mio caso ho preso il fotoresistore comprato anni fa e di cui non ho idea dei valori di resistenza. In piena luce ho ottenuto circa 140Ω mentre al buio il tester mi segna circa 320 KΩ.
Con un valore noto è semplice ricavare quale debba essere il valore dell’altra resistenza. E’ sufficiente usare la formula del partitore e fare alcuni passaggi algebrici, è comunque sufficente ricordarsi che la resistenza ignota è uguale alla radice del prodotto della resistenza offerta dal fotoresistore alla massima e minima luminosità. Se siete interessati ad una dimostrazione matematica vi rimando a questo link. Nel nostro caso possiamo pensare di mettere il fotoresistore al posto di R2 ed al posto di R1 una resistenza pari alla radice di 140×320000, ossia 6693Ω, il cui valore commerciale per eccesso più prossimo è quello di 6.8KΩ. Guarda caso il valore è relativamente vicino al valore di 10KΩ che troverete consigliato in pressochè tutti i tutorial pubblicati in rete, solo che nessuno fornisce una spiegazione sulla scelta del valore. Ora possiamo aggiustare il nostro circuito iniziale e rifare i test a luce piena e al buio. Come spesso accade quando sono andato a cercare la resistenza calcolata non c’è l’avevo in casa per cui ho usato il potenziometro dello scorso articolo, fissato a 6.8K.
Bene, ora che il circuito è pronto: riproviamo a leggerei valori misurati. Le cose vanno meglio e si passa da un minimo di 15 alla massima luminosità a 944 al buio (da quasi attaccato alla lampada alla copertura con un pezzo di metallo nero). Non è esattamente il 100% della scala disponibile ma siamo molto vicini per cui ritengo il risultato più che soddisfacente.
Anche questo articolo è terminato e vi lascio con il video conclusivo della sketch in opera.

 

 

  5 Responses to “Arduino e gli ingressi analogici”

  1.  

    Si la spiegazione mi è servita.
    Ho provato a fare un Luxmetro con fotoresistenza, ma non riuscivo ad ottenere una escursione sufficiente dei valori.

    Ho messo una R2 di 47k e quindi penso proprio vista la spigazione che il valore non sia giusto.

    Provo a ricacolare il valore con le indicazioni e vediamo..

    Ho comunque pronto un secondo progetto di luxmetro.

    Grazie

    •  

      ottimo…Sto puntando molto a scrivere articoli che si differenzino dagli altri, non voglio limitarmi a scopiazzare come fanno in molti, io vorrei capire ogni singolo passaggio e riuscire a trasferire questa conoscenza a chi ne ha bisogno.

      Chiedo scusa se i commenti non compaiono subito, il problema è la valanga di spam che arriva per cui per ogni utente deve venire approvato almene un commento da parte mia, altrimenti ci troviamo pieni di pubblicità su certe pillole blu…e non solo..

  2.  

    Innanzitutto, grazie mille per tutto l’interessantissimo materiale che pubblichi con precisione e professionalità. Dopo estenuanti ricerche, credo che il tuo blog possa essere considerato, senza dubbio, un punto di riferimento per la community italiana di arduino.
    Volevo fare una domanda sul primo esempio di circuito considerato in quest’articolo (per intenderci, quello senza partitore di tensione): ma non si rischia di bruciare il piedino A0 di arduino, in caso di alte luci, ovvero quando la resistenza del fotoresistore si abbassa drasticamente? Così, senza alcun resistore interposto, risulta direttamente collegato alla 5V e quindi gli arriva una corrente superiore a quella che è in grado di supportare.
    Grazie mille!

    •  

      Intanto grazie per i complimenti, mi fanno sempre molto piacere.
      Per quanto riguarda la risposta direi di no.
      Non usando il partitore hai una misurazione poco precisa per cui di base sarebbe una scelta da scartare, ma non è detto che il tuo progetto abbia bisogno di fare misurazioni accurate. Per quanto riguarda il il rischio di bruciare il pin ti direi di no in quanto la resistenza non è è mai pari a 0. Nel mio caso anche attaccato il sensore ad una lampadina ottenevo 900 Ohm. Ricordiamo che i pin di Arduino sopportano una corrente massima continua di 40mA, ma è buona norma non superare mai la metà ossia 20mA. Se usi una tensione stabilizzata 5V come quella in uscita da Arduino, grazie alla legge di Ohm puoi calcolare che la resistenza minima da applicare è di 250Ohm (normalmente si usano da 470 che fanno passare circa 11mA). Come vedi nel caso di quel fotoresistore abbiamo una resistenza minima di 4volte quella necessaria (900 vs 250) per evitare rischi di bruciatura del pin.
      Comunque se vogliamo fare una generalizzazione, la resistenza è meglio metterla SEMPRE e direi il più vicino possibile al pin. Questo per due motivi. Da una parte non rischi di bruciare il pin se cambi sensore mettendone uno che ha una reistenza molto più bassa, dall’altra eviti rischi se fai un cortocircuito che manda direttamente i 5V al pin di arduino. E’ esperienza comune che lavorando sulla board, magari già alimentata perchè stiamo facendo delle misurazioni cou un tester o un oscilloscopio e proprio con la sonda mandiamo in contatto i 5v con l’ingresso al pin o più banalmente facciamo toccare i due ingressi del fotoresistore. Se a quel punto c’è una resistenza di protezione non succede nulla, altrimenti il rischio di bruciare il pin c’è.

      •  

        Perfetto! Grazie mille per la risposta, come sempre, esaustiva. Mi era sfuggito che il valore ohmico minimo del fotoresistore non è mai pari a 0. Se non si fosse capito, sono ancora alle prime armi con l’elettronica in generale =)