Now you can have all the remotes of your house in a device that fits in your hand with Arduino, never fight for who has the TV remote again!

To make it you will need:

  • Arduino (I used a cheap copy of the arduino UNO).
  • LCD keypad shield, (I bought mine from dealextreme)
  • 1x Infrared LED (standard ~940nm)
  • 1x Infrared sensor.
  • A computer. (That can run the arduino compiler program)


  • Program for gathering signals (download here)
  • Main program (download here)
  • Video program (download here)

Step 1: Intro:

Infrared light has been used quite a lot for many different applications in many fields, one of them is communication, specifically between remotes and domestic devices, what allows us to control them without leaving the comfort of our sofa.

The process of communication between an emitter (the remote) and a receiver (the device) starts when the user presses any button of the remote, this device has an oscillator and a preconfigured chip that allow the signal to adopt a square waveform with a frequency of 39kHz, depending on the button pressed, the chip will use a determined signal code.
This signal travels through the circuit until it reaches the infrared LED, which transforms it into a series of pulses of invisible light (~940nm). If any sensor it's in it's range those pulses will be transformed into a quadratic wave that will indicate what to do according to the programming of the device.

To create a remote we want to capture those pulses, which will have a certain amplitude in time, we also want to know the time between those pulses so we can reproduce those pulses with voltage and time as the only variables.

<p>I've just added a video of it working, I know that feel when you view an instructable of a cool thing just to realize there's no video :( </p><p>If you want to download the code the Arduino was using while I was recording the video I've added another link at the beginning.</p>
<p>good mr</p>
<p>stuff like this takes a lot of time to develope and to publish, and you did it. you are a good human being. thanks for your effort and for share it. thanks.</p>
<p>Hello, thank you for the project. I was reading it and I've lost one info: where are they stored so many strings of remote codes? I ask it, because Arduino has only 512 bytes of NVRAM available.</p>
<p>I can't answer your question because I'm still in my second year of EE and I still need to learn how this chips work internally. I've done some tests with all the remote codes implemented and I can't seem to induce some kind of memory fail.</p><p>All I know is the maximum storage seems to be 32256 bytes. </p>
<p>Hi,</p><p>This looks like an excellent project.</p><p>I downloaded your code today and became a little confused. How can recorded high pulse become transmitted low periods?</p><p>The infra red gathering signals code appears to put high going pulses into array element pulses[currentpulse[[0] :</p><p>if ((highpulse &gt;= MAXPULSE) &amp;&amp; (currentpulse != 0)) {<br> printpulses();<br> currentpulse=0;<br> return;<br> }<br> }<br> // we didn't time out so lets stash the reading<br> pulses[currentpulse][0] = highpulse;</p><p>In the printpulses subroutine this leads to setting a delay command from the high pulse duration :</p><p>Serial.print(&quot;delayMicroseconds(&quot;);<br> Serial.print(pulses[i][0] * RESOLUTION, DEC);</p><p>So this implies a delay for high pulses and command pulse ir, for low ones:</p><p>Serial.print(&quot;pulseIR(&quot;);<br> Serial.print(pulses[i][1] * RESOLUTION, DEC);</p><p> In the remote final version download pulseIR takes the infra red led high with a cyclic period of 20ms, for a period equal to the measured low time</p><p>void pulseIR(long microsecs) {<br> cli(); <br> while (microsecs &gt; 0) {<br> digitalWrite(IR_led, HIGH); <br> delayMicroseconds(10);<br> digitalWrite(IR_led, LOW); <br> delayMicroseconds(10);<br> microsecs -= 26;<br> }<br> sei(); <br>}</p><p>Am I missing something obvious?</p>
<p>A little research and the mystery is solved..<br>.<br>The sensor remains high until it detects modulated infra red, then it outputs low.</p><p>To quote from the adafruit link you gave for your IR receiver:<br>.<br>&quot;IR detectors are digital out - either they detect 38KHz IR signal and output low (0V) or they do not detect any and output high (5V).&quot;</p><p>.<br>I built the project and recoded to define low going pulses as IR received. I fine tuned the lcd menu code and added a device specific variable to control the carrier frequency.</p><p>.<br>The setup works well. I was able to control all the devices I had, except for a Panasonic plasma- I read somewhere that panasonic uses a very specific carrier frequency of the order of 36.7 kHz. This suggests that the transmitted signal needs to be very accurate. Has anyone got the system to work with a 42 inch Panasonic plasma?<br><br>Thanks for the inspiration!</p><p>.</p>
<p>What if I used an MSP430 Texas Instrument? Is it possible to use the same codes/sketch? Will it be okay?</p>
<p>I've never seen that board before, I guess if it can't be uploaded with the arduino IDE probably not, since the program would need to be adapted to work with new compilers (the ones that the MSP430 uses) because they'll probably wont be able to recognize functions like delay();, millis(); and so on..., so you would have to &quot;translate&quot; the program so the compiler can read it and finally upload it.</p><p>If it can, some minor adjustments when setting the pins might be needed since I've seen the pins have a different arrangement.</p>
<p>#Victor8o5</p><p>I have 2 questions<br>1- Is the resulted pulses dependant on the IR-LED that is connected to the LCD KEYPAD SHIELD (i use IR.LED.WHITE.5MM ) ?<br>2- Is the pulse that results from the original remote variable for the same button ?</p>
<p>I don't think I've fully understood the question but I'll do my best:</p><p>The LED is a standard 900nm IR, any other LED won't work, similar IR LED's may also work. The LED emits the pulses thanks to the code, the LCD keypad is just for inputting and visualizing the program and it has nothing to do with the performance of the LED since the 3rd pin isn't used by it. You can add more IR LED's switched by a NPN transistor and connected directly to 5V to increase the range of the remote.</p><p>When recording the pulses from the original remote the times recorded may change slightly, this is caused by precision errors but they won't affect the overall working of the remote. The original remote has a certain IR signal for every button, as the arduino has an specific IR signal for every sub-menu.</p>
<p>What is the meaning of [avrdude: stk500_getsync(): not in sync: resp=0x00]. it happen after uploading the read signal ir code and this comment show up.</p>
<p>I think there might be a problem with your Arduino connection, check if you selected the good board and if the connections are OK.</p>
<p>what kind of infared sensor you use? is it <a href="http://www.cytron.com.my/viewProduct.php?pcode=SN-IRS-01&name=IR%20Sensor%20Set" rel="nofollow">IR Sensor Set</a> or </p><a href="http://www.cytron.com.my/viewProduct.php?pcode=SN-E18-B03N1&name=Digital%20Infrared%20Sensor" rel="nofollow">Digital Infrared Sensor</a>
<p>It's <a href="https://learn.adafruit.com/ir-sensor/overview" rel="nofollow">this one</a>, these kind of sensors are widely used in household appliances, they have one lead for 5 volts and one for ground. When an infrared beam hits it the first pin goes HIGH (talking about logic), they are very fast, allowing to capture remote signals by a series of HIGHs and LOWs. </p><p>Sorry for the delay.</p>
<p>fantastic! i'm about to try it out. but what is the black box at the bottom of the arduino? where can i get it? thank you!</p>
It's a home made case made out of wood, it has a hollow space inside to store two 9v batteries and a switch to control the power, here's a pic of it. Sadly I didn't take any photos when making it so I can't do an instructable about it.<br><br>Also thank you guys for your support!
<p>thanks! is there anywhere i can your complete codes for this project? i'm really having a hard time figuring it out. it would be really helpful to have some guidance. thanks!</p>
<p>Codes are at the beginning of the instructable, just before the &quot;Intro&quot; step, at the &quot;To make it you will need:&quot; list.</p><p>I'll make it more visible since some people have also asked about the program.</p>
<p>Hello, I was wondering, How can I use this idea to control something that I don't have the remote for? I'm having great difficulty finding proper code, and ways to get code from the internet and use them on my Arduino. I was using https://github.com/shirriff/Arduino-IRremote with http://www.remotecentral.com/cgi-bin/mboard/whichremote/thread.cgi?1887 which gave me no results after weeks of trying. (It doesn't help that I'm not a skilled programmer, either.) The device that i'm trying to control is a Sony BDV-E370 blue ray home theater system that I picked up at a yard sale for 5 bucks :D Anyways, I want to use it properly, without having to buy a replacement remote (Which Amazon.com won't sell to me, because I live in Canada, and Amazon.ca don't have it.). Thanks for reading, I really hope you look into this, keep in touch with me, and have a nice day! :)</p>
<p>Best way to find a code for a device with no remote is to search the web. Doing a google search with Sony BDV-E370 ir codes shows this page as first result, which actually contains the whole list of codes for the remote: </p><p><a href="http://www.remotecentral.com/cgi-bin/mboard/whichremote/thread.cgi?1887" rel="nofollow">http://www.remotecentral.com/cgi-bin/mboard/whichr...</a></p><p>Hope it helps!</p>
<p>I've searched high and low on google for codes, but none of them worked on the arduino.</p>
<p>As sourcery said you can find the codes on the internet, the bad thing is they come with rare formats to be used with universal remotes, usually this codes are contained in hexadecimal formats, I'm unaware about the possible interpretation and implementation to use with the Arduino program I've made since it's designed to work with natural numbers.</p><p>It would be better to buy an universal remote and upload the files, if you wanted to use the Arduino you would have to pass the hex code to integers that represent the times of the signal and then encase them into the functions of the program, what would be a very tedious task.</p>
<p>Thank you for some feedback, i'm probably just going to go for the universal remote, because that's Waaaaaaay too advanced for me to do. I've tried to use the hex codes in the code, but no luck. I gave up on trying it. </p>
<p>Hi Victor,</p><p>I'd suggest putting those codes in ROM, then just loop through them. It will reduce you program length and make it easier to read.</p><p>eg:</p><p>const int IRCmd1[] = {4440, 4400, 540, 1660, 520, 1660, 540, 1660,520, 560, 540, 560, 520, 560, 540, 560,520, 580, 520, 1660, 540, 1660, 520, 1660,540, 560, 520, 560, 540, 560, 520, 560,540, 560, 520, 580, 520, 1660, 540, 560,520, 560, 540, 560, 520, 560, 540, 560,520, 580, 520, 1660, 520, 580, 520, 1660,540, 1660, 520, 1660, 540, 1660, 520, 1660,520, 1680, 520, 0};</p><p>case x: i=0;</p><p>do {</p><p>pulseIR(IRCmd[i++]);</p><p>delayMicroseconds(IRCmd[i++]);</p><p>} while IRCmd[i];</p>
<p>Thanks, I thought about that when I was programming the remote program, I've been breaking my head to make something alike because when you run the code the operations that have to be made (++, finding and reading the array...) add time to the whole operation of sending a signal I still don't know if that delay caused by these operations could be negligible or it could cause the remote to malfunction, C is one of the fastest programming languages but taking into account the speed of the processor I'm not sure about if that code could cause problems.</p><p>I thought about counting the time with millis() between the beginning and the end of the operation and then subtract it from the delays. </p><p>Another thing I had in mind was some sort of conversion to an hexadecimal format to save space. At this point this would require libraries to keep it all clean and neat and to avoid going insane.</p><p>Space is not too much of a problem since a charged remote program doesn't takes more than 1/3 or to 1/2 of the memory of the Arduino, but I must say it's a very good habit to think wisely and try to minimize the weight of the program whenever it's possible.</p><p>I'll work on it and I'll try to upload a new version with new features, maybe even recording code on the go. </p><p>Thanks for bringing this up.</p>
<p>Had another look, (clearly I'm having fun). If you look at the IR libs on the Arduino site, they use an int on change interrupt and a timer to measure the pulse width. This is a good way to measure the incoming pulse widths.</p><p>To send pulses out, setup your LED output (ie pin D2) with &quot;tone(PIN2, 38000);&quot; then just use &quot;DDRD |= ~4&quot; to turn it on and &quot;DDRD |= 4&quot; to turn it off.</p>
<p>Victor8o5, I think this is a great Instructible and wonder if you could attach the complete code that you used ? I would like to see the menus and sub menus with your IR commands . Your code description sounds logical I have tried using a menu system before , but with my limited skills I was not able to get it to run. </p><p>Thank you so much for sharing ,</p><p>Build_it_Bob </p>
<p>I just found the link to the code ...I will start looking through it now .</p><p>Thanks again !</p><p>Build_it_Bob</p>
<p>Excellent! This is just what I have been needing.</p>
Just finished making this project just have to put it in a box and all done. Excellent instructable, great project. If anyone is wanting to do this project I would recommend just using Victor8o5's code and pasting in the ir code gathered in the spots where it is supposed to go.
<p>You individually read the IR signals from all of your remotes??? You win the remote control patience award. A device designed for the lazy, turned into something worthy of a monk. A lazy monk, but a monk nonetheless.</p><p>As someone who gets frustrated programming my Logitech Harmonies, this is glorious. The remote control singularity. Now it just needs a case.</p>
<p>Yeah, It might be a bit tedious, but it's the simplest way, I guess it's not that bad, you just point the remote to the sensor, press a button and the code gathering program will encase the times in functions for you, so you just have to copy and paste that block of functions in its corresponding case.</p><p>It's quite fast actually, recording 10 buttons doesn't takes you more than 3 minutes.</p><p>And yes, I can feel the irony, just the main code took me several weeks of programming.</p>
<p>what kind of arduino you use?</p>
<p>Its a copy of the Arduino UNO, called &quot;freaduino&quot; it works exactly the same, same pins, same disposition, same power, same code... but is has the chip embedded on the pcb and some extra features like a 3.3 to 5 switch to chose the output of the digital pins, it also has svg pins.</p><p>You won't have any problem if you use the code with your original Arduino UNO.</p>
<p>I love it. Anyone with the patience to fully solve this problem deserves a medal. Like the guy who made an end grain coffee table in his apartment without clamps. Or the girl who made a chainmaille shirt with needlenose pliers and poptabs. You rock, dude. </p><p>Enjoy the year of pro membership that comes with the feature, and I'm setting you up with 3 bonus months of pro to gift to someone else. Or for yourself, as I won't be following up. :D</p>
^ like
Ok I'm 8 and I know how to program so come to me
<p>Wow! I was 16 when I started programming.</p>
<p>Bravissimo !!!</p>

About This Instructable




Bio: I'm an electronic engineering student. I don't usually have much spare time but I like to work on random projects to keep myself ... More »
More by Victor805:The Joule Blinker Cheap caliper battery life hack Wood LED Desk Lamp 
Add instructable to: