problema con PWM e ricevitore ir

salve sto cercando di far lampeggiare a 38kHz un led e ricevere il segnale con un ricevitore TSOP 34838, entrambi posti sull’ arduino uno. Il codice che ho caricato è questo:

 #include <IRremote.h> 
int receiver = 13; 
int ir_led = 11; 
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;


void setup()
{
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  
  pinMode(ir_led,OUTPUT);
 
// generazione di un onda quadra sui 38kHz sui pin 11 e 3 
  OCR2A = 211;
  TCCR2A = 0b01000011; 
  TCCR2B = 0b00001001;
 
}

void loop()
{
    if (irrecv.decode(&results)) // have we received an IR signal?
    {
      Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
      irrecv.resume();// receive the next value
    } 
}

il led funziona, provato con cellulare, il problema è che il ricevitore non riceve il treno di impulsi che deve essere continuo.
Qualche idea ?
grazie Valerio.

Un ocillazione continua non é un codice IR valido. Un ocillazione continua di 38kHz genera un HIGH LOW continuo sul uscita del TSOP 3438. La libreria non ha niente da decodificare. Ciao Uwe

Purtroppo hai le idee molto confuse, bisognerebbe che tu dicessi in modo comprensibile cosa vuoi realizzare. La libreria IRemote serve per usare un telecomando in accoppiata ad un ricevitore IR, ad ogni pulsante premuto corrisponde un codice (sempre che il tuo telecomando risulti compatibile con la lib), che la lib ti aiuta a decodificare e "trattare".

Le due-tre righe di codice che ti ho consigliato di usare invece servono se vuoi creare una barriera ad infrarossi, che ti dia un impulso quando la barriera viene interrotta.

Il TSOP 34838 (come lo scrivi tu non dovrebbe essere un codice corretto) è un decodificatore di tipo digitale: in presenza di un treno di impulsi a 38KHz sull'uscita fornisce un segnale LOW costante; appena il treno si interrompe (barriera interrotta) l'uscita del TSOP passa allo stato HIGH, quindi in accoppiata ad un telecomando penso che lavori male

io voglio fare niente di meno che un autovelox, e voglio far si che il treno di impulsi che viene generato dal led ir venga ricevuto dal ricevitore come "I" e quando il segnale si interrompe perchè qualcosa ci è passato davanti diventi "0"

Allora basta che leggi l' entrata del Arduino dove é collegato il Tsop con un digitalRead() e la inverti. Ciao Uwe

ho modificato il codice che ora è questo :

#include <IRremote.h> // use the library
int receiver = 13; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

#define IR_CLOCK_RATE    38000L// se cambi questo cambi la frequenza
#define ir_led 11   // IR Carrier


void setup()  {
  Serial.begin(9600);
  TCCR2A = _BV(WGM21) | _BV(COM2A0);
  TCCR2B = _BV(CS20);
  OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1);
  pinMode(ir_led, OUTPUT);
  
  irrecv.enableIRIn(); // Start the receiver
}

void loop()
{   
  if (irrecv.decode(&results)) // have we received an IR signal?
    {
      Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
      irrecv.resume();// receive the next value
    }
}

tutto a posto ma non sò perchè non riesco a leggere il segnale con il ricevitore, che è funzionante visto che i segnali del telecomando li capta

Ripeto: non funziona perché il telecomando manda una sequenza di 0 e 1 e il tuo oscillatore solo un 1 continuo.

int receiver = 13; // pin 1 of IR receiver to Arduino digital pin 11

#define IR_CLOCK_RATE    38000L// se cambi questo cambi la frequenza
#define ir_led 11   // IR Carrier


void setup()  {
  Serial.begin(9600);
  TCCR2A = _BV(WGM21) | _BV(COM2A0);
  TCCR2B = _BV(CS20);
  OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1);
  pinMode(ir_led, OUTPUT);
  
  pinMode(13, INPUT);  //input con resistenza pullup attivato
  digitalWrite(13,HIGH);
}

void loop()
{   
  if ( digitalRead(13) == HIGH)
  {
  Serial.println("fotocellula interrotta");
  }
  else
  {
  Serial.println("Tutto a posto");
  }  
}

Ciao Uwe

questo lo avevo capito, comunque ho risolto tutto a volte mi andava altre no poi ho capito che era questione di contatti

che poi non è un autovelox ma una semplice barriera infrarosso, un rilevatore di velocità ha bisogno di almeno una coppia di barriere ad una determinata distanza prestabilita con tanto di calcolo Velocità = Spazio/Tempo.

ciao

bè… ma magari doveva solo capire come fare andare la barriera…
ora ne cablerà due e poi le implementa nel codice…
:slight_smile:

si probabilmente è così, ma sai è sempre meglio aggiungere che togliere :) :)

si, adesso stavo solo cercando di capire come far andare una sola fotocellula ovvio che adesso ne aggiungo un altra.

Uwe, non so perchè ma quando il programma inizia (la fotocellula non è interrotta) scrive sul Serial Monito "Tutto a posto" ma dopo un paio di secondi (anche se la fotocellula non è interrotta) scrive "fotocellula interrotta". Quando interrompo a posta la comunicazione, con un'oggetto, continua normalmente ad essere scritto sul serial monitor "fotocellula interrotta". Dopo quando tolgo l'ostacolo esce scritto per un paio di secondi "Tutto a posto" e poi di nuovo "fotocellula interrotta" Se non hai capito faccio un video.

Sei sicuro che sia un TSOP34838? Perché quello che stai descrivendo è il comportamento di un RX di tipo impulsivo e non a stato fisso; puoi leggere esattamente la sigla sul ricevitore?

@ menniti Su un TSOP non é scritto niente.

@ valvale misurando la tensione tra massa e il pin di entrata segnale IR del Arduino hai lo stesso comportamento. Non usare il pin 13 ma un altro. Quello ha un LED con una resistenza da 500 Ohm verso massa.

Ciao Uwe

uwefed: @ menniti Su un TSOP non é scritto niente.

Ah sì? mi sembrava di aver vosto le sigle sui miei, domani controllo.

@ valvale misurando la tensione tra massa e il pin di entrata segnale IR del Arduino hai lo stesso comportamento. Non usare il pin 13 ma un altro. Quello ha un LED con una resistenza da 500 Ohm verso massa.

Però se il TSOP fosse stabile su HIGH (barriera interrotta), LED+R si comporterebbero come una pull-down; tu pensi che la R complessiva sia così bassa da bloccare il segnale? Io penso che non lo misurerebbe proprio; a me sembra proprio un ricevitore impulsivo.

Se il TSOP é un TSOP34838 ma anche se é un TSOP322xx, TSOP324xx, TSOP348xx, TSOP344xx tra uscita e + alimentazione sta una resistenza da 30kOhm pull up e un transistore che porta a massa.

Mi correggo: sul Arduino UNO R3 il LED non é messo direttamente sul Pin 13 ma disaccoppiato con un operazionale.

Sull Arduino UNO R1 e le altre versioni Arduino precedenti é messo un LED giallo direttamente con 2 resistenza da 1kOhm in paralelo da pin 13 verso massa.

Come circuito quando il TSOP non pilota l' uscita hai una resistenza da 30kOhm da +5V in serie con un LED giallo (1,6V) e una resistenza da 500 Ohm verso massa. Dirrei che non hai i 5V che ti aspetti.

Soluzioni vedrei nel cambiare piedino, cambiare Arduino e usare un UNO R3 oppure mettere una resistenza Pullup da 1kOhm sul entrata.

a me sembra proprio un ricevitore impulsivo.

con un Tau di 2 secondi; mi sembra strano.

Ciao Uwe

uwefed: Mi correggo: sul Arduino UNO R3 il LED non é messo direttamente sul Pin 13 ma disaccoppiato con un operazionale.

Caspita, è vero. Non ci avevo fatto caso. Che detective, Uwe! ;)

Per darvi un’idea, vorrei fare una cosa del genere : http://www.youtube.com/watch?v=67xaN9Gi9Z8&feature=channel