Proyecto 35 – Receptor Infrarrojo

En este proyecto vamos a utilizar un receptor infrarrojo (IR), para recibir señales de controles remotos, aprender a capturar el código (comando) y hacer que el Arduino realice alguna acción cuando reciba la señal de alguno de los botones del control remoto. Este proyecto consta de dos partes, la primera es para aprender a capturar el código hexadecimal del comando y en la segunda vamos a hacer que nuestro Arduino haga algo cuando presionemos algunos de estos botones, este es un código muy sencillo y muy fácil de implementar.

Receptor Infrarrojo VS1838B

Receptor Infrarrojo VS1838B
Receptor IR

El VS1838B es un receptor infrarrojo que podemos utilizar para recibir señales de controles remotos u otros proyectos. Este receptor esta sincronizado para solo detectar señales en el espectro de 38KHz e ignorar cualquier otra frecuencia.

Especificaciones:

  • Voltaje de operación: 2.7 – 5.5V
  • Consumo de corriente: 0.4mA ~ 1.5mA
  • Distancia Máxima: ~15m
  • Frecuencia: 38KHz
  • Angulo de recepción: ±45°

Control Remoto

Para este proyecto necesitamos también un control remoto, en mi caso utilizaré el de la imagen de arriba, pero puede ser cualquier control remoto de infrarrojos. Para estos proyectos venden unos kits que traen ya el módulo de receptor y el control.

El control que utilizaremos en este proyecto utiliza el protocolo NEC, es uno de los mas comunes, en el proyecto que hoy vamos a realizar no vamos a discriminar por el protocolo.

Ya me he tomado la molestia de registrar todos lo botones del control en la siguiente tabla

TeclaDirección
Hexadecimal
Comando
Hexadecimal
Dato 32 Bits
Hexadecimal
CH-0x000x450xBA45FF00
CH0x000x460xB946FF00
CH+0x000x470xB847FF00
<<0x000x440xBB44FF00
>>0x000x400xBF40FF00
>||0x000x430xBC43FF00
0x000x70xF807FF00 
+0x000x150xEA15FF00
EQ0x000x90xF609FF00 
00x000x160xE916FF00
100+0x000x190xE619FF00
200+0x000xD0xF20DFF00 
10x000xC0xF30CFF00 
20x000x180xE718FF00
30x000x5E0xA15EFF00
40x000x80xF708FF00 
50x000x1C0xE31CFF00
60x000x5A0xA55AFF00
70x000x420xBD42FF00
80x000x520xAD52FF00
90x000x4A0xB54AFF00

¿De dónde vienen estos valores? Al utilizar IrReceiver.printIRResultShort(); recibimos un resumen de estos valores cada vez que presionamos un botón, la siguiente línea es un ejemplo de presionar el «1».

Protocol=NEC Address=0x0 Command=0xC Raw-Data=0xF30CFF00 32 bits LSB first

En la primera parte del proyecto vamos a ver el código con el cual podemos obtener todos los valores de la señal de cada botón

Componentes

  • Arduino UNO o placa compatible
  • Receptor infrarrojo VS1838B o módulo KY-022
  • Control remoto
  • Cables o Jumpers
Pinout receptor infrarrojo
VS1838B pinout
Diagrama receptor infrarrojo con Arduino
Diagrama de utilizar un receptor infrarrojo (IR), para recibir señales de controles remotos

Al utilizar el receptor VS1838B las conexiones son muy simples ya que sólo tiene tres pines que son la salida del receptor, la tierra y el VCC.

Lo primero que vamos a conectar es un cable que va del pin + del sensor a los 5V del Arduino, lo siguiente es un cable del pin GND del receptor al GND del Arduino y por último la salida de la señal del receptor al pin 2 del Arduino.

Instalando la librería IRremote

Para hacer funcionar el receptor IR hay varias librerías en la biblioteca de Arduino, estas librerías nos va a ahorrar el digitar mucho código ya que todos los cálculos y operaciones los tiene la librería y nosotros solo debemos interpretarlos resultados. En la página del proyecto IRremote hay tutoriales para manejar la librería, ejemplos y la migración del código de la versión 2 a la versión 3.

La instalación de la biblioteca, es bastante simple, lo primero es ir al menú Programa> Incluir Librería> Administrar bibliotecas, aquí hay que esperar un poco a que se actualice el indice librerías o bibliotecas instaladas.

Una vez termine de actualizar vamos al cuadro de búsqueda y digitamos «IRremote». Nos aparecerían varios resultados, pero seleccionamos la creada por Armin Joachimsmeyer y le damos instalar.

Código Primera Parte

#include <IRremote.hpp>
int pinReceptor = 2;

void setup()
{
  Serial.begin(115200);
  IrReceiver.begin(pinReceptor, ENABLE_LED_FEEDBACK); // INICIA LA RECEPCIÓN
  Serial.println("Listo para comenzar a recibir");
}

void loop()
{
  if (IrReceiver.decode())
  {
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    IrReceiver.printIRResultShort(&Serial); // una mejora de la ultima versión de la librería
    IrReceiver.resume();
  }
}

Explicación del código

Comenzaremos a revisar el código, primero vamos a ver las declaraciones de las variables.

#include <IRremote.hpp>
int pinReceptor = 2;

Lo primero que vemos es que incluimos la librería IRremote.hpp, la cual hará todo el trabajo complejos de recibir y analizar las señales. Luego declaramos un entero pinReceptor al cual le asignamos el número 2 , el cual va a ser el pin en el que hemos conectado la salida de nuestro receptor.

Función setup()

Serial.begin(115200);
IrReceiver.begin(pinReceptor, ENABLE_LED_FEEDBACK); // INICIA LA RECEPCIÓN
Serial.println("Listo para comenzar a recibir");

Como bien sabemos en el setup ponemos todo lo que debe ser inicializado o ejecutado una sola vez, el el caso de este proyecto lo primero que vemos es la inicialización de la comunicación serial a una velocidad el 115200 baudios, la cual utilizaremos para poder ver los valores de nuestro sensor. La siguiente línea es donde iniciamos el receptor IR, al cual le entregamos dos parámetros, primero el pin en el cual está conectado el receptor y el segundo parámetro es si queremos que el LED del Arduino actúe como testigo de la recepción de una señal. La última línea nos imprime en el monitor de serie la frase «Listo para comenzar a recibir».

Función loop()

if (IrReceiver.decode())
{
  Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
  IrReceiver.printIRResultShort(&Serial); 
  IrReceiver.resume();
}

Iniciamos la función loop con una condicional, donde preguntamos, si hay una señal en el receptor de infrarrojos entonces hacemos los siguientes pasos:

Dentro del If vemos en la primera línea que imprimimos por el monitor de serie el valor Raw Data, en formato hexadecimal, que en el caso de nuestro control y pulsando la tecla [1] nos daría «F30CFF00». La siguiente línea también nos va a mostrar por serial el resultado completo de la información de la señal de la tecla presionada «Protocol=NEC Address=0x0 Command=0xC Raw-Data=0xF30CFF00 32 bits LSB first».

Esta respuesta es mucho más completa que la anterior, podemos ver el protocolo, Dirección etc, y vamos a utilizar el resultado del comando (Command) para la siguiente parte del proyecto.

Por último vemos IrReceiver.resume(); el cual inicia una nueva recepción.

En la imagen anterior vemos el resultado de presionar la tecla «1» del control remoto, vemos como primero nos muestra «F30CFF00» al utilizar la impresión de consola del método IrReceiver.decodedIRData.decodedRawData en formato hexadecimal .

Luego vemos la respuesta de IrReceiver.printIRResultShort(&Serial), Protocol=NEC Address=0x0 Command=0xC Raw-Data=0xF30CFF00 32 bits LSB first

En la imagen anterior vemos el resultado de presionar la tecla «2» del control remoto, vemos como primero nos muestra «E718FF00» al utilizar la impresión de consola del método IrReceiver.decodedIRData.decodedRawData en formato hexadecimal .

Luego vemos la respuesta de IrReceiver.printIRResultShort(&Serial), Protocol=NEC Address=0x0 Command=0x18 Raw-Data=0xE718FF00 32 bits LSB first

De esta forma vamos sacando todos los valores de todas teclas del contro. No olviden que en este ejemplo utilizamos un control remoto específico, pero se puede usar cualquier control para este ejemplo, inclusive el de su televisor.

Código Segunda Parte

#include <IRremote.hpp>
int pinReceptor = 2;

void setup()
{
  Serial.begin(115200);
  IrReceiver.begin(pinReceptor, ENABLE_LED_FEEDBACK); // INICIA LA RECEPCIÓN
  Serial.println("Listo para comenzar a recibir");
}

void loop()
{
  if (IrReceiver.decode())
  {
    if (IrReceiver.decodedIRData.command == 0xC)
      Serial.println("Ha presionado el botón 1"); 
    else if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) 
      Serial.println("Ha presionado la tecla 2");
    else
      Serial.println("Ha presionado un botón diferente a 1 o 2");

    IrReceiver.resume();
  }
} 

Explicación del código

El código es similar al ejercicio anterior en inclusión de las librerías, la declaración de las variables y en el setup, por lo cual no vamos a volver a explicarlo y vamos a ir directamente al loop.

Función loop()

if (IrReceiver.decode())
{
  if (IrReceiver.decodedIRData.command == 0xC)
    Serial.println("Ha presionado el botón 1"); 
  else if (IrReceiver.decodedIRData.decodedRawData == 0xE718FF00) 
    Serial.println("Ha presionado el botón 2");
  else
    Serial.println("Ha presionado un botón diferente a 1 o 2");

  IrReceiver.resume();
}

Al igual que el código de la primera parte iniciamos la función loop con una condicional, donde preguntamos, si hay una señal en el receptor de infrarrojos. Al cumplirse esta condición ya nuestro código entrará a evaluar qué tecla fue presionada.

Una vez que haya una señal en el receptor volvemos a encontrarnos con una condicional, donde evaluamos si el comando rel código recibido ese 0xC (que en nuestro ejemplo corresponde al botón 1), entonces si esto se cumple mostramos el mensaje en el monitor serial «Ha presionado el botón 2», para esto utilizaremos IrReceiver.decodedIRData.command y tomaremos el valor del resultado que obtuvimos en el ejemplo anterior «Protocol=NEC Address=0x0 Command=0xC Raw-Data=0xF30CFF00 32 bits LSB first».

Si esta condición no se cumple volvemos a tener otra condición, si se cumple que el Raw-Data es igual a el hexadecimal «E718FF00», entonces mostramos el mensaje en el monitor serial «Ha presionado el botón 2», para esto utilizamos IrReceiver.decodedIRData.decodedRawData y el valor lo sacamos de «Protocol=NEC Address=0x0 Command=0x18 Raw-Data=0xE718FF00 32 bits LSB first»

Finalizando estas condicionales encontramos ya el else que nos dice que si ninguna de las condiciones anteriores se cumple, entonces nos muestre por el monitor serie el mensaje «Ha presionado un botón diferente a 1 o 2», por lo que si el Arduino detecta una señal que no es el botón 1 ó 2 nos muestra el mensaje anterior.

Por último vemos IrReceiver.resume(); el cual inicia una nueva recepción nos prepara para una nueva recepción.

Resumen

Al conectar el Arduino lo convertimos en un receptor de señales infrarrojas en el rango de los 38KHz, y podemos comenzar a interactuar con cualquier control remoto, ya sea solo para capturar la señal y obtener su códigos o como para poder interactuar con estas señales.


2 comentarios en «Proyecto 35 – Receptor Infrarrojo»

  1. Muchas gracias por tu aporte! estaba renegando con otros códigos que solo leía FFFFFFF con cada botón y no se porque sucedía.

    Responder
    • Hola Diego, muchas gracias por tu comentario y me alegra mucho que te haya servido el post. El secreto en este proyecto es la librería IRemote que utilizo, solo es saber consumirla y tendremos muy buenos resultados.
      Cualquier duda o consulta no dudes en contactarme.

      Responder

Deja un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.