ESP32 – Augmentation de l’espace mémoire pour le code programme

Le moindrement que le programme comporte plusieurs lignes, la mémoire disponible réservée pour le code est insuffisante. C’est le cas quand nous voulons avoir des interfaces Web et Bluetooth fonctionnelles simultanément. BluetoothSerial.h prend beaucoup de mémoire.

Par défaut, 1310720 octets sont réservés pour le code programme dans le «DOIT ESP32 DEVKIT V1». La mémoire flash 4MB est partitionnée et une bonne proportion de l’espace mémoire est réservée pour l’OTA (update Over the Air -> démo) et le SPIFFS (Serial Peripheral Interface Flash File System -> démo).

Partitions par défaut

Lors de la compilation du programme, l’IDE ARDUINO lit le fichier
boards.txt du répertoire > C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1

AppData est un répertoire système, par défaut il est masqué. Pour le voir, il faut cocher «Éléments masqués» dans l’explorateur Windows. Si ce n’est déjà fait, cochez aussi «Extensions de noms de fichiers».

Pour exécuter le partitionnement, le compilateur se réfère à la section correspondante au type de carte sélectionnée par l’utilisateur (dans le menu Outils de l’interface IDE).

Extrait de boards.txt (IDE Arduino 1.8.8, ESP32 V 1.0.1)

##############################################################

esp32doit-devkit-v1.name=DOIT ESP32 DEVKIT V1

esp32doit-devkit-v1.upload.tool=esptool_py
esp32doit-devkit-v1.upload.maximum_size=1310720
esp32doit-devkit-v1.upload.maximum_data_size=327680
esp32doit-devkit-v1.upload.wait_for_upload_port=true

esp32doit-devkit-v1.serial.disableDTR=true
esp32doit-devkit-v1.serial.disableRTS=true

esp32doit-devkit-v1.build.mcu=esp32
esp32doit-devkit-v1.build.core=esp32
esp32doit-devkit-v1.build.variant=doitESP32devkitV1
esp32doit-devkit-v1.build.board=ESP32_DEV

esp32doit-devkit-v1.build.f_cpu=240000000L
esp32doit-devkit-v1.build.flash_mode=dio
esp32doit-devkit-v1.build.flash_size=4MB
esp32doit-devkit-v1.build.boot=dio
esp32doit-devkit-v1.build.partitions=default
esp32doit-devkit-v1.build.defines=

esp32doit-devkit-v1.menu.FlashFreq.80=80MHz
esp32doit-devkit-v1.menu.FlashFreq.80.build.flash_freq=80m
esp32doit-devkit-v1.menu.FlashFreq.40=40MHz
esp32doit-devkit-v1.menu.FlashFreq.40.build.flash_freq=40m

esp32doit-devkit-v1.menu.UploadSpeed.921600=921600
esp32doit-devkit-v1.menu.UploadSpeed.921600.upload.speed=921600
esp32doit-devkit-v1.menu.UploadSpeed.115200=115200
esp32doit-devkit-v1.menu.UploadSpeed.115200.upload.speed=115200
esp32doit-devkit-v1.menu.UploadSpeed.256000.windows=256000
esp32doit-devkit-v1.menu.UploadSpeed.256000.upload.speed=256000
esp32doit-devkit-v1.menu.UploadSpeed.230400.windows.upload.speed=256000
esp32doit-devkit-v1.menu.UploadSpeed.230400=230400
esp32doit-devkit-v1.menu.UploadSpeed.230400.upload.speed=230400
esp32doit-devkit-v1.menu.UploadSpeed.460800.linux=460800
esp32doit-devkit-v1.menu.UploadSpeed.460800.macosx=460800
esp32doit-devkit-v1.menu.UploadSpeed.460800.upload.speed=460800
esp32doit-devkit-v1.menu.UploadSpeed.512000.windows=512000
esp32doit-devkit-v1.menu.UploadSpeed.512000.upload.speed=512000

esp32doit-devkit-v1.menu.DebugLevel.none=None
esp32doit-devkit-v1.menu.DebugLevel.none.build.code_debug=0
esp32doit-devkit-v1.menu.DebugLevel.error=Error
esp32doit-devkit-v1.menu.DebugLevel.error.build.code_debug=1
esp32doit-devkit-v1.menu.DebugLevel.warn=Warn
esp32doit-devkit-v1.menu.DebugLevel.warn.build.code_debug=2
esp32doit-devkit-v1.menu.DebugLevel.info=Info
esp32doit-devkit-v1.menu.DebugLevel.info.build.code_debug=3
esp32doit-devkit-v1.menu.DebugLevel.debug=Debug
esp32doit-devkit-v1.menu.DebugLevel.debug.build.code_debug=4

Deux lignes sont importantes pour l’assignation de la mémoire:

  • esp32doit-devkit-v1.upload.maximum_size=1310720
    • Cette ligne définit le nombre d’octets maximum pour le upload
  • esp32doit-devkit-v1.build.partitions=default
    • Cette ligne désigne le fichier qui contient la structure du partitionnement
    • Ce fichier est toujours du type csv

Fichier par défaut pour le partitionnement
C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions\default.csv

default.csv

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

Programme d’affichage du partitionnement du ESP32

Placer dans un répertoire nommé «Affiche_Partitions», transférer dans le ESP32 et exécuter.

#include <esp_partition.h>

void setup() {
  Serial.begin(115200);
  const esp_partition_t *partition = NULL;
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, "app0");
  if (partition != NULL) {
    Serial.printf("APP partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, "app1");
  if (partition != NULL)
  {
    Serial.printf("OTA partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  else
  {
    Serial.printf("No OTA partition found !\n");
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, (esp_partition_subtype_t)0x99, "eeprom");
  if (partition != NULL) {
    Serial.printf("EEprom partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "spiffs");
  if (partition != NULL) {
    Serial.printf("SPIFFS partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
}

void loop() {}

Solutions

Afin de récupérer de l’espace mémoire pour le code, il est possible de modifier simplement le partitionnement de la mémoire.

Proposition de trois partitionnements. Il faut sacrifier la mémoire pour l’OTA ou diminuer la mémoire pour le SPIFFS.

  • no_ota
    • Dans le cas ou nous prévoyons de ne pas utiliser la mise à jour sans fil. Aucune mémoire réservée pour l’OTA
    • Environ 50% pour le programme et 50% pour le SPIFFS
  • huge_app
    • Dans le cas ou nous prévoyons de ne pas utiliser la mise à jour sans fil. Aucune mémoire réservée pour l’OTA
    • Environ 76% pour le programme et 24% pour le SPIFFS
  • min_spiffs
    • Environ 47% pour le programme, 47% pour l’OTA et 5% pour le SPIFFS

Fichiers sources à placer dans le répertoire (s’ils sont absents) :
->
C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions

https://github.com/espressif/arduino-esp32/tree/master/tools/partitions


PROCÉDURE

Le choix du partitionnement se fera à l’aide du menu outil, mais avant il faut ajouter des lignes de code dans le fichier boards.txt. Pour certains types de cartes, ces lignes sont déjà présentes, mais pour la carte «DOIT ESP32 DEVKIT V1» elles sont manquantes.

  • Aller dans le répertoire ->
    C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1
  • Copier le fichier boards.txt et renommer boards_default.txt pour en conserver une copie non modifiée
  • Ouvrir le fichier boards.txt
  • Trouver la partie esp32doit-devkit-v1.name=DOIT ESP32 DEVKIT V1
  • Ajouter les lignes qui suivent juste après la ligne
    • « esp32doit-devkit-v1.build.defines= »
esp32doit-devkit-v1.menu.PartitionScheme.default=Default (32-32-36)
esp32doit-devkit-v1.menu.PartitionScheme.default.build.partitions=default
esp32doit-devkit-v1.menu.PartitionScheme.no_ota=No OTA (Large APP) (50-00-50)
esp32doit-devkit-v1.menu.PartitionScheme.no_ota.build.partitions=no_ota
esp32doit-devkit-v1.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
esp32doit-devkit-v1.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA) (76-00-24)
esp32doit-devkit-v1.menu.PartitionScheme.huge_app.build.partitions=huge_app
esp32doit-devkit-v1.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (Large APPS with OTA) (47-47-05)
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
  • Sauvegarder le fichier boards.txt

Les nouveaux choix sont accessibles dans le menu «Outils» suite à la sélection de la carte «DOIT ESP32 DEVKIT V1»

Vous pouvez valider les changements en exécutant le programme d’affichage du partitionnement du ESP32


La plaquette contrôleur multifonctions (CTRL MF) version 8,0 et 8,1 versus les «ESP32 DEVKIT V1» 30 broches et 36 broches

Le module «ESP32 DEVKIT V1»  vient en version 30 broches et 36
broches.

Voir les détails sur https://randomnerdtutorials.com/getting-started-with-esp32/


Le module 30 broches n’intègre pas les broches SCK/CLK, SD0/SD0, SD1/SD1, SHD/SD2, SWP/SD3 ET SCS/CMD aussi nommées GPIO6 à GPIO11. Ces broches sont connectées au SPI flash dans le ESP-WROOM-32 et elles ne sont pas recommandées pour tout autre usage.

Remarque importante, le GPIO0 n’existe pas sur la version 30 broches, la broche correspondante sur cette version est une MALT ( GND) !

Voir les détails sur https://randomnerdtutorials.com/getting-started-with-esp32/


La plaquette supporte les deux versions. Afin de l’adapter à la version 30 broches, il suffit d’ajouter 3 cavaliers.

Plaquette V8,0

Plaquette V8,1

S’il est requis d’avoir une source 3.3V qui fournit plus de 800ma, on omet le cavalier ajouté à droite. On relie directement la nouvelle source 3.3V dans le trou en bas à droite. Je prévois, à la version 8,2, ajouter un jeu de broches/cavalier pour alimenter le NRF24L01 avec une source 3.3V autre que celle fournie par le «ESP32 DEVKIT V1» même quand on utilise le 36 broches. Option parfois nécessaire pour augmenter la stabilité et la portée du NRF24L01. 

Les modèles «ESP32 DEVKIT V1» que j’utilise :

Le 36 broches vendu par Geekcreit sur «banggood.com» 

Le 30 broches ESP32S ESP32 2.4GHz Dual-Mode WiFi CH340G/CP2102 +Bluetooth Module IPEX Antenna | eBay https://ebay.us/z8qVj5

Le lien va sur Ebay.ca, sélection à faire : CP2102

Fabrication du circuit imprimé de ma carte multifonctionnelle ESP32

Présentation des différentes étapes de fabrication de la plaquette du circuit imprimé de ma carte multifonctionnelle ESP32 

Le logiciel employé pour la conception du circuit est FRITZING. Logiciel open-source qui permet de faire le schéma de prototypage, le schéma électrique et le circuit imprimé. Versatile, il offre la possibilité de créer de nouveaux composants si ceux qui vous sont requis ne sont pas dans les bibliothèques de composants déjà existants.

Pour l’édition de nouveaux composants, j’ai utilisé le logiciel libre de dessin vectoriel INKSCAPE

Pour la fabrication, j’ai choisi la méthode de transfert d’encre sur le cuivre par la chaleur en employant un fer à repasser. J’ai consulté ce vidéo qui m’a  grandement aidé.

Le papier de transfert PCB FAB -IN A -BOX donne de bons résultats. Il est disponible chez KGE ÉLECTRONIQUE  à Saint-Hubert. Les feuilles venant en format 8,5 * 11 pouces, j’ai retaillé en plus petit format les feuilles pour augmenter le nombre de plaquettes de circuit imprimé réalisables par feuille. La feuille retaillée est collée avec du ruban collant au centre d’une feuille 8,5 * 11 pouces standard. J’imprime préalablement le circuit sur la feuille standard pour me donner des repères pour l’alignement de mon papier de transfert. La feuille est introduite face vers le bas dans le panier de l’imprimante. J’ajuste la configuration de l’imprimante laser pour une impression au centre et en sélectionnant la plus haute résolution HQ1200 ppp.

Feuille standard et feuilles combinées (standard et de transfert) après impression
Feuille de transfert
Transfert de l’encre par la chaleur sur la plaquette recouverte de cuivre 
Je réchauffe préalablement  ma solution de « Ferric Chloride» dans de l’eau chaude.
La réaction avec le cuivre sera plus rapide.  
Le cuivre non recouvert d’encre est dissout par le
« Ferric Chloride» 
J’enlève l’encre avec du dégommeur ( THE GOO BUSTER ). Ce produit enlève aussi la colle de l’étiquette de prix qui se retrouve sur les plaquettes que j’achète. Une pierre deux coups.
Passage dans l’étain liquide
L’étain protège le cuivre de l’oxydation et facilite la soudure
Circuit multifonctionnel assemblé
Détails à venir
Version finale en commande chez un fabricant professionnel

ESP32 DEVKIT V1 DOIT

Le microcontrôleur
ESP32 DEVKIT V1 DOIT

Le microcontrôleur «ESP32 DEVKIT V1 DOIT» est un circuit programmable compatible à l’environnement ARDUINO. Il accepte les composantes offertes pour les ARDUINO. Le module de développement «ESP32 DEVKIT V1 DOIT» est construit autour du circuit ESP32. L’unité ESP32 se programme avec l’interface IDE ARDUINO. Un grand avantage de ce circuit, c’est qu’il intègre la connectivité sans fil WIFI et Bluetooth. 

Schéma d’architecture du ESP32

Voici un aperçu de certaines caractéristiques et spécifications de la puce ESP32:

  • Connectivité sans fil
    • WiFi: débit de données de 150,0 Mbps avec HT40
    • Bluetooth: BLE (Bluetooth Low Energy) et Bluetooth classique
  • Processeur: microprocesseur LX6 32 bits Dual-Core Tensilica Xtensa, fonctionnant à 160 ou 240 MHz
  • ROM: 448 Ko
  • SRAM: 520 Ko
  • Basse consommation: garantis que vous pouvez toujours utiliser les conversions ADC, par exemple pendant le sommeil profond.
  • Entrée / sortie périphérique:
    • Minuteries et chien de garde
    • Horloge temps réel
    • Convertisseur  analogique-numérique (ADC) 12 bits 
    • Convertisseur numérique-analogique (DAC)
    • Capteurs intégrés ( Température, effet Hall)
    • Détecteur tactile capacitif
    • Co-processeur Ultra Low Power (ULP)
    • Interface Ethernet MAC
    • Contrôleur hôte SD / SDIO / MMC
    • Émetteur récepteur universel asynchrone (UART)
    • Interface 2 fils  (I2C)
    • Interface son interconnecté intégré (I2S)
    • Interface de périphérique série (SPI)
    • Télécommande infrarouge
    • Compteur d’impulsions
    • Modulation de largeur d’impulsion (PWM) 16 sorties
    • Accélérateur Matériel
  • Sécurité: accélérateurs matériels pour AES et SSL / TLS

L’assignation des bornes du «ESP32 DEVKIT V1 DOIT»

Remarques :

  • L’entrée Vin du «ESP32 DEVKIT DOIT» fonctionne entre 4,5 et 12 volts. Un régulateur (NCP1117) sur le circuit abaisse la tension à 3,3 volts et fournit un courant maximum de 800ma.
  • Le ESP32 fonctionne entre 2,2 et 3,6 volts.
  • Les broches d’entrées/sortie du «ESP32 DEVKIT DOIT» ne supportent pas le 5 volts. Le voltage à l’entrée ne doit pas dépasser 3,6 volts.
  • Les GPIO 36, 39, 34 et 35 sont des broches d’entrée de signal seulement (I). Elles ne possèdent pas de résistances internes de pull-up et pull-down.
  • Les broches  GPIO < 34 peuvent fonctionner en PWM
  • Le courant maximal absolu par GPIO est de 40 mA

Fonction des broches du ESP32

ESP32 – Documentation du manufacturier

Débuter avec le «ESP32 Development Board»

Comment installer les bibliothèques ESP32 dans l’IDE ARDUINO

+20 tutoriels gratuits et projets avec l’ESP32

Site de référence sur le ESP32