bouton-interruption.py

Raspberry Pi Pico · Fichier : bouton-interruption.py · Langage : Python · Usage : Basculer une LED sur appui bouton avec interruption matérielle

Le bouton câblé sur GP15 bascule la LED grâce à une interruption matérielle (irq) : aucun cycle processeur perdu à scruter la broche. Un filtre de 50 ms dans le handler élimine les rebonds mécaniques du contact.

Matériel requis

Une Raspberry Pi Pico (RP2040 double Cortex-M0+ @ 133 MHz) avec MicroPython installé, alimentée par USB. 1 bouton poussoir (une patte sur GP15, autre patte sur GND).

Câblage

Bouton entre GP15 et GND ; la résistance de tirage est activée par Pin.PULL_UP côté carte.

Fonctionnement

BTN.irq déclenche sur front descendant (appui vers GND). Le handler compare time.ticks_ms() au dernier front et ignore les rebonds de moins de 50 ms, puis inverse l'état de la LED.

Exécution

Installer MicroPython si besoin (maintenir BOOTSEL, brancher l'USB, déposer le fichier .uf2), puis copier le script sur le lecteur de la carte ou via Thonny. Le script démarre seul s'il s'appelle main.py.

Variantes

Passez la gâchette à Pin.IRQ_RISING | Pin.IRQ_FALLING pour compter tous les fronts, ou empilez plusieurs boutons avec un handler par broche.

bouton-interruption.py

# Bascule LED sur appui bouton : interruption materielle + anti-rebond.
from machine import Pin
import time

BTN = Pin(15, Pin.IN, Pin.PULL_UP)  # bouton vers GND
LED = Pin(25, Pin.OUT)

etat_led = [0]           # liste mutable : modifiable dans le handler
dernier = [0]            # horodatage du dernier front valide

def sur_appui(pin):
    maintenant = time.ticks_ms()
    # Anti-rebond : on ignore les fronts de moins de 50 ms apres le dernier.
    if time.ticks_diff(maintenant, dernier[0]) < 50:
        return
    dernier[0] = maintenant
    etat_led[0] = 1 - etat_led[0]
    LED.value(etat_led[0])
    print("Appui -> LED", "ON" if etat_led[0] else "OFF")

BTN.irq(trigger=Pin.IRQ_FALLING, handler=sur_appui)
print("Pret : appuyez sur le bouton (GP15)")

while True:
    time.sleep_ms(100)   # le handler s'execute en interruption

← Retour à la fiche