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.
👋🏻