Menú
gratis
Registro
Hogar  /  Navegantes/Arduino Uno. Conexión del receptor de infrarrojos

Arduino Uno. Conexión del receptor de infrarrojos

En esta lección veremos cómo conectar un receptor de infrarrojos a Arduino. Le diremos qué biblioteca se debe utilizar para un receptor de infrarrojos, le mostraremos un boceto para probar el funcionamiento de un receptor de infrarrojos desde un control remoto y analizaremos comandos en C++ para recibir una señal. Tengamos en cuenta de inmediato que el sensor IR Arduino no es adecuado para todos los controles remotos; la frecuencia de la señal puede diferir.

Dispositivo receptor de infrarrojos. Principio de funcionamiento

Los receptores de radiación infrarroja se utilizan ahora ampliamente en electrodomésticos, gracias a precio asequible, simplicidad y facilidad de uso. Estos dispositivos permiten controlar dispositivos mediante un mando a distancia y se pueden encontrar en casi cualquier tipo de equipo. Pero a pesar de esto, el módulo Bluetooth está ganando cada vez más popularidad.

El principio de funcionamiento de un receptor de infrarrojos. Procesando la señal del control remoto

El receptor de infrarrojos de Arduino es capaz de recibir y procesar una señal de infrarrojos en forma de pulsos de una duración y frecuencia determinadas. Utilizado en la fabricación de sensores de obstáculos y telémetros para Arduino. Normalmente, un receptor de infrarrojos tiene tres patas y consta de los siguientes elementos: un fotodiodo PIN, un amplificador, un filtro de paso de banda, un detector de amplitud, un filtro integrador y un transistor de salida.

Bajo la influencia de la radiación infrarroja en un fotodiodo, que tiene entre pag Y norte Las regiones crearon una región adicional de semiconductores ( i-región), la corriente comienza a fluir. La señal pasa a un amplificador y luego a un filtro de paso de banda, que está sintonizado a una frecuencia fija: 30; 33; 36; 38; 40 y 56 kilohercios y protege al receptor de interferencias. Las interferencias pueden deberse a cualquier electrodoméstico.

Para que la señal del control remoto sea recibida por el receptor de IR Arduino, el control remoto debe estar en la misma frecuencia que el filtro del receptor de IR. Por lo tanto, no todos los controles remotos funcionarán. Debe seleccionar un receptor de infrarrojos y un transmisor de infrarrojos con la misma frecuencia. Después del filtro, la señal pasa a un detector de amplitud que integra el filtro y el transistor de salida.

Cómo conectar un receptor de infrarrojos a Arduino

Las carcasas de los receptores de infrarrojos contienen un filtro óptico para proteger el dispositivo de campos electromagnéticos externos; están hechas de una forma especial para enfocar la radiación recibida en un fotodiodo. Para conectar el receptor de infrarrojos al Arduino UNO, se utilizan tres patas, que están conectadas a: GND, 5V y A0. Recomendamos usar 3,3 voltios para empezar para no quemar el sensor de infrarrojos durante la configuración.

Para esta lección necesitaremos los siguientes detalles:

  • Placa Arduino Uno/Arduino Nano/Arduino Mega;
  • tablero de circuitos;
  • receptor de infrarrojos;
  • mando a distancia;
  • 1 LED y resistencia de 220 Ohmios;
  • Cables macho-macho y macho-hembra.


Esquema de conexión del receptor IR al puerto analógico Arduino

Conecte el receptor de infrarrojos según el diagrama que se muestra arriba y conecte los LED a los pines 12 y 13. Antes de descargar el programa, deberá instalar la biblioteca IRremote.h, si aún no está instalada. Esta biblioteca no se aplica a bibliotecas estándar Entorno de programación Arduino IDE. Puede descargar la biblioteca IRremote.h y el boceto terminado en un archivo desde Google Drive mediante el enlace.

Boceto para el receptor IR Arduino:

#incluir // conecta la biblioteca para el receptor de infrarrojos IRrecv irrecv(A0); // indica el pin al que está conectado el receptor de infrarrojos resultados decode_results; configuración vacía () // configuración del procedimiento ( irrecv.enableIRIn (); // comenzamos a recibir una señal infrarroja pinMode(13, SALIDA); // el pin 13 será la salida pinMode(12, SALIDA); // el pin 12 será la salida pinMode(A0, ENTRADA); // el pin A0 será la entrada (ing. “intput”) Serie.begin(9600); // conecta el monitor de puerto) bucle vacío () // bucle de procedimiento (si (irrecv.decode (&resultados)) // si los datos han llegado, ejecuta los comandos( Serial .println(resultados.valor); // envía los datos recibidos al puerto // enciende y apaga los LED, dependiendo de la señal recibida if (resultados.valor == 16754775) ( digitalWrite (13, ALTO); ) if (resultados.valor == 16769055) ( digitalWrite (13, BAJO); ) if (resultados.valor == 16718055) ( digitalWrite (12, ALTO) if (resultados.valor == 16724175) (digitalWrite (12, BAJO);) irrecv.resume (); // recibe la siguiente señal en el receptor de infrarrojos } }

Explicaciones del código:

  1. La biblioteca IRremote.h contiene un conjunto de comandos y le permite simplificar el boceto;
  2. La declaración decode_results asigna los resultados del nombre de la variable a las señales recibidas del control remoto.

El sensor de infrarrojos se puede utilizar en muchos dispositivos en el microcontrolador Arduino, incluido el control remoto de un servoaccionamiento en Arduino desde un receptor de infrarrojos. Al configurar, debe encender el monitor del puerto IDE de Arduino y averiguar qué señal envía este o aquel botón del control remoto. Los códigos resultantes deben usarse en el boceto después del doble signo igual en las condiciones if().

Publicaciones sobre este tema:


  • Tensión de entrada: 4,0 ... 5,5 V (5 V nominal)
  • Consumo de corriente: hasta 100 mA en modo pulso (a Vcc = 5 V)
  • Longitud de onda de la luz: 940 nm (valor máximo)
  • Frecuencia máxima de señal: hasta 10 MHz
  • Distancia de transmisión: hasta 10 m (a Vcc=5V)
  • Temperatura de funcionamiento: -25 … 85°C
  • Ángulo direccional: 120° (con pérdida de potencia< 50%)

Todos los módulos de la línea "Trema" se fabrican en el mismo formato.

Conexión:

Es conveniente conectar el módulo de 3 formas, según la situación:

Método - 1: Usando un cable cableado y Piranha UNO

La biblioteca utiliza un segundo temporizador de hardware,

¡NO ENVÍE SEÑALES PWM A 3 U 11 SALIDAS!

Lea más sobre la instalación de la biblioteca en nuestro...

Información adicional sobre cómo trabajar con el módulo:

Paquetes: Casi todos los controles remotos envían no solo un paquete de información (que indica el tipo de dispositivo y el código del botón presionado), sino también paquetes repetidos, informando al dispositivo que se mantiene presionado el botón. Por lo tanto, el dispositivo receptor puede responder al presionar el botón una vez o durante todo el tiempo que se mantiene presionado.
Por ejemplo: manteniendo presionado el botón con el número del canal de TV, el televisor cambiará a este canal sólo una vez. Mientras mantiene presionado el botón para subir el volumen, el televisor lo aumentará durante todo el tiempo que mantenga presionado el botón.

Número de paquetes de información La mayoría de los controles remotos tienen uno, pero algunos dispositivos, como los aires acondicionados, usan 2, 3 o más paquetes de información.

Contenido del paquete: El paquete de información contiene información sobre el código del fabricante, tipo de dispositivo, código del botón presionado, etc. Los paquetes repetidos pueden coincidir total o parcialmente con un paquete de información, copiar sus bits con inversión o no transportar ninguna información, representando una secuencia de varios bits idénticos para cada paquete repetido.

Duración de las pausas entre paquetes: normalmente no supera los 200 ms.

Protocolos de transferencia de datos: determinar los siguientes parámetros básicos:

Frecuencia portadora: para la mayoría de los controles remotos es 38 kHz; es esta frecuencia a la que está sintonizado el receptor Trema IR.

Codificación de información: Este es el principio de transmisión de bits de datos. Resaltamos tres tipos principales de codificación, en los que cada bit se transmite en una secuencia de un pulso y una pausa:

Señales de inicio, parada y alternancia: según su nombre, se ubican al principio, al final o en la mitad del paquete.

Detener: Al codificar una pausa larga, es imposible determinar el valor del último bit del paquete, ya que al paquete le sigue una pausa larga y el último bit siempre se definirá como "1", por lo que se agrega la señal de parada. al paquete, que es un pulso que no lleva ninguna información.

Comenzar: Con la codificación bifásica, se requiere una señal de Inicio, ya que es imposible comenzar a transmitir un paquete desde una pausa.

Palanca: Este es un bit que cambia su valor con cada nueva pulsación de botón, utilizado en los protocolos RS5, RS5X, RS6 (Philips), donde los paquetes repetidos repiten completamente los datos. paquete de información. De esta forma, el dispositivo receptor puede diferenciar entre mantener pulsado un botón y volver a pulsarlo.

codificación de longitud de pulso- primero se transmite un pulso, cuya duración depende del valor del bit transmitido, luego sigue una pausa, cuya duración no depende del valor del bit. Por ejemplo: en el protocolo SIRC (Sony), la duración del pulso para el bit “1” = 1200 µs, y para el bit “0” = 600 µs, la duración de las pausas es siempre de 600 µs. De esta manera, puede distinguir "1" de "0" por la duración del pulso.

codificación de longitud de pausa- primero se transmite un impulso, cuya duración no depende del valor del bit transmitido, seguido de una pausa, cuya duración depende del valor del bit. Por ejemplo: en el protocolo NEC, la duración de la pausa para el bit “1” = 1687,5 µs, y para el bit “0” = 562,5 µs, la duración del pulso es siempre 562,5 µs. Por lo tanto, puede distinguir "1" de "0" por la duración de la pausa.

codificación bifásica- la duración del pulso es igual a la duración de la pausa y su secuencia determina el tipo de bit transmitido. Por ejemplo: en el protocolo RS5 (Philips), para el bit "1" un pulso sigue a una pausa y para el bit "0" una pausa sigue a un pulso. Para el protocolo NRC (Nokia), por el contrario, para el bit “1” una pausa sigue a un pulso, y para el bit “0” un pulso sigue a una pausa.

Ejemplos:

Transferencia de datos única:

#incluir // Conecta la biblioteca para trabajar con el transmisor IR iarduino_IR_TX VD(10); // Declarar un objeto VD, indicando el pin al que está conectado el transmisor IR void setup())( VD.begin(); // Iniciar trabajo con el transmisor IR VD.send(0x00FFA25D); // Enviar código 0x00FFA25D una vez , sin repeticiones de paquetes ) void loop()() // Arduino enviará el código 0x00FFA25D, indicando que está encendido

Transmisión de datos con paquetes de reintento:

#incluir // Conecta la biblioteca para trabajar con el transmisor IR iarduino_IR_TX VD(2); // Declarar el objeto VD, indicando el pin al que está conectado el transmisor IR void setup())( pinMode(3,INPUT); // Configurar el pin 3, al que está conectado el botón, como entrada pinMode(4, INPUT); // Configura el pin 5, al que está conectado el botón, como entrada pinMode(5,INPUT); // Configura el pin 5, al que está conectado el botón, como entrada VD.begin(); Iniciar trabajo con el transmisor IR ) void loop())( if(digitalRead(3))(VD.send(0x00FFA25D, true);) // Si se presiona el botón conectado al pin 3, enviamos el código 0x00FFA25D, y cuando se mantiene presionado enviamos paquetes repetidos, ya que la función fue llamada con el parámetro true if(digitalRead(4))(VD.send(0x00FF629D, true);) // Si se presiona el botón conectado al pin 4 , luego enviamos el código 0x00FF629D, y cuando se mantiene presionado, enviamos paquetes repetidos, ya que la función fue llamada con el parámetro true if(digitalRead(5))(VD.send(0x00FFE21D, true);) // Si el Se presiona el botón conectado al pin 5, luego enviamos el código 0x00FFE21D, y cuando se mantiene presionado, enviamos paquetes repetidos, ya que la función fue llamada con el parámetro true)

Transferencia de datos indicando el protocolo:

#incluir // Conecta la biblioteca para trabajar con el transmisor IR iarduino_IR_TX VD(5); // Declarar el objeto VD, indicando el pin al que está conectado el transmisor IR void setup() ( VD.begin(); // Iniciar trabajo con el transmisor IR pinMode(6,INPUT); // Configurar el pin 6 al que el botón como entrada pinMode(7,INPUT); // Configura el pin 7, al que está conectado el botón, como entrada pinMode(8,INPUT); // Configura el pin 8, al que está conectado el botón, como entrada; input VD.protocol("AeQQV" ~zK]Kp^KJp[@@@@@@@Bp"); // Especifique el protocolo de transferencia de datos desde el control remoto ELENBERG) // Puede obtener la línea de protocolo presionando cualquier en el control remoto del televisor // y llamando a la función del receptor del mismo nombre, sin parámetros void loop())( if(digitalRead(4))(VD.send(0x417, true);) // envía un ON/ Señal OFF (con paquetes repetidos, los paquetes se repiten después de un intervalo de tiempo especificado en el protocolo) if(digitalRead(5) )(VD.send(0x425, true);) // envía la señal VOL- (con paquetes repetidos, los paquetes se repiten después del intervalo de tiempo especificado en el protocolo) if(digitalRead(6))(VD.send(0x427);) // envía una señal VOL+ (sin repetir paquetes, el volumen aumentará más rápido, ya que la función se llama en un bucle sin intervalos) )

Este ejemplo muestra cómo el transmisor puede simular completamente las señales de otros controles remotos por infrarrojos.

La cadena de protocolo resultante debe pasarse como parámetro a la función protocolo(), después de lo cual puede enviar códigos de botón usando la función enviar(). Como resultado, los dispositivos responderán al transmisor de infrarrojos como si respondieran a su propio control remoto de infrarrojos.

Descripción de las principales funciones de la biblioteca:

Conectando la biblioteca:

#incluir // Conecte la biblioteca para que funcione con el transmisor de infrarrojos. iarduino_IR_TX VD(PIN_NO[,INVERSIÓN]); // Declara un objeto VD, indicando el número de pin al que está conectado el transmisor IR.

// El segundo parámetro, de tipo bool, puede indicar que es necesario invertir los datos del transmisor.

  • Función comenzar();
  • Propósito: inicialización del trabajo con el transmisor IR.
  • Sintaxis: comenzar();
  • Opciones: No.
  • Valores de retorno: Ninguno.
  • Nota: Se llama una vez en el código de configuración.
Ejemplo:

VD.begin(); // Iniciar trabajo con el transmisor IR

  • Función enviar();
  • Finalidad: Transferencia de datos.
  • Sintaxis: enviar(DATOS [, MANTENER]);
    • Parámetros:
    • DATOS: código, como uint32_t, que debe transferirse;
  • Opciones: No.
  • HOLD: un parámetro opcional, tipo bool, que indica que es necesario transmitir no solo el código, sino también reintentar paquetes. El parámetro tiene sentido si se llama a la función mientras se mantiene presionado el botón.
  • Nota: Se llama una vez en el código de configuración.
Nota: Si la función se llama sin el parámetro HOLD, o es igual a falso, entonces la función, cada vez que se llama, transmitirá el código especificado una vez. Si se llama a la función con el parámetro HOLD igual a verdadero, entonces la función rechaza el botón y envía paquetes de reintento (en el intervalo especificado en el protocolo) cuando se mantiene presionado.

VD.enviar(0xCCDDEEFF); // Enviar código 0xCCDDEEFF. Si la función se llama constantemente, en un bucle, enviará este código cada vez. VD.send(0xCCDDEEFF, verdadero); // Enviar código 0xCCDDEEFF. Si la función se llama constantemente, en un bucle, enviará el código solo la primera vez y luego enviará paquetes repetidos de acuerdo con el protocolo de transferencia de datos especificado.

  • Protocolo de función();
  • Finalidad: Establecer el protocolo de transferencia de datos.
  • Sintaxis: enviar(DATOS [, MANTENER]);
  • se puede obtener llamando a la función del mismo nombre, sin parámetros, para el receptor.
  • Nota: La función establece el protocolo de transferencia de datos, de modo que el transmisor de infrarrojos pueda simular las señales de los controles remotos convencionales. Después de llamar a esta función, las transferencias de datos mediante la función send() se llevarán a cabo utilizando el nuevo protocolo. El protocolo de transferencia de datos por defecto corresponde al mando a distancia “Car mp3”.
  • Nota: Se llama una vez en el código de configuración.
VD.protocol("AeQQV~zK]Kp^KJp[@@@@@@@Bp"); // Especificar el protocolo de transferencia de datos desde el mando a distancia ELENBERG.

// Ahora el transmisor enviará datos, codificándolos, de acuerdo con el protocolo especificado.

  • // Puede obtener una cadena de protocolo presionando cualquier botón en el control remoto del televisor y llamando a la función del mismo nombre para el receptor de infrarrojos, sin parámetros.
  • Variable de frecuencia:
  • Valor: establece la frecuencia portadora de transmisión de datos en kHz;
Tipo de datos: uint8_t;

Nota: Si a la variable no se le asigna ningún valor, la transmisión se realiza a la frecuencia especificada en el protocolo. Si especifica un valor de 0, los datos se transmitirán sin modulación.

  • Frecuencia.VD=36; // Establezca la frecuencia portadora para la transmisión de datos en 36 kHz. VD.enviar(0xCCDDEEFF); // Envía datos con una frecuencia portadora de 36 kHz. VD.enviar(0xABCDEF); // Envía datos con una frecuencia portadora de 36 kHz.
  • // La frecuencia de la portadora cambiará si establece un nuevo valor para la variable de frecuencia o establece un nuevo protocolo de transferencia de datos llamando a la función protocolo().
  • Solicitud:
  • control de robots, modelos móviles, voladores y flotantes, equipos domésticos y especializados.
  • Encendido/apagado de iluminación, calefacción, ventilación, riego, etc.
  • apertura/cierre de puertas, persianas, ventanas de tejado, rejillas de ventilación, etc.
  • Tensión de entrada: 2,7 ... 5,5 V
  • Consumo de corriente: 0,65 ... 1,05 mA (a Vcc = 5V) nominalmente 0,9 mA
  • Frecuencia portadora: 38 kHz
  • Longitud de onda de la luz: 850 ... 1050 nm (pasada por el filtro más del 80%)
  • Sensibilidad: 0,17… 30000 mW/m2 (a la potencia del flujo luminoso)

Todos los módulos de la línea "Trema" se fabrican en el mismo formato.

Conexión:

Distancia de recepción: hasta 45 m

Es conveniente conectar el módulo de 3 formas, según la situación:

Método - 1: Usando un cable cableado y Piranha UNO


La biblioteca utiliza un segundo temporizador de hardware,

¡NO ENVÍE SEÑALES PWM A 3 U 11 SALIDAS!

Lea más sobre la instalación de la biblioteca en nuestro...

Información adicional sobre cómo trabajar con el módulo:

Paquetes: Temperatura de funcionamiento: -25 … 85 °C

Por ejemplo: al mantener presionado un botón con un número de canal de TV, el televisor cambiará a ese canal solo una vez. Mientras mantiene presionado el botón para subir el volumen, el televisor lo aumentará durante todo el tiempo que mantenga presionado el botón.

Número de paquetes de información La mayoría de los controles remotos tienen uno, pero algunos dispositivos, como los aires acondicionados, usan 2, 3 o más paquetes de información.

Contenido del paquete: El paquete de información contiene información sobre el código del fabricante, tipo de dispositivo, código del botón presionado, etc. Los paquetes repetidos pueden coincidir total o parcialmente con un paquete de información, copiar sus bits con inversión o no transportar ninguna información, representando una secuencia de varios bits idénticos para cada paquete repetido.

Duración de las pausas entre paquetes: normalmente no supera los 200 ms.

Protocolos de transferencia de datos: determinar los siguientes parámetros básicos:

  • frecuencia portadora;
  • método de codificación de información, duración de pulsos y pausas de bits transmitidos;
  • número de paquetes de información:
  • composición del paquete de información y paquetes de repetición;
  • duración de las pausas entre paquetes;
  • presencia y forma de señales de inicio, parada y alternancia;

Frecuencia portadora: para la mayoría de los controles remotos es 38 kHz; es esta frecuencia a la que está sintonizado el receptor Trema IR.

Codificación de información: Este es el principio de transmisión de bits de datos. Resaltamos tres tipos principales de codificación, en los que cada bit se transmite en una secuencia de un pulso y una pausa:

  • Codificación de la longitud del pulso: primero se transmite un pulso, cuya longitud depende del valor del bit transmitido, seguido de una pausa, cuya longitud no depende del valor del bit. Por ejemplo: en el protocolo SIRC (Sony), la duración del pulso para el bit “1” = 1200 µs, y para el bit “0” = 600 µs, la duración de las pausas es siempre de 600 µs. De esta manera, puede distinguir "1" de "0" por la duración del pulso.
  • codificación de pausas largas: primero se transmite un pulso, cuya longitud no depende del valor del bit transmitido, luego sigue una pausa, cuya longitud depende del valor del bit. Por ejemplo: en el protocolo NEC, la duración de la pausa para el bit “1” = 1687,5 µs, y para el bit “0” = 562,5 µs, la duración del pulso es siempre 562,5 µs. Por lo tanto, puede distinguir "1" de "0" por la duración de la pausa.
  • Codificación bifásica: la duración del pulso es igual a la duración de la pausa y su secuencia determina el tipo de bit transmitido. Por ejemplo: en el protocolo RS5 (Philips), para el bit "1" un pulso sigue a una pausa y para el bit "0" una pausa sigue a un pulso. Para el protocolo NRC (Nokia), por el contrario, para el bit “1” una pausa sigue a un pulso, y para el bit “0” un pulso sigue a una pausa.

Señales de inicio, parada y alternancia: según su nombre, se ubican al principio, al final o en la mitad del paquete.

Detener: Al codificar una pausa larga, es imposible determinar el valor del último bit del paquete, ya que al paquete le sigue una pausa larga y el último bit siempre se definirá como "1", por lo que se agrega la señal de parada. al paquete, que es un pulso que no lleva ninguna información.

Comenzar: Con la codificación bifásica, se requiere una señal de Inicio, ya que es imposible comenzar a transmitir un paquete desde una pausa.

Palanca: Este es un bit que cambia su valor con cada nueva pulsación de botón, utilizado en los protocolos RS5, RS5X, RS6 (Philips), donde los paquetes repetidos repiten completamente los datos del paquete de información. De esta forma, el dispositivo receptor puede diferenciar entre mantener pulsado el botón y volver a pulsarlo.

Ejemplos:

La verificación de la disponibilidad de los datos recibidos desde el control remoto por infrarrojos se realiza mediante la función check(). Esta función responde al presionar los botones del control remoto por infrarrojos, pero si se llama con el parámetro verdadero, también responderá al mantener presionados los botones.

Al leer datos de cualquier control remoto, respondemos solo al presionar un botón:

#incluir // Conecta la biblioteca para trabajar con el receptor de infrarrojos iarduino_IR_RX IR(7); // Declarar un objeto IR, indicando el pin al que está conectado el receptor IR void setup())( Serial.begin(9600); // Iniciar la transferencia de datos al monitor puerto serie, a 9600 bps IR.begin(); // Iniciar trabajo con el receptor de infrarrojos) void loop())( if(IR.check())( // Si el búfer contiene datos recibidos del control remoto (se presionó el botón) Serial.println(IR.data, HEX); // Muestra el código del botón presionado Serial.println(IR.length); // Muestra el número de bits en el código) )

En este boceto, la función check() se llama sin argumentos, lo que significa que solo responde a las pulsaciones de botones en el control remoto por infrarrojos.

Leyendo datos de cualquier mando a distancia, respondemos pulsando los botones:

#incluir // Conecta la biblioteca para trabajar con el receptor de infrarrojos iarduino_IR_RX IR(6); // Declara un objeto IR, indicando el pin al que está conectado el receptor IR void setup())( Serial.begin(9600); // Inicia la transferencia de datos al monitor del puerto serie, a una velocidad de 9600 bps IR.begin (); // Iniciar trabajo con el receptor de infrarrojos) void loop())( if(IR.check(true))( // Si el búfer contiene datos recibidos del control remoto (el botón se mantiene presionado) Serial.println (IR.data, HEX); // Muestra el código del botón presionado Serial.println(IR.length // Muestra el número de bits en el código) );

En este boceto, la función check() se llama con el parámetro verdadero, lo que significa que reacciona al presionar y mantener presionados los botones del control remoto por infrarrojos.

Lectura de datos de cualquier mando a distancia, indicando cómo responder a qué botones.

#incluir // Conecta la biblioteca para trabajar con el receptor de infrarrojos iarduino_IR_RX IR(6); // Declarar un objeto IR, indicando el pin al que está conectado el receptor IR // bool flgKey1 = false; uint32_t codKey1 = 0xFF30CF; // Definir la bandera de clic y el código del botón 1 bool flgKey2 = false; uint32_t codKey2 = 0xFF18E7; // Definir la bandera de clic y el código del botón 2 bool flgKey3 = false; uint32_t codKey3 = 0xFF7A85; // Definir la bandera de clic y el código del botón 3 bool flgKey = false; uint32_t tmrKey = 0; // Defina una bandera que permita enviar datos al monitor y la hora de la última pulsación del botón.

// void setup())( // Serial.begin(9600); // Inicia la transferencia de datos al monitor del puerto serie, a una velocidad de 9600 bps IR.begin(); // Inicia el trabajo con el receptor de IR) / // / void loop())( // if(IR.check(true))( // Si el búfer contiene datos recibidos del control remoto (el botón se mantiene presionado), entonces... if(millis() -200 > tmrKey)( / / Si han pasado más de 200 ms desde el último comando recibido, entonces flgKey1=false; // Considere que el botón 1 no está presionado flgKey2=false; // Considere que el botón 2 no está presionado flgKey3= false; // Considera que el botón 3 no está presionado) tmrKey = millis(); flgKey=true // Guarda el tiempo de la última respuesta al control remoto y permite la salida de datos if(IR.data==codKey1)( if (flgKey1)(flgKey=false;) flgKey1=true; )else(flgKey1= false;) // Prohibimos la salida de datos del botón 1 cuando se mantiene presionado if(IR.data==codKey2)( if(flgKey2) (flgKey=false;) flgKey2=true; )else(flgKey2=false;) // Prohibimos la salida del botón de datos 2 mientras lo mantiene presionado if(IR.data==codKey3)( if(flgKey3)(flgKey=false; ) flgKey3=verdadero; )else(flgKey3=false;) // Prohibir la salida de datos del botón 3 cuando se mantiene presionado if(flgKey)( // Si se permite la salida de datos, entonces... Serial.println(IR.data, HEX); // Muestra el código de los botones presionados Serial.println(IR.length); // Imprime el número de bits en el código ) // ) // ) //

En este boceto, la función check() se llama con el parámetro verdadero, lo que significa que responde al presionar y mantener presionados los botones del control remoto por infrarrojos. Pero los datos se envían al monitor del puerto serie solo cuando se establece el indicador flgKey, que se restablece cuando se mantienen presionados los botones con los códigos 0xFF30CF, 0xFF18E7 y 0xFF7A85. Resulta que el boceto reacciona a 3 botones solo cuando se presionan, y a los botones restantes cuando se presionan y mantienen presionados.

#incluir // Conecta la biblioteca para trabajar con el receptor de infrarrojos iarduino_IR_RX IR(5); // Declara un objeto IR, indicando el pin al que está conectado el receptor IR void setup())( Serial.begin(9600); // Inicia la transferencia de datos al monitor del puerto serie, a una velocidad de 9600 bps IR.begin (); // Iniciar el trabajo con el receptor de infrarrojos IR.protocol("Ae`` `|LJ` @@@@BPBp"); // Especificar el protocolo de transferencia de datos al que responder) void loop())( if( IR.check( true))( // Si el búfer contiene datos recibidos del control remoto (el botón se mantiene presionado) Serial.println(IR.data, HEX); // Muestra el código del botón presionado Serial.println (IR.length); // Muestra el número de bits en el código) )

En este boceto, en el código setup() se indica el protocolo de transferencia de datos, que rara vez coincide con diferentes fabricantes Mandos a distancia por infrarrojos. Esto significa que la función check() en el código loop() solo responderá a aquellos controles remotos IR que admitan el protocolo especificado.

Obteniendo el protocolo de transferencia de datos y el tipo de codificación:

#incluir // Conecta la biblioteca para trabajar con el receptor de infrarrojos iarduino_IR_RX IR(4); // Declara un objeto IR, indicando el pin al que está conectado el receptor IR void setup())( Serial.begin(9600); // Inicia la transferencia de datos al monitor del puerto serie, a una velocidad de 9600 bps IR.begin (); // Iniciar trabajo con el receptor de infrarrojos) void loop())( if(IR.check())( // Si el búfer contiene datos recibidos del control remoto (se presionó el botón) Serial.println(IR). .protocol()); // Genera la cadena del protocolo de transferencia de datos) )

EN en este ejemplo describe cómo obtener el protocolo de transferencia de datos para controles remotos IR. El artículo describe cómo transmitir códigos de botones utilizando el protocolo especificado.

De esta manera, puede crear un boceto de transmisor de infrarrojos para simular las señales de varios controles remotos de infrarrojos. Como resultado, los dispositivos responderán al transmisor de infrarrojos como si respondieran a su propio control remoto de infrarrojos.

Descripción de las principales funciones de la biblioteca:

Conectando la biblioteca:

#incluir // Conecte la biblioteca para que funcione con el receptor de infrarrojos. iarduino_IR_RX IR(PIN#[, INVERTIR]); // Declara un objeto IR, indicando el número de pin al que está conectado el receptor IR.

// El segundo parámetro, de tipo bool, puede indicar que es necesario invertir los datos del transmisor.

  • // El segundo parámetro, de tipo bool, puede indicar que los datos del receptor están invertidos.
  • Propósito: inicialización del trabajo con el transmisor IR.
  • Sintaxis: comenzar();
  • Opciones: No.
  • Valores de retorno: Ninguno.
  • Nota: Se llama una vez en el código de configuración.
Propósito: inicialización del trabajo con el receptor de infrarrojos.

IR.comenzar(); // Iniciar trabajo con el receptor de infrarrojos

  • Verificación de función();
  • Finalidad: Comprobar la disponibilidad de los datos recibidos del mando a distancia.
  • Sintaxis: enviar(DATOS [, MANTENER]);
    • Sintaxis: comprobar([MANTENER]);
  • HOLD: un parámetro opcional, tipo bool, que indica que es necesario responder al mantener presionados los botones del control remoto.
  • Nota: Si la función se llama sin un parámetro, o es falsa, entonces la función solo responderá a las señales del control remoto cuando se presionen sus botones, y si especifica verdadero, la función responderá al presionar y mantener presionado el botón. Botones del control remoto.
  • Nota: Se llama una vez en el código de configuración.
if(IR.check())( ... ;) // Si los datos se reciben desde el control remoto, cuando presiona su botón if(IR.check(true))( ... ;) // Si los datos son recibido desde el control remoto, al mantener presionado el botón

VD.enviar(0xCCDDEEFF); // Enviar código 0xCCDDEEFF. Si la función se llama constantemente, en un bucle, enviará este código cada vez. VD.send(0xCCDDEEFF, verdadero); // Enviar código 0xCCDDEEFF. Si la función se llama constantemente, en un bucle, enviará el código solo la primera vez y luego enviará paquetes repetidos de acuerdo con el protocolo de transferencia de datos especificado.

  • Finalidad: Recibir, configurar o restablecer el protocolo de transferencia de datos.
  • Sintaxis: protocolo([PARÁMETRO]);
  • Obtener el protocolo: si la función se llama sin un parámetro, devolverá una cadena de 25 caracteres + el carácter de final de línea. Los bits de esta línea transportan información sobre el tipo de protocolo de transferencia de datos del control remoto cuyos datos se recibieron por última vez. Esta línea se puede utilizar para configurar el protocolo para el transmisor o receptor de IR (ver más abajo).
  • Configuración del protocolo: si la función se llama con un parámetro en forma de una cadena de 25 caracteres de protocolo + el carácter de final de línea, después de esto, la función chek() responderá solo a los controles remotos que cumplan con los datos especificados. protocolo de transferencia.
  • Restablecimiento de protocolo: si la función se llama con el parámetro IR_CLEAN, entonces la función chek() responderá nuevamente a las señales de cualquier control remoto.
  • Recibir parámetros de protocolo: si la función se llama con un parámetro int, de 0 a 17, no devolverá una cadena de protocolo, sino un valor int con uno de los parámetros del protocolo de transferencia de datos de la consola cuyos datos se recibieron por última vez. :
    • 0 - tipo de codificación:
      • IR_UNDEFINED: el tipo de codificación no está definido;
      • IR_PAUSE_LENGTH - codificación de pausa larga;
      • IR_PULSE_LENGTH: codificación por pulso largo (ancho) (PWM);
      • IR_BIPHASIC - codificación bifásica;
      • IR_BIPHASIC_INV: codificación bifásica con bits invertidos;
      • IR_NRC: los paquetes repetidos son idénticos, pero el primer y el último paquete son especiales;
      • IR_RS5: codificación PHILIPS con bit de conmutación;
      • IR_RS5X: codificación PHILIPS con bit de conmutación;
      • IR_RS6: codificación PHILIPS con bit de conmutación.
    • 1 - frecuencia portadora de transmisión de datos (en kHz);
    • 2 - número declarado de bits de información en 1 paquete;
    • 3 - número declarado de bits de información en el paquete repetido;
    • 4 - duración de la pausa entre paquetes (en ms);
    • 5 - duración del pulso en el bit de inicio (en μs);
    • 6 - duración de la pausa en el bit de inicio (en μs);
    • 7 - duración del pulso en bit de parada (en μs);
    • 8 - duración de la pausa en el bit de parada (en μs);
    • 9 - duración del pulso en el bit de reinicio o conmutación (en μs);
    • 10 - duración de la pausa en el bit de reinicio o conmutación (en μs);
    • 11 - posición del bit de reinicio o conmutación en el paquete (n° de bit);
    • 12 - duración máxima del pulso en bits de información (en μs);
    • 13 - duración mínima del pulso en bits de información (en μs);
    • 14 - duración máxima de la pausa en bits de información (en μs);
    • 15 - duración mínima de la pausa en bits de información (en μs);
    • 16 - indicador de presencia del bit de inicio (verdadero/falso);
    • 17 - bandera de presencia bit de parada(verdadero/falso);
    • 18 - indicador de presencia del bit de reinicio o conmutación (verdadero/falso);
    • 19 - tipo de paquete repetido (0-ninguno, 1-con bits invertidos, 2-idéntico a la información, 3-único);
  • Valores de retorno: Depende de la presencia y el tipo del parámetro.
  • Nota: Si se configuró previamente un protocolo, al intentar recibir el protocolo o los parámetros del protocolo se devolverán los valores del protocolo establecido previamente, y no el protocolo de transferencia de datos de la consola cuyos datos se recibieron por última vez.
  • Nota: Se llama una vez en el código de configuración.
IR.protocol("AeQQV~zK]Kp^KJp[@@@@@@@Bp"); // Establecer el protocolo. Ahora el receptor recibirá datos únicamente de los mandos a distancia de ELENBERG TV.

Protocolo.IR(IR_CLEAN); // Restablecer el protocolo previamente instalado. Ahora el receptor volverá a responder a cualquier mando a distancia. if(IR.check())( Serial.println(IR.protocol()); ) // Obtener el protocolo. Tan pronto como el receptor reciba los datos, se mostrará en el monitor una cadena de 25 caracteres de protocolo. if(IR.check())( Serial.println(IR.protokol(12)); ) // Obtiene uno de los parámetros del protocolo. Tan pronto como el receptor reciba los datos, el monitor mostrará la duración máxima del pulso del bit de información en microsegundos.

  • variables de datos
  • Valor: Devuelve el código del botón recibido del control remoto;
Tipo de datos: uint32_t.

if(IR.check())( Serial.println(IR.data); ) // Imprime el código del botón presionado si es aceptado

  • longitud variable
  • Valor: Devuelve el tamaño del código del botón, en bits;
Tipo de datos: uint8_t.

if(IR.check())( Serial.println(IR.length); ) // Imprime el tamaño del código del botón presionado, si se acepta

  • variable key_press
  • Significado: Devuelve un indicador que indica que se está presionando el botón del control remoto en lugar de mantenerlo presionado;
Tipo de datos: booleano.

Nota: Si a la variable no se le asigna ningún valor, la transmisión se realiza a la frecuencia especificada en el protocolo. Si especifica un valor de 0, los datos se transmitirán sin modulación.

  • Frecuencia.VD=36; // Establezca la frecuencia portadora para la transmisión de datos en 36 kHz. VD.enviar(0xCCDDEEFF); // Envía datos con una frecuencia portadora de 36 kHz. VD.enviar(0xABCDEF); // Envía datos con una frecuencia portadora de 36 kHz.
  • // La frecuencia de la portadora cambiará si establece un nuevo valor para la variable de frecuencia o establece un nuevo protocolo de transferencia de datos llamando a la función protocolo().
  • Solicitud:
  • if(IR.check(true))( if(IR.key_press)(Serial.println("PRESS");) // El texto se imprimirá 1 vez cuando se presione el botón else (Serial.println("HOLD " );) // El texto se mostrará continuamente mientras se mantenga presionado el botón)

Los dispositivos controlados por un mando a distancia por infrarrojos se han convertido en una parte integral de nuestras vidas. A veces, el mando a distancia de un televisor o de un sistema de audio antiguo se pierde y después de muchos años ya no es posible comprar uno nuevo. No siempre es posible pedir un mando a distancia nuevo o hacer un clon, pero si tienes un donante o información al respecto, puedes hacer un convertidor. Dicho transcodificador recibirá comandos de un control remoto y los traducirá al formato de otro.

Existe una excelente biblioteca IRemote para Arduino que simplifica la construcción de una variedad de sistemas de control IR. Pero a la hora de resolver incluso una tarea tan sencilla como la de un transcodificador, siempre surgen problemas que resultan interesantes de resolver.
Entonces, primero, necesitamos un receptor de infrarrojos integrado como TSOP312 o un escudo correspondiente para Arduino. No olvide que hay muchos receptores de infrarrojos y su configuración de pines cambia aleatoriamente. Por ejemplo, utilicé cierto elemento sin nombre con un pinout idéntico al TSOP382 pero en una caja más pequeña y sin clave de separación.

Circuito ensamblado Lo necesitamos para recibir códigos de comando de ambos controles remotos; desafortunadamente, eliminar comandos de un dispositivo cuyo control remoto se ha perdido es algo más difícil. Todavía puedes encontrar un control remoto de donante y utilizarlo. control remoto universal seleccionando el código (entonces, ¿por qué necesita un transcodificador si el control remoto funciona?) o intentando utilizar datos de bases de datos de Internet en códigos IR. Lo más fácil para mí fue utilizar una aplicación de Android que emule el mando a distancia que necesitaba.
Para leer los datos, usamos el ejemplo IRrecvDumpV2 del suministro IRremote si su control remoto es uno reconocido por la biblioteca, entonces no necesitará el resultado del escaneo sin procesar, aunque, por ejemplo, mi control remoto LG fue reconocido falsamente como Samsung y no funcionó cuando intenté enviar comandos a través de sendLG.

Un ejemplo de los datos recibidos bajo el spoiler:

Codificación: SAMSUNG
Código: 34346897 (32 bits)
Momento:
+4450, -4350 + 600, - 500 + 600, - 500 + 600, -1600

+ 600, - 500 + 600, - 500 + 600, - 500 + 600, -1600
+ 600, -1600 + 600, - 500 + 600, -1600 + 600, - 500
+ 600, - 500 + 600, - 500 + 600, -1600 + 600, -1600
+ 600, - 500 + 600, -1600 + 600, - 500 + 600, - 500
+ 600, - 500 + 550, -1650 + 550, - 550 + 550, - 550
+ 550, -1650 + 550, - 550 + 550, -1650 + 550, -1600
+ 600, -1600 + 600
int sin signo rawData = (4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600.1600, 600.500, 600.1600, 600.500, 600.500, 600.500, 600.1600, 600.1600 , 600.500, 600.1600, 600.500, 600.500, 600.500, 550.1650, 550.550, 550.550, 550.550, 550.1650, 550.1600, 600.1600, 600); //SAMSUNG 34346897
datos int sin firmar = 0x34346897;


Si la captura muestra el mensaje “Código IR demasiado largo. Edite IRremoteInt.h y aumente RAWLEN”. La biblioteca deberá corregirse un poco, aumentando el tamaño del búfer para los comandos. Para el control remoto que planea controlar, basta con conocer el código de comando de 32 bits; vale la pena prestar atención a que en algunos controles remotos el código de la tecla presionada difiere del mismo botón en el modo presionado y liberado. Estos botones requerirán dos valores. Resumimos los códigos recibidos en una tabla que le resulte cómoda. En la misma tabla guardamos los códigos para el control remoto del donante en forma cruda.
Conectamos un LED infrarrojo al Arduino y escribimos el programa mas simple que recibe una señal infrarroja con un código determinado y envía otro código a través de un LED. La resistencia 82 se eligió en función de lo que había por ahí. Para un dispositivo integrado, se puede aumentar de forma segura a 200 ohmios, y si el transmisor debe ser de largo alcance, deberá complementarlo con una simple cascada de transistores; de lo contrario, la corriente del Arduino definitivamente no será suficiente.


Si hay códigos de comando de ambos controles remotos, el código del transcodificador toma la siguiente forma

Bucle vacío() ( if (irrecv.decode(&results)) ( switch(results.value)( case(0x845E5420):( irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz); )break; ) ) irrecv.resume(); irrecv.enableIRIn();
Ejecutamos el boceto y lo subimos a Arduino. Curiosamente, después del inicio, se pasa un comando, después del cual el dispositivo ignora todos los siguientes. Para no complicarnos con la depuración, agregamos un intermitente en el pin 13 al bucle y vemos que después del primer intento de enviar un comando, la placa se congela. Bueno, significa que no todo es tan sencillo en el uso simultáneo de transmitir y recibir una señal IR en un proyecto. Habiendo profundizado un poco en los temporizadores utilizados, resulta que dado que tanto el envío como la recepción utilizan un temporizador común, después del inicio del envío, el código debe esperar hasta que se complete el envío. Puede agregar empíricamente un retraso de medio segundo (retraso (500)) y todo funcionará, pero sabiendo que nuestros datos sin procesar son lecturas de tiempo en milisegundos, simplemente puede agregar una función de envío retrasado. El módulo Irsend incluso tiene una función custom_delay_usec adecuada, que inicialmente usé incorrectamente, olvidándome de multiplicar el valor de retraso por el multiplicador USECPERTICK de la biblioteca (50 ms).

Void sendDelayed(unsigned int array)( irsend.sendRaw(array, sizeof(array) / sizeof(array), khz); int array_size = sizeof(array) / sizeof(array); for(int i=0;i Este código funciona muy bien, ahora en el interruptor solo necesita ingresar la cantidad requerida de mayúsculas para los botones y todo funcionará. Pero ese no fue el caso. Los códigos RawData se escriben como una matriz int y nuestra plataforma está en un microcontrolador. La memoria para variables ya será devorada por cinco comandos de 100 elementos cada uno. Pero los mandos a distancia también tienen 25 botones.
No hay problema si no utilizas la representación de datos brutos para esto, la biblioteca tiene la capacidad de enviar comandos usando protocolos conocidos, por ejemplo, para controles remotos compatibles con Sony es sendSony. La biblioteca ya ha implementado controles remotos de fabricantes conocidos, pero no pude entender mi control remoto de inmediato. Por tanto, pasamos a métodos más primitivos de ahorro de memoria que ayudarán a quienes tengan mandos a distancia completamente no estándar.
Lo primero que me viene a la mente es configurar rawData no como un int, sino como un byte. Todos los valores de esta matriz son el resultado de leer la señal IR con un temporizador con un periodo de 50 milisegundos, y como este dato es múltiplo de 50, luego dividiéndolo entre 50 no perderemos nada. El límite superior se limitará a 50*255=12750, que son 12 segundos, lo que será suficiente incluso para decodificar el código Morse tranquilamente, si surge la necesidad.
Se agregó a la biblioteca un método que acepta bytes como entrada, lo que redujo el consumo de memoria a la mitad.

IRsend::sendRaw (byte buf, int sin signo len, int sin signo hz)
Sólo el Arduino tiene sólo dos kilobytes de memoria para variables, lo que supone un máximo de 40 comandos de 50 bytes cada uno. Necesitamos más memoria. Y extraeremos esta memoria del segmento de comando. Basta con reservar una matriz de tamaño suficiente y rellenarla con una serie de tareas antes de enviarla. En total, se gastarán unos 100 bytes en un comando del segmento de código, pero también tenemos al menos diez kilobytes de espacio para el código. Así que ya tenemos suficiente para un mando a distancia mediano con cien botones.
Para no escribir asignaciones manualmente, se agregó el ejemplo IRrecvDumpRawByte a la biblioteca, que muestra datos sin procesar no solo en forma de bytes sino también en forma de bloque de asignación.

Ejemplo bajo spoiler

rawData=87;rawData=87;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData= 10;rawData=29;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10; rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=86;rawData=10;rawData= 9;rawData=11;rawData=9;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=29;rawData=10;rawData=28; rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=10;rawData= 10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=9;rawData=11;rawData=27;rawData=10;rawData=29;rawData=10; datos sin procesar=9;datos sin procesar=10;


Un ejemplo de un boceto ya escrito que le permite controlar un DVD HR-755 de Samsung usando el control remoto Daewoo R40A01 se encuentra en los ejemplos bajo el nombre DaewooR40A01toDVDHR755Transcoder. Nadie ha aceptado todavía la solicitud de extracción para agregar ejemplos a la rama general, por lo que puede descargar la biblioteca modificada desde la bifurcación.

Muchas fotos con la grabadora convertida.





















Debajo del corte hay fotografías de la integración del Arduino Nano en este grabador de DVD. El Arduino Mini, por supuesto, ocupa mucho menos espacio, pero sólo el Nano estaba a mano. Tomé la energía del panel de control. La señal del receptor incorporado se conectó al Arduino y en paralelo se soldó otro receptor de infrarrojos, ubicado en el lado opuesto al primero. Se soldó un LED IR utilizando el mismo montaje superior. En principio, esta repetición podría haberse evitado, pero la señal del receptor de infrarrojos está invertida, por lo que no será posible enviar una señal TTL directamente al dispositivo, y ya no intenté cercar el inversor con lógica o un transistor.

A pesar de que en mi caso los datos sin procesar funcionaron perfectamente, los experimentos con otros equipos domésticos mostraron que no todas las señales capturadas funcionaban correctamente al intentar controlar un dispositivo específico. El comando para encender el aire acondicionado no funcionaba, aunque si ya estaba encendido, el cambio de modos funcionaba correctamente. El altavoz LG también se negó a aceptar comandos sin formato, pero respondió perfectamente al envío de códigos a través de sendSamsung. Al mismo tiempo, cinco televisores recopilados de amigos respondieron perfectamente a los datos brutos. Probé la opción con diferentes frecuencias de señal y no sirvió de nada. Quizás el problema radique en la frecuencia de muestreo de la señal de 50 ms. A juzgar por la funcionalidad de los comandos de formato Samsung en equipos LG, el protocolo debe formalizarse como un módulo separado por analogía con ir_LG.cpp ir_JVC.cpp ir_Dish.cpp, seleccionando un encabezado y codificando parámetros para ceros y unos para un dispositivo específico. Probablemente un análisis de cómo escribir dicho protocolo sería un buen tema para un artículo.

Bueno, además, la segunda gran biblioteca de infrarrojos para Arduino es