Utiliser les entrées/sorties avec MicroPython

La gestion des entrées/sorties des broches (GPIO) se fait très simplement en MicroPython grace à 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’executer 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 la Pi Pico, 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 s’il on souhaite, directement imposer une tension en sortie lors de la creation 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(25, 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

Il existe également la fonction Pin.toggle() qui permet d’inverser l’état d’une sortie

pin_led = Pin(25, mode=Pin.OUT, value=1) # 3.3V en sortie
pin_led.toggle() # 0V en sortie

Pour lire l’état d’un 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 electrique à réaliser pour faire fonctionner le script MicroPython.

from machine import Pin

pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_DOWN)
pin_led    = Pin(25, 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. 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(25, 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 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(25, 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 s’il on perd en clarté.

from machine import Pin

pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led    = Pin(25, mode=Pin.OUT)

while True:
    pin_led.value(not pin_button.value())

Note

Ce sont des petits optimisations qui peuvent avoir leurs importances s’il on souhaite executer le plus rapidement possible le code, car pour rappel MicroPython est très lent par rapport au langage C/C++.