Pages: [1]   Go Down
Author Topic: Infrared receiver modules  (Read 758 times)
0 Members and 1 Guest are viewing this topic.
Helsingborg, Sweden
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi. I´ve used the code found on Arduino Playground (http://www.arduino.cc/playground/Code/InfraredReceivers) trying to identify the protocol on my IR remote.
An example of the result looks like this: Bit stream detected! 0 9016 9016 13512 13512 14080 14080 14644 14644 15212 15212 16892 1892 1746 17460 18028 18028 18592 18592 19160 19160 19704 19704 20272 20272 20836 20836 21404 21404 21968 21968 22540 22540 23076 23076 ans so on up to 63620 Bit stream end!.

What´s wrong? Do I have problem with the signal from the IR-reciever? It´s an common 3-pin IR receiver
Logged

Belgium
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Just Do it (with Arduino of course)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The code says :


  Serial.print(time);
  Serial.print("\t");
  Serial.println(direction[change_count++]);
  while (change_count < SAMPLE_SIZE) {
    time = (long) TimerValue[change_count] * 4;
    Serial.print(time);
    Serial.print("\t");
    Serial.println(direction[change_count-1]);
    Serial.print(time);
    Serial.print("\t");
    Serial.println(direction[change_count++]);   
  }
  Serial.println("Bit stream end!");

Apparently what your output is contains only the "print(time) part. So I'd suspect there is some issue with showing  the "\t" tabs on your terminal. Replace the "\t" by "    " and try again.

It should then show  something like :

Bit stream detected!
0    0
9016    0
9016    1
13512    1
13512    0
14080    0
14080    1
14644    1
14644    0


You can get a better alignment if you add some leading zeros with

if (time<10) Serial.print("0");
if (time<100) Serial.print("0");
if (time<1000) Serial.print("0");
if (time<10000) Serial.print("0");
if (time<100000) Serial.print("0");

before each print(time) statement.
Logged

Helsingborg, Sweden
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here is how to do it! Very likable page.

http://www.ladyada.net/learn/sensors/ir.html

Logged

Helsingborg, Sweden
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

When using the code below everything works fine when matching against one remote command, when I add the pulses for the second command to compare with, it starts running very slow, actually not workning. Why is that?

Code:
/* Raw IR commander  This sketch/program uses the Arduno and a PNA4602 to  decode IR received.  It then attempts to match it to a previously recorded IR signal  Code is public domain, check out www.ladyada.net and adafruit.com for more tutorials!  */// We need to use the 'raw' pin reading methods// because timing is very important here and the digitalRead()// procedure is slower!//uint8_t IRpin = 2;// Digital pin #2 is the same as Pin D2 see// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping#define IRpin_PIN      PIND#define IRpin          2// the maximum pulse we'll listen for - 65 milliseconds is a long time#define MAXPULSE 65000// what our timing resolution should be, larger is better// as its more 'precise' - but too large and you wont get// accurate timing#define RESOLUTION 20 // What percent we will allow in variation to match the same code#define FUZZINESS 20// we will store up to 100 pulse pairs (this is -a lot-)uint16_t pulses[100][2];  // pair is high and low pulse uint8_t currentpulse = 0; // index for pulses we're storing#include "ircodes.h"void setup(void) {  Serial.begin(9600);  Serial.println("Ready to decode IR!");}void loop(void) {  int numberpulses;    numberpulses = listenForIR();    Serial.print("Heard ");  Serial.print(numberpulses);  Serial.println("-pulse long IR signal");  if (IRcompare(numberpulses, ApplePlaySignal)) {    Serial.println("PLAY");  }    if (IRcompare(numberpulses, AppleRewindSignal)) {    Serial.println("REWIND");  }    if (IRcompare(numberpulses, AppleForwardSignal)) {    Serial.println("FORWARD");  }}boolean IRcompare(int numpulses, int Signal[]) {    for (int i=0; i< numpulses-1; i++) {    int oncode = pulses[i][1] * RESOLUTION / 10;    int offcode = pulses[i+1][0] * RESOLUTION / 10;        /*    Serial.print(oncode); // the ON signal we heard    Serial.print(" - ");    Serial.print(Signal[i*2 + 0]); // the ON signal we want     */        // check to make sure the error is less than FUZZINESS percent    if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100)) {      //Serial.print(" (ok)");    } else {      //Serial.print(" (x)");      // we didn't match perfectly, return a false match      return false;    }        /*    Serial.print("  \t"); // tab    Serial.print(offcode); // the OFF signal we heard    Serial.print(" - ");    Serial.print(Signal[i*2 + 1]); // the OFF signal we want     */        if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100)) {      //Serial.print(" (ok)");    } else {      //Serial.print(" (x)");      // we didn't match perfectly, return a false match      return false;    }        //Serial.println();  }  // Everything matched!  return true;}int listenForIR(void) {  currentpulse = 0;    while (1) {    uint16_t highpulse, lowpulse;  // temporary storage timing    highpulse = lowpulse = 0; // start out with no pulse length  //  while (digitalRead(IRpin)) { // this is too slow!    while (IRpin_PIN & (1 << IRpin)) {       // pin is still HIGH       // count off another few microseconds       highpulse++;       delayMicroseconds(RESOLUTION);       // If the pulse is too long, we 'timed out' - either nothing       // was received or the code is finished, so print what       // we've grabbed so far, and then reset       if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {         return currentpulse;       }    }    // we didn't time out so lets stash the reading    pulses[currentpulse][0] = highpulse;      // same as above    while (! (IRpin_PIN & _BV(IRpin))) {       // pin is still LOW       lowpulse++;       delayMicroseconds(RESOLUTION);       if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {         return currentpulse;       }    }    pulses[currentpulse][1] = lowpulse;    // we read one high-low pulse successfully, continue!    currentpulse++;  }}void printpulses(void) {  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");  for (uint8_t i = 0; i < currentpulse; i++) {    Serial.print(pulses[i][0] * RESOLUTION, DEC);    Serial.print(" usec, ");    Serial.print(pulses[i][1] * RESOLUTION, DEC);    Serial.println(" usec");  }    // print it in a 'array' format  Serial.println("int IRsignal[] = {");  Serial.println("// ON, OFF (in 10's of microseconds)");  for (uint8_t i = 0; i < currentpulse-1; i++) {    Serial.print("\t"); // tab    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);    Serial.print(", ");    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);    Serial.println(",");  }  Serial.print("\t"); // tab  Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);  Serial.print(", 0};");}
Logged

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 639
Posts: 34726
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you modify the code you posted so it is not all on one line. It makes it impossible to read like this.
Logged

Pages: [1]   Go Up
Jump to: