miércoles, 20 de marzo de 2013

Control de LEDs RGB por SPI

.. adornos navideños muy caros ...

Buenas tardes, en el post de hoy os traigo una primera aproximación a un proyecto que estoy preparando para el curro. No desvelaré la finalidad del proyecto hasta que esté terminado. Básicamente se trata de controlar LEDs de tipo RGB desde el RaspberryPi (nada alarmante), de forma rápida (nada alarmante) y siendo entre 50 y 100 LEDs ( ... oh my God!). Veamos como he solucionado la papeleta.

El problema


controlar 50 LEDs RGB, que además van a estar repartidos por una sala de más de 100 metros cuadrados, es un problema. Primero porque cada uno tiene 3 colores, por lo que en realidad estamos hablando de 150 LEDs. Si queremos 100 LEDs ... que alguien lo multiplique por 3.

Posibles soluciones

en lo primero que pensé fue en usar Arduinos, controlados desde el RaspberryPi. Se plantea el problema de que un Arduino, es capaz de controlar individualmente 30 LEDs RGB, así que usaríamos 3 de ellos. Tirar 4 cables por LED por toda la sala, para acabar con una marabunta de 4x30x3 cables, hacen 720 cables, con sus 720x2 conexiones, a una media de 10 metros por cable ... una barbaridá.

Después de pensar en eso, me dijo el Borreguero "ni de coña 3 Arduinos, uno y da gracias". Así que me puse a investigar sobre como multiplexar, pero es muy complicado y tampoco solucionamos mucho.

A continuación me fijé en las tiras de LEDs RGB, que usan conexión serie para hablar a todos los leds con solo 2 hilos. 2 hilos + 1 Arduino +  RaspberryPi = buena solución. Seguí mirando por ahí y me acordé de esto: http://learn.adafruit.com/light-painting-with-raspberry-pi/overview

Solución adoptada

Fiándome de las buenas personas de este mundo, de la gente Adafruit y de mis no-conocimientos en electrónica, he decidido que la mejor solución es: 1 tira de LEDs RGB ws2801 y RaspberryPi

Materiales

Me he decantado por esta tira de LEDs:
http://www.deskontrol.net/en/rgb-led-pixels-spi/31-spi-digital-led-pixel-module-12-mm-driver-ws2801-50-units.html
No es lo que se dice la más barata, pero está en España y el envío ha sido muy rápido. Si no os importa esperar, hay webs chinas que tienen una "parecida" al 50% de ese precio.
El resto de materiales son mi RaspberryPi y esta fuente de alimentación, en la misma web:

http://www.deskontrol.net/en/power-supplies/74-switch-mode-power-supply-50w-5v-10a.html

Instalación física

El cableado es bastante sencillo, además gracias a la fuente de alimentación, me ahorro tener que alimentar el RaspberryPi por el microusb, basta con meterle 5V al GPIO de 5V y no olvidarse del GRND. En el enlace que puse al princpio teneis el ejemplo de conexión:
Como ya os digo, superfácil. Eso si, ten cuidado con alimentar tambien por USB al Raspberry, necesitas tener una sola tierra para Raspberry y la tira de leds, para evitar complicaciones. Aprovechando mi regalo del día de los enamorados, me ahorro bastante cableado:
En la foto de arriba puede apreciarse el difusor de luz superhightech diseñado por mi ... es una pelota de ping-pong


Este es un video, más que nada para que veais una curiosidad. Sin tener cargados los drivers, sólo conectado, puedes usar un poco de mágia para encender el primer led ;)
Por probar que todo va bien, necesitamos tener instalado WiringPi y PixelPi, este es el resultado:

Muy bonito, con las librerías y ejemplos de PixelPi se pueden hacer muchas cosas, pero la que quiero, justo esa, no se puede. Necesito controlar los leds uno a uno.

Controlando los leds uno a uno y vía web

Para no saturar más el Raspberry, voy a montarme mi propio servidor web (menuda fardada) /usr/local/bin/bash-http-pixel.sh :
http://pastebin.com/ef8b0Wfe
fááááááácil fácil fácil, ahora lo ponemos en marcha:
gpio load spi
/bin/bash /usr/local/bin/bash-http-pixel.sh
y en un navegador abrimos la web http://192.168.1.33:8080/pixel/reset y este es el resultado:
Reset ... ¿que esperabais? Ahora probamos abrir esta otra http://192.168.1.33:8080/pixel/1/3 :

Oooooh que bonito!. La forma de usarla, que seguro que ya te as dado cuenta es:
http://192.168.1.33:8080/pixel/PIXEL_A_CONTROLAR/COLOR
El pixel lo númeramos de 1 a 50 y el color de 0 a 7, por ejemplo http://192.168.33:8080/pixel/10/2 :
y el último pixel con http://192.168.1.33:8080/pixel/50/5 :
Que cosa más bonita. Eso es todo, no esta libre de fallos, ya los iré arreglando, pero con esto tengo contentas a mis neuronas por ahora. Ahora toca pela, corta y empalma, ya os enseñaré el resultado ;)
... y por favor, no vayáis a usar esto para adornar el árbol de navidad, mejor vais al chino del barrio, que por 5 pavos te pillas 300 leds.

9 comentarios:

  1. Muy pero que muy interesante!! Estoy mas verde que una cebolla en tema de terminal, comandos... Algún sitio recomendado para inexpertos con info de pixelpi?? mil gracias!!

    ResponderEliminar
    Respuestas
    1. tienes el enlace de lightpainting de Adafruit un poco mas arriba. Pero mas allá de la curiosidad, a estas cosas hay que buscarles una utilidad. Con suerte en menos de un mes os pondré unas fotillos de la implantación.

      Eliminar
  2. Pues creo que vas a montar un sistema de amblilight para la tele, ¿es así?

    ResponderEliminar
    Respuestas
    1. no hombre, eso ya esta inventado, busca por "raspberry pi ambilight", se usan los mismos leds, pero con una librería preparada para xbmc.

      Eliminar
  3. Buenas tardes Juan, quisiera saber cual es la distribución mas adecuada para empezar con la Raspberry.
    Gracias por tu ayuda.

    ResponderEliminar
    Respuestas
    1. hola anónimo, te recomiendo raspbian, sacaron la última imagen no hace mucho.

      Eliminar
  4. Respuestas
    1. acepto donaciones de material electrónico "integrable" con RaspberryPi ... por si acaso ... con su correspondiente review en el blog ;)

      Eliminar
  5. Hola!

    Tengo una preguntilla... tengo pensado conectar una tira bastante larga (digamos que serían varias tiras unidas entre si) a la Raspi; veo que tú usaste una fuente para alimentar a la vez la Raspi y los LED.

    Siendo que tengo que alimentar, aprox., unos 3-4 metros de tira LED... ¿Crees que habría algún problema?

    Gracias!

    ResponderEliminar