Objectif du projet
Créer un portique de chronométrage pour mesurer le temps mis par un robot suiveur de ligne pour parcourir un circuit.
Le portique détecte le passage du robot grâce à des capteurs infrarouges et affiche le temps sur l’écran du microcontrôleur UNIHIKER.
Le robot passe une première fois sous le portique au départ, puis une deuxième fois à l’arrivée.
- Premier passage : démarrage du chronomètre.
- Deuxième passage : arrêt du chronomètre.

Les composants du portique
| Élément | Rôle | Description |
|---|---|---|
| 🧠 Microcontrôleur UNIHIKER | Le cerveau du portique | Il gère les capteurs, mesure le temps et affiche les résultats sur son écran. |
| 👀 Deux capteurs photoréflecteurs IR | Détecter le robot | Placés en vis-à-vis de chaque côté du portique, ils détectent quand le robot passe (interruption du faisceau). |
| 💡 LED verte | Indiquer que le portique est prêt | Allumée : le portique attend le départ du robot. |
| 🔴 LED rouge | Indiquer la mesure en cours | Allumée : le portique mesure le temps du parcours. |
| 📺 Écran intégré à l’UNIHIKER | Affichage du résultat | Montre le message “Prêt”, “Course en cours…” et le temps mesuré. |

Le portique attend le robot (LED verte).
Le robot passe une première fois → démarrage du chrono.
Le robot passe une deuxième fois → arrêt du chrono et affichage.


Programmation de l’interface

Détail des instructions pour l’affichage du temps :



Lance pour vérifier l’affichage
Programmation de la détection des passages
⚙️ Principe de détection du robot par le portique
🔦 1. Comment le portique détecte le passage du robot
Le portique utilise un photoréflecteur infrarouge.
C’est un petit capteur qui envoie de la lumière invisible (infrarouge) et mesure la lumière qu’il reçoit en retour.
- Quand rien ne passe, la lumière rebondit normalement :
👉 le capteur reçoit beaucoup de lumière. - Quand le robot passe devant, il bloque ou réfléchit moins la lumière :
👉 le capteur reçoit moins de lumière.
C’est ce changement de niveau de lumière que le portique utilise pour savoir qu’un robot vient de passer.

🧠 2. La variable mesure_en_cours
Pour que le portique sache s’il doit démarrer ou arrêter le chronomètre, on utilise une variable mémoire qu’on appelle ici :
Cette variable peut prendre deux valeurs :
| Valeur | Signification | État du portique |
|---|---|---|
0 | Attente du robot au départ | Portique prêt, LED verte allumée |
1 | Chronométrage en cours | LED rouge allumée, le portique mesure le temps |
⏱️ 3. Les deux passages du robot
🟢 Premier passage : le départ
- Le portique attend (
mesure_en_cours = 0). - Le robot passe → le capteur détecte un changement de lumière.
- Le portique :
- allume la LED rouge,
- met
mesure_en_cours = 1, - attente que le véhicule passe.

🔴 Deuxième passage : l’arrivée
- Le robot repasse sous le portique.
- Le capteur détecte à nouveau un changement de lumière.
- Le portique :
- rallume la LED verte,
- remet
mesure_en_cours = 0(prêt pour une nouvelle mesure), - attente que le véhicule passe.

Le programme avec la détection et le comptage des passages :


Lance pour vérifier
Programmation du chronomètre
🟢 Premier passage : le départ
- démarre le chronomètre,

⏱️ Affichage du temps
- affiche le temps sur l’écran,


Lance pour vérifier
Programmation en python
Bibliothèques conseillées
import time
import math
from unihiker import GUI
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
Objets à instancier
# Interfaces
u_gui=GUI()
# Micro contrôleur
Board().begin()
# Photo réflecteur IR sur le port P1
p_p1_analog=Pin(Pin.P1, Pin.ANALOG)
# LED rouge
p_p14_out=Pin(Pin.P14, Pin.OUT)
# LED verte
p_p15_out=Pin(Pin.P15, Pin.OUT)
# Lecture du photo réflecteur IR
lumiere = p_p1_analog.read_analog()
# Gestion des LEDs
p_p14_out.write_digital(0)
p_p15_out.write_digital(1)
# Affichage du chronomètre
mm = 0
ss = 0
chrono=u_gui.draw_clock(
h=mm,m=0,s=ss,
x=120,y=200,r=50,
color= »#0000FF »)
text_chrono = u_gui.draw_text(
text= »Temps= »+
str(mm).zfill(2)+ »: »+str(ss).zfill(2),
x=20,y=260,
font_size=20, color= »#0000FF »)
# Affichage d’un texte
u_gui.draw_text(
text= »texte à afficher »,
x=40,y=25,
font_size=20, color= »#0000FF »)
# Dessin d’une surface rectangle
u_gui.fill_rect(x=5,y=5,w=230,h=90,color= »#CCFFFF »)
# Dessin d’un pourtour d’un rectangle
u_gui.draw_rect(x=0,y=0,w=240,h=100,width=10,color= »#FF0000″)
# Gestion du temps (pour le chrono)
# Récupération du temps
start = time.time()
# Calcul d’une durée en minutes et secondes
duree = int(time.time() – start)
mm = int(duree / 60)
ss = int(duree – (mm * 60))
# Exemple pour l’affichage du temps
chrono.config(h=mm,m=0,s=ss)
text_chrono.config(text= »Temps= »+str(mm).zfill(2)+ »: »+str(ss).zfill(2))
