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.

Utiliser les pins GPIO de l’ESP32

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

    generic esp32 pinout (ESP32 Wroom 32 Devkit model)

    Pinout d’une carte ESP32

  • ESP32 WROOM DevKit d’uPesy

    esp32 pinout de la carte uPesy ESP32 Wroom DevKit

    Pinout de la carte uPesy ESP32 Wroom DevKit

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 cotés contrairement à la plupart des autres cartes ESP32 qui sont trop « grosse » 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.

    pins utilisé par la flash interne de l'ESP32 : ne pas les connecter
    Les broches reliées à la mémoire Flash de l’ESP32

    GPIO

    Nom possibles

    6

    SCK/CLK

    7

    SDO/SD0

    8

    SDI/SD1

    9

    SHD/SD2

    10

    SWP/SD3

    11

    CSC/CMD

    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) ou pinMode(36, INPUT_PULLDOWN) ).

  • Certains pins ont un rôle spécial lors du démarrage de l’ESP32. Ce sont les Strapping Pins .

    ../../_images/esp32_pinout1.png

    Strapping pins de l’ESP32

    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 lapse de temps,certains pins changent rapidement d’états logiques (0V → 3.3V). Il se peut que vous ayez des bugs bizarres si ces pins : un relai qui s’active temporairement par exemple. 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 utilisés 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 controler 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 boiter et que l’on veut pouvoir l’allumer/l’eteindre avec un interrupteur.

  • Sur les cartes qui utilise 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

Récapitulatif des I/O possibles pour les pins de l’ESP32

GPIO

INPUT

OUTPUT

Commentaires

0

OUI (Pullup interne)

OUI

Doit être à 0V pendant le FLASH

1 (TX0)

NON

OUI

Communication UART avec le PC

2

OUI (Pulldown interne)

OUI

Doit être à 0V pendant le FLASH

3 (RX0)

OUI

NON

Communication UART avec le PC

4

OUI

OUI

5

OUI

OUI

6

NON

NON

Connecté à la flash interne

7

NON

NON

Connecté à la flash interne

8

NON

NON

Connecté à la flash interne

9

NON

NON

Connecté à la flash interne

10

NON

NON

Connecté à la flash interne

11

NON

NON

Connecté à la flash interne

12 (MTDI)

OUI (Pulldown interne)

OUI

Doit être à 0V pendant le BOOT

13

OUI

OUI

14

OUI

OUI

15 (MTDO)

OUI (Pullup interne)

OUI

Startup log si à 3.3V

16

OUI

OUI

Pas dispo sur les WROVER

17

OUI

OUI

Pas dispo sur les WROVER

18

OUI

OUI

19

OUI

OUI

21

OUI

OUI

22

OUI

OUI

23

OUI

OUI

25

OUI

OUI

26

OUI

OUI

27

OUI

OUI

32

OUI

OUI

33

OUI

OUI

34

OUI

NON

Pas de pullup/pulldown interne

35

OUI

NON

Pas de pullup/pulldown interne

36 (VP)

OUI

NON

Pas de pullup/pulldown interne

39 (VN)

OUI

NON

Pas de pullup/pulldown interne

EN

NON

NON

Relié au bouton EN (ESP32 Reset)

Périphériques de l’ESP32

Pour interagir avec les modules, capteurs ou circuits électroniques, l’ESP32 comme tout micro-contrô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 assoccié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 (s’il 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 entres 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 fonction setup() et d’utiliser la fonction Serial2.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.

    ../../_images/esp32_pinout2.png

    Message envoyé via l’UART2 depuis le pin GPIO17

  • 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);
    }
    
    ../../_images/esp32_pinout3.png

    Message envoyé via l’UART1 depuis le pin GPIO12

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 fonction Wire.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, le mappage des pins est le suivant :

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 disponible à 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.

Correspondance pour l’ADC1

ADC1_CH0

ADC1_CH1

ADC1_CH2

ADC1_CH3

ADC1_CH4

ADC1_CH5

ADC1_CH6

ADC1_CH7

GPIO 36

GPIO 37

GPIO 38

GPIO 39

GPIO 32

GPIO 33

GPIO 34

GPIO 35

Correspondance pour l’ADC2 (rarement utilisé)

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 invites à 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.