ESP32 Sketch data upload pour IDE Arduino. Téléverser des fichiers SPIFFS sur la mémoire flash • Domotique et objets connectés à faire soi-même

Le plugin ESP32 Sketch Data Upload pour l’IDE Arduino permet de téléverser des fichiers dans la zone mémoire de l’ESP32 réservée au système de fichier (FS) géré à l’aide du système de fichier SPIFFS. Pour le moment LittleFS n’est pas encore supporté officiellement par Espressif sur la plateforme ESP32.

La taille de la mémoire flash varie en fonction du module ESP32 embarqué sur la carte de développement. Les modules récents disposent généralement d’une mémoire flash de 4Mo dont on pourra allouer 1Mo, 2Mo ou 3Mo au système de fichier (File System – FS).

Pour en savoir plus sur les modules ESP32

Utiliser LittleFS sur ESP32

Le système LittleFS n’est pas encore supporté officiellement sur ESP32. Vous votre projet nécessite obligatoirement le support de LittleFS, ll existe toutefois plusieurs projets

Lorol a développé une adaptation pour ESP32 de la librairie LittleFS Mbed.

Attention, ce projet n’est utilisable que sur Windows car il nécessite un exécutable externe mklittlefs.exe

Page GitHub du projet

Le projet d’Illucius est un projet multi-plateforme.

Seul bémol, il date déjà de 2017 et ne semble plus recevoir de corrections régulières.

Page GitHub du projet

Le projet esp_littlefs de joltwallet fonctionne avec le SDK ESP-IDF

Pour ceux qui développe directement avec l’API du SDK ESP-IDF, vous pouvez tester ce projet.

Page GitHub du projet

Comme d’habitude, vous aurez besoin d’installer un plugin sur l’IDE Arduino pour téléverser des fichiers au format LittleFS. Il est ici.

Comment organiser les fichiers d’un projet ESP32 avec SPIFFS ?

Voici un exemple d’arborescence des fichiers d’un projet ESP32 dont le code de l’interface HTML est séparé du code Arduino. En général, les fichiers d’un serveur WEB sont stockés dans un dossier nommé www.

www/
├── index.html
├── style.css
├── code.js
code.ino

En dehors des fichiers du code Arduino (fichiers .ino, .cpp, .h), tous les autres fichiers devront être déplacés dans un dossier data. L’arborescence du projet Arduino devient celle-ci

Il est pas possible de créer des sous-dossiers dans le répertoire data. Toutefois, lors du transfert, les fichiers seront mis “à plat”, c’est à dire que les sous-dossiers ne seront pas créés, à la place le fichier prendra comme nom le chemin d’accès. Le séparateur “/” sera intégré au nom de fichier. Attention à ne pas dépasser 31 caractères utiles.

Par exemple

data/
├── subfolder
   ├── index.hmtl

deviendra

/data/subfolder/index.hmtl

Vous risquez vite de rencontrer des problèmes si vous dépassez 31 caractères utiles. Par conséquent, il est préférable de limiter la profondeur de l’arborescence…ou ne pas en créer.

Installer les outils ESP32 Sketch Data Upload pour l’IDE Arduino

1 Avant de commencer, vous devez installer le SDK ESP32 d’Espressif sur l’IDE Arduino. Tout est expliqué en détail dans cet article.

2 Allez ensuite ici sur GitHub pour récupérer la dernière release (mise à jour) du plugin ESP32fs pour l’IDE Arduino. Cliquer sur le lien vers l’archive zip du plugin pour lancer le téléchargement.

3 Ouvrez le dossier de travail de l’IDE Arduino. En général, il se trouve dans le dossier Mes Documents sur Windows et Documents sur macOS ou Linux. Pour connaître le chemin vers le dossier Arduino, vous pouvez ouvrir les préférences de l’IDE Arduino

4 Créez un nouveau dossier appelé tools

5 Décompressez l’archive directement dans le dossier tools. Ne changez pas l’arborescence

6 Rechargez l’IDE Arduino. Après redémarrage, vous devez avoir une nouvelle option dans le dossier outils appelée ESP32 Sketch Data Upload.

Tout est prêt.

Choisir la taille allouée au système de fichier (partition scheme)

Il est possible d’allouer une certaine quantité de la mémoire flash de l’ESP32 au système de fichier (FS) comme sur l’ESP8266. Par défaut, le framework alloue des portions de mémoire suivant table appelée Partition Table (ou Partition Scheme sur l’IDE Arduino).

Espressif a définit des schémas par défaut (sur cette page GitHub), mais chaque fabricant de carte peut le modifier.

Voici la Partition Table par défaut (fichier source). Comme vous pouvez le constater, la zone SPIFFS se situe à la fin de façon à pouvoir occuper le plus l’espace disponible.

Zone Type Sous-type Offset Taille
nvs data nvs 0x9000 0x5000
otadata data ota 0xe000 0x2000
app0 app ota_0 0x10000 0x140000
app1 app ota_1 0x150000 0x140000
spiffs data spiffs 0x290000 0x170000

La taille que l’on peut allouer dépend de la taille de la mémoire flash (4Mo ou 16Mo) et de chaque fabricant.

Sélectionner votre carte de développement dans la liste puis ouvrez le menu Partition Scheme.

Pour la LoLin D32 Pro, 4 schémas sont possibles

  • Default conseillé
  • Minimal 2Mo de la mémoire flash
  • No OTA
  • Minimal SPIFFS

Je vous conseille de laisser le schéma par défaut surtout si vous souhaitez mettre en place un mécanisme de mise à jour sans fil (OTA) dans votre projet.

Si cette organisation ne convient pas à votre développement, vous pouvez passer sur PlatformIO qui permet de définir finement la Partition Table mais à l’aide d’un fichier csv. Plus d’informations ici.

Un programme de test avec SPIFFS

Sur ESP32, la librairie FS.h a été renommée SPIFFS.h. Le code source de la librairie est disponible sur GitHub.

Créer un nouveau croquis, coller le code ci-dessous et sauvegarder

#include "SPIFFS.h"
 
void setup() {
  Serial.begin(115200);

  // Launch SPIFFS file system | Démarre le système de fichier SPIFFS
  if(!SPIFFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Open test file in read only mode | Ouvre le fichier de test en lecture seule
  File file = SPIFFS.open("/test.txt", "r");
  if(!file){
    // File not found | le fichier de test n'existe pas
    Serial.println("Failed to open test file");
    return;
  }

  // Display file content on serial port | Envoie le contenu du fichier test sur le port série
  Serial.println();
  Serial.println("Read test.txt file content:");
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();
}
 
void loop() {
}

Que fait ce code ?

On déclare la librairie SPIFFS.h qui permet d’accéder à la zone mémoire à l’aide du système de fichier SPIFFS.

#include "SPIFFS.h"

On démarre le système de fichier SPIFFS. On signale l’erreur en cas de problème. Ici, le programme s’arrête en cas d’erreur.

if(!SPIFFS.begin()){
  Serial.println("An Error has occurred while mounting SPIFFS");
  return;
}

On ouvre le fichier test.txt avec la méthode open(nom_de_fichier, option) en écriture seule en spécifiant l’option “r” (pour read only). Utilisez l’option “w” pour pouvoir écrire (et écrire) dans un fichier.

File file = SPIFFS.open("/test.txt", "r");

On envoie sur le port série le contenu du fichier texte

while(file.available()){ 
  Serial.write(file.read()); 
}

Et on referme le fichier

file.close();

Ajouter des fichiers dans le dossier data

Il existe un raccourcis permettant d’ouvrir directement le dossier du projet Arduino depuis le menu Croquis -> Montrer le dossier du croquis

Créer un fichier texte avec n’importe quel éditeur de texte et coller un “Hello World” ou n’importe quel texte de votre choix.

Enregistrer le fichier en lui donnant le nom test.txt.

Téléverser des fichiers dans la zone mémoire de l’ESP32

Pour téléverser les fichiers enregistrés dans la dossier data, il suffit de lancer l’outil depuis le menu Outils -> ESP32 Sketch Data Upload

L’opération ne dure que quelques secondes

[SPIFFS] data   : /Users/projetsdiy/Documents/Arduino/projetsdiy/ESP32/SPIFFS/ESP32_SPIFFS_DEMO/data
[SPIFFS] start  : 2691072
[SPIFFS] size   : 1468
[SPIFFS] page   : 256
[SPIFFS] block  : 4096
/test.txt
[SPIFFS] upload : /var/folders/x_/w_k_y_ys531cxjfyvqpk1bwc0000gn/T/arduino_build_298507/ESP32_SPIFFS_DEMO.spiffs.bin
[SPIFFS] address: 2691072
[SPIFFS] port   : /dev/cu.usbserial-1420
[SPIFFS] speed  : 115200
[SPIFFS] mode   : dio
[SPIFFS] freq   : 80m

esptool.py v2.6
Serial port /dev/cu.usbserial-1420
Connecting.....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: b4:e6:2e:88:xx:xx
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1503232 bytes to 2848...

Writing at 0x00291000... (100 %)
Wrote 1503232 bytes (2848 compressed) at 0x00291000 in 0.3 seconds (effective 42700.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Ouvrez le moniteur série et faites un RESET du module ESP32. Voici ce que vous devriez voir

Il est tout à fait possible d’accéder au système de fichier SPIFFS sur ESP32 via un client FTP. C’est surtout pratique lorsqu’on développe des projets avec une interface HTML et que l’on ne souhaite pas forcément passer par l’IDE Arduino à chaque fois qu’on souhaite téléverser les fichiers.

Lire, écrire, ajouter des données à un fichier par programmation

Dans la plupart des cas, on aura besoin d’accéder et manipuler (écrire, ajouter des données, renommer, supprimer…) des fichiers directement par programmation avec du code Arduino. C’est possible avec la librairie SPIFFS.h présentée dans cet article

Erreurs courantes

Voici une liste de quelques erreurs rencontrées couramment.

SPIFFS Upload failed!

Si vous obtenez un message de ce type, il suffit de fermer la fenêtre du moniteur série.

esptool.py v2.6
Serial port /dev/cu.usbserial-1420
Traceback (most recent call last):
  File "esptool.py", line 2959, in 
  File "esptool.py", line 2952, in _main
  File "esptool.py", line 2652, in main
  File "esptool.py", line 222, in __init__
  File "serial/__init__.py", line 88, in serial_for_url
  File "serial/serialposix.py", line 268, in open
serial.serialutil.SerialException: [Errno 16] could not open port /dev/cu.usbserial-1420: [Errno 16] Resource busy: '/dev/cu.usbserial-1420'
Failed to execute script esptool
SPIFFS Upload failed!

A fatal error occurred: Timed out waiting for packet content

Si vous obtenez un message de ce type

esptool.py v2.6
Serial port /dev/cu.usbserial-1420
Connecting.....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: b6:e6:2e:78:0b:ae
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...

A fatal error occurred: Timed out waiting for packet content

Il suffit de diminuer la vitesse du port série pour téléverser. Descendez la vitesse à 115200 bauds, puis remontez pour connaître la vitesse maximale supportée par la carte de développement.

Mises à jour

2/09/2020 Première publication de l’article

Avez-vous aimé cet article ?