Conectar Arduino con paneles y tiras LED RGB WS2812B (NeoPixel)


arduino-ws2812b

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

Anuncio:

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.
A los LED WS2812B también se les denomina NeoPixel

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.
  • arduino-ws2812b-funcionamiento

    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 montaje

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

    arduino-ws2812b-esquema

    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. Podéis dañar un componente de no hacerlo.

    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.

    Resultado

    Aquí tenéis un vídeo mostrando el resultado de ejecutar alguno de los ejemplos.

    Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

    Descarga el código

    Todo el código de esta entrada está disponible para su descarga en Github.



    5 13 votes
    Article Rating

    Anuncio:

Previous Recuperar el estilo visual clásico en AutoCAD 2016
Next Detector de lluvia con Arduino y sensor FC-37 o YL-83
47 Comments
oldest
newest
Inline Feedbacks
View all comments
Daniel Mancera
7 years ago

Muchas gracias por esta entrada.

Estoy empezando cno el tema de los leds y para comenzar he comprado una tira de 30, pero mi idea sería comprar los leds sueltos y disponerlos en una estructura de mi gusto.

No tengo ni idea de electrónica así que no sé como podría hacerlo. ¿Podría conectar uno tras otro a través de un cable normal? ¿Tienen que estar a una distancia máxima entre ellos?

Gracias!

luisllamas
7 years ago
Reply to  Daniel Mancera

Puedes conectar varios, pero necesitas 3 conductores (GND, Vcc y señal). Si los vas a soldar (que es lo normal) ya puedes echarle paciencia, porque son soldaduras en muy poco espacio. En cuanto a la distancia, la mayor limitación será la caída de tensión, que depende de la sección del conductor, y de la cantidad de LED que vayas a encender. Para que te hagas una idea, una tira de LED de 300 LED en 5m, necesita ser alimentada en cabeza y cola, o la caída de tensión hace que los últimos LED viren a rojo. También tienes que tener… Read more »

David Óscar Solé González
5 years ago

Hola!

Siendo que los LED van conectados unos a otros, ¿se puede cortar la tira, si digamos, necesito solamente medio metro?

Saludos

javi
5 years ago

hola se puede conectar por bluetooh como seria su codigo es que ando algo verde gracias

Diana
5 years ago

Hola el anillo, cuenta con dos vcc y dos gnd, dos de cada lado del orificio solo conecto un par, o ambos ?

Luis
5 years ago

que tal.
quero hacer un calendario con esos leds pero que cada que pase un día que prenda a las 7 de la mañana y si me paso un accidente el día anterior poder cambiarlo de color sin que los demás se cambien de color.
podrías ayudarme de favor.

Luis
5 years ago
Reply to  Luis

en lo que me he atorado es en que no se cambie de color los leds anteriores al que estoy cambiando de color

Cuajero
5 years ago

Se pueden conectar 2 tiras en paralelo en lugar de en serie.?
Serian 2 tiaras clonadas??

ifirex
5 years ago

Hola Luis, gran articulo, aunque tengo una pequeña experiencia montando impresoras 3D y pequeños proyectos en arduino nunca me he dedicado a programar uno desde 0 en un proyecto de este tipo. estoy intentando programar dos tiras led de unos 50 leds cada una y pretendo desarrollar una iluminación original, en principio estoy interesado simplemente en un sistema que con un pulsador vaya cambiando entre iluminaciones de colores estáticos , solo rojo, solo amarillo, solo blanco, solo verde…. y una tipo dinámica que vaya cambiando toda la tira simultáneamente en todo el espectro rgb. aparte de las animaciones que ya… Read more »

Ariel
5 years ago

Excelente. pretendo hacer una pantalla rotatva. con una sola tira moviendose. y que la luz llene el plano de la “pantalla” virtual.
podrias ejemplificar como seria un led verde por ejemplo como son los 3bytes o 24bits ?, y por otro lado. podrias explicar como leer un bmp desde arduino para asi plasmar imagenes en estas tiras desde el puro codigo? Gracias muy bien explicado!

ANGEL MARIA
5 years ago

Muy buen aporte, perfectamente explicado.

Tengo una duda ya que mi dominio de la electrónica es escaso por no decir nulo. Me muevo bastante bien en la programación.

Y dicho esto, mi pregunta es la siguiente:

A una tira de leds de 12v ¿la señal de control de leds la puedo conectar directamente al Arduino?

ANGEL MARIA
5 years ago
Reply to  Luis

Perdon, mi tira de leds es WS2811 y es de 12V. Puedo conectar el pin de contro de 5v de Arduino directamente a pin de control de la tira de leds?
Un saludo cordial y muchas gracias.

Adrian Sala
5 years ago

Hola Estimado muy buena explicación la suya en este post, mi consulta viene por lo siguiente, tengo un panel armado con este chip (ws2812b) son de 21 tiras por 76 leds cada tira siendo un total de 1596 Pixeles, (60 l/m). pero tengo el limitante con el codigo de arduino que solo puedo manejar 512 pixeles, en un experimento he podido lograr manejar hasta 608 pixels o sea 8 tiras, pero no hay la suficiente memoria para poder manejar mas, podrias orientarme como solucione esta limitante? desde ya muchas gracias y aguardo tu respuesta, saludos desde Argentina!!!
Adrian Sala.

carlos
5 years ago

hola
me podrias pasar un programa con el cual pudiera controlar 2 tiras leds ws2812b para recrear efectos luminosas.
tengo un trasnformador de 5v que da 3A,es suficiente para lo que te pido?( las tiras leds que habia pensado eran de 3 metros en donde hay 30 leds/metro)
muchas gracias .

carlos
5 years ago

Hola
estoy en un proyecto donde necesito 9 tiras ws2812b( 30 leds/metro cada tira),supongo que podria controlar las tiras con un solo arduino,pero necesitaria de 9 fuentes de voltage externa( una por cada tira)???
tabien podria coger tiras de 5 metros pero supondria que en 5 metros hay 150 leds y las fuentes de voltage que tengo son de 5v con 3A y tengo miedo de que no sea capaz esta fuente de alimetnar todos estos leds,o si?
gracias

Mario Martinez Amrani
4 years ago

Hola Luis, lo primero felicitarte por tu tremenda web en la que cada vez que entro aprendo algo nuevo. Quería consultarte una cosa acerca de los paneles de led flexibles ws2812b, resulta que yo uso el tamaño de 8 x 32 para una serie de proyectos, el problema viene cuando estos paneles los divido en 2 (para obtener 2 paneles de 8x 16) pues bien, cual es mi sorpresa al comprobar que el primer panel al conectarlo me funciona, pero el segundo panel no, lo he probado todo, he buscado esquemas para localizar la alimentación el din y dout de… Read more »

kajanutrio
4 years ago

hola, he visto que los tiempos son muy cortos, fracciones de microsegundo. Mi pregunta : es factible usar un arduino nano con un lector de infrarrojos o bluetooth para impementar el control y efectos sin que afecte a los tiempos de las señales de control sobre la tira led?

HeyAndre
4 years ago

Hola gracias por la informacion recientemente compre una matrix de 4×4 en este tipo de LED y no lograba hacer que funcionara hasta que vi tu tutorial, solo me queda una, sin importar el codigo que use, de las librerias neopixel o fast led, siempre logro iluminar solo las primeras dos filas y las otras dos no se iluminan. Tienes alguna idea que podria estar pasando?

Andres
4 years ago

Hola amigo esta informacion esta muy util pero he estado buscando la respuesta a la siguiente pregubta y talvez tu me puedas ayudar. En el proyecto en el cual estoy trabajando direccionare 6 tiras de 5 metros unidas . con 60 leds por metro total 1800 leds me gustaria saber que capacidad de memoria consumiria en mi procesador para controlar este tamaño de leds con la libreria fastled. Por ahora he trabajado con una tira de un metro y un arduino uno sin problema pero se que al final cuando quiera manejar los 1800 leds este no me dara abasto.… Read more »

Facundo
4 years ago

Hola muy buena pag. Bueno quiero hacer un circuito de unos 150 led pixeles pero se me complica ya que estoy obligado a usar baterias de 12 vol. Estoy estancado en esto si me podrias ayudar te lo agradeceria

David
4 years ago

Hola Luis. tengo un problema con estas tiras. He usado dos diferentes, con varios arduinos y fuentes de alimentación, 2A y una ATX. Al conectar cualquiera de las dos tiras, solo se enciende el primer o tercer led, en verde, y no puedo pasar de ahí. Alguna idea??

Leonardo Moreno
4 years ago

Hola muy buen dia ….gracias por compartirnos tu conocimiento ….y en español que es de mucha ayuda ….podrias por favor poner ejemplos de codigos que puedan ser faciles de modificar para lograr efectos de degradacion de colores y encendido y apagado ….un abrazo desde Colombia y nuevamente gracias

Manolo
4 years ago

Hola Luis, si utilizo cable manguera electrico ·”convencional” de cualquier electrodoméstico de 3 hilos ( fase neutro y tierra) , como bus para conectar 5 grupos de 10 leds cada uno, separados por 1 metro de distancia.
1.- Es posible tecnicamente este montaje?.
2º.- Hay que proteger el primer led de cada tramo con condensador + resistencia?
3º.- Hay alguna otra alternativa para conseguir lo que pretendo ?

Gracias por compartir tus conocimientos

Manolo
4 years ago
Reply to  Manolo

Seria mejor utilizar 3 pares trenzados de utp categoria 6 para evitar interferencias o tendria poca seccion para la intensidad generado por los 50 led del ejemplo expuesto en mi entrada anterior .

Gracias

Manolo
4 years ago
Reply to  Manolo

Y ya por ultimo, cabria también la posibilidad de utilizar un cable electrico de 2 hilos de cobre para los 5 voltios y un par trenzado de utp para la salida de datos.

En cualquiera de ellos, mantengo mi duda si debo proteger con condensador +resistencia el 1 led de cada grupo.

ya no te molesto mas. Gracias y un saludo.

Emilio
4 years ago

Hola, tengo una tira led con 4 pines(+5v, d1, c1, gnd) y viendo el post quiero pensar que es una tira que se controla de manera similar, no tengo el modelo y no se si tu sabes de algunas que tengan pines como los que menciono o donde hablen de tiras de 4 pines controlados?

Pedro
4 years ago

Dices que : 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. Cre que esto no es asi, cuando recibe un bloque de bites enciende el color que le corresponde, cuando recibe el siguiente bloque de bits los trasmite al siguiente led, creo que esto es asi.

Pedro
4 years ago

Hola Luis, ¿ como podria controlar dos tiras de leds Neopixel a través de dos salidas diferentes del mismo Arduino, para que cada una ejecute una secuencia diferente?

Luciano Paz
3 years ago

Hola! Gracias por toda la info, quería saber si hay una cantidad límite de leds con los que pueda trabajar el arduino, tengo dos fuentes, una de 40a y otra de 60a y pienso trabajar con 800 leds más o menos y si es posible más. Gracias!!!

Marcos
3 years ago

Buenas Luís, tengo una duda:
Si defino la salida de datos del Arduino Nano como la D13, que, según tengo entendido, es la que ya lleva un led y una resistencia incorporados, puedo ahorrarme el soldar una resistencia en el cable?
Muchas gracias!

Saber Más Iniciación Arduino 2019 | Aprendiendo Arduino
3 years ago

[…] Leds con controladores WS2812B: https://www.luisllamas.es/arduino-led-rgb-ws2812b/ […]

Leinard
3 years ago

hola, tengo armado 25 metros de tira led conectados a 12 volts y fuente de 41 A al 85%, , conecto cada 10 metros la alimentación, para que en encendido sea por etapas, coloque un capacitor (2200 microFaradios) en paralelo cada 5 metros, pero el circuito integrado de WS2811 continua dañándoce y pone la entrada de Data en conto con GND, que podría hacer para evitar que continue dañanadose, o es acaso otra cosa. gracias por si atención.

Alvaro
2 years ago

Hola Luis, muchas gracias por el Post, me a aclarado muchas dudas, pero siempre hay algunas jajaja. Mi duda es, para una tira led ws2812b de 20 metros de 30 led/m son 180w me vale una alimentación externa de 5v 30A 150w? Mi duda es más que nada por los xA. Gracias de antemano.

JUAN JOSÉ CULATTO MONZÓN
1 year ago

Hola Luis.
Muchas gracias por toda la información que nos das.
Hay alguna manera con las librería Neopixel o Fastled de leer desde un Arduino o NodeMcu el bus SPI?
Gracias de antemano

Explicación sobre los led y los display de 7 segmentos – Título del sitio
1 year ago
Display de 7 segmentos – Título del sitio
1 year ago