Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Utiliser les timers de la Pi Pico dans un script MicroPython

(Mis à jour le 23/01/2023)

Dans cet article, nous allons explorer l’utilisation des timers sur la Pi Pico avec du MicroPython.

Le fonctionnement d’un timer sur la Raspberry Pi Pico

Le fonctionnement théorique du timer n’est pas abordé dans cet article afin de le garder le plus clair possible. Si vous êtes débutant et que vous ne connaissez pas le fonctionnement interne d’un timer, je vous invite vivement à lire l’article théorique sur le fonctionnement d’un timer . Cela vous permettra de mieux comprendre comment sélectionner les bonnes valeurs des paramètres pour l’utiliser dans vos scripts Micro Python.

Utiliser un timer en MicroPython sur la RPi Pi Pico

Avec MicroPython, toute la complexité du timer est cachée : on a juste à rentrer la période du timer voulue. C’est-à-dire la durée d’attente du compteur avant qu’une interruption se déclenche. C’est encore plus simple qu’avec du code Arduino 😊.

En fait, avec la version actuelle de MicroPython pour la Pi Pico, on ne peut pas utiliser les timers hardware individuellement . On peut créer une quantité quasi infinie de timers “software” qui sont basés sur un seul timer hardware.

Script squellete minimal

Voici un script Python squelette minimal pour utiliser un timer de la Pico. Il permet de déclencher l’interruption interruption_handler() à la fin de chaque période du timer.

from machine import Timer

def interruption_handler(timer):
    ...

if __name__ == "__main__":
    soft_timer = Timer(mode=Timer.PERIODIC, period=1000, callback=interruption_handler)

Dans notre exemple, la période du timer est fixée à 1000ms soit 1 seconde. Pour utiliser un timer, on doit :

  • Paramétrer le timer lors de son initialisation avec la fonction timer_0.init(mode=, period=, callback=) qui contient les arguments suivants :

    • 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

    • La routine d’interruption (la fonction) qui sera invoquée via l’interruption déclenchée par le timer, ici interruption_handler

Note

Puisque le timer est “logiciel”, il n’est pas nécessaire de préciser le numéro du timer matériel que l’on voudrait utiliser, comme cela pourrait être le cas sur les cartes ESP32.

Avertissement

La période minimale du timer est d’une milliseconde en MicroPython alors qu’avec du code Arduino, on peut facilement descendre à la microseconde. Les performances des timers sont bridées pour que MicroPython puisse suivre la cadence…

Exemple : Incrémenter une variable

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.

from machine import Timer, Pin

timer_count = 0 # global variable

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


if __name__ == "__main__":
    timer_count_old = 0
    soft_timer = Timer(mode=Timer.PERIODIC, period=100, callback=interruption_handler)

    while True:
        if timer_count > 10:
            timer_count = 0
            print("10x")
            # heavy task here