From d2adc93cc4d59fa907df5246301dbedee3273fa0 Mon Sep 17 00:00:00 2001 From: Ladyada Date: Tue, 5 Oct 2010 20:01:05 -0400 Subject: [PATCH] Working version for Apple remotes --- ircodes.h | 123 +++++++++++++++++++++++++++++++++++ ircommander.pde | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 ircodes.h create mode 100644 ircommander.pde diff --git a/ircodes.h b/ircodes.h new file mode 100644 index 0000000..2260325 --- /dev/null +++ b/ircodes.h @@ -0,0 +1,123 @@ +/******************* our codes ************/ + +int ApplePlaySignal[] = { +// ON, OFF (in 10's of microseconds) +912, 438, +68, 48, +68, 158, +68, 158, +68, 158, +68, 48, +68, 158, +68, 158, +68, 158, +70, 156, +70, 158, +68, 158, +68, 48, +68, 46, +70, 46, +68, 46, +68, 160, +68, 158, +70, 46, +68, 158, +68, 46, +70, 46, +68, 48, +68, 46, +68, 48, +66, 48, +68, 48, +66, 160, +66, 50, +66, 160, +66, 50, +64, 160, +66, 50, +66, 3950, +908, 214, +66, 3012, +908, 212, +68, 0}; + +int AppleForwardSignal[] = { +// ON, OFF (in 10's of microseconds) + 908, 444, + 64, 50, + 66, 162, + 64, 162, + 64, 162, + 64, 52, + 64, 162, + 64, 162, + 64, 162, + 64, 164, + 62, 164, + 64, 162, + 64, 52, + 62, 52, + 64, 52, + 64, 50, + 64, 164, + 64, 50, + 64, 164, + 64, 162, + 64, 50, + 66, 50, + 66, 50, + 64, 50, + 66, 50, + 64, 52, + 64, 50, + 66, 160, + 66, 50, + 64, 162, + 66, 50, + 64, 162, + 64, 50, + 66, 3938, + 906, 214, + 66, 3014, + 906, 214, + 64, 0}; + +int AppleRewindSignal[] = { +// ON, OFF (in 10's of microseconds) + 908, 442, + 66, 48, + 66, 162, + 66, 160, + 66, 160, + 66, 50, + 66, 160, + 66, 160, + 66, 160, + 68, 158, + 68, 160, + 66, 160, + 66, 50, + 66, 48, + 66, 50, + 66, 48, + 66, 162, + 66, 160, + 66, 48, + 68, 48, + 66, 160, + 66, 50, + 66, 50, + 66, 48, + 66, 50, + 66, 48, + 68, 48, + 66, 160, + 66, 50, + 66, 160, + 66, 50, + 66, 160, + 66, 48, + 68, 3936, + 906, 214, + 66, 0}; + diff --git a/ircommander.pde b/ircommander.pde new file mode 100644 index 0000000..0772762 --- /dev/null +++ b/ircommander.pde @@ -0,0 +1,168 @@ +/* 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 10 + +// 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};"); +} +