Skip to main content

Probando una tira de leds WS2812

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.

comparativa-drivers

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

20161209_183209

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

consumoled

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.

20161209_183132

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.

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.

ejemplos

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.

Eneko Montero

Estudiando teleco e imprimiendo en 3D. A veces hago robotillos. Cuando tengo tiempo escribo algún artículo.

Una respuesta a “Probando una tira de leds WS2812”

Deja un comentario