bouton-interruption.py
El botón cableado a GP15 alterna el LED mediante una interrupción hardware (irq): no se pierde ningún ciclo de CPU escrutando el pin. Un filtro de 50 ms dentro del handler elimina los rebotes mecánicos del contacto.
Hardware
Una placa genérica con microcontrolador RP2040 (doble Cortex-M0+) programada en MicroPython. 1 botón pulsador (una pata a GP15, la otra a GND).
Cableado
Botón entre GP15 y GND; la resistencia de pull-up la activa Pin.PULL_UP en la placa.
Funcionamiento
BTN.irq se dispara con el flanco de bajada (pulsación a masa). El handler compara time.ticks_ms() con el último flanco, ignora rebotes de menos de 50 ms e invierte el estado del LED.
Ejecución
Graba MicroPython vía BOOTSEL (archivo .uf2) y copia el script en la unidad de la placa. Comprueba el pin del LED de usuario de tu placa (a menudo GP25) y adáptalo si hace falta.
Variantes
Cambia el disparo a Pin.IRQ_RISING | Pin.IRQ_FALLING para contar todos los flancos, o apila varios botones con un handler por pin.
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