Skip to content

Feux de circulation

Ce que l'on va faire ici

Dans ce programme Micropython, nous allons simuler les feux de circulation sur 3 LEDs et avec un seul timer.

Matériel

  • une carte Pi Pico flashée avec MicroPython et préparée pour utilisation en vertical sur plaque d'essai

  • 1 module "prêt à câbler" à 3 LEDs Rouge, Jaune, Vert

  • +/- une petite plaque d'essai (pas indispensable ici)

  • quelques jumpers

Le schéma théorique

On connecte logiquement 4 broches :

  • celle commune à l'ensemble des LEDs est le - (cathode commune) à connecter à GND (=0V)
  • et une pour chaque LED de couleur à connecter à une broche de la carte en sortie.

Le montage à réaliser

On utilise ici la carte Pi Pico en vertical sur la plaque d'essai.

Ici, on connecte :

  • la LED verte sur la broche 18
  • la LED jaune sur la broche 19
  • la LED rouge sur la broche 20

Le 0V du module est connecté à la broche GND de la carte adjacente à la broche 18.

Info

En utilisant un câble 4 brins, le montage est très propre.

Le code

  • les broches utilisées sont mises en sortie sous forme d'un list
  • un timer appelle la fonction loop() à intervalle régulier
  • une variable sert à compter les passages dans loop() appelée par timer

A chaque passage, les LEDs sont allumées en fonction de la temporisation voulue. Sur une base 100% :

  • la LED verte est allumée 50% du temps
  • puis transition vers jaune pendant 10%
  • et enfin allumer rouge les 40% restant et ainsi de suite.
# code Micropython - www.micropython.fr - CC BY SA
from machine import Pin, Timer # importe les classes Pin et Timer

leds=[Pin(18,Pin.OUT), Pin(19,Pin.OUT), Pin(20,Pin.OUT)]
vert, jaune, rouge=0,1,2 # index des LEDs

timer=Timer() # création objet timer

compt=100 # 100 pour effet premier passage

def loop(timer): # fonction de clignotement

        global compt
        compt=compt+1

        if compt%100==0 : 
            leds[vert].on()
            leds[jaune].off()
            leds[rouge].off()

        if compt%100==50 : 
            leds[vert].off()
            leds[jaune].on()
            leds[rouge].off()

        if compt%100==60 : 
            leds[vert].off()
            leds[jaune].off()
            leds[rouge].on()

# rappel fonction loop à fréquence voulue
timer.init(freq=10, callback=loop) 

Résultat

Les 3 LEDs simulent un feu de circulation !

Comment çà marche ??

Vous pourriez avoir du mal à comprendre ce code de prime abord... mais au final, il s'agit d'une stratégie permettant de réaliser des délais tout en se passant du recours à une boucle while True ou à des pauses...

Le principe ici consiste, pour des raisons de simplification, à envisager la base temps comme étant 100 périodes du timer. Comme on compte le nombre de périodes écoulées (variable compt), il est possible à tout moment de s'adapter au nombre de périodes comptées. Sur une base de 10 Hz, 100 périodes correspondent à 10 secondes.

Si on veut allumer la LED verte au début de chaque base temps de 100 périodes, soit (nx100) périodes, il suffit de faire l'opération compt%100 : le reste sera égal à 0 lorsque le comptage vaudra un multiple de 100. Pour que cela fonctionne dès le premier passage, on initialise le compteur à la valeur 100.

Ensuite, si on veut allumer la LED jaune à 5 secondes, soit ici (nx100)+50 périodes, il faut que l'opération compt%100 soit égale à 50.

De façon identique, si on veut allumer la LED rouge à 6 secondes, soit (nx100)+60 périodes, il faut que l'opération compt%100 soit égale à 60.

Et ainsi de suite. La seule chose qui pourrait être ajoutée ici, c'est une réinitialisation du compteur à la valeur 100 à chaque passage compt%100==0 pour éviter un dépassement de la variable.

Retenez le principe !

Au final, cette stratégie permet de réaliser des opérations utilisant des délais précis SANS BLOQUER l'interpréteur Python ! C'est élégant, et le temps libéré permet d'envisager d'autres tâches concommittantes sans problème, avec d'autres timers.

Noter également, qu'il suffit de simplement modifier la fréquence du timer pour accélérer / ralentir l'exécution, le reste du code restant inchangé.