Há algo que me incomoda na minha casa. Esse algo é o controle remoto da televisão. É uma TV LG Smart, uma excelente escolha. O controle remoto possui sensor de movimento e funciona de forma parecida como um mouse ou Wiimote, o que é melhor para digitar do que as teclas comuns que geralmente vejo em controles remotos. É uma boa TV em geral, mas com um problema que apareceu recentemente, em um botão. O botão mais importante. o botão Power. Ligar e desligar a TV agora precisa de 5 cliques antes que algo aconteça ou preciso levantar e apertar o botão na TV (que fica na parte de baixo e também é problemático). Essa é provavelmente a única parte chata de assistir TV.

Quão difícil seria montar um circuito com microcontrolador e transmissor infravermelho para realizar a única função de ligar e desligar a TV? Menos do que eu imaginava, na verdade

Essa é a primeira parte da minha descrição do processo para concluir esse projeto. Estou dividindo ele em 3 partes, cada uma com um post próprio:

  • O que a TV precisa
  • Criando o controle remoto
  • Juntando tudo


Pelo ar

Certo, o conhecimento inicial se resume a duas suposições:

  1. O controle remoto envia uma mensagem via infravermelho quanto o botão é apertado
  2. Quando a TV recebe uma mensagem, ela liga ou desliga

É pouco, mas é algo para começar. Eu já me lembrava de ter visto no blog de Ken Shirrif alguns posts sobre arduino e infravermelho, então comecei procurando por lá, já que os posts são sempre bem detalhados e explicativos. Achando isso tenho uma biblioteca para Arduino que posso utilizar para enviar e receber mensagens em infravermelho. Também sei que o sinal é (geralmente) modulado em 38kHz e que há vários protocolos diferentes, então preciso saber qual o protocolo que minha TV usa.

Eu poderia usar a biblioteca e um Arduino para descobrir qual o protocolo, mas resolvi ir por outros caminho. Decidi usar o meu analisador lógico e sigrok (um programa Open Source para trabalhar com esse tipo de aparelho) para ver o sinal.

Antes de chegar no analisador lógico e sigrok, é preciso de um receptor infravermelho. Eu já tinha um receptor VS1838B guardado na gaveta pronto para ser usado. Infelizmente, o datasheet está em chinês, mas é possível compreender o suficiente pelas imagens e números. Um pino para VCC, um pino para GND e o pino do meio é a saída. O circuito também inclui dois capacitores de dois resistores. O diagrama de blocos mostra que esse componente é mais do que um receptor. Ele inclui filtros, amplificadores e um transistor para fornecer uma maior corrente na saída. Os números dizem que a tensão de alimentação é entre 2,7V e 5,5V e a frequência é 38kHz, como esperado. A parte interessante é a imagem do sinal na entrada (infravermelho) e saída (sinal elétrico). A entrada é um sinal modulado e ativo em nível lógico alto, enquanto a saída é demodulada e com saída em nível lógico baixo.

Datasheet VS1838B

Vale notar a imagem do datasheet onde é mostrado o sinal incidente e o sinal demodulado. O incidente é ativo alto e com modulação em PWM. O sinal demodulado é ativo baixo, ou seja, quando não há mensagem sendo recebida a saída é em nível lógico alto. Há também um pequeno atraso entre o envio do sinal e a saída no receptor, o que é esperado devido ao processamento interno do receptor.

O analisador lógico que tenho é um genérico chinês baseado em um microcontrolador USB da Cypress (série FX2LP). Esse é o mesmo circuito integrado do Saleae Logic, o analisador lógico de baixo custo que serviu de base para toda a linha de clones chineses. Embora seja possível usar o meu analisador lógico genérico com o software da Saleae, prefiro usar sigrok. Este é um software OpenSource de análise de sinal, funcionando com analisadores lógicos, osciloscópios e outros aparelhos semelhantes. sigrok em si está disponível em linha de comando (cli) ou com uma GUI (Graphic User Interface) chamada PulseView, que é a minha opção. Precisei apenas instalar um driver para o analisador lógico ser reconhecido e ele estava pronto para ser usado.

Com o receptor IR conectado com VCC e GND e canal 0 do analisador lógico ligado na saída do receptor, hora de começar a gravar o sinal, apontar o controle e apertar o botão. O resultado é a bela imagem a seguir.

Definitivamente foi capturado um sinal, mas ainda não tenho informação nenhuma sobre ele, exceto que existe. Dando um zoom para ver melhor…

Um trem de pulsos, com um pulso inicial grande, seguido de vários pulsos pequenos, e depois do trem há um grande intervalo seguido por mais um sinal. Quem já possui experiência com transmissões IR de controles remotos pode até conseguir mais informações dessa imagem, como o protocolo sendo utilizado. Quem não tem essa experiência pode procurar por diferentes protocolos e ver qual deles se encaixa com o padrão observado. Mas há uma ferramenta que facilita bastante o trabalho

Decodificador

sigrok inclui junto com PulseView vário decodificadores de protocolos. Isso transforma um sinal em algo compreensível para o olho humano, desde que o protocolo seja conhecido. Há uma grande variedade de protocolos junto com sigrok (imagem abaixo), para as mais diferentes funções. Há sempre há a oportunidade de adicionar mais protocolos, caso o necessário não esteja prontamente disponível

No que isso ajuda sem saber o protocolo? Bem, olhe a imagem a seguir…

Há dois protocolos IR no sigrok. Talvez um deles seja o que procuro. Tentando o protocolo IR NEC e configurando para o decodificador usar o canal 0…

Funcionou de primeira e perfeitamente! Algo assim é raro, então é bom aproveitar essa sensação enquanto dura. Um mistério resolvido: o protocolo é o IR NEC. Primeiro, vale a pena analisar o possível apenas com o que o analisador lógico diz. Há 5 partes que parecem importante aqui:

  • Leader Code
  • Address
  • Address#
  • Command
  • Command#

Na verdade, são apenas 3 partes importantes. Adiantando um pouco sobre o protocolo, Address# é o complemento de Address, ou seja, o mesmo valor com os bits invertido. Todos os bits 0 mudam para 1 e os bits 1 mudam para 0. O mesmo vale para Command. Esse é um modo simples de evitar erros durante a transmissão, pois o receptor pode conferir a mensagem com o seu complemento. Caso haja algo diferente, sabe-se que ocorreu algum erro.

Há também o segundo trecho visível na imagem, depois da mensagem principal. Ele foi decodificado como um Repeat code, então o receptor sabe que a mensagem principal foi enviada duas ou mais vezes. Nesse caso, a mensagem principal é enviada uma vez e cada clique seguinte do botão apenas envia um comando pré-determinado para “repetir a operação anterior”. É possível imaginar o uso disso para alguém trocando de canal muito rápido. Como a mensagem de “repetição” é mais curta que uma mensagem completa, o risco de alguém apertar o mesmo botão mais rápido do que um aparelho consiga responder é menor.   

Pesquisando de forma mais detalhada, o protocolo funciona com um sinal de duração de 9ms indicando o início de uma transmissão, seguido por uma pausa na transmissão durando 4,5ms. Depois disso seguem 32 bits (explicados a seguir) e mais um pulso indicando o fim da mensagem, com duração de 562,5μs.

Para enviar um bit de informação, o modo tradicional para protocolos como UART ou I2C é usar um nível lógico baixo (low) para indicar um bit 0 e um nível lógico alto (high) para indicar um bit 1. O protocolo IR NEC funciona de forma diferente, pois para enviar um bit, seja ele 0 ou 1, o sinal é mantido em nível lógico alto por um tempo, seguido de um nível lógico baixo por outro tempo. O que varia entre enviar um bit 0 e enviar um bit 1 é a duração de cada nível lógico (high ou low). Isso ainda varia no caso do sinal ser em nível ativo baixo ou nível ativo lógico. Dessa forma, é conveniente tratar de “bits lógicos”, que representam um bit, independente do modo como é feita a transmissão física. Temos então (para um sinal ativo alto):

  • Bit 0: Pulso de nível alto durante 560μs, seguido por uma pausa (nível lógico baixo) por mais 560µs. Duração total do bit é de 1,125ms;
  • Bit 1: Pulso de nível alto durante 560µs, seguido por uma pausa (nível lógico baixo) por mais 1.6890ms. Duração total do bit é de 2,25ms.

Esse modo de transmissão onde a duração de um bit é utilizada para definir o valor é bit é chamada de Codificação por Distância de Pulso (PDE). É importante notar a diferença entre modulação PWM (transmissão física dos dados) de codificação PDE (modo como bits são representados). A codificação funciona “em cima” da modulação, pois o sinal demodulado ainda está codificado. Para transmitir uma mensagem, é preciso primeiro fazer a codificação e depois a modulação. Na recepção é feito o processo inverso.

Sabendo como funcionam os bits, é possível enviar bytes. Eles são enviados com o dígito menos significativo (LSB) primeiro. Conforme visto na análise inicial, é enviado primeiro o endereço de destino da mensagem, o complemento desse endereço, a mensagem em si e, por fim, o complemento da mensagem.

Esse protocolo analisado é feito para baixas taxas de transmissão, mas com mecanismos para garantir a integridade da mensagem. Ele é relativamente simples e pode ser recriado apenas modulando uma mensagem usando o PWM de um microcontrolador. A próxima parte mostrará como fiz para criar um transmissor usando o protocolo IR no meu microcontrolador escolhido: um MSP430 da Texas Instruments.