Évitement d’obstacle simple
Cette page présente un simple programme d’évitement d’obstacles en langage Python3 pour le robot MR-25 avec l’utilisation d’un seul capteur d’obstacle. Le programme utilise le capteur n°3, c’est le capteur du milieu du robot.
Voici un diagramme d’état pour visualiser la logique du programme d’évitement :

Le programme
Et voici le programme complet d’évitement d’obstacle avec l’utilisation du capteur ToF n°3 :
#!/usr/bin/python
"""
evitement_obstacles.py — Programme d'évitement d'obstacles pour le robot MR-25
Le robot avance en permanence et utilise le capteur frontal (capteur 3)
pour détecter les obstacles. Dès qu'un obstacle est trop proche, il s'arrête,
tourne à droite jusqu'à trouver une voie libre, puis repart.
"""
import MR25
import time
# ─── Paramètres ───────────────────────────────────────────────────────────────
SPEED_FORWARD = 30 # vitesse d'avance (0-100)
SPEED_TURN = 40 # vitesse de rotation (0-100)
SEUIL_OBSTACLE = 50 # distance en mm en dessous de laquelle on évite
DELAI_STOP = 0.2 # pause après stop() avant de tourner (s)
DUREE_ROTATION = 0.6 # durée d'une rotation élémentaire (s)
INTERVALLE_SCAN = 0.05 # période de lecture des capteurs (s)
def voie_libre():
"""Retourne True si le capteur frontal (3) ne détecte pas d'obstacle."""
distance = MR25.proxSensor(3)
if distance is None:
return True # lecture ratée → on suppose la voie libre
return distance > SEUIL_OBSTACLE
def eviter_obstacle():
"""Tourne à droite jusqu'à trouver une voie libre."""
MR25.stop()
time.sleep(DELAI_STOP)
MR25.ledRGB("100") # LED rouge pendant l'évitement
while not voie_libre():
MR25.turnRight(SPEED_TURN)
time.sleep(DUREE_ROTATION)
MR25.stop()
time.sleep(0.1) # courte pause pour stabiliser la lecture
MR25.ledRGB("010") # LED verte : voie libre
def main():
print("MR-25 — évitement d'obstacles (Ctrl+C pour quitter)")
MR25.encoderReset()
MR25.ledRGB("010") # vert au démarrage
try:
while True:
# État AVANCE
MR25.forward(SPEED_FORWARD)
# État DÉTECTION
distance = MR25.proxSensor(3)
if distance is not None and distance < SEUIL_OBSTACLE:
print(f"Obstacle détecté à {distance:.0f} mm — évitement…")
eviter_obstacle()
print("Voie libre — reprise de l'avance.")
time.sleep(INTERVALLE_SCAN)
except KeyboardInterrupt:
MR25.stop()
MR25.ledRGB("000")
print("\nArrêt.")
if __name__ == "__main__":
main()
Evitement d'obstacle avec MR25
Comment fonctionne ce programme ?
La boucle principale alterne en permanence entre deux états :
- Avance est envoyé en continu, le robot avance. Le capteur frontal (n°3, orienté droit devant) est lu toutes les 50 ms.
- Évitement — dès que la distance mesurée passe sous 150 mm, le robot s’arrête, puis tourne à droite par tranches de 600 ms jusqu’à ce que le capteur indique une voie dégagée.
Fin du tuto !
A bientôt.
Nicolas