Controle Remoto IR para TV com Arduino
Fala projetista fora do comum! Você sabia que com o Arduino fica fácil de ler e enviar informações via infravermelho e controlar sua televisão, ar-condicionado, luzes, relés e muito mais? É isso mesmo que você leu! Hoje vamos nos divertir muito aprendendo como funciona um controle infravermelho, como funcionam alguns protocolos de codificação, como usar o receptor infravermelho AX-1838HS, e ver como clonar e construir um controle remoto de uma televisão com Arduino! Bora nessa!
Como funciona o controle remoto IR?
O controle remoto IR (infrared, ou infravermelho, em português) é um dispositivo que possui um microcontrolador, teclado e um LED infravermelho. Quando o usuário pressiona uma tecla, o microcontrolador manda o LED piscar com uma série de pulsos que formam o código, que é recebido pelo sensor que fica na televisão. Cada tecla possui um código diferente, assim o dispositivo receptor consegue identificar qual tecla você pressionou.
Mas como assim o LED pisca? Eu não vejo nada! Isso porque ele acende como uma cor que o olho humano não consegue ver, a cor infravermelho.
O olho humano só consegue enxergar as cores entre o vermelho e o violeta, e tudo abaixo do vermelho, ou seja, infravermelho nós não vemos, e tudo acima do violeta, ou seja, ultravioleta também não vemos. Dá uma olhada em como é classificado o espectro eletromagnético:
Curiosidade: Seu olho não consegue ver a luz infravermelha, porém, algumas câmeras conseguem. Aquelas que conseguem são as que não tem um filtro infravermelho tão bom assim. Teste com seu celular: aponte a luz do controle para o seu celular e pressione um botão, a luz deverá piscar na tela do seu celular. Se o seu celular for um Iphone, não vai aparecer, pois o filtro IR é muito bom e filtrará todo o IR que o LED emite.
Protocolos de comunicação IR
Cada controle vem programado para transmitir esses pulsos de um jeito específico, ou seja, cada um possui um tipo de protocolo de comunicação.
Esse são alguns dos protocolos mais comuns:
Várias empresas utilizam esses protocolos antigos, e por esse motivo é importante saber qual protocolo o controle que você quer clonar está usando. Você pode descobrir isso com a ajuda de um receptor IR e um osciloscópio, ou pode pesquisar nesse site aqui pra ver se encontra a marca de seu aparelho. A maioria gigantesca dos aparelho utiliza o protocolo NEC fabricado pela empresa japonesa NEC, que agora se chama Renesas.
O protocolo NEC
Vamos agora ver como o protocolo NEC organiza as informações!
Primeiramente, esse protocolo utiliza uma frequência portadora de 38KHz para transmitir os pulsos que representam os bits, que contém as informações. Na imagem abaixo, podemos perceber que, quando temos a transmissão de vários pulsos em 38KHz, consideramos como nível lógico alto, e quando não temos esse pulsos de 38KHz, consideramos nível lógico baixo. De acordo com o tempo na qual esse pulsos (38KHz) ficam ligados ou desligados (período), consideramos um bit 1 ou 0. Esse tipo de modulação é conhecida como PCM, ou em português, Modulação por Código de Pulsos.
Essa modulação dos pulsos em 38KHz é importante para evitar interferências externas nos receptores como o sol, por exemplo, que emite muito infravermelho.
O receptor infravermelho AX-1838HS
Graças ao avanço da tecnologia não é mais necessário montar grandes circuitos para filtrar a frequência portadora do sinal e obter os pulsos limpinhos, agora temos tudo em um único componente! O receptor infravermelho AX-1838HS, já possui uma etapa amplificadora, filtro e demodulador, tudo integrado nesse único componente. Assim, esse receptor fornece para nós o sinal pronto e limpinho. A imagem abaixo mostra o diagrama em bloco do circuito do receptor.
Esse daqui é o modulo que vendem para Arduino, que possui o AX-1838HS, capacitor de desacoplamento e também um LED que indica os pulsos recebidos.
O AX-1838HS pode trabalhar com tensões de 2,1 até 5,5V, o consumo de energia é baixo, na casa de 1,5mA, e a frequência de modulação dos pulsos de dados é de 38 KHz. O comprimento de onda da luz infravermelha percebida é de 940 nm, e o ângulo de visão é de aproximadamente 90 graus.
O controle da imagem abaixo é o que acompanha o kit de controle remoto IR para Arduino. Ele também trabalha com o protocolo NEC, e tudo que você ver nesse tutorial pode ser empregado nele:
Utilizando o AX-1838HS
Para te mostrar como o AX-1838HS filtra a portadora de 38KHz, eu realizei um experimento. Eu desmontei o controle remoto citado acima e medi o sinal diretamente do terminal do LED:
Na imagem abaixo, você pode ver os pulsos que representam os bits junto com a frequência de 38KHz (perceba que enquanto o circuito está em nível alto ele está totalmente preenchido).
Inclusive, se eu der um zoom bem grande nesse sinais em nível alto, eu consigo medir a frequência da portadora. Primeiramente um pouco de zoom:
Agora, mais um pouco de zoom e já conseguimos posicionar os cursores do osciloscópio, e ver, no canto direito superior da tela, em 1/ΔT, a frequência de aproximadamente 38KHz. Muito massa né!
Agora vamos conectar o AX1838HS no osciloscópio e capturar os pulsos a partir dele:
Percebam que o AX-1838HS fez toda a preparação do sinal removendo a frequência portadora.
Continuando sobre o protocolo NEC
A primeira coisa enviada no protocolo NEC é o que chamamos de LEAD CODE, que basicamente avisa o receptor que o transmissor vai começar a mandar os bytes contendo a informações. Como você podem ver na imagem abaixo, ele é composto por um pulso em nível alto de 9ms, e depois um em nível baixo de 4.5ms.
Exatamente o tempo que capturei no osciloscópio:
Depois, vem os bytes contendo o endereço e o comando propriamente dito. O bit 0 é representado por um pulso que tem a metade da largura de pulso do bit 1:
E aqui nós podemos ver perfeitamente os bits:
Após o LEAD CODE, são enviados os 32 bits, ou 4 bytes, que contém a informação da tecla pressionada. Eles são enviados primeiro pelos bits menos significativos (LSB), e por último os bits mais significativos (MSB). O primeiro byte é o de endereço. O segundo byte é basicamente o primeiro, só que invertido, ou seja, o que era bit 1 vira bit 0 e vice-versa. Essa inversão é utilizada para o receptor confirmar se o o byte está correto. O terceiro byte é o comando, e o quarto é o terceiro invertido. Na imagem abaixo isso fica claro:
Existe também o chamado REPEAT CODE, que é um sinal enviado para o dispositivo para que ele possa repetir rapidamente um comando, já que o envio completo dos bytes é mais lento. Quando você clica na tecla, ela primeiramente envia o código com os bytes, e se você continuar pressionando o botão, ele ficará enviado somente o REPEAT CODE.
Clonando um controle remoto com Arduino
Agora que vimos um pouco de teoria, vou começar a fazer um controle remoto para minha televisão, que é da LG e utiliza o protocolo NEC de 32bits.
O circuito necessário para poder capturar o código do controle é esse abaixo, e eu utilizei um Arduino UNO e o receptor AX-1838HS.
Para poder capturar os códigos do controle, vou utilizar a biblioteca IRremote, que aceita vários protocolos e pode capturar códigos de no máximo 32bits. Você pode instalar essa biblioteca diretamente pela IDE do Arduino. Primeiramente, clique em:
Sketch > Incluir Biblioteca > Gerenciar Bibliotecas
Após abrir a janela do Gerenciador de Biblioteca, digite IRremote. Na biblioteca IRremote feita pelo Shirrifi, selecione a versão 2.7.0, que foi a versão utilizada nesse artigo, e depois clique em Instalar. Após alguns segundos, ela será automaticamente instalada. Seu computador precisa estar conectado à internet para baixar a biblioteca. Após a instalação da Biblioteca, é necessário que você feche e abra novamente o programa Arduino IDE.
Esse primeiro código serve para capturar o código do controle e convertê-lo para um valor em hexadecimal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com */ #include <IRremote.h> int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); // In case the interrupt driver crashes on setup, give a clue // to the user what's going on. Serial.println("Enabling IRin"); irrecv.enableIRIn(); // Start the receiver Serial.println("Enabled IRin"); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } delay(100); } |
A partir daí, eu capturei os códigos de 4 botões do meu controle: Power, Volume+, Volume-, e Input. Esses são os códigos:
Para montar meu controle vou utilizar o Arduino Pro Mini, por ter um tamanho menor. Como o Arduino Pro Mini não tem conversor USB serial, é necessário utilizar um outro Arduino para gravá-lo, veja como fazer isso aqui.
No circuito abaixo, o LED infravermelho é conectado através de um resistor de 220R no pino 3 do Arduino, e é nesse pino que serão gerados os pulsos por padrão da biblioteca IRremote.
Os quatro botões vão conectados nos pinos de 4 à 7, e todos possuem um capacitor cerâmico de 100nF (104) conectado a eles para fazer o debounce. Isso impede que seja feito mais de um disparo de dados quando o botão é pressionado.
Para fazer a alimentação do circuito eu utilizei uma bateria Li-Po com capacidade de 290Ah. Para o gerenciamento da carga e descarga da bateria eu utilizei o módulo para Arduino TP4056, assim podemos carregar o controle via USB. Como a tensão desse tipo de bateria varia entre 3.0 e 4.2V, e o Arduino, em 16MHz, trabalha com 5V, coloquei um conversor DC-DC do tipo Boost para elevar a tensão para 5V. É muito importante que você regule a tensão para 5V do conversor DC-DC antes de conectá-lo ao Arduino!
O circuito eletrônico ficou assim:
Agora, para enviar os códigos no protocolo NEC, vamos utilizar esse código abaixo. Nesse caso temos quatro botões que estão conectados nos pinos de 4 até 7 do Arduino. Cada botão dispara um código através do método irsend.sendNEC. Lembre-se de colocar os códigos em hexadecimal capturados de cada tecla do controle que você deseja clonar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/* Autor: Marlon Nardi Walendorff Baseado no trabalho de: Ken Shirriff */ #include <IRremote.h> IRsend irsend; #define Power 4 #define VolUp 5 #define VolDown 6 #define Input 7 byte flag = 0; byte flag2 = 0; byte flag3 = 0; byte flag4 = 0; void setup() { pinMode(Power, INPUT_PULLUP); pinMode(VolUp, INPUT_PULLUP); pinMode(VolDown, INPUT_PULLUP); pinMode(Input, INPUT_PULLUP); } void loop() { if(!digitalRead(Power)) flag = 1; if(digitalRead(Power) && flag == 1) irsend.sendNEC(0x20DF10EF, 32), flag = 0; if(!digitalRead(VolUp)) flag2 = 1; if(digitalRead(VolUp) && flag2 == 1) irsend.sendNEC(0x20DF40BF, 32), flag2 = 0; if(!digitalRead(VolDown)) flag3 = 1; if(digitalRead(VolDown) && flag3 == 1) irsend.sendNEC(0x20DFC03F, 32), flag3 = 0; if(!digitalRead(Input)) flag4 = 1; if(digitalRead(Input) && flag4 == 1) irsend.sendNEC(0x20DFD02F, 32), flag4 = 0; } |
É claro que, para esse projeto se tornar um controle de verdade são necessárias algumas melhorias como:
- Colocar o microcontrolador no modo sleep para consumir muito menos energia;
- Otimizar o circuito de carga e descarga da bateria para aproveitar a sua máxima capacidade;
- Remover componentes como LEDs, que consomem energia desnecessariamente;
- Otimizar a programação para utilizar a menor quantidade de ciclos de clock possíveis para realizar a tarefa. Isso reduz também o consumo de energia.
- Entre outros…
Mas, o que vale com esse tipo de projeto, não é ter um controle pronto para vender em mãos, mas sim todo o aprendizado e diversão envolvida! Continue comigo no próximos artigos. Abraço!
Seja o vídeo para mais informações:
10 Comentários
Marlon Nardi
Vamos comentar ai Projetistas fora do comum!
João Paulo Alves
Excelente, sempre deixando tudo muito bem explicado. Obrigado por adicionar mais um conhecimento fenomenal para todos nós.
Marlon, conheço um site que tem um catálogo bem grande de controles já decodificados. Nem precisei comprar o controle remoto do meu PS2 para fazer automação.
marlonnardi
Eu que agradeço o apoio! Que massa cara!
Miguel Soares
Profº Marlon, fiz um teste com esse projeto usando Arduino Uno, e funcionou para minha televisão LG também. A minha ideia agora é testar para minha outra televisão, da marca Sony, utilizando sua respectiva função sendSony(0xA90 , 12). Essa TV em questão está com o botão de Liga/Desliga com mau contato, mas todos os outros botões funcionam perfeitamente. Não tenho ainda a experiência de passar para a placa fenolite, mas tuas dicas e teu código me ajudaram muito. Em breve te conto se consegui com a TV da Sony. Obrigado, professor!
marlonnardi
Muito obrigado Miguel! Conta sim que quero saber!
Nelson Pacheco
Muito bom professor, em breve vou tentar juntar seus ensinamentos com automação residencial com Alexa. Cado esteja procurando assuntos para abordar, sugiro interação entre Arduino ou ESP e Alexa.
marlonnardi
Obrigado pelas dicas NELSON!
Tadeu Botelho
Acabei de conhecer seu site através dessa publicação.
Material muito bom. Você detalhou a parte do osciloscópio que foi muito importante para o entendimento dos emissores e receptores de RF.
Obrigado
marlonnardi
Seja bem vindo Tadeu!
Guilherme Antonini
Já copiei e vou testar kkkk