SmaTrig 2.1

Canon RC-1 IR remote control reverse-engineered

This article describes how the Canon RC-1 infrared remote control communicates with the camera. To figure out the protocol I used an IR photo-diode first. Because of the bad signal quality I decided then to disassemble the RC-1 and measure the IR-LED voltage directly. I used the occasion and took some pics of the circuit.

canon rc-1 disassembled canon rc-1 disassembled

To all appearances the circuit is build around a quartz-controlled microcontroller with an additional transistor to switch the IR-LED. The supply capacitor is large enough to maintain the function of the remote control for a few shots with removed batteries.

Communication protocol

To the hobbyist's delight there is no communication protocol like the RC-5 code which most TV remote controls use. The signal send by the remote control consists of two identical bursts of pulses as shown on the pics below. To distinguish between the two possible modes of operation of the Canon RC-1, the delay between the bursts is changed. The signal shown in the oscilloscope screenshots below was captured directly at the IR-LED of the circuit. The overlaid noise in some plots is due to an internal oscilloscope problem.

Timing for instant trigger mode

canon remote protocol canon remote protocol

Timing for 2s delayed trigger mode

canon remote protocol canon remote protocol

Pulse burst Timing

canon remote protocol canon remote protocol canon remote protocol

Timing and Tolerances

The signal timing of the original Canon RC-1 is listed in the table below. Having build my own remote control I could also find out the tolerance for each parameter. I used the Canon EOS 400D for testing.

Parameter Original RC-1 Tolerance
Num. of pulses 16 9 - 22
Burst frequency 32700 Hz 29800 - 35500 Hz
Delay for immediate trigger 7.33 ms 7.0 - 7.7 ms
Delay for 2 s delayed trigger 5.36 ms 5.1 - 5.7 ms

The clock frequency is very close to the standard watch crystal frequency of 32768 Hz. The experiments were made from a very short distance. I didn't test the sensitivity reduction for the deviating parameters and didn't test them in combination.

Links

How to build a DIY Canon RC-1 clone

Comments

What worked with my Canon 60D
I've managed to make it work with my Canon 60D by having the HPERIOD value set to 11 rather than 15.
#11 - Jul - 08/25/2016 - 02:16
Thanks! Works perfect.
Hi, thank You very much for sharing. A hint from my side: It works better after switch Drive Mode to 10s/Remote ;-)
#10 - Andreas Fürst - 05/09/2016 - 21:06
Delayed shot wih Arduinos 'tone'
For those who want to use Arduino and got the code from Rylee's comment working, but don't know how to modify it to make it delayed shot (=start recording in video mode):
Delayd shot is same code but with 2000 substracted from two last time values.

// IR burst pattern for Canon EOS Cameras for delayed shot
unsigned long startTime = micros();
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 472) {} // wait until done
noTone(2);
while ((unsigned long)(micros() - startTime) < 5802) {} // wait until done
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 6274) {} // wait until done
noTone(2);
#9 - Just another hitchhiker - 05/18/2015 - 11:43
Solution
The reason the Arduino attempts here have not been working is because the digitalWrite function requires several microseconds (over 4 us on my UNO R2) to do its thing. When combined with delayMicroseconds(), which doesn\'t account for this, your timing gets thrown off in a bad way. There are many solutions to this problem, but the best of them will require that you avoid using delayMicroseconds entirely. I believe I have found one of the easiest solutions: the tone() function combined with using micros() for timing.

Here is my code, which I have confirmed to work with a Canon 7D and a Canon EOS M, using an Arduino UNO R2:

// IR burst pattern for Canon EOS Cameras
unsigned long startTime = micros();
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 472) {} // wait until done
noTone(2);
while ((unsigned long)(micros() - startTime) < 7802) {} // wait until done
tone(2,32700);
while ((unsigned long)(micros() - startTime) < 8274) {} // wait until done
noTone(2);


If this does not work for you, start to question your LED. It must be bright and of the correct wavelength to trigger the camera from more than just a few inches away. For example, I did not have very good luck with a dim 940nm LED until I held the LED right up to the camera\'s IR sensor.

Use my code, and if it still doesn\'t work, try different IR LEDs.
#8 - Rylee Isitt - 12/06/2014 - 12:29
Not working - a possible solution
Hi,

I found that on my EOS 450D remote trigged only works if I send 20 pulses. Maybe this helps somebody ;)
#7 - Phantom - 01/11/2012 - 18:37
Unfortunately not working yet. Any advice?
It seems part of the code is removed by the website send form.
Any case, the main part is

1) for loop to repeat 16 times
digitalWrite(pinLedIR, HIGH);
delayMicroseconds(HPERIOD);
digitalWrite(pinLedIR, LOW);
delayMicroseconds(HPERIOD);

2) Wait for second pulse
delayMicroseconds(DELAYPULSES);

3) repeat step 1

Regarding your debugging advices:
speaker OK, phone camera shows IR LED is on, camera remote is enabled in the Canon 400D I am using

Any advice/suggestion?
#6 - Angel - 09/19/2011 - 01:46
Unfortunately not working yet. Any advice?
My email, got somehow truncated. I post again the Arduino code:

const int pinButton = 2;
const int pinLed = 13;
const int pinLedIR = 12;
#define NPULSES 16
#define HPERIOD 15
#define DELAYPULSES 7330
//var
int buttonState = 0;
int i;
// setup
void setup()
{
Serial.begin(9600); //Start the serial connection with the computer
pinMode(pinButton, INPUT);
pinMode(pinLed, OUTPUT);
pinMode(pinLedIR, OUTPUT);
digitalWrite(pinLed, HIGH);
}

//main
void loop()
{
buttonState = digitalRead(pinButton);
if (buttonState == HIGH) {
digitalWrite(pinLed, HIGH);
Serial.println("HIGH");
}
else {
digitalWrite(pinLed, LOW);
Serial.println("LOW");
for(i=0;i
#5 - Angel - 09/19/2011 - 01:18
Unfortunately not working yet. Any advice?
I tried to build a simple Arduino program following your instructions but I could manage to make it work. Any suggestions?

1) Test environment
- One push button to trigger the photo shoot
- A test LED
- Since SFH484 was not available I used another IR LED (IRT5=L-53SF4C, 880nm)

2) Arduino code:
const int pinButton = 2;
const int pinLed = 13;
const int pinLedIR = 12;
#define NPULSES 16
#define HPERIOD 15
#define DELAYPULSES 7330
//var
int buttonState = 0;
int i;
// setup
void setup()
{
Serial.begin(9600); //Start the serial connection with the computer
pinMode(pinButton, INPUT);
pinMode(pinLed, OUTPUT);
pinMode(pinLedIR, OUTPUT);
digitalWrite(pinLed, HIGH);
}

//main
void loop()
{
buttonState = digitalRead(pinButton);
if (buttonState == HIGH) {
digitalWrite(pinLed, HIGH);
Serial.println("HIGH");
}
else {
digitalWrite(pinLed, LOW);
Serial.println("LOW");
for(i=0;i ok
- IR LED replaced by regular LED --> light --> ok
- IR LED filmed with phone camera --> light --> ok
- Camera remote mode is on --> ok

Still the camera (Canon 400D) does not react.
Any advice/suggestions?
#4 - Angel - 09/19/2011 - 01:14
Help
I m trying to open this debugging IR remote page in my browser but it is showing some error why is so can somebody help me out.
#3 - advertising products - 10/08/2010 - 07:49
I've just added a section about debugging IR remote here

http://doc-diy.net/photo/eos_ir_remote/#debugging

Luk
#2 - luk - 04/06/2010 - 11:00
Am I being a muppet?
Using an Arduino board (complete board for a larger Atmel processor) I have programmed the information you supplied (15.3uS on then 15.3uS off 16 pulses with 7.86ms spacing for instant picture capture). Nothing happens. I've used your tolerances to play with the information also using almost the entire range and nothing is happening.
Camera is 350D IR diode is of a TV remote and has been checked with IR receiver using the same board to record pulse information.

Muppet?
#1 - Ritchie Wilson - 04/03/2010 - 18:17
Guidence required!!
Hi,
I am trying to use this info to build my own IR remote for Canon T1i. The camera manual says it is compatible with RC-1. I followed your timings, (32-38kHz bursts, seperated by 7ms) but my camrea does not seems to be responding. Did you face any such issues when you tried?
Any giudence would be greatly appriciated.
#0 - Adarsha - 03/17/2010 - 04:34
Name
E-mail (Will not appear online)
Title
Comment
To prevent automated Bots form spamming, please enter the text you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.



This comment form is powered by GentleSource Comment Script. It can be included in PHP or HTML files and allows visitors to leave comments on the website.