Sunteți pe pagina 1din 10

Food Living Outside Play Technology Workshop

Clone a Remote with Arduino


by randofo on June 29, 2012

Table of Contents

Clone a Remote with Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Intro: Clone a Remote with Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Related Instructables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
Author:randofo Randy Sarafan loves you!
I am the Technology Editor here at Instructables. I am also the author of the books 'Simple Bots,' and '62 Projects to Make with a Dead Computer'.
Subscribing to me = fun and excitement!

Intro: Clone a Remote with Arduino


I recently needed to use the Arduino to control a stereo system, so rather than hack open the remote and wire into it, I decided to simply clone the signal. This was
incredibly easy to do. Basically, I read the signal from the remote with a 38mhz receiver, and then played it back with an IR LED.

To start, I went to the IR Sensor Tutorial on Adafruit.com and loaded the following script onto my Arduino:

/* Raw IR decoder sketch!

This sketch/program uses the Arduno and a PNA4602 to


decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected

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

// 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

void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}

void loop(void) {
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 & _BV(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)) {
printpulses();
currentpulse=0;
return;
}
}
// 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)) {
printpulses();
currentpulse=0;
return;
}
}
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++) {

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(" usec");
}
}

I attached pin 1 of a 38mhz receiver to pin 2 of the Arduino, the middle pin to ground, and pin 3 to power.

I pointed the remote at the receiver and pressed the volume-up button on the remote.

The following string of numbers was output to the serial monitor:

Received:

OFF ON
58200 usec, 8280 usec
4080 usec, 520 usec
1540 usec, 520 usec
1520 usec, 540 usec
500 usec, 520 usec
500 usec, 520 usec
500 usec, 520 usec
1540 usec, 520 usec
500 usec, 540 usec
1520 usec, 520 usec
500 usec, 540 usec
1520 usec, 520 usec
1540 usec, 520 usec
1540 usec, 520 usec
1520 usec, 540 usec
500 usec, 520 usec
500 usec, 520 usec
500 usec, 520 usec
20120 usec, 520 usec
1540 usec, 520 usec
1520 usec, 540 usec
500 usec, 520 usec
500 usec, 540 usec
480 usec, 540 usec
1520 usec, 520 usec
500 usec, 540 usec
480 usec, 540 usec
500 usec, 520 usec
20140 usec, 540 usec
1520 usec, 540 usec
1520 usec, 520 usec
500 usec, 540 usec
480 usec, 540 usec
500 usec, 520 usec
1540 usec, 520 usec
500 usec, 520 usec
1520 usec, 540 usec
500 usec, 520 usec
1540 usec, 520 usec
1520 usec, 540 usec
1520 usec, 520 usec
1540 usec, 520 usec
500 usec, 520 usec
500 usec, 540 usec
500 usec, 520 usec

From the string of numbers I was able to deduce that the code repeated about 4 times and was as follows:

1540 usec, 520 usec


1520 usec, 540 usec
500 usec, 520 usec
500 usec, 520 usec
500 usec, 520 usec
1540 usec, 520 usec
500 usec, 540 usec
1520 usec, 520 usec
500 usec, 540 usec
1520 usec, 520 usec
1540 usec, 520 usec
1540 usec, 520 usec
1520 usec, 540 usec
500 usec, 520 usec
500 usec, 520 usec
500 usec, 520 usec
20120 usec, 520 usec

I repeated this process for the volume-down button.

From there I generated code which raises the volume, pauses, and then lowers the volume again:

// This sketch will control the volume of a JVC RX-778V Receiver


// Based on code from http://www.ladyada.net/learn/sensors/ir.html
// this code is public domain, please enjoy!

int IRledPin = 12; // LED connected to digital pin 13

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
// The setup() method runs once, when the sketch starts

void setup() {
// initialize the IR digital pin as an output:
pinMode(IRledPin, OUTPUT);

Serial.begin(9600);
}

void loop()
{
Serial.println("Sending IR signal");

//volume goes up
volumeUp();

delay(2000); // wait one minute (60 seconds * 1000 milliseconds)

//volume goes down


volumeDown();

delay(2000); // wait one minute (60 seconds * 1000 milliseconds)

// This procedure sends a 38KHz pulse to the IRledPin


// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
// we'll count down from the number of microseconds we are told to wait

cli(); // this turns off any background interrupts

while (microsecs > 0) {


// 38 kHz is about 13 microseconds high and 13 microseconds low
digitalWrite(IRledPin, HIGH); // this takes about 3 microseconds to happen
delayMicroseconds(10); // hang out for 10 microseconds
digitalWrite(IRledPin, LOW); // this also takes about 3 microseconds
delayMicroseconds(10); // hang out for 10 microseconds

// so 26 microseconds altogether
microsecs -= 26;
}

sei(); // this turns them back on


}

void volumeUp() {
// This is the code for my particular Nikon, for others use the tutorial
// to 'grab' the proper code from the remote

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);
http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
delayMicroseconds(20140);
pulseIR(520);

///////

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(20140);
pulseIR(520);

///////

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(20140);
pulseIR(520);

///////

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1520);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(20140);
pulseIR(520);

///////
}

void volumeDown() {

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(19120);
pulseIR(520);

///////

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(19120);
pulseIR(520);

///////

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(19120);
pulseIR(520);

///////

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(1540);
pulseIR(520);

delayMicroseconds(480);
pulseIR(520);

delayMicroseconds(500);
pulseIR(520);

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
delayMicroseconds(500);
pulseIR(520);

delayMicroseconds(19120);
pulseIR(520);

///////
}

To clone your own remote, simply run the first Arduino sketch, copy the output from the serial monitor, and transcribe those values into the volume control sketch in place
of the volume-up and volume-down commands. If you wanted to commit a little bit more time to this, you can also create code to parse the output of the first script to just
drop into the remote output script.

*Note that I am using an Arduino Wireless Shield . This is entirely unnecessary. I just happened to need one for the project i was working on when I made this overview.

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/
Related Instructables

Motion RC Helicopter
Easy RC Car Hack an RC How to make an activated Spy Cam Hand Motion
Controller Mod car's unused Arduino based "Attack Project - EASY Controlled R/C
by Mr.NHRA 5th channel! by night light with Car by
Creeper" by (video) by
joedog86 infrared remote frank26080115
TheNewHobbyist rollingstock
control! by
timotet

Comments
1 comments Add Comment

eXtremeSomething says: Jun 29, 2012. 4:05 PM REPLY


You have given me an amazing idea thank yoooooooooooou.....................................

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/

S-ar putea să vă placă și