Go Down

Topic: Problema con Barriera IR (Read 5318 times) previous topic - next topic

toti94

Stavo provando a creare uno sketch di una barriera IR semplice, come quelle più comuni.
Ma ho un problema, ho letto nei vari post che il codice giusto per far andare il Led Ir a 38kHz è questo:
Code: [Select]
OCR2A = 211;
TCCR2A = 0b01000011;
TCCR2B = 0b00001001;

Bene, vedendo il led con la videocamera lo vedo accendersi, ma il ricevitore riceve sempre 0.
Ora due sono le cose, o il led non va a 38kHz o il ricevitore non va bene ..... però questo stesso ricevitore l'ho usato per ricevere comandi da un telecomando ed ha funzionato alla perfezione.
comunque il mio sketch è il seguente:
Code: [Select]
#include <IRremote.h>
IRrecv ricevitore(2); //pin del ricevitore IR
decode_results codice; //codice ricevuto dal ricevitore
void setup ()
{
pinMode(11, OUTPUT);
OCR2A = 211;
TCCR2A = 0b01000011;
TCCR2B = 0b00001001;
Serial.begin (9600);
ricevitore.enableIRIn(); //inizializza il ricevitore
}
void loop ()
{
  ricevitore.decode (&codice);
  Serial.print ("Nuova lettura: ");
  Serial.print (codice.value);
  Serial.print ("\n");
  ricevitore.resume(); //prepara il ricevitore a ricevere nuovamente
 
}

Michele Menniti

Quelle tre righe (copyright Astrobeed :)) generano una frequenza prossima ai 38KHz, e funzionano al 100%, ma la generazione è costante e l'uso possibile è appunto quello di un controllo di barriera. Quindi non capisco a che ti serve la libreria e che codici vuoi leggere, è l'inizio di un'altra storia drammatica??
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

#2
Nov 18, 2012, 01:19 am Last Edit: Nov 18, 2012, 02:00 am by toti94 Reason: 1
Prima di tutto mi scuso per aver sbagliato sezione, non me ne ero accorto!
In effetti prof. ha ragione, stavo decodificando il nulla XD
Comunque ora il problema è un altro xD
In effetti sul seriale mi viene stampato il numero 1 però quando metto il dito fra il ricevitore e il led .... non succede nulla XD mi continua a stampare il numero 1, ed ho notato che a volte stampa uno 0, diciamo 1 volta ogni 20 "1".... sarà normale credo

uwefed

#3
Nov 18, 2012, 03:08 am Last Edit: Nov 20, 2012, 09:19 pm by uwefed Reason: 1
Non stai spedendo nessun codice. Stai spedendo un segnale continuo rettangolare con la frequenza di 38kHz. Non c'é nessun codice da decodificare. Non Ti serve nessuna libreria IRremote.h.  Il TSOP mette l' uscita a LOW quando riceve un segnale a 38kHz e va a HIGH
Il codice sottostante puó accendere e spegnere il segnale 38kHz sul pin 2.
Ciao Uwe

Code: [Select]
#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); 
}

toti94

in realtà il codice vorrei scriverlo io per capire come funziona XD
Quel codice postato da uwe l'ho capito ma vorrei prima risolvere il mio ....
Code: [Select]
void setup()
{
pinMode(11, OUTPUT);     
OCR2A = 211;
TCCR2A = 0b01000011;
TCCR2B = 0b00001001;
Serial.begin (9600);
}
void loop ()
{
int i= digitalRead (5);
Serial.println (i);
}

Mi stampa 1 sul monitor seriale, ed è giusto così, ma anche quando metto il dito fra il led IR e il ricevitore stampa sempre 1

Michele Menniti

Il tuo codice attiva sul pin 11 una frequenza fissa di 38khz.
il pin 5 non lo hai dichiarato, non so se di default è impostato come INPUT o OUTPUT, comunque lo dovresti decidere tu. Ora sul pin 5 il programma legge lo stato HIGH, perché ti aspetti che cambi di stato, c'è collegato il ricevitore? Non sarebbe allora il caso che alleghi uno schema elettrico e vediamo di capire se hai collegato tutto correttamente?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

Si al pin 5 è collegato il ricevitore. Ecco lo schema... come al solito non so farli ordinatissimi ma spero si capisca  >_<, non avendo trovato il ricevitore tra i componenti ho messo quello col punto interrogativo, e la resistenza che ho messo prima del led IR è da 180ohm non da 220
Inoltre volevo chiedervi ... ma che led è quello nel secondo allegato? non ha la classica bandierina al suo interno

Michele Menniti

Lo schema è una schifezza ma almeno si capisce che il sensore RX è montato a rovescio; MA IL SENSORE che modello è??? Se è il classico TSSOP34838 o similari i collegamenti sono (visti dalla faccia con la protuberanza):
pin 1 = uscita
pin 2 = GND
pin 3 - R da 100ohm - 5V
Tra pin 3 e pin 2 devi mettere un C elettrolitico da minimo 4,7µF a massimo 47µF col + sul 3 e - sul 2
La foto del LED o quello che è guardala tu e dimmi se ti pare possibile capirci qualcosa.
Ho capito che è iniziata un'altra nottata :smiley-eek-blue:

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

La foto del led l'ho fatta apposta così per far vedere all'interno che non c'è la tipica bandierina XD ... io la capisco ... :|
Comunque lo so che il ricevitore ha i pin da destra verso sinistra se lo si guarda dalla facciata con la protuberanza e i pin sono Vcc, GNd e out.
Però quando ho fatto il progetto che con un telecomando facevo suonare un buzzer con varie tonalità non ho usato ne il C ne la R e funzionava comunque ... come mai? X D

Michele Menniti

ok, comunque sullo schema è sbagliata la numerazione ed io non riesco a leggerti nel pensiero, perlatro sono terrorizzato all'idea di cosa potrei trovare ]:D
Resistenza e condensatore sono ESPRESSAMENTE consigliati dal datasheet, la R fa da limitatore di corrente, il C serve come serbatoio, per assorbire i picchi di assorbimento e per garantire al sensore la stabilità di cui ha bisogno.
Ora diamo per scontato che tu stia usando un LED IR ed un ricevitore entrambi a 38KHz, visto che sigle non ne fornisci, durante il normale funzionamento, quando il sensore riceve il fascio sulla sua uscita devi rilevare uno stato logico LOW, appena il fascio si interrompe lo stato logico passa su HIGH.
Quindi inizia a misurare questa situazione col tester posto tra out e gnd, portata 10V o 20V, quella che hai; il LOW è circa 0V, l'HIGH è circa 5V. Se in condizioni normali non leggi 0V vuol dire che ci sono problemi sui componenti.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

Sisi sto usando sia ricevitore che emettitore a 38kHz ovvio xD non l'ho detto perchè pensavo fosse implicito
comunque non ho un tester :\

Michele Menniti

allora prova ad aggiungere sull'uscita del ricevitore una R da 1kohm ed in serie un LED normale con anodo alla R e catodo a GND, se è acceso è HIGH, se è spento è LOW; però senza tester non vai lontano, è una spesa che devi fare.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

Ho usato sia il metodo del prof che il programma di uwe ...
Nel caso di uwe il led rimane spento e a volte lampeggia per pochi millisecondi
Nel caso del prof il led rimane sempre acceso
Quindi le cose combaciano ... è un problema hardware allora  :|

Michele Menniti

Non ho visto come funziona lo sketch di Uwe quindi non so dirti se deve andare come dici.
Se è sempre acceso vuol dire che o il LED o il sensore non stanno lavorando correttamente.
Hai controllato se i LED sta lavorando, guardandolo direttamente con una fotocamera? Dovresti vedere una luce non fortissima, di colore bianco o rosa.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

toti94

si il led emette una piccola luce bianca, lo controllo ad ogni prova

Go Up