Índice:

Controle remoto infravermelho I2C com o Arduino: 8 etapas (com imagens)
Controle remoto infravermelho I2C com o Arduino: 8 etapas (com imagens)

Vídeo: Controle remoto infravermelho I2C com o Arduino: 8 etapas (com imagens)

Vídeo: Controle remoto infravermelho I2C com o Arduino: 8 etapas (com imagens)
Vídeo: Aula 6 - Controle Remoto Infra-Vermelho (IR) | Curso Arduino Express 2024, Novembro
Anonim
Controle remoto infravermelho I2C com o Arduino
Controle remoto infravermelho I2C com o Arduino
Controle remoto infravermelho I2C com o Arduino
Controle remoto infravermelho I2C com o Arduino

Preâmbulo Este instrutivo detalha como criar um controlador remoto universal usando I2C para a interface.

Que estranho você diz, usando um dispositivo escravo I2C?

Sim, um dispositivo escravo I2C.

Isso ocorre porque o tempo preciso de pacotes IR é bastante exigente e um Arduino típico terá dificuldades se já estiver realizando muitas outras tarefas ao mesmo tempo. É melhor distribuir a carga de computação atribuindo atividades intensivas de temporização a processadores dedicados sempre que possível (melhor ainda fazê-lo em hardware). Dado que I2C é um método de comunicação robusto e bem documentado entre ICs, eu escolhi isso como a interface.

Introdução

Conforme mencionado acima, este manual descreve como controlar aparelhos domésticos, como TV, DVD player e satélite, etc., usando a biblioteca IRremote no Arduino.

Ele conclui com um exemplo de projeto transformando o Arduino em um módulo de controle remoto escravo I2C (foto 1 acima) com circuito de teste de protótipo (foto 2 acima) e segue detalhando como reduzir seu projeto aos componentes mínimos necessários para que possa ser incorporado em outro design. No meu caso, eu uso este dispositivo embutido em um dispositivo de controle remoto IoT Universal baseado em um ESP8266-12E.

Quais peças eu preciso?

Para construir o circuito descrito na Etapa 1 (Transmissor IV), você precisará das seguintes peças;

  • 2 resistores de 10K
  • 1 resistor 390R desligado
  • 1 resistor 33R desligado
  • 1 resistor 3K8 desligado
  • 1 LED vermelho apagado
  • 1 LED apagado IR TSAL6400
  • 1 transistor BC337 desligado
  • 1 capacitor de 220uF
  • 1 fora do Arduino Uno

Para construir o circuito descrito na Etapa 4 (Receptor IR), você precisará das seguintes peças;

  • 1 resistor de 10K desligado
  • 1 fora do TSOP38328
  • 1 capacitor de 220uF
  • 1 fora do Arduino Uno

Para construir o circuito descrito na Etapa 5 (circuito de teste escravo), você precisará das seguintes peças;

  • 4 resistores de 10K
  • 2 resistor 390R desligado
  • 1 resistor 33R desligado
  • 1 resistor 3K8 desligado
  • 2 LED vermelho apagado
  • 1 LED apagado IR TSAL6400
  • 1 transistor BC337 desligado
  • 1 capacitor de 220uF
  • 2 botões SPST desligados
  • 2 fora do Arduino Unos

Para construir o circuito descrito na Etapa 6 (desenho reduzido), você precisará das seguintes peças;

  • 3 resistores de 10K desligados
  • 1 resistor 270R desligado
  • 1 resistor 15R desligado
  • 4 resistores 1K desligados
  • 1 LED vermelho apagado
  • 1 LED apagado IR TSAL6400 ou TSAL5300
  • 1 transistor BC337 desligado
  • 1 fora do capacitor 220uF eletrolítico a 6,3v
  • 1 fora do capacitor 1000uF eletrolítico @ 6,3v
  • 2 capacitores desligados de 0,1uF
  • 2 capacitores de 22pF desligados
  • 1 desligado Xtal de 16 MHz
  • 1 fora do ATMega328P-PU

Nota: Você também precisará de um dispositivo FTDI para programar o ATMega328P

Quais habilidades eu preciso?

  • Domínio mínimo de eletrônica,
  • Conhecimento do Arduino e seu IDE,
  • Um pouco de paciência,
  • Alguma compreensão do I2C seria útil (veja aqui alguns detalhes genéricos da I2C / Wire Library).

Assuntos abordados

  • Breve visão geral do circuito,
  • Breve visão geral do software,
  • Conteúdo do pacote I2C,
  • Aquisição de códigos de controle remoto (ui32Data),
  • Como testar seu dispositivo I2C Slave,
  • Reduzindo seu design,
  • Conclusão,
  • Referências usadas.

Isenção de responsabilidade

Como sempre, você usa essas instruções por sua própria conta e risco e elas não são suportadas.

Etapa 1: Breve Visão Geral do Circuito

Breve Visão Geral do Circuito
Breve Visão Geral do Circuito

O objetivo do circuito é transmitir códigos de controle remoto IR. Seu design é bastante direto e simples.

Quando o transistor Q1 um NPN BC337 é ligado através de um lógico do Arduino PWM O / P D3 para o resistor R5, a corrente passa pelos Leds 1 e 2. Limitada apenas pelos resistores R3 e R4 respectivamente. Q1 é usado para aumentar a corrente que passa pelo diodo IR (IF Max = 100mA) para o que o Arduino O / P é capaz de fornecer ~ 40mA @ + 5v.

O capacitor C1 a 220uF eletrolítico fornece alguma estabilização evitando uma queda do trilho de alimentação pela energia consumida pelos Leds 1 e 2.

Os resistores R1 e R2 são pull ups I2C.

Etapa 2: Breve Visão Geral do Software

Breve Visão Geral do Software
Breve Visão Geral do Software
Breve Visão Geral do Software
Breve Visão Geral do Software
Breve Visão Geral do Software
Breve Visão Geral do Software

Preâmbulo

Para compilar com êxito este código-fonte, você precisará da seguinte biblioteca extra;

IRremote.h

  • Por: z3t0
  • Objetivo: Biblioteca remota de infravermelho para Arduino: enviar e receber sinais infravermelhos com vários protocolos
  • De:

Visão geral do código

Conforme mostrado na figura 1 acima, na inicialização, o código configura a E / S do microcontrolador e, em seguida, consulta o status do sinalizador de software interno 'bFreshDataFlag'. Quando este sinalizador é definido, o controlador afirma sua linha 'Ocupado' (enviando dados do pino D4 baixo) e passa para o estado 'eBUSY' lendo sequencialmente os comandos de pressão do botão mantidos em uDataArray e enviando os dados modulados por IV para o LED IV em um seqüência de transmissão.

Uma vez que os dados mantidos em uDataArray tenham sido totalmente enviados, o estado 'eIDLE' é retomado e a linha 'Ocupado' é desabilitada (enviando dados com o pino D4 alto). O dispositivo agora está pronto para receber mais pressionamentos de botão, marcando o fim da sequência de transmissão.

Recepção de dados de pressionamento de botão IR

Quando os dados são enviados para o controle remoto infravermelho via I2C, ele dispara uma interrupção e a chamada de função receiveEvent () é disparada de forma assíncrona.

Uma vez disparados, os dados I2C recebidos são gravados sequencialmente no buffer 'uDataArray '.

Durante a recepção de dados, se um fim de sequência for sinalizado pelo mestre (bFreshData! = 0x00) o 'bFreshDataFlag' é definido, sinalizando assim o início da sequência de transmissão.

As imagens 2 a 3 fornecem um exemplo de uma seqüência típica de pacotes.

Nota: código-fonte completo disponível aqui

Etapa 3: Conteúdo do pacote I2C

Conteúdo do pacote I2C
Conteúdo do pacote I2C

O formato do pacote de controle enviado para o escravo através de I2C é dado acima na figura 1 o significado de cada campo é dado abaixo

Significado dos campos do pacote de controle

byte bEncoding;

  • Codificação de controle remoto IR,

    • RC6 (Céu) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

A representação hexadecimal do fluxo de dados IV binário 4 bytes de dados (longo sem sinal), LSByte… MSByte

byte bNumberOfBitsInTheData;

Número de bits nos dados (máximo de 32). Faixa = 1… 32

byte bPulseTrainRepeats;

Quantas repetições deste trem de pulso. Faixa = 1… 255. Normalmente 2 a 4 repetições. Você pode querer estender isso para comandos liga / desliga, pois o dispositivo receptor às vezes requer algumas repetições extras de trem de pulso para receber um sinal de ligar

byte bDelayBetweenPulseTrainRepeats;

Atraso entre as repetições deste trem de pulso. Faixa = 1… 255mS. Normalmente 22mS… 124mS

byte bButtonRepeats;

Simula o pressionamento repetido do mesmo botão (mas não suporta o código modificado como um controle remoto da Apple, apenas repete o código do botão). Faixa = 1… 256. Padrão = 1

uint16_t ui16DelayBetweenButtonRepeats;

Atraso entre as repetições do botão (int sem sinal). 2 bytes no total de LSByte… MSByte. Faixa = 1… 65535 ms. Padrão = 0mS

byte bFreshData;

  • Dados recentes. Um valor diferente de zero. Escrito por último, aciona a sequência IR TX. Faixa 0x00… 0xFF

    • Mais pacotes de controle por vir = 0
    • Este é o pacote de controle final = valor não zero 1, 2,… 255

Observe o uso da diretiva do compilador '_packed_'. Isso é para garantir que os dados sejam pacote, byte a byte, na memória, independentemente do sistema de destino usado (Uno, Due, ESP8266 etc.). Isso significa que a união entre registerAllocationType e dataArrayType precisa apenas de um clock out / clock em bytes de um pacote de controle, tornando o software TX / RX simples.

Etapa 4: Adquirir códigos de controle remoto (ui32Data)

Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)
Aquisição de códigos de controle remoto (ui32Data)

Existem três maneiras de adquirir um respectivo código-chave do controle remoto;

  1. Via contagem de bits com um osciloscópio,
  2. Procure em um site,
  3. Decodifique-o direto do fluxo de dados no software.

Via contagem de bits com um escopo

Este não é um método eficiente, pois leva algum tempo e potencialmente requer mais de uma tentativa, mas pode ser altamente preciso. Também é útil na validação visual de códigos obtidos pelos métodos 2 e 3, também na determinação de quaisquer peculiaridades de um controle remoto. A título de exemplo, ao manter pressionado um botão em um controle remoto Apple IR. O controle remoto emitirá inicialmente uma sequência de comando e, em seguida, seguirá com uma sequência compactada repetida de 0xF….

Procure em um site

O banco de dados de código do controle remoto no site do Linux Infrared Remote Control é uma boa fonte.

A desvantagem, entretanto, é que você pode ter que tentar alguns códigos até encontrar um que funcione para você. Você também pode ter que interpretar algumas das representações dos códigos para convertê-los em sua forma hexadecimal equivalente.

Decodifique-o direto do fluxo de dados

Usando o circuito na figura 1 acima em conjunto com o exemplo da biblioteca IRremote 'IRrecvDumpV2.ino', é possível decodificar o fluxo de dados direto do controle remoto. A Figura 2 mostra um controle remoto de TV Samsung decodificado para um pressionamento de botão liga / desliga na janela do terminal IDE do Arduino.

Receptor / transmissor combinado

As imagens 3 e 4 acima mostram uma solução que permite a recepção e a transmissão de comandos IR para facilitar a prototipagem.

Para decodificar os pressionamentos de botão do controle remoto IR, você precisará atualizar o Arduino com o exemplo 'IRrecvDumpV2.ino' que vem com a biblioteca IRremote.

Também funciona bem para transmissão se comandos IR. Um led vermelho é incluído como uma indicação visual de que o dispositivo está em ação.

Etapa 5: Como testar seu dispositivo I2C Slave

Como testar seu dispositivo I2C Slave
Como testar seu dispositivo I2C Slave
Como testar seu dispositivo I2C Slave
Como testar seu dispositivo I2C Slave

Usando o código-fonte aqui, e o circuito descrito acima na figura 1, programe o Arduino 'Master' com 'IR_Remote_Sim_Test.ino' e o Arduino 'Slave' com 'IR_Remote_Sim.ino'.

Supondo que você tenha uma TV Sony Bravia, caixa Sky HD e um Sony BT SoundBar, pressione o botão 1 e sua TV mudará para BBC1 (canal 101). Pressione o botão 2 e sua barra de som será silenciada. Pressione novamente e o som será reativado.

Durante a execução da sequência de transmissão IR, o LED3 acenderá indicando que o escravo está ocupado e o LED1 piscará em linha com o processo de transmissão IR.

Claro, se você não tiver o mesmo sistema de entretenimento configurado como acima, você pode reprogramar o escravo com 'IRrecvDumpV2.ino', decodificar seus comandos remotos de interesse e programá-los em 'IR_Remote_Sim_Test.ino' para o seu determinado cenário.

A Figura 2 mostra a visão geral do software de teste de nível de sistema entre Mestre e Escravo.

Etapa 6: Reduzindo seu design

Reduzindo Seu Design
Reduzindo Seu Design

Ok, supondo que você seguiu esta instrução, confiar em dois Arduinos para controlar seus dispositivos domésticos não é o uso mais eficiente de seu estoque de Arduino. Conseqüentemente, se você construir o circuito mostrado na imagem acima e seguir as instruções aqui para programar o ATMega328P com 'IR_Remote_Sim.ino', você será capaz de reduzir todo o sistema aos componentes mínimos. Isso permitirá que você incorpore seu projeto em algum outro sistema.

Etapa 7: Conclusão

Conclusão
Conclusão
Conclusão
Conclusão

A solução é estável e funciona bem, já está embutida em outro sistema há algumas semanas sem problemas.

Escolhi o Arduino Uno R3 porque queria um dispositivo que tivesse RAM suficiente para que eu pudesse ter um buffer de botão de profundidade razoável. Eu me conformei com um tamanho de buffer de 20 pacotes (MAX_SEQUENCES).

O escudo Hybrid TX / RX que fiz também foi muito útil ao decodificar controles remotos Sony e Sky. Embora eu tenha que confessar que usei meu osciloscópio digital de vez em quando para verificar se o comando IR decodificado pelo software era o mesmo que vinha do IR recebido (TSOP38328).

A única coisa que eu teria feito de forma diferente seria usar o circuito de acionamento de corrente constante para o led IR, como mostrado acima na foto 2.

Outro ponto a ser observado é que nem todos os transmissores IR são modulados com 38KHz, o TSOP38328 é otimizado para 38KHz.

Etapa 8: Referências usadas

IRRemote.h

  • Por: z3t0
  • Objetivo: Biblioteca remota de infravermelho para Arduino: enviar e receber sinais infravermelhos com vários protocolos
  • De:

Biblioteca IR Remote

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

Sensor receptor IR (infravermelho) - TSOP38238 (equivalente)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Para evitar o preenchimento da estrutura de dados para limites de palavras

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

Boa fonte de detalhes remotos IR

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

Banco de dados de IR Remotes

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

Folha de Dados BC337

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

Folha de Dados 1N4148

https://www.vishay.com/docs/81857/1n4148.pdf

Recomendado: