Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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() et Pin.off()

  • Pin.high() et Pin.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()
Câblage sur plaque de prototypage du bouton-poussoir et de la led

Circuit électrique à réaliser

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.

Câblage sur plaque de prototypage du bouton-poussoir et de la led

Circuit électrique à réaliser

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++.