10/11/2024
En el vasto universo de la electrónica y la automatización, Arduino se ha consolidado como una plataforma versátil y accesible para creadores de todos los niveles. Una de las capacidades más fascinantes que podemos integrar en nuestros proyectos es la comunicación por infrarrojos (IR), permitiéndonos interactuar con nuestros dispositivos usando mandos a distancia comunes, como los de televisores o equipos de sonido. Pero, ¿cómo logramos que nuestro Arduino entienda estas señales? La respuesta se encuentra en un componente clave: el sensor infrarrojo, y una herramienta fundamental: una librería específica.

A lo largo de este artículo, exploraremos en detalle qué es un sensor infrarrojo, cómo funciona, y lo más importante, cómo utilizar la librería de Arduino que nos permite interactuar con él. Veremos ejemplos prácticos, desde encender un simple LED hasta controlar múltiples salidas digitales, decodificando las complejas señales que emiten nuestros mandos remotos. Prepárate para darle a tus proyectos una nueva dimensión de control inalámbrico.
- ¿Qué es un Sensor Infrarrojo y Cómo Funciona?
- Protocolos de Comunicación Infrarroja: NEC y SONY
- La Librería IRremote para Arduino
- Conexiones entre Arduino y el Módulo Receptor IR
- Ejemplos Prácticos con la Librería IRremote
- Preguntas Frecuentes sobre Sensores IR y Arduino
- ¿Qué es un sensor infrarrojo y para qué sirve con Arduino?
- ¿Cómo se llama la librería para usar sensores IR con Arduino?
- ¿Cómo instalo la librería IRremote en el IDE de Arduino?
- ¿Qué protocolos de control remoto IR soporta la librería IRremote?
- ¿Cuáles son los pines típicos de un módulo receptor IR y cómo se conectan a Arduino?
- ¿Por qué debo usar irrecv.resume() después de decodificar una señal?
- ¿Qué es decode_results results?
- Conclusión
¿Qué es un Sensor Infrarrojo y Cómo Funciona?
Un sensor infrarrojo, en el contexto de los controles remotos, es un dispositivo capaz de detectar la luz infrarroja emitida por un mando a distancia. Estos sensores son ampliamente utilizados en equipos domésticos como televisores, reproductores de DVD y sistemas de audio para recibir comandos de usuario. El módulo sensor infrarrojo que comúnmente se utiliza con Arduino es compacto y eficiente.
Este tipo de sensor posee un filtro interno que le permite detectar selectivamente frecuencias infrarrojas cercanas a los 38KHz. Esta frecuencia es estándar para la mayoría de los mandos infrarrojos comerciales, lo que garantiza una amplia compatibilidad. Generalmente, estos módulos cuentan con tres pines de conexión: GND (tierra), VCC (alimentación, típicamente 5V) y DATA (salida de datos). El pin DATA es una salida digital que se puede conectar directamente a cualquier pin digital de nuestro Arduino o microcontrolador, facilitando enormemente su integración.
Cuando se presiona un botón en un control remoto IR, este emite una ráfaga de luz infrarroja modulada a una frecuencia específica (por ejemplo, 38KHz o 40KHz). Esta modulación codifica la información del botón presionado en una secuencia de pulsos. El sensor infrarrojo recibe esta luz, la demodula y la convierte en una señal eléctrica digital que Arduino puede interpretar. Cada botón del mando envía un código único que Arduino puede reconocer y asociar a una acción específica.
Protocolos de Comunicación Infrarroja: NEC y SONY
Los mandos a distancia no envían simplemente un pulso por cada botón. Utilizan protocolos de comunicación específicos que definen cómo se codifica y transmite la información. Dos de los protocolos más comunes son NEC y SONY, cada uno con sus propias características:
Protocolo NEC
El protocolo NEC es uno de los más extendidos. Opera a una frecuencia de 38KHz y se caracteriza por enviar los datos de dirección y comando doblemente: de forma normal y negada. Esto permite una mayor robustez en la transmisión y facilita la validación de los datos recibidos. Un paquete de datos NEC típico consta de 32 bits, que incluyen la dirección del dispositivo (asociada, por ejemplo, a un TV o un equipo de sonido) y el comando (asociado a la acción del botón, como subir volumen, apagar, etc.).
Por ejemplo, si el dato de 32 bits para la tecla 'OK' es 0x00FF02FD, donde 00 es la dirección y FF su negación, y 02 es el comando y FD su negación. Esta estructura asegura que la señal es válida y minimiza errores por ruido.
Valores de Datos para un Mando IR Común (Protocolo NEC)
| Botón | Dirección (HEX) | Comando (HEX) | Dato 32 bits (HEX) |
|---|---|---|---|
| OK | 0x00 | 0x02 | 0x00FF02FD |
| Arriba (↑) | 0x00 | 0x62 | 0x00FF629D |
| Abajo (↓) | 0x00 | 0xA8 | 0x00FFA857 |
| Izquierda (←) | 0x00 | 0x22 | 0x00FF22DD |
| Derecha (→) | 0x00 | 0xC2 | 0x00FFC23D |
| 1 | 0x00 | 0x68 | 0x00FF6897 |
| 2 | 0x00 | 0x98 | 0x00FF9867 |
| 3 | 0x00 | 0xB0 | 0x00FFB04F |
| 4 | 0x00 | 0x30 | 0x00FF30CF |
| 5 | 0x00 | 0x18 | 0x00FF18E7 |
| 6 | 0x00 | 0x7A | 0x00FF7A85 |
| 7 | 0x00 | 0x10 | 0x00FF10EF |
| 8 | 0x00 | 0x38 | 0x00FF38C7 |
| 9 | 0x00 | 0x5A | 0x00FF5AA5 |
| 0 | 0x00 | 0x4A | 0x00FF4AB5 |
| * | 0x00 | 0x42 | 0x00FF42BD |
| # | 0x00 | 0x52 | 0x00FF52AD |
Protocolo SONY
El protocolo SONY, por otro lado, trabaja con una frecuencia de 40KHz. Las variaciones más comunes usan 12 bits de datos, aunque existen de 15 y 20 bits. En la versión de 12 bits, 5 bits se destinan a la dirección y 7 bits al comando o función. Una particularidad de este protocolo es que para convertir el dato de 12 bits en su dirección y comando, se debe tomar el bit menos significativo como el de mayor peso.
Valores de Datos para un Mando de TV SONY (Protocolo SONY)
| Botón | Dirección (DEC) | Comando (DEC) | Dato 12bits (Hex) |
|---|---|---|---|
| Power | 1 | 21 | 0xA90 |
| Menú | 1 | 96 | 0X070 |
| Arriba | 1 | 116 | 0x2F0 |
| Abajo | 1 | 117 | 0xAF0 |
| Izquierda | 1 | 52 | 0x2D0 |
| Derecha | 1 | 51 | 0xCD0 |
| 1 | 1 | 0 | 0x010 |
| 2 | 1 | 1 | 0x810 |
| 3 | 1 | 2 | 0x410 |
| 4 | 1 | 3 | 0xC10 |
| 5 | 1 | 4 | 0x210 |
| 6 | 1 | 5 | 0xA10 |
| 7 | 1 | 6 | 0x610 |
| 8 | 1 | 7 | 0xE10 |
| 9 | 1 | 8 | 0x110 |
| 0 | 1 | 9 | 0x910 |
La Librería IRremote para Arduino
La pregunta principal es, ¿cómo se llama la librería de Arduino que nos permite trabajar con sensores infrarrojos? La librería más reconocida, completa y ampliamente utilizada para este propósito es IRremote. Esta librería ha sido desarrollada para simplificar la interacción con diferentes protocolos de controles remotos IR, incluyendo los de marcas conocidas como Sony, LG, Samsung, Sanyo, y por supuesto, NEC.
Para poder utilizarla en tus proyectos de Arduino, es necesario descargarla e importarla en tu IDE de Arduino. Puedes encontrar esta librería en el gestor de librerías del propio IDE (Sketch > Incluir Librería > Administrar Librerías... y buscar 'IRremote') o descargarla desde su repositorio oficial en GitHub e instalarla manualmente (Sketch > Incluir Librería > Añadir Librería .ZIP...). Una vez instalada, tendrás acceso a todas sus funciones para recibir y decodificar señales infrarrojas.
Conexiones entre Arduino y el Módulo Receptor IR
La conexión del módulo sensor infrarrojo a Arduino es notablemente sencilla. Como se mencionó anteriormente, el sensor posee tres pines:
- VCC: Se conecta al pin de 5V de Arduino.
- GND: Se conecta al pin GND de Arduino.
- DATA: Se conecta a un pin digital de Arduino. Para los ejemplos que veremos, usaremos el pin digital 11.
Esta simplicidad en la conexión es una de las razones por las cuales la interacción infrarroja es tan popular en proyectos de Arduino.
Ejemplos Prácticos con la Librería IRremote
Ahora que conocemos el sensor, los protocolos y la librería, vamos a implementar algunos ejemplos prácticos para entender cómo funciona todo en conjunto.
1. Encendiendo un LED con Cualquier Control Remoto
Este primer ejemplo es un clásico y nos muestra la funcionalidad básica de recepción de la señal IR. El objetivo es encender o apagar el LED incorporado en el pin 13 de Arduino con cualquier tecla de cualquier control remoto IR.
El código es el siguiente:
#include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); // Empezamos la recepción por IR pinMode(13, OUTPUT); } boolean on = LOW; void loop() { if (irrecv.decode(&results)) { // Dato recibido, conmutamos el LED on = !on; digitalWrite(13, on ? HIGH: LOW); irrecv.resume(); // empezamos una nueva recepción } delay(300); }Explicación del Código:
#include <IRremote.h>: Incluye la librería IRremote.int RECV_PIN = 11;: Define el pin donde está conectado el sensor IR.IRrecv irrecv(RECV_PIN);: Crea una instancia del objeto IRrecv, que gestionará la recepción de señales en el pin especificado.decode_results results;: Declara una estructura donde se almacenarán los datos decodificados de la señal IR.- En
setup():irrecv.enableIRIn();inicializa el receptor IR, ypinMode(13, OUTPUT);configura el pin 13 como salida para el LED. - En
loop():if (irrecv.decode(&results))comprueba si se ha recibido una señal IR válida. Si es así, la variableon(que controla el estado del LED) se invierte, y el LED del pin 13 se enciende o apaga. Finalmente,irrecv.resume();es crucial para reanudar la recepción de nuevas señales, ya que la librería detiene la recepción automáticamente después de decodificar una señal. Eldelay(300);ayuda a evitar múltiples detecciones rápidas de una sola pulsación de botón.
Al cargar este programa en tu Arduino, cada vez que presiones una tecla en cualquier control remoto IR compatible, el LED del pin 13 cambiará de estado.

2. Decodificando Datos de Controles Infrarrojos
Para proyectos más avanzados, necesitamos saber qué tecla específica se ha presionado. Este ejemplo nos permite decodificar y mostrar los valores hexadecimales y binarios de las teclas pulsadas en el monitor serial de Arduino, independientemente del protocolo.
El código es el siguiente:
#include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Empezamos la recepción por IR } void dump(decode_results *results) { // Muestra la estructura decode_results. // Llamar después de IRrecv::decode() Serial.print("("); Serial.print(results->bits, DEC); Serial.print(" bits)"); if (results->decode_type == UNKNOWN) { Serial.print("Unknown encoding: "); } else if (results->decode_type == NEC) { Serial.print("Decoded NEC: "); } else if (results->decode_type == SONY) { Serial.print("Decoded SONY: "); } else if (results->decode_type == RC5) { Serial.print("Decoded RC5: "); } else if (results->decode_type == RC6) { Serial.print("Decoded RC6: "); } else if (results->decode_type == PANASONIC) { Serial.print("Decoded PANASONIC - Address: "); Serial.print(results->address, HEX); Serial.print(" Value: "); } else if (results->decode_type == LG) { Serial.print("Decoded LG "); } else if (results->decode_type == JVC) { Serial.print("Decoded JVC "); } else if (results->decode_type == AIWA_RC_T501) { Serial.print("Decoded AIWA RC T501 "); } else if (results->decode_type == WHYNTER) { Serial.print("Decoded Whynter "); } Serial.print(results->value, HEX); Serial.print(" (HEX), "); Serial.print(results->value, BIN); Serial.println(" (BIN)"); } void loop() { if (irrecv.decode(&results)) { dump(&results); irrecv.resume(); // empezamos una nueva recepción } delay(300); }Este programa es invaluable para descubrir los códigos específicos de cada botón de tus mandos remotos. Abre el monitor serial de Arduino (con la velocidad de 9600 baudios) después de cargar el código y observa los valores que aparecen al presionar las teclas. Esto te permitirá crear un mapa de las acciones deseadas para cada botón.
3. Controlando Pines Digitales con Control Remoto IR
Una vez que conocemos los valores de las teclas, podemos asignarlas a acciones específicas en nuestro Arduino. En este ejemplo, controlaremos el estado de varios LEDs conectados a los pines digitales 4, 5, 6 y 7, utilizando las teclas de un mando remoto NEC y luego uno SONY.
Conexiones Adicionales:
- LED con resistencia a pin 4 y GND.
- LED con resistencia a pin 5 y GND.
- LED con resistencia a pin 6 y GND.
- LED con resistencia a pin 7 y GND.
Código para Mando NEC:
#include "IRremote.h" int receiver = 11; IRrecv irrecv(receiver); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); } void loop() { if (irrecv.decode(&results)) { switch(results.value) { case 0x00FF629D: Serial.println("Tecla: Arriba"); break; case 0x00FF22DD: Serial.println("Tecla: Izquierda"); break; case 0x00FF02FD: Serial.println("Tecla: OK"); break; case 0x00FFC23D: Serial.println("Tecla: Derecha"); break; case 0x00FFA857: Serial.println("Tecla: Abajo"); break; case 0x00FF6897: Serial.println("Tecla: 1"); break; case 0x00FF9867: Serial.println("Tecla: 2"); break; case 0x0FFB04F: Serial.println("Tecla: 3"); break; case 0x00FF30CF: // Tecla 4 Serial.println("Tecla: 4"); digitalWrite(4, !digitalRead(4)); // Cambia estado del LED en pin 4 break; case 0x00FF18E7: // Tecla 5 Serial.println("Tecla: 5"); digitalWrite(5, !digitalRead(5)); // Cambia estado del LED en pin 5 break; case 0x00FF7A85: // Tecla 6 Serial.println("Tecla: 6"); digitalWrite(6, !digitalRead(6)); // Cambia estado del LED en pin 6 break; case 0x00FF10EF: // Tecla 7 Serial.println("Tecla: 7"); digitalWrite(7, !digitalRead(7)); // Cambia estado del LED en pin 7 break; case 0x00FF38C7: Serial.println("Tecla: 8"); break; case 0x00FF5AA5: Serial.println("Tecla: 9"); break; case 0x00FF42BD: Serial.println("Tecla: *"); break; case 0x00FF4AB5: Serial.println("Tecla: 0"); break; case 0x00FF52AD: Serial.println("Tecla: #"); break; } irrecv.resume(); } delay(300); }En este código, utilizamos una estructura switch para comparar el valor decodificado (results.value) con los códigos hexadecimales de las teclas de nuestro mando NEC. Cuando se presiona una tecla (por ejemplo, '4'), el código detecta su valor, imprime un mensaje en el monitor serial y, en este caso, cambia el estado del LED conectado al pin 4. Puedes expandir esto para controlar cualquier otro actuador.
Código para Mando SONY:
De manera similar, podemos adaptar el código para un control remoto SONY, utilizando los valores de las teclas correspondientes a ese protocolo:
#include "IRremote.h" int receiver = 11; IRrecv irrecv(receiver); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); } void loop() { if (irrecv.decode(&results)) { switch(results.value) { case 0xA90: Serial.println("Tecla: Power"); break; case 0x070: Serial.println("Tecla: Menu"); break; case 0x2F0: Serial.println("Tecla: Arriba"); break; case 0x2D0: Serial.println("Tecla: Izquierda"); break; case 0xCD0: Serial.println("Tecla: Derecha"); break; case 0xAF0: Serial.println("Tecla: Abajo"); break; case 0x010: Serial.println("Tecla: 1"); break; case 0x810: Serial.println("Tecla: 2"); break; case 0x410: Serial.println("Tecla: 3"); break; case 0xC10: // Tecla 4 Serial.println("Tecla: 4"); digitalWrite(4, !digitalRead(4)); break; case 0x210: // Tecla 5 Serial.println("Tecla: 5"); digitalWrite(5, !digitalRead(5)); break; case 0xA10: // Tecla 6 Serial.println("Tecla: 6"); digitalWrite(6, !digitalRead(6)); break; case 0x610: // Tecla 7 Serial.println("Tecla: 7"); digitalWrite(7, !digitalRead(7)); break; case 0xE10: Serial.println("Tecla: 8"); break; case 0x110: Serial.println("Tecla: 9"); break; case 0x910: Serial.println("Tecla: 0"); break; case 0x490: Serial.println("Tecla: Vol+"); break; case 0xC90: Serial.println("Tecla: Vol-"); break; } irrecv.resume(); } delay(300); }Estos ejemplos demuestran la flexibilidad de la librería IRremote y cómo, una vez que conoces los códigos de tus mandos, puedes implementar lógicas complejas para controlar tus proyectos de Arduino de forma inalámbrica.
Preguntas Frecuentes sobre Sensores IR y Arduino
¿Qué es un sensor infrarrojo y para qué sirve con Arduino?
Un sensor infrarrojo, en el contexto de control remoto, es un componente electrónico que detecta y decodifica las señales de luz infrarroja emitidas por mandos a distancia. Con Arduino, se utiliza para recibir comandos inalámbricos y activar acciones en tus proyectos, como encender luces, controlar motores o interactuar con otros módulos.
¿Cómo se llama la librería para usar sensores IR con Arduino?
La librería más popular y completa para trabajar con sensores infrarrojos en Arduino se llama IRremote. Ofrece funciones para decodificar una amplia variedad de protocolos IR de diferentes marcas de controles remotos.
¿Cómo instalo la librería IRremote en el IDE de Arduino?
Puedes instalarla directamente desde el Administrador de Librerías del IDE de Arduino. Ve a Sketch > Incluir Librería > Administrar Librerías..., busca 'IRremote' y haz clic en 'Instalar'. Alternativamente, puedes descargar el archivo .zip desde su repositorio oficial y añadirlo a través de Sketch > Incluir Librería > Añadir Librería .ZIP....
¿Qué protocolos de control remoto IR soporta la librería IRremote?
La librería IRremote soporta una gran variedad de protocolos, incluyendo NEC, SONY, RC5, RC6, Panasonic, LG, JVC, AIWA RC-T501, Whynter, y muchos otros. Esto la hace muy versátil para trabajar con la mayoría de los controles remotos comerciales.
¿Cuáles son los pines típicos de un módulo receptor IR y cómo se conectan a Arduino?
Un módulo receptor IR estándar tiene tres pines: VCC (alimentación, se conecta a 5V de Arduino), GND (tierra, se conecta a GND de Arduino) y DATA (salida de datos, se conecta a un pin digital de Arduino, comúnmente el pin 11 o cualquier otro pin digital disponible).
¿Por qué debo usar irrecv.resume() después de decodificar una señal?
Cuando la librería IRremote detecta y decodifica una señal, detiene temporalmente la recepción para evitar procesar la misma señal varias veces o mezclarse con otras. Es necesario llamar a irrecv.resume() para indicarle a la librería que debe volver a escuchar nuevas señales infrarrojas.
¿Qué es decode_results results?
decode_results es una estructura de datos que la librería IRremote utiliza para almacenar toda la información relevante de la señal infrarroja decodificada. Incluye el valor del código (results.value), el tipo de protocolo (results.decode_type), el número de bits (results.bits), y en algunos protocolos, la dirección (results.address).
Conclusión
La capacidad de controlar proyectos de Arduino mediante señales infrarrojas abre un abanico de posibilidades para la automatización y la interacción remota. Gracias a la robusta y completa librería IRremote, junto con un sensor IR económico y fácil de usar, cualquier persona puede comenzar a integrar esta funcionalidad en sus creaciones. Hemos visto cómo identificar la librería, realizar las conexiones básicas, y lo más importante, cómo decodificar las señales de diferentes mandos y usarlas para controlar salidas digitales. Este conocimiento te permitirá ir más allá, creando sistemas de control para luces, puertas, cortinas, o cualquier dispositivo que puedas imaginar, haciendo tus proyectos más inteligentes y cómodos de usar.
Si quieres conocer otros artículos parecidos a Controla Arduino con Infrarrojos: La Librería IRremote puedes visitar la categoría Librerías.
