bouton-interruption.py

RP2040 (carte / puce générique) · 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 carte générique à microcontrôleur RP2040 (double Cortex-M0+) programmée en MicroPython. 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

Flasher MicroPython via BOOTSEL (fichier .uf2), puis copier le script sur le lecteur de la carte. Vérifier la broche de la LED utilisateur de votre carte (souvent GP25) et l'adapter si besoin.

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