Barriera IR semplice (1 metro di portata)

Ciao a tutti, mi ritrovo un classico led IR e un ricevitore IR (precisamente IR38DM). Vorrei realizzare una barriera IR abbastanza semplice e volevo sapere se con questi due componenti riuscirei ad ottenere qualcosa di efficente ad una portata di 1 metro + o -! Il motivo è che inizialmente ho adottato il metodo del laser con una fotoresistenza ma il metodo di puntamento iniziale è parecchio scomodo ogni volta. Volevo quindi trovare un'alternativa..

Grazie a tutti

Nicola, mi meraviglio di te! Ormai con gli IR dovresti farci pure il caffé dopo tutto ciò che hai realizzato. Che vuoi sapere ancora? Comunque: Il LED IR lo devi pilotare a 38KHz costanti, puoi pilotare il LED direttamente tramite un pin di Arduino ma con una R di limitazione da 100ohm Il ricevitore IR38DM lavora in modo "impulsivo", cioè normalmente (quindi mentre riceve il segnale del LED IR) sta a livello HIGH, appena il fascio si interrompe dà un solo impulso LOW e poi ritorna subito su HIGH, anche se il segnale a 38KHz non è ancora "tornato".

[quote author=Michele Menniti link=topic=127550.msg959480#msg959480 date=1350418235] Nicola, mi meraviglio di te! Ormai con gli IR dovresti farci pure il caffé dopo tutto ciò che hai realizzato. Che vuoi sapere ancora? Comunque: Il LED IR lo devi pilotare a 38KHz costanti, puoi pilotare il LED direttamente tramite un pin di Arduino ma con una R di limitazione da 100ohm Il ricevitore IR38DM lavora in modo "impulsivo", cioè normalmente (quindi mentre riceve il segnale del LED IR) sta a livello HIGH, appena il fascio si interrompe dà un solo impulso LOW e poi ritorna subito su HIGH, anche se il segnale a 38KHz non è ancora "tornato". [/quote]

ok quindi praticamente sta sempre in high se il fascio si interrompe manda solo per un attimo un'impulso low e ritorna su high! Ora per far madnare al led ir, collegato ad un pin arduino (ed una resistenza da 100 ohm) i 38 khz ho trovato proprio un tuo post:

http://arduino.cc/forum/index.php/topic,67433.0.html

e dici che riesci a madare 38khz in questo modo:

digitalWrite(3, HIGH);   // set the LED on
delayMicroseconds(8);              // wait for a second
digitalWrite(3, LOW);    // set the LED off
delayMicroseconds(9);              // wait for a second

può andar bene?:)

Sì erano le prime prove :blush:, ma se continui a leggere quel Topic arriverai a scovare due-tre righe di codice dettate da Astrobeed che fanno generare tale frequenza tramite il controllo di un timer, su un pin ben preciso; in tal modo piloterai il LED in background potendo far eseguire al micro altre operazioni. Trovate:

void setup()
{
 pinMode(11, OUTPUT);     
 OCR2A = 211;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
}

con queste righe in Setup, sul pin 11 di Arduino (rispetto a GND) ti trovi circa 38KHz, anche se andrebbero misurati, per sicurezza, però se vedi il LED IR lavorare (basta che lo guardi con una fotocamera o un cellulare in tale modalità, se è acceso sta lavorando) dovresti esserci vicino. Ricordati di aggiungere la R in serie da 100ohm. Anche l'rx devi alimentarlo tramite una R da 100ohm e tra i pin di alimentazione dell'IR38Dm devi mettere un C elettrolitico da 47µF

[quote author=Michele Menniti link=topic=127550.msg959573#msg959573 date=1350422592] Sì erano le prime prove :blush:, ma se continui a leggere quel Topic arriverai a scovare due-tre righe di codice dettate da Astrobeed che fanno generare tale frequenza tramite il controllo di un timer, su un pin ben preciso; in tal modo piloterai il LED in background potendo far eseguire al micro altre operazioni. Trovate:

void setup()
{
 pinMode(11, OUTPUT);     
 OCR2A = 211;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
}

con queste righe in Setup, sul pin 11 di Arduino (rispetto a GND) ti trovi circa 38KHz, anche se andrebbero misurati, per sicurezza, però se vedi il LED IR lavorare (basta che lo guardi con una fotocamera o un cellulare in tale modalità, se è acceso sta lavorando) dovresti esserci vicino. Ricordati di aggiungere la R in serie da 100ohm. Anche l'rx devi alimentarlo tramite una R da 100ohm e tra i pin di alimentazione dell'IR38Dm devi mettere un C elettrolitico da 47µF [/quote]

Caspita funziona!:)) Anzi, ti spiego la situazione! Il led ir l'ho collegato con la resistenza da 100ohm al pin digitale 11 (tramite la fotocamera si vede che lavora). L'ir38dm l'ho collegato con una resistenza da 100ohm e per quanto riguarda il C non mi ritrovo uno da 47µF, (uno da 100µF potrebbe andar comunque bene?)

Comunque la situazione senza C è questa:

Lo sketch:

void setup()
{
 Serial.begin(9600);
 pinMode(11, OUTPUT);  
 pinMode(13, OUTPUT);
 OCR2A = 211;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
}

void loop()
{
int i = digitalRead(6);
Serial.println(i);

if(i == 0)
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
}
}

all'interruzione del fascio ir dalla seriale vedo una situazione del genere:

...
1
1
1
[b]0[/b]
1
...

Ed infatti andando a zero il led si accende per 1 secondo. Diciamo che così per quello che dovrei fare potrebbe andare anche bene ma, cosa ho notato:

un oggetto abbastanza grande anche se passa velocemente riesce a interrompere il fascio ovviamente, ma un oggetto piccolo (es. una gomma) se la faccio passare (diciamo la lascio semplicemente cadere) essendo di neanche di 3cm per 1cm non riesce ad interrompere il raggio! Ecco il problema? Come potrei fare a fermare il raggio con oggetti così piccoli? Si può o me lo posso sognare di fare cose del genere con fasci IR? :)

Grazie!

ne metti un paio vicini e risolvi il problema :D

Ciao a tutti. E' da un po' che seguo il forum ma è la prima volta che intervengo.

A proposito del problema di Nik90 mi viene in mente che un oggetto così piccolo che si muove con un certa velocità, magari interrompe il raggio per un tempo troppo breve (andrebbero fatti due calcoli per confrontare il tempo di interruzione con la durata del ciclo di Arduino).

In questo caso quindi forse la digitalRead viene fatta in un momento in cui il piedino non è più basso.

Magari si potrebbe provare collegando il fotodiodo ricevitore ad un piedino di Interrupt per vedere se in questo modo il MC riesce a catturare l'impulso.

Ciao. Vittorio.

Ok!:) Secondo me il problema stava nell'IR38DM! Ho cambiato sensore infrarossi, ne ho utilizzato uno che ho trovato da un vecchio lettore DVD! metre l'IR38DM come ha detto Michele sta a livello HIGH, appena il fascio si interrompe dà un solo impulso LOW e poi ritorna subito su HIGH, anche se il segnale a 38KHz non è ancora tornato, questo che ho trovato io ora vedendo come reagisce funziona così: quando riceve sta a livello LOW, quando il fascio si interrompe va su HIGH e ci rimane. Utilizzando questo codice:

#define IR_LED 11
#define RED_LED 13
#define SPK 8
volatile int state = LOW; //inizializzo lo stato dello state su LOW

void setup() 
{                
 Serial.begin(9600);
 pinMode(IR_LED, OUTPUT);  
 pinMode(RED_LED, OUTPUT);
 pinMode(SPK, OUTPUT);
 OCR2A = 211;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
 attachInterrupt(0, int_0, RISING);  //interrupt se il pin digitale 2 rivela che lo stato passa da basso ad alto..
}

void loop() 
{

}

void int_0()            
{
    state = !state; // se si verifica int_0 cambio il valore di state su HIGH
     if(state==HIGH)
     {
       digitalWrite(RED_LED, HIGH);   // accendo il LED per 500 msecondi
       delay(500);
       digitalWrite(RED_LED, LOW);  //spengo il led
       state = !state;  //cambio di nuovo lo stato di "state"
        }  
      
}

la situazione è istantanea!:) Oggetti sia in caduta libera che un po accelerati non hanno scampo!:).. ora continuo la sperimentazione comunque... xD

Ok, mi son fatto prendere troppo presto! Il problema è questo il led ir con il nuovo ricevitore vanno benissimo, ma ad una distanza che a me non basta! Praticamente vanno bene fino ad una distanza di circa 15 cm, dopo di che il segnale inizia a perdersi (il ricevitore non riceve più come deve). Il problema penso sia nel fascio ir che mando:

 OCR2A = 211;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;

(messo nel setup). Come ha detto Michele si riuscirebbero a mandare 38 Khz, il fatto è che il nuovo ricevitore non so se lavora a 38Khz e neanche riesco trovare il datasheet! Come si fa?! :)

Grazie

I ricevitori IR vanno da 32KHz a 44KHz (ma sugli estremi non sono sicurissimo), se non conosci le caratteristiche del ricevitore che stai usando non puoi sapere se c'è un problema di scarsa sensibilità o di frequenza di lavoro; ovvio che in fase sperimentale non puoi introdurre "incognite" come componenti fondamentali che non conosci. Il problema è che non disponi nemmeno di un frequenzimetro, se invece lo hai puoi andare a tentativi: trovi la combinazione di valori del timer per partire da 32KHz ed aumenti di 1KHz per volta ad ogni tentativo, se il problema riguarda la frequenza ad un certo punto otterrai prestazioni decisamente migliori. L'alternativa migliore è ovviamente quella di prendere un TSSOP34838 che è eccellente e lavora a 38KHz, l'ho usato nella mia barriera. Il condensatore in realtà può anche essere inferiore, quindi va bene qualsiasi cosa a partire da 4,7µF, serve per garantire stabilità di alimentazione al ricevitore e va montato molto vicino al pin V+

Ok, è andata per il TSOP34838, l'ho preso! Ora aspettiamo che arrivi e poi vediamo un po! Spero solo che reagisce al passaggio degli oggetti come quello che sto provando ora. Mi dispiace che non risco a trovare il datasheet! Se non fosse che dopo i 15 cm inizia a fare capircci è perfetto, al 100% quello che vorrei io! Tu Michele che hai provato il TSOP34838 dici riuscirò a risolvere?:) Appena posso comunque posto il video di quello che sto provando ora, secondo me se lì in mezzo ci faccio passare un proiettile me lo rileva! xD

Nel mio caso dovevo simulare il passaggio di un treno per gestire un passaggio a livello, non ho fatto la prova a sparare contro il fascio, intanto perché non avevo gli occhiali per vedere gli IR e poi perché temevo di fare qualche danno al laboratorio :D Il tempo di risposta del ricevitore lo trovi sul data-sheet.

[quote author=Michele Menniti link=topic=127550.msg961864#msg961864 date=1350581377] ..non ho fatto la prova a sparare contro il fascio, intanto perché non avevo gli occhiali per vedere gli IR e poi perché temevo di fare qualche danno al laboratorio :D Il tempo di risposta del ricevitore lo trovi sul data-sheet. [/quote] Hai fatto bene! :))

Comunque ho cercato il data-sheet e ho trovato questa frase:

"Up to 800 short bursts per second can be received continuously. "

Qui parla di sequenze al secondo che riesce a ricevere ma non ho trovato niente (o forse non ho visto :) ) che parla di tempo di risposta. Comunque nel caso fa niente, il miglior modo per testarlo e provarlo su banco! xD

Comunque mi chiedevo una cosa, in applicazioni del genere, quindi barriere ir, che dovrebbero essere abbastanza sensibili, tolto ok il ricevente, il fascio ir a 38Khz se il ricevente lavora a tele frequenza ma, quanto conta il led IR utilizzato? Cioè può andar bene qualsiasi led ir oppure diciamo come qualsiasi altra cosa "ce il peggio e il meglio" ?

I LED IR hanno come tutti il LED una lente e percui la luce prodotta viene convogliato in un fascio con diversi angoli di apertura. Piú piccolo é l' angolo di apertura piú luce viene inviata su un campo piccolo. La distanza massima varia in questa funzione. I LED si distinguono anche nella corrente (potenza) massima.

Nel Sketch sottostante il LED IR é collegato con la sua resistenza tra massa e pin 2. L'uscita del TSOP é collegata al pin 3 e il LED su Pin 13 viene usato per rilevare lo stato della fotocellula.

#define RXTSOP 3      //Pin TSOP 
#define TXIR 2        //LED IR
#define LED13 13      //LED on pin 13

//flag
boolean transmitting_IR; //transmission flag

// turn_off , turn_on, detect functions come as is from
// http://www.eng.utah.edu/~cs1410/Labs/lab09.html

void turn_off_IR ()
{
  // Instead of just adjusting the output on pin 11, this code also
  // turns off the timer controlling the PWM output on pin 11
  
  TCCR2A = 0; // Disconnect PWM
  TCCR2B = 0; // Stops the timer
  OCR2A = 0;  // No timer top
  digitalWrite(TXIR, LOW);  // Ensure output is off
  
  transmitting_IR = false;
}

void turn_on_IR ()
{
  //   Set up Timer2 (which can be connected to pins 3 and 11)
  //   For full details, see:
  //   arduino.cc/en/Tutorial/SecretsOfArduinoPWM
  //   The syntax here has me baffled, but the patterns of usage
  //   are clear if you look at the ATMega328 diagrams.
  //   _BV appears to stand for 'bit value'
  //   Different bits need to be set to control each timer
  //   Refer to diagrams for clarity

  TCCR2A = _BV(WGM21) | _BV(COM2A0); // This mode toggles output once per timer cycle
  TCCR2B = _BV(CS20);  // Do not scale the clock down - use 16 MHz timer rate.
  OCR2A = 210; // Divide sys. clock by 210, 1/2 cycle = 76 khz, 1 cycle = 38 khz
  
  // Output pin 11 should now be emitting a 38 khz signal.
  
  transmitting_IR = true;
}

void detectIR()
{
    if(digitalRead(RXTSOP)){
    digitalWrite(LED13 ,LOW);
    }else{
    digitalWrite(LED13 ,HIGH);
    }
}

void setup(){  
  pinMode(TXIR, OUTPUT);
  pinMode(RXTSOP, INPUT);
  turn_on_IR();
  delay(100);
}

void loop(){
  detectIR(); // search for IR
  delay(50);  
}

Il LED IR puó essere pilotato anche da un secondo Arduino o con um Multivibtatore costruito da un NE555.

Ciao Uwe

Ok quindi anche il led fa la sua parte.. Riguardo lo sketch che hai postato, vedo che ogni 50ms effettua il controllo, ma se il loop fosse più lungo si perderebbe tempo! Non so se hai visto il codice che sto usando ora, si base su un'interrupt, non pensi sia più attendibile? Comunque domani mattina provo così come sta questo sketch e vedo che succede! Altrimenti effettivamente una valida alternativa sarebbe utilizzare un NE555! In modo da tenerlo separato da arduino..

Riguardo lo sketch che hai postato, vedo che ogni 50ms effettua il controllo, ma se il loop fosse più lungo si perderebbe tempo!

La tua nota mi sembra un po strana. All inizio hai usato una Fotoresistenza. Quelli hanno tempi di risposta anche fino al secondo.

Quanto veloce deve essere la risposta della fotocella? Ciao Uwe

Nik_90: Non so se hai visto il codice che sto usando ora, si base su un'interrupt

Ciao a tutti,

scusami se commento solo ora ma non avevo visto che hai modificato il codice per utilizzare un interrupt e vorrei darti un piccolo consiglio.

Sarebbe preferibile che la funzioni che gestisce l'interrupt, nel tuo caso la int_0, sia il più veloce possibile perchè sta interrompendo il flusso principale del programma. Nel tuo caso hai introdotto un delay(500) che, in pratica, ad ogni interrput, blocca il loop principale per mezzo secondo.

Qui mi pare che spieghi bene questo concetto: http://www.maffucci.it/2012/06/11/appunti-su-arduino-interrupts/

Magari, al momento, nel tuo caso, questo non ha importanza... lo dico solo per evidenziare un concetto che forse, successivamente, quando svilupperai ulteriormente il codice, potrebbe assumere la sua rilevanza.

Ciao. Vittorio.

Concordo sul fatto che usare un interrupt per poi ricorrere ad un delay è assolutamente un controsenso, se proprio serve quel ritardo realizzalo con millis che almeno non ti blocca il processore.

Ok ho provato anche lo sketch di uwe e anche quello risponde bene, è veloce:) rimane sempre il problema che dopo una 20ina di cm il segno ir si perde! :/ unica cosa volevo provare a cambiare tipo di led! Questo che sto usando ora è uno preso da quei mini telecomando quindi di quelli piccoli! Per quanto riguarda il delay di 500ms nell'interrupt lo sto usando per prova, infatti si trova tra l'accensione e lo spegnimento del led di verifica per controllare che il fascio ir sia interrotto!

Nik_90:
Ok ho provato anche lo sketch di uwe e anche quello risponde bene, è veloce:) rimane sempre il problema che dopo una 20ina di cm il segno ir si perde! :confused: unica cosa volevo provare a cambiare tipo di led! Questo che sto usando ora è uno preso da quei mini telecomando quindi di quelli piccoli! Per quanto riguarda il delay di 500ms nell’interrupt lo sto usando per prova, infatti si trova tra l’accensione e lo spegnimento del led di verifica per controllare che il fascio ir sia interrotto!

guarda che i led ir sono praticamente tutti uguali prova ad intubare il tubo avrai meno range “orizzontale” ma raggiungi maggiori distanza ps cerca sensore di prossimità con led ir gioblu c’è un ottima guida per arrivare a 150 cm :wink: