En este tutorial, aprenderá a utilizar un sensor de infrarrojos en combinación con el protocolo de transmisión de infrarrojos de NEC.
Al final de este tutorial, creará un proyecto con el sensor de infrarrojos VS1838B para leer y codificar señales de infrarrojos desde un control remoto.

¿Qué es la radiación infrarroja (IR)?
La radiación infrarroja (IR) o luz infrarroja es radiación electromagnética (EMR) y transporta energía radiante como todos los EMR. Aunque el IR se comporta tanto como una onda como su partícula cuántica, el fotón.
La luz infrarroja no es visible para los humanos debido a la longitud de onda más larga que el ojo humano puede ver:
- Longitud de onda infrarroja: 700 nm a 1000 nm
- Longitud de onda visible humana: 400 nm a 700 nm
Las siguientes imágenes le brindan una descripción general del espectro electromagnético.

Pero existe la posibilidad de ver luz infrarroja. Puede ver la luz a través de su teléfono celular, porque la cámara de su teléfono celular ve la luz emitida por el diodo infrarrojo. Verá que la luz parpadea porque el diodo infrarrojo se enciende muy rápidamente. Hay un ritmo detrás de este comportamiento que es necesario para codificar la información enviada por el diodo.
Por lo tanto, podemos usar IR enviando información como señales analógicas y codificando estas señales con un sensor. Los siguientes capítulos describen los sensores infrarrojos normales y los sensores infrarrojos pasivos. Además, discutiremos el uso de módulos de distancia por infrarrojos.
Protocolo de transmisión de infrarrojos NEC
El protocolo de transmisión NEC IR utiliza la codificación por distancia de pulso de los bits del mensaje. Cada ráfaga de pulsos (marca - transmisor RC activado) tiene una longitud de 562,5 µs, a una frecuencia portadora de 38 kHz (26,3 µs). Los bits lógicos se transmiten de la siguiente manera:
- ‘0’ lógico: una ráfaga de pulsos de 562,5 µs seguida de un intervalo de 562,5 µs, con un tiempo de transmisión total de 1,125 ms
- Lógico ‘1’: una ráfaga de pulsos de 562,5 µs seguida de un intervalo de 1,6875 ms, con un tiempo de transmisión total de 2,25 ms
Cuando se presiona un botón en el control remoto, el mensaje transmitido consta de los siguientes elementos, en orden:

- una ráfaga de pulsos de 9 ms (16 veces la longitud de la ráfaga de pulsos utilizada para un bit de datos lógicos)
- un espacio de 4.5 ms
- la dirección de 8 bits del dispositivo receptor
- el inverso lógico de 8 bits de la dirección
- el comando de 8 bits
- el inverso lógico de 8 bits del comando
- una última ráfaga de pulsos de 562,5 µs para indicar el final de la transmisión del mensaje
| Parámetro técnico | Valor nominal / Rango | Función y consideración de diseño |
|---|---|---|
| Frecuencia portadora (Carrier) | 38 kHz (±1 kHz) | Filtro paso banda interno de alta selectividad para discriminar la modulación del mando frente a radiación solar o bombillas continuas. |
| Longitud de onda de pico (λp) | 940 nm | Espectro infrarrojo cercano coincidente con la emisión óptica de mandos a distancia estándar y diodos emisores IR. |
| Tensión de alimentación (VCC) | 2,7 V a 5,5 V DC | Compatible de forma nativa tanto a 5 V (Arduino Uno/Nano) como a 3,3 V (ESP32 y ESP8266) sin desajustar el amplificador. |
| Lógica de salida en reposo | Nivel ALTO (VCC) / Lógica activa en BAJO | Salida en colector abierto con resistencia pull-up interna (~20-30 kΩ). Al recibir ráfagas moduladas de 38 kHz la salida cae a 0 V. |
| Consumo de corriente en reposo | 0,4 mA a 1,5 mA | Muy bajo consumo estático, ideal para aparatos alimentados por batería o circuitos domóticos con modo sleep. |
| Alcance y ángulo de recepción | Hasta 18 metros / Ángulo ±45° | Cúpula de epoxi con filtro de bloqueo de luz visible y blindaje metálico interno contra interferencias electromagnéticas (EMI). |
Sensor infrarrojo receptor (VS1838B y TSOP4838)
Usando un sensor de infrarrojos, el microcontrolador Arduino, ESP8266 y ESP32 puede recibir información de un control remoto de infrarrojos y actuar de acuerdo con el botón que presionó en el control remoto de infrarrojos. Por lo tanto, el sensor escanea rangos de frecuencia específicos, definidos por estándares, y convierte estas señales en los pines de salida del sensor. El sensor de infrarrojos más básico es el VS1838B.
Diferentes bibliotecas de infrarrojos para Arduino y ESP8266 / ESP32
Para su funcionamiento, el sensor recibe una señal de infrarrojos que debe codificarse. Puede intentar codificar la señal IR para diferentes fabricantes usted mismo, pero estoy usando una biblioteca para esta tarea que codifica el pulso de luz y generará un código HEX basado en la información enviada por el diodo infrarrojo.
- Para el microcontrolador Arduino, use la biblioteca «IRremote» de Ken Shirriff
- Para microcontroladores ESP8266 y ESP32, use la biblioteca «IRremoteESP8266» de David Conran
Encontrará ambas bibliotecas en su IDE de Arduino. Si no sabe cómo instalar una biblioteca en su IDE de Arduino, escribí una guía paso a paso.
Cableado entre el sensor de infrarrojos VS1838B y el microcontrolador
La siguiente imagen muestra el cableado entre diferentes placas de microcontroladores Arduino, ESP8266 y ESP32 y el sensor de infrarrojos VS1838B.
| Pin VS1838B (Frente abultado) | Señal / Función | Arduino Uno / Nano / Mega | ESP32 (3.3V nativo) | ESP8266 NodeMCU / D1 |
|---|---|---|---|---|
| Pin 1 (Izquierda) | OUT (Señal demodulada) | Pin D7 (o pin con interrupción) | GPIO 4 (o GPIO 15 / 16) | Pin D4 (GPIO 2) |
| Pin 2 (Centro) | GND (Referencia 0 V) | Pin GND | Pin GND | Pin GND |
| Pin 3 (Derecha) | VCC (Alimentación) | Pin 5V (o 3.3V) | Pin 3V3 (Recomendado) | Pin 3V3 |
Precaución eléctrica y criterios de fiabilidad en sensores infrarrojos
- Tensión lógica de salida y riesgo en ESP32 / ESP8266: Si alimentas el receptor VS1838B desde el pin de 5 V de una placa o fuente externa, la salida de reposo (OUT) mantendrá 5 V continuos en la entrada GPIO del microcontrolador. Aunque el ESP32 cuenta con cierta tolerancia transitoria, la inyección constante de 5 V degrada los diodos de protección del silicio y causa reinicios térmicos. Regla de diseño: Alimenta el sensor siempre desde el raíl de 3,3 V al trabajar con ESP32 o ESP8266 (el receptor opera con total estabilidad desde 2,7 V DC).
- Filtro de desacoplo RC ante ruido Wi-Fi en VCC: El preamplificador interno de alta ganancia del VS1838B es hipersensible a caídas de tensión y fluctuaciones rápidas. Las ráfagas de transmisión Wi-Fi del ESP32 inducen rizado en VCC que el sensor interpreta como ráfagas espurias de 38 kHz, corrompiendo la decodificación de tramas. Instala siempre un filtro pasa bajos según datasheet: una resistencia de 100 Ω en serie con la línea VCC y un condensador de desacoplo de 4,7 μF a 47 μF junto a un cerámico de 100 nF en paralelo directo entre los pines VCC y GND del sensor.
- Límite de corriente del LED emisor IR (Peligro de destrucción de GPIO): Si montas un circuito emisor infrarrojo (para clonar un mando a distancia o transmitir ráfagas NEC), jamás conectes el LED infrarrojo de 940 nm directamente entre el pin GPIO y GND. Un LED IR tiene una caída directa (Vf) de apenas 1,2 V a 1,5 V. Sin resistencia limitadora, demandará más de 100 mA, destruyendo instantáneamente el transistor de salida del GPIO (límite máximo de 40 mA en ATmega328P y 12-20 mA en ESP32). Para emisión de corto alcance coloca una resistencia en serie de mínimo 100 Ω (para ~20 mA); para mandos de largo alcance utiliza un transistor de conmutación NPN (2N2222 o BC547) gobernado por el pin digital.
- Peligro de bucle de masa (PE) con el osciloscopio: Al medir la señal de los pines del receptor o del LED emisor con un osciloscopio de sobremesa con chasis puesto a tierra de protección (PE), conecta la pinza de cocodrilo de masa estrictamente al carril GND común del circuito. Si el circuito bajo prueba se alimenta a través de un convertidor reductor (buck) sin aislamiento galvánico o conectado a red eléctrica, conectar la pinza de masa en cualquier punto distinto de GND provocará un cortocircuito franco a tierra que destruirá la sonda y la placa.
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 ESP-WROOM-32

ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Código para decodificar señales infrarrojas del mando a distancia (Protocolo NEC)
Después de conectar nuestros dispositivos, ingresaremos el código. Nuestro objetivo es imprimir el código en HEX y Decimal (DEZ) cuando presionamos diferentes botones en el control remoto infrarrojo. En este ejemplo, estoy usando el control remoto de mi televisor.
Debido a que el código del programa difiere entre Arduino y ESP8266 y ESP32 en términos de la biblioteca utilizada, creé un cuadro para cada código de programa.
- Código de programa para Arduino
- Código de programa para ESP8266 y ESP32
Código de programa para Arduino
#include "IRremote.h"
const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop(){
if (irrecv.decode(&results)){
Serial.println(results.value, HEX);
Serial.println(results.value, DEC);
irrecv.resume();
Serial.println();
}
}
Código de programa para ESP8266 y ESP32
#include "IRrecv.h"
uint16_t RECV_PIN = D4; // for ESP8266 micrcontroller
//uint16_t RECV_PIN = 4; // for ESP32 micrcontroller
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
if (results.value >> 32) // print() & println() can't handle printing long longs. (uint64_t)
Serial.print((uint32_t) (results.value >> 32), HEX); // print the first part of the message
Serial.println((uint32_t) (results.value & 0xFFFFFFFF), HEX); // print the second part of the message
irrecv.resume(); // Receive the next value
}
delay(100);
}
En la primera línea del script del programa, incluimos la biblioteca de infrarrojos compatible. A continuación, debemos configurar el pin digital para la conexión entre el microcontrolador y el módulo IR. Después de definir un nuevo objeto IR para recibir señales infrarrojas del control remoto y validar el pin conectado a ese objeto, creamos un objeto llamado results que recibe los resultados infrarrojos decodificados de la biblioteca.
En la función de configuración, establecemos la velocidad en baudios en 9600 para la transmisión en serie de su conexión USB entre el microcontrolador y la PC, que debe coincidir con la velocidad en baudios del monitor en serie en su Arduino IDE. El último paso de la función de configuración es activar la detección de Entrada IR.
En la función de bucle, llamamos a la función de decodificación de la biblioteca IR con la dirección de la variable de resultados. Por lo tanto, si el receptor de infrarrojos detecta una señal de infrarrojos que está recodificada, la función devuelve VERDADERO a la función if e imprimimos el valor HEX y decimal del resultado en el monitor de serie.
Para ESP8266 y ESP32, los resultados son demasiado largos para imprimirse en el monitor en serie. Por lo tanto, necesitamos dividir los resultados en los primeros 32 bits y los bits restantes que se imprimen solo en HEX en la conexión en serie.
Después de recibir la señal de infrarrojos e imprimir la señal en la conexión en serie, necesitamos reiniciar el receptor y prepararlo para recibir otro código.
La siguiente imagen muestra los resultados del código Arduino, cuando presiono botones aleatorios en mi control remoto Samsung.

Con este ejemplo, puede identificar todos los códigos de tecla en el control remoto. Después de la identificación, puede reaccionar a varios botones del control remoto. Un ejemplo Es posible que desee encender un LED rojo cuando suba el volumen y un LED verde cuando presione el volumen en su control remoto. Siéntase libre de pensar en diferentes casos de uso, intente programar el sketch correspondiente y implementa la lógica requerida para tu aplicación.
Si planea usar sensores infrarrojos para detectar objetos o medir distancias, consulte el artículo sobre Sensor de distancia ultrasónico, Módulo de seguimiento de línea TCRT5000 y Sensor de movimiento PIR HC-SR501.
Diagnóstico y decodificación de señales infrarrojas con osciloscopio
Precaución contra saturación óptica por luz ambiental y deslumbramiento del sensor IR
Al diagnosticar receptores infrarrojos como el VS1838B o TSOP4838 en el banco de trabajo, las fuentes ópticas parásitas pueden falsear totalmente la señal observada en el osciloscopio:
- Saturación del lazo AGC interno por luz continua: la luz solar directa o las bombillas halógenas e incandescentes emiten un espectro infrarrojo masivo. Esta radiación inunda el fotodiodo interno y fuerza al circuito de control automático de ganancia (AGC) a atenuar al mínimo la sensibilidad, dejando el receptor sordo ante las ráfagas legítimas de 38 kHz.
- Deslumbramiento por emisión a corta distancia: pulsar un mando a distancia a menos de 5 cm del sensor satura la etapa desmoduladora, provocando que la salida
OUTse quede bloqueada en nivel bajo (0 V) o deformando el ancho de los pulsos digitales. - Recomendación de medición fiable: mantén el emisor a una distancia mínima de 30 cm a 1 metro del receptor durante las pruebas con osciloscopio y apantalla el sensor de la iluminación cenital directa de lámparas de filamento o fluorescentes convencionales.
La depuración de enlaces infrarrojos mediante monitor serie o funciones Serial.println() presenta limitaciones críticas: si la librería no decodifica el código, es imposible discernir si el problema radica en una frecuencia portadora desviada, en ruido óptico ambiental que satura el fotodiodo o en deformaciones en los tiempos de pulso del protocolo. El osciloscopio es la herramienta definitiva para diagnosticar cada etapa de la cadena de transmisión:
1. Verificación de la modulación portadora a 38 kHz en el emisor
Al inspeccionar con la sonda en escala 10X los terminales del LED emisor infrarrojo de un mando a distancia:
- Medición del período de conmutación: Ajusta la base de tiempos a 10 μs/div. Una portadora correcta de 38 kHz debe presentar un período exacto de T = 1 / 38.000 pprox 26,3 μ ext{s . Si el resonador cerámico o cristal del mando remoto está degradado y oscila a 34 kHz o 42 kHz, el filtro paso banda de alta selectividad del VS1838B atenuará la señal en más de un 60 %, reduciendo drásticamente el alcance útil.
- Ciclo de trabajo (Duty Cycle): Para evitar que el LED emisor se queme por disipación térmica en regímenes de corriente de 100 a 300 mA, los mandos comerciales modulan con un ciclo de trabajo reducido del 25 % al 33 % (pulso activo de ~8,7 μs en nivel ALTO y 17,6 μs en nivel BAJO). Si diseñas un emisor con timer o PWM en microcontrolador, verifica con el osciloscopio que el duty cycle no exceda el 33 %.
2. Análisis de la trama demodulada del protocolo NEC en el pin OUT
Conecta la sonda del osciloscopio directamente al pin OUT del sensor VS1838B y configura el trigger en flanco de bajada (Falling Edge) en modo Single Sweep, con la base de tiempos en 5 ms/div o 10 ms/div. Al presionar un botón del mando, capturarás la trama completa del protocolo NEC demodulada en banda base:
- Cabecera de sincronismo (Leader Code): Consta de una ráfaga en nivel BAJO de 9,0 ms seguida de un espacio en nivel ALTO de 4,5 ms (duración total de 13,5 ms). Si la cabecera mide menos de 8,5 ms o más de 9,5 ms, la librería descartará el paquete por violación de temporización.
- Discriminación de bits lógicos (Modulación por distancia de pulsos): Cada bit comienza con un pulso en nivel BAJO de 562,5 μs. La diferencia radica en la duración del espacio en nivel ALTO posterior:
- Bit ‘0’ lógico: Pausa en nivel ALTO de 562,5 μs (duración total del bit: 1,125 ms).
- Bit ‘1’ lógico: Pausa en nivel ALTO de 1.687,5 μs (duración total del bit: 2,25 ms).
- Estructura de 32 bits de datos: La trama transmite primero los 8 bits de dirección del dispositivo seguidos de 8 bits de dirección invertida (comprobación de integridad), y a continuación 8 bits de comando seguidos de 8 bits de comando invertido. Con los cursores de tiempo del osciloscopio puedes leer manualmente el código hexadecimal antes incluso de cargar el programa en Arduino.
- Código de repetición continua (Repeat Code): Si mantienes presionado un botón del mando, no se retransmite la trama completa de 32 bits, sino un pulso de repetición cada 110 ms consistente en una ráfaga de 9,0 ms, una pausa de 2,25 ms y un pulso final de 562 μs. Con el osciloscopio puedes validar si tu código captura correctamente la repetición o genera pulsaciones múltiples no deseadas.
3. Detección de ruido óptico ambiental y saturación del receptor
Lámparas fluorescentes con balastos electrónicos deteriorados, reguladores tiristorizados de intensidad de luz (dimmers) y fuentes conmutadas cercanas pueden emitir armónicos de conmutación óptica en el entorno de 35 a 45 kHz. Al observar la salida OUT del sensor con el trigger en modo Auto, cualquier tren de pulsos aleatorio en reposo delatará interferencia óptica que ciega al microcontrolador. Un osciloscopio con función FFT permite correlacionar la frecuencia del ruido con la fuente interferente para implementar blindajes mecánicos eficaces.
Para inspeccionar ráfagas a 38 kHz, decodificar tramas NEC y verificar buses serie en proyectos con sensores y microcontroladores, estos son los 4 osciloscopios de referencia recomendados para banco de trabajo:
| Modelo recomendado | Formato / Arquitectura | Ancho de banda / Muestreo | Canales y Memoria | Función clave para Sensores IR y Protocolo NEC | Oferta |
|---|---|---|---|---|---|
| Sobremesa digital laboratorio | 50 MHz (ampliable) / 1 GSa/s | 4 canales / 24 Mpts | 4 canales simultáneos para correlacionar la señal del LED emisor, la salida demodulada del VS1838B, el pin GPIO y la consola serie | VER MEJOR PRECIO | |
| Sobremesa con tecnología SPO (Super Fósforo) | 200 MHz / 1 GSa/s | 2 canales / 14 Mpts | Función de historial y modo secuencia (80.000 segmentos) para registrar ráfagas IR esporádicas de mandos a distancia sin perder resolución | VER MEJOR PRECIO | |
| Módulo USB con aislamiento galvánico de hardware | 25 MHz / 100 MSa/s | 2 canales / 5 Kpts | Aislamiento de hardware de hasta 400 Vpk que protege los puertos USB del ordenador frente a bucles de masa al alimentar placas desde fuentes externas | VER MEJOR PRECIO | |
| Sobremesa de banco clásico | 100 MHz / 1 GSa/s | 2 canales / 40 Kpts | Pantalla de 7 pulgadas y disparo Single Sweep para capturar tramas completas de protocolo NEC en banco de trabajo de bajo coste | VER MEJOR PRECIO |
Si buscas el instrumento más versátil para depurar sistemas embebidos, sensores y microcontroladores con la máxima visibilidad multicanal y memoria profunda:
Para profundizar en técnicas de medición de sensores y señales en bancos de laboratorio, consulta nuestras guías especializadas: Cómo elegir un osciloscopio para proyectos con Arduino y ESP32, Osciloscopio con Arduino, Tutorial del sensor infrarrojo TCRT5000, Arduino Uno Pinout y señales y nuestra comparativa de osciloscopios digitales, osciloscopios portátiles y osciloscopios USB.
Preguntas frecuentes sobre sensores infrarrojos y mandos IR
¿Por qué la librería IRremote v4.x muestra códigos distintos a los tutoriales antiguos con results.value?
A partir de la versión 3.x y 4.x de la librería IRremote para Arduino, la función antigua IrReceiver.decode(&results) quedó obsoleta para ahorrar memoria RAM. Hoy debes inicializar con IrReceiver.begin(PIN_IR) y leer el comando directamente mediante IrReceiver.decodedIRData.command y IrReceiver.decodedIRData.protocol.
¿Por qué el sensor infrarrojo de obstáculos falla al usarlo en exteriores a pleno sol?
La radiación solar contiene una enorme densidad de espectro infrarrojo cercano (700 a 1.000 nm) que satura por completo los fotodiodos simples sin modulación (como el módulo FC-51). Para exteriores o luz solar directa, utiliza receptores modulados a 38 kHz (TSOP38238) o sensores láser de tiempo de vuelo (VL53L0X).