Barriera ad infrarossi per "autovelox"

Salve, sto cercando di costruire un “autovelox” posizionando ad una distanza di 10 cm circa due barriere ad infrarossi, utilizzando dei diodi infrarossi rx (TEFT4300) e tx (TSUS4300). Ho caricato i datasheet di questi componenti.
Chiedo aiuto perché ho un pò di domande…

Lo schema che sto utilizzando è il seguente:

Sto cercando di vedere che valori mi danno i due rx utilizzando questo semplicissimo codice:

int sensorPin1=A2;
int sensorPin2=A5;
int valoreLED1=0;
int valoreLED2=0;
unsigned long t0;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(sensorPin1, INPUT);
pinMode(sensorPin2, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:

valoreLED1= analogRead(sensorPin1);

valoreLED2= analogRead(sensorPin2);

Serial.println(“1° LED”);
Serial.println(valoreLED1);

Serial.println(“2° LED”);
Serial.println(valoreLED2);

delay(2000L);

}

Quando vado sul monitor seriale escono valori casuali(da 30 a 60) che rimangono all’incirca costanti anche se provo a far passare qualcosa tra le barriere. La prima domanda è appunto: a cosa corrispondono questi valori?
Ho notato poi che non mettendo i rx a massa i valori arrivano a 1020 sul monitor seriale e se interrompo il fascio di luce, questo valore scende a 830, però se tolgo a massa entrambi i rx a volte non me lo fa e rimane fisso a 1020.
E’ normale questa cosa? Come faccio a fare in modo da avere questa variazione lasciando a massa i diodi infrarossi?
Persone che conosco avevano già provato a fare questo, con stessi pezzi e schema e avevano aggiunto, mi pare, un operazionale non invertente per aumentare il segnale o qualcosa del genere… ho trovato questa pagina vagando sul forum:

Che dite voi? Spero mi diate una mano perchè ne ho davvero bisogno. Grazie mille per l’attenzione! :slight_smile:

— ti faccio notare che da REGOLAMENTO NON è pemesso fare up prima di 48 ore dall’ultimo post ! - gpb01

teft4300.pdf (99.6 KB)

tsus4300.pdf (101 KB)

Io vedo i diodi RX montati al contrario

prova a scrivere

  Serial.println(sensorPin1);
  Serial.println(sensorPin2);

e dimmi cosa leggi sul monitor seriale

Hai schermato i diodi ricevitore dalla luce ambientale?
CHe resistenza hai messo in serie ai diodi ricevitori?

Ciao Uwe

Il TEFT4300 è un fototransistor che fa passare fra emettitore e collettore una corrente dipendente dalla quantità di luce infrarossa a 950nm che lo colpisce, entro un angolo di 30°. Dovrebbe già essere schermato rispetto alla luce ambientale (...Daylight blocking filter matched with 940 nm emitters).

Nel grafico della figura 4 del datasheet c'è proprio il caso dell'alimentazione a 5V e dell'illuminazione IR a 950nm. Dal grafico risulta che la corrente nel fototransistor non supera i 4mA per una illuminazione di 2mW/cm2. Dal circuito che hai mostrato sembra che tu abbia usato delle resistenze verso massa da 220 Ohm. I valori che ottieni da 30 a 60 dovrebbero corrispondere a correnti da 0,7 a 1,3 mA che scorrono nel fototransistor.

Prova a misurare la tensione ai capi della resistenza, prima senza l'illuminazione dei diodi IR e poi con l'illuminazione, seguendo il consiglio di -zef-.

Ciao,
P.

brunello22:
Io vedo i diodi RX montati al contrario

I diodi messi al contrario mi fanno leggere valoreLED1 e valoreLED2 uguale a 0.

-zef-:
prova a scrivere

  Serial.println(sensorPin1);

Serial.println(sensorPin2);




e dimmi cosa leggi sul monitor seriale

Sul monitor seriale esce il valore 16.

uwefed:
Hai schermato i diodi ricevitore dalla luce ambientale?
CHe resistenza hai messo in serie ai diodi ricevitori?

Ciao Uwe

Dovrebbero essere gia schermati... ho messo in serie una resistenza da 220 Ohm.

pgiagno:
Il TEFT4300 è un fototransistor che fa passare fra emettitore e collettore una corrente dipendente dalla quantità di luce infrarossa a 950nm che lo colpisce, entro un angolo di 30°. Dovrebbe già essere schermato rispetto alla luce ambientale (...Daylight blocking filter matched with 940 nm emitters).

Nel grafico della figura 4 del datasheet c'è proprio il caso dell'alimentazione a 5V e dell'illuminazione IR a 950nm. Dal grafico risulta che la corrente nel fototransistor non supera i 4mA per una illuminazione di 2mW/cm2. Dal circuito che hai mostrato sembra che tu abbia usato delle resistenze verso massa da 220 Ohm. I valori che ottieni da 30 a 60 dovrebbero corrispondere a correnti da 0,7 a 1,3 mA che scorrono nel fototransistor.

Prova a misurare la tensione ai capi della resistenza, prima senza l'illuminazione dei diodi IR e poi con l'illuminazione, seguendo il consiglio di -zef-.

Ciao,
P.

Avendo messo i diodi al contrario non trovo una caduta di tensione dulle resistenze. Mettendole nelmodo giusto sui diodi tx ho 1.2V e sulle resistenze ho attorno a 2.5V; sui diodi rx ho 4.57V su entrambi e non ho caduta di tensione dulle resistenze...

Ho cambiato le resistenze da 220 Ohm a 82 Ohm per avere una corrente più alta, adesso ho che la corrente sulla resistenza dell tx è circa 26 mA. Ho provato a vedere la tensione su tutte le resistenze mettendo e togliendo qualcosa davanti ai diodi ma non cambiano.
C'è bisogno di generare un segnale a 38kH? Se si, come faccio?
Ho appena notato che la variazione c'è ma è piccolissima. Ad esempio se non interrotto il fascio di luce, mi da dei valori "21-22" la variazione se interrompo il fascio è di 1 max 2 ("20-19"). Penso che il valore sia cambiato per via del cambio di resistenze... credo.

Insigne69:
Ho cambiato le resistenze da 220 Ohm a 82 Ohm per avere una corrente più alta, adesso ho che la corrente sulla resistenza dell tx è circa 26 mA. Ho provato a vedere la tensione su tutte le resistenze mettendo e togliendo qualcosa davanti ai diodi ma non cambiano.
C'è bisogno di generare un segnale a 38kH? Se si, come faccio?
Ho appena notato che la variazione c'è ma è piccolissima. Ad esempio se non interrotto il fascio di luce, mi da dei valori "21-22" la variazione se interrompo il fascio è di 1 max 2 ("20-19"). Penso che il valore sia cambiato per via del cambio di resistenze... credo.

In serie ai ricevitori devi mettere qualcosa come 10kOhm.

Devi modulare il segnale di trasmissione quando hai un ricevitore che ha un filtro intergrato per quella frequenza. Cosa tipica per i ricevitori per telecmando infrarossi ma non presente sui fotodiodi o fototransistori.

Ciao Uwe

uwefed:
In serie ai ricevitori devi mettere qualcosa come 10kOhm.

Devi modulare il segnale di trasmissione quando hai un ricevitore che ha un filtro intergrato per quella frequenza. Cosa tipica per i ricevitori per telecmando infrarossi ma non presente sui fotodiodi o fototransistori.

Ciao Uwe

Va bene, modifico le resistenze con quelle da 10 kOhm. La frase "Devi modulare il segnale di trasmissione quando hai un ricevitore che ha un filtro integrato per quella frequenza" non l'ho capita... come dovrei fare poi?
EDIT: 10kOhm penso siano troppi, se ho capito letto bene dal datasheet i tx devono avere una tensione da 1.3V a 1.7V per funzionare e non la hanno.
Ho provato anche ad usare un segnale con generatore di frequenze con Vpp=5V e f=38kH. Nel datasheet c'è scritto (credo) che la frequenza di taglio è a 180kHz.

Mi sembra che ci sia un po' di confusione. Non mi intendo molto di infrarossi, ma qualche prova l'ho fatta.

Il diodo EMETTITORE a infrarossi va pilotato con una corrente di almeno 80mA per cominciare. Poi si può provare a diminuirla per consumare meno, fino al mancato funzionamento del ricevitore. Dato che a quella corrente il TSUS4300 presenta una Vf tipica di 1,3V, alimentando a 5V per ottenere 80 mA la resistenza sarà di (5-1,3)/0,08 = circa 47 Ohm 1/2W. La dissipazione nel diodo sarà di 1,3x0,08 = circa 100mW per cui il diodo non dovrebbe scaldare molto. Prova a toccarlo con un dito, se scotta devi diminuire la corrente aumentando la resistenza.
In questo modo il diodo emette una luce infrarossa CONTINUA di lunghezza d'onda pari a 950 nm (non modulata, che non serve per questa applicazione).

In presenza di questa luce il fototransistor TEFT4300 fa scorrere fra l'emettitore e il collettore una CERTA corrente CONTINUA. Quanta non lo so perché dipende dall'irradiazione infrarossa a 950nm, espressa in mW/cm2 che lo colpisce (Fig. 4 del datasheet). Più avvicino il diodo emettitore al fototransistor, maggiore sarà la corrente che scorre nel fototransistor stesso.

Per rilevare questa corrente, e trasformarla in differenza di potenziale da dare in pasto a un pin analogico dell'Arduino, occorre inserire in serie una resistenza e misurare la caduta di potenziale ai suoi estremi. Quanto deve essere questa resistenza non lo so, ma si può provare a calcolarla dal grafico di Fig. 5, oppure andare per tentativi, partendo da qualche decina di Ohm fino a qualche migliaio, verificando di volta in volta la caduta di tensione CON e SENZA la luce infrarossa dell'emettitore.

Però sempre dal grafico di Fig. 5 si vede che con una Vce di 5V e una illuminazione di 1 mW/cm2, che sembra essere considerata notevole, la corrente nel fototransistor non dovrebbe raggiungere i 3mA.

Ciao,
P.

pgiagno:
Mi sembra che ci sia un po’ di confusione. Non mi intendo molto di infrarossi, ma qualche prova l’ho fatta.

Il diodo EMETTITORE a infrarossi va pilotato con una corrente di almeno 80mA per cominciare …

Grazie per la completa spiegazione, devo imparare a leggere bene i datasheet. Infatti era troppo bassa la corrente e il diodo non funzionava. Adesso funziona e la tensione sul diodo ricevitore si abbassa a seconda di quanto io offuschi la barriera infrarossi.
Adesso però ho un problema col codice, cioè facendo passare qualcosa tra le due barriere ecco cosa mi esce sul monitor seriale:

Il codice che ho sviluppato è questo, ma sento che c’è qualche errore…

int sensorPin1=A2;
int sensorPin2=A5;
int valoreLED1=0;
int valoreLED2=0;
unsigned long temp1=0;
unsigned long temp2=0;
double tempo=0;
double spazio=0.09;         //spazio tra le due barriera in metri (9cm)
double velocita=0;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(sensorPin1, INPUT);
  pinMode(sensorPin2, INPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(200);
  valoreLED1= analogRead(sensorPin1);
  valoreLED2= analogRead(sensorPin2);
 
  if(valoreLED1<100) {      //valore convertito da volt a decimi
    temp1= millis();
    }
    
  if(valoreLED2<100) {
    temp2= millis();
                      
    tempo= (temp2-temp1)/1000;       //la funzione millis ritorna un valore in millesimi, quindi si divide per 1000 per ottenere i secondi
    
    velocita= (spazio/tempo)*3.6 ;   //3.6 per trasformare da m/s a km/h
    
    Serial.print(velocita);
    Serial.println(" km/h");  
    delay(200);
  
  }

}

— 1. NON è necessario quotare tutto, bastano poche righe per far capire di cosa si parla. Chi legge da device mobile ti ringrazierà per la cortesia :wink:
— 2. Per il codice si usano i tag CODE e non i tag QUOTE
— gpb01

Insigne69:
Va bene, modifico le resistenze con quelle da 10 kOhm. ...

EDIT: 10kOhm penso siano troppi, se ho capito letto bene dal datasheet i tx devono avere una tensione da 1.3V a 1.7V per funzionare e non la hanno.

Parlo del ricevitore non del LED!!

Non so che prove stai facendo, quindi non posso giudicare l'output.

Io cambierei i riferimenti dello spazio e del tempo, usando i mm (spazio = 90) e i millisecondi. Per il codice non so. Io farei due cicli di while. Con il primo non appena valoreLED1 scende sotto 100 farei partire tempo1 = millis(), con il secondo non appena valoreLED2 scende sotto 100 farei tempo2 = millis(). E poi la differenza con i calcoli che seguono.

In ogni caso è necessario che, quando l'oggetto interrompe il fascio2, il fascio1 sia già ripristinato. In altre parole non puoi misurare la velocità di un oggetto più lungo di 9cm.

Ciao,
P.

secondo me il modo in cui tenti di rilevare la velocità è sbagliata, intanto tra una lettura e l’altra dei sensori hai 200 millisecondi di pausa avendo nel loop delay(200) e questo sfasa le letture di millis() e il calcolo finale della velocità. Anche se non è proprio il modo corretto tanto per iniziare farei un ciclo while che rimane in attesa di leggere valoreLED1<100 poi temp1= millis() e un altro while che rimane in attesa che anche valoreLED2<100 così posso fare il calcolo tempo= (millis()-temp1)/1000 ecc. ecc.
Dovrebbe funzionare :confused:

Ma se guardate il mio codice invece dei while, ho usato gli if… Non sono quasi la stessa cosa?

if(valoreLED1<100) {      //valore convertito da volt a decimi
    temp1= millis();
    }
    
  if(valoreLED2<100) {
    temp2= millis();
                      
    tempo= (temp2-temp1)/1000;       //la funzione millis ritorna un valore in millesimi, quindi si divide per 1000 per ottenere i secondi
    
    velocita= (spazio/tempo)*3.6 ;   //3.6 per trasformare da m/s a km/h
    
    Serial.print(velocita);
    Serial.println(" km/h");  
    delay(200);
  
  }

}

PS: il delay l’ho messo perché quando arrivavo alla seconda barriera, il monitor seriale mi dava tanti valori e non uno solo… Devo abbassare la comunicazione - > “Serial.begin”?

if non attende che si verifica un evento, controlla solo se è avvenuto o no, il loop viene eseguito di continuo ogni 200mS e questo tempo influisce sulla lettura dei due sensori, con while tu blocchi il programma finché non hai un valoreLED1<100 e da li parti con il cronometro (cioè temp1= millis()) e ti metti in attesa che anche valoreLED2<100 in modo da interrompere il conteggio del tempo e fare il calcolo della velocità… Come detto non è il modo migliore per strutturare il programma, ma sicuramente il più semplice, sopratutto se non devi fare altro.

Secondo me é meglio mettere la resistenza giusta e usare dopo un entrata analogica. Cosí migliori la risoluzione della lettura.

Ciao Uwe

uwefed:
Secondo me é meglio mettere la resistenza giusta e usare dopo un entrata analogica. Cosí migliori la risoluzione della lettura.
Ciao Uwe

Le ristenze sono apposto: c'è ne sono due da 10 kOhm sui ricevitori e due da 33 Ohm sui trasmettitori, per una corrente da 100mA e il diodo tx non scalda.

-zef-:
if non attende che si verifica un evento, controlla solo se è avvenuto o no, il loop viene eseguito di continuo ogni 200mS e questo tempo influisce sulla lettura dei due sensori, con while tu blocchi...

Per aumentare la luce dei Fotodiodi, basta alzare la corrente? Perchè a volte non rileva il mio passaggio tra le barriere se passo velocemente...

dovresti vedere la corrente massima che supportano quei led emettitori se trovi il datasheet, se esageri troppo li bruci.

OT
Scusatemi l'ot, ma quando ho letto il titolo molto fuorviante sono rimasto un po :o :o

"Barriera ad infrarossi per "autovelox"" :o

Sicuramente sarebbe stato cancellato dai mod a prescindere.
Sembrava che volevi costruire un accrocco per non beccare i velox :smiley:
Poi leggendo è stato tutto più chiaro :wink:
Fine OT