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

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

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

Circuit électrique à réaliser

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

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

Circuit électrique à réaliser

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