ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC • Domotique et objets connectés à faire soi-même

L’ESP32 est un micro-contrôleur qui dispose de la connectivité WiFi et Blu2etooth (BLE, BT4.0 et Bluetooth Smart) ainsi que d’un GPIO. Les broches sont multi-fonction, c’est à dire qu’il est possible de définir son utilisation par programmation. I/O, PWM, RTC, I2C, SPI, ADC, DAC. Vous avez certainement remarqué que les cartes de développement disposent d’un nombre plus limité de broches. Certaines broches sont réservées (accès à la mémoire flash, programmation …). Chaque fabricant de carte de développement choisi les broches qu’il expose.

L’ESP32 est disponible en 46 versions actuellement. La tendance devrait encore s’accentuer à l’avenir comme l’a annoncé Espressif sur ce billet de blog annonçant le lancement de l’ESP32-C3. On finit clairement par s’y perdre ! Heureusement Espressif à mis en ligne un moteur de recherche pour les concepteurs d’objets connectés et les Makers qui conçoivent leurs propres PCB.

Cet article récapitule les broches que l’on pourra utiliser – indépendamment du fabricant de votre carte de développement ESP32 – pour accéder au différentes fonctions proposées par l’ESP32. Port I2C, I2S, UART (port série), Touch (touche capacitive)…

Accès rapide aux thèmes :

Comment interpréter le numéro des broches sur votre carte de développement ?

Vous avez certainement remarqué que le nombre de broche du connecteur d’extension GPIO varie d’un fabricant à l’autre. Tout d’abord, certaines broches sont réservées pour l’accès à la mémoire flash via le bus SPI. Ensuite, chaque fabricant choisi les broches qu’il laisse à disposition (expose) de l’utilisateur (développeur) en fonction de sa propre conception et des équipements intégrés à la carte de développement (écran OLED, capteur, caméra, lecteur de carte micro SD…).

la majorité des fabricants de cartes de développement ESP32 grand public utilisent principalement deux versions :

  • L’ESP32-D0WDQ6-V3 est un package QFN-48 de 6×6 mm. 
  • L’ESP32-D0WD est équivalent à l’ESP32-D0WDQ6, mais a une taille de puce plus petite de 5×5 mm, ce qui réduit l’encombrement pour la conception.

Quelque soit le boitier, il faudra ajouter de la mémoire flash externe supplémentaire sur laquelle sera stockée le programme (développé avec l’IDE Arduino) et éventuellement d’autres données (interface HTML, fichiers audio, images, fichiers de configuration…). Comme nous allons le voir plus tard dans l’article, certaines broches de l’ESP32 sont réservées pour communiquer avec la mémoire Flash.

  ESP32-D0WDQ6-V3 ESP32-D0WD
Boitier (mm) QFN 6×6 QFN 5×5
jovwlduqt6sc4y6d5cf3-4252509 dseff823ezt8k4rm9nsv-9638003
Broches 48 broches + GND (49)
Mémoire

ROM 448 Ko

SAM 520 Ko

RTC SRAM 16 Ko

Tension de fonctionnement 2.3 V à 3.6 V
GPIO x34
Convertisseur ADC Jusqu’à 18 canaux. Résolution de 9 à 12 bits
Convertisseur DAC 2 canaux 8 bits
I2C x2
I2S x2
SPI x4
UART x3
Sécurité 1024 bit OTP

AES, SHA, RSA, ECC, RNG

Secure Boot, Flash Encryption

Fonctionnement -40°C à 125°C

Source : documentation technique Espressif

Comme vous pouvez le constater, il ne faut pas trop s’inquiéter. Espressif s’est assuré de la compatibilité des broches quelque soit le boitier et quelque soit la génération. La différence se trouve surtout au niveau de la quantité de mémoire flash ou PSRAM (extension mémoire du processeur de l’ESP32) associées.

ESP32-PICO-D4

L’ESP42-PICO-D4 est une version qui combine sur une même puce un SoC ESP32, un oscillateur à cristal, des condensateurs de filtrage, ainsi que 4Mo de mémoire flash dans un seul boîtier QFN 7×7 mm. Avec son très faible encombrement, il est particulièrement bien adapté aux applications mobiles (montres connectées, bracelet et tracker d’activité…).

ESP32-WROVER

Cette génération lancée en 2018 est toujours disponible au catalogue d’Espressif. Vous risquez de la trouver sur de nombreuses cartes de développement d’entrée de gamme.

Repérage des broches

Depuis la version 4 du kit de développement officiel d’Espressif, les broches sont numérotées sous la forme GPIO27 ou tout simplement par le chiffre correspondant sur la carte, ici 27.

La broche du GPIO ne correspondant pas à la broche sur le processeur de l’ESP32 qui est située sous un capot métallique. Par exemple la broche 27 du GPIO est connectée à la broche 16 du SoC 🙄

Cela n’a aucune importance au niveau de la programmation. On ne fait jamais référence à la broche sur le processeur mais cela peut porter à confusion…surtout avec les générations et les versions qui se succèdent.

nvjknqkrwnxamcveiss9-5948970

Si vous possédez une carte d’ancienne génération (ou que le fabricant n’a pas encore écoulé tous ces stocks), les broches du GPIO sont précédées de la mention IO, par exemple IO27.

C’est encore plus simple qu’avec le SDK pour ESP8266 car il suffit d’indiquer le numéro de la broche dans le code Arduino. Par exemple :

pinMode(27, OUTPUT);

Avant de détailler plus précisément les fonctions de chaque broche, voici le repérage de la dernière génération (DevKitC v4)

t31zfbhfd4hkymnezuiw-2783520

Broches d’entrée / sortie numériques de l’ESP32

La majorité des broches de l’ESP32 peuvent être utilisées comme entrée ou sortie numérique. Certaines broches sont réservées ou sont utilisées par le processeur. Par exemple les broches 6 à 11 sont réservées pour l’accès à la mémoire flash via le bus SPI, les broches du port série pour téléverser le programme ou le déboggage.

Les broches encadrées en vert peuvent être utilisées aussi bien en entrée ou en sortie numérique.

Les broches encadrées en orange peuvent être utilisées mais attention au comportement inattendu au démarrage (voir les explications dans le tableau).

jathksofm4u3oyq88pyf-2501693

Il est déconseillé – pour ne pas dire interdit – d’utiliser les broches encadrées en rouge. Généralement, ces broches sont réservées (et utilisées) par le processeur de l’ESP32. Vous risquez donc de rencontrer de grave problèmes en utilisant ces broches dans vos projets.

Broche du GPIO Entrée numérique (Input) Sortie numérique (Output) Remarque
0 PULL UP Envoi un signal PWM au démarrage.
1 TX Sortie de déboggage au démarrage
2 Connecté à la LED embarquée
3 RX Prend l’état HIGH au démarrage
4
5 Envoi un signal PWM au démarrage
12 Echec de démarrage si en mode PULLUP
13
14 Envoi un signal PWM au démarrage
15 Envoi un signal PWM au démarrage
16
17
18
19
21
22
23
25
26
27
32
33
34 x
35 x
36 x
39 x

Les broches 37 et 38 ne sont pas disponibles sur la plupart des cartes de développement ESP32. Les broches 34, 35, 36, 37, 38, et 39 ne peuvent être utilisées qu’en entrée numérique.

Données collectées depuis la documentation officielle.

Suivez ce tutoriel plus détaillée pour apprendre comment utiliser les entrées et les sorties numériques de l’ESP32.

Sorties PWM

L’ESP32 dispose de 16 canaux indépendants qui peuvent être configurés pour générer des signaux PWM avec différentes propriétés. Toutes les broches encadrées en vert dans le tableau précédent peuvent être utilisées comme broche PWM.

Broche à éviter (interdites) dans vos projets

Certaines broches du GPIO passent automatiquement à l’état haut (HIGH) ou émettent des signaux PWM lors du démarrage ou lors de la réinitialisation. Vous pouvez obtenir des résultats inattendus dans vos programmes lorsque l’ESP32 se réinitialise ou démarre.

Broche (GPIO) Particularité, précaution à prendre
0 Envoi un signal PWM au démarrage.

La broche 0 est utilisée comme broche d’amorçage et doit être basse pour entrer en mode de téléchargement UART. Assurez-vous qu’il n’est pas tiré vers le bas par un périphérique lors du démarrage ou le firmware ne démarrera pas!

1 Sortie de déboggage au démarrage
2 La broche 2 est utilisée comme broche d’amorçage et doit être faible pour entrer en mode de téléchargement UART. Assurez-vous qu’il n’est pas tiré vers le haut par un périphérique lors du démarrage ou vous ne pourrez pas flasher un firmware sur le module!
3 Prend l’état HIGH au démarrage
5 Envoi un signal PWM au démarrage
6 Utilisé pour la mémoire flash SPI
7
8
9
10
11
12 Echec de démarrage si en mode PULL-UP

La broche 12 est utilisée comme broche d’amorçage pour sélectionner la tension de sortie d’un régulateur interne qui alimente la puce flash (VDD_SDIO). Cette broche a une résistance pull-down interne. Si elle n’est pas connectée, elle affichera un niveau bas lors de la réinitialisation (sélection du fonctionnement par défaut de 3.3 V). Assurez-vous qu’il n’est pas tiré vers le haut par un périphérique pendant le démarrage ou l’ESP32 pourrait ne pas démarrer.

14 Envoi un signal PWM au démarrage
15 Envoi un signal PWM au démarrage

La broche 15 peut être utilisée pour arrêter la sortie de déboggage pendant la phase de démarrage. S’il est tiré vers le bas avec une résistance (pull-down), il n’y aura aucune sortie sur le port série pendant le processus de démarrage. Cela peut être utile dans les applications alimentées par batterie où vous ne souhaitez pas du tout utiliser le port série pour réduire la consommation d’énergie.

Remarque concernant l’ESP32-PICO-D4

Les broches 16 et 17 sont réservées pour l’écriture de la mémoire flash interne.

Remarque concernant l’ESP32-WROVER

Les broches 16 et 17 sont réservées pour accéder à la mémoire PSRAM

Consommation du GPIO en mode OUTPUT (sortie numérique)

Le GPIO de l’ESP32 est conçu pour envoyer des signaux logiques. Le GPIO pourra délivrer suffisamment de puissance pour alimenter quelques LED, par contre, le GPIO de l’ESP32 ne pourra pas être utilisé pour alimenter un équipement qui nécessite plus d’énergie tel qu’un moteur.

Chaque sortie peut délivrer un courant de 40mA au maximum.

Par ailleurs, la puissance totale utilisée par l’ensemble des équipements connectés au GPIO ne doit pas dépasser 1200mA d’après la section Absolute Maximum Ratings de la documentation technique officielle.

Broches compatibles avec les interruptions

Une interruption est un processus qui est déclenché de manière asynchrone par un évènement extérieur. Les interruptions permettent de détecter un évènement en temps réel tout en laissant le processeur du micro-contrôleur faire d’autres tâches.

Les interruptions fonctionnent uniquement avec les entrées numériques. Les entrées numériques pouvant déclencher une interruption sont entourée d’un cercle sur le schéma ci-dessous.

N’utilisez pas les broches colorées en orange ou en rouge. Votre programme pourrait avoir un comportement inattendu en utilisant celles-ci.

Attention. Certaines broches passent à l’état haut (HIGH) ou émettent des signaux PWM au démarrage ou lors de la réinitialisation (déjà mentionné précédemment). D’autres sont utilisées par le système pour accéder à la mémoire flash ou téléverser le programme. Il ne faut pas les utiliser dans vos projets.

ytlypsar90nj0dmylmqg-8526049

Suivez ce tutoriel qui explique en détail comment utiliser les interruptions de l’ESP32.

Broches du sous-système temps réel (RTC) et capacitives (Touch)

Le processeur de l’ESP32 dispose d’un sous-système à très basse consommation temps réel appelé RTC qui reste actif même lorsque celui-ci est en veille.

Pour mémoire, l’ESP32 dispose de plusieurs modes de veille. En fonction du mode activé, les différents sous-systèmes sont désactivé pour réduire la consommation et / ou économiser la batterie.

Active Mode
GPIO WiFi Bluetooth CPU ULP RTC Consommation*
duiubjnxi1debesygyam-8970411 liukttzy0gdydqtkkih1-3364537 klou46piq91m0sdd2l6j-2460135 3ismtxxex4lc1l2svgno-1108882 3ismtxxex4lc1l2svgno-1108882 fx4uwbilbmrqfhlnxxgo-6044592 95  ~ 240 mA
Modem Sleep
duiubjnxi1debesygyam-8970411 liukttzy0gdydqtkkih1-3364537 klou46piq91m0sdd2l6j-2460135 3ismtxxex4lc1l2svgno-1108882 3ismtxxex4lc1l2svgno-1108882 fx4uwbilbmrqfhlnxxgo-6044592 20  ~ 68 mA
Light Sleep
duiubjnxi1debesygyam-8970411 liukttzy0gdydqtkkih1-3364537 klou46piq91m0sdd2l6j-2460135 3ismtxxex4lc1l2svgno-1108882 3ismtxxex4lc1l2svgno-1108882 fx4uwbilbmrqfhlnxxgo-6044592 0,8 mA
  Core en pause
Deep Sleep
duiubjnxi1debesygyam-8970411 liukttzy0gdydqtkkih1-3364537 klou46piq91m0sdd2l6j-2460135 3ismtxxex4lc1l2svgno-1108882 3ismtxxex4lc1l2svgno-1108882 fx4uwbilbmrqfhlnxxgo-6044592 10 ~ 150 μA
RTC uniquement
Hibernation
duiubjnxi1debesygyam-8970411 liukttzy0gdydqtkkih1-3364537 klou46piq91m0sdd2l6j-2460135 3ismtxxex4lc1l2svgno-1108882 3ismtxxex4lc1l2svgno-1108882 fx4uwbilbmrqfhlnxxgo-6044592 1 μA
RTC uniquement x1

Pour en savoir plus sur la mise en veille de l’ESP32, lisez cet article détaillé

L’ESP32 dispose donc de

  • 18 broches marquées RTC numérotées et 0 à 17.
  • 10 broches pour écrans tactiles (Touch screen) numérotées de 0 à 9.

Le repérage des broches à évolué entre les versions des SoC ESP32. Le tableau suivant récapitule les broches RTC et Touch des cartes de développement Espressif ESP32-DevKitC v4 (2020) et ESP32-DevKitC v2 (obsolète).

Libellé broche RTC Broche capacitive (Touch Pad) Repère de la broche sur une carte ESP32 DevKitC version 4 (2020) Repère de la broche sur une carte ESP32-DevKitC V2 (obsolète)
Repère carte Broche CPU (49 broches) Repère carte Broche CPU (39 broches)
RTC_GPIO0 VP 5 VP 4
RTC_GPIO1 Non exposée 37 Non exposée
RTC_GPIO2 Non exposée 7 Non exposée
RTC_GPIO3 VN 8 VN 5
RTC_GPIO4 34 10 IO34 6
RTC_GPIO5 35 11 IO35 7
RTC_GPIO6 25 14 IO25 10
RTC_GPIO7 26 15 IO26 11
RTC_GPIO8 Touch8 33 13 IO33 9
RTC_GPIO9 Touch9 32 12 IO32 8
RTC_GPIO10 Touch0 4 4 IO4 26
RTC_GPIO11 Touch1 0 0 IO0 25
RTC_GPIO12 Touch2 2 2 IO2 24
RTC_GPIO13 Touch3 15 15 IO15 23
RTC_GPIO14 Touch4 13 13 IO13 16
RTC_GPIO15 Touch5 12 12 IO12 14
RTC_GPIO16 Touch6 14 17 IO14 16
RTC_GPIO17 Touch7 27 16 IO27 12

Voici le repérage de broches du kit de ESP32 DevKitC version 4 (2020).

Le numéro encerclé correspond à la broche du processeur.

Le numéro indiqué sur la carte de développement correspond au GPIO, c’est ce numéro qu’il faut utiliser dans le code Arduino du projet.

ra0dawabw3oe5kuqqu2l-6816554

Source : repérage des broches (pinout) RTC et capacitives (Touch) du kit officiel ESP32 DevkitC v4 d’après la documentation officielle Espressif.

Lisez cet article pour en savoir plus sur les broches RTC ou tactiles.

Broche EN (Enable)

La broche EN (ENable) permet d’activer le régulateur 3.3V. Par défaut, le régulateur est activé. Pour désactiver le régulateur, il faut mettre à la terre (GND) de tension Il est tiré vers le haut, alors connectez-vous à la terre pour désactiver le régulateur 3.3V. Cela signifie que vous pouvez utiliser cette broche connectée à un bouton poussoir pour redémarrer votre ESP32, par exemple.

Bus I2C

L’ESP32 dispose de 2 bus I2C indépendants. Chaque bus pourra jouer le rôle d’équipement principal (pilote le bus) ou d’équipement secondaire.

GPIO Bus I2C n°1 Bus I2C n°2
SDA 21 Défini par l’utilisateur
SCL 22 Défini par l’utilisateur

Il est toutefois possible d’utiliser n’importe quelle broche numérique si les broches par défaut (21 et 22) ne sont pas exposées sur la carte de développement. Pour cela, il suffit d’indiquer les broches SDA et SCL à utiliser au moment de l’initialisation du bus comme ceci

Wire.begin(BROCHE_SDA, BROCHE_SCL);

Les interfaces I²C prennent en charge les modes suivants :

  • Mode standard (100 Kbit/s)
  • Mode rapide (400 Kbit / s)
  • Jusqu’à 5 MHz en fonction de la puissance du circuit
  • Mode d’adressage 7 bits / 10 bits
  • Mode d’adressage double

Bus SPI

L’ESP32 dispose de 3 bus SPI. SPI, HSPI (H pour Hardware) et VSPI (V pour Virtuel).

Par défaut, les bus HSPI et VSPI sont connectés aux broches suivantes

HSPI VSPI
CLK GPIO14 GPIO18
MISO GPIO12 GPIO19
MOSI GPIO13 GPIO23
SS GPIO15 GPIO5

Comme pour le bus I2C, il est possible de choisir manuellement n’importe quelle broche que l’on souhaite utiliser pour communiquer avec un équipement SPI (écran OLED, écran LCD, capteur, lecteur de carte micro SD…) en passant en paramètre les broches durant l’initialisation du bus.

SPI.begin(CLK, MISO, MOSI, SS);

Convertisseur Analogique-Numérique (ADC) 12-bits (18 canaux)

L’ESP32 est équipé d’un convertisseur Analogique / Numérique 12 bits (ou ADC en anglais qui signifie  Analog to Digital Converter) disposant de 18 canaux indépendants sur les broches listées dans le tableau ci-dessous.

Le processeur ULP de l’ESP32 est également conçu pour accéder au convertisseur ADC même lorsque le processeur est veille. Cela permet de réduire fortement la consommation d’énergie. La CPU peut être réveillée par un réglage de seuil et / ou via d’autres déclencheurs.

GPIO Canal ADC
0 ADC2_CH1
2 ADC2_CH2
4 ADC2_CH0
12 ADC2_CH5
13 ADC2_CH4
14 ADC2_CH6
15 ADC2_CH3
25 ADC2_CH8
26 ADC2_CH9
27 ADC2_CH7
32 ADC1_CH4
33 ADC1_CH5
34 ADC1_CH6
35 ADC1_CH7
36 ADC1_CH0
37 ADC1_CH1
38 ADC1_CH2
39 ADC1_CH3

Connaître le canal n’est pas très important, par contre il faut toujours avoir en tête que la tension sur la broche ne doit jamais dépasser 3V3. Au delà de cette tension, vous avez de grande chance de détériorer casser la carte de développement ESP32. Il y a une discussion sur GitHub à ce sujet.

L’échantillonnage étant réalisé sur 12-bits, la valeur renvoyée sera comprise entre 0 (0V) et 4095 (3V3).

Il est possible d’ajuster la résolution de 9 à 12-bits (voir le paragraphe suivant) ce qui donnera

  • 9-bits : valeur comprise entre 0 et 511
  • 10-bits : valeur comprise entre 0 et 1023
  • 11-bits : valeur comprise entre 0 et 2047
  • 12-bits : valeur comprise entre 0 et 4095

La méthode analogRead() est disponible sur la librairie ESP32-Arduino, il suffit de passer comme paramètre la broche sur laquelle on souhaite récupérer la valeur analogique.

Par exemple pour lire la valeur d’un potentiomètre connecté sur la broche 35

val = analogRead(35); 
Serial.print("Angle actuel :"); 
Serial.println(val);

Fonctions avancées du convertisseur ADC

Il existe d’autres fonctions plus avancées qui permettent de régler finement les paramètres d’acquisition de données.

Fonction Description
analogReadResolution(resolution) Définir les bits d’échantillonnage et la résolution. Il peut s’agir d’une valeur comprise entre 9 (0 – 511) et 12 bits (0 – 4095). La résolution par défaut est 12 bits.

9-bits(0-511), 10-bits(0-1023), 11-bits(0-2047) et 12-bits(0-4095)

analogSetWidth(width) Définir les bits d’échantillonnage et la résolution. Il peut s’agir d’une valeur comprise entre 9 (0 – 511) et 12 bits (0 – 4095). La résolution par défaut est 12 bits.

9-bits(0-511), 10-bits(0-1023), 11-bits(0-2047) et 12-bits(0-4095)

analogSetCycles(cycles) Définir le nombre de cycles par échantillon. La valeur par défaut est 8. Plage allant de 1 à 255
analogSetSamples(samples) Définir le nombre d’échantillons dans la plage. La valeur par défaut est 1 échantillon. Il a pour effet d’augmenter la sensibilité.
analogSetClockDiv(attenuation) réglez le séparateur de l’horloge ADC. La valeur par défaut est 1. Plage allant de 1 à 255
analogSetAttenuation(attenuation) Définir l’atténuation d’entrée pour toutes les broches ADC. La valeur par défaut est ADC_11db. Valeurs acceptées:

  • ADC_0db: ne définit aucune atténuation (entrée 1 V = lecture CAN de 1088).
  • ADC_2_5db: définit une atténuation de 1,34 (entrée 1 V = lecture CAN de 2086).
  • ADC_6db: définit une atténuation de 1,5 (entrée 1 V = lecture CAN de 2975).
  • ADC_11db: définit une atténuation de 3,6 (entrée 1 V = lecture CAN de 3959).
analogSetPinAttenuation(pin, attenuation) Définir l’atténuation d’entrée pour la broche spécifiée. La valeur par défaut est ADC_11db. Les valeurs d’atténuation sont les mêmes que celles de la fonction précédente.
adcAttachPin(pin) Attacher une broche au ADC (efface également tout autre mode analogique qui pourrait être activé). Renvoie un résultat VRAI ou FAUX.
adcStart(pin),adcBusy(pin)etresultadcEnd(pin) Démarrer une ADC sur le bus de la broche attachée. Vérifiez si la conversion sur le bus ADC de la broche est en cours d’exécution (renvoie VRAI ou FAUX). Obtenez le résultat de la conversion: retourne un entier de 16 bits.

Convertisseur Numérique-Analogique (DAC)

L’ESP32 est équipé d’un convertisseur Numérique-Analogique (ou Digital to Analogic Converter en anglais) offrant deux canaux sur 8 bits. Ils sont accessibles sur les broches 25 et 26.

GPIO Canal ADC
25 DAC1
26 DAC2

Interface infrarouge

L’interface infrarouge prend en charge huit canaux de transmission et de réception à distance par infrarouge. En programmant la forme d’onde d’impulsion, il prend en charge divers protocoles infrarouges. Huit canaux partagent un bloc de mémoire de 512 x 32 bits pour stocker la forme d’onde d’émission ou de réception.

Mises à jour

11/01/2021 Publication de l’article

English version

Merci pour votre lecture.

Avez-vous aimé cet article ?