He tenido la suerte de que Lolo Cortés me ha enviado un módulo de estos (entre otras cosas) para poder probarlo (muchas gracias), y posteriormente hacer un tutorial análogo al que hice de «Ilumina tu impresora 3D» pero usando esto. Hasta ahora, he venido haciendo algunas pruebas para entender el funcionamiento. La idea de esta entrada es ponernos un poco en situación, y realizar la puesta a punto básica para poder crear algún efecto usando Arduino.
¿Qué tenemos entre manos?
El módulo que vamos a utilizar esta formado por varios WS2812, aunque debemos tener en cuenta que no es el único modelo existente en el mercado. También podemos encontrar circuitos integrados como el WS2801 o el WS2811.
En la imagen podemos apreciar que el WS2801 necesita una señal adicional, una señal de reloj, que en cambio los otros dos modelos que aparecen en la imagen no necesitan. Esta señal la podemos ver como ventaja ya que el no tenerla implica que hay que cuadrar muy bien el envío de datos. También la podemos ver como desventaja ya que las tiras son más complejas y caras de fabricar.
El WS2812 lleva en el encapsulado del led RGB incrustado el WS2811, lo que hace que ocupe menos espacio.
Nosotros usaremos una tira con 8 drivers WS2812. Para Arduino va a funcionar bien, para Raspberry Pi en cambio, no tanto, debido a los tiempos de los que ya hemos hablado.
Ahora que ya tenemos clara nuestra elección, pongo el Datasheet aquí para poder consultar lo necesario.
Hardware
Esto que pongo en la imagen es con lo que vamos a trabajar, como podemos ver, a la derecha le he soldado unos pines maho. La tira consiste de 8 leds RGB WS2812. Además tiene dos agujeros que nos permitirán atornillarla a algún sitio y que no quede colgando.
Vamos a empezar montando el circuito básico, pero tenemos que tener en cuenta un par de detalles.
Consumo de potencia
Mirando el datasheet nos encontramos con esta tabla. Los 3 leds encendidos (blanco) consumen 60mA*5V=0,3W, esto significa que si encendemos todos los del módulo (8) son 2,4W. Punto a tener en cuenta.
Soldando
La tira viene con unos pads que tendremos que soldar. Esto nos permite ir soldando varias en serie para hacer tiras más largas. También podemos soldar conectores o cablecillos a ellos. Lo que mejor nos venga. Yo por ejemplo, le he soldado unos pines macho para poder conectarlo a la protoboard de forma fácil y que quede en vertical con un montaje sólido. No he puesto ni funda termorretráctil ni termofusible ya que de momento no me ha hecho falta. Cuando lo monte en algún sitio para dejarlo ya fijo aislaré bien la zona con termofusible, probablemente.
Hay que fijarse en DIN y DOUT. El flujo de bits que indicarán cómo se tienen que iluminar los leds entrará por DIN y saldrá por DOUT. Si ponemos varios seguidos, el DOUT irá conectado al DIN del siguiente. En caso de que hagamos mal esas conexiones no nos funcionará. Tenemos que fijarnos en eso para no soldarlo al revés. 4-7VDC es la alimentación, que en nuestro caso alimentaremos a 5V, y GND conectaremos a tierra.
Montando el circuito
En mi caso, he aprovechado que tenía un Pinchy, el robot educativo de Bilbao Dynamics, por lo que he montado el circuito básico en la breadboard que incluye, y así, puedo aprovechar el resto de cosas que ya vienen para hacer los ejemplos más rápido, tardando menos tiempo en el montaje. En concreto el ejemplo en el que uso un botón. De todos modos, pongo los circuitos hechos en fritzing.
He usado una placa Arduino Micro para las pruebas, aunque puedes usar la que más te guste o tengas más a mano.
La resistencia de 470ohm y el condensador de 10uF son opcionales, yo he puesto la resistencia pero no el condensador. La resistencia hay que colocarla entre DIN y el pin de Arduino. El condensador entre VDC y GND de la tira.
La parte de la derecha es la del pulsador, le he puesto un pull-up con una resistencia de 10kohm, aunque puedes ponerle también un pull-down, eso como prefieras. Esta parte solo haría falta para el 4º ejemplo.
Le he puesto también fuente de alimentación externa (5V) para alimentar la tira de leds.
En este caso, los datos irán por el pin digital 3 de la placa de Arduino. El botón está conectado al pin digital 14. Puedes cambiar estos valores.
Todos los valores que he indicado aquí son los que he usado en los ejemplos, por lo que si haces esto igual, solo con cargarlos ya te debería funcionar.
Software
Para poder usar estos módulos de forma sencilla, hay varias librerías disponibles. En concreto, las que más he visto que se mencionan son Adafruit Neopixel y Fastled. Usar esto nos va a facilitar mucho la programación.
Me he lanzado a probar la de fastled, así que en este tutorial vamos a usar esa. Para ello, comienza descargándola e incluyéndola en tu directorio Arduino/libraries.
A continuación, puedes descargar los ejemplos que he subido a GitHub. De momento hay 4. En esa página se explica qué hace cada uno.
Como cosas mencionables de la librería, lo que he probado me ha gustado. Vamos a comentar un par de cosas a tener en cuenta que me han parecido destacables.
- Hay muchos colores disponibles que podemos usar directamente escribiendo
//Por ejemplo led[0] = CRGBA::Beige; //En general led[n] = CRGBA::color; // n = número de led, de 0 a 7 //color = uno de la lista de colores que se presenta a continuación /*Lista de colores: AliceBlue = 0xF0F8FF Amethyst = 0x9966CC AntiqueWhite = 0xFAEBD7 Aqua = 0x00FFFF Aquamarine = 0x7FFFD4 Azure = 0xF0FFFF Beige = 0xF5F5DC Bisque = 0xFFE4C4 Black = 0x000000 BlanchedAlmond = 0xFFEBCD Blue = 0x0000FF BlueViolet = 0x8A2BE2 Brown = 0xA52A2A BurlyWood = 0xDEB887 CadetBlue = 0x5F9EA0 Chartreuse = 0x7FFF00 Chocolate = 0xD2691E Coral = 0xFF7F50 CornflowerBlue = 0x6495ED Cornsilk = 0xFFF8DC Crimson = 0xDC143C Cyan = 0x00FFFF DarkBlue = 0x00008B DarkCyan = 0x008B8B DarkGoldenrod = 0xB8860B DarkGray = 0xA9A9A9 DarkGreen = 0x006400 DarkKhaki = 0xBDB76B DarkMagenta = 0x8B008B DarkOliveGreen = 0x556B2F DarkOrange = 0xFF8C00 DarkOrchid = 0x9932CC DarkRed = 0x8B0000 DarkSalmon = 0xE9967A DarkSeaGreen = 0x8FBC8F DarkSlateBlue = 0x483D8B DarkSlateGray = 0x2F4F4F DarkTurquoise = 0x00CED1 DarkViolet = 0x9400D3 DeepPink = 0xFF1493 DeepSkyBlue = 0x00BFFF DimGray = 0x696969 DodgerBlue = 0x1E90FF FireBrick = 0xB22222 FloralWhite = 0xFFFAF0 ForestGreen = 0x228B22 Fuchsia = 0xFF00FF Gainsboro = 0xDCDCDC GhostWhite = 0xF8F8FF Gold = 0xFFD700 Goldenrod = 0xDAA520 Gray = 0x808080 Green = 0x008000 GreenYellow = 0xADFF2F Honeydew = 0xF0FFF0 HotPink = 0xFF69B4 IndianRed = 0xCD5C5C Indigo = 0x4B0082 Ivory = 0xFFFFF0 Khaki = 0xF0E68C Lavender = 0xE6E6FA LavenderBlush = 0xFFF0F5 LawnGreen = 0x7CFC00 LemonChiffon = 0xFFFACD LightBlue = 0xADD8E6 LightCoral = 0xF08080 LightCyan = 0xE0FFFF LightGoldenrodYellow = 0xFAFAD2 LightGreen = 0x90EE90 LightGrey = 0xD3D3D3 LightPink = 0xFFB6C1 LightSalmon = 0xFFA07A LightSeaGreen = 0x20B2AA LightSkyBlue = 0x87CEFA LightSlateGray = 0x778899 LightSteelBlue = 0xB0C4DE LightYellow = 0xFFFFE0 Lime = 0x00FF00 LimeGreen = 0x32CD32 Linen = 0xFAF0E6 Magenta = 0xFF00FF Maroon = 0x800000 MediumAquamarine = 0x66CDAA MediumBlue = 0x0000CD MediumOrchid = 0xBA55D3 MediumPurple = 0x9370DB MediumSeaGreen = 0x3CB371 MediumSlateBlue = 0x7B68EE MediumSpringGreen = 0x00FA9A MediumTurquoise = 0x48D1CC MediumVioletRed = 0xC71585 MidnightBlue = 0x191970 MintCream = 0xF5FFFA MistyRose = 0xFFE4E1 Moccasin = 0xFFE4B5 NavajoWhite = 0xFFDEAD Navy = 0x000080 OldLace = 0xFDF5E6 Olive = 0x808000 OliveDrab = 0x6B8E23 Orange = 0xFFA500 OrangeRed = 0xFF4500 Orchid = 0xDA70D6 PaleGoldenrod = 0xEEE8AA PaleGreen = 0x98FB98 PaleTurquoise = 0xAFEEEE PaleVioletRed = 0xDB7093 PapayaWhip = 0xFFEFD5 PeachPuff = 0xFFDAB9 Peru = 0xCD853F Pink = 0xFFC0CB Plaid = 0xCC5533 Plum = 0xDDA0DD PowderBlue = 0xB0E0E6 Purple = 0x800080 Red = 0xFF0000 RosyBrown = 0xBC8F8F RoyalBlue = 0x4169E1 SaddleBrown = 0x8B4513 Salmon = 0xFA8072 SandyBrown = 0xF4A460 SeaGreen = 0x2E8B57 Seashell = 0xFFF5EE Sienna = 0xA0522D Silver = 0xC0C0C0 SkyBlue = 0x87CEEB SlateBlue = 0x6A5ACD SlateGray = 0x708090 Snow = 0xFFFAFA SpringGreen = 0x00FF7F SteelBlue = 0x4682B4 Tan = 0xD2B48C Teal = 0x008080 Thistle = 0xD8BFD8 Tomato = 0xFF6347 Turquoise = 0x40E0D0 Violet = 0xEE82EE Wheat = 0xF5DEB3 White = 0xFFFFFF WhiteSmoke = 0xF5F5F5 Yellow = 0xFFFF00 YellowGreen = 0x9ACD32 */
- Podemos indicar el brillo de estos colores simplemente indicando
FastLED.setBrightness(n); //n entre 0 y 255
- Podemos indicar el valor entre 0 y 255 de cada color RGB, indicando simplemente el sufijo mediante r, g o b.
led[o].r = 127; led[0].b = 200;
- Podemos realizar todas las operaciones que queramos, pero solo se representarán cuando le indiquemos que queremos que se muestren
FastLED.show();
Y de momento hasta aquí he probado. Lo siguiente será implementarlo en Marlin.
Una respuesta a “Probando una tira de leds WS2812”