There are two stages to this: one is to record the IR signals, the other is to then replay these signals. Fortunately both of these are made very easy using existing libraries. Ken Sherriff's blog has information about the Multi-Protocol Infrared Remote Library for the Arduino. I'm not going to repeat the information here, because the blog post is well written and I just used a very slightly modified version of the IRsend and IRrecv scripts in his examples.
With the IRrecv script you can record and decode the IR signals from an existing remote. Basically you need to:
- Install the library
- Use IRrecvDump sketch from the examples
- Use the Serial Monitor in the Arduino IDE to monitor the output of the Arduino
- Note the hexadecimal codes for the remote
For example, this video shows the recording of commands from the Apple TV Remote:
This was then performed for selected remote control button presses on the F&H TV and the Apple TV. Some of the identified codes are below:
F&H Codes
Power: Decoded NEC: 20DF10EF (32 bits)
Mute: Decoded NEC: 20DF906F (32 bits)
Up: Decoded NEC: 20DF02FD (32 bits)
Down: Decoded NEC: 20DF827D (32 bits)
Left: Decoded NEC: 20DFE01F (32 bits)
Right: Decoded NEC: 20DF609F (32 bits)
OK: Decoded NEC: 20DF22DD (32 bits)
Input: Decoded NEC: 20DFD02F (32 bits)
TV: Decoded NEC: 20DF0AF5 (32 bits)
Apple TV Remote Codes
Up: Decoded NEC: 77E15057 (32 bits)
Down: Decoded NEC: 77E13057 (32 bits)
Left: Decoded NEC: 77E19057 (32 bits)
Right: Decoded NEC: 77E16057 (32 bits)
Centre button: Decoded NEC: 77E13A57 (32 bits)
Menu: Decoded NEC: 77E1C057 (32 bits)
Play/Pause: Decoded NEC: 77E1FA57 (32 bits)
You can then modify the IRsend Example to send the particular codes for your TV. You need to call a specific function in the library for the "type" of remote, e.g. NEC, and then pass the hexadecimal for the actual code. I've been making specific functions for particular IR codes, e.g. power_tv() in this case:
void power_tv(){
irsend.sendNEC(0x20DF10EF, 32);
}
What is slightly annoying is that the TV doesn't have a single button way of changing to a particular HDMI input. Therefore you have to do a really stupid hack where you activate the input menu and scroll down a specified number of times to get to HDMI 1 input!
The code for doing this is:
void switch_to_hdmi1()
{
irsend.sendNEC(0x20DF0AF5, 32); // switch to TV (not DTV)
delay(5500);
irsend.sendNEC(0x20DFD02F, 32); // input menu
delay(800);
for(int i=0;i<5;i++) // go down the menu 5 times
{
irsend.sendNEC(0x20DF827D, 32); // down
delay(400);
}
}
So I can now get the Arduino to switch to particular channels on the TV, switch on the Apple TV and navigate menus. This is also integrated with the rest of my home automation system.
This was the Arduino setup during the development phase... it is slightly more discrete now :)
Note: in the picture on the right you can see that I'm using a XRF module from Ciseco to wirelessly send signals to the Arduino.
No comments:
Post a Comment