16 diciembre 2015

IoT para Principiantes - Luces Navideñas

En la entrada anterior aprendimos a configurar nuestro IDE Arduino y a conectar el ESP8266 para subir Sketchs y crear proyectos del Internet de las Cosas (IoT).

Ya que estamos a punto de celebrar las fiestas de Navidad y año nuevo, se nos ocurrió hacer un secillo proyecto IoT que utilizara un mínimo de componentes y que nos sirviera para mostrar toda la potencia de este pequeño dispositivo así que se nos ocurrió la idea de hacer unas luces navideñas IoT como las que mostramos en el siguiente video:

¿Listo para intentarlo? ¡Comencemos!


Introducción


El ESP8266 con su velocidad de hasta 80Mhz y 1MB de memoria de programa es, de fabrica, muchísimo más rápido y potente que los Arduinos más básicos a solo una fracción del precio. Sin embargo, tiene una gran debilidad y es que tiene muy pocas E/S que se puedan utilizar para realizar proyectos interesantes.

Como ejemplo, en su construcción más sencilla el ESP8266 tiene únicamente dos pines de Entrada/Salida de propósito general (GPIO) que podemos utilizar en nuestros proyectos (excluyendo el puerto serie), esto nos limita considerablemente las cosas que se pueden realizar sin requerir demasiado hardware adicional.


 

El proyecto que les proponemos tiene la ventaja que utiliza LEDs programables que solo requieren una línea de GPIO de nuestro ESP8266 por lo que podemos incluso agregar otras funciones luego y dejar libre el puerto serie para poder monitorear el funcionamiento del mismo.

En este proyecto haremos uso de diferentes tecnologías, el módulo ESP8266, tiras LED programables WS2811 y las herramientas Arduino y el MIT App Inventor para subir el programa y controlarlo desde Android. Para facilitarte seguir este tutorial hemos creado este índice con los contenidos de esta entrada:

Índice:

Parte I - Armando nuestro circuito


Para armar el circuito necesitamos los siguientes materiales:
  • Tira de LED con el chip WS2811 o compatible (Nuestra tira es de 60 LEDs)
  • Fuente de voltaje de 5V@4A*
  • Regulador de voltaje lineal 3.3V
  • ESP8266
  • Convertidor de Nivel Lógico 
  • Convertidor USB-Serie FTDI a 3.3V**
*En la foto utilizaremos una fuente de 12V@4A y un convertidor DC/DC para obtener los 5A requeridos.
**Este componente solo se utiliza para programar el ESP8266 no es necesario mantenerlo conectado una vez se ha cargado el Sketch y se ha verificado que funciona adecuadamente.

Los LED WS2811 son LEDs programables en los que podemos configurar color e intensidad con una sola línea de datos. Esto nos permite conectarlos casi directamente a nuestro proyecto sin mayor hardware adicional. Aunque en teoría no debería de ser necesario, también utilizaremos un convertidor de nivel lógico para hacer más estable el funcionamiento de nuestras luces ya que estaremos trabajando con el voltaje de alimentación de 5V y el voltaje de trabajo de nuestro ESP8266 es de a penas 3.3V.

Habiendo dicho lo anterior armamos nuestro circuito de la siguiente manera:





Parte II - Cargando nuestro Sketch


El ESP8266 estará funcionando escencialmente como un pequeño servidor web local al que podremos acceder desde el navegador y más adelante desde un aplicativo para Android.

La idea general es que al acceder una página web podamos modificar los parámetros de colores de la tira y el ESP8266 se encargue de hacer las transiciones necesarias.

Sin embargo antes de continuar haciendo cambios a nuestro Sketch debemos conocer la configuración de red.

Parte II.A - Obteniendo la información de la red inalambrica local


Para configurar adecuadamente el Sketch de Arduino debes asegurarte de tener a la mano la siguiente información:
  1. El nombre de la red inalambrica a la cual nos conectaremos.
  2. La clave que se utiliza para acceder a la misma.
  3. Una dirección IP Utilizable IP que podemos asignar a nuestro módulo.
  4. La puerta de enlace.
  5. La máscara de red.
Normalmente el módulo ESP8266 obtiene su propia IP de forma automática a través de servicio de red conocido como DHCP, sin embargo, para este ejemplo podría ser complicado averiguar cuál fue la dirección IP adquirida por el módulo. Por lo que vamos a establecer una dirección IP manual que podamos asegurarnos que no va a cambiar y la podamos acceder para controlar el módulo.

Para determinar la IP a utilizar lo haremos de forma empírica. Lo ideal sería revisar las tablas de asignación DHCP en el router o access point, sin embargo sabemos que no siempre se tiene acceso a esta configuración por lo que estos pasos que listaremos a continuación deberían de funcionar en la mayoría de casos.

  • Si estás en Windows y ya estás conectado a la red inalambrica en tu teclado presiona [Tecla Windows]+R y luego escribe cmd.


  • Dentro de la ventana escribe "ipconfig". Observarás que se muestra una gran cantidad de información.


  • Busca la sección llamada "Adaptador de LAN inalámbrica Conexión de red inalámbrica". Anota los datos que aparecen bajo "Dirección IPv4", "Máscara de subred" y "Puerta de enlace predeterminada":


  • Recuerda anotar estos datos y tenerlos a la mano ya que los utilizaremos en nuestro Sketch. Para este la información IP correspondiente es la siguiente:

Puerta de enlace: 192.168.223.1
Dirección IP: 192.168.223.50
Máscara de Red: 255.255.255.0

  • Vamos a elegir una IP a prueba y error ya que no queremos complicar esta guía accediendo a configuraciones de routers o instalar software adicional. Si tu dirección IP es por ejemplo 192.168.223.50 intenta sumando o restando 1 al último dígito por ejemplo: 192.168.223.49 o la 192.168.223.51.
  • El siguiente paso es determinar si la IP está "libre". Para hacer esto en la misma ventana de comandos escribe "ping" y la ip que elegiste, como mostramos a continuación:


  • Si aparece "Host de destino inaccesible" puedes tener cierta certeza que la dirección IP no está siendo utilizada y puedes actualizar tus datos de configuración acorde. Por ejemplo:

Puerta de enlace: 192.168.223.1
Dirección IP: 192.168.223.49
Máscara de Red: 255.255.255.0

Si estás en una red de trabajo o hay muchos clientes conectados al WiFi lo mejor es que revises la configuración de red desde el router o access point. Lástimosamente no existe una guía universal para esto y deberás consultar el manual del fabricante. Si no tienes acceso al router puedes intentar con un scanner de direcciones IP para revisar cuales se encuentran libres en tu red.

Parte II.B - Agregando la información de configuración a nuestro Sketch


Antes de continuar descarga el archivo del proyecto de la siguiente dirección:


También asegurate de instalar la bibliteca Neopixel de Adafruit. Puedes descargar las bibliotecas de la siguiente dirección:


Cuando estés listo sigue estas instrucciones:
  • Descomprime la carpeta y busca el archivo "Arduino/LedStripeIoT/LedStripeIoT.ino"

  • Modifica las siguientes líneas del Sketch con la información de tu red local y la configuración IP que obtuviete en el paso anterior, el pin a utilizar (2) para controlar la tira y el tamaño de la tira. En nuestro caso de 60 LEDs.
/* Agrega el nombre y clave de acceso de tu red inalambrica*/
#define SSID "Manda internet al 2020"
#define PW "nohayinternet"

/* Cambia la configuración IP de tu red local */
#define LOCALIP "192.168.223.49" // String for the local server configuration
IPAddress ip_addr(192,168,223,49); //Requested static IP address for the ESP
IPAddress gw(192,168,0,1); // IP address for the Wifi router
IPAddress netmask(255,255,255,0);

/* PIN de la tira de LED */
#define PIN 2 // Pin for RGB LED stripe
#define STRIP_SIZE 60 // Number of LEDs



Hasta este punto esa información nos indica que todo ha funcionado bien. Si lo deseas puedes desconectar el FTDI y dejar el ESP8266 trabajando de forma independiente conectado a la fuente y a los reguladores de voltaje. Si necesitas monitorear que todo esté funcionando bien, deja conectado el FTDI ya que cada vez que un cliente se conecte y cambie el color se reportará en el puerto serie.

Parte III - Controlando la tira led desde el navegador.


Hemos creado este sketch de tal manera que sea fácil controlarlo desde la URL del navegador. Antes de continuar explicaremos un poco su funcionamiento.

El Sketch que acabamos de cargar en nuestro ESP8266 funciona como un pequeño servidor web. Así que si accedemos desde nuestro navegador nos mostrará una página como la siguiente:



La dirección de control corresponde a la IP estática que configuramos al inicio en este ejemplo http://192.168.223.49/

El formulario que se presenta tiene tres campos y cada uno corresponde al color que nos interesa que se muestre en nuestra tira de LEDs. Los diferentes colores de la tira se derivan de la combinación de estos tres colores primarios.

Por ejemplo si ingresamos los valores 125, 0 y 0 (R, G y B) y hacemos clic en "Cambiar Color" el navegador debería de mostrarnos una respuesta como la siguiente:


Y la tira debería de cambiar al color correspondiente como se muestra en esta imágen:



¡Ahora que ya controlamos la tira desde el navegador vamos a ir un paso adelante y vamos a crear una aplicación sencilla para Android que nos permita realizar el control desde nuestro celular!

Parte IV - Controlando la tira desde Android

Al principio del video veíamos como la tira se controla fácilmente desde una App en Android. Esta aplicación esencialmente se encarga de enviar el formulario que mostramos en el paso anterior pero desde la misma aplicación en Android y con una interfaz más interactiva y amigable.


En esta aplicación solo debes de incresar la dirección IP asignada al ESP8266, elegir el color que deseas con los sliders y hacer clic en "Send color".

La aplicación ha sido construira en el MIT App Inventor, esta es una plataforma en línea de desarrollo de aplicaciones Android. Su interfaz es completamente visual, la programación de las interacciones se realiza utilizando bloques funcionales por lo que resulta extremadamente sencillo para todo aquel que quiera crear interfaces de control en minutos.

Sin embargo, para instalar los APK generados por esta plataforma es necesario que antes habilites la instalación de software de fuentes desconocidas en tu smartphone o tablet.

Para instalar la aplicación busca la carpeta "AppInventor\binaries" y copia a tu smartphone el archivo RemoteRGBTest.apk en una carpeta accesible. Una vez ahí abrela en tu smartphone y Android intentará instalarla.

Parte IV.A Funcionamiento de la App


En esta entrada vamos solo a explicar las generalidades del funcionamiento de la App para que luego puedas modificarla a tu gusto desde el App Inventor del MIT. Dejaremos un tutorial detallado para uso de App Inventor en otra entrada.

Si fueron curiosos, habrán notado que cuando probamos acceder la interfaz desde el navegador la dirección que aparecía tenía un formato particular:

http://192.168.223.49/setColor?rVal=125&gVal=0&bVal=0

En jerga técnica esto es lo que se conoce como una URL, aún siendo un poco más técnicos diremos que es una "petición" tipo GET. Si descomponemos la petición en partes nos encontramos con los siguientes componentes:


Cada parte de la URL tiene la función que detallamos a continuación:
  • Servidor: Dirección IP o nombre del servidor que deseamos acceder, en este caso nuestro ESP8266.
  • Recurso: Esto puede ser un recurso físico en el servidor que como clientes deseamos acceder. En nuestro caso el Recurso representa la función "setColor" que en nuestro Sketch se encarga de cambiar el color de la tira.
  • Parámetros(Argumentos): Estos representan los valores que deseamos enviar al servidor para que este los procese. Nota que están separados del resto de la URL por el símbolo de interrogación ". Notarás también que los parámetros están separados a su vez por el símbolo &. Los parámetros que se pasan al servidor normalmente son identificados por un nombre que debería ser único (marcado en rosa) y su valor se especifíca luego del símbolo "=" (marcado en color morado. Para nuestro ejemplo tenemos tres parámetros llamados rVal, gVal y bVal correspondientes a las intensidades de los colores Rojo, Verde y Azúl.
Ten esto en mente ya que es muy importante que lo comprendas para entender el funcionamiento de la aplicación.

Si tienes una cuenta en el App Inventor del MIT puedes importar el archivo de proyecto "RemoteRGBTest.aia" que se encuentra en la carpeta de proyecto "AppInventor\". Al abrirlo te encontrarás con algo como esto:


En nuestra aplicacion podemos diferenciar tres secciones principales:


  • Parte 1: Esta contiene una pequeña etiqueta y un campo de texto. Esta seccion permitirá al usuario especificar la IP del ESP8266.
  • Parte 2: Los sliders para los colores permitirán al usuario establecer el valor de intensidad para cada uno de los colores primarios. Al hacer clic en cada uno podemos modificar las propiedades  y establecer cual es el valor mínimo y máximo que podrá tener cada uno (en nuestro caso desde 0 hasta 255). También se incluye un "canvas" que no es más que un espacio en blanco, cuyo color de fondo se cambia en función de los valores seleccionados de los tres sliders. Este canvas nos dará una idea del color seleccionado antes de enviarlo al ESP8266.
  • Parte 3: Este es un botón de acción que esencialmente se encargará de construir que explicabamos al inicio tomando los valores de las Partes 1 y 2. Es posible realizar el cambio de forma automática cuando se mueve el slider, lástimosamente en la etapa de pruebas descubrimos que al enviar la petición luego de que cambiabamos el valor del slider esto generaba muchas peticiones que no podían ser atendidas (ver limitaciones de este proyecto al final).
De la aplicación anterior tenemos dos bloques funcionales grandes. Uno que se encarga de cambiar el color de fondo del Canvas al mover el slider:


Los bloques en café (interacciones) ejecutan el código dentro de la llave cada vez que el usuario interactua con el Slider. El bloque Morado (procedimiento) se ejecuta cuando es "llamado" (call) por alguna de las interacciones de los usuarios.

El  bloque morado esencialmente establece el color de fondo del canvas tomando los valores de cada uno de los sliders y "creando un color" con ellos. Esto permite que el usuario pueda visualizar el color antes de cambiarlo en la tira de LED.

El segundo bloque funcional corresponde a la acción ejecutada al hacer clic en el botón que envía la petición:


Este bloque puede parecer complicado, pero sigue la misma lógica que el anterior. El cuadro café ejecuta el código cada vez que se hace clic en el botón.

El procedimiento "sendColors" se encarga de concatenar (join) diferentes textos estáticos para construir la URL. Si tuvieramos que hacer una representación resumida de lo que hace esta función diríamos que une los siguientes componentes (+ indica concatenación, textos estáticos se encierran entre ""):

"http://"+(Dirección IP en TextBox1)+"/setColor?rVal="+(Valor de color en Slider1)+"&gVal="+(Valor de color en Slider2)+"&bVal="+(Valor de color en Slider3)

Luego de construir la URL ejecuta la petición "GET" que internamente se conecta simulando un navegador web y accede a la URL que especifcabamos al inicio.

¡Y listo! Modifica el proyecto en el App Inventor y agrega funcionalidad adicional. Solo te recomendamos tomar en consideración las siguientes limitaciones del proyecto que examinaremos en la siguiente sección.

Parte V - Limitaciones del proyecto


Si bien hasta ahora parece que nuestro proyecto funciona de manera genial, hay varias limitaciones que debes de tomar en consideración:
  1. La biblioteca que controla las tiras LED no está optimizada para el ESP8266 y bloquea el hilo de ejecución principal. Al desarrollar este proyecto varias veces nos encontramos con que el ESP8266 se "trababa" y reiniciaba a causa de esto. Este código tiene algunas instrucciones que previenen que tu ESP8266 se reinicie pero tomalo en cuenta si quieres modificar el Sketch.
  2. El servidor implementado en el ESP8266 puede responder unicamente a UNA petición a la vez. En otras palabras no soporta concurrencia. En otras palabras diferentes... Solo una persona puede controlar la tira a la vez. Esto también puede darnos problemas si intentamos cambiar el color demasiado rápido.
  3. El desempeño está limitado al largo de la tira. De nuevo la biblioteca utilizada no está optimizada para el ESP8266 por lo que tiras muy largas podrían dar problemas.

Parte VI - Comparando con soluciones comerciales:


Algo que nos llamó la atención de este proyecto es lo extremadamente barato que resulta su construcción. Buscando en Google una tienda especializada en soluciones de LEDs encontramos algunas opciones comerciales para hacer una comparativa (Costos en USD):

SoluciónCosto TotalNúmero de tirasProgramableSoporte WiFi
ESP8266 (Controlador + Convertidor de Nivel + Regulador 3.3V)<$15(Inc. Impuestos)1
T-1000S SD Card Off-line RGB LED Controller$59(Sin impuestos)1Pre-ProgramadoNo
LT-600 LED Lighting Control System$499(Sin impuestos)16Pre-ProgramadoNo

Si bien las soluciones comerciales tienen algunas funciones adicionales como guardado de secuencias en memoria SD o la posibilidad de escalas de grises o de mostrar videos, gastar $499 puede ser un overkill para un proyecto sencillo. Es interesante notar que ninguna de las opciones comerciales tiene soporte WiFi de fabrica y el tamaño es considerablemente mayor al que podría ocupar nuestro proyecto.

Eso sin considerar que ninguna de las opciones comerciales listas para usar es Open-Source-Hardware o al menos permita re-programar las funciones, así que aunque la funcionalidad podría considerarse limitada para un tipo único de tira, las posibilidades de crear soluciones interactivas con este pequeño proyecto son prácticamente ilimitadas.

Lástimosamente no nos dió el tiempo para modificar el código del controlador de tiras de led de las series WS2811 pero pensamos que podría optimizarse y mostrar un desempeño similar a soluciones comerciales.

¡Esperamos que pases unas felices fiestas con tus familiares y amigos! ¡Diviertete mucho con el proyecto de tiras de LED programables en estas fiestas y sientete libre de inventar funcionalidad e interacciones adicionales!

¡Hasta la próxima!

Más información y recursos