martes, 19 de marzo de 2013

Control de LED via IR

En este pequeño tutorial controlaremos un LED con un viejo mando infrarojo que tenía de un TDT roto. Además aprovecharemos el receptor IR del mismo.

Materiales.
-Arduino. (UNO en este caso. Pero vale cualquiera).
-Mando a distancia del TDT.
-Un led.
-Una resitencia de 220 oms. Como no tengo uso de 470. Podriamos montar 2 resistencias de 470 en paralero para dar 239 oms pero paso.
-Una protoboard.
-Cables.
-Una ficha de la luz.
-Ordenador.
-Cable USB para conectar el arduino.


A currar.

Parte física.

1 Conectamos el pin positivo y negativo de la arduino al los carriles de la protoboard.







2 Conectamos el receptor IR a la protoboard. Los sensores IR tienen 3 cables. Uno da corriente, otro es masa y el tercero es de datos. En mi caso el rojo en corriente. El pelado es masa y el blanco es datos.
Como están los cables deshilachados los conecto a una ficha. Esta ficha la conecto con los pelos de los cables de red a la protoboard.
Naranja: Corriente.
Naranja/blanco: masa.
Azul: Datos.

Pongo una resitencia de 470 oms (mejor 220) entre los 5,5 voltios de arduino y el cable de corriente del receptor IR.
Conecto el cable de datos a la protoboard y con ello el pin 3 de la placa.





3 Conectamos el led.

Pinchamos el led en la protoboard y al pin 4 del arduino pero le ponemos una resitencia de 470 oms ente los 5,5 y el positivo del led (pata larga), el negativo lo conectamos a masa.



Software.

Instalando una librería nuevo en arduino.

Descargamos la librería de este página
https://github.com/shirriff/Arduino-IRremote

Y la descomprimimos en la carpeta donde intalamos arduino y dentro de "libraries"

Ahora entramos en la carpeta IRremote y abrimos con el block de notas el archivo "remoteint.h"
En ese archivo cambiamos la linea que pone

#include <WProgram.h>


Por

#include <Arduino.h>



Esto es porque la librería se creo hace mucho. Antes del sistema moderno de arduino.


Conectamos arduino a nuestro puerto USB del PC. Y colocamos el siguiente código.

//incluimos la librería de IR
#include <IRremote.h>
#include <IRremoteInt.h>

//poner IR en marcha
int RECV_PIN = 3; //Definimos el pin donde tiene que esta el IR
IRrecv irrecv(RECV_PIN);
decode_results results;

//declaramos variable
int ValorIR=0; //declramos variable almacen valor ir

//Preparamos el setup
void setup()
{
Serial.begin(9600); //Ponemos el puerto serie a 9600
irrecv.enableIRIn(); // el receptor ir en marcha
}

//definimos una función llamada "leerIR" esto nos ayuda a que en el futuro podamos reutilizarla.
//no tiene parámetros de entra y devuelve un INT
int leerIR(){
if (irrecv.decode(&results)) { // si recibe señal IR
    int lectura = results.value; //Guarda el valor de la señal en la variable lectura
    irrecv.resume(); // Recive siguiente valor IR
    Serial.println(lectura);
    return lectura; //devuelve lectura
}
}
void loop() {

  
  ValorIR=leerIR(); //asignamos a esa variable el valor que devuelve lerIR
}

Lo cargamos en arduino, abrimos el monitor serial y al pulsar un botón del mando a distancia nos dará un número diferente para cada tecla que pulsemos.

En mi caso la tecla 1 del mando a distancia da el código -9691. La 2 el -3571. El botón de arriba me da el 28815 y de de enter el 18615.

Quiero que el led se encienda cuando yo presione enter y se apague cuando lo vuelva a presionar.

Asi que cargamos el siguiente código en nuestro arduino

//incluimos la librería de IR
#include <IRremote.h>
#include <IRremoteInt.h>

//poner IR en marcha
int RECV_PIN = 3; //Definimos el pin donde tiene que esta el IR
IRrecv irrecv(RECV_PIN);
decode_results results;

//declaramos contante
int pinLed=4;

//declaramos variable
int ValorIR=0; //declramos variable almacen valor ir
int estadoLed=0;
//Preparamos el setup
void setup()
{
Serial.begin(9600); //Ponemos el puerto serie a 9600
irrecv.enableIRIn(); // el receptor ir en marcha
pinMode(pinLed, OUTPUT); //definimos el pin del led como de salida
}

//definimos una función llamada "leerIR" esto nos ayuda a que en el futuro podamos reutilizarla.
//no tiene parámetros de entra y devuelve un INT
int leerIR(){
if (irrecv.decode(&results)) { // si recibe señal IR
    int lectura = results.value; //Guarda el valor de la señal en la variable lectura
    irrecv.resume(); // Recive siguiente valor IR
    Serial.println(lectura);
    return lectura; //devuelve lectura
}
}
void loop() {

  
  ValorIR=leerIR(); //asignamos a esa variable el valor que devuelve lerIR
  if (ValorIR==18615){ //comprobamos el codigo recibido
    if (estadoLed==0){ //comprobamos si el led está encendido
      digitalWrite(pinLed,HIGH); //lo encendemos
      estadoLed=1; //marcamos como que está encendido
    }
    else{ //si no está apgado es que esta endendico
      digitalWrite(pinLed,LOW); //lo apagamo
      estadoLed=0; //marcamos como apagado
    }
  }
}
Y el resultado es el siguiente.





Evidentemente encender y apagar un led no es una cosa que sea muy meritoria. Pero hemos visto como capturar una tecla de un mando IR. Ahora la imaginación al poder.
¿Un juego de luces led de arbol de navidad que cambiemos con el mando de la tele?
¿Un coche controlado por IR)
¿Encender una luz, o cafetera, o riego eléctrico con un mando añadiendo un rele?
Esa será la siguiente entrega.

3 comentarios:

Unknown dijo...

el sketch de arduino esta mal , no se puede compilar da error

El predicador dijo...

El código es correcto. Tengo ese mismo código funcionando ahora mismo.

Unknown dijo...

Gracias por tu aporte. Me sirvio mucho.

Saludos y gracias