ESP8266 Programación OTA

Adafruit Motor Shield V2

 

  • Presentar la capacidad de los ESP8266 de ser programados por WIFI.
  • Describir el procedimiento general para OTA.
  • Ver las instrucciones necesarias en nuestros programas.
  • Hacer un pequeño ejemplo al respecto.
  •  

    Material requerido.

     

    Vista principal 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:

    Gestor de tarjetas

    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)

    Version del pluggin ESP8266

    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.

  • Ya hemos comentado en algún momento que Python es mi lenguaje favorito y que espero empezar con el pronto y así aprovechamos para prepararlo.
  • Si usas Mac o Linux ya lo tienes instalado salvo que lo hayas desinstalado tu mismo, pero si usas Windows necesitas descargarlo e instalarlo. 
  •  

    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:

    Opciones

    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.

  • OJO aquí, parece que puede haber problemas de escasez de memoria con los módulos ESP-01 porque he leído por ahí, que tienen menos memoria que otros, solo 512K de Flash, pero siempre he creído que el chip interno era el mismo en todos los modelos y esto parece indicar lo contrario.
  • Así que cuidado si vais a hacer OTA con el ESP8266 01 porque no tengo claro si va a funcionar
  •  

     

    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.

    Seleccionando placa y puerto

    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.

    OTA port selection

    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 :

    Prog_126_2

    void loop()
       { ArduinoOTA.handle();
         digitalWrite(LED_BUILTIN, LOW);
         delay(1000);
         digitalWrite(LED_BUILTIN, HIGH);
         delay(1000);
       }

    ¡Accede al contenido!

    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.

  • Daros cuenta que si vuelcas un programa a tu placa ESP8266 y quieres que se pueda programar vía OTA, ese programa debe contener todo el código necesario para que después puedas acceder de nuevo por OTA. Es una perogrullada, pero si simplemente le vuelcas un programa que no lo soporta, se acabó el tema.
  • También es importante que sepas que cuando vuelcas un programa por OTA, necesitas suficiente memoria para que quepa el nuevo programa además del previo. Es decir necesitas suficiente memoria flash en tu ESP para que quepan ambos programas, lo que puede ser una limitación seria. 
  •  

     

    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:

    Clave de seguridad

     

    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.

  • Soy plenamente consciente de que esto que digo arriba me recuerda peligrosamente a lo que dicen aquellos usuarios de PCs, de los que me he burlado cruelmente toda la vida, cuando afirman que ellos lo hacen bien, pero que el maldito ordenador se niega a obedecer, pero es que me tiene frito el tema.
  • A ver si usándolo vosotros me dais alguna pista de cuál es el problema 
  •  

    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

     

  • Vimos que los ESP8266 disponen de la capacidad de ser reprogramados directamente por OTA sin necesidad de cables.
  • Vimos las dependencias necesarias para preparar el sistema.
  • Vimos un ejemplo practico de como hace este programación OTA. [/three-fourth][margin value=»5″ /]
  •  

    Deja una respuesta