Mando a distancia (IR)

Hace mucho me puse a trabajar en ésto, pero por errores que me daba la librería, la versión del IDE, y tras probar mil veces, lo dejé pasar. Pero ahora he encontrado la forma de que funcione. Vamos a manejar el arduino con un mando a distancia.

Para demostrar cómo funciona (las aplicaciones las dejamos a vuestra imaginación) usaremos unos LEDs.

En primer lugar, es necesario tener la librería. Hay varias, una llamada NECIRrcv (con el protocolo NEC), y otra que es IRremote, al parecer sin ningún tipo de descodificación. Ésta última es la que usaremos, la única que he conseguido que funcione. Podréis descargarla aquí. Tenéis que descomprimirla y pegar la carpeta IRremote en el directorio Program Files (Archivos de programa) / Arduino / libraries. Tras hacer ésto y abrir el Arduino IDE, aparecerá en Ejemplos.

Ahora vamos a proceder a conocer nuestro mando a distancia. Con mi pack de Arduino recibí uno como éstos:

Que venía acompañado por un receptor de IR:

Lo que nos interesa ahora es, cuando pulsamos un botón del mando ¿Qué código envía al receptor? Para ello utilizaremos un simple circuito de 3 cables y un programa que lea lo que recibe y lo envíe mediante puerto Serial al Monitor Serial.

Visto desde ésta perspectiva el receptor, la patilla de la izquierda es la transmisora de datos, la central es GND y la derecha del todo la de alimentación. Dicho con Paint:

receptorir

 

Simplemente hay que hacer  la conexión debida de alimentación (no necesita resistencia) y poner Datos en un pin de arduino que podamos configurar como entrada, en mi caso está en el pin 11.

Ahora cargamos el sketch:

 

#include 
int IRpin = 11
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}

Cuando se cargue el programa, abrís el Monitor Serial y apretáis botones del mando. Veréis que para cada botón corresponde un número diferente, anotadlo. Por ejemplo, mis números son:

 

// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245

Otros mandos, como los de Sony, tienen números “más amigables”, del orden de 1000-4000. Ahora que ya tenéis los códigos, sólo es necesario modificar el programa inicial para que lleve a cabo unas acciones, por ejemplo, encender y apagar unos LED:

 

#include 
// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245
int IRpin = 11, L1 = 3, L2= 4, L3=5;
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  pinMode(L1,OUTPUT);
  pinMode(L2,OUTPUT);
  pinMode(L3,OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  
}

void digitalSwitch(char PIN){
  if(digitalRead(PIN)==1) digitalWrite(PIN,LOW);
  else digitalWrite(PIN,HIGH);
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      if(results.value==16724175) digitalSwitch(L1);
      if(results.value==16718055) digitalSwitch(L2);
      if(results.value==16743045) digitalSwitch(L3);
      if(results.value==16748655) i=i+15;
      if(results.value==16753245){
        digitalSwitch(L1);
        digitalSwitch(L2);
        digitalSwitch(L3);
      }
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}