[ESP32] : Programmation Over The Air

20 février 2022 rdorigny 0 commentaires

La fonctionnalité Over The Air (OTA) permet de téléverser un programme sur certains IOT à partir du moment où ils supportent cette technologie et qu'ils disposent d'une communication sans fil. Très pratique, cela permet par exemple de configurer un ESP32 sans devoir le déplacer! Et donc, nous ne sommes plus contraint de le connecter en filaire via un cordon USB, tout se fait par le réseau.

Dans cet article, je vais vous montrer comment mettre en œuvre l'OTA sur un microcontrôleur ESP32 assez simplement.





1) Préparation : IP fixe sur l'ESP32

La première étape consiste à disposer d'une adresse IP fixe si ce n'est pas déjà fait sur votre ESP32. Cela implique de vérifier que cette adresse est libre sur votre réseau local. Pour le vérifier, il suffit de faire la commande ping 192.168.1.201 si on veut vérifier que cette adresse répond. Si pas de réponse, c'est qu'elle est libre et que l'on peut l'utiliser. N'hésitez pas à noter votre plan d'adressage sur un fichier pour le garder en mémoire.

Les commandes afin de configurer une adresse IP fixe de l'ESP32 :
#include "WiFi.h"

//Pour le wifi
const char* ssid = "votre_ssid";
const char* password =  "votre_password";

int cpt;

//Phase d'initialisation++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
  //initialize Serial Monitor
  Serial.begin(115200);

  delay(4000);   //Délais nécessaire avant d'appeler le wifi

  //Connexion au wifi
  IPAddress ip(192,168,1,201);
  IPAddress gateway(192,168,1,254);  //Adresse de la box
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192,168,1,254);   //Adresse de la box
  WiFi.config(ip,gateway,subnet,dns);
  WiFi.begin(ssid, password); 
  while (WiFi.status() != WL_CONNECTED) { //Check la connexion
    delay(1000);
    Serial.println("Tentative de connexion au WiFi...");
    cpt++;
    if (cpt>30)
      {
      Serial.println("Pas de connexion au wifi! Reboot automatique...");
      esp_restart();
      }
  }
  Serial.println("Connexion au réseau local wifi: OK!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); 
 
}

//Boucle d'attente de réception de la distance+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void loop() {
  delay(5000);
  cpt++;

  Serial.println("Hello world");
  
  if (cpt>1000000) ESP.restart();
  }


2) Configuration de l'OTA

Pour bénéficier de l'OTA, il est nécessaire d'appeler la bibliothèque ArduinoOTA.h. Elle est intégrée dans les dernières versions du gestionnaire de carte de l'ESP32.

La commande ArduinoOTA.setHostname("TestOTA"); permet de donner un nom au module sur le réseau.
#include "WiFi.h"
#include "ArduinoOTA.h"

//Pour le wifi
const char* ssid = "votre_ssid";
const char* password =  "votre_password";

int cpt;

//Phase d'initialisation++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
  //initialize Serial Monitor
  Serial.begin(115200);

  delay(4000);   //Délais nécessaire avant d'appeler le wifi

  //Connexion au wifi
  IPAddress ip(192,168,1,201);
  IPAddress gateway(192,168,1,254);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192,168,1,254);
  WiFi.config(ip,gateway,subnet,dns);
  WiFi.begin(ssid, password); 
  while (WiFi.status() != WL_CONNECTED) { //Check la connexion
    delay(1000);
    Serial.println("Tentative de connexion au WiFi...");
    cpt++;
    if (cpt>30)
      {
      Serial.println("Pas de connexion au wifi! Reboot automatique...");
      esp_restart();
      }
  }
  Serial.println("Connexion au réseau local wifi: OK!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); 
  // Nom de l'objet OTA
  ArduinoOTA.setHostname("TestOTA");
  ArduinoOTA.setPassword("test");
 
}

//Boucle d'attente de réception de la distance+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void loop() {
  ArduinoOTA.begin();
  delay(5000);
  cpt++;

  Serial.println("Hello world");

  ArduinoOTA.handle();
  
  if (cpt>1000000) ESP.restart();
  }

La fonction ArduinoOTA.begin() initialise l'instance OTA, et peut être appelée à chaque fois dans la boucle loop(), elle s'autodétecte et ne se configurera qu'une seule fois. Il est possible de la mettre dans le setup(). En revanche, la fonction ArduinoOTA.handle() doit être absolument dans la boucle, puisque c'est bien elle qui produit le téléversement du code dans l'ESP32.

Attention, pour sécuriser votre IOT il est vivement conseillé de paramétrer un mot de passe de session pour autoriser l'upload par ArduinoOTA.setPassword("test");.

Avant de lancer le téléversement, il est nécessaire au préalable de sélectionner le port série réseau comme ci-dessous.

Ensuite, on lance le téléversement par le bouton de l'IDE Arduino, et la première fois, le mot de passe est demandé.

Si vous êtes sur Windows, il est possible de devoir autoriser l'échange en ouvrant le pare-feu (uniquement pour ce flux).

Enfin, le téléversement se réalise.

Certains ESP32 demandent une pression du bouton BOOT pour autoriser le téléversement du programme. Evidement, dans ce cas, il n'est pas nécessaire de le faire, cette contrainte est désactivée par l'OTA.

Conclusion

La fonctionnalité OTA est pratique pour configurer à distance vos IOT. En revanche, elle ne permet pas de réceptionner la liaison série par le réseau. Un peu dommage, peut-être dans une future version.

Dans mon cas, où je commence à avoir beaucoup d'ESP32, c'est très appréciable de pouvoir les reparamétrer depuis mon bureau sans devoir démonter le biniou là où il est. Un truc de feignant en quelque sorte! :-)







Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2022 www.doritique.fr par Robert DORIGNY