¿Qué es un WS2812B?
Los WS2811, WS2812 y WS2812B son LED que disponen de lógica integrada, por lo que es posible variar el color de cada LED de forma individual (a diferencia de las tiras RGB convencionales en las que todos los LED cambian de color de forma simultánea).
Están basados en el LED 5050, llamado así porque tiene un tamaño de 5.0 x
5.0 mm. Es un LED de bajo consumo y alto brillo, que incorpora en un
único encapsulado los 3 colores RGB.
La genial novedad del WS2812B (y resto de familia) es añadir un integrado dentro de cada LED, que permite acceder a cada pixel de forma individual. Por este motivo este tipo de LED se denominan “individual addressable”.
Esto abre la puerta a un sinfín de aplicaciones y combinaciones, que van
desde dotar de iluminaciones distintas zonas con una única tira,
animaciones complejas, o incluso generar pantallas enteras de alta
luminosidad.
En adelante nos centraremos en el WS2812B, por ser el más moderno de la familia, pero todo lo expuesto es de total aplicación para los modelos WS2811 y WS2812.
Precio
Podemos encontrar conjuntos de WS2812B en una gran variedad de formaciones, incluidas tiras, paneles, y anillos.
Encontramos tiras de distintas longitudes, que van
desde 1 a 5m. En cuanto a densidad, podemos encontrar tiras de 30, 60, y
144 LED por metro. Además, existen tiras no impermeables (IP30), y
tiras impermeables (IP67), que envuelven un plástico protector el PCB.
Los precios varían enormemente entre estos factores, desde unos 5€ por
una tira LED de 1m IP30 de 30 LED/m, a 30€ por una tira de 5M IP67 de 60
LED/metro.
En cuanto a disposición en anillo, podemos encontrar anillos de 16 LED por 3€ y de 24 LED por 4€.
En paneles, encontraremos tanto paneles flexibles como no flexibles.
Podemos encontrar paneles flexibles de 8×8 por 15€, 16×16 por 35€, de
8×32 por 50€.
¿Cómo funciona un WS2812b?
El funcionamiento de un WS2812b es realmente ingenioso. Cada LED dispone
de un integrado que almacena 3 bytes (24 bits), que corresponden con
los 3 colores del RGB. Cada pixel puede tener 256 niveles en 3 colores,
lo que supone un total de 16.777.216 posibles colores.
Cuando un LED recibe un flujo de bytes, almacena los últimos bytes recibidos y trasmite los que contenía al siguiente LED. Finalmente, con una señal de “resetcode” cada LED muestra el último valor almacenado.
Esta genial idea permite hacer configuraciones de múltiples LED, en los
que únicamente tenemos que comunicarnos con el primero de ellos y cada
LED se actúa de transmisor de la secuencia a los LED posteriores. Además
permite que podamos encadenar o dividir tiras de LED y cualquier fragmento seguirá funcionando porque todos los LED tienen exactamente el mismo comportamiento.
Cada vez que un punto trasmite al siguiente una señal, realiza una
reconstrucción de forma que la distorsión y el ruido no se acumulan.
Esto permite alimentar tiras de más de 5m sin necesidad de dispositivos
adicionales.
La transmisión de 0 y 1 y resetcode se realiza mediante señales pulsadas temporizadas.
- Un 0 se realiza por un pulso HIGH de 0,35 us, seguido de un periodo LOW de 0,9.
- Un 1 se realiza por un pulso HIGH de 0,9us y LOW 0,35us.
- El “resetcode” se manda como una señal LOW de 50us.
La frecuencia de funcionamiento es superior a 400Hz/s. Esto permite que
se puedan animar más de 1024 puntos a una tasa refresco de 30fps.
Para más información y detalles sobre su funcionamiento, os aconsejamos consultar el Datasheet del WS2182B.
Esquema eléctrico
El esquema eléctrico para conectar LED WS2812b es sencillo. Cada LED
alimenta al siguiente, por lo cual solo tendremos que conectar con el
primer elemento de la formación.
Disponemos de 3 pines, 2 de alimentación (5V y GND) y entrada de datos (Din) para recibir los datos desde Ardunino.
La alimentación de la tira LED tiene que realizarse desde una fuente de
alimentación externa de 5V, dado que Arduino no dispone de potencia
suficiente. La referencia GND será común.
Cada LED WS2182b consume unos 60mA (0,3W), dando color blanco intenso
(20mA por cada componente de color) Esto supone un consumo de 9W para
30 LED, y 18W para 60 LED, lo que es mucha potencia en una fuente de 5V.
Afortundamante, no siempre vamos a iluminar todos los LED de forma
simultánea con blanco a máxima intensidad. Dependiendo del programa y
efectos que hagamos la potencia requerida será mucho menor.
En casos de mucho consumo y gran número de LED también puede ser
necesario alimentar por más de un punto a la vez (por ejemplo, cabeza y
cola de la tira). De lo contrario, la caida de tensión hará que los
últimos LED viren a rojo.
Podéis emplear la fuente de 5V para alimentar el propio Arduino. Lo que
no podéis es alimentar la tira desde la salida de 5V de Arduino.
Recordar, la referencia GND siempre debe ser común.
En cuanto al pin de señal, podemos emplear cualquiera de las salidas digitales de Arduino. Es necesario emplear una resistencia de 470 ohmios entre el pin digital y el pin de señal del WS2818b, o podéis dañar los primeros LED.
También se aconseja instalar un condensador de al menos 1000 uF entre
GND y 5V (aunque en los montajes que yo he probado nunca la he puesto y
ha funcionado correctamente).
Ejemplos de código
Podemos mandar la señal directamente controlando adecuadamente los timings necesarios. Sin embargo, lo normal es que empleemos una librería existente que se encargue de esta tarea por nosotros. Tenemos varias librerías disponibles para manejar WS2812b desde Arduino.
Por un lado tenemos la librería NeoPixel de Adafruit que es sencilla de usar pero relativamente lenta, lo que la hace inadecuada para efectos complejos.
Por otro lado, tenemos la librería FastLED, algo más difícil pero a cambio permite patrones mucho más complejos.
Bajaros ambas bibliotecas y probar los ejemplos que vienen incluidas, para que decidáis que tipos de efectos necesitáis y con librería estáis más agusto.
A partir de aquí, depende de vuestra imaginación y del efecto que queráis conseguir. No hay límites, y la cantidad de combinaciones es infinita. Animaros a programar vuestros propios efectos y animaciones.
0 comments: