Neste exemplo vou mostrar como faço para “ler” um controle remoto através do Arduino e com este mesmo Arduino enviar os comandos “lidos” do controle remoto para um determinado dispositivo. Vou utilizar o mini system Philips FW-C390 para demonstrar. A ideia também vale para televisores, decodificadores, DVDs e etc. Devem ser respeitados o tipos de código e taxas de bits de cada um. Ex.: NEC, Sony, PANASONIC, RC5, RC6 e etc.

Material utilizado
Arduino Uno Rev 3
Ethernet shield W5100
Cabo USB plug A e B macho/macho
LED receptor infravermelho compativel com 38 KHz
LED emissor infravermelho para controle remoto
Resistor 330 Ohm 1/4W
Jumper macho/macho
Protoboard
Mini System Philips FW-C390 com controle remoto
Vamos começar baixando a IDE Arduino 1.0.4 (Windows, MAC ou Linux) e a biblioteca IRremote. Enquanto escrevo, a última versão da IDE é a “1.8.2”, porém esta apresentou incompatibilidade com a biblioteca “IRremote”.
Considerando que tenham baixado ambos, comecem extraindo o IDE Arduino. Podem deixá-lo na área de trabalho mesmo. Procurem a pasta por nome de “libraries” e cole o conteúdo extraído do arquivo IRremote nela.
Abra a IDE Arduino e clique conforme abaixo:
File > Examples > IRremote > IRrecvDump
Com o programa “IRrecvDump” aberto, faça o upload deste para sua placa Arduino. Agora vamos montar o circuito conforme abaixo:

Foto da montagem

Direcione o controle remoto para o sensor infravermelho e pressione os botões POWER, CD e TAPE 1/2 para conferir. Será mostrado no monitor da serial do IDE Arduino algo mais ou menos assim:
C4C Decoded RC5: C4C (12 bits) Raw (22): 3638 850 -900 850 -900 850 -900 1700 -950 800 -950 800 -1800 1700 -900 850 -1800 850 -900 1700 -950 800 53F Decoded RC5: 53F (12 bits) Raw (22): -15018 800 -950 1700 -1800 1700 -1800 1650 -950 850 -1800 800 -950 800 -900 850 -950 800 -900 850 -950 800 CBF Decoded RC5: CBF (12 bits) Raw (24): -24792 800 -950 800 -950 800 -950 1700 -950 800 -1800 1700 -1800 800 -950 800 -950 800 -950 800 -950 800 -950 800
Vejam que foram gerados para os botões POWER, CD e TAPE 1/2 os códigos de 12 bits C4C, 53F e CBF respectivamente. Repita o processo para os demais botõs desejados. Eu achei interessante utilizar 9 botões do controle remoto. São eles: POWER, CD, TAPE 1/2, TUNER, AUX, DIMINUI VOLUME, AUMENTA VOLUME, DIMINUI CANAL E AUMENTA CANAL (apelidei os 2 últimos). Recomendo que façam uma “cola” contendo os nomes dos botões e seus respectivos códigos. Isso ajuda bastante nos próximos passos.
A minha intenção é controlar o mini system através de meu smartphone ou notebook. Agora é que entra o Ethernet Shield. Observem o código abaixo:
/*
LED emissor: PWM 3
*/
#include <SPI.h>
#include <Ethernet.h>
#include <IRremote.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 3);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(80);
IRsend irsend;
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
}
void loop() {
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
String vars;
while (client.connected()) {
if (client.available()) {
char c = client.read();
vars.concat(c);
if (vars.endsWith("/controle1")) {
//botão POWER
irsend.sendRC5(0xC4C, 12);
delay(100);
}
if (vars.endsWith("/controle2")) {
//botão CD
irsend.sendRC5(0x53F, 12);
delay(100);
}
if (vars.endsWith("/controle3")) {
//botão TAPE 1/2
irsend.sendRC5(0xCBF, 12);
delay(100);
}
if (vars.endsWith("/controle4")) {
//botão TUNER
irsend.sendRC5(0xC7F, 12);
delay(100);
}
if (vars.endsWith("/controle5")) {
//botão AUX
irsend.sendRC5(0xD7F, 12);
delay(100);
}
if (vars.endsWith("/controle6")) {
//botão VOLUME MENOS
irsend.sendRC5(0xC11, 12);
delay(100);
}
if (vars.endsWith("/controle7")) {
//botão VOLUME MAIS
irsend.sendRC5(0xC10, 12);
delay(100);
}
if (vars.endsWith("/controle8")) {
//botão CANAL MENOS
irsend.sendRC5(0xC5F, 12);
delay(100);
}
if (vars.endsWith("/controle9")) {
//botão CANAL MAIS
irsend.sendRC5(0xC5E, 12);
delay(100);
}
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<title>Philips FW-C390</title>");
client.println("</head>");
client.println("<body>");
client.println("<a href='/controle1'><button style='width:150px; height:40px;'>POWER</button></a><br/>");
client.println("<a href='/controle2'><button style='width:150px; height:40px;'>CD</button></a><br/>");
client.println("<a href='/controle3'><button style='width:150px; height:40px;'>TAPE 1/2</button></a><br/>");
client.println("<a href='/controle4'><button style='width:150px; height:40px;'>TUNER</button></a><br/>");
client.println("<a href='/controle5'><button style='width:150px; height:40px;'>AUX</button></a><br/>");
client.println("<a href='/controle6'><button style='width:150px; height:40px;'>VOLUME -</button></a><br/>");
client.println("<a href='/controle7'><button style='width:150px; height:40px;'>VOLUME +</button></a><br/>");
client.println("<a href='/controle8'><button style='width:150px; height:40px;'>CANAL -</button></a><br/>");
client.println("<a href='/controle9'><button style='width:150px; height:40px;'>CANAL +</button></a><br/>");
client.println("</body>");
client.println("</html>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
Observem que antes do código mostrado no monitor da serial temos um 0x. É uma sintaxe obrigatória.
//se a string concatenada terminar com /controle1
if (vars.endsWith("/controle1")) {
//então envia o código C4C do tipo RC5 de 12 bits
irsend.sendRC5(0xC4C, 12);
//com duração de 100 milisegundos para o LED emissor
delay(100);
}
Considerando que o upload do código acima foi feito em seu Arduino, vamos montar o circuito que envia os dados através do LED emissor.

Foto da montagem

Se notarem que o nosso novo controle só funciona muito próximo ao dispositivo a ser controlado, tentem remover o resisotor de 330 Ohm. A seguir vejam como o programa ficou em um computador com o navegador Google Chrome.

Por que não conseguimos enxergar a luz emitida pelos controles remotos?
A luz possue um comprimento de onda que determinam as cores. Os olhos humanos apenas conseguem enxergar estas ondas, quando estas vão desde a cor vermelha (430 nanômetros aproximados) até a cor violeta (700 nanômetros aproximados). Abaixo desta faixa temos o infravermelho (controle remoto) e acima, o ultravioleta (sol). Caso queiram muito ver seu controle remoto emitindo luz, o aponte para a câmera do seu smartphone enquanto aperta qualquer botão.
