miércoles, 13 de septiembre de 2017

PROYECTO MONLED: Utilizar una tira led WS2812B controlada por Arduino para iluminar un escritorio

Ya sabrás que me encantan las tiras leds, y más si las puedo controlar, manejar y programar yo mismo. Tanto me gustan, que hace unos meses decidí crear el proyecto que voy a presentar en este post.

Este proyecto, lo he llamado "Monled". Consiste en la utilización de una tira led WS2812B como una lámpara normal, como un flexo de escritorio, con el objetivo de iluminar una mesa. El flexo que tengo (tenía) para iluminar mi escritorio es bastante aparatoso y se le suele fundir la bombilla cada 2 meses, y cansado de esto pensé: ¿Por qué no me hago yo el mío propio? Fue así como comenzó mi maravilloso viaje a través de estos aparatejos que Arduino nos permite controlar.

Para empezar, debes saber qué es una tira led WS2812B y cómo funcionan. No, no hace falta que busques en Google, puedes ver este post de mi blog en el que explico su funcionamiento, el hardware, el software y todo lo que te puedas imaginar. Pero yo las explicaré un poco aquí. Las tiras leds WS2812B están formadas por leds WS2812B (hasta ahí llegamos ¿no?). La principal característica de estos leds es que se comunican entre ellos, es decir, cada uno le transmite información al siguiente, en forma de cadena. Por tanto, solo hace falta que conectemos el Arduino a un extremo de la tira y podremos encender cada uno de los leds de ésta. La verdad es que a mi me han encantado, principalmente porque son facilísimos de usar.

Entonces, si lo que queremos es que nuestra tira led ilumine nuestra mesa, debemos colocarla en un sitio elevado ¿no? Pues sí, yo tengo una ventaja importante y es que justo encima de la mesa de mi escritorio tengo una estantería, por lo que puedo pegar la tira led en la parte de abajo de la estantería apuntado hacia a mesa. Así, cuando la encienda, la luminosidad de todos los leds acabará en mi mesa y alumbrará cada rincón. Si no tienes una estantería encima de tu mesa (que quizás es lo más normal) puede que no puedas usar este proyecto para alumbrar tu mesa, pero sí puedes poner la tira en muchos más sitios. Eso ya te lo dejo a ti.



Para hacer este proyecto, he necesitado los siguientes materiales:
  • 2 protoboards pequeñas, como ésta. He utilizado protoboards de las pequeñas por el espacio. Mi objetivo era reducir al máximo el espacio empleado (para que el resultado cupiera en una caja), por esto utilicé también un Arduino Nano. Si prefieres usar un Arduino UNO, no hay problema, y si prefieres usar una protoboard grande (como ésta), tampoco pasa nada; solo que tendrás que buscar una caja más grande. Ah, y la razón de usar dos protoboards es que en una coloco el Arduino Nano, y en otra hago las uniones de los cables, lo verás más claro en las imágenes.
  • Arduino. Como he dicho, puede ser el Nano, el Uno, el Mega... De todas formas, la librería que emplea el programa (NeoPixel de Adafruit) no necesita la capacidad de un Arduino Mega, con un Arduino Uno o Nano le basta, y puestos a elegir... me quedé con el Nano. Pero en el proyecto no utilizo un Arduino Nano original, sino éste que encontré por ebay y que es más barato. Para poder utilizar este Arduino pirata necesitarás sus drivers que puedes encontrar, junto con un tutorial de cómo instalarlos, aquí.
  • Cables (jumper wires) macho-macho y hembra-macho. Los idóneos para protoboards.
  • 1 Resistencia de 470 Ohm. Para conectar uno de los pines de la tira led al Arduino hay que colocar una resistencia de 470 Ohm de por medio.
  • Transformador a 5V. Para utilizarlo como fuente externa de energía para la tira. La fuente de 5 voltios que proporciona el Arduino no es suficiente para alimentar toda la tira, por tanto tenemos que utilizar una fuente externa que proporcione más amperios. En el tutorial se explica más detenidamente. Dependiendo de los leds que tenga tu tira, podrás utilizar entre diferentes fuentes de energía externa. A mi, con este cargador de móviles me bastó, pero lo idóneo hubiera sido utilizar este transformador (que es más caro). Yo por falta de presupuesto, tomé la primera opción.
  • Un interruptor, porque la gracia de la lámpara es que se pueda apagar y encender sin necesidad de conectar y desconectar el cable del enchufe. Yo utilicé uno como éste, pero te recomiendo uno más fácil de conectar.
  • Un condensador de 1000 uF y 6.3 V, que se debe colocar entre los terminales de alimentación negativo y positivo. Por ejemplo éste.
  • Una caja en la que quepan todos los componentes del proyecto. Yo utilicé una con las siguientes medidas: 13 cm x 7 cm de longitud y 2.5 cm de altura, y todo me cupo perfectamente. Si es de cartón mejor, porque tendrás que hacer algunos agujeritos para los cables, el interruptor...
  • Y por supuesto, la tira led. 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 puedo 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 viene soldada y lista para usar. Lo malo es que son más caras.
El precio total de todos estos componentes es 40.81 €. Aquí tienes un presupuesto desglosado. Puede parecer un poco caro, pero algunos de los componentes los tendrás ya. Puede que las protoboards, el Arduino, las resistencias... no las tengas (o quizás sí, si eres un veterano en este tema), pero por ejemplo la fuente de alimentación puedes sacarla de un cargador de móvil (como te dije), e incluso los cables no tienen porqué ser jumper-wires, sino que pueden ser cables normales y unirlos tú mismo.

Si ya lo tienes todo comprado y listo, lo siguiente es montarlo. El montaje debe quedar así.



Por si no te ha quedado claro con la imagen, explico un poco el montaje anterior:
  • La fuente de alimentación externa debe estar conectada a nuestro proyecto (obvio ¿no?). El cable GND (el negro) lo conectamos directamente a la protoboard. El cable de 5 voltios (el rojo) lo conectamos a la protoboard con un interruptor (o switch) de por medio. Cuando el interruptor esté cerrado dejará pasar la energía y todo Monled funcionará; cuando no, nuestro proyecto estará apagado. En vez de poner el interruptor en el cable rojo, puedes ponerlo en el cable negro, como quieras. El caso es que el interruptor si está abierto no permita que la tierra y los 5 voltios lleguen al Arduino.
  • Colocamos un condensador de 1000 uF y 6.3 V entre los terminales de alimentación positivo y negativo. (Si quieres comprobar que el condensador funciona, cuando hayas terminado el proyecto, enciéndelo, apágalo y quita el condensador. Rápidamente conéctalo a un led, no sin antes poner una resistencia. Verás como el led se enciende y a los pocos segundos se desvanece).
  • ¡ATENCIÓN! ¡IMPORTANTE! La fuente externa de energía alimenta al Arduino Nano por el cable VIN, mientras estés probando/cargando el programa con el Arduino conectado al ordenador es recomendable que quites este cable, ya que el Arduino estaría alimentado por dos partes. Así que por ahora quítalo y ya lo conectarás cuando tu Monled esté listo.
  • Las tierras (cables negros) de la fuente de alimentación y del Arduino deben estar unidas.
  • Se conecta al pin 6 del Arduino un cable con una resistencia de 470 Ohm de por medio que irá al pin DIN de la tira led.
  • En nuestro montaje sobresalen tres cables que tenemos que conectar a la tira led tal y como indico en el post que antes he mencionado. El pin DIN al cable amarillo (el de la resistencia) el pin +5V al cable rojo y el pin GND al cable negro.
  • La protoboard que no contiene el Arduino es un poco más grande que la otra en la foto, pero en mi proyecto las dos son igual de tamaño. He puesto la segunda más grande para que todo se viera más claro.
Yo hice el proyecto con la idea de tener una cajita con todos los componentes, de la que sobresalieran tres cables, que conectaría a la tira led. Es decir, en mi caso la tira led no está conectada a la protoboard, sino a tres cables más largos. Con esta idea, la tira led puede estar pegada a algún sitio y la cajita controladora puede ser móvil.

Aquí tienes una foto de todos los componentes ya montados:


El proyecto me quedó así:



Un vistazo desde dentro:


Y así es como queda colocado en mi escritorio:


Si quieres ver más fotos, te las dejo aquí.

Software
El programa puedes descargarlo aquí.

La idea del proyecto Monled es tener una tira led como si fuera una lámpara normal, pero en vez de ser fija y aburrida, que pueda tener muchos colores. Y pensarás: ¿cómo configuro el color (o los colores) que le quiero poner a mi tira? Y aquí es donde cobra importancia el programa que he hecho. El programa está pensado para que sólo tengas que configurar los colores de la tira una vez mediante comandos por Serial. Pero apagues el Arduino, éste no se va a acordar de los colores que tú habías configurado antes, ¿no? va a empezar el programa de nuevo ¿no? Pues NO, sí se acuerda, y además sin utilizar magia, utilizando la memoria no volátil, la EEPROM.

Los Arduinos tienen tres tipos de memorias:
  • La memoria SRAM (memoria volátil), donde el programa crea y manipula las variables.
  • La memoria Flash, donde se almacena el programa.
  • La memoria EEPROM (memoria no volátil), donde podemos almacenar datos que se conservarán en el Arduino después de apagarse, como en nuestro caso, los colores de los leds.
Utilizando la EEPROM solo debes establecer una vez los colores que quieres que tu tira led muestre. Cuando mandes el comando para encender los leds al Arduino, éste los guardará en la EEPROM, para cuando se apague y se encienda de nuevo, ponerlos tal y como si los acabaras de configurar. Mediante la EEPROM siempre que enciendas la tira led, tendrá los colores que tenía justo antes de apagarla, si no la utilizamos, cada vez que encendiéramos el Arduino, habría que configurar cada led y cada color.

Ahora que ya tienes una idea básica del funcionamiento del programa, te preguntarás cómo se escriben y se leen valores de la EEPROM. Para empezar, no es como yo pensaba, es un poco más complicado. Para usar la EEPROM debes trabajar por direcciones byte a byte tanto para leer como para escribir. Esto significa que para una memoria EEPROM de 1kB (que es la que tiene el Arduino Nano) tendrás desde la dirección 0 hasta la 999 y en esas direcciones podrás guardar valores desde 0 a 255 (lo que nos viene de lujo para los colores de los leds RGB, que si te acuerdas iban desde el 0 hasta el 255). Por tanto, yo almaceno los colores de tres posiciones en tres posiciones. Es decir, las tres primeras posiciones de la EEPROM representan el nivel de brillo de los componentes de color R, G y B para el led número 0. Los tres siguientes para el led número 1, y así hasta el led 59.

Entonces, si tengo 60 leds, utilizaré 180 posiciones (que irán desde la 0 hasta la 179).
Si quiero saber qué nivel de brillo tiene el componente de color R del led 52, tendré que multiplicar 52 por 3, y sumarle 0 (porque el componente R es el primero), que es igual a 156. Ya se que el componente R del led 52 está en la posición 156 de la EEPROM. Ahora solo me falta leer el valor que hay en esa posición mediante otra función. 
Si quiero saber qué valor tiene el componente de color B del led 34, tendré que multiplicar 34 por 3, y sumarle 2 (porque el componente B es el tercero), lo que da como resultado la posición 104, donde tendríamos que mirar el valor que hay, o establecer uno (que iría del 0 al 255).
Otro ejemplo, si quiero apagar el led 25, tendría que poner el valor 0 en las posiciones de la EEPROM 75, 76 y 77.
Si por ejemplo quiero poner el led 36 al color magenta (que se forma de la unión entre el rojo y el azul) tendría que poner en las posiciones 108, 109 y 110 los siguientes valores respectivamente: 255, 0, 255. Es cogerle práctica.

Pero no te preocupes por todas estas cuentas, que el programa ya se encarga de hacerlas por ti. Tú solo tienes que introducir el comando que te voy a decir a continuación.

Basándonos en esto, al encender el Arduino, el programa va pasando por cada una de las posiciones de la EEPROM, y estableciendo a los leds el color que les corresponde.

Estarás pensando: Vale perfecto ¿y a mi qué? Ahora te explico lo que te será realmente útil: los comandos para la configuración de los colores de la tira led. Por ahora (y digo por ahora porque tengo pensado hacer más versiones del programa) el programa de Monled solo tiene un comando, que sirve para poner un led o un conjunto de leds de un color. Para la introducción y envío de comandos utilizo el protocolo Moncada (un protocolo inventado por mi que ahora te voy a explicar) (No es nada difícil, no te asustes).

El protocolo Moncada consiste en que los comandos deben tener 9 caracteres y estar seguidos de una serie de argumentos que pueden tener un número sin especificar de caracteres. Además, cada comando debe terminar en un ampersand (&) si no, no será reconocido. Es decir, deben seguir el siguiente modelo:

CCCCCCCCCpppppp...&

Donde C sería el comando, que debe tener 9 caracteres y p serían el resto del comando o los argumentos, que no tienen un número fijo de caracteres. Por supuesto, el comando debe terminar en &. 

Después de este tostón te explico el comando que de verdad te va a servir para controlar la tira:
PINTALEDS LLL RRR GGG BBB&
Este comando se encarga de poner un color a un/unos leds de la tira. El comando es PINTALEDS y todo lo demás son argumentos:
  • LLL: corresponde al número del led que quieres encender/cambiar el color/apagar. Los leds están numerados empezando por el 0, que sería el led más cercano a la conexión de la tira con el Arduino. Aquí puedes introducir:
    - Un número, precedido por 0 o 00, es decir, que si quieres encender el led número 12, tendrás que poner 012, nunca 12 solo, si no, el comando fallará.
    - ENT, que se refiere a todos los leds de la tira, los especificados en la constante NUMPIXELS del principio.
    - MDE, que representa a todos los leds de la mitad derecha de la tira.
    - MIZ, que representa a todos los leds de la mitad izquierda de la tira.
    En cualquier caso, este parámetro siempre debe tener 3 caracteres. Si es un número superior a la constante NUMPIXELS, el comando devolverá fallo, al igual que si es una cadena de texto que no sea "ENT", "MDE" o "MIZ".
  • RRR: el nivel de brillo para el componente rojo que quieres darle al led LLL. Un número del 000 al 255 (siempre formateando los números de 1 y 2 cifras añadiéndoles 2 o 1 cero).
  • GGG: el nivel de brillo para el componente verde.
  • BBB: el nivel de brillo para el componente azul.
Si no te ha quedado muy claro no te preocupes, ¡con algunos ejemplos lo entenderás mejor!

Si queremos poner toda la tira led al color verde (0, 255, 0) usaríamos:
PINTALEDS ENT 000 255 000&

Si queremos poner el primer led de la tira al color blanco (255, 255, 255) usaríamos:
PINTALEDS 000 255 255 255&

Si queremos poner el led 14 (el 13 empezando desde 0) a color amarillo (255, 255, 0), usaríamos
PINTALEDS 013 255 255 000&

Si queremos apagar (0, 0, 0) la mitad izquierda de la tira, usaríamos:
PINTALEDS MIZ 000 000 000&

Sobre todo recuerda dos cosas:
  • Poner el ampersand & al final del comando.
  • Cuando mandes un comando, el Arduino guardará automáticamente los valores en la EEPROM, y cuando lo apagues y vuelvas a encender, ya estará configurado tal y como lo configuraste.
Vale, perfecto, pero ¿cómo le mandas estos comandos al Arduino? Bueno, lo primero de todo es cargar el programa al Arduino, utilizando el Arduino IDE. Una vez nuestro Arduino tiene el sketch, lo siguiente es abrir la comunicación Serial, que se abre en el siguiente botón:


Se nos abrirá la ventana del Serial, donde configuraremos: Sin ajuste de línea y 115200 baudios tal y como aparece en la imagen:


Si lo has configurado bien, verás :
Programa MONLED iniciado, version 1.1
que indica el inicio del programa. Justo después de esto, el programa comienza a establecer los valores guardados en la EEPROM a los leds (Como se ve en la imagen del Serial de arriba).

Si en vez de texto legible, recibes caracteres extraños, como en esta imagen:


es que has configurado mal los baudios (he puesto 9600 en vez de 115200).

Para enviar comandos al Arduino, podemos utilizar otro programa que no sea el Arduino IDE, como por ejemplo PuTTY. Solo tendríamos que: poner el tipo de conexión a Serial, indicar el COM al que hemos conectado el Arduino y los baudios de la conexión (115200), como en la siguiente imagen:


Utilizando PuTTY, puedes conectar el Arduino al ordenador o por el cable USB de siempre (el utilizado para pasar los programas al Arduino), o por un conector USB-TTL como este:


Pero recuerda instalar sus drivers, que si no no te funcionará.

Para utilizar este conector USB-TTL conectaríamos el pin TXD de éste al pin RXD del Arduino, y el pin RXD del USB-TTL al pin TXD del Arduino, es decir, cruzando los cables. (TXD a RXD y RXD a TXD). Cuando instales los drivers de este conector USB-TTL, se le asignará un COM, que es el que tenéis que poner en PuTTY.

Una vez tengas el programa cargado en el Arduino y todo conectado y listo, la cosa debe funcionar. Si no funciona, no dudes en dejarme tu problema en los comentarios. En resumen, a mi me ha parecido un proyecto bastante interesante (en parte porque me encantan las tiras leds). Hacerlo me ha llevado bastante tiempo, pero creo que al final ha merecido la pena.

Por supuesto, el programa no puede quedar así de cutre (cutre porque solo se le puede enviar un comando), por lo que seguramente suba un post con la versión 1.2 del programa Monled. Mientras tanto, si quieres intentar entender el código y mejorarlo tú mismo, me puedes dejar tus mejoras en los comentarios, que estaré encantado de incorporarlas al programa original (siempre que funcionen y tengan sentido ;).

Espero haberte ayudado y enseñado algo sobre las tiras leds y los Arduinos, muchas gracias por leer este proyecto y no dudes en dejar cualquier duda/problema/corrección en los comentarios, que estaré encantado de leerlos.





No hay comentarios:

Publicar un comentario