fbpixel
Programmer un ESP8266 via WiFi avec l’IDE Arduino (OTA)

Programmer un ESP8266 via WiFi avec l’IDE Arduino (OTA)

Une fonctionnalité très pratique dans le domaine des IoT est la possibilité de programmer un microcontrôleur connecté , comme un ESP8266, via Wifi. Cette technique est appelée Transmission aérienne ou Over-The-Air (OTA) Programming.

Matériel

  • NodeMCU ESP8266
  • Câble USB A Mâle/Micro B Mâle
  • Ordinateur
  • Réseau WiFi

Principe de fonctionnement

En principe, le NodeMCU ESP8266 se programme via le port USB. L’ordinateur communique le programme au microcontrôleur. Lorsque deux appareils sont connectés au même réseau Wifi, ils peuvent communiquer ensemble. On peut donc téléverser un code grâce au réseau Wifi sans avoir à se connecter à chaque microcontrôleur.

Il est aussi possible de téleverser un code sur le NodeMCU lorsqu’il est configuré comme Point d’Accès Wifi. Dans ce cas, l’ordinateur, utilisé pour la programmation, doit être connecté au réseau du NodeMCU.

Ajouter le firmware ArduinoOTA

La librairie ArduinoOTA est disponible à l’installation du gestionnaire d’ESP8266. Pour pourvoir mettre en place la programmation OTA, vous devez installer le firmware. Pour cela, vous pouvez utiliser l’exemple BasicOTA.ino disponible dans l’IDE Arduino.

Veillez à remplacer ssid et password par les identifiants de votre réseau WiFi.

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

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK  "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

Veillez à noter l’adresse IP local de l’appareil (ici: 192.168.1.78).

Une fois ce code téléverser par voie série, vous serez en capacité de téléverser un code via Wifi. Appuyer sur le bouton RST ou EN de votre ESP et redémarrer l’IDE Arduino.

Modifier votre programme avant de le téléverser

Nous plaçons le code d’initialisation dans la fonction initOTA(). Il sera ensuite facile de la copier pour d’autre projet. Et nous allons rajouter un affichage sur le port série pour vérifier que le code a bien été modifié.

ATTENTION: Le code relatif à l’initialisation de ArduinoOTA doit être présent dans tous les codes que vous téléversez ou vous perdrez la possibilité de faire de la transmission aérienne.

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

const char* ssid = "*******";
const char* password = "********";

unsigned long previousMillis;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  initOTA();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();

  if (millis() - previousMillis >= 500) {
    previousMillis = millis();
    Serial.println(F("Code has been update"));
  }
}

void initOTA() {
  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
}

Un fois votre code modifié, sous “Outil> Port”, sélectionnez votre carte dans les ports réseau. (si le port réseau ne s’affiche pas voir chapitre suivant ci-dessous)

Vous pouvez alors téléverser votre code comme vous le feriez avec la communication série.

Sélectionnez à nouveau le port série, puis ouvrez le moniteur série pour vérifier que le code a bien été modifié.

Si le Port Réseau ne s’affiche pas dans l’IDE Arduino

Si le port réseau n’est pas présent dans les options de l’IDE Arduino, il vous faudra effectué une petite manipulation. Vous devez vous rendre dans le Centre Réseau et Partage

Puis aller dans “Modifier les paramètres de la carte”

Cliquez droit sur votre réseau puis aller dans propriétés

Vous pouvez ensuite décocher l’option “Protocole Internet version 6 (TCP/IPv6)”.

Si vous retourner sur l’IDE Arduino, dans “Outil > Port” vous devriez l’option port réseau s’afficher.

Vous pouvez de nouveau cocher le protocole IPv6 un fois que votre port réseau est reconnu.

Bonus: Affichage de message série en OTA

La possibilité de téléverser un programme par Wifi est très appréciable mais, il est bon de noter, que l’on perd la capacité de debugger avec le moniteur série. Il est possible de créer une interface Web sur laquelle on peut afficher des informations provenant du NodeMCU ESP8266.

Nous allons voir ici l’utilisation de la librairie RemoteDebug qui va nous permettre de nous connecter en telnet au microcontrôleur et récupérer les messages envoyés.

  • Commencez par installer la librairie en téléchargeant le ZIP ou via le gestionnaire de bibliothèque.
  • Créez un objet RemoteDebug Debug; après avoir inclus la librairie
  • Initialisez le debug avec Debug.begin(“ESP8266”);
  • Puis remplacer tout les Serial.print par Debug.print
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <RemoteDebug.h>

const char* ssid = "******";
const char* password = "*******";

RemoteDebug Debug;

unsigned long previousMillis;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // init remote debug
  Debug.begin("ESP8266"); 
  
  initOTA();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
  Debug.handle();
  
  if (millis() - previousMillis >= 500) {
    previousMillis = millis();
    Debug.println(F("Code has been update"));
  }
}

void initOTA() {
  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  //ArduinoOTA.setHostname("ESP8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
}

Pour visualiser les messages envoyer via RemoteDebug, nous allons utiliser le logciel PuTTy que nous avons vu plusieurs fois déjà. Pour cette application, nous allons configurer PuTTy en telnet en utilisant l’adresse IP récupérée sur le moniteur série.

Sources

Programmer un ESP32 via WiFi avec l’IDE Arduino (OTA)

Programmer un ESP32 via WiFi avec l’IDE Arduino (OTA)

Une fonctionnalité très pratique dans le domaine des IoT est la possibilité de programmer un microcontrôleur connecté , comme un ESP32, via Wifi. Cette technique est appelée Transmission aérienne ou Over-The-Air (OTA) Programming.

Matériel

  • NodeMCU ESP32
  • Ordinateur
  • Réseau WiFi

Principe de fonctionnement

En principe, un programme est téléversé sur le NodeMCU ESP32 par une connexion série avec le port USB. L’ordinateur communique le programme au microcontrôleur. Lorsque deux appareils sont connectés au même réseau Wifi, ils peuvent communiquer ensemble. On peut donc téléverser un code grâce au réseau Wifi sans avoir à se connecter à chaque microcontrôleur.

Il est aussi possible de téleverser un code sur le NodeMCU lorsqu’il est configuré comme Point d’Accès Wifi. Dans ce cas, l’ordinateur, utilisé pour la programmation, doit être connecté au réseau du NodeMCU. Le code complet est donné à la fin de ce tutoriel.

Ajouter le firmware ArduinoOTA

La librairie ArduinoOTA est disponible à l’installation du gestionnaire d’ESP32. Pour pourvoir mettre en place la programmation OTA, vous devez installer le firmware. Pour cela, vous pouvez utiliser l’exemple BasicOTA.ino disponible dans l’IDE Arduino.

Veillez à remplacer ssid et password par les identifiants de votre réseau WiFi.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid  = "*******";
const char* password  = "********";

unsigned long previousMillis;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  
    // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  //ArduinoOTA.setHostname("esp3232");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

  ArduinoOTA.begin();
  
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

Veillez à noter l’adresse IP local de l’appareil (ici: 192.168.1.33).

Une fois ce code téléverser par voie série, vous serez en capacité de téléverser un code via Wifi. Appuyer sur le bouton RST ou EN de votre ESP et redémarrer l’IDE Arduino.

Modifier votre programme avant de le téléverser

Nous plaçons le code d’initialisation dans la fonction initOTA(). Il sera ensuite facile de la copier pour d’autre projet. Et nous allons rajouter un affichage sur le port série pour vérifier que le code a bien été modifié.

ATTENTION: Le code relatif à l’initialisation de ArduinoOTA doit être présent dans tous les codes que vous téléversez ou vous perdrez la possibilité de faire de la transmission aérienne.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid  = "******";
const char* password  = "********";

unsigned long previousMillis;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  initOTA();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();

  if (millis() - previousMillis >= 500) {
    previousMillis = millis();
    Serial.println(F("Code has been update"));
  }
}


void initOTA() {
  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  ArduinoOTA.setHostname("ESP32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
  .onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  })
  .onEnd([]() {
    Serial.println("\nEnd");
  })
  .onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  })
  .onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });

  ArduinoOTA.begin();
}

Un fois votre code modifié, sous “Outil> Port”, sélectionnez votre carte dans les ports réseau. (si le port réseau ne s’affiche pas voir chapitre suivant ci-dessous)

Vous pouvez alors téléverser votre code comme vous le feriez avec la communication série.

Sélectionnez à nouveau le port série, puis ouvrez le moniteur série pour vérifier que le code a bien été modifié.

Si le Port Réseau ne s’affiche pas dans l’IDE Arduino

Si le port réseau n’est pas présent dans les options de l’IDE Arduino, il vous faudra effectué une petite manipulation. Vous devez vous rendre dans le Centre Réseau et Partage

Puis aller dans “Modifier les paramètres de la carte”

Cliquez droit sur votre réseau puis aller dans propriétés

Vous pouvez ensuite décocher l’option “Protocole Internet version 6 (TCP/IPv6)”.

Si vous retourner sur l’IDE Arduino après l’avoir redémarré, dans “Outil > Port” vous devriez voir l’option port réseau s’afficher.

Vous pouvez de nouveau cocher le protocole IPv6 un fois que votre port réseau est reconnu.

Bonus: Affichage de message série en OTA

La possibilité de téléverser un programme par Wifi est très appréciable mais, il est bon de noter, que l’on perd la capacité de debugger avec le moniteur série. Il est possible de créer une interface Web sur laquelle on peut afficher des informations provenant du NodeMCU ESP32.

Nous allons voir ici l’utilisation de la librairie RemoteDebug qui va nous permettre de nous connecter en telnet au microcontrôleur et récupérer les messages envoyés.

  • Commencez par installer la librairie en téléchargeant le ZIP ou via le gestionnaire de bibliothèque.
  • Créez un objet RemoteDebug Debug; après avoir inclus la librairie
  • Initialisez le debug avec Debug.begin(“ESP32”);
  • Puis remplacer tout les Serial.print par Debug.print
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <RemoteDebug.h>

const char* ssid  = "*******";
const char* password  = "*******";

RemoteDebug Debug;

unsigned long previousMillis;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // init remote debug
  Debug.begin("ESP32");  
  
  initOTA();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
  Debug.handle();
  
  if (millis() - previousMillis >= 500) {
    previousMillis = millis();
    Debug.println(F("Code has been update"));
  }
}


void initOTA() {
  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  ArduinoOTA.setHostname("ESP32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
  .onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  })
  .onEnd([]() {
    Serial.println("\nEnd");
  })
  .onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  })
  .onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });

  ArduinoOTA.begin();
}

Pour visualiser les messages envoyer via RemoteDebug, nous allons utiliser le logciel PuTTy que nous avons vu plusieurs fois déjà. Pour cette application, nous allons configurer PuTTy en telnet en utilisant l’adresse IP récupérée sur le moniteur série.

Bonus 2: Programmation OTA en mode Access Point

Il est possible d’utiliser le réseau créer par le NodeMCU ESP32 en mode Access Point. Pour cela vous pouvez télecharger le code suivant via le port série. Vous devrez ensuite connecter votre ordinateur au réseau du NodeMCU pour pouvoir téleverser un nouveau code par Wifi.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char *ssid = "AC-ESP32";
const char *passphrase = "123456789";

IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);

unsigned long previousMillis;
void setup() {
 Serial.begin(115200);
 Serial.println("Booting");

 //AP config
 Serial.print("Setting soft-AP configuration ... ");
 Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
 Serial.print("Setting soft-AP ... ");
 Serial.println(WiFi.softAP(ssid,passphrase) ? "Ready" : "Failed!");
   
 initOTA();
 Serial.println("Ready");
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
}
void loop() {
 ArduinoOTA.handle();
 if (millis() - previousMillis >= 500) {
   previousMillis = millis();
   Serial.println(F("Code has been update via Wifi"));
 }
}
void initOTA() {
 // Port defaults to 3232
 // ArduinoOTA.setPort(3232);
 // Hostname defaults to esp3232-[MAC]
 ArduinoOTA.setHostname("ESP32");
 // No authentication by default
 // ArduinoOTA.setPassword("admin");
 // Password can be set with it's md5 value as well
 // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
 // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
 ArduinoOTA
 .onStart([]() {
   String type;
   if (ArduinoOTA.getCommand() == U_FLASH)
     type = "sketch";
   else // U_SPIFFS
     type = "filesystem";
   // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
   Serial.println("Start updating " + type);
 })
 .onEnd([]() {
   Serial.println("\nEnd");
 })
 .onProgress([](unsigned int progress, unsigned int total) {
   Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
 })
 .onError([](ota_error_t error) {
   Serial.printf("Error[%u]: ", error);
   if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
   else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
   else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
   else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
   else if (error == OTA_END_ERROR) Serial.println("End Failed");
 });
 ArduinoOTA.begin();
}

Sources

Générer et téléverser des fichiers BIN pour ESP32

Générer et téléverser des fichiers BIN pour ESP32

Lorsque vous avez un certain nombre de microcontrôleurs à flasher avec le même programme, il peut être intéressant de flasher le fichier compilé BIN directement. Cela a deux intérêts. Vous faire gagner du temps sur le téléversement et cela permet à de tierce personnes de téléverser un programme sans utiliser l’IDE Arduino.

Vous ne devriez pas en avoir besoin tous les jours mais je vais vous montrer la méthode pour générer les fichiers BIN et le téléverser dans un microcontrôleur ESP32. Cette méthode peut être adaptée pour d’autre microcontrôleur comme Arduino et ESP8266 avec d’autres outils.

Générer le fichier BIN à l’aide de l’IDE Arduino

Dans le logiciel Arduino, aller dans le menu Fichier puis Préférences.

Cocher les cases “résultats détaillés pendant” pour la compilation et le téléversement (Mode verbose)

Sélectionnez le port et le type de carte sur lequel vous souhaitez téléverser le programme.

Lorsque vous appuyez sur Compiler ou Téléverser, l’IDE Arduino crée un fichier build dans le dossier AppData\Local\Temp\ dans lequel se trouve le fichier BIN. Vous pouvez retrouver le nom du fichier dans la console de l’IDE lors de la compilation ou du téléversement.

Après la compilation:

Après un téléversement:

Vous pouvez copier le fichier BIN généré autre part sur votre ordinateur.

Téléverser le fichier BIN à l’aide de l’invite de commande Windows

Après avoir lancer le téléversement sur l’IDE Arduino, vous obtenez la commande de téléversement.

Vous pouvez copier cette ligne dans l’invite de commande pour téléverser le programme dans le microcontrôleur. N’oubliez pas de modifier avec le nouveau chemin du fichier BIN et de rajouter des guillemets autour des chemins contenant des espaces, si besoin.

Appuyez ensuite sur la touche “Entrée” pour téléverser le programme. (Astuce: une fois la commande connue, vous pouvez créer un fichier bash pour automatiser le process).

N.B.: Si vous souhaitez téléverser le fichier BIN à partir d’un autre ordinateur (notamment si l’IDE Arduino n’est pas installé), n’oubliez pas d’installer les drivers nécessaires à la reconnaissance des microcontrôleurs.

Téléverser le fichier BIN à l’aide de Flash Download Tool

Téléchargez le logiciel Flash Download Tool.

Lancer le fichier exécutable flash_download_tool_3.8.5.exe et sélectionner le mode développeur

Puis sélectionnez l’outil ESP32 DownloadTool

Pour retrouver l’adresse à laquelle venir écrire le fichier BIN, il faut repérer la bonne instruction dans la commande de téléversement (ici 0x10000).

0x10000 C:\Users\ADMIN\AppData\Local\Temp\arduino_build_277133/splecode.ino.bin  

Vous pouvez retrouver le nom du port utilisé pour communiquer avec l’ESP32 dans le gestionnaire de périphériques (COM6).

Sélectionner le bon baudrate. Dans notre cas, 921600. Vous pouvez retrouver cette valeur dans la commande de téléversement précédée de “–baud”.

C:\Users\ADMIN\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\2.6.1/esptool.exe --chip esp32 --port COM6 --baud 921600

Puis sélectionnez le fichier BIN à l’endroit où vous l’avez enregistré.

Vous pouvez ensuite appuyer sur “Start”, afin de téléverser le fichier.

Sources

Générer et téléverser des fichiers BIN dans un ESP8266

Générer et téléverser des fichiers BIN dans un ESP8266

Lorsque vous avez un certain nombre de cartes à flasher avec le même programme, il peut être intéressant de flasher le fichier compilé BIN directement dans l’ESP8266. Cela a deux intérêts. Vous faire gagner du temps sur le téléversement et protéger vos codes source si vous partager le programme à des tiers personnes. Cela leur donne la possibilité de téléverser le programme sur d’autres microcontrôleur (en cas de panne, par exemple) sans risque de modifier le code source.

Vous ne devriez pas en avoir besoin tous les jours mais je vais vous montrer la méthode pour générer le fichier BIN et le téléverser dans un microcontrôleur ESP8266. Cette méthode peut être adaptée pour d’autre microcontrôleur comme Arduino et ESP32 avec d’autres outils.

Générer le fichier BIN à l’aide de l’IDE Arduino

Dans le logiciel Arduino, aller dans le menu Fichier puis Préférences.

Cocher les cases “résultats détaillés pendant” pour la compilation et le téléversement (Mode verbose)

Sélectionnez le port et le type de carte sur lequel vous souhaitez téléverser le programme.

Lorsque vous appuyez sur Compiler ou Téléverser, l’IDE Arduino crée un fichier build dans le dossier AppData\Local\Temp\ dans lequel se trouve le fichier binaire. Vous pouvez retrouver le nom du fichier dans la console de l’IDE lors de la compilation ou du téléversement.

Après la compilation:

Après un téléversement:

Vous pouvez copier et conserver le fichier BIN généré où vous le souhaitez sur votre ordinateur.

Charger le fichier BIN à l’aide de l’invite de commande Windows

Vous pouvez vous simplifier la tâche en installant PowerShell qui fonctionne comme le terminal mais avec la possibilité d’utiliser le copier/coller.

Après avoir lancer le téléversement sur l’IDE Arduino, vous obtenez la commande de téléversement.

Vous pouvez copier cette commande dans l’invite de commande pour téléverser le programme dans le microcontrôleur. N’oubliez pas de modifier avec le nouveau chemin du fichier BIN.

Appuyez ensuite sur la touche “Entrée” pour téléverser le programme. (Astuce: une fois la commande connue, vous pouvez créer un fichier bash pour automatiser le process).

N.B.: Si vous souhaitez téléverser les fichier BIN à partir d’un autre ordinateur(notamment si l’IDE Arduino n’est pas installé), n’oubliez pas d’installer les drivers nécessaires à la reconnaissance des microcontrôleurs.

Charger le fichier BIN à l’aide de NodeMCU Programmer

Téléchargez le logiciel NodeMCU flasher.

Ouvrez la version qui correspond à votre système (32 ou 64 bits).


Sélectionnez le port du microcontrôleur que vous pouvez retrouver dans le gestionnaire de périphérique.

Dans l’onglet “Advanced”, sélectionnez l’option “DOUT” pour SPI Mode.

Sélectionnez le fichier BIN, là où vous l’avez enregistré.

Dans l’onglet “Operation”, vous pouvez maintenant appuyer sur “Flash” afin de téléverser le fichier binaire

N’oubliez pas de réinitialiser la carte (Reset) afin que le téléversement soit pris en compte.

Sources

Générer et téléverser des fichiers HEX dans un Arduino

Générer et téléverser des fichiers HEX dans un Arduino

Lorsque vous avez un certain nombre de cartes Arduino à flasher avec le même programme, il peut être intéressant de flasher le fichier compilé HEX directement. Cela a deux intérêts. Vous faire gagner du temps sur le téléversement et cela permet à de tierce personnes de téléverser un programme sans utiliser l’IDE Arduino.

Vous ne devriez pas en avoir besoin tous les jours mais je vais vous montrer la méthode pour générer le fichier HEX et le téléverser dans un microcontrôleur Arduino. Cette méthode peut être adaptée pour d’autre microcontrôleur comme ESP8266 et ESP32 avec d’autres outils.

Générer le fichier HEX à l’aide de l’IDE Arduino

Dans le logiciel Arduino, aller dans le menu Fichier puis Préférences.

Cocher les cases “résultats détaillés pendant” pour la compilation et le téléversement (Mode verbose)

Sélectionnez le port et le type de carte sur lequel vous souhaitez téléverser le programme.

Lorsque vous appuyez sur Compiler ou Téléverser, l’IDE Arduino crée un fichier build dans le dossier AppData\Local\Temp\ dans lequel se trouve le fichier HEX. Vous pouvez retrouver le nom du fichier dans la console de l’IDE lors de la compilation ou du téléversement.

Après la compilation:

Après un téléversement:

Vous pouvez copier le fichier HEX généré autre part sur votre ordinateur.

Téléverser le fichier HEX à l’aide de l’invite de commande Windows

Après avoir lancer le téléversement sur l’IDE Arduino, vous obtenez la commande de téléversement.

Vous pouvez copier cette ligne dans l’invite de commande pour téléverser le programme dans le microcontrôleur. N’oubliez pas de modifier avec le nouveau chemin du fichier HEX et de rajouter des guillemets autour des chemins contenant des espaces.

Appuyez ensuite sur la touche “Entrée” pour téléverser le programme. (Astuce: une fois la commande connue, vous pouvez créer un fichier bash pour automatiser le process).

N.B.: Si vous souhaitez téléverser les fichiers HEX à partir d’un autre ordinateur (notamment si l’IDE Arduino n’est pas installé), n’oubliez pas d’installer les drivers nécessaires à la reconnaissance des microcontrôleurs.

Téléverser le fichier HEX à l’aide de XLoader

Téléchargez le logiciel XLoader.

Lancer le fichier exécutable XLoader.exe


Sélectionnez le port du microcontrôleur que vous pouvez retrouver dans le gestionnaire de périphérique.

Sélectionner le bon baudrate. Dans notre cas, 115200.

Puis sélectionnez le fichier HEX à l’endroit où vous l’avez enregistré.

Vous pouvez ensuite appuyer sur “Upload”, afin de téléverser le fichier.

Sources