Comportement du robot:
Le robot utilise constamment une sonde à ultrasons pour détecter la présence d'un obstacle devant lui. Si aucun obstacle n'est détecté à moins de 30 cm devant lui, il continue d'avancer en ligne droite. Si un obstacle est détecté à 30 cm ou moins, il tourne sur lui-même jusqu'à ce que la voie soit libre sur une distance d'au moins 30 cm.
Matériel:
Une base de robot à 2 roues motrices (chaque roue étant actionnée par son propre moteur électrique), un Arduino Uno, une sonde ultrasonore HC-SR04 (pour bien faire il en faudrait plus qu'une, tel que mentionné plus loin dans cet article), un contrôleur de moteur L293D, 6 piles AA rechargeables (NiMh) pour l'alimentation des moteurs et une pile 9 V pour l'alimentation de l'Arduino.
Le circuit:
Le schéma ci-dessous indique comment brancher les moteurs et l'Arduino au L293D. Toutes les masses ("GND") doivent être reliées ensemble: celles du L293D, de l'Arduino et du HC-SR04 ainsi que la borne négative de l'alimentation des moteurs.
GND : Arduino GND
Echo: Arduino 11
Trig: Arduino 12
Vcc: Arduino 5V
Le sketch:
J'aurais certainement obtenu un algorithme plus performant si je m'étais donné la peine de m'inspirer d'un sketch produit par un de mes nombreux prédécesseurs. Je ne suis néanmoins obstiné à rédiger mon propre sketch à partir de zéro, sans me préoccuper de ce que font ceux qui s'y connaissent mieux que moi en robotique. Au départ, il arrivait assez souvent que mon robot modifie sa trajectoire alors qu'aucun obstacle ne se trouvait devant lui: j'ai donc ajouté une seconde mesure à partir du capteur HC-SR04 afin de rejeter ces "faux positifs".
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************************** | |
* | |
* Robot éviteur d'obstacle muni d'un capteur à ultrasons HC-SR04. | |
* | |
* Comportement: Le robot avance en ligne droite, sauf s'il | |
* rencontre un obstacle, auquel cas il tourne sur place jusqu'à | |
* ce qu'il n'y ait plus d'obstacle devant lui. | |
* | |
* http://electroniqueamateur.blogspot.com/2013/09/robot-eviteur-dobstacles-version-10.html | |
* | |
****************************************************************/ | |
#define motorPin1a 3 // Marche avant du premier moteur | |
#define motorPin1b 4 // Marche arrière du premier moteur | |
#define speedPin1 9 // L293D enable pin pour le premier moteur | |
#define motorPin2a 5 // Marche avant du deuxième moteur | |
#define motorPin2b 6 // Marche arrière du deuxième moteur | |
#define speedPin2 10 // L293D enable pin pour le deuxième moteur | |
// capteur à ultrasons: | |
int trigPin = 12; | |
int echoPin = 11; | |
int Mspeed = 0; // a variable to hold the current speed value | |
int seuil = 30; // distance minimale pour laquelle on accepte un obstacle | |
long distance; | |
boolean sensRotation; | |
void look (void){ // évaluation de la distance de l'obstacle | |
long temps; | |
// Nous envoyons un signal haut d'une durée de 10 microsecondes, en sandwich | |
// entre deux signaux bas. Des ultrasons sont émis pendant que le signal est haut | |
digitalWrite(trigPin, HIGH); | |
delayMicroseconds(10); | |
digitalWrite(trigPin, LOW); | |
// Lors de la réception de l'écho, le module HC-SR04 émet | |
// un signal logique haut (5 v) dont la durée est égale au | |
// temps écoulé entre l'émission et la réception de l'ultrason. | |
pinMode(echoPin, INPUT); | |
temps = pulseIn(echoPin, HIGH); | |
distance = temps * 340/(2*10000); | |
} | |
void setup() { | |
// réglage des broches à output | |
pinMode(motorPin1a, OUTPUT); | |
pinMode(motorPin1b, OUTPUT); | |
pinMode(speedPin1, OUTPUT); | |
pinMode(motorPin2a, OUTPUT); | |
pinMode(motorPin2b, OUTPUT); | |
pinMode(speedPin2, OUTPUT); | |
pinMode(echoPin, INPUT); | |
pinMode(trigPin, OUTPUT); | |
digitalWrite(trigPin, LOW); | |
// on choisit aléatoirement le sens de la rotation | |
look (); | |
randomSeed(distance); | |
sensRotation = random(2); | |
} | |
void loop() { | |
Mspeed = 700; // vitesse du moteur 0 à 1023 | |
look(); // y a-t-il un obstacle devant? | |
if (distance > seuil){ | |
// marche avant: | |
analogWrite(speedPin1, Mspeed); | |
digitalWrite(motorPin1a, HIGH); | |
digitalWrite(motorPin1b, LOW); | |
analogWrite(speedPin2, Mspeed); | |
digitalWrite(motorPin2a, HIGH); | |
digitalWrite(motorPin2b, LOW); | |
delay(100); | |
} | |
else { // on a détecté un obstacle | |
// nouvelle vérification pour éviter les faux positifs | |
look(); | |
if (distance <= seuil){ | |
// obstacle confirmé, on tourne sur place | |
analogWrite(speedPin1, Mspeed); | |
digitalWrite(motorPin1a, sensRotation); | |
digitalWrite(motorPin1b, !(sensRotation)); | |
analogWrite(speedPin2, Mspeed); | |
digitalWrite(motorPin2a, !(sensRotation)); | |
digitalWrite(motorPin2b, sensRotation); | |
delay(100); | |
} | |
} | |
} |
Aspects à améliorer dans une future version:
Il faudra ajouter des sondes ultrasonores supplémentaires: le robot détecte bien la présence d'un mur situé droit devant lui, mais son champ de vision est beaucoup plus étroit que sa propre largeur: par conséquent, il s'accroche à des obstacles situés sur les côtés. Grâce à deux capteurs placés côte à côte, le robot pourra aussi faire la différence entre un obstacle situé à gauche ou à droite, et choisir le sens de son virage en conséquence.
Certains obstacles sont difficilement détectées par les sondes ultrasonores (des pattes de chaises, des obstacles très bas, etc.): l'ajout de capteurs différents sera également utile (interrupteur se déclenchant lors d'un contact, capteur à effet Hall pour détecter qu'une roue ne tourne plus, etc.).
Une grande partie du plaisir de construire un robot consiste à améliorer progressivement ses performance; arriver à un essai optimal dès les premières tentatives aurait été un peu décevant, dans le fond...
Yves Pelletier (Twitter: @ElectroAmateur)
Note: la suite de cet article a été publié le 21 avril 2014: Robot éviteur d'obstacles version 2.0 .
Bonjour :)
RépondreSupprimersi on va utiliser un capteur sharp de distance et non un capteur ultrasonic quelle modification faut faire au code ?
Rien a modifié
RépondreSupprimerApplication "Robot éviteur d'obstacles version 1.0 "
RépondreSupprimerBonjour,
Merci pour le partage de votre projet, j'ai réalisé un Kit de pièces imprimées en 3D pour transformer une plaque d’essai en châssis de voiture.
J'ai utilisé votre projet pour mon premier essai, je vous ai donc cité.
http://www.thingiverse.com/thing:2249831
ou
https://www.youmagine.com/alain-ducros/designs
Cordialement
Alain
bonjour je suis en 3eme, pour mon exercice de technologie je dois expliquer les normes d'un robot éviteur.
RépondreSupprimerPourriez vous me répondre dans l'heure s'il vous plait.
Non.
SupprimerTrès cool
RépondreSupprimer