Inicio » Kits para Arduino » Kit de 37 sensores para Arduino » Módulo receptor infrarrojo KY-022

¿Qué es el módulo KY-022?

El módulo KY-022 es un módulo que lleva integrado un receptor infrarrojo. Este módulo está diseñado para recibir señales infrarrojas de un control remoto o de cualquier fuente IR, lo que permite a los dispositivos recibir comandos a distancia.

KY-008

Funciona decodificando las señales moduladas enviadas desde la fuente IR y convirtiéndolas en señales eléctricas que pueden ser procesadas por un microcontrolador como Arduino.

¿Para qué sirve el módulo KY-022?

El módulo KY-022 ofrece múltiples aplicaciones en el ámbito de la electrónica y robótica DIY.

Aquí te dejo una lista de usos comunes:

  • Control remoto de dispositivos: Utilizado en proyectos de domótica para controlar dispositivos como luces, televisores, sistemas de sonido, etc., mediante un control remoto infrarrojo.
  • Robótica: En robots, puede ser usado para recibir comandos que controlen movimientos o acciones, permitiendo una interacción a distancia.
  • Interruptores inalámbricos: Implementación en sistemas donde se requiere activar o desactivar mecanismos sin contacto físico, como puertas automáticas o sistemas de seguridad.
  • Decodificación de señales IR: Puede ser usado en proyectos que requieren decodificar las señales enviadas por diferentes tipos de controles remotos infrarrojos para entender y replicar su funcionamiento.
  • Juguetes controlados a distancia: Ideal para integrar en juguetes que funcionen con control remoto infrarrojo, permitiendo a los niños o usuarios controlarlos sin necesidad de cables.
  • Interfaces de usuario para dispositivos electrónicos: Puede ser parte de una interfaz para dispositivos electrónicos que requieren una forma simple de interacción del usuario sin necesidad de botones físicos.
  • Experimentos educativos: Utilizado en kits educativos para enseñar sobre comunicación inalámbrica, sensores y programación de microcontroladores.
  • Sistemas de navegación interna para vehículos autónomos: Puede ser parte de sistemas de navegación que utilizan señales infrarrojas para la orientación dentro de entornos controlados.
  • Herramientas de accesibilidad: Desarrollo de herramientas o dispositivos que ayuden a personas con discapacidad a interactuar con tecnología de su entorno mediante controles remotos simplificados.
  • Sistemas de feedback para performance artística: En el ámbito artístico, puede ser utilizado para crear instalaciones interactivas donde los espectadores puedan influir en el arte usando un control remoto.

Especificaciones del módulo KY-022

Estructura física

El módulo lleva integrado un receptor IR VS1838B:

sensor IR integrado en el módulo KY-022

Este es el responsable de recibir las señales infrarrojas.

En cuanto a los pines, integra 3 pines que permiten alimentar el módulo y enviar la señal recibida por el receptor IR al Ardino:

pines módulo KY-022
  • GND: Pin de tierra. Etiquetado con un -. Lo conectaremos a un pin GND de Arduino.
  • VCC: Es el pin central. A través de este pin el módulo recibe la alimentación necesaria para funcionar. Lo conectaremos a 5V.
  • OUT: Etiquetado como S. Es la salida a través de la cual envía la señal infrarroja decodificada. Debemos conectarla a un pin digital de nuestro Arduino.

Especificaciones técnicas

En la siguiente tabla puedes consultar más en detalle las especificaciones técnicas del módulo:

Tensión de funcionamiento3V – 5V
Corriente de funcionamiento0.4mA – 1.5mA
Distancia de recepción18m
Ángulo de recepción± 45º
Frecuencia de carga38 KHz
Voltaje de bajo nivel0.4V
Voltaje de alto nivel4.5V
Filtro de luz ambientalhasta 500LUX
Dimensiones15 mm x 18.5 mm x 10 mm

¿Cómo funciona el receptor infrarrojo?

Imagina que tienes un mando a distancia de una televisión en tu mano. Cuando presionas un botón para cambiar el canal, el control remoto envía una luz que no puedes ver, porque es luz infrarroja. Esta luz, una forma de energía que viaja por el aire, es esencial para la comunicación entre dispositivos electrónicos.

La televisión está equipada de un receptor infrarrojo, como el del módulo KY-022, que le permite recepcionar e interpretar la señal infrarroja que le llega del mando a distancia.

Codificación y modulación

En la modulación de señal infrarroja, un codificador en el control remoto convierte una señal binaria en una señal eléctrica modulada. Esta señal se envía al LED infrarrojo, que la transforma en una señal de luz infrarroja modulada.

control remoto IR
Imagen del control remoto de OpenClipart-Vectors en Pixabay

La señal infrarroja modulada consiste en una serie de pulsos de luz infrarroja que se encienden y apagan a alta frecuencia, conocida como frecuencia portadora. La mayoría de los transmisores utilizan una frecuencia portadora de 38 kHz, ya que es poco común en la naturaleza y puede distinguirse del ruido ambiental. Esto asegura que el receptor de infrarrojos reconozca que la señal de 38 kHz proviene del transmisor y no del entorno.

Recepción y demodulación

El receptor de infrarrojos actúa como los ojos del dispositivo receptor, diseñado específicamente para «ver» esta luz infrarroja. Cuando presionas un botón en tu control remoto, este emite un patrón específico de luz infrarroja. Cada botón envía un patrón diferente, como un lenguaje especial de luces que el receptor debe entender.

El receptor de infrarrojos, equipado con un fotodiodo o fototransistor sensible a la luz infrarroja, capta esta luz y la convierte en una señal eléctrica binaria (demodulación). Esta señal eléctrica es aún un poco confusa y débil, así que pasa por más componentes electrónicos dentro del receptor que la amplifican y la «traducen» en algo que el dispositivo pueda entender y actuar en consecuencia, como cambiar el canal en la televisión.

¿Cómo conectar el módulo KY-022 con Arduino?

Materiales

Estos son los materiales necesarios para implementar este ejemplo.

Una placa Arduino (Yo usaré Arduino UNO)
Un módulo KY-022
Cables
Una protoboard
Un ordenador con el IDE de Arduino instalado

Conexiones

En el siguiente esquema puedes ver cómo quedaría conectado el módulo con Arduino:

conexiones módulo KY-022 con Arduino

¿Cómo programar el módulo KY-022 con Arduino?

Vamos a implementar un sketch que nos servirá para mapear los botones de cualquier mando a distancia. Nos será útil en proyectos futuros y te ayudará a entender cómo funciona el módulo KY-022.

Después haremos una pequeña modificación en la función loop para encender y apagar el led integrado en la placa con el mando a distancia.

Librerías

Necesitamos instalar una librería en el IDE de Arduino para controlar el receptor infrarrojo del módulo. La librería se llama IRremote.

El proceso de instalación es muy sencillo. Abre el Library Manager de tu IDE pinchando en el icono con forma de libros del menú lateral izquierdo y escribe IRremote en el buscador. El primer resultado que aparece es la librería (IRremote by shirriff):

IRremote

Una vez la hayas localizado, selecciona la última versión (en el momento de escribir estas líneas es la 4.3.1) y pincha en el botón INSTALL. Comenzará la instalación automáticamente.

Si vas a usar una versión inferior a la 4.x, el sketch que haré posteriormente no te funcionará.

Una vez se complete la instalación, simplemente tienes que incluir la siguiente linea al inicio de tu sketch para poder utilizar la librería:

#include <IRremote.hpp>

Sketch

Vamos a utilizar el siguiente sketch.

//LIBRERÍA
#include <IRremote.hpp>

//DECLARACIONES
const byte KY022 = 2;

//CONFIGURACIÓN
void setup() {
  Serial.begin(9600);
  IrReceiver.begin(KY022, DISABLE_LED_FEEDBACK); 
  pinMode(LED_BUILTIN, OUTPUT);
}

//FUNCIÓN LOOP
void loop() {
  if (IrReceiver.decode()) {
    int data = IrReceiver.decodedIRData.decodedRawData;
    Serial.println(data);
/*
    switch (data) {
      case 128:
        digitalWrite(LED_BUILTIN, HIGH);
        break;
      case 129:
        digitalWrite(LED_BUILTIN, LOW);
        break;
    }
*/
    IrReceiver.resume();
  }
}

Como puedes ver, hay una parte comentada en la función loop. Por ahora vamos a ignorar esa parte y centrarnos en el resto del código. Al final descomentaremos esa parte y veremos para qué sirve.

Declaraciones

Solo tenemos que declarar una constante para identificar el pin digital en el que hemos conectado la salida del módulo. En mi caso es el pin 2 y la he llamado KY022:

const byte KY022 = 2;

Utilizo el tipo byte porque ocupa menos que int. Pero puedes usar int si lo prefieres.

Configuración

Dentro de la función setup(), lo primero que vamos a hacer es inicializar el puerto serie. Usaremos el monitor serie para comprobar los valores recibimos del mando a distancia por cada botón:

Serial.begin(9600);

Debemos iniciar la recepción IR del módulo, para eso utilizamos el método begin() de la clase IrReceiver definida en la librería:

IrReceiver.begin(KY022, DISABLE_LED_FEEDBACK); 

El primer parámetro que pasamos a begin() es el pin digital en el que hemos conectado el receptor IR. Por eso paso la constante KY022.

El segundo parámetro nos permite indicar si queremos habilitar o deshabilitar el led integrado en la placa como indicador de recepción. Lo podemos activar con la constante ENABLE_LED_FEEDBACK. En este caso el led se enciende cada vez que el receptor IR recibe algo. Por el contrario, lo podemos desactivar con DISABLE_LED_FEEDBACK. En este caso el led no se asocia a la recepción y queda libre para usarlo con otro fin.

En nuestro caso, vamos a desactivarlo para poder usar posteriormente el led para otra cosa que ya veremos.

Y lo último, es configurar el pin 13 como salida para que podamos encender y apagar el led de la placa:

pinMode(LED_BUILTIN, OUTPUT);

Utiliza la constate LED_BUILTIN para que funcione en cualquier placa, aunque el led esté conectado a cualquier otro pin que no sea el 13.

Para esta primera versión esta última instrucción no la necesitamos, pero cuando descomentemos el código de la función loop si será necesaria.

Función loop

Como ya mencioné antes, vamos a ignorar, por ahora, el código comentado. Por lo tanto, la función loop() queda así:

void loop() {
  if (IrReceiver.decode()) {
    int data = IrReceiver.decodedIRData.decodedRawData;
    Serial.println(data);
    IrReceiver.resume();
  }
}

Decodificación

Con la instrucción if lo que hacemos es comprobar si se recibe un dato a través del receptor IR. El método decode() de la clase IrReceiver es el encargado de recepcionar y decodificar el dato:

if (IrReceiver.decode())

El resultado de la decodificación queda almacenado en una estructura interna llamada decodedIRData. Esta estructura almacena bastante información sobre el dato recibido, como el protocolo del mando, la tecla pulsada, etc.

Cuando se recibe un dato, la condición de la instrucción if se cumple y se ejecutan las 3 instrucciones entre llaves.

Valor de un botón

La primera instrucción nos permite discriminar el dato con el que queremos trabajar de entre toda la información que se ha recibido y se ha almacenado en decodedIRData:

int data = IrReceiver.decodedIRData.decodedRawData;

El valor que contiene decodedRawData será diferente para cada botón presionado en el mando, por lo que es un campo interesante para identificar la operación que vamos a realizar.

Otra opción es usar command, puesto que también es diferente por cada botón:

int data = IrReceiver.decodedIRData.command;

Haz la prueba con los dos y elige el que prefieras.

Una vez que tenemos el dato que nos interesa guardado en la variable data, lo vamos a mostrar en el monitor serie para poder asociar a cada botón del mando su valor correcto e interpretarlo posteriormente:

Serial.println(data);

Reiniciar receptor IR

Y por último, la tercera instrucción deja el receptor IR preparado para la siguiente recepción:

IrReceiver.resume();

Recuerda que todo este código está dentro de la función loop(), por lo que el receptor IR detectará cada nueva pulsación.

Ejecución

Vamos a hacer una primera prueba. Carga el sketch en tu Arduino y abre el monitor serie. Vamos a analizar los datos que recibimos por cada botón numérico del mando. Puedes probar con todos los botones si quieres, pero para lo que vamos a hacer después, con los numéricos nos sirve.

En el monitor serie verás algo como esto:

Salen duplicados porque la función loop() se repite más rápido que lo que tardo yo en pulsar y soltar cada botón. Si quieres puedes poner un delay(300) antes de IrReceiver.resume() para evitar esto, pero no nos afecta para lo que vamos a hacer.

Cada vez que presiones un botón fíjate en el valor que aparece en el monitor serie. Cada botón tendrá el suyo propio.

En mi caso, estoy usando un mando SONY, y los valores que recibo para los botones numéricos son los siguientes:

BotónValor recibido
0128
1129
2130
3131
4132
5133
6134
7135
8136
9137

Si usas un mando con otro protocolo los valores probablemente sean otros.

Controlar el led con el mando a distancia

Ha llegado el momento de descomentar el código de la función principal:

if (IrReceiver.decode()) {
    int data = IrReceiver.decodedIRData.decodedRawData;
    Serial.println(data);

    switch (data) {
      case 128:
        digitalWrite(LED_BUILTIN, HIGH);
        break;
      case 129:
        digitalWrite(LED_BUILTIN, LOW);
        break;
    }

    IrReceiver.resume();
}

Se trata de un bloque switch:

switch (data) {
    case 128:
      digitalWrite(LED_BUILTIN, HIGH);
      break;
    case 129:
      digitalWrite(LED_BUILTIN, LOW);
      break;
}

Este bloque de código nos permite asociar acciones a los distintos botones del mando a distancia. Como puedes ver, el dato evaluado por la instrucción switch es la variable data, en la que habíamos guardado anteriormente el valor correspondiente al botón pulsado.

switch (data)

Cada case dentro del switch es un botón. Para simplificar vamos a usar solo 2, pero si quieres utilizar más para asociar otras acciones solo tienes que añadir un nuevo case por cada uno.

Fíjate que al lado del case tenemos que poner el valor del botón que mapeamos anteriormente. En mi caso el botón 1 tenía valor 128 y el botón 2 tenía valor 129:

switch (data) {
    case 128: //botón 1
      ...
      break;
    case 129: //botón 2
      ...
      break;
}

Sustituye los valores 128 y 129 por los que hayas obtenido tú en el ejemplo anterior.

Ya solo nos falta definir qué hará cada botón.

Botón 1

El botón 1 será el encargado de encender el led:

case 128:
    digitalWrite(LED_BUILTIN, HIGH);
    break;

Solo tenemos que incluir la instrucción digitalWrite(LED_BUILTIN, HIGH) entre el case y break correspondiente.

Botón 2

Y el botón 2 será el responsable de apagarlo:

case 129:
    digitalWrite(LED_BUILTIN, LOW);
    break;

Es exactamente lo mismo que el caso anterior, pero enviando LOW para apagar el led.

Cárgalo ahora en tu Arduino y han una prueba con estos 2 botones. Comprueba que el led de la placa se enciende con el primero y se apaga con el segundo.

Videotutorial

Aquí te dejo el tutorial completo en vídeo para que puedas repasarlo todas las veces que quieras.


Te avisaré cuando publique nuevo contenido en paraarduino.com y en mi canal de YouTube (@ParaArduino).

No hemos podido validar tu suscripción.
¡Se ha realizado tu suscripción!

Newsletter

Suscríbete para que te avise cuando publique nuevo contenido.

Usamos Brevo como plataforma de marketing. Al hacer clic a continuación para enviar este formulario, consiente que la información proporcionada sea transferida a Brevo para su procesamiento de acuerdo con sus términos de uso