Lâmpada de LED por controle remoto



Procedimentos para decodificação do controle remoto – Emissor e receptor infravermelho

Para fins deste projeto utilizamos o emissor apenas para enviar as mesmas funções que o controle remoto próprio do sistema da lâmpada de LED envia ao receptor IV, interno à lâmpada. Para os procedimentos desta decodificação empregamos o circuito mostrado na figura a seguir e descrito no próximo parágrafo.

Imagem do circuito de teste para procedimentos de decodificação do controle remoto, para usar o emissor junto ao receptor da lâmpada de LED RGB, posteriormente.





Os componentes que foram utilizados nesta etapa foram 1 receptor IV (interno à lâmpada de LED – na figura utilizamos um receptor IR para teste e reconhecimento dos padrões do controle remoto), 1 LEDemissor infravermelho (IV), cabos de conexão e 1 controle remoto (como mostrado na figura acima), que veio com a lâmpada de LED.
Primeiramente é importante utilizar o receptor IV (ou IR, do inglês infrared) para receber os comandos do controle remoto, a fim de se decodificar cada uma das teclas. Posteriormente, com estes padrões de decodificação, utilizamos nos comandos de "if" dentro da rotina do emissor infravermelho, a fim de que possa se comandar a lâmpada de LED remotamente, por meio do arduino (o emissor envia os códigos ao receptor infravermelho, por meio do arduino; com isso o receptor decodifica os sinais e permite a mudança de cada uma das cores da lâmpada, além de outras funções). 

Programação para o receptor infravermelho – decodificação


Para a programação do receptor, montamos um circuito de teste com receptor que consistiu basicamente do receptor conectado a um resistor de 220ohms (apenas por questão e segurança, mas a inclusão do resistor é opcional) no terminal que se conecta aos 5V do arduino. O primeiro terminal do receptor conecta-se a uma porta digital (para o teste utilizamos a porta 2) e o último ao GND do Arduino. Com isso, temos o seguinte circuito:

Circuito montado para decodificção do controle remoto. No caso do nosso projeto, não precisamos utilizar o LED vermelho (opcional) pois o propósito foi apenas a decodificação do controle remoto. Na montagem, colocamos um resistor de 220ohms como segurança, mas não é necessário, para fins de teste.

Assim, basta fazer o upload da programação para Arduino, e quando terminado, apertar os botões do controle remoto e anotar cada código gerado na saída do monitor serial. Finalizado o processo, volta-se a programação do receptor e se insere cada um dos códigos em várias condições if, de modo a verificar se correspondem a função e cada uma das teclas. 

Caso esteja certo, pode-se utilizar estas condições na programação para o emissor, criando assim um controle remoto para a lâmpada de LED (que possui um receptor dentro dela), acionado pelo arduino. Assim, vamos às programações:

Parte I - Programação do Receptor

Antes de mais nada, deve-se baixar uma bilbioteca para controlar o infravermelho, a biblioteca IRemote. Após isso, se extrai a bilbioteca na pasta "libraries" da IDE do Arduino. Para a versão 1.0, e posteriores, da IDE do Arduino, abra o arquivo "IRRemoteInt.h" com um editor de texto e no editor troca-se a linha "#include " para "#include ". 
Esta programação permite reconhecer os códigos do controle remoto ao aperto de um botão. Ou seja, decodifica-se assim cada uma de suas funções. Primeiramente devemos utilizar esta programação (quadro 1):


Quadro 1: Programação inicial do receptor para decodificação do controle remoto da lâmpada LED.
  #include
  #define FNV_PRIME_32 16777619
  #define FNV_BASIS_32 2166136261
 
  int ledPin1 = 13;   //Onde será ligado o led 1
  int RECV_PIN = 2;    //Onde será ligado o Receptor IR
  IRrecv irrecv(RECV_PIN);
  decode_results results;
 
  void setup()
  {
    pinMode(ledPin1, OUTPUT);  //Configurando o pino como saida
    irrecv.enableIRIn();   //Iniciando a recepção do sinal
    Serial.begin(9600);
  }
  int compare(unsigned int oldval, unsigned int newval) { 
    if (newval < oldval * .8) {
      return 0;
    }
    else if (oldval < newval * .8) {
      return 2;
    }
    else {
      return 1;
    }
  }
  unsigned long decodeHash(decode_results *results) {
    unsigned long hash = FNV_BASIS_32;
    for (int i = 1; i+2 < results->rawlen; i++) {
      int value =  compare(results->rawbuf[i], results->rawbuf[i+2]);
      hash = (hash * FNV_PRIME_32) ^ value;
    }
    return hash;
  } 
  void loop() {
    if (irrecv.decode(&results)) {
      Serial.print("'real' decode: ");     //Mostra o valor recebido
      Serial.print(results.value, HEX);    //!!!!!!!PARA IDENTIFICAR AS TEClAS
      Serial.print(", hash decode: ");     
      unsigned long hash = decodeHash(&results);
     Serial.println (hash);                 //Mostra o valor já decodificado!
      irrecv.resume(); // Obrigatório a reinicialização da recepção!

Fazendo o upload desta programação, permitimos ao sistema decodificar os sinais de cada uma das funções do controle remoto. Ao apertar cada um dos botões, na saída serial são mostrados os respectivos códigos. Os códigos de cada um dos botões do controle remoto são mostrados a seguir:


Quadro 2: Códigos obtidos para cada um dos botões do controle remoto no processo de decodificação anterior.
AUMENTA BRILHO - 1 - 'real' decode: FFA05F --- hash decode: 2878444831
DIMINUI BRILHO - 0 - 'real' decode: FF20DF --- hash decode: 1373912347
OFF ------------ D - 'real' decode: FF609F --- hash decode: 4287727287
ON ------------- L - 'real' decode: FFE01F --- hash decode: 4034314555

RED ------------ R - 'real' decode: FF906F --- hash decode: 3855596927
GREEN ---------- G - 'real' decode: FF10EF --- hash decode: 2351064443
BLUE ----------- B - 'real' decode: FF50AF --- hash decode: 713627999
WHITE ---------- W - 'real' decode: FFD02F --- hash decode: 3577243675

ORANGE --------- o - 'real' decode: FFB04F --- hash decode: 4039382595
LITE GREEN ----- g - 'real' decode: FF30CF --- hash decode: 2534850111
MEDIUM BLUE ---- b - 'real' decode: FF708F --- hash decode: 1153697755
FLASH ---------- F - 'real' decode: FFF00F --- hash decode: 900285023

DARK ORANGE ---- O - 'real' decode: FFA857 --- hash decode: 2747854299
LITE BLUE ------ z - 'real' decode: FF28D7 --- hash decode: 324312031
PURPLE --------- x - 'real' decode: FF6897 --- hash decode: 3238126971
STROBE --------- S - 'real' decode: FFE817 --- hash decode: 1541889663

DARK YELLOW ---- y - 'real' decode: FF9867 --- hash decode: 2538093563
BLUE GRREN ----- c - 'real' decode: FF18E7 --- hash decode: 1033561079
VIOLET --------- V - 'real' decode: FF58A7 --- hash decode: 3691091931
FADE ----------- < - 'real' decode: FFD827 --- hash decode: 2259740311

YELLOW --------- Y - 'real' decode: FF8877 --- hash decode: 2666828831
DARK BL. GREEN - C - 'real' decode: FF08F7 --- hash decode: 1162296347
LITE VIOLET ---- P - 'real' decode: FF48B7 --- hash decode: 4084712887
SMOOTH --------- - - 'real' decode: FFC837 --- hash decode: 2388475579

Assim, com os códigos obtidos para cada botão, voltamos a programação do receptor e testamos o mesmo controle para fins de verificação, associando cada código decodificado a uma respectiva tecla (conforme quadro anterior):

Quadro 3: Programação do Receptor infravermelho, atualizada para cada botão do controle remoto, decodificado.
#include
 #define FNV_PRIME_32 16777619
 #define FNV_BASIS_32 2166136261
 
  int ledPin1 = 13;   //Onde será ligado o led 1
  int RECV_PIN = 8;    //Onde será ligado o Receptor IR
  IRrecv irrecv(RECV_PIN);
  decode_results results;
 
  void setup()
  {
    pinMode(ledPin1, OUTPUT);  //Configurando o pino como saida
    irrecv.enableIRIn();   //Iniciando a recepção do sinal
    Serial.begin(9600);
  }
  int compare(unsigned int oldval, unsigned int newval) { 
    if (newval < oldval * .8) {
      return 0;
    }
    else if (oldval < newval * .8) {
      return 2;
    }
    else {
      return 1;
    }
  }
  unsigned long decodeHash(decode_results *results) {
    unsigned long hash = FNV_BASIS_32;
    for (int i = 1; i+2 < results->rawlen; i++) {
      int value =  compare(results->rawbuf[i], results->rawbuf[i+2]);
      hash = (hash * FNV_PRIME_32) ^ value;
    }
    return hash;
  } 
  void loop() {
    char tecla;
    tecla = Serial.read();
   
    if (irrecv.decode(&results)) {
      unsigned long hash = decodeHash(&results);
      irrecv.resume(); // Obrigatório a reinicialização da recepção!
   
      if (tecla == '1'){  
        hash = 2878444831;
        Serial.println (" Aumenta o Brilho!");
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);        
       }
      if (tecla == '0'){
        hash = 1373912347;
        Serial.println (" Diminui o Brilho!");
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);
       }      
       if (tecla == 'D'){
         hash = 4287727287;
         Serial.println (" Desliga!");
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);       
       }
       if (tecla == 'L'){
         hash = 4034314555;
         Serial.println (" Liga!");    
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);     
        }
       if (tecla == 'R'){
         hash = 3855596927;
         Serial.println (" VERMELHO!");
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);
         }
       if (tecla == 'G'){
         hash = 2351064443;
         Serial.println (" VERDE!");
          digitalWrite(ledPin1, HIGH); 
          delay(100); 
          digitalWrite(ledPin1, LOW);
         } 
       if (tecla == 'B'){
         hash = 713627999;
         Serial.println (" AZUL!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }    
       if (tecla == 'W'){
         hash = 3577243675;
         Serial.println (" BRANCO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'o'){
         hash = 4039382595;
         Serial.println (" LARANJA!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'g'){
        hash = 2534850111;
        Serial.println (" VERDE CLARO!");
        digitalWrite(ledPin1, HIGH); 
        delay(100); 
        digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'b'){
         hash = 1153697755;
         Serial.println (" AZUL MEDIO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'F'){
         hash = 900285023;
         Serial.println (" FLASH!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'O'){
         hash = 2747854299;
         Serial.println (" LARANJA ESCURO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'z'){
         hash = 324312031;
         Serial.println (" AZUL CLARO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'x'){
         hash = 3238126971;
         Serial.println (" ROXO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'S'){
         hash = 1541889663;
         Serial.println (" ESTROBO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'y'){
         hash = 2538093563;
         Serial.println (" AMARELO ESCURO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'c'){
         hash = 1033561079;
         Serial.println (" VERDE ÁGUA!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'V'){
         hash = 3691091931;
         Serial.println (" VIOLETA!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == '<'){
         hash = 2259740311;
         Serial.println (" ESMAECER");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'Y'){
         hash = 2666828831;
         Serial.println (" AMARELO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'C'){
         hash = 1162296347;
         Serial.println (" COBALTO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == 'P'){
         hash = 4084712887;
         Serial.println (" VIOLETA CLARO!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
       if (tecla == '-'){
         hash = 2388475579;
         Serial.println (" SMOOTH!");
         digitalWrite(ledPin1, HIGH); 
         delay(100); 
         digitalWrite(ledPin1, LOW);
       }
    }
   Serial.println (“\n");
  }


Compilada e verificada, notamos que as funções estavam corretas, conforme acionamos as respectivas teclas do teclado do PC, responsáveis pelo acionamento das respectivas funções (como mostrado no quadro 6). Sendo assim, utilizamos esta mesma lógica na programação do emissor infravermelho. No caso do emissor a montagem que utilizamos é mostrada na figura ao lado, ou seja, um emissor infravermelho conectado a um resistor de 220ohms, em seu terminal positivo (ânodo), conectando-se a porta digital D3, com o outro terminal conectando-se ao GND do Arduino.


 

Parte II - Programação do Emissor:


Desse modo verificamos a programação do emissor para acionamento da lâmpada de LED RGB utilizada no projeto. Como os códigos do controle remoto da lâmpada foram decodificados anteriormente, basta utilizar a parte das condições de if junto a programação normal do emissor, a qual foi apresentada no Quadro 4.

Nenhum comentário :

Postar um comentário

Deixe aqui seus comentários, críticas, sugestões de melhorias, dúvidas, o que quiser. Mas por favor, seja educado e claro. OK?