Adafruit Motor Shield V2
Material requerido.
ModeMCU V2 |
Programando el ESP8266 por vía inalámbrica
El ESP8266 dispone de un truco de lo más interesante que consiste en aceptar la programación OTA (Over The Air) o sea, de modo inalámbrico, lo que desde luego abre muchas posibilidades para la IOT, porque no siempre es fácil poder ir a ciertos sitios con el portátil y un cable para reprogramarlos (Y en muchas ocasiones suele ser un asco).
Por eso la posibilidad de reprogramar un módulo de ESP a través de WIFI, es algo muy de agradecer y vamos a dedicar esta sesión a ver como hacerlo, que es algo que se me había pasado hasta que uno de nuestros amables lectores me puso sobre la pista.
Además el modulo permite también la descarga de programas vía navegador web, aunque eso lo dejamos para otro día (Más que nada porque hasta la fecha no he entendido nada del asunto) y hoy vamos a centrarnos en cómo hacer volcado de programas desde el IDE Arduino, de forma inalámbrica vía WIFI.
Este documento es poco mas que una traducción simplificada de la magnifica guía que, sobre el tema,podeis encontrar en GitHub en perfecto ingles aquí .
Instalando todo lo necesario
Para empezar necesitamos tener instalada al menos la versión 1.6.7 del IDE Arduino. Aunque parece que funciona con alguna versión anterior, la 1.6.7 es la primera que soporta la librería Arduino OTA y que va a ser la norma de aquí en adelante, por ello no vale la pena dedicar tiempo a métodos que ya están a punto de obsolescencia (El nombre tecnopijo es Deprecated)
Si vuestra versión IDE es inferior, este es un buen momento para que os pongáis al día con una visita a arduino.cc .
Necesitáis también tener al día el pluggin Arduino IDE para ESP8266. Aquí podéis encontrar la forma de instalarlo si aun no lo tenéis instalado, y en caso contrario asegurararos de tenerlo al día, haciendo:
Y después hay que buscar que tengas al menos la 2.0.0 del pluggin ESP8266 (Aunque podéis ver que hay una posterior desde ya)
Para subir un poco el nivel, aun necesitáis otra cosita de poco. Instalar Python.
En serio no es broma. El pluggin se apoya en Python para varias cosas y exige tenerlo instalado para volcar cosas a través del OTA.
Puedes descargar Python 2.7 de aquí .
Mucho cuidado. Instala la versión 2.7, la versión 3.5 no vale. Aunque sería difícil precisar el motivo, vamos a comentar que son dos versiones diferentes de Python y que con la versión 3.5 no va a funcionar.
Python se instala en Windows con intro intro, y solo tienes que tener cuidado con una pregunta, que viene sin marcar por defecto y es importante que la pinchéis para evitar problemas. Consiste en añadir el ejecutable Python al Path del sistema:
Con esto tenemos listas ya todas las dependencias necesarias. Yo voy a usar una placa WeMos D1 por la comodidad de las conexiones, pero en principio la programación OTA del módulo está disponible para todas las versiones del ESP8266 una vez que está en modo de programación, y con esta no tengo que mirar que pines conecto o no.
Arduino y ESP8266 OTA
En realidad el tema es bastante más sencillo de lo que parece al principio, y como el movimiento se demuestra andando, vamos a plantear un par de programas muy simples que ilustren el modo por el que podemos implementar OTA en nuestros programas con el ESP8266.
Para empezar tenemos que incluir unas cuantas librerías en nuestro programa:
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h>
Las 3 primeras son auto explicativas. EL manejo del chip WIFI, la gestión de los DNS y el manejo de UDP que no se para que usa, pero el manual dice que lo pongamos y yo soy muy obediente. La última es propiamente la librería de gestión del OTA.
Naturalmente para poder programar nuestro módulo vía WIFI, necesitamos que se conecte a la red y esté accesible y por eso vamos a definir las claves de la WIFI, que en mi caso son:
const char* ssid = "charly"; const char* password = "contrase";
Y que debéis adaptar a vuestra conexión con los valores que correspondan y conectamos con:
WiFi.mode(WIFI_STA); // Tipo de conexion WiFi.begin(ssid, password);
Ahora necesitamos comprobar que la conexión se ha realizado correctamente:
while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); }
Para ello hacemos un bucle que reinicia la conexión en caso de que esta sea fallida y no permite que el programa continue hasta que la conexión sea válida y arrancamos la gestión del OTA:
ArduinoOTA.begin();
Una vez establecida la conexión podemos imprimir la dirección IP que hemos recibido:
Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP());
Y ahora solo nos queda gestionar las conexiones vía OTA en nuestro loop() mediante la instrucción:
ArduinoOTA.handle();
De lo más elegante, ¿No os parece? Vamos a hacer un ejemplo completo para programar un volcado del Blinking LED por OTA, y para ello vamos usar el programa Prog_126_1 que no es más que una implementación completa de lo que hemos visto hasta ahora:
Naturalmente la primera vez que enviemos el programa a nuestra placa, tiene que ser vía el IDE y un puerto USB, así que aseguraros de elegir correctamente vuestra placa y vuestra puerta serie.
La documentación de la librería dice que cuando vuelcas el programa con la gestión de OTA, en unos segundos os aparecerá la opción de un puerto OTA en el IDE.
Pero en mi caso rara vez me pasaba esto. He tenido que desconectar la placa del USB y cerrar y abrir el IDE Arduino para que me aparezca la mayoría de las veces. Una vez hecho podéis seleccionar el nuevo puerto OTA que os aparece debajo de del puerto COM que habías usado hasta ahora.
Verás que no es necesario que cambies de Serie a OTA en uno de los menús, sino que selecciona automáticamente la opción OTA en cuanto elijas este puerto de comunicaciones.
Al acabar, tu placa ESP8266 está lista para intentar volcar un nuevo programa via WIFI OTA.
Solo falta enviar ahora un programa para comprobar que el sistema funciona. Para ello hemos preparado una pequeña variante de este mismo programa que hemos usado hasta ahora, pero que en el loop tiene incluido el blinking led :
void loop() { ArduinoOTA.handle(); digitalWrite(LED_BUILTIN, LOW); delay(1000); digitalWrite(LED_BUILTIN, HIGH); delay(1000); }
La idea es ver en un ejemplo sencillo que podemos volcar un programa vía WIFI sin más complicaciones. Si enviáis ahora este nuevo programa vía OTA, en seguida veréis que la luz de la placa empieza a parpadear cada segundo.
Me ha dado bastante guerra conseguir un volcado estable, porque había un mareo continuo entre ahora te detecto la tarjeta ahora no. Y por otro lado me ha dado muchos errores con algún volcado que ha quedado bloqueado por razones no del todo claras.
En mi caso, estoy moderadamente lejos del router WIFI y la señal es más débil de lo que me gustaría, lo que puede ser una explicación para todos estos problemas. Pero en general, la cosa ha mejorado bastante si desconectaba la tarjeta WeMos D1, y cerraba el IDE Arduino para volver a arrancar todo.
Consideraciones de seguridad
Este primer ejemplo que hemos presentado, no tiene otra intención que la de mostrar un programa mínimo de como volcar un programa a vuestro ESP por OTA, pero seguro que alguien se preguntará ¿Y cualquiera puede buscar mi placa y volcarla un programa? Esto es un riesgo de seguridad grave que convendría atajar.
Como lo señores que han programado la Liberia ArduinoOTA son gente lista, que han ido a buenos colegios, ya han pensado en este problema y proporcionan una primera barrera de seguridad mediante una contraseña.
La forma de activar una password de seguridad que se nos requiera para volcar el programa, es que una vez establecida la conexión WIFI, incluyas una línea como esta:
ArduinoOTA.setPassword((const char *)"123");
Donde puedes sustituir 123 por cualquier contraseña que perfieras. Y cuando intentes enviar el programa saldrá algo asi, para permitirte volcar el programa:
En mi caso no he conseguido hacer funcionar bien el tema del password, porque por más que le doy el que le he puesto, mi ESP8266 insiste en decirme que ese password es incorrecto.
Por otra parte, siempre es buena política seleccionar un puerto IP no estándar para volcar los programas vía OTA, para ponérselo un poco más difícil a los malos.
La librería ArduinoOTA proporciona algunas llamadas interesantes para esto:
void setPort(uint16_t port); void setHostname(const char* hostname); void setPassword(const char* password);
Y esto es todo por hoy. En una proxima sesion veremos como volcar programas una cliente web (Espero)
Resumen de la sesión