Skip to content

Utiliser les timers et les interrupions de la Pi Pico dans un script MicroPython

Définition

On souhaite ici définir une durée avant qu’une interruption se déclenche.

Script squelette minimal

Script minimal

Ce script minimal ci-dessous permet de déclencher l’interruption interruption_handler() à la fin de chaque période du timer.

1
2
3
4
5
6
from machine import Timer

def interruption_handler(timer):
    ...

soft_timer = Timer(mode=Timer.PERIODIC, period=1000, callback=interruption_handler)

Ici la période du timer est fixée à 1000ms soit 1 seconde.

  • Le mode Timer.PERIODIC pour que l’interruption se déclenche chaque fois que la période du timer est atteinte ou Timer.ONE_SHOT pour avoir un seul déclenchement
  • La période du timer voulue en millisecondes ici 1000
  • La routine d’interruption (la fonction) qui sera invoquée via l’interruption déclenchée par le timer, ici interruption_handler.

Application - Clignotement

Objectif

Avec ce script, la LED intégrée de la Pico se met à clignoter toutes les secondes, sans utiliser de boucles.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from machine import Timer, Pin

pin_led = Pin(25, mode=Pin.OUT)

def interruption_handler(timer):
    pin_led.value(not pin_led.value())

soft_timer = Timer(mode=Timer.PERIODIC, period=1000, callback=interruption_handler)

while True:
    None    # Instruction signifiant que rien n'est à exécuter

J’utilise une petite astuce pour inverser l’état de la LED. On récupère l’état actuel de la LED avec pin_led.value(), soit 0 ou 1, on inverse la valeur avec l’opérateur not. On utilise la même fonction pin_led.value() pour actualiser la nouvelle valeur.

Exercice 8.1

Exécuter le programme précédent.

Application - Incrémenter une variable

Objectif

Voici un script Python qui incrémente une variable à chaque interruption du timer.

Dans la boucle principale, lorsque la variable vaut 10, une tâche précise qui peut prendre plusieurs secondes à être exécutée est réalisée.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from machine import Timer, Pin

timer_count = 0

def interruption_handler(pin):
    global timer_count
    timer_count += 1

soft_timer = Timer(mode=Timer.PERIODIC, period=100, callback=interruption_handler)

while True:
    if timer_count > 10:
        timer_count = 0
        print("10x")

Exercice 8.2

Exécuter le programme précédent.