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:
#incluirExplicaciones del código:
- La biblioteca IRremote.h contiene un conjunto de comandos y le permite simplificar el boceto;
- 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:
#incluirTransmisión de datos con paquetes de reintento:
#incluirTransferencia de datos indicando el protocolo:
#incluirEste 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// 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.
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.
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]);
- Sintaxis: protocolo(STRING); LÍNEA: consta de 25 caracteres de protocolo + carácter de fin de línea. esta linea
- 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.
// 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;
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:
#incluirEn 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:
#incluirEn 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// 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.
#incluirEn 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:
#incluirEN 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// 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.
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.
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);
- 0 - tipo de codificación:
- 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.
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;
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;
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;
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
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