Controle remoto IR com Arduino
Ao longo dos nossos tutoriais nós apresentamos uma infinidade de soluções para que você pudesse desenvolver sistemas de acionamento com botões, com comandos através da IDE do Arduino, com elementos criados a partir de códigos HTML, entre outros. Neste tutorial, nós vamos aprender a realizar acionamentos com mais um elemento, ou melhor, um conjunto de elementos, o kit controle remoto IR + receptor IR.
[toc]
O kit Controle remoto IR + Receptor IR
O kit controle remoto IR + Receptor IR consiste em um conjunto composto por um controle remoto dotado de uma bateria, um módulo receptor de infravermelho, um led infravermelho e alguns jumpers para que o usuário utilize caso seja necessário.
Como funciona o controle remoto infravermelho
Um controle remoto IR é composto por um teclado com diversos botões, um microcontrolador e um LED emissor infravermelho, que em geral ficar em sua parte superior.
Seu princípio de funcionamento é bem simples. No momento em que um dos seus botões é pressionado, uma sequência de pulsos luminosos é emitida através do LED infravermelho. Esta sequência corresponde a um número em hexadecimal, que por sua vez, diz respeito ao código em questão.
Os equipamentos a serem controlados possuem um módulo receptor de infravermelho que recebe os pulsos luminosos e traduz os mesmos em uma sequência de pulsos elétricos.
Sabendo disso, quando vamos implementar alguma aplicação com um controle remoto, nós devemos primeiramente mapear o controle, pois, nós não sabemos o código proveniente de cada botão logo de início. Após conhecermos o resultado de cada um dos comandos de um determinado controle, já podemos partir para o desenvolvimento de alguma solução de automação utilizando o mesmo.
– Modulação Infravermelha
A luz infravermelha é um tipo de radiação emitida pelo sol, lâmpadas e qualquer outra coisa que emane calor. Para que estes outras fontes de radiação infravermelha não interfiram no sinal transmitido entre controle e receptor, é utilizada a técnica de modulação de sinal.
Nessa técnica, inserimos a informação transmitida dentro de outra frequência, que no nosso caso será de 38kHz. Para isso precisamos de um modulador e um demodulador.
O modulador existente dentro do controle remoto transforma o código em hexadecimal que representa o botão pressionado em um sinal dentro da frequência de 38kHz. Posteriormente, o sinal em questão é enviado pelo LED IR.
O demodulador fará parte do módulo receptor, o qual, recebe a informação modulada e faz a demodulação para recuperar a informação original.
A seguir é possível comparar o sinal transmitido e o modulado no osciloscópio.
Em cima vemos o sinal modulado em 38Khz e em baixo vemos o sinal desmodulado.
Mãos à obra – Acionando saídas digitais com o kit Controle remoto IR + Receptor IR
Componentes necessários
Para desenvolver este projeto, precisaremos dos seguintes componentes:
- 1 x Arduino UNO
- 1 x Kit controle remoto IR + Receptor IR
- 1 x Protoboard 830 pontos
- 1 x Led difuso verde
- 1 x Resistor 330 Ω
Montando o projeto
Programando
Neste momento nós iremos apresentar o primeiro código que deve ser utilizado. O programa em questão serve para ajudar o usuário a mapear os botões do controle, ou seja, serve para que o operador do sistema saiba qual será o dado que chegará para a nossa placa Arduino quando um determinado botão for acionado.
#include <IRremote.h> IRrecv receptor(10); decode_results resultado; void setup() { Serial.begin(9600); receptor.enableIRIn(); } void loop() { if (receptor.decode(&resultado)) { Serial.println(resultado.value, HEX); receptor.resume(); } delay(100); }
Após compilarmos o código apresentado, basta pressionarmos os botões do controle, um a um, para então anotarmos os códigos relacionados a cada um dos mesmos.
Em seguida, nós vamos utilizar um outro código, que por sua vez, será o responsável pelo desenvolvimento da aplicação propriamente dita.
#include <IRremote.h> IRrecv receptor(10); decode_results resultado; int codigo; void setup() { pinMode(5, OUTPUT); receptor.enableIRIn(); Serial.begin(9600); } void loop() { if (receptor.decode(&resultado)) { Serial.print("Codigo do botao: "); Serial.println(resultado.value, HEX); codigo = resultado.value; switch (codigo) { case (0xFF6987): digitalWrite (5,HIGH); break; case (0xFF9867): digitalWrite (5,LOW); break; } receptor.resume(); } delay(100); }
Colocando para funcionar
[ Vou incluir uma foto do hardware montado aqui Allan, o que acha?]
Entendendo a fundo
Software – Mapeamento dos botões
Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível mapearmos os botões do nosso controle IR.
– Incluindo as bibliotecas que serão utilizadas
O primeiro passo que devemos realizar para atingir o objetivo proposto consiste na inclusão da biblioteca adequada para permitir a interação do receptor IR com o Arduino UNO. Neste tutorial, nós vamos utilizar uma biblioteca chamada IRremote.h, que por sua vez, pode ser obtida aqui.
#include <IRremote.h>
– Criando o objeto da classe IRrecv
Na parte de criação de objetos, nós devemos criar um objeto chamado receptor, que por sua vez, está atrelado ao pino que será utilizado para o recebimento de dados por meio do receptor IR.
IRrecv receptor(10);
– Criando o objeto da classe decode_results
Em seguida, nós devemos criar um outro objeto chamado resultado cuja função será fazer a interface para o recebimento de dados em nosso código.
decode_results resultado;
– Definindo as configurações iniciais
Na função setup() nós vamos iniciar a comunicação serial através da sentença Serial.begin() e em seguida vamos iniciar o funcionamento do nosso receptor IR por meio da sentença receptor.enableIRIn().
void setup() { Serial.begin(9600); receptor.enableIRIn(); }
– Mapeando os botões do controle remoto
Dentro da função loop() nós devemos primeiramente criar uma estrutura condicional if() cujo argumento será a sentença receptor.decode(&resultado). A função do procedimento citado consiste em fazer com que a nossa placa Arduino aguarde até o momento em que um botão do controle remoto seja pressionado, de modo que, somente após este ato, ocorrerá o prosseguimento da execução do programa.
Caso algum botão do controle seja pressionado, o Arduino deverá apresentar o valor em hexadecimal atrelado ao botão em questão no Serial Monitor em virtude da sentença Serial.println(resultado.value, HEX). Por último, utilizamos a sentença receptor.resume() para darmos prosseguimento à aplicação.
Para um melhor funcionamento da aplicação, utilize a função delay() no final da mesma para que a leitura realizada pelo receptor IR seja realizada da maneira adequada.
void loop() { if (receptor.decode(&resultado)) { Serial.println(resultado.value, HEX); receptor.resume(); } delay(100); }
Software – Acionando saídas digitais com um controle remoto
Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível mapearmos os botões do nosso controle IR.
– Incluindo as bibliotecas que serão utilizadas
O primeiro passo que devemos realizar para atingir o objetivo proposto consiste na inclusão da biblioteca adequada para permitir a interação do receptor IR com o Arduino UNO. Assim como no código anterior, nós vamos utilizar a biblioteca IRremote.h.
#include <IRremote.h>
– Criando o objeto da classe IRrecv
Na parte de criação de objetos, nós devemos criar um objeto chamado receptor, que por sua vez, está atrelado ao pino que será utilizado para o recebimento de dados por meio do receptor IR.
IRrecv receptor(10);
– Criando o objeto da classe decode_results
Em seguida, nós devemos criar um outro objeto chamado resultado cuja função será fazer a interface para o recebimento de dados em nosso código.
decode_results resultado;
– Declarando uma variável para armazenar o valor dos botões
Após a criação dos objetos nós devemos declarar um variável do tipo inteiro, cuja função será armazenar o valor recebido pelo receptor IR, para que este possa ser posteriormente utilizado no acionamento de uma saída digital.
int codigo;
– Definindo as configurações iniciais
Na função setup() nós vamos iniciar a comunicação serial através da sentença Serial.begin() e em seguida vamos iniciar o funcionamento do nosso receptor IR por meio da sentença receptor.enableIRIn(). Por último, nós definimos o modo de operação do pino 5 do Arduino UNO para que este atue como uma saída digital.
void setup() { Serial.begin(9600); receptor.enableIRIn(); pinMode(5, OUTPUT); }
– Acionando saídas digitais
Dentro da função loop() nós devemos primeiramente criar uma estrutura condicional if() cujo argumento será a sentença receptor.decode(&resultado). A função do procedimento citado consiste em fazer com que a nossa placa Arduino aguarde até o momento em que um botão do controle remoto seja pressionado, de modo que, somente após este ato, ocorrerá o prosseguimento da execução do programa.
Caso algum botão do controle seja pressionado, o Arduino deverá apresentar a frase “Codigo do botão:” seguida do valor em hexadecimal atrelado ao botão em questão em virtude das sentenças do tipo Serial.print() e Serial.println(). Posteriormente, nós armazenamos o valor citado na variável código, que por sua vez, será testada em uma estrutura do tipo switch/case, de modo que, caso o mesmo corresponda ao valor FF6987, a porta de saída digital 5 deverá ter nível alto em seu terminal, ao passo que, caso o valor citado corresponda à opção FF9867, o terminal citado deverá estar com nível baixo.
Assim como no caso anterior, para um melhor funcionamento da aplicação, utilize a função delay() no final da mesma para que a leitura realizada pelo receptor IR seja realizada da maneira adequada.
void loop() { if (receptor.decode(&resultado)) { Serial.print("Codigo do botao: "); Serial.println(resultado.value, HEX); codigo = resultado.value; switch (codigo) { case (0xFF6987): digitalWrite (5,HIGH); break; case (0xFF9867): digitalWrite (5,LOW); break; } receptor.resume(); } delay(100); }
Considerações finais
Neste tutorial, demonstramos como você deve proceder para realizar acionamentos com o kit controle remoto IR + Receptor IR. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.
4 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Bom dia. Parabéns pelo blog, sensacional. Tentei compilar os códigos do controle mas fica repetindo o mesmo: FFFFFFFF mesmo apertando teclas diferentes.
eaí allan, achou legal a ideia do daniel?
bom dia;
poderia ajudar, como eu faço para digitar dois numero no case para monitorar atraves do pc o controle remoto;
ex 11, 12, 13 ………
case (’11’):{
Serial.println(“Canal 11”);
irsend.sendLegoPowerFunctions(0x197);
delay(2000);
irsend.sendLegoPowerFunctions(0x197, false);
delay(2000);
Serial.println(“Canal 11”);
break;
break;
case (’12’):{
Serial.println(“Canal 12”);
irsend.sendLegoPowerFunctions(0x197);
delay(2000);
irsend.sendLegoPowerFunctions(0x197, false);
delay(2000);
Serial.println(“Canal 12”);
break;
}
Boa tarde, a logica é a mesma para o acionamento de saídas analogicas? Modifiquei o código para saída analogica mas só recebo resposta quando a saída tem valor 255.
Segue o codigo utilizado
#include
IRrecv receptor(3);
decode_results resultado;
int codigo;
void setup()
{
pinMode(11, OUTPUT);
receptor.enableIRIn();
Serial.begin(9600);
}
void loop()
{
if (receptor.decode(&resultado))
{
Serial.print(“Codigo do botao: “);
Serial.println(resultado.value, HEX);
codigo = resultado.value;
switch (codigo)
{
case (0xFFA25D):
analogWrite (11, 0);
break;
case (0xFF22DD):
analogWrite (11, 61);
break;
case (0xFFE01F):
analogWrite (11, 105);
break;
case (0xFF6897):
analogWrite (11, 161);
break;
case (0xFF30CF):
analogWrite (11, 190);
break;
case (0xFF10EF):
analogWrite (11, 220);
break;
case (0xFF42BD):
analogWrite (11, 255);
break;
}
receptor.resume();
}
delay(100);
}