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.
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?