Tout est dans le titre !
Je me suis lancé dans la programmation d’un petit robot détecteur d’obstacles. Pour le moment, il n’est pas très élaboré, mais je ferai évoluer le programme au fur et à mesure de mes idées !
Niveau matériel, je reprend ma base Makeblocks, mais j’ai déposé la carte de contrôle Me Orion pour la remplacer par une carte Arduino Uno. Cela me permet d’utiliser mes shields.
J’ajoute une carte de gestion moteurs Dual_mc_33926, et 1 sonar ultrason connecté sur un shield Grove.
Le seul « défaut » de la carte Dual_mc_33926 est d’être consommatrice de ports, en effet, les ports D4, D7, D8, D9, D10, A0, A1 sont monopolisés.
Sur une carte Arduino Uno, il ne reste donc potentiellement pas beaucoup de place !
Qu’importe, pour le moment, je n’utilise qu’un port digital supplémentaire pour connecter un capteur ultrason.
Le principe de ce premier prototype est simple : lorsque le robot détecte un obstacle, il tourne à droite jusqu’à trouver un champ libre, il continue alors à avancer.
Une petite démo :
Et voici le code :
—————————— Code ————————–
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include « Ultrasonic.h » //lib des telemetres a ultrasons
#include <DualMC33926MotorShield.h>
// Pour le contrôleur moteurs
DualMC33926MotorShield md;
// variables des telemetres
Ultrasonic ultrasonic(2); // sonar gauche sur D2
long distanceMesuree;
int speedM1, speedM2;
void setup() {
// Init du port serie (debug)
Serial.begin(9600);
// init des variables;
distanceMesuree = 0;
// init du contr^leur moteurs
Serial.println(« Dual MC33926 Motor Shield »);
md.init();
}
void stopInFault() {
if (md.getFault()) {
Serial.print(« fault »);
while(1);
}
}
void avance() {
speedM1 = 70;
speedM2 = 70;
md.setM1Speed(speedM1);
md.setM2Speed(speedM2);
}
void recule() {
speedM1 = -70;
speedM2 = -70;
md.setM2Speed(speedM1);
md.setM1Speed(speedM2);
}
void tourneADroite() {
speedM1 = 0;
speedM2 = 70;
md.setM1Speed(speedM1);
md.setM2Speed(speedM2);
}
void tourneAGauche() {
speedM1 = 70;
speedM2 = 0;
md.setM1Speed(speedM1);
md.setM2Speed(speedM2);
}
void stopAvance() {
speedM1 = 0;
speedM2 = 0;
md.setM2Speed(speedM1);
md.setM1Speed(speedM2);
}
void mesureDistance() {
distanceMesuree = ultrasonic.MeasureInCentimeters();
delay(300);
Serial.print(« Distance mesuree : « );
Serial.println(distanceMesuree);
}
void loop() {
mesureDistance();
if (distanceMesuree > 40) {
Serial.println(« Avance »);
avance();
} //end if
if (distanceMesuree <= 40) {
stopAvance();
Serial.println(« stopAvance »);
tourneADroite();
} // end if
} // end loop
—————————– / Code ————————–
J’espère faire évoluer ce prototype rapidement : j’ai dans l’idée de mettre le capteur ultrason sur un servo, afin de pouvoir, en cas de détection d’obstacle, « regarder » à droite et à gauche afin de décider de la direction à suivre…
Comme d’hab, pour les questions, suggestions, c’est ici ou en commentaire…