miércoles, 28 de junio de 2017

Tutorial tira led WS2812B RGB Arduino


Tira led Neopixel de Adafruit
Controlar una tira led es algo que siempre he querido hacer con mi Arduino. Las tiras leds son muy interesantes y fáciles de controlar, al igual que impresionantes y luminosas. En este tutorial voy a explicar el funcionamiento de una tira led y voy a mostrar toda la información que he encontrado por Internet.

Para empezar, necesitamos comprar una tira led RGB WS2812B (WS2812B es el modelo los leds que componen la tira). Las hay de diferentes medidas y de diferentes cantidades de leds por metro. Yo compré 1 metro de una tira led de 60 leds/metro, lo que significa que podré controlar 60 leds. La más barata que encontré es ésta en ebay, y vale 12.6 € el metro. Ésta que compré no venía soldada, por lo que tuve que soldarla yo mismo a cables macho-macho. Así que si no te gusta soldar, mejor compra una de Adafruit aquí, que ya vienen soldadas y listas para usar. Lo malo es que son más caras. Las tiras leds WS2812B de las que estamos hablando, están formadas por leds WS2812B conectados los unos a los otros que se comunican. Cada led, le pasa información al siguiente, de modo que solo tienes que conectar la tira por un extremo y los leds podrán tener diferentes colores simultaneamente.

Tira led de Electro Hobby, ebay
Las tiras leds son RGB (red green blue), así que para poner un color en un led de la tira, habrá que establecer un valor de brillo para para el rojo, uno para el verde, y otro para el azul. Visto de una manera más fácil, cada led de nuestra tira tiene tres leds más pequeños todavía, uno que ilumina rojo, uno que ilumina verde y otro que ilumina azul. Lo que nosotros hacemos para poner un color en un led de la tira, es variar la luminosidad de estos tres componentes de color; es como mezclar colores. Si mezclas el rojo y el azul sale el morado ¿no? pues aquí también; si enciendes el mini-led rojo y el mini-led azul veremos el color morado. También existen tiras led RGBW, que además de los colores rojo, verde y azul, incorporan el color blanco como color principal, pero la que compré no es de ese modelo.
Una vez tienes la tira comprada y soldada (en caso de que no te venga ya soldada de fábrica), lo que sigue es conectarla al Arduino. Las tiras leds de este tipo tienen tres pines:
  1. GND. Irá conectado, como siempre, a GND de nuestro Arduino, la tierra.
  2. +5V. Se conectará al pin 5V del Arduino o a una fuente externa de energía (lo más probable si tu tira es larga).
  3. DIN. Lo conectaremos a cualquier pin digital del Arduino. En este caso, al pin 6, pero no sin antes poner una RESISTENCIA de 470 Ohm que ahora explicaré.
Lo podemos ver más claro en la siguiente imagen:

El orden de los pines puede cambiar dependiendo de la tira led, es decir, a lo mejor en la tira led que has comprado, el primer pin es +5V, después GND y después DIN. Eso no importa, nosotros soldamos y conectamos según corresponda.

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 la fuente de energía de 5V que proporciona el Arduino. Por tanto, es conveniente que se utilice otra fuente de energía para alimentar la tira led. 

Para calcular los Amperios que debe tener nuestra fuente externa de energía, tenemos que multiplicar 60mA por los leds que tenga nuestra tira.

Amperios necesitados = 60mA x Número de leds.

Yo tengo 60 leds, y siguiendo la fórmula, necesitaría una fuente de energía de 3600mA (3,6A) (y 5V obviamente). Podría haber comprado este transformador, que hubiera sido el idóneo, pero por falta de presupuesto me arriesgué a utilizar una fuente externa de 2A (y 5V) y me funcionó (aunque a veces falla).

Otra característica que puedes utilizar es alimentar el Arduino mediante la fuente externa de energía, pero usa esto cuando el proyecto ya esté terminado y siempre que el Arduino no esté conectado al PC.

Por tanto, las conexiones nos quedarían como en la siguiente imagen:

¡OJO! La fuente externa puede alimentar al Arduino siempre que el Arduino no esté siendo alimentado también por el ordenador. Por tanto, si estas programando y probando con el Arduino conectado al PC, elimina este cable. Este cable es útil cuando tu proyecto ya está terminado y esta fuente externa es la única que alimente al Arduino. 

La fuente externa debe ser de 5V y tener Amperios suficientes para encender la tira (como he dicho, a mi con 2 Amperios me bastó). Otro requisito importante es que la tierra debe ser común, es decir, la tierra de la fuente de alimentación externa debe estar unida al pin GND (tierra) del Arduino.

Algo importante también es colocar una resistencia de 470 Ohm entre el pin 6 del Arduino y el pin DIN de la tira led, si no la colocamos, podemos quemar los primeros leds.

Debes saber que si en algún momento rompes o quemas algunos leds de la tira, puedes cortarla y conectarla de nuevo por ahí. Yo por ejemplo, estaba soldando los cables a los pines y sin querer quemé un led. Pues no pasa nada, corté ese led de mi tira, y ¡listo! El único inconveniente es que ya no podía controlar 60 leds, sino 59 (algo que hay que indicar en el código).

En mi caso, 60 (bueno, en verdad 59) leds necesitaban demasiada potencia; más de la que daba la salida 5V de mi Arduino UNO. Por tanto, opté por tomar la opción que he explicado, conectar una fuente de alimentación externa. Mi fuente de alimentación externa es un antiguo cargador de móvil (como éste) que corté para poder sacar los dos cables (5V y GND). Este cargador da una corriente de 5 Voltios y 2 Amperios, y para mis 60 leds son suficientes. Para que quede más claro he hecho el montaje con Fritzing.


Por si aún no ha quedado claro, os explico un poco el montaje anterior:
  • La tierra (GND) de la fuente de alimentación externa y la tierra del Arduino DEBEN ESTAR UNIDAS.
  • Como he dicho anteriormente, entre el pin DIN de la tira led y el pin 6 del Arduino hay una RESISTENCIA de 470 Oh. Estas resistencias son muy baratas, y se pueden encontrar fácilmente en muchos sitios, por ejemplo aquí.
  • Puedes colocar un condensador potente entre los terminales de alimentación positivo y negativo. El que yo uso es de 1000 uF y 25 V, aunque se recomienda comprarlo de 1000 uF y 6.3 V, como éste.
Si optas por la opción de alimentar el Arduino por la fuente externa, el montaje te quedaría así:


Observa el cable rojo que va desde la fuente de alimentación externa hasta el pin VIN del Arduino. Así conseguimos evitar más cables, ya que podemos hacer que nuestro proyecto funcione sin necesidad de conectar el Arduino al PC o a un transformador.

(No hagáis  mucho caso a la tira led de las imágenes anteriores, las tiras led como estas tienen 3 pines, no 6 como en el montaje de Fritzing).

Si lo tienes todo montado y listo, la tira led ¡debe funcionar! Digo debe porque yo tardé tres semanas en hacerla encender, y todo porque había conectado el pin 6 del Arduino al pin DOUT (también llamado DO, dependiendo de la tira), en vez de al pin DIN. El pin DOUT es la salida de datos de cada led WS2812B. Como he dicho, cada uno de estos leds se comunica con el siguiente diciéndole qué color debe poner, por tanto, cada uno tiene una "entrada" de datos (pin DIN) y una "salida" (pin DOUT, que NO debemos conectar al Arduino). Por esto, cuando compremos la tira led debemos fijarnos cuál de los dos extremos tiene el pin DIN y cual tiene el pin DOUT, y hacer las conexiones por la parte que tiene el pin DIN. Claro que si la compras de Adafruit, como ya viene soldada y lista para el uso, te ahorras este problema. Yo fui a lo loco, y soldé la tira por donde no era.


Software
Pero nos falta una parte muy importante, el programa para el Arduino. Para controlar la tira led necesitamos usar una librería. Hay dos librerías principales para controlar tiras led: FastLed y NeoPixel de Adafruit. NeoPixel es la que yo he utilizado para mi proyecto, básicamente porque es más sencilla. Hay dos formas de instalarla, vía Library Manager del Arduino IDE, o descargándola e introduciendo la carpeta (o el archivo .zip) descargada en la carpeta libraries de la carpeta Arduino, que está en la carpeta Documentos de tu PC. Tienes un tutorial bastante sencillo y simple sobre cómo instalarla aquí.

Una vez instalada la librería, ya podremos utilizarla en nuestros proyectos. Aquí explicaré un poco su funcionamiento, pero os aconsejo leeros la guía original de Adafruit que no tiene desperdicio. No os agobiéis buscando otras  librerías, yo personalmente estuve unos días buscando y la mejor que encontré fue ésta con diferencia.

Debemos comenzar el programa incluyendo la librería, como siempre:
Y también, debemos instanciar el objeto que será nuestra tira led:

#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB+NEO_KHZ800);

Aquí creo un objeto llamado strip, que será la tira led y que posteriormente usaré para encenderla.
Los parámetros de la instancia del objeto son:
  1. Número de leds (o pixeles, como los llama Adafruit) de la tira led, o mejor dicho número de leds que quieres controlar. En mi caso 59, porque como os he dicho, tuve cierto percance.
  2. Pin digital del Arduino al que está conectada la cadena. Si os acordáis de la foto del montaje, nosotros conectamos la tira al pin digital 6 con una resistencia de 470 Ohm. Sé que soy pesado, pero es que la resistencia es importante.
  3. Es el tipo de tu cadena. Yo dejé lo que ponía y todo funcionó correctamente. Aquí por ejemplo especificaríamos si nuestra tira led fuera RGBW. En ese caso, deberíamos poner NEO_GRBW + NEO_KHZ800.
    Tanto si nuestra tira es RGB como si es RGBW, en este parámetro escribiremos "GRB" más lo que siga. ¿Por qué cambian el orden? La librería es así.
En el setup() de nuestro programa debemos colocar las siguientes lineas:

void setup()
{
strip.begin();
strip.show();
}

Que básicamente preparan el pin de datos para la comunicación con la tira (strip.begin(), como lo que hacemos con el Serial) e inicializan todos los leds apagados. Esta segunda línea, strip.show() no es estrictamente necesaria aquí. Esta función manda los datos a la tira led, y como todavía no hemos modificado esos datos (los colores de cada led), va a mandar a la tira que todos los leds están apagados.

Para cambiar el color o encender un pixel podemos utilizar dos métodos:

strip.setPixelColor(n, red, green, blue); 
n es el número del pixel al que quieres poner un color. Empezando desde el 0. Por tanto si tenemos una tira de 60 leds, estarán numerados desde el 0 hasta el 59.

red, green y blue son los valores de color que quieres establecer a ese pixel n. Como ya dije, cada pixel de la tira es RGB, lo que significa que para poner un color debes establecer un valor de brillo para el componente rojo, para el verde y para el azul, y mediante esos 3, llegarás al color que deseas. En estos tres argumentos 0 es apagado y 255 es el brillo máximo.

Por ejemplo, si queremos poner el pixel 15 (el 14 contando desde 0) al color magenta (que se forma de la unión entre el azul y el rojo) utilizaremos la siguiente linea:

strip.setPixelColor(14, 255, 0, 255);

Y para apagar el pixel 9 (8 contando desde 0) utilizaremos la siguiente línea:

strip.setPixelColor(8, 0, 0, 0);

Tiene lógica, porque lo que haces es que a cada componente de color RGB le estableces el brillo a 0, y así el pixel se apaga.

Otra forma de cambiar el color o encender un pixel es utilizando la misma función pero con diferentes argumentos:
strip.setPixelColor(n, color);
n sigue siendo el pixel que quieres encender, contando desde cero.

El segundo argumento, color es un entero de 32 bits que junta el rojo, el verde y el azul en un solo número fusionado. Para crear esta variable color, utilizamos:

uint32_t magenta = strip.Color(255, 0, 255);

Y si queremos cambiar el color del pixel 36 (35 contando desde 0) al color magenta utilizando este método, utilizaremos lo siguiente:

strip.setPixelColor(35, magenta);

Pero, si utilizamos los métodos anteriores y ya está, observamos que los colores de nuestra tira no cambian. Esto es porque tenemos que utilizar el método: strip.show(); para establecer (o en cierto modo "lanzar") los colores de los leds a nuestra tira. Hay que pensarlo como si el método strip.setPixelColor() solamente modificara los valores de una gran lista de variables en el programa del Arduino, estas variables contendrían el color de cada pixel. Y después el método strip.show() mandara esta gran lista a la tira led. Por tanto, podemos utilizar strip.setPixelColor() tantas veces como queramos, que si después no llamamos a strip.show() no observaremos ningún cambio.

Pero, de todas formas, esto es un resumen simple del funcionamiento de la librería, os aconsejo leeros el tutorial original de Adafruit.

Además de todo lo que he explicado, si quieres hacer funcionar ¡ya! tu tira led, en la carpeta libraries del Arduino IDE, dentro de la carpeta Adafruit_NeoPixel-master (la carpeta de la librería que instalamos ¿te acuerdas?) dentro de la carpeta examples encontrarás (valga la redundancia) ejemplos de código. Te aconsejo el programa llamado simple que hace funcionar la tira led de una forma muy sencilla. Te dejo el programa aquí, por si no lo tienes. Además, puedes escribir tu propio programa sobre ese, como hice yo.

Otra cosa que quiero señalar, es que utilizando un Arduino NANO, la tira led funciona también perfectamente. Si vas a alimentar el Arduino con la fuente externa, te recomiendo un Arduino Nano, porque tiene menor consumo.

En resumen, estas tiras leds me han resultado muy interesantes y fáciles de utilizar (a pesar de ese tiempo que estuve  bloqueado por el pin DOUT). Las tiras leds iluminan mucho (llegan a sustituir a un flexo de escritorio) y dejan boquiabierto a quien las ve. Si la tira led no adopta el color que le has programado (imagina que has programado que toda la tira led se encienda con blanco intenso, es decir: 255, 255, 255) puede ser por dos razones. La primera, es porque te hayas equivocado programando y no hayas puesto 255, 255, 255. La segunda es un poco más delicada, la fuente de alimentación no es suficiente. A veces, programo mi tira led para que alumbre blanco intenso e ilumina con un color blanco-amarillo. Esto es porque hay que aumentar los Amperios de la fuente de alimentación (los Voltios no, que te la cargas). Tengo pensado subir un proyecto que he hecho con una tira led de estas, el proyecto consiste en utilizar la tira led como si fuera un flexo de escritorio, una lampara normal, con el objetivo de que alumbre la mesa.

Cualquier duda, por torpe que pueda parecer, no dudes en plantearla en los comentarios de abajo ▼, que la responderé con mucho gusto. También, si me he equivocado en algo y quieres corregirlo, comenta, que lo corregiré. Gracias por leer este tutorial-guía y espero que te haya gustado, pero sobre todo espero que te haya sido útil.


No hay comentarios:

Publicar un comentario