Con el uso de placas como el nodeMCU y otras que incorporan también el módulo ESP8266 es posible, de forma muy simple, subir los sketchs de forma inalambrica, prescindiendo de la conexión USB, desde el entorno de desarrollo de arduino. Esto facilita enormemente las tareas de mantenimiento y actualización de todos aquellos dispositivos IoT que diseñemos de esta manera.

La forma de implementarlo es muy sencilla. Si tenemos instalado el soporte para ESP8266 en el IDE de arduino nos aparecerá en el menú una carpeta de ejemplos de código para esta arquitectura denominado arduinoOTA. Se trata de una librería que contiene el código necesario para que nuestro módulo responda a peticiones de reprogramación de su memoria flash via wifi. Recibirá el nuevo sketch en formato binario, lo almacenará en memoria y, una vez comprobada su integridad sobreescribirá con estos datos la memoria de programa tras lo cual generará un reset y…. ya tenemos en ejecución el nuevo código.

Si examinamos el código de los ejemplos como BasicOTA parece que hay que incluir bastantes líneas de código adicionales en nuestro proyecto. Sin embargo esto no es así. Se supone que nuestro código ya incluye librerías de acceso a wifi y la gestión de este. Entonces pues, lo unico que tenemos que añadir son dos líneas: ArduinoOTA.begin(); dentro de la función setup() y ArduinoOTA.handle(); en nuestro bucle principal loop().

Existen también unas funciones callback que se ejecutan cuando se dan determinados eventos ya sea el inicio de la programación o un error de conexión por ejemplo. Estas funciones están disponibles para introducir en ellas nuestro propio código para que nuestro dispositivo haga algo concreto cuando ocurra una determinada condición. Aparecen en el sketch BasicOTA pero no es necesario que incluyamos todas esas líneas en nuestro proyecto.

Resumiendo, debemos incluir como mínimo en nuestro código:

 #include <ESP8266WiFi.h> 
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <WiFiUdp.h>

Además de las líneas anteriormente mencionadas:

ArduinoOTA.begin(); dentro de la función setup() y siempre después del inicio de las funciones wifi tras comprobar que se ha conectado con éxito a la red.

ArduinoOTA.handle(); dentro de la función loop().

Así pues, una versión minimalista del conocido “blink.ino” con funcionalidad OTA que, por cierto, significa “Over The Air” quedaría tal que así:

Casi se me olvida un detallito: en teoría necesitamos tener instalado en el sistema python 2.7 (ojo! versiones posteriores como la 3.5 no funcionan) puesto que el soporte para OTA utiliza scripts en python para el proceso de volcado via wifi. Python 2.7 se puede descargar desde su web oficial Aquí. No obstante, he instalado recientemente Arduino en un PC nuevo y he comprobado que la funcionalidad OTA funciona perfectamente sin haber instalado Python. Es posible que las versiones mas recientes de Arduino no requieran nada especial para esto.

Una vez tengamos escrito un sketch como el anterior que incorpora soporte para OTA hay que volcarlo a la placa vía puerto USB como hacemos habitualmente con todos. A partir de este punto, una vez nuestra placa arranque y se conecte a la red sera detectada por el IDE de arduino, aunque a veces se resiste y tenemos que cerrar y volver a abrir arduino. Nuestro dispositivo aparece en el menú Herramientas/Puertos como “puerto de red” con la IP que le haya sido asignada. No tenemos mas que seleccionarlo y a partir de entonces subimos los sketchs vía wifi de forma sencilla y eficaz.

Ya con el sistema mínimo funcionando podemos personalizar algunos aspectos como por ejemplo cambiar el nombre de Host de nuestra placa (el que la identifica y aparece en el menú puertos) que por defecto es esp8266 – chipID , y es muy conveniente personalizar si tenemos varios dispositivos IoT, con la siguiente línea de código:

ArduinoOTA.setHostname(“myesp8266”);

El puerto TCP/IP que se usará para el volcado es, como no podía ser de otra manera, el 8266 pero puede cambiarse con una llamada al método ArduinoOTA.setPort(num).

Y, por último pero no menos importante, existe la opción de establecer una contraseña para proteger nuestro dispositivo de intentos de reprogramación no autorizados. De esta manera cuando procedemos a subir un nuevo sketch desde el IDE se nos pide que la introduzcamos. Activaremos esta opción llamando al método ArduinoOTA.setPassword(“password”).

Como aspecto negativo es de tener en cuenta que la placa que utilicemos deberá tener el doble de espacio de memoria de programa de lo que ocupe nuestro código (ya que el nuevo código se guarda temporalmente durante el proceso de descarga y sólo una vez comprobada su integridad se sobrescribe reemplazando al programa actual).

También sería interesante tener disponible la opción OTA a través de una conexión Bluetooth para aquellos dispositivos que no utilizan conexiñon a redes wifi.