Usando o Arduino como controle remoto de infravermelho

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.