Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
wiki:projets:robot_eviteur_d_obstacles [2018/01/26 08:39] maxime_farin [ROBOT EVITEUR D'OBSTACLES] |
wiki:projets:robot_eviteur_d_obstacles [2020/10/05 14:37] (Version actuelle) |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Porteur(s) du projet: Maxime Farin (contact : [[maxime.farin1@gmail.com|maxime.farin1@gmail.com]])\\ | Porteur(s) du projet: Maxime Farin (contact : [[maxime.farin1@gmail.com|maxime.farin1@gmail.com]])\\ | ||
+ | |||
+ | {{ : | ||
L' | L' | ||
Ligne 34: | Ligne 36: | ||
- des LEGO Technic ou du carton rigide pour construire le chassis du robot. | - des LEGO Technic ou du carton rigide pour construire le chassis du robot. | ||
+ | |||
+ | |||
+ | - Une imprimante 3D pour imprimer des pièces qui permettront d' | ||
+ | Le fichier que nous allons imprimer est disponible sur [[https:// | ||
===== Construction ===== | ===== Construction ===== | ||
Ligne 45: | Ligne 51: | ||
{{ : | {{ : | ||
+ | |||
+ | < | ||
<fs x-large> | <fs x-large> | ||
Ligne 51: | Ligne 59: | ||
<code =Arduino> | <code =Arduino> | ||
/* | /* | ||
- | * Code d' | + | |
- | */ | + | */ |
/* Constantes pour les broches */ | /* Constantes pour les broches */ | ||
Ligne 96: | Ligne 104: | ||
float distance_mm = measure / 2.0 * SOUND_SPEED; | float distance_mm = measure / 2.0 * SOUND_SPEED; | ||
- | if(distance_mm/ | + | if(distance_mm/ |
digitalWrite(LED_PIN, | digitalWrite(LED_PIN, | ||
} | } | ||
Ligne 241: | Ligne 249: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Partie 3 : Instructions pour les moteurs ==== | ||
+ | |||
+ | Maintenant que l'on sait comment lire les données de distance du capteur à ultrasons et comment piloter les moteurs, nous pouvons maintenant combiner les scripts précédents pour donner les instructions aux moteurs du robot. | ||
+ | Il faut aussi modifier le montage pour incorporer le capteur à ultrasons et les moteurs. | ||
+ | |||
+ | <fs x-large> | ||
+ | </fs> | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | - Lorsqu' | ||
+ | |||
+ | |||
+ | < | ||
+ | move(1, 100, 1); //motor 1, full speed, left | ||
+ | move(0, 100, 1); //motor 2, full speed, left | ||
+ | </ | ||
+ | |||
+ | - Lorsque le robot voir un obstacle, on le fait s' | ||
+ | |||
+ | < | ||
+ | move(1, 50, 0); //motor 1, recule | ||
+ | move(0, 50, 0); //motor 2, recule | ||
+ | delay(3000); | ||
+ | </ | ||
+ | |||
+ | |||
+ | Enfin, on fait tourner le robot en faisant tourner ses deux roues dans un sens opposé pendant 1.5s, avant de s' | ||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | randNumber = random(100.0); | ||
+ | if (randNumber < 50.0) { | ||
+ | move(1, 100, 1); //motor 1, tourne à gauche | ||
+ | move(0, 100, 0); //motor 2, tourne | ||
+ | } else { | ||
+ | move(1, 100, 0); //motor 1, tourne à droite | ||
+ | move(0, 100, 1); //motor 2, tourne | ||
+ | } | ||
+ | delay(1500); | ||
+ | stop(); // Stopper les moteurs | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||
+ | Voilà le code complet ci-dessous : | ||
+ | |||
+ | |||
+ | <fs x-large> | ||
+ | </fs> | ||
+ | |||
+ | <code =Arduino> | ||
+ | |||
+ | /* Code pour piloter des moteurs quand le capteur à ultrasons détecte un obstacle */ | ||
+ | /* Robot éviteur d' | ||
+ | |||
+ | //Moteur A connecté entre les pins A01 et A02 du Motor Driver TB6612FNG | ||
+ | //Moteur B connecté entre les pins B01 et B02 du Motor Driver TB6612FNG | ||
+ | |||
+ | int STBY = 10; // standby Pin (si HIGH alors on peut faire tourner les moteurs, si LOW, les moteurs s' | ||
+ | |||
+ | //Motor A | ||
+ | int PWMA = 5; //Pin qui contrôle la vitesse du moteur A (nombre entre 0 et 255 donc on doit le mettre sur un port PWM) | ||
+ | // AIN1 et AIN2 sont les pins de sens de rotation du moteur A | ||
+ | // Le moteur A tourne dans le sens horaire si le pin AIN1 est LOW et le pin AIN2 est HIGH | ||
+ | // Inversement, | ||
+ | // (si les deux sont LOW ou les deux sont HIGH, il ne tourne pas) | ||
+ | int AIN1 = 9; //Sens de rotation | ||
+ | int AIN2 = 8; //Sens | ||
+ | |||
+ | //Motor B | ||
+ | int PWMB = 6; //Pin qui contrôle la vitesse du moteur B | ||
+ | // Pins de sens de rotation du moteur B | ||
+ | int BIN1 = 11; //Sens | ||
+ | int BIN2 = 12; //Sens | ||
+ | |||
+ | /* Constantes pour les broches */ | ||
+ | const byte TRIGGER_PIN = 2; // Broche TRIGGER | ||
+ | const byte ECHO_PIN = 3; // Broche ECHO | ||
+ | const byte LED_PIN = 7; // Broche LED | ||
+ | |||
+ | /* Constantes pour le timeout */ | ||
+ | const unsigned long MEASURE_TIMEOUT = 50000UL; // 25ms = ~8m a 340m/s | ||
+ | |||
+ | /* Vitesse du son dans l'air en mm/ | ||
+ | const float SOUND_SPEED = 340.0 / 1000; | ||
+ | |||
+ | |||
+ | long randNumber; | ||
+ | |||
+ | |||
+ | /** Fonction setup() */ | ||
+ | void setup() { | ||
+ | /* Initialise le port serie */ | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | /* Capteur Ultrasons */ | ||
+ | // Initialise les broches pour le capteur à ultrasons | ||
+ | pinMode(TRIGGER_PIN, | ||
+ | digitalWrite(TRIGGER_PIN, | ||
+ | pinMode(LED_PIN, | ||
+ | digitalWrite(LED_PIN, | ||
+ | pinMode(ECHO_PIN, | ||
+ | |||
+ | /* Moteurs */ | ||
+ | // On définit tous les ports comme sorties pour piloter les moteurs | ||
+ | pinMode(STBY, | ||
+ | // Commandes Moteur A | ||
+ | pinMode(PWMA, | ||
+ | pinMode(AIN1, | ||
+ | pinMode(AIN2, | ||
+ | // Commandes Moteur B | ||
+ | pinMode(PWMB, | ||
+ | pinMode(BIN1, | ||
+ | pinMode(BIN2, | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | move(1, 100, 1); //motor 1, full speed, left | ||
+ | move(0, 100, 1); //motor 2, full speed, left | ||
+ | |||
+ | /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10 microsec sur la broche TRIGGER */ | ||
+ | digitalWrite(TRIGGER_PIN, | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(TRIGGER_PIN, | ||
+ | /* 2. Mesure le temps entre l' | ||
+ | long measure = pulseIn(ECHO_PIN, | ||
+ | /* 3. Calcule la distance à partir du temps mesuré */ | ||
+ | float distance_mm = measure / 2.0 * SOUND_SPEED; | ||
+ | |||
+ | if (distance_mm / 1000 < 0.2) { | ||
+ | digitalWrite(LED_PIN, | ||
+ | stop(); // Stopper les moteurs | ||
+ | delay(2000); | ||
+ | |||
+ | move(1, 50, 0); //motor 1, recule | ||
+ | move(0, 50, 0); //motor 2, recule | ||
+ | delay(3000); | ||
+ | stop(); // Stopper les moteurs | ||
+ | delay(1000); | ||
+ | |||
+ | // On fait tourner le robot dans une direction aléatoire | ||
+ | randNumber = random(100.0); | ||
+ | if (randNumber < 50.0) { | ||
+ | move(1, 100, 1); //motor 1, tourne à gauche | ||
+ | move(0, 100, 0); //motor 2, tourne | ||
+ | } else { | ||
+ | move(1, 100, 0); //motor 1, tourne à droite | ||
+ | move(0, 100, 1); //motor 2, tourne | ||
+ | } | ||
+ | delay(1500); | ||
+ | stop(); // Stopper les moteurs | ||
+ | delay(1000); | ||
+ | |||
+ | digitalWrite(LED_PIN, | ||
+ | } | ||
+ | // // Affiche les résultats en m | ||
+ | // Serial.print(F(" | ||
+ | // Serial.print(distance_mm / 1000.0, 2); | ||
+ | // Serial.println(F(" | ||
+ | |||
+ | |||
+ | /* Délai d' | ||
+ | delay(200); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | void move(int motor, int speed, int direction) { | ||
+ | // Function move(): Move specific motor at speed and direction | ||
+ | // | ||
+ | // Inputs: | ||
+ | // motor: 0 for B and 1 for A | ||
+ | // speed: number between 0 and 255: 0 is off, and 255 is full speed | ||
+ | // direction: 0 clockwise, 1 counter-clockwise | ||
+ | |||
+ | // DEMARRAGE | ||
+ | digitalWrite(STBY, | ||
+ | |||
+ | // SENS DE ROTATION | ||
+ | // Sens Horaire | ||
+ | // Le moteur A tourne dans le sens horaire si le pin AIN1 est LOW et le pin AIN2 est HIGH (si les deux sont LOW ou les deux sont HIGH, il ne tourne pas) | ||
+ | boolean inPin1 = LOW; | ||
+ | boolean inPin2 = HIGH; | ||
+ | // Sens Anti-Horaire | ||
+ | if (direction == 1) { // Si on change la direction dans le sens antihoraire | ||
+ | inPin1 = HIGH; | ||
+ | inPin2 = LOW; | ||
+ | } | ||
+ | |||
+ | // ENVOI DES INSTRUCTIONS DE SENS DE ROTATION ET DE VITESSE AUX MOTEURS | ||
+ | if (motor == 1) { // MOTEUR A | ||
+ | digitalWrite(AIN1, | ||
+ | digitalWrite(AIN2, | ||
+ | analogWrite(PWMA, | ||
+ | } else { // if motor == 0 (MOTEUR B) | ||
+ | digitalWrite(BIN1, | ||
+ | digitalWrite(BIN2, | ||
+ | analogWrite(PWMB, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void stop() { | ||
+ | //Function stop(): Appeler cette fonction dans le programme pour stopper les moteurs | ||
+ | digitalWrite(STBY, | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | La partie programmation est maintenant presque terminée. On peut à l' | ||
+ | |||
+ | Il faut maintenant construire le chassis du robot. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | ==== Partie 4 : Construction du chassis : Premier prototype de robot ! ==== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Il faut ensuite construire un chassis pour porter notre électronique. | ||
+ | |||
+ | Il y a pas de chassis type mais voici quelques astuces pour le construire: | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | - Placer le capteur à ultrasons en hauteur par rapport au sol (au moins 10 cm) sinon le capteur verra le sol comme un obstacle. | ||
+ | |||
+ | - Les deux roues motrices du robot sont situées à l' | ||
+ | |||
+ | - J'ai utilisé des LEGO Technic pour construire le chassis. On peut imprimer des pièces en 3D pour adapter les moteurs aux LEGO; les pièces sont en noir sur la photo (cf le fichier donné dans la section " | ||
+ | |||
+ | - J'ai utilisé [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
===== Journal de bord ===== | ===== Journal de bord ===== | ||
Ligne 253: | Ligne 528: | ||
- Test du driver Dual TB6612FNG pour piloter des moteurs DC avec la carte Arduino | - Test du driver Dual TB6612FNG pour piloter des moteurs DC avec la carte Arduino | ||
+ | |||
+ | <fs large> | ||
+ | </fs> \\ | ||
+ | |||
+ | - Construction du premier prototype du robot | ||
+ | |||
+ | <fs large>19 février 2018: | ||
+ | </fs> \\ | ||
+ | |||
+ | - Mise à jour du wiki | ||