ESP32. Utiliser les entrées / sorties numériques du GPIO avec du code Arduino • Domotique et objets connectés à faire soi-même

L’ESP32 dispose de nombreuses broches qui peuvent être utilisées comme entrée ou sortie numérique. L’ESP32 dispose par ailleurs de résistances pull-up et pull-down qui permet de simplifier les circuits. La programmation est identique aux projets Arduino. Nous allons apprendre sur un exemple simple comment lire l’état d’une entrée numérique et piloter une sortie pour allumer une LED.

Evitez d’utiliser les broches réservées au processeur de l’ESP32 ou qui sont utilisées au moment du démarrage.

Installer le SDK ESP-IDF pour ESP32 sur IDE Arduino et PlatformIO

Si vous débutez avec les cartes de développement ESP32 vous devez d’abord installer le kit de développement ESP-IDF. Voici deux tutoriels pour débuter en fonction de votre éditeur de code

Suivez les instructions de ce tutoriel pour l’IDE Arduino

Et celui-ci pour PlatformIO (idéalement avec VSCode)

Identifier les broches d’entrée / sortie numérique de l’ESP32

L’ESP32 dispose de nombreuses broches pouvant être utilisées comme entrée et / ou sortie numérique. Certaines broches sont réservées ou sont utilisées par le processeur par exemple pour accéder à la mémoire flash via le bus SPI (broches 6 à 11), port série pour téléverser le programme ou le debogage.

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 mais vous devez faire attention car ils peuvent avoir un comportement inattendu au démarrage.

Il est déconseillé – interdit – d’utiliser les broches encadrées en rouge. Généralement, elles sont réservées (et utilisées) par le processeur de l’ESP32. Vous risquez 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ébogage 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
6 Utilisé pour la mémoire flash SPI
7 Utilisé pour la mémoire flash SPI
8 Utilisé pour la mémoire flash SPI
9 Utilisé pour la mémoire flash SPI
10 Utilisé pour la mémoire flash SPI
11 Utilisé pour la mémoire flash SPI
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
35
36
39

Données collectées dans la documentation officielle.

Broche à éviter ou interdites

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

  • GPIO0
  • GPIO1
  • GPIO3
  • GPIO5
  • GPIO6 à GPIO11 connectés à la mémoire flash SPI. Utilisation interdite.
  • GPIO14
  • GPIO15

Comment lire une entrée numérique de l’ESP32 ?

Pour pouvoir lire sur une entrée numérique du GPIO, il faut tout d’abord configurer la broche comme une entrée à l’aide de la fonction pinMode() comme ceci

pinMode(broche, mode);

La méthode pinMode a deux arguments

  • Le numéro de la broche
  • Le mode

3 modes sont disponibles pour configurer la broche comme une entrée numérique

  • INPUT En fonction du périphérique d’entré utilisé, il faudra adapter le circuit. Par exemple, lorsqu’on utilise un bouton poussoir de type Momentary Switch, il faudra intégrer une résistance de tirage pull-up ou de rappel pull-down au circuit. Sans résistance de pull-up ou pull-down l’entrée de l’ESP32 est flottante. Le niveau logique est indéfini ce qui peut entraîner un fonctionnement erratique du programme. Par exemple ne pas détecter la pression sur un bouton ou au contraire détecter qu’il est enfoncé alors que ce n’est pas le cas.
  • INPUT_PULLUP On utilise la résistance de tirage (PULL UP) de l’ESP32
  • INPUT_PULLDOWN On utilise la résistance de rappel (PULL DOWN) de l’ESP32

Pour lire une entrée numérique – comme un bouton – on utilise la fonction digitalRead(), qui prend comme argument le numéro de la broche du GPIO.

digitalRead(broche);

Utilisez le schéma et le tableau précédent pour choisir les broches du GPIO pour votre projet.

Comment piloter une sortie numérique de l’ESP32 ?

Pour pouvoir utiliser une broche du GPIO comme une sortie numérique, il faut tout d’abord configurer la broche à l’aide de la fonction pinMode() en indiquant le numéro de la broche et en passant l’argument OUTPUT pour le mode

pinMode(broche, OUTPUT);

La broche peut prendre 2 états

  • LOW la broche est à l’état bas, c’est à dire que la tension est nulle (0V).
  • HIGH la broche est à l’état haut, c’est à dire que la tension est de 3.3V

La fonction digitalWrite() permet de passer la broche à l’état haut (HIGH) ou bas (LOW) pour une broche du GPIO.

digitalWrite(broche, ETAT);

Remarque sur la consommation de courant par le GPIO

Le GPIO de l’ESP32 n’est conçu que pour envoyer des signaux de faible puissance (quelques volts, et quelques milliampères) et ne pourra délivrer suffisamment d’énergie que pour alimenter quelques composants électroniques de faible consommation comme des LED, des entrées de relais statique, etc.

Par contre, le GPIO ne pourra pas être utilisé pour alimenter un moteur par exemple.

D’après la section Absolute Maximum Ratings de la documentation technique, la puissance totale utilisée par le GPIO ne doit pas dépasser 1200 mA.

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

Exemple pour allumer une LED

Voici un exemple de code Arduino qui illustre le fonctionnement des entrées / sorties numériques de l’ESP32.

La LED s’allume dès qu’on presse sur le bouton poussoir et s’éteint dès qu’on relâche ce dernier.

Circuit

Le bouton poussoir est connecté au 4. La LED est connectée à la sortie 32.

Vous pouvez tester le fonctionnement du programme en l’absence de résistance de tirage (PULL_UP). Vous pouvez tester en utilisant la résistance de tirage (PULL_UP) interne de l’ESP32 ou ajouter une résistance au circuit (10 kΩ par exemple).

La LED doit être protégée par une résistance dont la valeur dépend de la tension et l’intensité de sortie de la broche (3,3V – 40mA) et de la tension d’alimentation maximale de la LED.

Voir d’autres assortiments

Vous pouvez utiliser ce calculateur pour déterminer la valeur de la résistance nécessaire pour votre circuit.

Téléverser le code Arduino du projet

Créer un nouveau croquis sur l’IDE Arduino ou un nouveau projet PlatformIO.

Sur l’IDE Arduino vous pouvez retirer la première ligne #include .

#include 

const int PIN_BUTTON = 4;   
const int PIN_LED =  32;    

// variable permettant de stocker l etat du bouton
int button_state = 0;

void setup() {
  Serial.begin(115200);  
  
  // Initialise l entre du bouton comme un entree avec resistance PULL_DOWN
  pinMode(PIN_BUTTON, INPUT_PULLDOWN);
  
  // Configure la sortie pour la LED
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  // Lit la valeur du bouton
  button_state = digitalRead(PIN_BUTTON);
  Serial.println(PIN_BUTTON);
  
  // si le bouton est appuye, passe l etat de la sortie a HIGH, sinon LOW
  if (button_state == HIGH) {
    // Allume la LED
    digitalWrite(PIN_LED, HIGH);
  } else {
    // Eteint la LED
    digitalWrite(PIN_LED, LOW);
  }
}

Configuration PlatformIO pour une LoLin D32

Voici un exemple de fichier de configuration platformio.ini pour une carte de développement LoLin D32 Pro

[env:lolin_d32_pro]
platform = espressif32
board = lolin_d32_pro
framework = arduino
monitor_speed = 115200

Mises à jour

01/12/2020 Corrections du texte envoyé via le formulaire de contact. Merci beaucoup Dominique 😎

29/09/2020 Publication de l’article

English Version

Avez-vous aimé cet article ?

[Total: 3 Moyenne: 4.7]