Go Down

### Topic: fast and precise timer (Read 1 time)previous topic - next topic

#### jabstarr

##### Mar 27, 2006, 04:47 pm
hello all

i'm currently in the process of hacking IR signals from a remote control. i'm reading the signal coming from the remote with a light sensitive resistor and i'm trying to store the timing of the signal. i've programmed a simple for loop, which increments a counter for every loop, and then stores the counter values when the light sensor goes from high to low or the other way around. that way mapping the signal coming from the remote.

but this gives unstable results - they differ a lot - even if i push the same button under controlled light surroundings.

it seems to me, that i need a more reliable way of keeping track of time (in microsenconds or smaller)

is there a timer function for the arduino board?

is there a manual/list of commands for the arduino board?

#### Oliver Keller

#1
##### Mar 27, 2006, 07:41 pm
I have the same aim. I'm trying to compare the binary patterns from a IR Sensor (the ones with 3 pins: GND, +5V and digital out) gives me  (i have a Yamaha remote).
I set up an external interrupt service routine, that's listening on pin 8 (the only pin that can do that on an arduino board). My first approach was just to count the number of pulses, but it was allways 36 - completley independet form which button I pressed.
So my second attempt was to meassure the time form edge to edge of each pulse. But i still can't distinguish which button get's pressed. I looks like the timing/period of the counting timer is set too short in my case (change of timer1's prescaler could be a solution).
I have not looked into that, I currently suspended this project. See my code only as a rough sketch...

Code: [Select]
`int irPin = 8;int somethingHappend = 0;int count = 0;int timeL;int timeH;  unsigned long pattern[40]; //to store the binary patternint i; void irHandler(void){// external interrupt service routine  timeL = ICR1L;  // read time since last reset  timeH = ICR1H;  pattern[count]= (timeH << 8 ) | timeL;  //pattern[count] = millis();   //another attemp, I don't which is more clever  count++;  somethingHappend = 1;}void printLong(unsigned long n)// that is just the new printInteger function copied from the arduino 0004 svn source{        unsigned long base = 10;      unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.      unsigned long i = 0;      if (n == 0) {            printByte('0');            return;      }      while (n > 0) {            buf[i++] = n % base;            n /= base;      }      for (; i > 0; i--)            printByte(buf[i - 1] < 10 ?                  '0' + buf[i - 1] :                  'A' + buf[i - 1] - 10);}void setup() {  pinMode(irPin, INPUT);  pinMode(ledPin, OUTPUT);  beginSerial(9600);           // connect to the serial port to send values back    TCNT1H = 0;                                    // reset TCNT1  TCNT1L = 0;  TIMSK |= _BV(TICIE1);  //enable external interrupt for Timer1    timerAttach(TIMER1INPUTCAPTURE_INT, irHandler); //attach service routine    } void loop() {  if(somethingHappend){    delay(500);                //make shure we wait till the whole pattern for one button press is passed completley!    TCNT1H = 0;            // reset TCNT1    TCNT1L = 0;    count = 0;    somethingHappend = 0;  }  delay(500);             //wait to not overload the serial connection if nothing happend  // print the last pattern  for (i=0; i < 40; i++){    printLong(pattern[i]);    printString(" ");  }  printNewline();}`

note that you can't use PWM/analogWrite() now, because timer1 would then be used for 2 things, what is not possible.
Here is a nice page that shows how to record the IR sensor binary pattern with any soundcard:
http://people.inf.ethz.ch/mringwal/lirc/
I think, one should really look into how the IR Remote protocol is constructed. Any hints?

#### jabstarr

#2
##### Mar 27, 2006, 08:59 pm
> I think, one should really look into how the IR Remote protocol is constructed. Any hints?

from my research so far it looks like there is ABSOLUTELY NO protocol/standard towards IR remote signal: sucks. big time.

#### Massimo Banzi

#3
##### Mar 27, 2006, 11:21 pmLast Edit: Mar 27, 2006, 11:23 pm by mbanzi Reason: 1
First of all a photoresistor is not good
what you need is a photodiode. on top of that the IR signal is modulated at 36-40KHz

luckily enough there are pre made readers-decoders that give you a nice clean signal...

try the TSOP1738

the best protocol to decode is the RC5 used by sony and philips...

it can be converted to arduino

massimo

#### maex

#4
##### Apr 11, 2006, 07:50 pm
hello

we tried to compile your code example and got a compilation error

first we declared the var: TIMER1INPUTCAPTURE_INT as int

afterwards we got following compiler.output:
++++++++++++
In function `void setup()':
error: `timerAttach' undeclared (first use this function)

+++++++++++++

it seems that this c function is missing ?

any ideas?

m

Go Up

Please enter a valid email to subscribe

To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy