Prodotti
gbm
Sensore prossimità LED
Tutorials -
Domenica 11 Aprile 2010 16:03
Scritto da gbm

I sensori di distanza o ostacoli sono dei componenti desiderati da qualsiasi appassionato di robotica e molto spesso implicano la maggiore spesa nella costruzione del proprio automa. Con questo tutorial vi mostrer√≤ il sensore per ostacoli, movimento (quindi PIR) e luce ambientale meno costoso in assoluto (e l'algoritmo E.R.E.R. creato dal team di gioblu robotics, necessario al funzionamento del sensore). Dopo almeno quattro anni di sperimentazione su sensori basati sui LED ho deciso di scrivere questa guida di riepilogo per comunicarvi innanzitutto il funzionamento e il principio fisico che permette ai sensori ERER di funzionare, ma anche per illustrarvi le mie varie sperimentazioni e alcune delle strade portate avanti dalla comunit√† scientifica e industriale in questo ambito. Come ben ci spiega wiki un LED √®  un dispositivo optoelettronico che sfrutta le propriet√† ottiche di alcuni materiali semiconduttori per produrre fotoni attraverso il fenomeno dell'emissione spontanea ovvero a partire dalla ricombinazione di coppie elettrone-lacuna.

 


(il robot va in retromarcia per pura comodità di posizionamento breadboard)

 

 

Cosa succede se collego un LED al contrario?

In una situazione normale un LED connesso al contrario si comporta come un diodo, a tensioni elevate si frigge in pochi secondi e il risultato √® l'annerimento della giunzione e totale distruzione del componente. Con un po' di accortezza, un buon programma su una qualsiasi MCU o Arduino √® possibile imporre al componente una tensione opposta a quella per cui √® stato progettato, al fine di ottenere un valore che rappresenta la luce che colpisce la giunzione , trasformando cosi' lo strumento piu' usato al mondo per produrre luce, in un sensore di luce. Come per molti altri componenti elettro-fisici (come la cella di peltier per esempio) √® possibile utilizzare in modo opposto il LED e ottenere ottimi risultati utilizzandolo come sensore. Tutto cio' √® possibile solo grazie a una interessante propriet√† fisica del LED cio√® la variazione del tempo di scarica della capacitanza in rapporto alla luce che colpisce la giunzione. In parole povere, immettendo corrente positiva nel polo negativo viene caricato il LED di capacitanza, interrompendo il flusso di tensione possiamo sperimentare un tempo di scarica che varia in rapporto alla luce che colpisce la giunzione. Infatti questo componente se √® colpito da sole diretto per esempio, avr√† tempi di scarica vicini al millis(), al buio invece tempi di scarica nell'ordine dei secondi.

 

Come puo' essere utilizzata questa particolarità?

Non sono il primo ad aver pensato di utilizzare questa propriet√† fisica del LED per ottenere input sull'illuminazione presente. Le idee nate intorno a questo ambito sono molte, sensori crepuscolari / di luce, sensori di distanza, fotometri, riflettometri e molto altro. Io ho iniziato la mia sperimentazione 3 o 4 anni fa scoprendo l'esempio LED sensor sul sito di Arduino. Dopo aver ottenuto i primi risultati ci sono volute poche ore di gioco per arrivare all'idea di aggiungere un altro LED infrarosso e realizzare un semplice sensore di distanza. Dopo 4 anni il sensore ERER √® una realt√† nazionale e inizia a essere utilizzato anche all'estero, con la sua semplicit√† colpisce tutti quelli che hanno provato a costruirlo. Ma questa √® solo una strada, le possibilit√† sono molte e le strade percorribili ancora da inventare ancora di piu'. Per esempio due coppie di LED potrebbero essere usati per comunicazione logica bidirezionale. Infatti uno dei miei prossimi goal √® proprio sviluppare un semplice esempio per costruire una connessione wireless che permetta l'uso della seriale con solo 4 LED.

 

Materiale necessario

  • 2x LED infrarossi
  • 1x resistenza 1 ohm
  • 1x resistenza 100 kohm
  • breadboard o qualsiasi altro supporto

 

Schema di collegamento (Il LED sinistro è il ricevitore il LED destro l'emettitore)

Il sistema è composto da un LED ricevitore (il sinistro) che ha polo positivo connesso a GND e con polo negativo alla porta 12 tramite una resistenza da 1 ohm.

Il LED destro è l'emettitore che è connesso come un normale LED, cioè polo positivo connesso a porta 13 tramite resistenza da 1kohm e polo negativo in GND.

Come potete vedere in questo video √® possibile non utilizzare le resistenze e la breadboard e utilizzare i LED direttamente connessi ai pin di arduino.

Versione senza resistenze

ERER_wiring

 

Versione con resistenze

ERER_wiring_resistenze

 



Come funziona l'algoritmo E.R.E.R. (Emission, receiving and exposure regulator)

L'algoritmo che ho realizzato e rilasciamo sotto Creative Commons permette di percepire l'irraggiamento ambientale medio che colpisce il LED ricevitore e l'eventuale riflesso dell'irraggiamento del LED emettitore dato da un ostacolo.


Il sensore compie due tipi diversi di lettura della luce ambientale:

  • lettura con emettitore IR spento
  • lettura con emettitore IR acceso

La prima versione realizzata dell'algoritmo, generava un output vicino allo 0 se fuori range e molto alto con ostacolo vicinissimo:

lettura con emettitore acceso - lettura con emettitore spento = risultato

Dopo vari test ho trovato un'equazione che genera un output perfetto per noi:

distance = emission * (ambient / (ambient - emission));

Sembra complesso ma significa semplicemente:

distanza = valore lettura emettitore acceso * ( valore lettura luce ambientale / (  valore lettura luce ambientale -  valore lettura emettitore acceso))

Questa equazione genera un valore numerico che è molto alto se l'ostacolo è lontano o fuori range e un valore numerico vicino allo 0 se l'ostacolo è a contatto o molto vicino, cioè proprio quello che avevamo bisogno per ottenere un output simile a un distanziometro / range sensor. All'algoritmo sono state aggiunte alcune variabili che permettono di regolare l'output di distanza in mm in modo tale da ottenere un valore corretto. Ogni LED infrarosso si comporta in maniera leggermente differente e ha tempi di scarica differenti, per questo è necessario effettuare il setup per ottenere un valore di distanza correllato a quella reale.

 

Il codice - clicca qui per scaricare il file gia pronto

Questo programma si occupa di generare un valore di distanza in mm di un eventuale ostacolo posto davanti al sensore. Fino a 2 metri di distanza i valori sono piuttosto precisi (eccetto in condizioni di forte luce solare diretta), anche se in condizioni di scarsa luce ambientale si possono raggiungere range massimi oltre i 5 metri. Come potete vedere il codice non √® molto lungo e si occupa di eseguire l'algoritmo ERER e di conseguenza di effettuare le due letture necessarie per ricavare il valore di distanza.  Per ottenere un buon risultato √® necessario eseguire il setup. Per farlo √® necessario caricare questo programma e modificarlo per vedere in serial monitor setDistance. Fatto cio' testate il sensore nelle condizioni (soprattutto di luce ambientale) in cui verr√† utilizzato. Dovrete individuare il valore di distanza piu alto che ottenete, assicurandovi che il sensore stia percependo qualcosa, per farlo posizionate il sensore davanti a un ostacolo e indietreggiate finch√® il valore di setDistance √® correlato al vostro movimento e alla crescita della distanza. Trovato il range massimo del vostro sensore, dovrete inserire in maxRangeSetDistanceValue il valore di setDistance che ottenete al range massimo e poi misurare la reale distanza in mm tra sensore e ostacolo (il piu' precisamente possibile) per poi inserirla in maxRange. Fatto cio' dovreste gia ottenere un valore di distanza piuttosto fedele, per affinare la crescita del valore, identificate la distanza a cui il sensore inizia a dare un valore di distanza differente dal reale (superata la zona di "fuoco" che io ottengo a 15mm) e inseritela in startDriftDistance. Con gain potete regolare la risposta fino ad ottenere un valore di distanza preciso.

#define irEmitter 13   // polo positivo emettitore - positive emitter pin
#define irReceiverN 12  // polo negativo ricevitore - negative receiver pin
long ambient = 0;
long emission = 0;
long distance = 0;
long setDistance = 0;
long lightTime = 0;
int currentInit = 0;
//// Valori di setup - setup&tune values ////
long gain = 4;                  //gain crescita valore distanza
long maxRangeSetDistanceValue = 666666;  //valore setDistance range massimo
long maxRange = 2000;         //distanza range massimo in mm
int startDriftDistance = 15; //valore distanza inizio drift distanza
////////////////////////////////////////////

void setup() {    
 Serial.begin(9600);
}

void getDistance() { 
 if(currentInit == 0){if(digitalRead(irReceiverN) == LOW){ ambientLightCheck();}}
 if(currentInit == 1){if(digitalRead(irReceiverN) == LOW){ reflectionLightCheck();}}
}

void ambientLightCheck() {
 ambient = micros() - lightTime;
 init(1);
}

void reflectionLightCheck() {
 emission = micros() - lightTime;
 distance = emission * (ambient / (ambient - emission));
 setDistance = distance;
 distance = map(distance, 0, maxRangeSetDistanceValue, 0, maxRange);
 if(distance <= 0) distance = 0;
 if(distance > startDriftDistance) distance = sqrt(distance) * gain;
 Serial.println(distance); 
 emission = 0; 
 ambient = 0;
 init(0);
}

void init(int emitter) {
 if(emitter == 0)digitalWrite(irEmitter, LOW);   
 if(emitter == 1)digitalWrite(irEmitter, HIGH); 
 lightTime = micros();
 pinMode(irReceiverN, OUTPUT);
 digitalWrite(irReceiverN, HIGH); //carico ricevitore di induttanza
 pinMode(irReceiverN, INPUT);
 digitalWrite(irReceiverN, LOW);
 if(emitter == 1) currentInit = 1;
 if(emitter == 0) currentInit = 0;
}

void loop() {
  getDistance();
}

 

Tutorials correlati

Segui questi tutorial se il contenuto di questo articolo ti ha appassionato e vuoi imparare in modo piu' preciso il funzionamento di questo sensore. Grazie alle applicazioni da me sviluppate è possibile avere un riscontro visuale e grafico della reattività alla luce di un LED infrarosso.

Sensore prossimità LED IR - Arduino & Processing

App in Processing sperimentazione sensore LED ir

 

 


Creative Commons License
E.R.E.R. Algoritm by Giovanni Blu Mitolo is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Based on a work at
www.gioblu.com.

 

Gioblu Robotics ¬© 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi