EDSNBlog → Et si vous regardiez autrement les feux de circulation?

Et si vous regardiez autrement les feux de circulation?

4 avril 2025

Ils font partie de notre quotidien. Cependant, je pense que vous n'y avez jamais vraiment réfléchi. Je me trompe? Pourtant, derrière ces trois lumières qui s'alternent "bêtement", se cache une technologie bien plus complexe qu'un simple coup d'œil pourrait nous le suggérer. Certains algorithmes très élaborés sont même en jeu.

Illustration présentant un feu rouge

Populairement appelés “feux rouges”, les feux de circulation sont contrôlés par un microcontrôleur ou un automate programmable. Ces appareils sont programmés pour définir la durée du rouge, de l’orange et du vert selon un cycle fixe (avec une durée prédéfinie) ou de manière dynamique (en fonction de capteurs et d’autres paramètres).

Si nous devions programmer un feu rouge simple en Python avec un cycle fixe, cela pourrait donner :

import time

def feu_tricolore():
    while True:
        print("🔴")
        time.sleep(30) #Reste rouge 30 secondes
        print("🟠")
        time.sleep(5) #Reste orange 5 secondes
        print("🟢")
        time.sleep(40) #Reste vert 40 secondes

feu_tricolore()

Ce programme simule un feu tricolore basique, avec un cycle fixe. Sur une carte Arduino programmable, cela donnerait plutôt quelque chose comme :

void setup(){
    pinMode(0,OUTPUT);
    pinMode(1,OUTPUT);
    pinMode(2,OUTPUT);
}

void loop(){
    digitalWrite(0,HIGH); // 🔴
    digitalWrite(1,LOW); //  ⚫️
    digitalWrite(2,LOW); //  ⚫️
    delay(30000); //Reste rouge 30 secondes
    digitalWrite(0,LOW); //  ⚫️
    digitalWrite(1,HIGH); // 🟠
    digitalWrite(2,LOW); //  ⚫️
    delay(5000); //Reste orange 5 secondes
    digitalWrite(0,LOW); //  ⚫️
    digitalWrite(1,LOW); //  ⚫️
    digitalWrite(2,HIGH); // 🟢
    delay(40000); //Reste vert 40 secondes
}

Pour un cycle fixe, une horloge interne contrôle donc la durée des phases, comme illustré ci-dessus. Mais pour des feux adaptatifs, le système peut ajuster ses durées en fonction de plusieurs paramètres. Par exemple, détecter la présence d’un véhicule ou la demande d’un piéton pour traverser (grâce à un bouton). Si un trafic important est repéré, le feu vert peut même durer plus longtemps afin de laisser davantage de véhicules passer. Ok. Alors voyons ce que cela pourrait donner en Python :

import time
import random  # Simuler la détection de véhicules et bouton piéton

attente_pieton = False  # Bouton piéton non pressé

def feu_tricolore():
    global attente_pieton
    while True:
        # Simuler la détection de véhicules et bouton piéton une fois sur 2. 
        vehicule_detecte = random.choice([True, True, False]) # Simule détection 2 fois sur 3
        bouton_appuye = random.choice([True, False, False]) # Simule demande piètonne 1 fois sur 3

        # Phase ROUGE voitures
        print("🔴 (voitures à l'arrêt)")
        time.sleep(2)

        if bouton_appuye:
            print("🔘 Bouton piéton pressé - Piétons attendez")
            attente_pieton = True  # Mémoriser la demande du piéton

        # Déterminer la durée du feu rouge selon le trafic et la demande piétonne
        if vehicule_detecte:
            # Si des véhicules sont détectés, réduire la durée du rouge et prolonger le vert
            print("🔴 (véhicules détectés, feu rouge court)")
            time.sleep(5)
        elif attente_pieton:
            # Si un piéton a appuyé sur le bouton, raccourcir le vert pour laisser passer les piétons rapidement
            print("🔴 (piéton en attente, feu rouge raccourci)")
            time.sleep(5)
        else:
            # Si aucun trafic ni piéton, allonger le rouge pour permettre à l'autre route de circuler
            print("🔴 (aucun trafic, feu rouge long)")
            time.sleep(10)

        # Phase ORANGE voitures
        print("🟠 (preparation au vert pour les voitures)")
        time.sleep(3)

        # Phase VERT voitures
        print("🟢 (voitures peuvent passer)")
        if vehicule_detecte and not attente_pieton:
            # Si un trafic est détecté et qu'aucun piéton ne demande à traverser, prolonger le vert pour les voitures
            print("🚗🚗🚗 Trafic détecté, prolongation du feu vert pour laisser passer plus de véhicules")
            time.sleep(15)
        elif attente_pieton:
            # Si un piéton attend, raccourcir le vert pour laisser passer rapidement les piétons
            print("✋🚶Piéton en attente, raccourcir le vert pour passer au rouge pour les voitures")
            time.sleep(5)
        else:
            # Si aucun trafic ni piéton, laisser le vert pour une durée normale
            print("🟢 (pas de trafic, vert normal)")
            time.sleep(10)

        # Phase piéton uniquement si le bouton a été pressé
        if attente_pieton:
            print("🔴 (voitures arrêtées)")
            print("🟩🚶️ (piétons autorisés à traverser)")
            time.sleep(10)

            # Clignotement d’avertissement pour piétons
            for i in range(3):
                print("🟧🚶️ (piétons - bientôt rouge)")
                time.sleep(0.5)

            print("🟥🚶️ (piétons STOP)")

            attente_pieton = False  # Réinitialiser la demande de traverser

feu_tricolore()

Vous pouvez copier-coller ce code dans le site web de l’ETHZ (webtigerpython.ethz.ch) et cliquer sur le “Play” pour voir le code en action!

Dans des systèmes encore plus avancés, les feux de circulation peuvent même être reliés à un centre de contrôle du trafic via un réseau. Comme votre téléphone qui se connecte à internet, ces feux transmettent et reçoivent des données pour adapter la signalisation en temps réel, selon l’état du trafic global. Ici, L’IA aura un grand rôle à jouer, tout particulièrement avec l’arrivée des véhicules autonomes qui pourront eux-mêmes transmettre des informations en temps réel.

Alors, la prochaine fois que vous attendrez à un feu rouge, rappelez-vous le code qui le pilote ! 🚦😃

Et si vous me le demandez gentiment en commentaire, je pourrais même vous produire un code pour contrôler un feu de circulation connecté, à l’aide d’un serveur local qui se chargera de les cadencer.

Ah oui. J’allais oublier. Le code est tiré d’un de mes cours d’initiation à la programmation.

👋🏻


ProgrammationCours de programmationPythonArduinoFeux de circulationFeux tricoloresFeux rougesAlgorithmesTechnologieMicrocontrôleurAutomate programmablePython