Utiliser les pins GPIO de l’ESP32
(Mis à jour le 06/07/2022)
Découvrez au sein d’une même page toutes les informations pertinentes sur le pinout de l’ESP32 afin d’utiliser correctement ces pins GPIO pour votre projet d’électronique DIY. Même s’il existe de nombreuses variations de cartes ESP32, le fonctionnement des pins reste le même. Par contre, il se peut que certaines broches ne soient pas accessibles en fonction de votre modèle.
Il existe une multitude de cartes ESP32 avec un placement des broches différentes. Voici le schéma détaillé des broches de 2 cartes ESP32 différentes. Il vous sera très utile pour connaître les fonctions spécifiques à chaque broche :
-
ESP32 WROOM DevKit générique
-
ESP32 WROOM DevKit d’uPesy
Note
Une différence majeure entre les 2 cartes qui ne saute pas forcément aux yeux est leurs largeurs : La carte ESP32 d’uPesy peut être mise sur une breadboard et on peut accéder aux broches des 2 côtés contrairement à la plupart des autres cartes ESP32 qui sont trop “grosses” pour être utilisées sur une breadboard …
Fonctionnement particulier de certaines broches de l’ESP32
Le but est de vous informer des limitations de certains pins GPIO de l’ESP32 pour éviter d’avoir de mauvaises surprises lors de vos projets ou d’avoir un bug incompréhensible dans votre programme.
Les cartes de développement basées sur un ESP32 possèdent en général 33 broches hormis celles pour l’alimentation. Certains pins GPIO ont des fonctionnements un peu particuliers :
Si votre carte ESP32 possède les pins GPIO6, GPIO7, GPIO8, GPIO9, GPIO10, GPIO11, il ne faut surtout pas les utiliser car ils sont reliés à la mémoire flash de l’ESP32 : si vous les utilisez l’ESP32 ne fonctionnera pas.
Note
C’est pour cette raison que ces pins ne sont pas présents sur la carte ESP32 d’uPesy.
Les pins GPIO1 (TX0) et GPIO3 (RX0) sont utilisés pour communiquer avec l’ordinateur en UART via l’USB. Si vous les utilisez, vous ne pourrez plus uploader de programmes sur la carte ni utiliser le moniteur série via le port USB. Ils peuvent être utiles pour programmer la carte sans utiliser l’USB avec un programmeur extérieur. Heureusement, il existe d’autres interfaces UART disponibles.
Les pins GPIO36 (VP), GPIO39 (VN), GPIO34, GPIO35 peuvent être utilisés uniquement en entrée. Ils n’ont pas non plus de résistances pullup et pulldown internes intégrées (On ne peut pas utiliser
pinMode(36, INPUT_PULLUP)
oupinMode(36, INPUT_PULLDOWN)
).-
Certains pins ont un rôle spécial lors du démarrage de l’ESP32. Ce sont les Strapping Pins .
Ils sont utilisés pour mettre l’ESP32 en mode BOOT (pour exécuter le programme écrit dans la mémoire flash) ou en mode FLASH (pour téléverser le programme dans la mémoire flash). En fait, en fonction de la tension présente au bord de ces broches, l’ESP32 démarrera soit en mode BOOT ou soit en mode FLASH .
Les strapping pins sont les pins GPIO0, GPIO2, GPIO12 (MTDI) et GPIO15 (MTDO) . On peut les utiliser, mais il faut juste faire attention lorsqu’on impose un état logique (3.3V ou 0V) avec une résistance de pullup ou pulldown externe.
Astuce
Si votre carte ESP32 fonctionne correctement, puis que lorsque vous rajoutez un capteur plus rien ne marche (impossible de téléverser le programme ou de le lancer), alors il sera fort probable que ce soit lié à ces fameux strapping pins.
-
Lors du boot de l’ESP32, pendant un cours laps de temps, certains pins changent rapidement d’états logiques (0V → 3.3V). Il se peut que vous ayez des bugs bizarres avec ces pins : par exemple un relais qui s’active temporairement . Les pins fautifs sont les suivants:
GPIO 1 : Envoi les logs du boot de l’ESP32 via l’UART
GPIO 3 : Tension de 3.3V lors du boot
GPIO 5 : Envoie un signal PWM lors du boot
GPIO 14 : Envoie un signal PWM lors du boot
GPIO 15 : Envoi les logs du boot de l’ESP32 via l’UART
Note
Je vous rassure, on peut utiliser ces pins. Si vous avez un fonctionnement bizarre lors du démarrage de l’ESP32 avec l’un de ces pins, il faudra sûrement en choisir un autre.
Le pin EN permet de contrôler l’état d’allumage de l’ESP32 via un fil extérieur. Il est relié au bouton EN de la carte. Lorsque l’ESP32 est allumé, il est à 3.3V. Si on relie ce pin à la masse, l’ESP32 est éteint. On peut l’utiliser lorsque l’ESP32 est dans un boîtier et que l’on veut pouvoir l’allumer/l’éteindre avec un interrupteur.
Sur les cartes qui utilisent un module ESP32-WROVER pour avoir plus de RAM (par exemple sur la carte uPesy ESP32 Wrover DevKit), alors les pins GPIO16 et GPIO17 ne sont pas disponibles car ils sont utilisés en interne par la PSRAM.
Le reste des pins GPIO n’ont pas de restrictions particulières.
Récapitulatif de tous les pins GPIO de l’ESP32
Périphériques de l’ESP32
Pour interagir avec les modules, capteurs ou circuits électroniques, l’ESP32 comme tout microcontrôleur possède une multitude de périphériques. Ils sont d’ailleurs beaucoup plus nombreux que sur une carte Arduino Uno classique.
L’ESP32 possède les périphériques suivants :
Certains périphériques sont déjà utilisés par l’ESP32 lors de son fonctionnement basique. Il y a donc dans la réalité moins d’interfaces possibles pour chaque périphérique.
Astuce
Les broches de l’ESP32 sont beaucoup plus modulaires que celles de l’Arduino : On peut « attacher » un périphérique UART, I2C, SPI, PWM sur les broches que l’on souhaite. Le SPI, I2C, UART, PWM, DAC ne sont plus associés à des broches spécifiques. Par exemple, sur l’Arduino Uno, on ne pouvait avoir du SPI que sur les broches numéro 10, 11, 12, 13. Avec l’ESP32, on peut choisir celles qu’on veut. Il y a seulement l’ADC et les capteurs capacitifs qui sont assignés à des pins fixes. Les schémas détaillés des broches de l’ESP32 disponible sur Internet montrent en réalité l’association faite par défaut (si l’on ne précise pas les pins utilisés). Cela reste néanmoins une bonne pratique d’utiliser les pins par défaut pour garder une bonne compatibilité avec les librairies tant que cela n’est pas limitant dans le branchement de vos câbles.
L’UART sur l’ESP32
L’UART est le protocole série qui permet d’échanger facilement des données entre 2 appareils . Sur l’ESP32 3 bus UART sont disponibles : UART0, UART1 et UART2. Ils peuvent être utilisés pour communiquer avec un capteur, une Arduino, une Raspberry Pi, un ordinateur …
L’UART0 est par défaut sur les pins GPIO1(TX0) et GPIO3(RX0) de l’ESP32, il est utilisé pour communiquer avec l’ordinateur via le moniteur série. C’est également celui qui est utilisé pour flasher la carte ESP32. En général, on l’utilise pour afficher des messages dans la console avec
Serial.println()
.-
Pour utiliser l’UART2, il suffit d’ajouter
Serial2.begin()
dans la fonctionsetup()
et d’utiliser la fonctionSerial2.println()
pour envoyer des messages. Par défaut, le bus UART2 est sur les pins GPIO16(RX2) et GPIO17(TX2) mais on peut les changer (utile avec un module Wrover) lors du setup. Ce simple code permet d’utiliser le bus UART2 :void setup() { Serial2.begin(115200); } void loop() { Serial2.println("Hello from UART2"); delay(100); }
Note
Le message ne sera pas affiché dans le moniteur série puisque l’UART2 n’est pas relié à l’USB de l’ordinateur.
-
L’UART1 est par défaut sur les pins utilisés par la flash de l’ESP32. On peut cependant l’utiliser grâce à la “GPIO matrix” de l’ESP32 en choisissant les pins que l’on veut. Ainsi ce code permet d’avoir une liaison série sur les pins GPIO14 et GPIO12 en utilisant le bus UART1.
void setup() { /* * UART1 -> Serial1 * RX Pin -> GPIO 14 * TX Pin -> GPIO 12 * UART Configuration -> SERIAL_8N1 */ Serial1.begin(115200,SERIAL_8N1,14,12); } void loop() { Serial1.println("Hello from UART1"); delay(100); }
L’I2C sur l’ESP32
L’ESP32 possède 2 bus I2C :
Le bus I2C0 est celui qui est utilisé par défaut par les librairies Arduino. Il est relié aux pins GPIO22(SCL) et GPIO21(SDA) de l’ESP32. Il peut être utilisé sur n’importe quel pin de l’ESP32 quand vous utilisez la librairie
Wire.h
en précisant les pins avec la fonctionWire.begin(SDA_PIN, SCL_PIN)
-
Le bus I2C1 peut aussi être utilisé sur n’importe quel pin (faire attention aux pins limités décrits précédemment). Voici un exemple qui utilise le 2ème bus I2C:
#include <Wire.h> TwoWire I2C1 = TwoWire(1); void setup() { I2C1.begin(14,12,400000); // SDA pin 14, SCL pin 12, 400kHz frequency } void loop() { I2C1.beginTransmission(0x42); I2C1.write(140); I2C1.endTransmission(); delay(100); }
Le SPI sur l’ESP32
Même si l’ESP32 possède 3 bus SPI, seulement 2 peuvent être utilisés car un des bus est utilisé par la mémoire flash interne. Les 2 bus SPI disponibles s’appellent VSPI et HSPI.
Note
Les librairies Arduino qui utilisent le SPI utilisent par défaut le bus VSPI.
Par défaut, la correspondance des pins est la suivante :
SPI |
MOSI |
MISO |
SCK/CLK |
CS/SS |
---|---|---|---|---|
VSPI |
GPIO 23 |
GPIO 19 |
GPIO 18 |
GPIO 5 |
HSPI |
GPIO 13 |
GPIO 12 |
GPIO 14 |
GPIO 15 |
Comme pour l’I2C, il est possible de choisir manuellement les broches que l’on veut utiliser pour le SPI en précisant les broches lors de l’initialisation du bus SPI.begin(CLK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
Le PWM sur l’ESP32
L’ESP32 dispose de 16 canaux qui peuvent être utilisés pour générer des signaux PWM : on peut avoir jusqu’à 16 sorties PWM différentes. Tous les pins qui peuvent être configurés en sortie peuvent être utilisés pour sortir un signal PWM. L’utilisation du PWM est un différente de celle sur Arduino, on peut configurer plus de paramètres. Je vous suggère de consulter l’utilisation du PWM de l’ESP32 avec du code Arduino pour l’utiliser dans vos projets.
Les capteurs capacitifs sur l’ESP32
L’ESP32 possède 10 capteurs capacitifs (9 si le pin GPIO0 n’est pas disponible). Ils peuvent être utilisés comme des boutons tactiles. Ce sont les fameux TOUCH que l’on trouve sur les schémas des broches. On peut également les utiliser lorsque l’ESP32 est en mode DeepSleep (mode d’économie d’énergie) pour le réveiller. Je vous invite à lire l’utilisation des capteurs capacitifs sur l’ESP32 avec du code Arduino pour avoir plus de détails.
Les capteurs capacitifs internes sont connectés aux pins GPIO suivants :
TOUCH0 |
TOUCH1 |
TOUCH2 |
TOUCH3 |
TOUCH4 |
---|---|---|---|---|
GPIO 4 |
GPIO 0 |
GPIO 2 |
GPIO 15 |
GPIO 13 |
TOUCH5 |
TOUCH6 |
TOUCH7 |
TOUCH8 |
TOUCH9 |
GPIO 12 |
GPIO 14 |
GPIO 27 |
GPIO 33 |
GPIO 32 |
L’ADC sur l’ESP32
L’ESP32 possède 2 ADC séparés : l’ADC1 avec 8 canaux et l’ADC2 avec 10 canaux, pour un total de 18 entrées analogique. Par exemple, il y a sur le pin GPIO34, le canal numéro 6 de l’ADC1 (ADC1_CH6) . Seulement en pratique, il y en a beaucoup moins de disponibles à cause du Wi-Fi.
Avertissement
L’ADC2 ne peut pas être utilisé quand le Wi-Fi est activé : Le Wi-Fi de l’ESP32 l’utilise pour fonctionner.
ADC1_CH0 |
ADC1_CH1 |
ADC1_CH2 |
ADC1_CH3 |
---|---|---|---|
GPIO 36 |
GPIO 37 |
GPIO 38 |
GPIO 39 |
ADC1_CH4 |
ADC1_CH5 |
ADC1_CH6 |
ADC1_CH7 |
GPIO 32 |
GPIO 33 |
GPIO 34 |
GPIO 35 |
Note
En général, les broches GPIO37 et GPIO38 ne sont pas disponibles, si votre carte possède un module WROOM ou WROVER. Ces modules n’exposent pas ces pins. Seules les cartes qui utilisent directement la puce ESP32 (sans passer par un module) peuvent éventuellement les exposer.
ADC2_CH0 |
ADC2_CH1 |
ADC2_CH2 |
ADC2_CH3 |
ADC2_CH4 |
---|---|---|---|---|
GPIO 4 |
GPIO 0 |
GPIO 2 |
GPIO 15 |
GPIO 13 |
ADC2_CH5 |
ADC2_CH6 |
ADC2_CH7 |
ADC2_CH8 |
ADC2_CH9 |
GPIO 12 |
GPIO 14 |
GPIO 27 |
GPIO 25 |
GPIO 26 |
De manière générale l’ADC de l’ESP32 n’est pas très fiable malgré ses 12 bits de résolution. Je vous invite à consulter pour avoir plus de renseignements l’article sur l’utilisation et les limites de l’ADC de l’ESP32 .
Le DAC sur l’ESP32
L’ESP32 possède 2 sorties DAC de 8 bits pour convertir un signal numérique en un signal analogique (générer un sinus par exemple). Les pins utilisés sont les suivants :
DAC1 |
DAC2 |
---|---|
GPIO 25 |
GPIO 26 |
Note
La résolution de seulement 8 bits du DAC est insuffisante pour l’utiliser pour des applications audios sans détérioration. Il vaut mieux privilégier un DAC externe avec une meilleure résolution (12-24 bits) et utiliser le bus I2S de l’ESP32.