Tabla de contenido:

Control remoto infrarrojo I2C con Arduino: 8 pasos (con imágenes)
Control remoto infrarrojo I2C con Arduino: 8 pasos (con imágenes)

Video: Control remoto infrarrojo I2C con Arduino: 8 pasos (con imágenes)

Video: Control remoto infrarrojo I2C con Arduino: 8 pasos (con imágenes)
Video: MODULO I2C PARA PANTALLAS LCD (display 16x2) + CODIGO ARDUINO + CONEXIONES|| BIEN EXPLICADO 2024, Noviembre
Anonim
Control remoto infrarrojo I2C con Arduino
Control remoto infrarrojo I2C con Arduino
Control remoto infrarrojo I2C con Arduino
Control remoto infrarrojo I2C con Arduino

Preámbulo Este Instructable detalla cómo crear un control remoto universal usando I2C para la interfaz.

¿Qué tan extraño dices, usando un dispositivo esclavo I2C?

Sí, un dispositivo esclavo I2C.

Esto se debe a que la sincronización precisa de los paquetes IR es bastante exigente y un Arduino típico tendrá dificultades si ya está realizando muchas otras tareas al mismo tiempo. Es mejor distribuir la carga informática asignando actividades intensivas en tiempo a procesadores dedicados siempre que sea posible (mejor aún hacerlo en hardware). Dado que I2C es un método de comunicación robusto y bien documentado entre circuitos integrados, elegí este como interfaz.

Introducción

Como se mencionó anteriormente, este instructivo describe cómo controlar electrodomésticos como TV, reproductor de DVD y satélite, etc. utilizando la biblioteca IRremote en el Arduino.

Concluye con un ejemplo de diseño que convierte el Arduino en un módulo de control remoto esclavo I2C (imagen 1 arriba) con circuito de prueba prototipo (imagen 2 arriba) y continúa detallando cómo reducir su diseño a los componentes mínimos necesarios para que pueda ser incrustado en otro diseño. En mi caso, uso este dispositivo integrado en un dispositivo de control remoto IoT Universal basado en un ESP8266-12E.

¿Qué partes necesito?

Para construir el circuito que se muestra en el paso 1 (transmisor de infrarrojos), necesitará las siguientes piezas;

  • 2 resistencias de 10K
  • 1 resistencia 390R
  • 1 resistencia 33R
  • 1 resistencia 3K8
  • 1 LED rojo apagado
  • 1 de LED IR TSAL6400
  • 1 transistor BC337
  • 1 condensador de 220uF
  • 1 de Arduino Uno

Para construir el circuito que se muestra en el Paso 4 (Receptor de infrarrojos), necesitará las siguientes piezas;

  • 1 resistencia de 10K
  • 1 de TSOP38328
  • 1 condensador de 220uF
  • 1 de Arduino Uno

Para construir el circuito que se muestra en el Paso 5 (circuito de prueba esclavo), necesitará las siguientes partes;

  • 4 resistencias de 10K
  • 2 de resistencia 390R
  • 1 resistencia 33R
  • 1 resistencia 3K8
  • 2 LED rojo apagado
  • 1 de LED IR TSAL6400
  • 1 transistor BC337
  • 1 condensador de 220uF
  • 2 botones SPST
  • 2 de Arduino Unos

Para construir el circuito que se muestra en el Paso 6 (Diseño encogido), necesitará las siguientes partes;

  • 3 resistencias de 10K
  • 1 resistencia 270R
  • 1 resistencia 15R
  • 4 resistencias de 1K
  • 1 LED rojo apagado
  • 1 LED de infrarrojos TSAL6400 o TSAL5300
  • 1 transistor BC337
  • 1 condensador electrolítico de 220 uF a 6,3 v
  • 1 condensador electrolítico de 1000 uF a 6,3 v
  • 2 condensadores de 0.1uF
  • 2 condensadores de 22pF
  • 1 de 16 MHz Xtal
  • 1 de ATMega328P-PU

Nota: También necesitará un dispositivo FTDI para programar el ATMega328P

¿Qué habilidades necesito?

  • Un mínimo de conocimientos de electrónica,
  • Conocimiento de Arduino y su IDE,
  • Un poco de paciencia,
  • Sería útil tener algún conocimiento de I2C (consulte aquí algunos detalles genéricos de I2C / Wire Library).

Tópicos cubiertos

  • Breve descripción del circuito,
  • Breve descripción general del software,
  • Contenido del paquete I2C,
  • Adquirir códigos de control remoto (ui32Data),
  • Cómo probar su dispositivo esclavo I2C,
  • Reduciendo tu diseño
  • Conclusión,
  • Referencias utilizadas.

Descargo de responsabilidad

Como siempre, usa estas instrucciones bajo su propio riesgo y vienen sin soporte.

Paso 1: Breve descripción general del circuito

Breve descripción del circuito
Breve descripción del circuito

El propósito del circuito es transmitir códigos de control remoto por infrarrojos. Su diseño es bastante sencillo y sencillo.

Cuando el transistor Q1 a BC337 NPN se enciende a través de uno lógico desde Arduino PWM O / P D3 a la resistencia R5, la corriente pasa a través de los Leds 1 y 2. Limitado solo por las resistencias de balasto R3 y R4 respectivamente. Q1 se usa para aumentar la corriente que pasa a través del diodo IR (IF Max = 100mA) a un exceso de lo que el Arduino O / P es capaz de suministrar ~ 40mA @ + 5v.

El condensador C1 a 220uF electrolítico proporciona cierta estabilización evitando una caída del riel de suministro por la potencia consumida por los Leds 1 y 2.

Las resistencias R1 y R2 son pull ups I2C.

Paso 2: Breve descripción general del software

Breve descripción general del software
Breve descripción general del software
Breve descripción general del software
Breve descripción general del software
Breve descripción general del software
Breve descripción general del software

Preámbulo

Para compilar correctamente este código fuente, necesitará la siguiente biblioteca adicional;

IRremote.h

  • Por: z3t0
  • Propósito: biblioteca remota de infrarrojos para Arduino: envíe y reciba señales de infrarrojos con múltiples protocolos
  • De:

Descripción general del código

Como se muestra en la imagen 1 anterior, en el inicio, el código configura la E / S del microcontrolador y luego sondea el estado del indicador de software interno 'bFreshDataFlag'. Cuando esta bandera está configurada, el controlador afirma que es la línea 'Ocupado' (enviando el pin de datos D4 bajo) y se mueve al estado 'eBUSY' leyendo secuencialmente los comandos de pulsación del botón retenidos en uDataArray y enviando los datos modulados por infrarrojos al LED de infrarrojos en un secuencia de transmisión.

Una vez que los datos retenidos en uDataArray se han enviado por completo, el estado 'eIDLE' se reanuda y la línea 'Ocupado' se desactiva (enviando el pin de datos D4 alto). El dispositivo ahora está listo para recibir más pulsaciones de botones que marcan el final de la secuencia de transmisión.

Recepción de datos de pulsación del botón IR

Cuando se envían datos al controlador remoto de infrarrojos a través de I2C, se activa una interrupción y la llamada a la función ReceiveEvent () se activa de forma asincrónica.

Una vez activados, los datos I2C recibidos se escriben secuencialmente en el búfer 'uDataArray '.

Durante la recepción de datos, si el maestro indica un final de secuencia (bFreshData! = 0x00), se establece 'bFreshDataFlag', lo que indica el inicio de la secuencia de transmisión.

Las imágenes 2… 3 dan un ejemplo de una secuencia típica de paquetes.

Nota: el código fuente completo está disponible aquí

Paso 3: Contenido del paquete I2C

Contenido del paquete I2C
Contenido del paquete I2C

El formato del paquete de control enviado al esclavo a través de I2C se da arriba en la imagen 1, el significado de cada campo se da a continuación

Significado de los campos del paquete de control

byte bEncoding;

  • Codificación de control remoto por infrarrojos,

    • RC6 (cielo) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

La representación hexadecimal del flujo de datos IR binarios 4 bytes de datos (longitud sin signo), LSByte… MSByte

byte bNumberOfBitsInTheData;

Número de bits en los datos (máx. 32). Rango = 1… 32

byte bPulseTrainRepeats;

Cuántas repeticiones de este tren de pulsos. Rango = 1… 255. Normalmente 2… 4 repeticiones. Es posible que desee extender esto para los comandos de encendido / apagado, ya que el dispositivo receptor a veces requiere algunas repeticiones de tren de pulsos adicionales para recibir una señal de encendido

byte bDelayBetweenPulseTrainRepeats;

Retraso entre repeticiones de este tren de pulsos. Rango = 1… 255 mS. Normalmente 22 mS… 124 mS

byte bButtonRepeats;

Simula la presión repetida del mismo botón (pero no admite el código modificado como un control remoto de Apple, simplemente repite el código del botón). Rango = 1… 256. Predeterminado = 1

uint16_t ui16DelayBetweenButtonRepeats;

Retraso entre repeticiones de botones (unsigned int). 2 bytes en total LSByte… MSByte. Rango = 1… 65535mS. Predeterminado = 0 ms

byte bFreshData;

  • Datos frescos. Un valor distinto de cero. Escrito en último lugar, activa la secuencia IR TX. Rango 0x00… 0xFF

    • Más paquetes de control por venir = 0
    • Este es el paquete de control final = valor distinto de cero 1, 2,… 255

Tenga en cuenta el uso de la directiva del compilador '_packed_'. Esto es para asegurar que los datos sean paquete byte por byte en la memoria, independientemente del sistema de destino utilizado (Uno, Due, ESP8266, etc.). Esto significa que la unión entre registerAllocationType y dataArrayType solo necesita reloj de salida / reloj en bytes secuencialmente desde un paquete de control, lo que hace que el software TX / RX sea simple.

Paso 4: Adquirir códigos de control remoto (ui32Data)

Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)
Adquirir códigos de control remoto (ui32Data)

Hay tres formas de adquirir un código de llave de control remoto respectivo;

  1. Mediante el recuento de bits con un osciloscopio,
  2. Búscalo en un sitio web,
  3. Decodifíquelo directamente del flujo de datos en el software.

A través del recuento de bits con un alcance

Este no es un método eficiente, ya que lleva bastante tiempo y potencialmente requiere más de un intento, sin embargo, puede ser muy preciso. También es útil para validar visualmente los códigos obtenidos mediante los métodos 2 y 3, y también para determinar las peculiaridades de un control remoto. A modo de ejemplo, al mantener pulsado un botón en un mando a distancia por infrarrojos de Apple. El control remoto inicialmente emitirá una secuencia de comandos y luego la seguirá con una secuencia comprimida repetida de 0xF….

Búscalo en un sitio web

La base de datos de códigos de control remoto en el sitio web de Linux Infrared Remote Control es una buena fuente.

Sin embargo, la desventaja es que es posible que tenga que probar algunos códigos hasta que encuentre uno que funcione para usted. Es posible que también deba interpretar algunas de las representaciones de los códigos para convertirlos en su forma hexadecimal equivalente.

Decodifíquelo directamente desde el flujo de datos

Usando el circuito en la imagen 1 arriba junto con el ejemplo de la biblioteca IRremote 'IRrecvDumpV2.ino' es posible decodificar el flujo de datos directamente desde el control remoto. La imagen 2 muestra un control remoto de TV Samsung decodificado para presionar un botón de encendido / apagado en la ventana del terminal Arduino IDE.

Receptor / transmisor combinado

Las imágenes 3 y 4 de arriba muestran una solución que permite tanto la recepción como la transmisión del comando IR para permitir una fácil creación de prototipos.

Para decodificar las pulsaciones de los botones del control remoto por infrarrojos, necesitará flashear el Arduino con el ejemplo 'IRrecvDumpV2.ino' que viene con la biblioteca IRremote.

También funciona igualmente bien para la transmisión si los comandos IR. Se incluye un LED rojo como indicación visual de que el dispositivo está en acción.

Paso 5: Cómo probar su dispositivo esclavo I2C

Cómo probar su dispositivo esclavo I2C
Cómo probar su dispositivo esclavo I2C
Cómo probar su dispositivo esclavo I2C
Cómo probar su dispositivo esclavo I2C

Usando el código fuente aquí, y el circuito descrito arriba en la imagen 1, programe el Arduino 'Maestro' con 'IR_Remote_Sim_Test.ino' y el Arduino 'Esclavo' con 'IR_Remote_Sim.ino'.

Suponiendo que tiene un televisor Sony Bravia, una caja Sky HD y un SoundBar Sony BT, presione el botón 1 y su televisor cambiará a BBC1 (canal 101). Presione el botón 2 y su barra de sonido se silenciará. Presione nuevamente y se activará el silencio.

Durante la ejecución de la secuencia de transmisión de infrarrojos, el LED3 se iluminará indicando que el esclavo está ocupado y el LED1 parpadeará en línea con el proceso de transmisión de infrarrojos.

Por supuesto, si no tiene el mismo sistema de entretenimiento configurado como arriba, puede reprogramar el esclavo con 'IRrecvDumpV2.ino', decodificar sus comandos remotos de interés, luego programarlos en el 'IR_Remote_Sim_Test.ino' para su escenario dado.

La imagen 2 muestra la descripción general del software de prueba a nivel del sistema entre maestro y esclavo.

Paso 6: Reducir su diseño

Reducir su diseño
Reducir su diseño

Ok, entonces asumir que ha seguido este instructivo confiando en dos Arduino para controlar sus dispositivos domésticos no es el uso más eficiente de su stock de Arduino. En consecuencia, si construye el circuito que se muestra en la imagen de arriba y sigue las instrucciones aquí para programar el ATMega328P con 'IR_Remote_Sim.ino', podrá reducir todo el sistema a los componentes mínimos. Esto le permitirá incrustar su diseño en algún otro sistema.

Paso 7: Conclusión

Conclusión
Conclusión
Conclusión
Conclusión

La solución es estable y funciona bien, se ha integrado en otro sistema durante varias semanas sin ningún problema.

Elegí el Arduino Uno R3 porque quería un dispositivo que tuviera suficiente RAM para poder tener un búfer de botón de profundidad razonable. Me conformé con un tamaño de búfer de 20 paquetes (MAX_SEQUENCES).

El escudo híbrido TX / RX que hice también fue muy útil al decodificar los controles remotos de Sony y Sky. Aunque debo confesar que usé mi osciloscopio digital de vez en cuando para verificar que el comando IR decodificado por software fuera el mismo que el que provenía del IR recibido (TSOP38328).

Lo único que hubiera hecho de manera diferente hubiera sido usar el circuito de control de corriente constante para el LED IR como se muestra arriba en la imagen 2.

Otro punto a tener en cuenta es que no todos los transmisores de infrarrojos están modulados con 38 KHz, el TSOP38328 está optimizado para 38 KHz.

Paso 8: Referencias utilizadas

IRRemote.h

  • Por: z3t0
  • Propósito: biblioteca remota de infrarrojos para Arduino: envíe y reciba señales de infrarrojos con múltiples protocolos
  • De:

Biblioteca de control remoto por infrarrojos

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

Sensor receptor de infrarrojos (IR) - TSOP38238 (equivalente)

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

Para evitar el relleno de la estructura de datos hasta los límites de las palabras

  • 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

Buena fuente de detalles del control remoto por infrarrojos

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

I2C

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

Base de datos de mandos a distancia por infrarrojos

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

Hoja de datos BC337

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

1N4148 Hoja de datos

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

Recomendado: