sexta-feira, 6 de dezembro de 2013

Decodificando Controles Remotos

Dessa vez coloquei as mãos na massa e com o material que já tenho, pude dar o primeiro passo para montagem do Módulo Controlador Secundário, mais precisamente, a parte que envia comandos infravermelhos para as TV's.

O controle remoto manda esses comandos através de pulsos de luz infravermelha (invisíveis aos nossos olhos) que são decodificados pela sua TV seguindo protocolos específicos. Isso significa dizer que, dependendo do aparelho, existem formas diferentes de tratar esses pulsos. Para quem tiver interesse em saber mais alguns detalhes sobre esse assunto, pode dar uma olhadinha em http://eletronicos.hsw.uol.com.br/controle-remoto2.htm

Lidar com envio/recebimento infravermelho de um controle remoto de maneira crua (raw data) foi algo que descartei de imediato.
Graças a abençoada abstração nossa de cada dia, foi possível tratar tudo isso de forma tranquila. Utilizando a biblioteca IRRemote (https://github.com/shirriff/Arduino-IRremote), pude descobrir os códigos, o protocolo e o número de bits dos comandos enviados por vários controles. 

Baixei a biblioteca, copiei para a pasta libraries onde está instalada a minha IDE Arduíno e dessa forma ficou pronta para uso.
 
MATERIAL
  • Módulo receptor infravermelho
  • Placa Arduíno Uno R3
  • Fios jumpers
  • Cabo USB
  • Controle Remoto
Material para decodificação

























Utilizei o Fritzing (http://fritzing.org) para elaborar o esquema da montagem na protoboard. Esse software também será importante para desenhar a placa de circuito impresso, portanto, se você tem interesse em fazer essas montagens virtuais e ainda não conhece nenhuma ferramenta, recomendo fortemente o Fritzing.



Receptor IR - Esquema de montagem na protoboard

























Montar esse esquema foi bastante simples. Dois fios saindo dos pinos GND e 5V da placa Arduíno para compor a alimentação na protoboard e mais um fio saindo do pino 11 para ser conectado ao pino de sinal do receptor IR.


Receptor IR - Visão frontal da placa Arduíno

Receptor IR - Ligação dos fios entre a placa e a protoboard












































Feita a conexão dos fios, pluguei o receptor IR, composto por três pinos, conforme a associação abaixo:

Pino "-": fio vindo do GND
Pino "+": fio vindo do 5V
Pino "S":  fio vindo do pino 11

Associação do receptor IR aos fios jumpers


















Resultado final do circuito montado





















O sketch que utilizei para receber os sinais infravermelhos, decodificar e mostrar na tela para o usuário,  acompanha a biblioteca IRRemote, o IRRecvDump:


Não foi necessário fazer nenhuma modificação no código original. Destaquei os pontos importantes onde a biblioteca faz a sua parte.


#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
     Serial.begin(9600);
     irrecv.enableIRIn(); //Inicializa o receptor IR
}

//Identifica o protocolo utilizado e imprime o código enviado
 
void dump(decode_results *results) {
     int count = results->rawlen;
     if (results->decode_type == UNKNOWN) {
          Serial.println("Could not decode message");
     }
     else {
          if (results->decode_type ==
NEC) {
               Serial.print("Decoded NEC: ");
          }

         else if (results->decode_type == SONY) {
              Serial.print("Decoded SONY: ");
         }
         else if (results->decode_type ==
RC5) {
              Serial.print("Decoded RC5: ");
         }
         else if (results->decode_type ==
RC6) {
              Serial.print("Decoded RC6: ");
         }
         Serial.print(
results->value, HEX);
         Serial.print(" (");
         Serial.print(
results->bits, DEC);
         Serial.println(" bits)");
     }
     Serial.print("Raw (");
     Serial.print(count, DEC);
     Serial.print("): ");

     for (int i = 0; i < count; i++) {
          if ((i % 2) == 1) {
               Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
          }
          else {
               Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
          }
          Serial.print(" ");
     }
     Serial.println("");
}

void loop() {
 
     if (irrecv.decode(&results)) {  // Aqui a MÁGICA acontece.
          Serial.println(results.value, HEX);
          dump(&results);

          irrecv.resume(); // Lê mais valores caso existam
      }
}


Após a protoboard montada e sketch codificado, conectei o cabo USB ligando a placa ao computador e fiz o upload desse sketch, em seguida abri a console serial da IDE Arduíno e começei os testes. Veja alguns resultados obtidos:

 
























Dispositivo: Controle remoto do kit infravermelho
Botão: 0
Protocolo: NEC
Código: FF6897
Bits: 32




Dispositivo: Controle remoto da TV da sala 
Botão: Baixar volume
Protocolo: NEC
Código: 20DFC03F
Bits: 32


Dispositivo: Controle remoto do receptor de TV a cabo
Botão: Subir volume
Protocolo: NEC
Código: E17AB04F
Bits: 32




Dispositivo: Controle remoto do home theater
Botão: Desligar
Protocolo: SONY
Código: B
Bits: 15


Após receber cada código, fiz anotação de todos os valores, conforme estes mostrados acima, pois precisarei deles para substituir os controles remotos e poder controlar tudo a partir do meu tablet.

No próximo post, farei testes com esses códigos obtidos, enviando comandos para ligar e desligar minha TV à partir do meu notebook. Até breve...

 




12 comentários:

  1. Muito bom. Post muito rico de informações.

    ResponderExcluir
    Respostas
    1. Obrigado David, pretendo enriquecer ao máximo e deixar em forma de links o que é comum e fácil de encontrar.

      Excluir
  2. Helinho você está demais. Vai dar aula rapá. Parabéns.

    ResponderExcluir
    Respostas
    1. Obrigado Leal. Blog do Leal ? Hummmm, quero ver esse blog !!! :-)

      Excluir
  3. bom dia, vc conseguiu decodificar o controle da sansung?

    ResponderExcluir
  4. Bom dia não consigo decodificar controle da samsung só aparece 0 alguém sabe o porque?

    ResponderExcluir
  5. Bom dia não consigo decodificar controle da samsung só aparece 0 alguém sabe o porque?

    ResponderExcluir
  6. Bom dia pra codificar um controle remoto 433,92 seria possivel alterando o receptor IR pra um 433,92 com o mesmo codigo?

    ResponderExcluir
  7. Bom dia Echo, não entendi muito bem o que você quiz dizer com codificar controle remoto. Sei que alguns controles RF 433Mhz possuem um chip responsável pela codificação que deve estar presente também no receptor para que a comunicação seja completa. Em outra postagem minha eu utilizo um controle desses RF 433, mas eles não são utilizados em equipamentos eletrônicos como TV, ar condicionado, etc, eu sempre vejo em portões eletrônicos.

    ResponderExcluir
  8. Eu tenho uma tv a cabo comunitário com 32 canais analogico. Quero que me ajudam
    a criar um concetrador para ficar na minha central e um receptor para ficar nos meus clientes, eu so quero um receptor no cliente para desligar quando o cliente nao paga, para não esta sempre a subir no posto para liga e desligar.por por favor me ajudem.

    ResponderExcluir