Artículos recientes

Novedades

Tutorial Arduino y control remoto Infrarrojo

Tutorial Arduino y control remoto Infrarrojo

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

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 <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) {
  // 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

34 Comments

    • Avatar
      Arturo
      ago 25, 2016

      Disculpa amigo muy buen post pero una pregunta como puedo colocar 4 receptores infrarrojos al mismo arduino necesiti hacer una aplicación a si te agradecería me podrías orientar gracias.

      • Avatar
        Naylamp
        ago 26, 2016

        Hola Arturo, no veo la necesidad de poner más receptores al mismo arduino si todos van a recibir la misma señal, salvo intentes ponerlo en diferentes posiciones para ganar más ángulo de recepción. Intenta crear diferentes objetos para cada receptor, por ejemplo para un segundo receptor: IRrecv irrecv2(10); decode_results results2;

    • Avatar
      EDERSON
      nov 12, 2016

      Hola amigo disculpa. para compilar no me compila, me puede enviarme la libreria exato . Ya lo agregue la liberia y igual no me compila muy bien, como haría en ese caso.espero su respuesta muchas gracias.

      • Avatar
        Naylamp
        nov 16, 2016

        Hola Ederson, La librería con la que se trabajó el tutorial es la que se muestra en el link. Intenta instalar nuevamente la libraría, si el error persiste prueba compilando los ejemplos que trae la librería, si en esos ejemplos también tienes errores entonces intenta actualizar tu IDE arduino.

    • Avatar
      lola
      ene 24, 2017

      ve vales carpeta mi Arduino se quemó.

    • Avatar
      Arturo
      mar 14, 2017

      Hola Naylamp. Me hace falta visualizar los códigos hex de los botones de un mando IR en una pantalla LCD. Luego tengo que hacer un emisor con Arduino para que, con un pulsador, actúe como mando. Puedes ayudarme? Muchas gracias y enhorabuena por tu página.

      • Avatar
        Naylamp
        mar 18, 2017

        Hola Arturo, Para mostrar los datos en un LCD puedes usar la función: lcd.setCursor(0,0); lcd.print(results.value); puedes guiarte de nuestro tutorial LCD. Para el mando puedes guiarte de los ejemplos que tienen la librería, básicamente se usa la función: irsend.sendSony(0xa90, 12); donde 0xa90 es el código y 12 es el tamaño en bits.

    • Avatar
      Francini
      jun 24, 2017

      Buenas, vieras que no me acepta el: (RECV_PIN) porque? que puedo hacer?

      • Avatar
        qa345ryg
        sep 30, 2019

        a34yttfth6udtry5tyjd6udtue6ue5

    • Avatar
      victor hugo
      sep 2, 2017

      Hola Neylamp Disculpe una ayuda, quiero q al mantener presionado un boton del control se quede encendido un led y al dejar de presionarlo se apague me podría ayudar con la codificación x fa

    • Avatar
      Eduardo Caporale
      oct 19, 2017

      Muchas gracias Naylamp, muy bien explicado, tengo una duda con el operador “ ? “, que está escrito en el primer sketch. digitalWrite(13, on? HIGH : LOW); Me doy cuenta que el pin 13 adquiere el valor Booleano que tiene la variable on, pero lo que sigue ? HIGH : LOW); nunca vi esa opción y puede estar practica para usarla. Un cordial saludo desde Mar del Plata, Argentina.

    • Avatar
      kevin
      feb 1, 2018

      hola amigo queria preguntarte si ese modulo receptor de infrarojo me puede servir para trabajar dentro de una camara de frio a -20 grados centigrados.

    • Avatar
      Luis Patiño
      feb 18, 2018

      Buenas tardes, compre una bocina o torre de sonido marca kalley, este viene con micrófonos, pero no trae sensor o inflarojo para control remoto, hay la posibilidad de puerto USB o algo que permita manejarlo desde control remoto, muchas gracias

      • Avatar
        Emanuel
        oct 1, 2018

        Mira, de poder hacerse es posible pero de lsnforma he se me ocurrió es un poco complicada ya que con este tutorial podrías lograr la coneccion infraroja pero luego deberías buscar la forma de unir el circuito implementado con Arduino a la lógica que tiene el tablero de mando del equipo, lo que se.me ocurre es que busques conectar puertos de salida del Arduino a los pulsadores que están en el equipo y con lógica podrías lograr algo similar a lo que quieres no es tan fácil ya que deberías considerar las tensiones que maneja el circuito del tablero con el que le vas a brindar desde el Arduino para no quemar nada. Espero que se entienda la idea

    • Avatar
      Pery
      oct 24, 2018

      Hola, hice todo los pasos co material Chino y va perfectamente, sin ningun problema , gracias.

      • Avatar
        George
        oct 17, 2019

        Y que referencia de sensor ir usaste?

    • Avatar
      Emiliano
      oct 29, 2018

      Muy buena info! Te hago una consulta, yo necesito consultar la temperatura del aire acondicionado, ¿ Supongo que yo podría enviarle un comando al equipo a través de un led infrarrojo y luego leer la respuesta en el sensor? Estoy bien rumbeado?

    • Avatar
      Jesus Manzano
      nov 2, 2018

      Genial, muy útiles los programas tanto de detecciones de IR como para usarlos con el switch case.Mil Gracias.

    • Avatar
      John Garcia
      nov 21, 2018

      Super genial la información. Sin embargo, estoy tratando de capturar el codigo de un control remoto de un aire, pero no he podido capturar la cantidad de bits. (0 bits)FFFFFFFF. Que puede estar pasando. Desde gracias por la ayuda

      • Avatar
        Sejio
        abr 14, 2019

        A mi me sucede lo mismo porque??

    • Avatar
      Miguel Conesa
      dic 30, 2018

      Hola .. Muy correcto el articulo ¡ gracias ¡ Antes de terminar un circuito impreso con una entrada IR y con placa Arduino Mega , ? no habrá problema con la entrada 11 de esta placa ? ¿ sirven todas la entradas ? Gracias

    • Avatar
      ariel
      dic 30, 2018

      excelente

    • Avatar
      Jorge Reyes
      mar 5, 2019

      BUENAS TARDES, DISCULPA SE PUEDE UTILIZAR EL INFRARROJO COMO IDENTIFICADOR?....POR EJEMPLO, QUIERO HACER UN PROYECTO EN EL QUE USARE VARIOS SERVOMOTORES. LOS SERVOMOTORES SERAN UTILIZADOR COMO CERRADURAS, PERO PARA QUE SE ACTIVE EL MOTOR TENDRE QUE REALIZAR UNA CONEXION AL ARDUINO, PERO ESTE DEBE VALIDAR MEDIANTE UN ID SI EL MOTOR ESTA REGISTRADO. SOLO ENTONCES LE PERMITIRA ACTIVARLO. ES POSIBLE HACER ESTO?

    • Avatar
      Oscar
      jul 14, 2019

      Saludos cordiales... funcionará también para un control remoto de proyectores (específicamente de la marca EPSON modelo POWERLITE)? sé que también tiene su protocolo pero ¿se podría detectar los códigos con estos programas?

    • Avatar
      Jorge Reyes
      jul 29, 2019

      Los servocontroles son muy facil de controlar si ya has trabajado con ellos, en el caso de la domotica, yo use arduinos y servomotores para hacer un cerrojo bluethoot. A si que supongo que en vez de que reciba una señal por el doongle, la recibira del ir, por lo que, con que hayas escrito bien el codigo, no veo por que no deberia de funcionar. Suerte

    • Avatar
      Agustin
      nov 8, 2019

      Hola, como se podría hacer para identificar combinaciones de numeros? Es decir apretar 1 y 7 y que identifique el 17 y no los 2 por separado. Se podría hacer estableciendo algún especie de timer entre que se presiona una tecla y la identifica, para que de el tiempo para presionar ambas? Gracias

    • Avatar
      Maikel
      nov 10, 2019

      Como puedo activar los comandos desde el puerto serie, como si fuera el mando saludos

    • Avatar
      Luis Miguel Lopez
      nov 30, 2019

      buenos dias compañerosmi pregunta es como puedo realizar el encendido de una smart tv samsung pero de forma automatica, soy nuevo usando Arduino y me gustaria saber si me pueden ayudar.ante de todo un cordial saludo

      • Avatar
        Hugo Santos
        ene 7, 2020

        Podrías primero con el segundo script, "aprender" el comando de encendido, con un real Time Clock, programar el horario y usar un emisor infrarrojo para retransmitir el código.

    • Avatar
      narciso doble guitarra
      ene 28, 2020

      tenemos un problema con el mando, vamos a por vosotros, se donde estaisNaylamp Mechatronics SAC., Almacén: Mz. E Lote 31 Urb. Ingeniería, Trujillo - Perú //// Horario de atención: Lun. a Vie: 10am-7pm. Sab: 10am-6pm. adjunto mi sites guarro: uyafvwtfvefdfcSaludos desde el salvador

    • Avatar
      Setup
      feb 6, 2020

      En Setup() inicializamos la recepción de datos con irrecv.enableIRIn() y configuramos el pin 13 como salida. Game moto x3m

    • Avatar
      Victor
      feb 6, 2020

      Hola muchas gracias por tus códigos pero tengo un problema al decodificar la señal infrarroja, quiero controlar un aire acondicionado (PANASONIC de 48 bits) me pone que el codigo es muy largo y no puedo almacenarlo, se que tiene algo que ver con el RAW, pero de momento no encuentro solucion por favor ayuda

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment: