Utiliser les pins GPIO de l’ESP32

../../_images/full_pinout_Wroom_rev2.png

Pinout de la carte uPesy ESP32 Wroom Devkit

Informations sur les pins GPIO

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 et de ne pas savoir pourquoi.

Les cartes de développement basées sur un ESP32 possèdent en général 32 pins GPIO . 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 pas les utiliser car ils sont reliés au bus SPI de la mémoire flash. Si vous les utilisez l’ESP32 ne fonctionnera pas.

    ../../_images/esp32_pinout0.png

    Note

    C’est pour cette raison que ces pins ne sont pas présents sur les cartes 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.

  • Les pins GPIO36, GPIO39, GPIO34, GPIO35 peuvent être utilisés uniquement en entrée. Ils n’ont pas non plus de résistances pullup et pulldown internes (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 FLASHING (pour téléverser le programme dans la mémoire flash). Ce sont les pins GPIO0, GPIO2, GPIO12 (MTDI) et GPIO15 (MTDO) . On peut utiliser ces pins, il faut juste faire attention quand on impose un état haut ou bas (3.3V ou 0V) avec une résistance de pullup ou pulldown externe. Certains capteurs possèdent des résistances de pullup/pulldown externes sur leur circuit. Si votre carte ESP32 fonctionne correctement, puis que vous rajoutez un capteur et que plus rien ne marche (impossible de téléverser le programme ou de le lancer), il est fort probable que ce soit lié à ces pins.

  • Sur la carte ESP32 Wrover Devkit, les pins GPIO16 et GPIO17 ne sont pas disponibles car ils sont utilisés par la PSRAM en interne.

  • Les autres pins GPIO ne posent pas de problème.

Voici un récapitulatif de tous les pins GPIO :

Récapitulatif des fonctions I/O des pins de l’ESP32

GPIO

INPUT

OUTPUT

Commentaires

0

OUI (Pullup interne)

OUI

Doit être à 0V pendant le FLASHING

1 (TX0)

NON

OUI

Communication UART avec le PC

2

OUI (Pulldown interne)

OUI

Doit être à 0V pendant le FLASHING

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

Connecté au bouton EN

Périphériques de l’ESP32

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.

Avertissement

Les fonctions de l’ADC (CAN en FR) et du DAC (CNA en FR) sont assignés à des pins fixes. Par contre, vous pouvez choisir dans le code sur quels pins sont l’UART, I2C, SPI, PWM,… Cette fonctionnalité est possible grâce à la GPIO matrix de l’ESP32. Il y a une association faite par défaut sur les cartes ESP32 par le fabricant. C’est une fonctionnalité très puissante qui n’existe pas sur Arduino et Raspberry Pi !

UART

L” UART est le protocole série qui permet d’échanger facilement des données entres les 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

I2C

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 au début). 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);
    }
    

SPI

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. Les 2 bus SPI disponibles sont 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

23

19

18

5

HSPI

13

12

14

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);

PWM

L’ESP32 dispose de 16 canaux indépendants qui peuvent être utilisés pour générer des signaux PWM. Cela veut dire que l’on dispose de 16 sorties PWM complêtement indépendantes. Tous les pins qui peuvent être configurés en sortie peuvent être utilisés pour sortir un signal PWM. L’utilisation du PWM est différente de celle sur Arduino; le tutoriel suivant explique comment utiliser le PWM sur ESP32 : Créer des tensions variables sur l’ESP32 avec le PWM

Capteurs capacitifs

L’ESP32 possède 10 capteurs capacitifs (9 si le pin GPIO0 n’est pas disponible). Ils peuvent être utilisés comme bouton tactile. Ce sont les fameux « TOUCH » que l’on trouve sur les pinouts. Leur utilisation sur ESP32 est détaillée ici Les capteurs capacitifs de l’ESP32

Les capteurs capacitifs internes sont connectés aux pins GPIO suivants :

TOUCH0

TOUCH1

TOUCH2

TOUCH3

TOUCH4

GPIO4

GPIO0

GPIO2

GPIO15

GPIO13

TOUCH5

TOUCH6

TOUCH7

TOUCH8

TOUCH9

GPIO12

GPIO14

GPIO27

GPIO33

GPIO32

ADC/CAN (Convertisseur Analogique vers Numérique)

L’ESP32 possède 2 ADC séparés : l’ADC1 avec 8 canaux et l’ADC2 avec 10 canaux. Par exemple, il y a sur le pin GPIO34, le canal numéro 6 de l’ADC1 (ADC1_CH6)

Avertissement

L’ADC2 ne peut pas être utilisé quand le WiFi est activé. De manière générale l’ADC de l’ESP32 n’est pas très fiable malgré ses 12 bits de résolution.

Plus d’informations sur le fonctionnement de l’ADC sont disponibles ici : Mesurer des tensions analogiques avec l’ADC de l’ESP32

DAC/CNA (Convertisseur Numérique vers Analogique)

L’ESP32 possède 2 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.