Tutorial sensore di distanza a LED lineare

Ciao ragazzi. Dopo la mega-diatriba tra me e Astrobeed sulla fattibilità dell'uso della inverse square law per determinare la distanza di una fonte luminosa (http://arduino.cc/forum/index.php/topic,83319.0.html) ho perso decisamente tanto tempo a farmi una cultura su questa roba e soprattutto sulle basi fisiche necessarie a comprendere il funzionamento di questa legge.

Il risultato è un algoritmo che grazie alla percezione dell'intensità di un eventuale riflesso da parte di un ostacolo posto davanti all'emettitore determina la sua distanza in modo perfettamente lineare e scevro dall'iperbolicità insita nella diminuzione dell'intensità luminosa in rapporto alla distanza.
Finalmente chi sarà interessato potra' autocostruirsi un sensore di distanza lineare, a un costo davvero irrisorio (2 LED ir e una schermatura qualsiasi), ma soprattutto potrà mappare l'output dell'algorimo in un valore metrico :grin: :grin:. A cosa servono i sensori Sharp nella maggiorparte delle applicazioni quando c'è questa possibilità a costi trascurabili?! :grin:

Ovviamente, i sensori Sharp, sono piu' liberi dal drift dato dalla luce ambientale e riflettività dell'ostacolo (fino a un certo limite), dato che sfruttano l'angolazione della luce riflessa, e non la sua intensità. Ma credo che questo limite in moltissime applicazioni sia trascurabile, vista anche la differenza di spesa.

Qui trovate il tutorial con la spiegazione completa:

Per tutti quelli che stanno utilizzando i vari algoritmi da me rilasciati per distance sensing con LED, in versione digitale (reverse biasing), consiglio di passare a questa configurazione (se si hanno analogiche disponibili), perchè piu' performante.

Sono riuscito ad aumentare il range a + di 5 metri, anche di giorno :grin:

scusa quali sono i tuoi dubbi :grin:!??!
Rencidi partecipi sono curioso, magari non ho considerato qualcosa?!

funziona, leggo la distanza della scivania, monito e case del pc, oltre i 30cm non l'ho testato. ma alle volte ottengo numeri negativi.... esempio:

387.11
6113.67
89294.87
9007.44
-4479.82
57443.30
-14922.34
-13930.00
-37196.26
12856.48
-6227.09
-7666.48
-257.99
1000.00
1149.61
1159.18
1146.77
1053.74
1106.68
1242.95

Non è strano perchè c'è di mezzo l'ABS... essa è una macro, e quindi ha vari sbattimenti sul fatto che c'è di mezzo una funzione. meglio cambiare
Serial.println(abs(getDistance()));
in
double distance = getDistance();
Serial.println(abs(distance));

Grazie Lesto!! Filtravo a posteriori i numeri negativi!!!
Ma senti salvandola in distance smetti di ottenere i numeri negativi?!

certo, il problema è con le macro. Non vanno d'accordo con le funzioni, in pratica la macro è definita così:
#define abs (x)?(x):-(x);

ed ecco il prblema: ogni occorrenza di x viene sostituita con la parola contenuta nel parametro di abs...

quindi
Serial.println( abs(getDistance()) );

in fase di compilazione diventa;
Serial.println( (getDistance())?(getDistance()):-(getDistance()) );

quindi puoi vedere bene che oltre a non funzionare, chiami 2 volte getDistance()

Grazie mille non conoscevo questo particolare, che sembra davvero importante, modifico subito il tutorial da Serial.print(abs(getDistance())); in distance = getDistance; Serial.print(distance);

Che range ottieni?
Che LED stai utilizzando?
Sono a luce visibile?

Ottieni un valore lineare?

sulla scrivania sembra essere lineare, dovrei provare a mapparlo in base ai millimetri.
Poi sinceramente sto usando i cavi rigidi da bread-board e ogni mezzo movimento si staccano, domani faccio partire l'ordine e mi dovrebbero arrivare quelli a filo intrecciato, molto più morbidi e adatti allo scopo

bravissimo gbm... appena ho un po di tempo lo provo... mi interessa molto!!

Sì interessantissimo, complimenti, mi serviva proprio una cosa del genere, lo proverò anch'io! Ma come si chiama quel porta led doppio che usi?

eheh robba buona, fatta in casa :slight_smile: