Construire un robot éviteur d'obstacles : capter, balayer
Un robot qui se déplace seul — détectant les obstacles, cherchant les ouvertures et tournant vers l'espace libre — fait de pièces comprises et réglées d'abord en simulation.
Un robot éviteur d’obstacles est la suite naturelle après un suiveur de ligne. Un suiveur suit — il suit une ligne que quelqu’un a tracée pour lui. Ce robot décide : sans piste ni carte, il capte l’espace autour de lui et choisit où aller. Cette unique différence — réagir au monde au lieu de le suivre — est le premier vrai goût de l’autonomie, et elle reste assez simple pour être entièrement comprise.
Le cœur est une boucle courte et répétée : capter-balayer-décider-tourner. Le capteur à ultrasons HC-SR04 émet vers l’avant et chronomètre l’écho pour estimer la distance ; quand quelque chose est plus proche qu’un seuil de sécurité, le robot s’arrête, balaye le capteur à gauche et à droite sur un servomoteur SG90, et tourne vers le cap le plus ouvert. Ce seuil n’est pas arbitraire — c’est une distance de sécurité construite depuis la vitesse courante, la latence perception-décision-action, la distance de freinage (qui croît avec le carré de la vitesse), le rayon du robot et une marge, tous visibles comme la courbe de distance d’arrêt dans le simulateur.
Vous ajoutez les composants dont un robot mobile a besoin et apprenez ce que chacun fait : un Arduino Uno pour une logique 5 V indulgente, le capteur à ultrasons et sa zone aveugle (la portée minimale sous laquelle il ne peut pas mesurer), le servomoteur qui donne au faisceau un second point de vue, le pont en H L298N qui commute le courant moteur que les broches logiques ne peuvent pas fournir, deux motoréducteurs TT où le réducteur échange la vitesse contre du couple utilisable, un châssis 2 roues motrices avec roulette pour la direction différentielle, et un pack batterie qui doit alimenter moteur et logique sur des rails séparés. L’arbre technologique vous fait aussi traverser deux parcours d’apprentissage — commande moteur et navigation réactive — pour que les mêmes idées de PWM, odométrie et filtrage rencontrées dans le suiveur reviennent ici en contexte de navigation.
Puis — avant de dépenser quoi que ce soit ou de risquer un mauvais branchement — réglez le comportement d’évitement dans le simulateur en navigateur jusqu’à naviguer proprement dans un espace encombré. L’espace de travail y est vu de dessus et bidimensionnel avec des rayons instantanés et sans bruit ; un vrai faisceau ultrasonore s’ouvre d’environ 15°, est bloqué par le corps même du robot, et est perturbé par les surfaces molles ou inclinées, donc vous filtrerez les lectures et ajouterez un filtre médian et un court délai de stabilisation après le mouvement du servo avant de faire confiance à une distance sur le matériel. Trouver une distance d’arrêt sûre et une règle de direction libre en simulation supprime l’essentiel des devinettes avant que le robot bouge.
Ensuite seulement vous câblez le vrai robot — trigger et echo à la bonne tension, signal servo vers une broche à capacité PWM, PWM et direction moteur vers le pilote, batterie moteur vers la broche VM du pilote seul, toutes les masses reliées — et le laissez errer sur un sol avec cartons ou chaises. Les mêmes leçons de perception et de filtrage mènent directement au labyrinthe à murs Micromouse si vous voulez ensuite la cartographie, ou à la navigation ROS 2 si vous ajoutez un Raspberry Pi.
Suivez l’arbre technologique ci-dessous de haut en bas. Chaque nœud s’ouvre une fois ses prérequis terminés, et votre progression est enregistrée sur cet appareil, pour construire le robot sur un week-end sans perdre votre place.
Nomenclature
| Pièce | Qté | Coût approx. | Notes |
|---|---|---|---|
| Arduino Uno | 1 | $5–8 | La logique 5 V aide vraiment ici — l’echo du HC-SR04 est en 5 V |
| HC-SR04 | 1 | $2 | Un VL53L0X est un bon second capteur, pas un remplaçant |
| Servomoteur SG90 | 1 | $2 | Pour la tête de balayage. MG90S s’il tournera des heures |
| L298N | 1 | $2–4 | Ou un TB6612FNG, qui gaspille bien moins de batterie |
| Motoréducteur TT | 2 | $4 | |
| Châssis 2 roues motrices | 1 | $6–10 | |
| Pack batterie | 1 | $6 | 6×AA NiMH ou 2×18650 |
| Microrupteurs | 2 | $1 | Ajoutez-les. Voir ci-dessous |
Total : environ $30–40.
Les deux microrupteurs sont les quarante centimes les mieux dépensés du robot, et c’est la pièce que la plupart des montages omettent. Chaque capteur de distance a des surfaces qu’il ne voit pas — un sonar est aveugle aux rideaux et aux murs abordés en angle raide — et un robot sans perception de contact poussera un rideau jusqu’à ce que quelque chose cède. Deux interrupteurs derrière un pare-chocs enveloppant transforment « évite généralement » en « ne reste jamais coincé contre ce qu’il ne voyait pas ».
Comment tout se relie
| De | Vers | Note |
|---|---|---|
HC-SR04 VCC, GND |
5 V, GND | ~15 mA, en pointe pendant un ping |
HC-SR04 Trig |
D9 | Broche numérique quelconque |
HC-SR04 Echo |
D10 | Sortie 5 V — OK sur Uno, exige un pont sur une carte 3,3 V |
| Signal servo | D6 | La bibliothèque Servo utilise le Timer 1, qui pilote aussi le PWM D9/D10 |
| Alim servo | 5 V séparé, masse commune | 650 mA calé — pas la broche 5 V de l’Arduino |
Pilote ENA, ENB |
D5, D3 | Broches à capacité PWM. Retirez les cavaliers d’enable du L298N |
Pilote IN1–IN4 |
D8, D7, D4, D2 | |
| Microrupteurs | D11, D12, INPUT_PULLUP |
COM à la masse, NO vers la broche |
Batterie + |
Pilote VM / +12V |
Jamais l’Arduino |
| Toutes les masses | Un point | Arduino, pilote, alim servo, négatif batterie |
Attention au conflit de timer : la bibliothèque Servo prend le Timer 1, qui sur un Uno pilote le PWM des broches 9 et 10. Mettez le PWM moteur sur 3, 5, 6 ou 11 et le servo sur n’importe quelle broche, et le problème n’arrive jamais. Mettez un enable moteur sur la broche 9 et son contrôle de vitesse cessera silencieusement de marcher dès que vous attachez un servo.
La distance d’arrêt, calculée plutôt que devinée
Le seuil d’arrêt est le nombre le plus important de ce projet, et il n’est pas arbitraire. C’est la somme de quatre distances :
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Terme | D’où il vient | Typique |
|---|---|---|
| Latence de perception et décision | Ping (jusqu’à 25 ms), stabilisation servo, période de boucle | 60–100 ms |
| Distance de freinage | Vitesse au carré sur deux fois la décélération | Croît vite |
| Rayon du robot | Avant du châssis au centre de pivot | 80–100 mm |
| Marge | Parce que le cône capteur fait 15° de large et ment sur les choses molles | 50 mm |
En pratique, pour un robot à 0,3 m/s avec 80 ms de latence et 1,0 m/s² de freinage :
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Soit environ 21 cm. Doublez maintenant la vitesse à 0,6 m/s :
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
Le seuil n’a pas doublé — il a crû de 76 %, car le terme de freinage va avec le carré de la vitesse. C’est pourquoi un robot qui évite fiablement au pas commence à percuter quand on l’accélère, et pourquoi le correctif est un seuil dépendant de la vitesse plutôt qu’un grand nombre fixe qui rend le robot timide partout.
Construisez par étapes
| N° | Étape | Le test | Un succès ressemble à |
|---|---|---|---|
| 1 | Les moteurs entraînent | Avant, arrière, pivot des deux sens sur cales | Les six états marchent ; vous connaissez la zone morte de chaque roue |
| 2 | La distance se lit | Pointez un mur à 30 cm et affichez pendant une minute | Stable à un ou deux centimètres, sans zéros |
| 3 | Le timeout marche | Visez le vide et le plafond | La boucle garde sa cadence — pas d’écho ne doit pas geler le robot |
| 4 | Filtre médian | Agitez la main dans le faisceau | Les lectures isolées folles disparaissent ; l’approche réelle passe toujours |
| 5 | Le servo balaye | Commandez −60°, 0°, +60° et affichez la distance à chacun | Balayage répétable, avec un délai de stabilisation avant chaque ping |
| 6 | Délai prouvé | Retirez délibérément le délai | Les lectures bavent sur les angles — vous connaissez maintenant cette panne |
| 7 | Seuil d’arrêt | Roulez vers un mur et laissez-le s’arrêter | Il s’arrête avec votre marge calculée, pas par chance |
| 8 | Décision de virage | Placez-le face à un coin avec un côté ouvert | Il tourne vers le côté ouvert, pas au hasard |
| 9 | Hystérésis | Garez-le au seuil | Il s’engage au lieu de bégayer |
| 10 | Reprise contact | Foncer vers un coussin | Le sonar le rate, l’interrupteur le rattrape, le robot recule et tourne |
| 11 | Erre libre | Cinq minutes dans une pièce encombrée | Il survit ; quand il se coince vous pouvez nommer l’état |
L’étape 10 sépare une démo d’un robot. Un coussin absorbe entièrement l’impulsion ultrasonore, donc le capteur signale un espace ouvert et le robot fonce dedans à pleine vitesse. Sans microrupteur il pousse ensuite jusqu’au calage des moteurs.
Dépannage
| Symptôme | Cause probable | Correctif |
|---|---|---|
| Le robot gèle à intervalles aléatoires | pulseIn sans timeout |
Passez un timeout 25000 µs ; traitez « pas d’écho » explicitement |
| Arrêts d’urgence dans une pièce vide | Un timeout traité comme 0 cm | Un timeout signifie loin, pas près. Renvoyez une sentinelle |
| Fonce dans rideaux et coussins | Son absorbé — physique, pas bug | Ajoutez des microrupteurs |
| Fonce dans les murs en angle | Ping réfléchi loin du récepteur | Même correctif ; balayez aussi plus d’angles |
| Tourne avec assurance dans un mur | Lecture avant stabilisation du servo | Ajoutez 100–200 ms après la commande d’angle, avant de sonder |
| Bégaye aux obstacles | Un seuil, sans hystérésis | Arrêtez à 20 cm, ne repartez qu’à 30 cm |
| Servo qui tremble, carte qui redémarre | Courant servo dans l’Arduino | Alimentation 5 V séparée pour le servo, masse commune |
| Le contrôle de vitesse moteur a cessé | Bibliothèque Servo sur Timer 1 (broches 9, 10) |
Déplacez le PWM moteur vers 3, 5, 6 ou 11 |
| Coincé dans un coin pour toujours | Pas de mémoire — inhérent à la navigation réactive | Ajoutez une composante aléatoire et une évasion anti-blocage |
| Évite bien lentement, percute vite | Seuil fixe, terme de freinage quadratique | Rendez le seuil dépendant de la vitesse |
| Lectures folles quand deux robots tournent ensemble | Ils entendent les clics de l’autre | Décalez les timings de ping |
Pour aller plus loin
Ajoutez le suivi de mur. Un robot qui tient une distance fixe d’un mur sur un côté traverse une pièce de façon déterministe plutôt que d’errer, et c’est le premier comportement qui commence à ressembler à un plan. C’est un petit changement de code et un grand changement conceptuel.
Ajoutez un second type de capteur. Un VL53L0X échoue sur presque exactement les surfaces opposées au sonar — mat sombre et miroirs, contre mou et incliné. Ensemble ils couvrent bien plus de la pièce que chacun seul.
Acceptez le plafond et passez à la suite. Un robot réactif ne peut être envoyé nulle part, ne peut pas promettre qu’il a couvert le sol, et peut boucler indéfiniment dans une pièce en fer à cheval. Ce sont des propriétés de l’absence de carte, pas des bugs. Quand elles commencent à compter, la Micromouse ajoute cartographie et planification, et le robot de couverture attaque directement la question « suis-je passé partout ? ».
Parcours du projet
Le parcours de construction
Suivez l'arbre technologique, des pièces jusqu'à un robot qui fonctionne. Chaque nœud se débloque quand ses prérequis sont terminés, et votre progression est enregistrée sur cet appareil.
0 / 18 terminés
Composants
- ContrôleurArduino UnoLa carte 8 bits indulgente par laquelle la plupart découvrent la robotique.
- CapteurHC-SR04 Ultrasonic SensorUn ping sonar dans un boîtier à deux dollars — comment un robot tâte les obstacles.
- ActionneurSG90 Servo MotorLe servo neuf grammes derrière la plupart des bras, pinces et directions de robots.
- PiloteL298N Motor DriverLe double pont en H qui convertit de faibles broches logiques en puissance moteur.
- ActionneurDC Gearmotor (TT Motor)Le moteur à boîte jaune qui transforme un châssis nu en voiture robot mobile.
- Châssis2WD Robot ChassisLe plateau sur lequel se fixent deux moteurs, une roulette libre et votre électronique.
- AlimentationRobot Battery & Power PackLa différence entre un robot qui roule et un qui redémarre sans cesse.
Tutoriels de ce parcours
- Débutant · 22 min de lectureL'algorithme d'évitement : détecter, balayer, tournerLa boucle détecter–balayer–décider–tourner qui laisse un robot éviter les obstacles seul.
- Débutant · 20 min de lectureLire un capteur ultrasons HC-SR04 : une distance fiable en codeTransformez ping-et-écho en distance stable en cm — avec un délai maximal et un filtre médian.
- Débutant · 18 min de lectureBalayer un capteur ultrasons au servo pour trouver l'espace libreBalayez un HC-SR04 sur un servo pour trouver la direction la plus dégagée avant de tourner.
- Débutant · 18 min de lectureCommander des moteurs CC avec PWM et pont en HCâblez et commandez un moteur CC à balais en sécurité avec PWM, un pont en H et des limites de courant réalistes.
- Intermédiaire · 20 min de lectureOdométrie différentielle depuis les encodeurs de rouesIntégrez le mouvement des roues gauche et droite en pose d'un robot mobile, puis identifiez et étalonnez la dérive.
Entraînez-vous avant de câbler
Réglez-le dans le simulateur interactif
Le parcours de construction passe par un labo dans le navigateur. Obtenez ici le bon comportement, puis reportez vos réglages sur le vrai robot.
Questions fréquentes
Comment fonctionne un robot éviteur d'obstacles ?
Il roule en avant pendant qu'un capteur à ultrasons surveille la distance devant. Quand quelque chose est plus proche qu'un seuil, le robot s'arrête, balaye le capteur à gauche et à droite sur un servomoteur pour mesurer la distance dans chaque direction, et tourne vers le côté le plus ouvert — puis repart. Le tout est une courte boucle capter-balayer-décider-tourner exécutée plusieurs fois par seconde.
Quel capteur convient le mieux à un robot éviteur d'obstacles ?
Le capteur à ultrasons HC-SR04 est le défaut : bon marché, facile à câbler, et fiable jusqu'à quelques mètres. Un capteur temps de vol donne une lecture plus serrée, rapide et précise si besoin, mais pour un premier éviteur l'ultrason est le bon équilibre coût et simplicité.
Faut-il acheter les pièces avant de commencer ce projet ?
Non. La perception et la logique d'évitement tournent dans le simulateur en navigateur, donc vous pouvez comprendre et régler le comportement avant tout achat. Seules les étapes finales — câblage et assemblage — exigent le vrai Arduino, le HC-SR04, le servomoteur, le pilote, les moteurs, le châssis et la batterie.
Pourquoi mon robot éviteur d'obstacles ne marche-t-il pas ?
Les trois coupables habituels sont une lecture ultrasonore bruitée ou bloquée (ajoutez un filtre médian et gardez le capteur dégagé), une lecture avant que le servomoteur ait fini de bouger (ajoutez un court délai de stabilisation), et l'alimentation des moteurs directement depuis l'Arduino au lieu du pilote (ce qui fait une microcoupure et redémarre la carte).
En quoi est-ce différent d'un suiveur de ligne ?
Un suiveur de ligne suit une piste tracée pour lui ; un robot éviteur d'obstacles n'a pas de piste et doit décider où aller. Il ajoute un capteur de balayage et une vraie boucle de décision, ce qui en fait le second robot naturel à construire après un suiveur de ligne.