Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

9
voti

Sensore a infrarossi con rivelazione sincrona

Il sensore di cui parlo è costituito da un diodo emittente nell'infrarosso e da un adatto fototransistor, appaiati in una piccola custodia rettangolare. Esso si trova solitamente in commercio con la sigla CNY70 oppure QRD1114, con piccole differenze fra queste due versioni. La funzione di un cosiffatto sensore è quella di rivelare la presenza di un corpo riflettente che sia posto frontalmente a breve distanza dall'elemento sensibile, tipicamente meno di 1 cm. Quindi questo sensore si rende utile nel campo della robotica, per esempio nelle stampanti lo possiamo trovare come sensore di presenza carta.

Indice

La particolarità del caso in esame

Il diodo emittente viene solitamente alimentato in corrente continua; nel presente articolo mostrerò invece un diverso arrangiamento, basato su un microcontrollore che alimenta il detto diodo con una corrente a bassa frequenza, ed elabora il segnale riflesso con la tecnica della rivelazione sincrona.

Questa tecnica è quì molto agevolata dal fatto che lo stesso software, che comanda l'accensione e lo spegnimento del diodo emittente, è quello che interpreta il segnale analogico di ritorno, quindi è "sincrono" di fatto per propria natura. E' noto che la rivelazione sincrona costituisce una tecnica eccellente per discriminare il segnale di proprio interesse, e alla fine otteniamo come risultato pratico che la distanza a cui il sensore può lavorare arriva ad almeno 5 cm tranquillamente, ma può anche arrivare a 25 cm con una taratura più spinta nel caso che non ci siano da temere disturbi ambientali nell'infrarosso.
Si noti che il sensore CNY70 è caratterizzato nel data sheet per distanze fino a 10 mm.

Lo schema elettrico

Il microcontrollore prescelto è un AtTiny45 che ha soli 8 piedini ed è dotato di un Analog to Digital Converter a 10 bit, che non sono molti ma possono bastare.
Il trimmer da 47 kohm serve per compensare gli eventuali infrarossi presenti nell'ambiente e può anche essere sostituito con una resistenza fissa da 10 kohm.
I led indicatori sono stabilmente connessi, tramite resistenze da 820 ohm, agli stessi pin MISO e MOSI che si utilizzano per la programmazione; ciò in pratica non arreca alcun disturbo, se non il semplice fatto di vedere lampeggiare i led in occasione della programmazione. Le due resistenze da 4,7k e 56k in paralello servono per dare una tensione di 5 V esatti alla MCU.

La scelta della frequenza

Osservando con l'oscilloscopio il segnale analogico sul pin 3 della MCU, ci rendiamo conto che la risposta del fototransistor è molto lenta. Pertanto non c'è nessun vantaggio ad aumentare la frequenza fino al punto da tagliare il segnale, e d'altra parte una frequenza troppo bassa rallenterebbe la risposta complessiva. Nella figura quì sotto riportata, si vedono l'onda quadra che alimenta il led emittente e il segnale analogico di ritorno sul pin 3, chiaramente tagliato. Alla fine si è scelto un valore di 1250 Hertz cioè un periodo T pari a 0,8 msec.

infra.JPG

infra.JPG

L'elaborazione in tempo reale

Il timer 1 del microcontrollore fornisce un interrupt ogni 0,4 msec cioè al termine di ogni semiperiodo. La relativa Interrupt Serving Routine, se il led emittente si trova spento cioè se il semiperiodo terminato è quello buio, prende la lettura dello ADC e da essa sottrae la lettura precedente, quindi accende il diodo emittente. Se invece il led emittente si trova acceso cioè se il semiperiodo terminato è quello illuminato, allora la stessa ISR prende la lettura dello ADC e fa la differenza inversa: lettura precedente meno lettura attuale, quindi spegne il diodo emittente.
In tutti i casi la lettura attuale viene salvata e servirà come lettura precedente per il successivo intervento della ISR.
La differenza, come sopra calcolata, dovrebbe sempre risultare positiva e in caso contrario viene scartata cioè azzerata. (P.S. questa correzione è risultata peggiorativa quindi è stata tolta). Detta differenza rappresenta il segnale utile; esso viene moltiplicato per 16 mediante uno shift e poi filtrato con un filtro passa-basso avente una costante di tempo pari a 16 semiperiodi, infine viene passato al Main Program. Notiamo che il filtro opera uno shift a destra tuttavia non ci dovrebbe essere alcuna perdita di precisione dovuta a troncamento, appunto perchè il dato è stato già shiftato a sinistra in partenza. Il Main Program a sua volta confronta il valore ricevuto con una sua soglia di decisione per determinare se vi è, o meno, la presenza del segnale riflesso. Questa soglia di decisione può avere un valore di poche unità nel caso che non vi siano da temere disturbi ambientali nell'infrarosso. Può essere curioso riflettere sul fatto che in tal caso abbiamo una sensibilità di rivelazione migliore della risoluzione dello ADC, grazie alla rivelazione sincrona adottata e a un tempo di filtraggio abbastanza lungo.

Il prototipo

E' stato realizzato su millefori senza troppo ammattire con lo sbroglio degli incroci, cioè quando mi ha fatto comodo aggiungere un filo lo ho fatto senza tanti scrupoli.

fotoinfra2.jpg

fotoinfra2.jpg

Il sistema di sviluppo

Sul mio PC portatile ho installato Bascom AVR e AVR Studio 4. Il Bascom lo uso come compilatore Basic, poi il file .hex prodotto lo riverso sulla MCU tramite AVR Studio 4 con un programmatore Olimex che si collega al PC tramite porta USB e si collega alla MCU tramite porta ISP a 6 pin. Tutto questo pasticcio perchè Bascom non mi consente di usare la porta USB, almeno non col mio programmatore, e alla fine mi trovo nell'impossibilità di usare il Debug. Il source è lungo una cinquantina di righe ed è a disposizione, la flash memory utilizzata è 18%.

Come suggeritomi, aggiungo un link per il source:
http://www.electroyou.it/forum/viewtopic.php?f=17&t=67527
Nel frattempo sono stati apportati alcuni miglioramenti al programma, per esempio l'interrupt non è più dato dal Timer1 bensì dallo stesso ADC. La questione su cui ancora si potrebbe lavorare è quella di attenuare meglio i disturbi, soprattutto quelli prodotti dalle lampade a incandescenza.

4

Commenti e note

Inserisci un commento

di ,

Per non fare il doppio passaggio Bascom - AVR studio potresti usare un programmatore USBasp che è supportato da Bascom. Lo si trova a qualche euro sui soliti siti già pronto, in alternativa te lo puoi anche costruire, una manciata di componenti ed in rete c'e' tutto. Se ti serve ho lo sbroglio del circuito stampato di quello che ho realizzato io

Rispondi

di ,

Ciao, il codice si può inserire tra i tag

 
.

Rispondi

di ,

Sì, è disponibile ma non sono riuscito ad allegarlo.

Rispondi

di ,

Interessante, il codice necessario è disponibile?

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.