{"id":5284,"date":"2014-04-15T10:04:19","date_gmt":"2014-04-15T08:04:19","guid":{"rendered":"https:\/\/www.diarioelectronicohoy.com\/blog\/?p=5284"},"modified":"2022-09-22T16:25:35","modified_gmt":"2022-09-22T14:25:35","slug":"control-remoto-ir","status":"publish","type":"post","link":"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir","title":{"rendered":"CONTROL REMOTO IR."},"content":{"rendered":"<h3>INTRODUCCI\u00d3N.<\/h3>\n<p>No es nuevo el tema de los controles remotos, incluso los que veremos aqu\u00ed, los de rayos infrarrojos (IR), se utilizan en muchas aplicaciones diferentes, en muchos campos, como es la comunicaci\u00f3n, que utilizan tecnolog\u00eda infrarroja para control remoto en dispositivos dom\u00e9sticos, como los mandos de los TV. El funcionamiento del control remoto, se basa en la emisi\u00f3n de secuencias de pulsos de luz IR, con un c\u00f3digo que identifica la tecla pulsada. Este es el tipo de control remoto que vamos a desarrollar en este art\u00edculo.<\/p>\n<p>En el caso de utilizar un Arduino, el trabajo m\u00e1s duro se le encomienda a la librer\u00eda que podemos descargar de aqu\u00ed. Esta librer\u00eda nos permite enviar y recibir c\u00f3digos con los que podremos manejar cualquier circuito con un control remoto de TV. La biblioteca referida, es compatible con Philips RC5, RC6 Philips, NEC, Sony SIRC y protocolos en bruto, se puede utilizar incluso para copiar los c\u00f3digos de su mando a distancia y volver a transmitirlos, como un control remoto universal. Si no lo ha hecho ya, empiece por descargar la mencionada librer\u00eda para utilizarla y, siga las instrucciones de instalaci\u00f3n que vienen en el archivo \u201creadme\u201d.<\/p>\n<h3>CONSIDERACIONES SOBRE C\u00d3DIGOS IR.<\/h3>\n<p>Un mando a distancia IR funciona conmutando el LED encendido y apagado en una secuencia particular. Sin embargo, para evitar interferencias a partir de fuentes de IR tales como la luz del sol o las luces, el LED no est\u00e1 encendido de forma permanente, pero se enciende y se apaga a una frecuencia de modulaci\u00f3n (t\u00edpicamente 36 a 40 KHz). En el momento en que se est\u00e1 enviando una se\u00f1al modulada se llama marca (1) y, cuando el LED est\u00e1 apagado se llama espacio (0).<\/p>\n<p>Naturalmente, en el mando a distancia, cada tecla tiene un c\u00f3digo asociado a ella (por lo general de 12 a 32 bits), y transmite este c\u00f3digo cuando se pulsa esa tecla. Si la tecla se mantiene pulsada, el mando a distancia normalmente transmite repetidamente el c\u00f3digo clave. En los controles remotos de Philips RC5 o RC6, el c\u00f3digo activa un bit cada vez que se pulsa una tecla, el receptor utiliza este bit de conmutaci\u00f3n para determinar cuando se pulsa una tecla por segunda vez.<\/p>\n<p>El mecanismo de funcionamiento de una transmisi\u00f3n por infrarrojos es bastante \u201csimple\u201d; un haz de luz, de alta frecuencia de 38 kHz (t\u00edpico de los mandos a distancia para la TV) se proyecta frente a un receptor. Este haz de luz no es m\u00e1s que una secuencia de bits (0 y 1) que son codificados por el receptor, a trav\u00e9s de la polarizaci\u00f3n del foto-transistor. Veamos este caso simple; el control remoto, es el cifrado de los distintos impulsos con diversos bits y secuencias, por ejemplo, el bot\u00f3n de encendido\/apagado es:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/ircifrado\" rel=\"attachment wp-att-5289\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-5289\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/ircifrado-300x85.gif\" alt=\"\" width=\"300\" height=\"85\" \/><\/a>Fig. 1<\/p>\n<p>En el extremo receptor, el detector IR demodula esta se\u00f1al, y emite una se\u00f1al de nivel l\u00f3gico que indica si se est\u00e1 recibiendo una se\u00f1al o no. El detector de infrarrojos, funciona mejor cuando su frecuencia coincide con la frecuencia del emisor, pero en la pr\u00e1ctica no importa mucho.<\/p>\n<p>En mi caso, algunos de los botones del mando a distancia del TV, no los uso nunca, entonces, \u00bfpor qu\u00e9 no usarlos para manejar otros dispositivos electr\u00f3nicos del hogar?. Este proyecto, trata de demostrar como utilizar el habitual Arduino, para decodificar la se\u00f1al de dicho mando utiliz\u00e1ndolo como un interruptor, para el encendido y apagado de un electrodom\u00e9stico.<\/p>\n<h3>LOS MATERIALES.<\/h3>\n<p>Estos son los materiales que necesitaremos para este proyecto:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/materiales\" rel=\"attachment wp-att-5287\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5287\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/materiales-300x229.jpg\" alt=\"\" width=\"335\" height=\"256\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/materiales-300x229.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/materiales.jpg 647w\" sizes=\"auto, (max-width: 335px) 100vw, 335px\" \/><\/a>Fig. 2<\/p>\n<h3>EMISOR Y RECEPTOR IR.<\/h3>\n<p>A d\u00eda de hoy, existe una p\u00e1gina en donde es posible encontrar las se\u00f1ales de\u00a0<a href=\"http:\/\/www.sbprojects.com\/knowledge\/ir\/sirc.php\" target=\"_blank\" rel=\"noopener noreferrer\">Controles Remotos conocidos<\/a>. Veremos el proceso de obtenci\u00f3n de las se\u00f1ales de un Control remoto o Mando, luego analizaremos el protocolo, para capturar las se\u00f1ales provenientes del control o mando en el PC, se requiere de un Receptor de Infrarrojo. Estos receptores constan de un fotodiodo y normalmente se conectan en la entrada de micr\u00f3fono de la tarjeta de Sonido del PC, y son capaces de detectar los peque\u00f1os niveles de voltaje producidos por el fotodiodo. Abajo una foto y su representaci\u00f3n.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/ir-rec-extend\" rel=\"attachment wp-att-5291\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-5291 alignnone\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/IR-Rec-Extend-300x179.jpg\" alt=\"\" width=\"201\" height=\"120\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/IR-Rec-Extend-300x179.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/IR-Rec-Extend.jpg 336w\" sizes=\"auto, (max-width: 201px) 100vw, 201px\" \/><\/a><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/irsensor\" rel=\"attachment wp-att-5290\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-5290 alignnone\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/irsensor.jpg\" alt=\"\" width=\"164\" height=\"160\" \/><\/a><br \/>\nFig. 3<\/p>\n<p>La librer\u00eda que se ha descargado, admite cualquier se\u00f1al digital para leer la entrada de un m\u00f3dulo receptor de IR. Estos productos, son sistemas receptores de infrarrojos miniaturizados. Si usted no tiene un receptor de este tipo, no hay problema, usted puede fabricar su propio receptor, con un fotodiodo barato y corriente y un cable (apantallado) adaptador de micr\u00f3fono.<\/p>\n<p>El circuito en principio es muy simple. Para la salida, conectar el diodo LED IR y la resistencia adecuada al pin 3 (PWM), la distancia es de unos 4,5m para un alcance mayor puede amplificar la salida con un transistor. Como se ha comentado, un mando a distancia conmuta el LED entre encendido y apagado con un patr\u00f3n exclusivo, para evitar interferencias procedentes de fuentes como la luz o el sol, el LED se enciende a una frecuencia de modulaci\u00f3n (entre 36k y 40 kHz). Cuando est\u00e1 enviando una se\u00f1al modulada se llama marca y cuando est\u00e1 apagado se llama espacio.<\/p>\n<p>En un mando a distancia, cada tecla tiene un c\u00f3digo \u00fanico asociado a \u00e9l (generalmente 12 a 32 bits): Si se mantiene pulsada la tecla, se transmite repetidamente el c\u00f3digo.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/emisor-receptor-ir\" rel=\"attachment wp-att-5293\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5293\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/emisor-receptor-ir.gif\" alt=\"\" width=\"258\" height=\"149\" \/><\/a>Fig. 4<\/p>\n<p>El receptor se diferencia de un transistor com\u00fan, por que, su base ha sido sustituida por un fotodiodo que, de acuerdo a la luz incidente sobre \u00e9l, regula el flujo de corriente colector\u2013emisor, con una resistencia de un 1k\u03a9 obtendremos una salida, este tipo de se\u00f1ales son las que se deben procesar en el PC.<\/p>\n<p>Si ya disponemos de nuestro receptor de Infrarrojos, podemos empezar a visualizar las se\u00f1ales del \u201cMando\u201d, capturadas con el receptor de infrarrojos, mediante un software adecuado. Adem\u00e1s, usando la c\u00e1mara del m\u00f3vil (celular), podemos saber si nuestro emisor est\u00e1 funcionando. La imagen que sigue muestra un ejemplo.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/emisor-ir01\" rel=\"attachment wp-att-5294\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5294\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/emisor-ir01.gif\" alt=\"\" width=\"128\" height=\"96\" \/><\/a>Fig. 5<\/p>\n<p>Cuando no disponemos de un osciloscopio (no siempre, pero en este caso), podemos utilizar el PC, para ver e identificar las diferentes formas de onda utilizadas para comandar dispositivos por medio de controles remoto de infrarrojos. Puede utilizar cualquier software de osciloscopio o editor de ondas, como por ejemplo, el programa:\u00a0<a href=\"http:\/\/www.goldwave.com\/\"><strong>GoldWave<\/strong><\/a>\u00a0(editor de audio digital con osciloscopios en tiempo real personalizables), o utilizando un programa que lea los impulsos que reciba del emisor. Veremos un ejemplo de este software, para comprenderlo mejor.<\/p>\n<h3>EL SOFTWARE GOLDWAVE.<\/h3>\n<p>El protocolo de SIRC utiliza una codificaci\u00f3n de anchura de impulso de los bits. El pulso que representa un \u201c1\u201d l\u00f3gico es una r\u00e1faga larga de 1.2ms de la portadora de 40kHz, mientras que el ancho de la r\u00e1faga por un \u201c0\u201d l\u00f3gico es 0.6ms de largo.<\/p>\n<p>No obstante, el c\u00f3digo RC-5 de Philips (son econ\u00f3micos, debido a la amplia disponibilidad de estos mandos a distancia), es posiblemente, el protocolo m\u00e1s utilizado por los aficionados. El protocolo est\u00e1 bien definido para los diferentes tipos de dispositivos que garantizan la compatibilidad con su sistema de mantenimiento en general. Hace algunos a\u00f1os, Philips comenz\u00f3 a utilizar el nuevo protocolo llamado RC-6, que tiene m\u00e1s caracter\u00edsticas.<\/p>\n<p>La imagen de abajo, muestra un tren de pulsos t\u00edpico de un mensaje de RC-5. En este ejemplo se transmite el comando $35 para la direcci\u00f3n $05, seg\u00fan indica el fabricante.<\/p>\n<p>La librer\u00eda que se ha descargado, admite cualquier se\u00f1al digital para leer la entrada de un m\u00f3dulo receptor de IR a 38KHz. Estos productos, son sistemas receptores de infrarrojos miniaturizados para control remoto. Hay una extensa variedad de modelos en el mercado para elegir, sin embargo todos tienen en com\u00fan, un diodo y un preamplificador, est\u00e1n montados en un bastidor de conexi\u00f3n, el paquete de epoxi act\u00faa como un filtro IR. Estos receptores proporcionan se\u00f1al de salida de nivel l\u00f3gico invertido, filtrada y demodulada que puede ser decodificada directamente por un microprocesador.<\/p>\n<p>La librer\u00eda para control remoto por infrarrojos consta de dos partes: IRsend transmite paquetes IR, mientras IRrecv recibe y decodifica el mensaje de IR. IRsend utiliza un LED a infrarrojos conectado al pin 3 de salida.<\/p>\n<h3>ENVIAR UN C\u00d3DIGO.<\/h3>\n<p>Para enviar un mensaje, llama al m\u00e9todo de env\u00edo del protocolo deseado con los datos a enviar y el n\u00famero de bits a enviar. El siguiente es un boceto de ejemplo que proporciona la librer\u00eda para saber como enviar los c\u00f3digos:<\/p>\n<pre lang=\"php\" class=\"\">\/\/\r\n#include \"IRremote.h\" \/\/ #include IRremote.h \r\n IRsend irsend;\r\n\r\nvoid setup() {\r\n  Serial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\n  if (Serial.read() != -1) {\r\n    for (int i = 0; i &lt; 3; i++) {\r\n      irsend.sendSony(0xa90, 12); \/\/ Sony TV power code\r\n      delay(40);\r\n    }\r\n  }\r\n}<\/pre>\n<p>Este programa env\u00eda al receptor Sony, un c\u00f3digo de encendido\/apagado cada vez que se env\u00eda un car\u00e1cter al puerto serie, permitiendo que el Arduino active el encendido o apagado del televisor. (Tengamos en cuenta que, los c\u00f3digos de Sony deben enviarse 3 veces de acuerdo con el protocolo.)<\/p>\n<h3>RECIBIR UN C\u00d3DIGO.<\/h3>\n<p>El detector de infrarrojos conectado a cualquier pin de entrada digital, mediante IRrecv decodificar\u00e1 la se\u00f1al recibida. El siguiente es el boceto que proporciona de ejemplo la librer\u00eda, para leer los c\u00f3digos.<\/p>\n<pre lang=\"php\" class=\"\">\/\/\r\n#include \"IRremote.h\" \/\/ #include  IRremote.h \r\nint RECV_PIN = 11;\r\nIRrecv irrecv(RECV_PIN);\r\ndecode_results results;\r\n\r\nvoid setup()\r\n{\r\n  Serial.begin(9600);\r\n  irrecv.enableIRIn(); \/\/ Start the receiver\r\n}\r\n\r\nvoid loop() {\r\n  if (irrecv.decode(&amp;results)) {\r\n    Serial.println(results.value, HEX);\r\n    irrecv.resume(); \/\/ Receive the next value\r\n  }\r\n}\r\n<\/pre>\n<p>La clase IRrecv realiza la decodificaci\u00f3n y se inicializa con enableIRIn(). El bucle (loop), llama a irrecv.decode(&amp;results) para ver si se ha recibido un c\u00f3digo, si es as\u00ed, devuelve un valor distinto de cero y coloca los resultados en el registro decode_results. Recomiendo consultar el ejemplo IRrecvDump de la librer\u00eda para comprender esta estructura. De esta forma se decodifica el c\u00f3digo, el m\u00e9todo resume() debe ser llamado para reanudar la recepci\u00f3n de c\u00f3digos. Una cuesti\u00f3n a tener en cuenta es que, el m\u00e9todo decode(), no bloquea el desarrollo del programa que, puede realizar otras tareas mientras espera un nuevo c\u00f3digo, debido a que los c\u00f3digos son recibidos por una rutina de interrupci\u00f3n.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/vs1838\" rel=\"attachment wp-att-5296\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5296\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/vs1838.jpg\" alt=\"\" width=\"120\" height=\"145\" \/><\/a>Fig. 6<\/p>\n<p>Para el siguiente ejemplo, recurriremos al montaje de abajo, en el que vemos el receptor de IR, cuando no se manda ning\u00fan pulso al receptor, la salida de \u00e9ste, tendr\u00eda que dar 5V, lo que encender\u00e1 el LED. Y cuando pulsamos un bot\u00f3n de un mando a distancia, el led deber\u00eda parpadear por unos instantes, ya que cuando recibe un pulso, la salida se pone a 0V, lo que apagar\u00e1 el LED. Si ocurre esto, nuestro receptor funciona correctamente. Con un transistor, se puede invertir la se\u00f1al, si es necesario y aplicar la se\u00f1al para manejar un rel\u00e9.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/control-remoto-ir\/emisor-receptor\" rel=\"attachment wp-att-5298\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-5298\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/emisor-receptor-300x174.gif\" alt=\"\" width=\"300\" height=\"174\" \/><\/a>Fig. 7<\/p>\n<p>Realizar este montaje y aplicar el programa de captura que sigue, con \u00e9l podremos registrar (ver) los impulsos que se producen cuando pulsamos un bot\u00f3n de un mando a distancia.<\/p>\n<h3>PRESENCIA DEL C\u00d3DIGO IR DE UN EMISOR.<\/h3>\n<p>Este es el c\u00f3digo del programa para la detecci\u00f3n de c\u00f3digo de infrarrojos. Con \u00e9l podemos ver las se\u00f1ales que emite un mando a distancia.<\/p>\n<pre class=\"\" lang=\"arduino\">\/*\r\n  irdeco.pde\r\nBoceto decodificador IR !\r\nEste boceto, utiliza el Arduno y un PNA4602, para decodificar lo recibido. \r\nEsto puede ser utilizado para hacer un receptor de infrarrojos (En busca \r\nde un c\u00f3digo especial) o transmisor (por pulsos de un LED IR a ~ 38KHz \r\npara las se\u00f1ales detectadas. C\u00f3digo de dominio p\u00fablico.\r\n*\/\r\n\r\n\/\/Tenemos que utilizar los m\u00e9todos de lectura del PIN en \"bruto\" Debido\r\n\/\/ a que el tiempo es muy importante aqu\u00ed y el procedimiento\r\n\/\/ digitalRead() es m\u00e1s lento!\r\n\/\/ Digital pin #3 es el pin digital D2, ver\r\n\/\/http:\/\/arduino.cc\/en\/Hacking\/PinMapping168 para asignar el pin 'en bruto'\r\n\r\n#define IRpin_PIN PIND\r\n#define IRpin 3\r\n\r\n\/\/ el pulso m\u00e1ximo a leer - 65 milisegundos es un tiempo largo\r\n#define MAXPULSE 65000\r\n\r\n\/\/ cu\u00e1l debe ser nuestra resoluci\u00f3n de tiempo, m\u00e1s grande es mejor\r\n\/\/ m\u00e1s 'preciso' - pero demasiado grande y no encontraremos\r\n\/\/ la sincronizaci\u00f3n exacta\r\n#define RESOLUTION 20\r\n\r\n\/\/ vamos a almacenar hasta 100 pares de impulsos (esto es-mucho-)\r\nuint16_t pulses[100][2]; \/\/ pair is high and low pulse\r\nuint8_t currentpulse = 0; \/\/ index for pulses we're storing\r\n\r\nvoid setup(void) {\r\nSerial.begin(9600);\r\nSerial.println(\"Ready to decode IR!\");\r\n}\r\n\r\nvoid loop(void) {\r\nuint16_t highpulse, lowpulse; \/\/ temporary storage timing\r\nhighpulse = lowpulse = 0; \/\/ start out with no pulse length\r\n\r\n\/\/ while (digitalRead(IRpin)) { \/\/ this is too slow!\r\nwhile (IRpin_PIN &amp; (1 &lt;&lt; IRpin)) { \/\/ pin is still HIGH \r\n\r\n\/\/ count off another few microseconds \r\n highpulse++; \r\n delayMicroseconds(RESOLUTION); \r\n\r\n\/\/ Si el pulso es demasiado largo, tenemos 'Tiempo de espera \r\n\/\/ agotado '- o nada se ha recibido o ha terminado el c\u00f3digo, \r\n\/\/ por lo que imprimimos lo que hemos agarrado hasta el momento \r\n\/\/ y, a continuaci\u00f3n reiniciamos\r\n\r\nif ((highpulse &gt;= MAXPULSE) &amp;&amp; (currentpulse != 0)) {\r\n printpulses();\r\n currentpulse=0;\r\n return;\r\n }\r\n}\r\n\/\/ we didn't time out so lets stash the reading\r\npulses[currentpulse][0] = highpulse;\r\n\r\n\/\/ same as above\r\nwhile (! (IRpin_PIN &amp; _BV(IRpin))) {\r\n\/\/ pin is still LOW\r\nlowpulse++;\r\ndelayMicroseconds(RESOLUTION);\r\nif ((lowpulse &gt;= MAXPULSE) &amp;&amp; (currentpulse != 0)) {\r\n printpulses();\r\n currentpulse=0;\r\n return;\r\n }\r\n}\r\npulses[currentpulse][1] = lowpulse;\r\n\r\n\/\/ we read one high-low pulse successfully, continue!\r\ncurrentpulse++;\r\n}\r\n\r\nvoid printpulses(void) {\r\n Serial.println(\"\\n\\r\\n\\rReceived: \\n\\rOFF \\tON\");\r\n for (uint8_t i = 0; i &lt; currentpulse; i++) {\r\n  Serial.print(pulses[i][0] * RESOLUTION, DEC);\r\n  Serial.print(\" usec, \");\r\n  Serial.print(pulses[i][1] * RESOLUTION, DEC);\r\n  Serial.println(\" usec\");\r\n}\r\n\r\n\/\/ print it in a 'array' format\r\nSerial.println(\"int IRsignal[] = {\");\r\nSerial.println(\"\/\/ ON, OFF \");\r\nfor (uint8_t i = 0; i &lt; currentpulse-1; i++) {\r\n \/\/Serial.print(\"\\t\"); \/\/ tab\r\n Serial.print(\"pulseIR(\");\r\n Serial.print(pulses[i][1] * RESOLUTION , DEC);\r\n Serial.print(\");\");\r\n Serial.println(\"\");\r\n \/\/Serial.print(\"\\t\");\r\n Serial.print(\"delayMicroseconds(\");\r\n Serial.print(pulses[i+1][0] * RESOLUTION , DEC);\r\n Serial.println(\");\");\r\n }\r\n\/\/Serial.print(\"\\t\"); \/\/ tab\r\n Serial.print(\"pulseIR(\");\r\n Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);\r\n Serial.print(\");\");\r\n}<\/pre>\n<h3>\u00bfQUE HACE ESTE PROGRAMA?<\/h3>\n<p>Cuando se presiona un bot\u00f3n de un mando a distancia, el led deber\u00eda parpadear por unos instantes (como se aprecia en la imagen de arriba), generando una serie de impulsos. Este c\u00f3digo permite decodificar y registrar dicha sucesi\u00f3n de pulsos y adem\u00e1s, nos muestra el c\u00f3digo para que lo podamos implementar. Vamos a lo practico. Carguemos el boceto en Arduino, tenemos que abrir el monitor serie y con esto ya estamos en condiciones de decodificar los comandos del mando a distancia que tengamos a mano, cuando pulsemos uno de sus botones.<\/p>\n<p>B\u00e1sicamente emite un pulso largo para indicar el comienzo de un dato. Luego emite pulsos de 500\u00b5S o pulsos de 1,6mS seg\u00fan corresponda un uno o cero l\u00f3gico. As\u00ed emite 32 bits despu\u00e9s del pulso inicial. No es importante en este caso saber a qu\u00e9 pulso corresponde el uno o el cero. Vamos a considerar que los pulsos a 600us sean unos y los menores a 1,8mS sean ceros, en base a este criterio se desarroll\u00f3 este programa que como veremos, nos permite decodificar las teclas presionadas de un mando.<\/p>\n<p>Para este tipo de proyectos ser\u00eda muy pr\u00e1ctico tener un osciloscopio, se trata de un instrumento que no es f\u00e1cil de adquirir. (Soy consciente que, todo el mundo no tiene ese privilegio, por eso veremos, el modo de realizar ciertas pruebas). Este es el momento de verificar la recepci\u00f3n de los impulsos remitidos por el codificador o mando.<\/p>\n<p>A modo de ejemplo, debajo vemos lo que mostrar\u00e1 el monitor Serial, una vez ejecutado el programa, los datos son similares a estos:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/monitor_irm.jpg\" target=\"_blank\" rel=\"attachment noopener wp-att-5300 noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5300\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/monitor_irm-300x145.jpg\" alt=\"\" width=\"329\" height=\"159\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/monitor_irm-300x145.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/monitor_irm.jpg 585w\" sizes=\"auto, (max-width: 329px) 100vw, 329px\" \/><\/a>Fig. 8<\/p>\n<p>Estos datos los podemos utilizar para realizar la copia de un mando a distancia que tengamos o tambi\u00e9n podemos copiar solamente alguna de las funciones del mando a distancia del TV. Por ejemplo, copiar el bot\u00f3n de encendido, el de volumen y el de canal, as\u00ed, el programa al que aplicamos estos c\u00f3digos, ser\u00e1 capaz de realizar estas funciones de encendido\/apagado, subir una persiana o acelerar un motor, etc.<\/p>\n<h3>LEER EL C\u00d3DIGO DE UN MANDO IR.<\/h3>\n<p>Este c\u00f3digo sirve para la captura del c\u00f3digo de un mando.<\/p>\n<pre class=\"\" lang=\"arduino\">\/* Boceto decodificador IR crudo!\r\nEste programa utiliza Arduino y un receptor IR decodificador PNA4602. \r\nEsto se puede utilizar para hacer un receptor IR (mediante la b\u00fasqueda \r\nde un c\u00f3digo particular) o transmisor (por pulsaci\u00f3n de un LED IR a ~ 38KHz \r\npor los retardos detectados. \r\nC\u00f3digo de dominio p\u00fablico *\/\r\n\r\n\/\/ Tenemos que utilizar los m\u00e9todos de lectura pin \"en crudo\", porque \r\n\/\/ el tiempo es muy importante aqu\u00ed y el procedimiento digitalRead() \r\n\/\/ es m\u00e1s lento! \r\n\/\/ uint8_t IRpin = 2; \r\n\/\/ Pin digital #2 es el mismo que el Pin D2 ver \r\n\/\/ Http:\/\/arduino.cc\/en\/Hacking\/PinMapping168 para el mapeado de pin 'en crudo'\r\n\r\n#define IRpin_PIN PIND\r\n#define IRpin 2\r\n\r\n\/\/ el pulso m\u00e1ximo a escuchar - 65 milisegundos es mucho tiempo\r\n#define MAXPULSE 65000\r\n\r\n\/\/ cu\u00e1l debe ser nuestra resoluci\u00f3n de tiempo; m\u00e1s grande es mejor, \r\n\/\/ ya que es m\u00e1s 'precisa' - pero si es demasiado grande, no vamos \r\n\/\/ a encontrar la sincronizaci\u00f3n exacta.\r\n\r\n#define RESOLUTION 20\r\n\r\n\/\/ almacenamos hasta 100 pares de impulsos (este es -mucho-)\r\nuint16_t pulses[100][2]; \/\/ par es pulso de alto y bajo\r\nuint8_t currentpulse = 0; \/\/ \u00edndice de impulsos almacenados\r\n\r\nvoid setup(void) {\r\n  Serial.begin(9600);\r\n  Serial.println(\"Listo para decodificar IR!\");\r\n}\r\n\r\nvoid loop(void) {\r\n uint16_t highpulse, lowpulse; \/\/ tiempo de almacenamiento temporal\r\n highpulse = lowpulse = 0; \/\/ empezar con longitud cero del pulso\r\n \/\/ while (digitalRead(IRpin)) { \/\/ esto es demasiado lento!\r\n while (IRpin_PIN &amp; (1 &lt;&lt; IRpin)) { \/\/ pin es todav\u00eda HIGH \/\/ Contar\u00e1s unos pocos microsegundos \r\n  highpulse++; \r\n  delayMicroseconds(RESOLUTION); \/\/ Si el pulso es demasiado largo, agotaremos \r\n  \/\/'Tiempo de espera' - o no se ha recibido nada \r\n  \/\/ o se termino el c\u00f3digo, por lo que se imprime lo que \r\n  \/\/ hemos cogido hasta ahora y, a continuaci\u00f3n, restablezca (reset) \r\n  if ((highpulse &gt;= MAXPULSE) &amp;&amp; (currentpulse != 0)) {\r\n  printpulses();\r\n  currentpulse=0;\r\n  return;\r\n  }\r\n}\r\n\/\/ no tienen tiempo de espera as\u00ed que vamos a esconder la lectura\r\npulses[currentpulse][0] = highpulse;\r\n\r\n\/\/ Igual que el anterior\r\nwhile (! (IRpin_PIN &amp; _BV(IRpin))) {\r\n \/\/ pin is still LOW\r\n lowpulse++;\r\n delayMicroseconds(RESOLUTION);\r\n if ((lowpulse &gt;= MAXPULSE) &amp;&amp; (currentpulse != 0)) {\r\n  printpulses();\r\n  currentpulse=0;\r\n  return;\r\n }\r\n}\r\n pulses[currentpulse][1] = lowpulse;\r\n\r\n \/\/ le\u00edmos un pulso alto-bajo con \u00e9xito, contin\u00fae!\r\n currentpulse++;\r\n}\r\n\r\nvoid printpulses(void) {\r\nSerial.println(\"\\n\\r\\n\\rReceived: \\n\\rOFF \\tON\");\r\nfor (uint8_t i = 0; i &lt; currentpulse; i++) {\r\n  Serial.print(pulses[i][0] * RESOLUTION, DEC);\r\n  Serial.print(\" usec, \");\r\n  Serial.print(pulses[i][1] * RESOLUTION, DEC);\r\n  Serial.println(\" usec\");\r\n}\r\n\r\n  \/\/ print it in a 'array' format\r\n  Serial.println(\"int IRsignal[] = {\");\r\n  Serial.println(\"\/\/ ON, OFF \");\r\nfor (uint8_t i = 0; i &lt; currentpulse-1; i++) {\r\n  \/\/Serial.print(\"\\t\"); \/\/ tab\r\n  Serial.print(\"pulseIR(\");\r\n  Serial.print(pulses[i][1] * RESOLUTION , DEC);\r\n  Serial.print(\");\");\r\n  Serial.println(\"\");\r\n  \/\/Serial.print(\"\\t\");\r\n  Serial.print(\"delayMicroseconds(\");\r\n  Serial.print(pulses[i+1][0] * RESOLUTION , DEC);\r\n  Serial.println(\");\");\r\n\r\n}\r\n  \/\/Serial.print(\"\\t\"); \/\/ tab\r\n  Serial.print(\"pulseIR(\");\r\n  Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);\r\n  Serial.print(\");\");\r\n}<\/pre>\n<p>Copie el c\u00f3digo, gu\u00e1rdelo (por ejemplo) como decoder_ir.pde y c\u00e1rguelo en su Arduino, el circuito para realizar este boceto, es el mismo descrito m\u00e1s arriba, pruebe lo comentado en las l\u00edneas anteriores, obtendr\u00e1 su propia experiencia.<\/p>\n<p>Ahora usted puede tener todos los mandos a distancia de su casa en un dispositivo que cabe en su mano con Arduino, no se pelear\u00e1 por qui\u00e9n tiene el control remoto del TV.<\/p>\n<p>Antes de crear un control remoto funcional, tendremos que reunir los c\u00f3digos de todos los mandos a distancia que queremos usar. Vamos a utilizar un sensor infrarrojo para hacerlo. Para configurar el circuito, podemos seguir el boceto en las im\u00e1genes, la conexi\u00f3n de la se\u00f1al pines del sensor al pin 2 y los otros pines a 5V y masa.<\/p>\n<p>Como se ha comentado, la biblioteca proporciona soporte para el env\u00edo y la recepci\u00f3n de las tramas en bruto. Este se destina principalmente para la depuraci\u00f3n, pero tambi\u00e9n se puede utilizar para los protocolos que la biblioteca no implementa, o para proporcionar la funcionalidad de control remoto universal. No s\u00f3lo se usa para control remoto, tambi\u00e9n tiene otras aplicaciones, como detector de proximidad.<\/p>\n<h3>LOS DETALLES DE LA BIBLIOTECA RECEPTORA.<\/h3>\n<p>La biblioteca\u00a0<b><i>IRrecv<\/i><\/b>\u00a0consta de dos partes. Una rutina de interrupci\u00f3n que se llama cada 50 microsegundos, mide la longitud de las marcas y espacios, y guarda las duraciones en un b\u00fafer. El usuario llama a una rutina de decodificaci\u00f3n para decodificar las mediciones almacenadas en el b\u00fafer con el valor de c\u00f3digo que se envi\u00f3 (t\u00edpicamente 11 a 32 bits).<\/p>\n<p>La biblioteca de decodificaci\u00f3n intenta decodificar protocolos diferentes en la serie, parando si uno tiene \u00e9xito. Devuelve una estructura que contiene los datos brutos, los datos decodificados, el n\u00famero de bits en los datos decodificados, y el protocolo utilizado para descodificar los datos.<\/p>\n<p>Para la decodificaci\u00f3n, la macro, determina si la marca o el espacio de tiempo medido es aproximadamente igual al tiempo previsto.<\/p>\n<p>La decodificaci\u00f3n RC5\/6 es un poco diferente de los dem\u00e1s porque los bits RC5\/6 codifican con marca + espacio + espacio o marca, m\u00e1s que por la duraci\u00f3n de marcas y espacios. El m\u00e9todo auxilia getRClevel divide las duraciones y consigue el nivel de marca\/espacio de un \u00fanico intervalo de tiempo.<\/p>\n<p>Para las transmisiones repetidas (bot\u00f3n pulsado), el c\u00f3digo de decodificaci\u00f3n devolver\u00e1 el mismo valor decodificado una y otra vez. La excepci\u00f3n es NEC, que env\u00eda un c\u00f3digo de repetici\u00f3n especial en lugar de repetir la transmisi\u00f3n del valor. En este caso, la rutina de decodificaci\u00f3n devuelve un valor especial REPEAT.<\/p>\n<h3>COMO DETECTOR DE PROXIMIDAD.<\/h3>\n<p>Tambi\u00e9n se puede utilizar para el control de un robot, la forma para detectar obst\u00e1culos en su proximidad es por chocar sus parachoques en ellos y comprobar los sensores de contacto. Si implementamos el detector de proximidad tendr\u00e1 una forma de saber que hay algo ah\u00ed fuera, incluso antes de que se alcance realmente el obst\u00e1culo.<\/p>\n<p>Al igual que con la luz visible, la luz infrarroja es reflejada por todo. Si usted pone algo en frente del emisor de infrarrojos (como una pared o algo as\u00ed) se reflejar\u00e1 el infrarrojo y el sensor de luz ser\u00e1 capaz de verlo parpadear, as\u00ed es c\u00f3mo funciona un detector de proximidad.<\/p>\n<p>Para detectar obst\u00e1culos reflejados, tenemos que buscar en la lectura del sensor de luz los cambios r\u00e1pidos. Una forma de lograr esto, es muestrear el sensor con bastante frecuencia y comparar dos lecturas entre s\u00ed. Si la diferencia entre ellas es mayor que un umbral pre-establecido (100 unidades, es aceptable), \u2013 el detector de proximidad se ha disparado \u2013 lo contamos como un impulso. Esto es muy fiable, detecta casi cualquier cosa desde paredes blancas a objetos oscuros o botellas transparentes. Poner una peque\u00f1a visera sobre el sensor de luz, para protegerlo de la luz de arriba mejorar\u00e1 mucho el rango de trabajo del sensor.<\/p>\n<p>Las librer\u00edas utilizadas en este art\u00edculo las puedes obtener\u00a0<a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2020\/08\/Arduino-IRremote-master.zip\" target=\"_blank\" rel=\"noopener noreferrer\">en este enlace<\/a>.<\/p>\n<h4><span style=\"color: #3366ff;\">ANEXO.<\/span><\/h4>\n<p><em>Han pasado unos a\u00f1os y ha habido cambios a mejor en las librer\u00edas que se utilizan en este art\u00edculo y debido a algunos correos en los que me indican que hay errores en los c\u00f3digos mostrados, es el motivo por el cual he realizado esta ampliaci\u00f3n al art\u00edculo inicial.<\/em><\/p>\n<p><em>El propio autor de las librer\u00edas se ha visto en la necesidad de presentar una aclaraci\u00f3n que es la que se presenta en las siguientes l\u00edneas.<\/em><\/p>\n<p><em>Esta es una wiki bastante antigua pero quiz\u00e1s \u00fatil para esta biblioteca.<\/em><\/p>\n<p><em>Conversi\u00f3n de su programa a la versi\u00f3n 3.1<br \/>\n<\/em><em>Esto debe hacerse tambi\u00e9n para todas las versiones&gt; 3.0.1 si USE_NO_SEND_PWM est\u00e1 definido. A partir de esta versi\u00f3n, la generaci\u00f3n de PWM se realiza mediante software , ahorrando as\u00ed el temporizador de hardware y habilitando pines de salida arbitrarios .<\/em><\/p>\n<p><em>Por lo tanto, debes cambiar todo IrSender.begin(true); por IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK);. Si usa un n\u00facleo que no usa la -fltobandera para compilar, puede activar la l\u00ednea #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN en IRRemote.h, si recibe mensajes de error falsos con respecto a begin () durante la compilaci\u00f3n.<\/em><\/p>\n<h3><em>CONVERSI\u00d3N DE SU PROGRAMA 2.X A LA VERSI\u00d3N 3.X<\/em><\/h3>\n<p>&nbsp;<\/p>\n<ul>\n<li><em>Ahora hay un objeto\u00a0<strong>IRreceiver<\/strong>\u00a0y\u00a0<strong>IRsender<\/strong>\u00a0como el conocido objeto Arduino Serial .<\/em><\/li>\n<li><em>Simplemente elimine la l\u00ednea\u00a0<strong>IRrecv IrReceiver(IR_RECEIVE_PIN);<\/strong>\u00a0y \/ o\u00a0<strong>IRsend IrSender;<\/strong>\u00a0en su programa, y<br \/>\n\u200b\u200breemplace todas las apariciones de\u00a0<strong>IRrecv.<\/strong>\u00a0o\u00a0<strong>irrecv.<\/strong>\u00a0con\u00a0<strong>IrReceiver.<\/strong><\/em><\/li>\n<li><em>Dado que los valores decodificados est\u00e1n ahora\u00a0<strong>IrReceiver.decodedIRData<\/strong>\u00a0y ya no\u00a0<strong>results<\/strong>,<br \/>\nelimine la l\u00ednea\u00a0<strong>decode_results results<\/strong>\u00a0o similar.<\/em><\/li>\n<li><em>Como para el objeto Serial, llame a\u00a0<strong>IrReceiver.begin(IR_RECEIVE_PIN, ENABE_ED_FEEDBACK);<\/strong>\u00a0o<br \/>\n<strong>IrReceiver.begin(IR_RECEIVE_PIN<\/strong>,<\/em><\/li>\n<li><em><strong>DISABLE_LED_FEEDBACK);<\/strong>\u00a0en lugar de\u00a0<strong>IrReceiver.enableIRIn();<\/strong>\u00a0o\u00a0<strong>irrecv.enableIRIn();<\/strong>\u00a0en\u00a0<strong>setup ()<\/strong>.<\/em><\/li>\n<li><em>La funci\u00f3n\u00a0<strong>decode (decode_results *aResults)<\/strong>\u00a0anterior se reemplaza por simple\u00a0<strong>decode()<\/strong>.<br \/>\nEntonces, si tiene una declaraci\u00f3n,\u00a0<strong>if(irrecv.decode(&amp;results))<\/strong>\u00a0reempl\u00e1cela con\u00a0<strong>if (IrReceiver.decode())<\/strong>.<\/em><\/li>\n<li><em>El resultado decodificado est\u00e1 ahora en\u00a0<strong>in IrReceiver.decodedIRData<\/strong>\u00a0y no m\u00e1s en\u00a0<strong>results<\/strong>, por lo tanto,<br \/>\nreemplace cualquier ocurrencia de\u00a0<strong>results.value<\/strong>\u00a0y \/ o\u00a0<strong>results.decode_type<\/strong>\u00a0y similar a<br \/>\n<strong>IrReceiver.decodedIRData.decodedRawData<\/strong>\u00a0y \/ o\u00a0<strong>IrReceiver.decodedIRData.decodedRawData<\/strong>.<\/em><\/li>\n<li><em>Overflow, Repeat y otras banderas ahora est\u00e1n disponibles\u00a0<strong>IrReceiver.receivedIRData.flags<\/strong>.<\/em><\/li>\n<li><em>Rara vez usado:\u00a0<strong>results.rawbuf<\/strong>\u00a0y\u00a0<strong>results.rawlen<\/strong>\u00a0debe ser reemplazado por<br \/>\n<strong>IrReceiver.decodedIRData.rawDataPtr-&gt;rawbufy<\/strong>\u00a0<strong>IrReceiver.decodedIRData.rawDataPtr-&gt;rawlen<\/strong>.<\/em><\/li>\n<li><em>Las funciones\u00a0<strong>sendNEC()<\/strong>\u00a0y\u00a0<strong>sendJVC()<\/strong>\u00a0est\u00e1n en desuso y renombraron a\u00a0<strong>sendNECMSB()<\/strong>\u00a0y s<strong>endJVCMSB()<\/strong><br \/>\npara hacerlo m\u00e1s claro que env\u00edan datos con MSB primero, que no es el est\u00e1ndar para NEC y JVC.<br \/>\n\u00daselos para enviar sus antiguos c\u00f3digos de datos IR de 32 bits . En la nueva versi\u00f3n, enviar\u00e1 comandos NEC<br \/>\nno mediante c\u00f3digos de 32 bits, sino mediante una direcci\u00f3n (constante) de 8 bits y un comando de 8 bits.<\/em><\/li>\n<\/ul>\n<p><em>Para una mayor informaci\u00f3n al respecto, es aconsejable acudir a la descripci\u00f3n del autor de las librer\u00edas.<\/em><\/p>\n<p><em>Esta es la <span style=\"color: #3366ff;\">nueva librer\u00eda<\/span>: <a href=\"controlir_files\/Arduino-IRremote-master2021.zip\">Arduino-IRremote-master<\/a><\/em><\/p>\n<p>Esto es todo por este momento respecto de este viejo tema.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>INTRODUCCI\u00d3N. No es nuevo el tema de los controles remotos, incluso los que veremos aqu\u00ed, los de rayos infrarrojos (IR), se utilizan en muchas aplicaciones diferentes, en muchos campos, como es la comunicaci\u00f3n, que utilizan tecnolog\u00eda infrarroja para control remoto en dispositivos dom\u00e9sticos, como los mandos de los TV. El funcionamiento del control remoto, se [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":5447,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[22,393],"tags":[396,395,394],"class_list":["post-5284","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-control-remoto-ir","tag-control-remoto","tag-infrerrojos","tag-ir"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/5284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/comments?post=5284"}],"version-history":[{"count":17,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/5284\/revisions"}],"predecessor-version":[{"id":5647,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/5284\/revisions\/5647"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media\/5447"}],"wp:attachment":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media?parent=5284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/categories?post=5284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/tags?post=5284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}