Tutorial Arduino y control remoto Infrarrojo Deja un comentario

En este tutorial usaremos un módulo sensor infrarrojo para recibir la señal de controles remotos IR que usan  muchos de los equipos domésticos como TVs, equipos de sonidos, etc. A través de estos controlaremos las salidas de nuestro Arduino.

Para este tutorial usaremos el siguiente sensor de Infrarrojos:

receptor Infrarrojo de control Remoto

Este sensor tiene un filtro interno para detectar solo frecuencias infrarrojos  cercanas a 38KHz, lo que lo hace compatible con la mayoría de mandos infrarrojos, posee 3 pines de conexión GND, VCC y DATA , el cual nos permite conectar directamente a un pin digital de nuestro Arduino o cualquier microcontrolador que deseemos usar.

Como mando usaremos uno que viene junto al sensor en el kit del mando infrarrojo

Control Remoto Infrarrojo

Este Mando usa el protocolo NEC que trabaja a 38KHz de frecuencia, el formato del tren de pulsos que envía al presionar una tecla se muestra en la siguiente gráfica:

Protocolo NEC

Lo particular de este protocolo es que envía doble vez tanto la dirección como el comando, de forma normal y negado, con esto posteriormente se puede validar los datos.

La dirección está asociada a un dispositivo, por ejemplo un TV, una equipo de sonido, un VCR, etc. Y el comando está asociado a la acción o función del botón. Por ejemplo subir el volumen, apagar, el número 1 o 2, etc.

Para este tutorial vamos a trabajar como si se tratase de un solo bloque de datos 32 bits.

A continuación se muestra los valores de los datos correspondientes a los botones del control en mención:

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

*Como se observa el dato está formado por la dirección, comando y sus negaciones, por ejemplo para la tecla OK: el dato de 32bits es 0x00FF02FD, donde la dirección es 00 y su negación FF, y el comando o función es 02 y su negación FD.

Control Remoto de TV

En este tutorial también se realizarán ejemplos usando mandos de TV, en particular usaremos un control remoto de un TV SONY

Control remoto Sony

EL protocolo SONY trabaja con una frecuencia de 40KHz, en la siguiente figura se muestra los pulsos que se envían cuando se presiona una botón

Protocolo SONY

Trabaja con 12 bits de datos , de los cuales 5bits son para la direccion y 7 bits para comando o funcion. Existen variaciones de 15 bits y 20 bit pero en todos los bits de comando son de 7 bits.

A continuación se muestra algunos de los datos correspondientes al 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

*Para convertir el dato de 12 bits en su dirección y comando se toma empezando desde el  bit menos significativo considerándolo de mayor peso.

Explicado lo anterior Implementemos ambos controles en Arduino.

Librería IR remote para Arduino

IRremote es una de las librerías más usadas y completas para trabajar con protocolos de controles infrarrojos, tiene implementado varios protocolos de las marcas más conocidas como Sony, LG, Samsung, Sanyo, etc

Pueden descargarlo y encontrar más información en: https://github.com/z3t0/Arduino-IRremote

Es necesario descargar e importarla a nuestro IDE Arduino para poder trabajar los ejemplos de este tutorial

Conexiones entre Arduino y modulo receptor IR

Las conexiones son simples el sensor tiene un pin VCC el cual se alimenta con 5V un pin GND y un pin de DATA, que es una salida digital el cual conectaremos al pin 11 del Arduino

Conexion IR remote ARduino

Empecemos con nuestros ejemplos:

Encendiendo un led con nuestro control Remoto.

En este ejemplo se encenderá y apagará el led del pin 13 con cualquier tecla de nuestro control remoto, incluso con cualquier control.

El código es el siguiente:

#include 

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);
}

Expliquemos un poco el código:
Con  IRrecv irrecv(RECV_PIN) creamos la variable u objeto para el receptor IR, en el pin especificado, luego creamos la variable result, que es una estructura en donde se guardaran todos los datos relacionados cuando se recibe un dato por sensor. En Setup() inicializamos la recepción de datos con  irrecv.enableIRIn() y configuramos el pin 13 como salida.
En el void loop() simplemente comprobamos si le llega un dato al receptor, esto lo hacemos con if(irrecv.decode(&results)), si hay un dato, encendemos o apagamos el LED.

Después de cargar el programa, al presionar cualquier tecla de cualquier control remoto, deberá encender o apagar el LED.

Decodificando datos de los controles infrarrojos.

En este ejemplo obtendremos los datos correspondientes a las teclas de los diferentes mandos infrarrojos.

El código es el siguiente:

#include 
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) {
  // Dumps out the decode_results structure.
  // Call this after 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);
}

El código anterior envía por el puerto serial los datos correspondientes a la tecla presionada.

A continuación se muestra los datos recibidos al presionar las teclas del control remoto que viene con el kit del sensor.

Datos protocolo NEC

Y si utilizamos el control remoto de SONY les debe mostrar valores similares al de la siguiente imagen:

Datos protocolo SONY

Con este programa podemos averiguar el valor del dato correspondiente a la tecla presionada, el mismo programa funciona para otras marcas de control remoto.

Controlar Pines digitales con control remoto por infrarrojos

Ahora que ya sabemos el valor del dato que corresponde a cada tecla, vamos a asociar una tecla a un pin digital y prender o pagar leds, que se podrían remplazar por cualquier otro actuador.

Para este ejemplo vamos a hacer las siguientes conexiones:

Conexion arduino leds y receptor IR

Implementemos el siguiente sketch:

#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: Serial.println("Tecla: 4");
                       digitalWrite(4, !digitalRead(4));
                       break;
      case 0x00FF18E7: Serial.println("Tecla: 5");
                       digitalWrite(5, !digitalRead(5));    
                       break;
      case 0x00FF7A85: Serial.println("Tecla: 6");
                       digitalWrite(6, !digitalRead(6));    
                       break;
      case 0x00FF10EF: Serial.println("Tecla: 7");
                       digitalWrite(7, !digitalRead(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);
}

Como se observa en el código solo comparamos el dato recibido del mando con los valores correspondientes a las teclas, si coinciden con el valor de la tecla, se realiza la acción correspondiente en el switch(), solo implementamos las teclas del 4 al 7 con leds, pero enviamos por el puerto serial una confirmación de cada tecla presionada.

A continuación se muestra el monitor serial después de presionar algunas teclas

Arduino y control remoto NEC

De igual manera se trabaja con el control remoto de SONY:

#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: Serial.println("Tecla: 4");
                       digitalWrite(4, !digitalRead(4));
                       break;
      case 0x210: Serial.println("Tecla: 5");
                       digitalWrite(5, !digitalRead(5));    
                       break;
      case 0xA10: Serial.println("Tecla: 6");
                       digitalWrite(6, !digitalRead(6));    
                       break;
      case 0x610: 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);
}
 

Arduino y control remoto SONY

Pueden adquirir los materiales usados en este tutorial en nuestra tienda

– Arduino Uno R3

– Control Remoto Infrarrojo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?