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:
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 } }