Utiliser les entrées/sorties avec MicroPython sur la Pi Pico
(Mis à jour le 17/01/2023)
En MicroPython , les entrées et sorties des broches (GPIO ) peuvent être facilement gérées grâce à l’objet Pin
du module machine
. En anglais, le terme pin
désigne une broche. Pour interagir avec une broche physique de la Pico depuis MicroPython, on utilise l’objet Pin
pour créer une broche “virtuelle”. Chaque broche physique est représentée par une variable. Pour modifier son état, vous devrez utiliser une fonction du type mon_pin.une_fonction()
sur la broche virtuelle MicroPython.
Pour débuter votre script Python, pensez à importer le sous-module Pin
:
from machine import Pin
Configuration des pins en entrée ou en sortie avec MicroPython
C’est au moment de la création d’un objet Pin
** que s’effectue la configuration d’une broche soit en entrée ou soit en sortie. Si on veut configurer une broche en sortie, on crée un objet Pin
en précisant le numéro de la broche et son mode en sortie** Pin.OUT
:
pin_led = Pin(16, mode=Pin.OUT)
Et si on le souhaite, on peut même forcer une tension en sortie au moment de la création de la broche.
pin_led = Pin(16, mode=Pin.OUT, value=1) # 3.3V en sortie -> la led sera allumée
pin_led = Pin(16, mode=Pin.OUT, value=0) # 0V en sortie -> la led sera eteinte
Par défaut, à la création d’un objet Pin
, le niveau de tension en sortie est défini sur 0V (value=0
). Pour définir une broche en mode entrée, il suffit de modifier l’option mode
à Pin.IN
lors de sa création.
pin_24 = Pin(14, mode=Pin.IN)
Il est possible de spécifier le type d’entrée souhaitée. On peut choisir entre une entrée avec une résistance de pull-up, une résistance de pull-down ou sans résistance de tirage. Si ces termes ne sont pas familiers, je vous invite à consulter` le fonctionnement et l’utilité des résistances de tirage (pullup, pulldown) <https://fr.wikipedia.org/wiki/R%C3%A9sistance_de_tirage>`__ . On utilise l’argument optionnel pull
qui permet de choisir le type de résistance de tirage.
pin_24 = Pin(14, mode=Pin.IN, pull=Pin.PULL_DOWN) # Entrée avec une résistance de pulldown
pin_24 = Pin(14, 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 offre plusieurs méthodes pour contrôler la tension de sortie :
Pin.on()
etPin.off()
Pin.high()
etPin.low()
Pin.value(valeur)
Les noms de fonctions sont explicites :
pin_led = Pin(16, 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 correspond le mieux à l’utilisation voulue. Par exemple, .on()|.off()
pour allumer des LEDS ou high()|.low()
pour un cas plus général. La fonction Pin.value()
est utile si vous stockez la valeur dans une variable, par exemple Pin.value(ma_variable)
.
pin_led = Pin(16, 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(16, mode=Pin.OUT, value=1) # 3.3V en sortie
pin_led.toggle() # 0V en sortie
Pour déterminer l’état logique d’une broche, c’est-à-dire s’il est haut (3.3V) ou bas (0V), on peut utiliser la fonction Pin.value()
sans préciser de valeur.
pin_24 = Pin(14, 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é
Mettre en pratique la gestion des pins GPIO peut se faire grâce à un script qui allume la LED intégrée lorsqu’on appuie sur un bouton-poussoir. On peut utiliser deux variantes de ce script : l’une qui utilise une entrée digitale avec une résistance pullup et l’autre avec une résistance pulldown.
Note
Il est généralement recommandé d’utiliser des résistances de tirage en pullup pour les entrées numériques plutôt que des résistances de pull-down.
Avec la résistance pulldown interne de l’entrée numérique
Voici le circuit électrique à faire avec la Pi Pico afin de faire fonctionner le script MicroPython.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_DOWN)
pin_led = Pin(16, 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
Avec une résistance mise en pull-up, le circuit est presque le même. Il faut simplement connecter le bouton à la masse au lieu du 3.3V.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(16, mode=Pin.OUT)
while True:
if not pin_button.value():
pin_led.on()
else:
pin_led.off()
Note
On peut condenser pin_button.value() == 1
par not pin_button.value()
dans la condition du if
.
On peut condenser le code en Python en écrivant une condition if
sur une seule ligne.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(16, mode=Pin.OUT)
while True:
pin_led.on() if not pin_button.value() else pin_led.off()
On peut également améliorer le code en retirant complètement le if
, même si cela entraîne une diminution de la lisibilité.
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(16, mode=Pin.OUT)
while True:
pin_led.value(not pin_button.value())
Note
Ces petites optimisations peuvent être précieuses si l’on cherche à exécuter le code le plus rapidement possible, étant donné que MicroPython est très lent par rapport aux langages C/C++.