Árbol de Navidad Shield para Arduino

Árbol de Navidad Shield para Arduino con WS2812b

Llegan las Navidades, y nada más típico que montar un arbolito de Navidad para dar un poco de ambiente. Los hay de muchos tipos, pero este está pensado para los mas frikis, basado en leds RGB de última generación y pensado para 'plantarlo' sobre un Arduino.





El esquema no puede ser más simple: un Arduino, 20 leds direccionables WS2812b, unos cuantos condensadores de 100nF y un zumbador piezoeléctrico.

Esquema Árbol de Navidad Shield para Arduino con WS2812b


Los WS2812b se conectan en cascada a través de un único cable, con lo que la comunicación con Arduino es extremadamente sencilla, sólo un pin, los datos se van pasando de un circuito al siguiente, y esto permite que se pueda controlar cada led independientemente. Esto permite crear tiras o matrices de leds RGB más fácil que nunca.
El WS2812b, creo sin exagerar que es una auténtica joya. Internamente incluye los tres leds (R,G,B) y un circuito integrado WS2811, que es el encargado de manejar los datos pon un único pin, enviarlos al siguiente y controlar cada led con 256 niveles de intensidad.
Aquí os dejo un par de fotos que pude hacer al susodicho:


Árbol de Navidad Shield para Arduino con WS2812b

Imagen de WS2812b , WS2812, WS2811



¡Ojo! Hay otra versión el WS2812 igual al WS2812b pero con 6 pines, en la que la alimentación de los leds y del circuito van por separado.
Dado el boom que han tenido, es fácil encontrarlos en ebay, bien en tiras adhesivas dónde sólo hay que conectar el pin de entrada y la alimentación, o bien sueltos como es este caso.

Para el manejo del los leds, utilizo una estupenda librería: Adafruit neopixel, capaz de manejar de manera sencilla este tipo de leds.

El código

Como ya he comentado, utilizo la librería de Adafruit para controlar los leds. Básicamente es el ejemplo 'strandtest' de  la librería, al que he añadido una primera parte en la que se toca la melodía de 'Jingle Bells' utilizando la función tone, y algún efecto más.
Por si no se quiere oír constantemente la melodía, es necesario hacer un puente entre los pines 2 y 7 para que suene.

Este es el diseño del circuito impreso que he hecho:

PCB Árbol de Navidad Shield para Arduino con WS2812

Aunque teóricamente es necesario un condensador de desacoplo de 100 nF por cada led, yo he puesto unos cuantos repartidos por el circuito (si algún led se despista en un momento dado, no creo que vaya a ser muy grave), de momento no he visto que falle ninguno.



Puedes descargar el código, el PCB y el esquema de GitHub 

Fotos del proyecto AQUI

¡Feliz Navidad!

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

55 comentarios:

  1. Gracias Daniel!!!

    Un proyecto muy original, acabo de descubrir tu blog y ya soy un seguidor incondicional tuyo.

    Por cierto, ¿podrias decirme cual es el modelo del zumbador?

    Enhorabuena por el blog.

    Saludos

    ResponderEliminar
  2. @David
    Muchas gracias me alegro de que te haya gustado.

    Pues es un zumbador 'reciclado' de una impresora creo, pero el modelo es HY-05 de HYCOM, pero no creo que sea muy critico, he probado con un HY-07 también reciclado y sin problemas.

    ResponderEliminar
  3. Genial artículo y genial blog, gracias por compartilo.

    ResponderEliminar
  4. @Francisco
    Muchas gracias. Me alegro de que te haya gustado.
    El tuyo también es un gran blog. :-)

    ResponderEliminar
  5. Hola Muy bueno el árbol de navidad, para el año que viene quiero hacer alguno para casa :D . Tengo un proyecto, que ya tengo montado, que cosiste en un cartel de 7 letras RGB, tengo una etapa de luz hecha, que se controla con arduino, pero no soy capaz de programar una secuencia, mi idea es hacer algo tipo al cartel de la churrería.. pero en RGB, que estén las 7 letras por ejemplo en azul, cree efectos como de de la primera a la segunda, tercera cuarta.. y asi. Consta de 21 Canales a programar, son 7 letras por 3 canales cada letra ( Rojo, Verde y azul) 21 en total. Me gustaría mucho, que me dedicaras un poco de tu tiempo haber si soy capaz de hacer andar esto como quiero, llevo varios meses intentando y a la hora de hacer los skeet me dan error.. y tampoco lo entiendo mucho. El arduino que tengo es el mega2560.

    Gracias de ante mano.

    ResponderEliminar
  6. @Tony Núñez Sdaudio

    Bueno, perdona por la espera ...
    He supuesto que los canales de los colores se activan todo o nada.
    Tienes que definir al principio los pines que controlan cada canal (en el ejemplo me los he inventado).
    El sketch no lo puedo probar por que no tengo tu montaje ... pero compila sin problema y te puede servir de partida,
    He creado dos efectos, uno de secuencia y otro tipo arcoiris.
    Espero que te sirva.

    /******************************************
    SKETCH PRUEBA LETRERO 7 LETRAS RGB
    http://arduino-guay.blogspot.com.es/
    *********************************************/


    #define LETRAS 7

    // Definir los pines que controlan cada canal de las letras
    // R1 Rojo Letra 1 , G1 Verde letra 1 , B1 Azul letra 1 etc..
    #define R1 1
    #define G1 2
    #define B1 3

    #define R2 4
    #define G2 5
    #define B2 6

    #define R3 7
    #define G3 8
    #define B3 9

    #define R4 10
    #define G4 11
    #define B4 12

    #define R5 13
    #define G5 14
    #define B5 15

    #define R6 16
    #define G6 17
    #define B6 18

    #define R7 19
    #define G7 20
    #define B7 21

    // Colores básicos
    // Los tres últimos bits son los 3 canales
    #define ROJO 0b00000100
    #define VERDE 0b00000010
    #define AZUL 0b00000001
    #define AMARILLO 0b00000110
    #define CIAN 0b00000011
    #define VIOLETA 0b00000101
    #define BLANCO 0b00000111
    #define NEGRO 0b00000000

    byte pinLetras[LETRAS][3] = {
    {R1,G1,B1},
    {R2,G2,B2},
    {R3,G3,B3},
    {R4,G4,B4},
    {R5,G5,B5},
    {R6,G6,B6},
    {R7,G7,B7}};

    byte colores[6] = {ROJO, AMARILLO, VERDE, CIAN, AZUL, VIOLETA };

    // Pone un color en una letra
    void ponColorLetra(byte letra, byte color) {
    if ( letra < 0 || letra >= LETRAS ) {
    return;
    }
    // Activamos los canales de cada color
    // digitalWrite se activa con cualquier valor > 0
    digitalWrite(pinLetras[letra][0], color & ROJO);
    digitalWrite(pinLetras[letra][1], color & VERDE);
    digitalWrite(pinLetras[letra][2], color & AZUL);
    }

    // Crea una secuancia de las letras con un color, con un retardo dado en milisegundos
    void secuencia (byte color, int retardo) {
    // La secuencia son 7 pasos
    for (byte i=0; i < LETRAS; i++) {
    // En cada paso sólo encendemos una con el color dado y el resto se apaga
    for (byte letra=0; letra < LETRAS; letra++) {
    if ( i==letra ) {
    ponColorLetra(letra, color);
    } else {
    ponColorLetra(letra, NEGRO);
    }
    }
    delay(retardo);
    }
    }

    // Crea una secuencia de colores
    void arcoIris (int retardo) {
    // La secuencia son 6 pasos (los 6 colores)
    for (byte i=0; i < 6; i++) {
    // En cada paso cada letra se enciende con un color,
    // y en cada letra es el siguiente
    for (byte letra=0; letra < LETRAS; letra++) {
    ponColorLetra(letra, colores[(i+letra) % 6 ]);
    }
    delay(retardo);
    }
    }

    void setup() {
    // Ponemos todos lo pines como salidas
    for (byte l; l < 7 ; l++) {
    for (byte c; c < 3 ; c++) {
    pinMode(pinLetras[l][c], OUTPUT);
    }
    }
    }

    void loop() {
    for (byte i=0; i < 6; i++) {
    secuencia (colores[i], 500);
    }
    arcoIris(500);
    arcoIris(500);
    arcoIris(500);
    arcoIris(500);
    }

    ResponderEliminar
  7. hola, llevo tiempo siguiendo tu web y me gusta bastante. Tengo una duda con los leds, porque he buscado en el datasheet y no me aclaro mucho.
    Mi pregunta es si al lanzar los datos en el tiempo de reset es cuando muestra el color cada led?
    Y otra es, si no se le enviara mas datos a los leds se kedaria el color en el que estan o se apagan?

    Gracias...

    ResponderEliminar
  8. @Rafael Ruiz Cabrera
    La librería de Adafruit_Neopixel es la que se encarga de gestionar esto.
    La llamada al método show() (strip.show()), es la que envía los datos a todos los leds y es entonces cuando cambian de color.
    Mientras no se envíen datos nuevos los leds mantienen su color actual.

    ResponderEliminar
  9. Gracias por tu respuesta, es interesante y me pondre a probar con estos leds.

    ResponderEliminar
  10. Muchisimas gracias por tu respuesta. Me pondre con ello haber si soy capaz

    ResponderEliminar
  11. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  12. Gracias por compartirlo. Me gustó mucho el proyecto. Haré uno para esta fecha.

    ResponderEliminar
  13. Hola Jose Daniel. Me gusto un montón tu trabajo.
    FELIZ NAVIDAD ¡¡¡ tras un año masss.
    Le hice algún retoque pero lleva tu estrella ¡¡¡¡
    Gracias.

    ResponderEliminar
  14. hola amigo, hice el circuito pero solo prenden 9 leds, pareciera un problema de corriente, como has alimentado el circuito ? directamente con los 5V de la salida del arduino ?

    ResponderEliminar
  15. @kyokorn
    Claro, es un shield.
    Comprueba que la señal no se interrump e entre el último led que se enciende y el siguiente (o la alimentación, o la masa ...)

    ResponderEliminar
  16. ya lo he hecho, incluso lo monte en protoboard, pero pasa algo muy curioso, ahora solo 2 leds prenden, no puse mas que 3 capacitores de .1uF, pero creo que esto es mas para la sincronia de los leds cierto?, hace un rato prendian 9 ahora solo 2, alguna idea ? :(

    ResponderEliminar
  17. @kyokorn
    Los condensadores son para 'desacoplar' la alimentación y evitar que la caída de tensión que produce el encendido/apagado de los leds interfiera con la señal de los datos que al parecer es bastante crítica.
    Recomiendan un condensador pegado a cada led, yo utilicé uno por cada dos y funciona bien, pero no se si tres serán suficientes. Prueba con alguno más.
    No se me ocurre cual pueda ser el problema, he realizado varios montajes con estos leds y nunca he tenido problemas, pero siempre he utilizado tiras que ya incluyen un condensador por cada led.

    ResponderEliminar
  18. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  19. Hola amigo, no habia sentido tanta fustracion en mucho tiempo, ahora mismo solo deje 10 leds, pero solo prenden 4, haga lo que haga...., ya puse un capacitor por led, la alimente el circuito con una fuente externa, ya cambie los leds, pero solo prenden los mismos 4, probe con otro arduino usando el codigo de ejemplo de neopixel y solo prenden esos 4, pareciera que el circuito tiene memoria xD, cualquier sugerencia te lo agradeceria mucho !. Cabe mencioar que en un inicio prendian los 10, solo que despues no se que paso quedaron esos 4. Saludos!

    ResponderEliminar
  20. @kyokorn
    A lo mejor es una tontería, pero supongo que has revisado el código (no se a lo mejor haciendo pruebas lo has cambiado).
    En el caso del arbol , en la linea :

    Adafruit_NeoPixel strip = Adafruit_NeoPixel(MAX_LED, PIN_LED, NEO_GRB + NEO_KHZ800);

    La constante MAX_LED es la que determina el número de leds conectados , y luego en el código , los bucles utilizan ese valor:

    for(uint16_t i=0; i < strip.numPixels() ; i++)

    ResponderEliminar
  21. No me queda muy claro, me encanto el proyecto, me gustaria hacerlo, pero, me gustaria que tuviera mas leds, que tendria que modificar?

    ResponderEliminar
  22. @Jorge
    En el circuito solamente añadir los leds igual que el resto.
    En el programa modificar la constante MAX_LEDS para que tenga el número de leds y revisar la varaible 'filas' que indica el comienzo y la longitud de cada fila del arbol.

    ResponderEliminar
  23. Estimado Arduino Guay me gustaria que me ayude porque estoy realizando un proyecto de arduino con adolescentes .
    spero su respuesta

    ResponderEliminar
  24. @Anónimo
    Bueno, cuéntame cual es tu problema e intentaré responderte.

    ResponderEliminar
  25. quiero preder 30 leds con un placa arduino uno quisiera saber como puedo hacer . espero su respuesta gracias

    ResponderEliminar
  26. @Anónimo
    A este mismo montaje le puedes añadir bastantes más leds sin hacer ningún cambio, salvo poner en el código el número de leds ...

    ResponderEliminar
  27. Hola,excelente articulo,podrias dejar el plano de las pistas para imprimirlas en laser y transferirlas a pcb? Gracias.

    ResponderEliminar
  28. Perdon,ya encontre las pistas del pcb en tu blog,igualmente gracias.

    ResponderEliminar
  29. Que ideas tan originales para un árbol de navidad creo que es fabuloso que nos hayas explicado tu montaje, es muy útil para quienes queremos tener un árbol de navidad diferente a los que siempre hay. Gracias

    ResponderEliminar
  30. Hola,que hermoso arbol y que gran bolg.

    ResponderEliminar
  31. Hola,me prenden solo los 4 leds de abajo,¿que puedo hacer? Gracias

    ResponderEliminar
  32. @Anónimo
    Hola, se me ocurren varias cosas pero deberas investigar ...
    1) Comprueba las pistas y soldaduras , puede que una pista de alimentación esté cortada o bien la que lleva la señal desde el 4º led al siguiente(con un multimetro comprueba que a partir del led 5 llega la alimentación).
    2) Comprueba que el 5º led está bien colocado (soldaduras y que está en la posición correcta)
    3) Podría ser que algún led esté defectuoso (posiblemente el 5º y más raro el 4º)
    4) Comprueba que en el código MAX_LEDS es 20 (si no has cambiado el código debe ser así)

    Suerte .....

    ResponderEliminar
  33. Muchas Gracias,quedo perfecto el arbol,Saludos.

    ResponderEliminar
  34. ¿De que es la placa donde conectas los leds?

    ResponderEliminar
  35. Podrias dejar el plano de las pistas para imprimirlas en láser y transferirlas a pcb?

    ResponderEliminar
  36. @Anónimo
    Están disponibles para descargar justo debajo del código ...

    ResponderEliminar
  37. disculpe y la parte de abajo del pino donde tiene las salidas es una placa o que es

    ResponderEliminar
  38. si no tengo de esos leds pueden ser los normales

    ResponderEliminar
  39. @Anónimo
    No, para este proyecto no valen los normales.

    ResponderEliminar
  40. hola, muy buen tutorial ... me adapté una estrella del árbol ... Sólo tengo un problema con la melodía, nada juega .... Gracias, Olivier de Francia (el traductor de google)

    ResponderEliminar
  41. @Anónimo
    Notez qu'il doit y avoir un pont entre la broche 7 et 2 (en fait, la broche 7 doit être élevé)

    ResponderEliminar
  42. Hola! Sé que este post es de hace tiempo pero he visto tu proyecto y he decidido hacerlo. El problema es que el link donde está el código y los archivos Eagle no funciona :(. Espero que puedas arreglarlo!!

    Gracias.

    ResponderEliminar
  43. @Arduino Guay Hola! Sé que este post es de hace tiempo pero he visto tu proyecto y he decidido hacerlo. El problema es que el link donde está el código y los archivos Eagle no funciona :(. Espero que puedas arreglarlo!!

    ResponderEliminar
  44. @Alexis
    Perdona por el retraso ....
    Ya está solucionado

    ResponderEliminar
  45. @Arduino Guay

    Tranquilo! Muchísimas gracias, me encanta tu proyecto!

    Un saludo!

    ResponderEliminar
  46. disculpen si alguien sabe porque el quinto led se me apaga y no quiere encender... ya hize un puente entre los que si prenden y el ultimo y si enciende, solo que cuando los puenteo todos no =(

    ya puse un capacitor de 100nf como dicen y sigue sin encender

    si alguien tiene la solucion les agradeceria

    j u l i o g z z @ g m a i l . c o m

    ResponderEliminar
  47. buen proyecto amigo, como se puede poner mas canciones?

    ResponderEliminar
  48. Molon 100 *100 para un regalito esta fenomeno.
    buen trabajo

    ResponderEliminar
  49. como es que es posible usar los puertos analógicos como salidas?

    ResponderEliminar

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