Á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.

Descargar

Puedes descargar el código, el PCB y el esquema aquí : 

Fotos del proyecto AQUI

¡Feliz Navidad!

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

11 comments

David
11 de diciembre de 2013, 5:11

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

11 de diciembre de 2013, 12:04

@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.

19 de diciembre de 2013, 6:41

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

19 de diciembre de 2013, 13:22

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

9 de enero de 2014, 8:03

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.

22 de febrero de 2014, 3:01

@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);
}

12 de abril de 2014, 1:54

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...

7 de mayo de 2014, 0:23

@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.

12 de mayo de 2014, 14:31

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

29 de mayo de 2014, 10:50

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

1 de agosto de 2014, 1:45

Ésta es nuestra opinión sobre el "Arduino educativo"
http://speakerscorner.es/arduino-educativo/

Publicar un comentario en la entrada

Buscar en el blog

Cargando...

¡Lo más visto!

English Version

English Version
Arduino is Cool!!

También en Facebook