Los dispositivos controlados por un control remoto por infrarrojos están estrechamente integrados en nuestras vidas. A veces se pierde el control remoto del televisor o de un antiguo sistema de audio, y ya es imposible comprar uno nuevo de la vejez. No siempre es posible pedir un nuevo control remoto, hacer un clon también, pero al tener un donante o información al respecto, puede hacer un convertidor. Tal transcodificador recibirá comandos de una consola y los traducirá al formato de otra.Para Arduino, existe una maravillosa biblioteca IRemote que hace que la construcción de una variedad de sistemas de control IR sea muy fácil. Pero al resolver incluso una tarea tan simple como un transcodificador, siempre hay problemas que son interesantes de resolver.Entonces, para empezar, necesitamos un receptor IR integrado como TSOP312 o el escudo correspondiente para Arduino. No olvide que hay muchos receptores IR y que su distribución varía de forma aleatoria. Por ejemplo, usé cierto elemento sin nombre que coincide con el TSOP382 pero en un caso reducido y sin una clave de división.
Necesitamos que el circuito ensamblado reciba códigos de comando de ambas consolas, por desgracia, eliminar comandos de un dispositivo por el que se ha perdido la consola es algo más complicado. Todavía puede encontrar el control remoto del donante, use el control remoto universal para seleccionar un código (¿por qué necesita un transcodificador, ya que el control remoto ha aparecido?) O intente usar datos de bases de datos de Internet usando códigos IR. Lo más fácil para mí fue usar una aplicación para Android emulando el control remoto que necesito.Para leer los datos, utilizamos el ejemplo IRrecvDumpV2 de la entrega de IRremote, si su control remoto pertenece a una biblioteca reconocible, entonces no necesita un resultado de exploración sin procesar, aunque, por ejemplo, el control remoto LG fue falsamente reconocido como Samsung y no funcionó cuando intenté enviar comandos a través de sendLG.Un ejemplo de los datos obtenidos bajo el spoiler:Encoding: SAMSUNG
Code: 34346897 (32 bits)
Timing[67]:
+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, -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
unsigned int rawData[67] = {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,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}; // SAMSUNG 34346897
unsigned int data = 0x34346897;
Si la captura muestra el mensaje "Código IR demasiado largo. Edite IRremoteInt.h y aumente RAWLEN ”, la biblioteca tendrá que repararse un poco, aumentando el tamaño del búfer para los comandos. Para la consola que planea controlar, es suficiente 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. Reducimos los códigos recibidos a una tabla conveniente para usted. 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 un programa simple que recibe una señal infrarroja con un código dado y envía otro código a través del LED. La resistencia 82 se selecciona para lo que está disponible. 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 de Arduino no será suficiente.
Si hay códigos de comando de ambos controles remotos, el código del transcodificador toma la siguiente formavoid loop() {
if (irrecv.decode(&results)) {
switch(results.value){
case(0x845E5420):{
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
}break;
}
}
irrecv.resume();
irrecv.enableIRIn();
}
Ejecute el boceto, complételo en Arduino. Por extraño que parezca, después de iniciar un comando pasa, después de lo cual se ignoran todos los dispositivos posteriores. Para no meterse con la depuración, agregamos una luz intermitente en el 13er pin al ciclo y vemos que después del primer intento de enviar un comando, la placa se congela. Bueno, significa que no todo es tan fácil en el uso simultáneo de transmitir y recibir una señal IR en un proyecto. Habiendo hurgado un poco en los temporizadores usados, resulta que tanto el envío como la recepción usan un temporizador común, después del inicio del envío, el código debe esperar hasta que termine el envío. Puede agregar empíricamente un retraso de medio segundo (retraso (500)) y todo funcionará, pero sabiendo que los datos sin procesar en nuestro país son muestras de tiempo en milisegundos, simplemente puede agregar una función de envío con un retraso. Incluso hay una función adecuada custom_delay_usec en el módulo Irsend,que inicialmente usé incorrectamente, olvidando multiplicar el retraso por el factor USECPERTICK de la biblioteca (50 ms).void sendDelayed(unsigned int array[]){
irsend.sendRaw(array, sizeof(array) / sizeof(array[0]), khz);
int array_size = sizeof(array) / sizeof(array[0]);
for(int i=0;i<array_size;i++){
irsend.custom_delay_usec(array[i]*USECPERTICK);
}
}
Dicho código funciona bien, a cambio es suficiente ingresar la cantidad necesaria de mayúsculas y minúsculas para los botones y todo funcionará. Pero no estaba allí. Los códigos RawData se escriben como una matriz int, y tenemos una plataforma en un microcontrolador. La memoria para las variables ya será consumida por cinco comandos con una longitud de 100 elementos. Pero en el control remoto hay 25 botones.No hay ningún problema si no utiliza la representación en bruto de los datos, para esto la biblioteca tiene la capacidad de enviar comandos a 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 manejar mi control remoto de inmediato. Por lo tanto, pasamos a formas más primitivas para ahorrar memoria que ayudarán a aquellos que tienen controles remotos completamente no estándar.Lo primero que viene a la mente es establecer rawData no en forma de int, sino cambiar a byte. Todos los valores en esta matriz son el resultado de leer la señal IR con un temporizador con un período de 50 milisegundos, y dado que estos datos son múltiplos de 50, dividirlos por 50 no perderá nada. El límite superior se limitará a 50 * 255 = 12750, y esto es 12 segundos, que será suficiente incluso para decodificar un código Morse pausado, si surge esa necesidad.Se agregó a la biblioteca un método que acepta bytes para la entrada, lo que redujo a la mitad el consumo de memoriaIRsend::sendRaw (byte buf[], unsigned int len, unsigned int hz)
Solo Arduino tiene solo dos kilobytes de memoria para variables, que es un máximo de 40 comandos de 50 bytes cada uno. Necesitamos más memoria. Y extraeremos esta memoria del segmento de comando. Es suficiente reservar una matriz de tamaño suficiente y llenarla antes de enviar una serie de tareas. En total, se gastarán aproximadamente 100 bytes en un solo comando del segmento de código, pero después de todo, tenemos al menos diez kilobytes de espacio de código. Entonces, para el control remoto promedio con cien botones, ya tenemos suficiente.Para no rellenar las asignaciones con las manos, se agregó un ejemplo IRrecvDumpRawByte a la biblioteca que muestra datos sin procesar no solo en forma de bytes sino también en forma de un bloque de asignaciónEjemplo bajo el spoilerrawData[0]=87;rawData[1]=87;rawData[2]=10;rawData[3]=9;rawData[4]=10;rawData[5]=9;rawData[6]=10;rawData[7]=10;rawData[8]=10;rawData[9]=9;rawData[10]=10;rawData[11]=9;rawData[12]=10;rawData[13]=29;rawData[14]=10;rawData[15]=9;rawData[16]=10;rawData[17]=9;rawData[18]=10;rawData[19]=10;rawData[20]=10;rawData[21]=9;rawData[22]=10;rawData[23]=9;rawData[24]=10;rawData[25]=10;rawData[26]=10;rawData[27]=9;rawData[28]=10;rawData[29]=9;rawData[30]=10;rawData[31]=10;rawData[32]=10;rawData[33]=9;rawData[34]=10;rawData[35]=86;rawData[36]=10;rawData[37]=9;rawData[38]=11;rawData[39]=9;rawData[40]=10;rawData[41]=9;rawData[42]=10;rawData[43]=9;rawData[44]=10;rawData[45]=28;rawData[46]=10;rawData[47]=29;rawData[48]=10;rawData[49]=28;rawData[50]=10;rawData[51]=9;rawData[52]=10;rawData[53]=28;rawData[54]=10;rawData[55]=10;rawData[56]=10;rawData[57]=9;rawData[58]=10;rawData[59]=28;rawData[60]=10;rawData[61]=10;rawData[62]=10;rawData[63]=9;rawData[64]=10;rawData[65]=9;rawData[66]=10;rawData[67]=28;rawData[68]=10;rawData[69]=9;rawData[70]=11;rawData[71]=27;rawData[72]=10;rawData[73]=29;rawData[74]=10;rawData[75]=9;rawData[76]=10;
Un ejemplo de un boceto ya escrito que le permite controlar Samsung DVD HR-755 usando el control remoto Daewoo R40A01 se encuentra en los ejemplos bajo el nombre DaewooR40A01toDVDHR755Transcoder. Nadie ha aceptado una solicitud de extracción para agregar ejemplos a la rama general, por lo que puede descargar la biblioteca modificada de la bifurcación .Muchas fotos con una grabadora rehecha Debajo del gato hay fotos de la integración del Arduino Nano dentro de esta grabadora de DVD, el Arduino Mini ciertamente ocupa mucho menos espacio, pero solo Nano estaba a la mano. Tomé el poder del panel de control. La señal del receptor incorporado se conectó al Arduino, y otro receptor IR ubicado en el lado opuesto del primero fue soldado en paralelo. Con la misma instalación montada, se le solda un LED IR. En principio, esta repetición podría haberse evitado, pero la señal del receptor IR está invertida, por lo que no puedo enviar la señal TTL directamente al dispositivo, pero ya no hice el inversor en la lógica o el transistor.A pesar de que en mi caso los datos en bruto funcionaron bien, los experimentos con el resto del equipo doméstico demostraron que no todas las señales capturadas funcionaban correctamente al intentar controlar un dispositivo específico. El comando para encender el aire acondicionado no funcionó, aunque si ya estaba encendido, el cambio de modos funcionó correctamente. El orador de LG también se negó a aceptar comandos en bruto, pero respondió bien al envío de códigos a través de sendSamsung. Al mismo tiempo, cinco televisores recopilados de conocidos reaccionaron muy bien a los datos sin procesar. Probé la opción con diferentes frecuencias de señal, no sirvió de nada. Quizás el problema radica en la frecuencia de muestreo de la señal a 50 ms. A juzgar por la operatividad de los equipos con formato Samsung en la tecnología LG, el protocolo debe formalizarse como un módulo separado por analogía con ir_LG.cpp ir_JVC.cpp ir_Dish.cpp,seleccionando para un dispositivo específico el encabezado y los parámetros de codificación de ceros y unos. Probablemente analizar la redacción de dicho protocolo servirá como un buen tema para el artículo.Bueno, además, la segunda biblioteca IR grande para Arduino es IRLib . Tiene una funcionalidad similar, incluso tiene un módulo listo para analizar los protocolos IR para el escritorio. Se realizó una prueba comparativa rápida de lectura de datos sin procesar que no reveló una diferencia en las muestras en comparación con IRemote. De las ventajas, IRLib ya tiene un ejemplo para determinar a qué frecuencia funciona el transmisor IR. Ejemplo Samsung36 en realidad implementa un análisis de protocolo de datos de Internet. Además, la documentación describe perfectamente cómo conectar receptores IR con conexión en cascada y mucho más. Aunque en mi opinión, IRemote es mucho más fácil de entender y usar.