[Tutoriel] Créer son propre firmware pour un flash en deux étapes d'un esp

Tags: #<Tag:0x00007f3853d6dd90> #<Tag:0x00007f3853d6dc78>

Bonjour,

La mise à jour OTA - pour Over The Air - c’est une mise à jour d’un esp8266 (D1 mini, NodeMCU, Sonoff…) sans passer par un flash à travers le port série, et entre autres options par l’interface web.

Pour les esp avec 1MB de flash (ou un équipement avec 4 MB de flash ayant flashé avec un firmware pour 1MB), il faut souvent passer par un flash en deux étapes : une première fois avec un firmware très petit contenant le minimum de fonctionnalités, et une seconde avec le nouveau firmware. De plus, si on passe sur un autre firmware (Tasmota, Espurna, …), ou qu’on fait un saut de version important, la structure des paramètres change et on peut assez facilement planter l’esp.

Pour cela, ESP Easy fournit un fichier intitulé « ESPEasy_2step_UploaderMega_1024.bin ». Toutefois, ce fichier va essayer d’utiliser la configuration du wifi présente avant pour essayer de se reconnecter, ce qui peut parfois poser problème. Par ailleurs, il n’a pas été compilé avec l’option Flash Mode DOUT. Hors, pour certains esp8266 (par exemple pour la SonOff S26), c’est indispensable sous peine de planter la mise à jour et devoir faire un flash sur le port série. Mais l’équipement n’est pas toujours facilement accessible, et il faut même parfois ouvrir et ressouder des fils.

Il est pourtant très intéressant d’utiliser un firmware récent d’ESP Easy qui règle beaucoup de problèmes de stabilité wifi :

Just for reference, the problems with WiFi instability started around 201803, so builds between March 2018 and roughly Sept 2019 were less stable regarding WiFi.

Depuis quelques semaines, j’utilise pour les flashs en deux étapes la méthode suivante avec laquelle je n’ai (presque) pas eu de mauvaise surprise. L’idée est de créer un firmware avec en dur ses codes de connexion au wifi.

  1. Installer Arduino IDE

  2. Dans File > Preferences > Additionnal Boards Manager URL > Ajouter http://arduino.esp8266.com/stable/package_esp8266com_index.json pour le support des cartes esp8266
    image

  3. Dans Tools > Boards > Board Manager > Taper « esp » et pour ESP8266 Communiity choisir la version 2.4.2 > Cliquer sur Install - la raison est ici d’utiliser un core plus ancien qui permettra de conserver un firmware plus petit (pas gênant puisque ce firmware servira juste de transition).
    image

  4. Aller chercher le code Webupdate.ino et le sauver dans un dossier nommé Webupdate.

  5. Remplacer dans le code your-ssid par l’identifiant du réseau Wifi, et your-password par le mot de passe associé. Éventuellement, désactiver le mDNS pour gagner encore un peu en taille en commentant (ajouter « // » au début) les lignes contenant WiFiUDP et MDNS.

  6. Dans Tools > Board > Choisir le type de carte que vous allez flasher.

Si votre modèle apparaît, le mieux c’est de choisir cette ligne. On va notamment retrouver « LOLIN(WEMOS) D1 R2 & mini » pour les D1 mini par exemple.

Pour les cas un peu « exotiques » (équipements SonOff ou Tuya par exemple), on peut choisir « Generic ESP8266 Module ». Dans ce cas, il faudra choisir un « Flash Mode ». A priori, DOUT est le plus compatible et fonctionne bien (même si il peut quand même y avoir des surprises si la carte a été flashée avec un autre mode avant). A titre indicatif, voilà ce que dit le logiciel de flash NodeMCU Pyflasher par exemple :

image

Pour le type « Generic ESP8266 Module », il faut également bien renseigner « Flash Size » en choisissant « 1M (no SPIFFS) ». En effet, si on choisit une option avec SPIFFS, cela va créer une partition qui occupera de la place qui ne sera pas disponible pour le nouveau firmware (c’est un problème qui se pose seulement avec les cartes de 1MB, pas avec les D1 mini qui ont par exemple 4MB de mémoire).

image

  1. Pour finir, il suffit de faire Sketch > Export compiled Binary

Arduino IDE va vérifier le code, le compiler, et générer dans le répertoire où vous avez sauvé un fichier nommé WebUpdate.ino.generic.bin qui devrait faire environ 286 Ko pour Generic ESP8266 (278 Ko sans le MDNS).

Pour le flash en 2 étapes, il faudra commencer par flasher ce fichier dans ESP Easy. Pour cela, aller dans Tools > Update Firmware > Choisir le fichier bin puis Update. On doit obtenir « Update Success! Rebooting… »

Une dizaine de secondes plus tard, la page va se recharger (ou alors taper l’IP de l’esp). On obtient alors un nouveau formulaire dans lequel on pourra choisir le nouveau firmware à charger.
image

Note 1
Lorsqu’on a des équipements difficilement accessibles, il vaut mieux tester avant sur le même type d’équipement avec la même version de firmware : cela limite les risques même s’il peut toujours y avoir un plantage

Note 2
Pour pouvoir faire une mise à jour OTA sur un équipement avec 1 MB de mémoire, il faut avoir « laissé » suffisamment de place pour pouvoir au moins charger le firmware transitoire. De ce fait, il ne faut pas charger un firmware de plus de 600 Ko environ. Actuellement, seules les images nommées « 1M_OTA » de ESP Easy permettent cela, dont une qui utilise un ancien core ce qui limite les possibilités. Voir ce sujet pour plus d’éléments : Mega (V2.0.0) OTA firmware updates on 1MB modules

Note 3
J’ai utilisé cette méthode pour passer d’ESP Easy à d’autres firmwares comme Tasmota, ESPurna ou encore WLED. Cela a bien fonctionné à chaque fois et c’est la méthode que je privilégie désormais.

Voilà pour cette partie, si ça peut être utile à certains tant mieux.

2 J'aimes