Utiliser les entrées/sorties de l’ESP32 avec MicroPython
(Mis à jour le 12/01/2023)
La gestion des entrées/sorties des broches (GPIO) se fait très simplement en MicroPython grâce à l’objet Pin
du module machine
.Un pin signifie en anglais une broche. Pour interagir avec une pin « physique » de la carte, il faudra lui associer un objet Pin
“virtuel”. Chaque broche physique sera donc représentée par une variable (plus exactement un objet) de type Pin
. Il suffira d’exécuter des fonctions de type mon_pin.une_fonction()
sur la broche « virtuelle » pour modifier l’état de la broche « physique ».
Il faut donc penser à importer ce sous-module au début de votre script Python :
from machine import Pin
Configuration des pins en entrée ou en sortie avec MicroPython
La configuration d’un pin en entrée/sortie se fait lors de la création d’un objet Pin
.
Pour configurer un pin en sortie (par exemple pour la LED intégrée de l’ESP32, on créée un objet Pin
en précisant le numéro de la broche et son mode en sortie (OUT) :
pin_led = Pin(25, mode=Pin.OUT)
On peut si l’on souhaite, directement imposer une tension en sortie lors de la création de l’objet :
pin_led = Pin(25, mode=Pin.OUT, value=1) # 3.3V en sortie -> la led sera allumée
pin_led = Pin(25, mode=Pin.OUT, value=0) # 0V en sortie -> la led sera eteinte
Par défaut, lors de la création d’un objet Pin, la tension en sortie est de 0V, value
vaut 0.
Pour configurer un pin en entrée, il suffit de changer l’option mode
en entrée (IN) , lors de la création de la broche.
pin_24 = Pin(24, mode=Pin.IN)
Il est possible de préciser le type d’entrée que l’on veut avoir. On peut choisir entre une entrée avec une résistance de pullup, une résistance de pulldown ou sans résistance de tirage. Si ces termes ne vous parle pas, je vous encourage à consulter ulterieurment le fonctionnement et l’utilité des résistances de tirage (pullup, pulldown). On utilise l’argument optionel pull
qui permet de choisir le type de résistance de tirage.
pin_24 = Pin(24, mode=Pin.IN, pull=Pin.PULL_DOWN) # Entrée avec une résistance de pulldown
pin_24 = Pin(24, mode=Pin.IN, pull=Pin.PULL_UP) # Entrée avec une résistance de pullup (le + utilisé)
Différentes manières en MicroPython de lire ou imposer une tension
MicroPython propose plusieurs fonctions pour imposer une tension en sortie :
Pin.on()
etPin.off()
Pin.high()
etPin.low()
Pin.value(valeur)
Les noms de fonctions sont explicites :
pin_led = Pin(25, mode=Pin.OUT)
# Impose une tension de 3.3V en sortie (état logique haut)
pin_led.on()
pin_led.high()
pin_led.value(1)
# Impose une tension de 0V en sortie (état logique bas)
pin_led.off()
pin_led.low()
pin_led.value(0)
Note
Choisissez le couple de fonctions qui vous parle le plus. Par exemple, .on()|.off()
pour allumer des LEDS et high()|.low()
pour un cas plus général. La fonction Pin.value()
est pratique lorsque la valeur est dans stockée dans une variable Pin.value(ma_variable)
. Par exemple :
pin_led = Pin(2, mode=Pin.OUT)
output_state=1
pin_led.value(output_state) # 3.3V en sortie
output_state=0
pin_led.value(output_state) # 0V en sortie
Pour lire l’état d’une broche, c’est-à-dire soit 3.3V pour un niveau logique haut et 0V pour un niveau logique bas, on utilise la même fonction Pin.value()
sans préciser de valeur.
pin_24 = Pin(24, mode=Pin.IN, pull=Pin.PULL_UP)
pin_24.value() # Retourne 1 ou 0 en fonction de la tension mesurée
Mini-Projet : Allumer la LED lorsqu’un bouton-poussoir est pressé
Pour mettre en pratique la gestion des pins GPIO, voici un script qui allume la LED intégrée lorsqu’on appuie sur un bouton-poussoir. Il existe 2 variantes du script : un qui utilise une entrée digitale avec une résistance pullup et un autre avec une résistance pulldown.
Note
En général on utilise des résistances de tirages en pullup plutôt qu’en pulldown pour les entrées numériques.
Avec la résistance pulldown interne de l’entrée numérique
Voici le circuit électrique à réaliser pour faire fonctionner le script MicroPython sur une carte ESP32.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_DOWN)
pin_led = Pin(2, mode=Pin.OUT)
while True:
if pin_button.value() == 1:
pin_led.on()
else:
pin_led.off()
Avec la résistance pullup interne de l’entrée numérique
Voici le schéma électrique associé au script MicroPython sur une carte ESP32. Il faut juste relier le bouton à la masse au lieu de 3.3V.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(2, mode=Pin.OUT)
while True:
if not pin_button.value():
pin_led.on()
else:
pin_led.off()
Note
Vous remarquerez que l’on peut condenser pin_button.value() == 1
par not pin_button.value()
dans la condition du if
.
On peut condenser le code car une condition if
peut être écrite sur seule une ligne en Python :
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(2, mode=Pin.OUT)
while True:
pin_led.on() if not pin_button.value() else pin_led.off()
On pourrait encore simplifier le code en retirant complètement le if
même si l’on perd en clarté.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(2, mode=Pin.OUT)
while True:
pin_led.value(not pin_button.value())
Note
Ce sont des petites optimisations qui peuvent avoir leur importance si l’on souhaite exécuter le plus rapidement possible le code, car pour rappel MicroPython est très lent par rapport au langage C/C++.