Arduino RGB led manejado por control remoto

Aprovechando el post anterior, vamos a añadir al circuito un receptor de infrarrojos de manera que podamos variar el color y el brillo del led con un mando a distancia de Dealextreme que viene perfecto para el proyecto. El mando en cuestión el el SKU: 47019, es un mando muy barato que viene con pila incluida :
Mando infrarrojo remoto RGB

Para conseguir que el Arduino lo detecte, utilizaremos un receptor infrarrojo del tipo TSOP 1738 o similar (en mi caso tengo un 1736 y funciona igualmente a pesar de que el mando utiliza una portadora de 38KHz).

El led RGB de 5W (Dealextreme)

El led RGB de 5W (Dealextreme)


El esquema es el siguiente:
Led RGB controlado por IR remoto con Arduino

 Y el montaje queda de esta manera:

Led RGB controlado por IR remoto con Arduino

Ahora necesitamos la librería IRRemote , que permite leer los códigos de multitud de mandos a distancia. En particular funciona perfectamente con nuestro mando (que utiliza el protocolo de NEC).
Debemos descargar la librería  e instalarla en nuesto entorno de Arduino.

Puedes descargar el código de:
https://github.com/arduino-guay/Blog/tree/master/RGBLed_remote

¡Cuidado!: La librería IRremote utiliza internamente el TIMER2 del Arduino.Esto hace que las salidas 11 y 3 no funcionen como PWM (por eso he cambiado el led verde a la salida 6). Por otro lado hay una versión más nueva de la librería IRremote , que reconoce bastantes protocolos más de códigos infrarrojos, pero al parecer después de varias pulsaciones los códigos obtenidos parecen aleatorios ....¿?.Puede serviros para soportar otros mandos a distancia o para otros proyectos.
Para obtener las constantes, he utilizado el ejemplo que viene con la librería 'IRrecvDemo', que permite mostrar en la consola los códigos enviados por cada botón del mando.
Esto mismo es válido si se desea utilizar otro mando a distancia distinto.

Aquí dejo un vídeo del invento funcionando:



Si te ha gustado, recuerda compartirlo en tu red social favorita. Gracias

24 comentarios:

  1. Muy bueno. Gracias!

    ResponderEliminar
  2. HOLA, VEO QUE USA UN LONG SIN SIGNO, OSEA 32BITS, PARA ALMACENAR AL HEX. Y LOS MISMO PARA DECODIFICAR AL COLOR RGB.unsigned long valor.:

    EN TEMA DE EFICIENCIA DE ESPACIO DE LA MEMORIA ES ¿LO MEJOR, SE PODRIA AJUSTAR MAS EL TIPO DE DATO QUE SE USA??, SI ES ASI, COMO SERIA PARA DECOFICAR
    LOS VALORES RGB?

    ResponderEliminar
  3. @Omnimusha
    En realidad, la variable rgb (unsigned long), al final no se utiliza :-(.
    En la función RGB, se utiliza por comodidad, pero se podrían pasar los valores de r,g y b como tres bytes, es decir en vez de RGB(0x00FFAA00), sería RGB(FF,AA,00), pero no creo que esto afecte a la eficiencia de la memoria, sólo ahorrarás un byte.

    ResponderEliminar
  4. xq a mi no me sale como puedes ayudarme o como te contacto

    ResponderEliminar
  5. Es posible realizar este proceso mediante un control de alarma marca Thunder Power tengo unas luces instalas en mi moto y quisiera manejarlas a control remoto, me podrias mandar los pasos y las explicaciones a mi correo carlosf0424@hotmail.com mil gracias por su aporte.

    ResponderEliminar
  6. Usando Arduino 1.0.5 y habiendo cargado la libreria, me da error al compilar:
    In file included from /Users/Alejandro/Documents/Arduino/libraries/IRremote/IRremote.cpp:13:
    /Users/Alejandro/Documents/Arduino/libraries/IRremote/IRremoteInt.h:87: error: 'uint8_t' does not name a type
    /Users/Alejandro/Documents/Arduino/libraries/IRremote/IRremoteInt.h:88: error: 'uint8_t' does not name a type
    /Users/Alejandro/Documents/Arduino/libraries/IRremote/IRremoteInt.h:89
    ...

    ResponderEliminar
  7. @Alejandro Gomez Cabrero
    Puedes encontrar la solución aquí: IR remote library error: uint8_t does not name a type.
    Básicamente hay que cambiar
    #include <WProgram.h>
    por
    #include <Arduino.h>

    el la cabecera "IRRemoteInt.h"
    Esto es debido a un cambio en la versión 1.0 del ide de Arduino.

    ResponderEliminar
  8. Eso ya lo hice y sigue dando el mismo fallo, el de uint8_t, parece no encontrar donde esta declarado. Si necesitas algun dato mas y puedes ayudarme, te lo agradeceria.

    Gracias de antemano.
    Saludos

    ResponderEliminar
  9. Buenos días:

    He estado unos días desconectado por motivos laborales.
    Bien, ya consegui que cargase, el problema era que al usar MAC, las librerias no las guarda dentro de las carpetas del programa en si sino en mis documentos.
    Ahora, pasando a otra pregunta:
    Estoy intentando implementar el efecto Rainbow dentro del codigo de manejo por control remoto, pero me surge un problema:
    Solo realiza un ciclo del bucle como esperaba, ya que no puedo llamar un loop dentro de un loop, porque mientras durase el loop del caso Rainbow, no podria recibir la orden IR a la vez.
    He pensado sacar fuera del loop esa funcion pero no se me ocurre ninguna forma de que mientras esta activo el efecto Rainbow (en bucle), pueda estar a la espera de la orden IR siguiente.

    Saludos y gracias de antemano

    ResponderEliminar
  10. @Alejandro Gomez C.
    Se me ocurre sacar la llamada a la librería IR fuera del bucle para poder llamarla en el bucle del método rainbow.
    Si durante el bucle del rainbow se detecta un código, se sale del bucle y vuelve al principal.
    Algo así: (ojo, no lo he probado es un esquema)

    #DEFINE NULO 0xFFFFFFFF
    // Código recivido
    uint32_t irCode = NULO;

    // Método para la obtención del códifo
    uint32_t valorIR () {
    decode_results irResult;
    uint32_t valor = NULO;

    if (irrecv.decode(&irResult)) {
    valor = irResult.value;
    }
    irrecv.resume();
    return valor;
    }

    // Método rainbow
    uint32_t rainbow () {
    uint32_t irPulsado;
    for (...) {
    // Código del efecto rainbow
    .......
    // En cada iteración comprobamos
    irPulsado = valorIR ();
    if ( irPulsado != NULO) {
    // Si hay algún código lo devolvemos y salimos del efecto
    return irPulsado;
    }
    }
    return NULO;
    }

    void loop() {
    uint32_t detectado = NULO;

    if ( irCode != NULO) {
    switch (irCode) {
    case BRIGHTNESS_UP :
    ....
    break;
    case RAINBOW :
    // Guaradamos el valro devuelto
    detectado = rainbow;
    break;
    .......
    analogWrite(G_PIN,g);
    analogWrite(B_PIN,b);
    }
    }
    // Si hay algun valor lo utilizamos como prósimo código
    if ( detectado == NULO ) {
    irCode = valorIR ();
    } else {
    irCode = detectado;
    }
    }

    ResponderEliminar
  11. Bien, vamos a empezar a ver que podemos compilar y que nos sale, gracias por la idea, antes de esto hice algunas pruebas, pero claro en cuanto entraba la secuencia rainbow tenia que esperar a finalizar la misma para continuar el bucle y poder recibir otra orden y cambiar la secuencia.
    Saludos

    ResponderEliminar
  12. muito bom seu codigo.

    pretendo implementar as funções de flash e outras que não implementastes. me ajudou a fazer um projeto que tinha faz tempo. um abraço Joao scheffer

    ResponderEliminar
  13. @Anónimo
    Muito obrigado
    Fico feliz que você tenha servido

    ResponderEliminar
  14. alguien sabe de un link para manejar lcd tactil,camara y grps arduino

    ResponderEliminar
  15. hola una pregunta este proyecto se debe de realizar con esta tarjeta...
    Arduino UNO Rev3...> http://store.arduino.cc/product/A000066

    ResponderEliminar
  16. @Carlos Arturo Rebollo Campos
    Bueno en realidad no es necesario que sea esa, la mayoría de modelos de Arduino pueden funcionar Uno, Leonardo, Mega, Micro, Mini, Pro Mini ... Tal vez el DUE que tiene un procesador distinto puede tener problemas con la librería IRRemote ... cuestión de ver la documentación.

    ResponderEliminar
  17. ¡Buen proyecto!
    ¡Felicitaciones!
    Una pregunta: las funciones FLASH, STROBE, FADE, SMOOTH no se encuentran en el programa.
    ¿Vas a añadir las?

    ResponderEliminar
  18. Hola! Buen proyecto!. Las funciones FLASH FADE STROBE SMOOOTH como se podrian agregar ya que si las pongo en un void me queda en ese bucle y no lo puedo hacer salir jaja gracias!

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.