Interruptions

Une possibilité très intéressante fournie par Micropython sur la carte Pi Pico est la possibilité d'utiliser une interruption pour détecter une modification d'une broche. Voici un code d'exemple :

from machine import Pin

bp = Pin(17, Pin.IN, Pin.PULL_UP) # broche en entree pullup actif

bp.irq(
        lambda pin: print("IRQ with flags:", pin.irq().flags()), # fonction inline
        Pin.IRQ_FALLING # mode de déclenchement
       )

Note

Remarquer :

  • que le code est particulièrement "propre", concis : il n'est plus nécessaire de lire la broche à intervalle régulier, son changement d'état étant intercepté au niveau matériel.

  • comment il est possible "d'éclater" sur plusieurs lignes les paramètres d'une fonction contenus entre parenthèses, d'y placer des commentaires. Cela fait penser par exemple à ce qui est possible en Javascript par exemple. Donc, bien que Python soit sensible à l'indentation, il est plutôt tolérant lorsque l'on est au sein de parenthèses.

  • la façon d'utiliser une fonction "inline" avec le mot-clé lambda

Quelques explications :

  • la définition de l'interruption passe par l'appel de la fonction irq() de la broche que l'on configure. Cette fonction reçoit :

    • la fonction de gestion de l'interruption
    • l'évènement déclencheur, définit à l'aide des propriétés IRQ_FALLING (déclenchement sur front descendant) ou IRQ_RISING (déclenchement sur front montant)
  • la fonction lambda inline reçoit l'objet déclencheur de l'interruption, à savoir ici le bp, que l'on appelle pin : cet objet représente la broche déclencheuse.

  • on connaît le statut de l'interruption de déclenchement grâce à la fonction flags de la fonction irq de l'objet pin d'où la forme pin.irq().flags()