Dans le but de démontrer l’utilité et le fonctionnement des différents capteurs présents dans la voiture autonome, nous avons décidé de mener la conception d’un robot autonome à capteur ultrasons. Voici premièrement une description généralisée de celui-ci.
1) Description du robot :
C’est un robot autonome, il est donc capable de rouler et d’éviter les objets sur son passage tout seul. Le but de cette expérience et de modéliser sur un modèle réduit les différents principes de la vraie voiture autonome. Dans ce modèle réduit, les technologies de pointe sont remplacés par des composants électroniques comme le capteur ultrason , ou le micro-contrôleur ( cf 2ème sous-partie ) .
2) Description des différents composants :
Les différents composants ( et les images ) que nous avons acheté proviennent du site de e-commerce Bangood .
Composant : Microcontrôleur ( Arduino uno )
Description : Un microcontrôleur est un circuit intégré qui rassemble les éléments d’un ordinateur ( processeur , mémoire morte pour le programme , et vive pour les données )
Fonctionnement : Programmable pour effectuer des taches simples : pilotage d’un robot dans notre cas . C’est une plate-forme basée sur une interface entrée/sortie simple .
Application au robot : Il a pour but de contrôler le robot et de recevoir les informations des capteurs ultrasons .
Composant : Shield moteur
Description : Il permet de piloter deux moteurs à courant direct ( ils sont appelés Dc motors ) à laide de la carte Arduino
Fonctionnement : Le shield moteur est relié au arduino , il transmet les infos reçues directement aux moteurs , servomoteurs
Application au robot : Le shield moteur servira à diriger les moteurs et les servomoteurs .
Composant : Moteur
Description : Objet mécanique qui engendre un mouvement
Fonctionnement : Il sera branché au shield et au arduino et sera alimenté par des piles
Application au robot : Faire tourner les roues en utilisant les informations envoyées par le microcontrôleur .
Composant : Châssis + quatre roues
Description : Palette + 4 roues
Fonctionnement : Mouvement prolongé grâce aux roues
Application au robot : Le châssis accueillera les différents composants cités ci-dessus et les roues accueilleront les 4 moteurs
Composant : capteur ultrason
Description : C’est un capteur équipé de hauts-parleurs
Fonctionnement : Il émet des ultrasons permettant de localiser des obstacles
Application au robot : Permet l’anti-collision du robot
Composant : Cadran digital à 4 chiffres
Description : C’est un cadran capable d’afficher jusqu’à 4 chiffres
Fonctionnement : Il marche avec des Led , il suffit de lui donner une valeur à afficher
Application au robot : Il affichera en temps réel , la distance entre le robot et l’obstacle en centimètres
3) Programmation et Algorithmes :
Le robot de base ne possède aucun programme , aucune « connaissances ». Il faut donc implanter un programme dans le micro-contrôleur Arduino . Pour cela on utilise le logiciel de programmation Arduino où il faut programmer dans le langage C . Notre programme doit accomplir deux but principaux : Détecter les obstacle et faire fonctionner les moteurs selon une certaine logique .
Après plusieurs réflexion et test on obtient l’algorithme suivant :
En langage C , ça donne ça :
Mais pour savoir que la distance et en dessous ou au dessus de 2O cm , il faut programmer le capteur de sorte à ce qu’il puisse calculer cette distance . On note Δt le temps que met l’ultrason à aller et revenir et D la distance obtenue . C'est le principe de l'echolocation .On obtient la fonction suivante :
EDIT : Cette formule est mal écrite, vous le verrez en faisant une analyse dimensionnelle !
En langage C , on obtient :
D ou la distance sera affichée en cm sur le cadran digital à quatre chiffres du robot .
4) Expérimentations et Observations :
Passons maintenant aux tests , le logiciel Arduino nous permet d’afficher un moniteur virtuel , qui nous renseigne sur les différentes données : Le sens des moteurs et la distance D .
Voici un exemple des données présentes dans le moniteur virtuel :
Distance: 0.68mm (0.07cm, 0.00m)
Moteur : 1 sens : 1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 195.16mm (19.52cm, 0.20m)
Moteur : 1 sens : -1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 195.16mm (19.52cm, 0.20m)
Dans ce cas là , le robot ne bougeait pas , on a juste rapproché une feuille du capteur .
Le robot est capable de calculer la distance D à une vitesse donnée , vérifions si il y a une latence entre le moment où la distance est calculée et le moment où le robot s’arrête :
Distance: 302.26mm (30.23cm, 0.30m)
Moteur : 1 sens : -1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 296.99mm (29.70cm, 0.30m)
Moteur : 1 sens : -1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 216.41mm (21.64cm, 0.22m)
Moteur : 1 sens : -1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 143.99mm (14.40cm, 0.14m)
Moteur : 1 sens : 1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 70.55mm (7.06cm, 0.07m)
Moteur : 1 sens : 1 puissance : 100
Moteur : 2 sens : -1 puissance : 100
Distance: 0.00mm (0.00cm, 0.00m)
La distance s’affiche toutes les secondes , donc ici le test dure 6 secondes .
C’est à la 3ème seconde que la distance passe en dessous des 20 cm , l’algorithme commence . Le robot mettra 3 secondes environ pour s’arrêter dans ce cas là .
En faisant plusieurs mesures , on se rend compte que le robot à une latence entre 2 et 3 secondes .
On en déduit que le robot autonome tout comme la la voiture autonome possède des avantages mais aussi des inconvénients comme notamment cette latence .
Conclusion :
Cette modélisation de la voiture autonome à échelle réduite nous aura permis de comprendre les enjeux de la vraie voiture autonome , les problèmes qu’elle peut rencontrer . Par exemple les problèmes de latence du robot montrent que la voiture autonome nécessite un développement sérieux et rigoureux qui doit être capable d’éviter ce genre de problèmes à l’échelle humaine . La " mini " voiture autonome commence même à avoir un certain succès, certains championnats commencent à émerger...
http://www.leparisien.fr/high-tech/qui-deviendra-le-champion-de-france-de-mini-voitures-autonomes-19-11-2018-7946379.php
Le programme entier ( il est aussi dans le carnet de bord ) :
// PARTIE CAPTEUR #programmé par LASSUS, SAN-NICOLAS, BARBIER
const byte TRIGGER_PIN = 2; // Broche TRIGGER
const byte ECHO_PIN = 3; // Broche ECHO
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
const float VITESSE_SON = 340.0 / 1000;
// PARTIE MOTEUR
int pin1Moteur1=12; //pin de commande moteur 1
int pin2Moteur1=8; // pin de comma nde moteur 1
int pinPMoteur1=11;// pin PWM moteur 1
int pin1Moteur2=7; // pin de commande moteur 2
int pin2Moteur2=4; // pin de commande moteur 2
int pinPMoteur2=5; // pin PWM moteur 2
void setup() {
// put your setup code here, to run once:
// PARTIE CAPTEUR#programmé par LASSUS, SAN-NICOLAS, BARBIER
Serial.begin(9600); //initialise la communication série
pinMode(TRIGGER_PIN, OUTPUT);
digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN, INPUT);
// PARTIE MOTEUR
pinMode(pin1Moteur1,OUTPUT);
pinMode(pin2Moteur1,OUTPUT);
pinMode(pinPMoteur1,OUTPUT);
pinMode(pin1Moteur2,OUTPUT);
pinMode(pin2Moteur2,OUTPUT);
pinMode(pinPMoteur2,OUTPUT);
}
void loop() {
// PARTIE CAPTEUR#programmé par LASSUS, SAN-NICOLAS, BARBIER
/* 1. impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
long mesure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
float distance_mm = mesure / 2.0 * VITESSE_SON;
/* Affiche les résultats en mm, cm et m */
Serial.print(F("Distance: "));
Serial.print(distance_mm);
Serial.print(F("mm ("));
Serial.print(distance_mm / 10.0, 2);
Serial.print(F("cm, "));
Serial.print(distance_mm / 1000.0, 2);
Serial.println(F("m)"));
delay(500);
// PARTIE MOTEUR#programmé par LASSUS, SAN-NICOLAS, BARBIER
if ( distance_mm < 200 ) {
actionMoteur(1,1,100);
actionMoteur(2,-1,100);
}
else {
actionMoteur(1,-1,100);
actionMoteur(2,-1,100);
}
}
void actionMoteur(int moteur,int sens,int pourcentage){
int pin1,etat1,pin2,etat2,pinP,puissance; //variable de la fonction
//test numéro du moteur
if (moteur==1){
pin1=pin1Moteur1;
pin2=pin2Moteur1;
pinP=pinPMoteur1;
}
else {
pin1=pin1Moteur2;
pin2=pin2Moteur2;
pinP=pinPMoteur2;
}
//test sens du moteur 1,-1 (sens contrainre) ou tout autre valeur (stoppe le moteur)
if (sens==1){
etat1=1;
etat2=0;
}
else if (sens==-1){
etat1=0;
etat2=1;
}
else {
etat1=0;
etat2=0;
}
puissance=map(pourcentage,0,100,0,255);
analogWrite(pinP,puissance);
digitalWrite(pin1,etat1);
digitalWrite(pin2,etat2);
//affichage sur le moniteur série (facultatif)
Serial.print("Moteur : ");
Serial.print(moteur);
if (sens==-1 || sens==1){
Serial.print(" sens : ");
Serial.print(sens);
}
else {
Serial.print(" ! stop ! ");
}
Serial.print(" puissance : ");
Serial.println(pourcentage);
}
Commentaires
1 Jean Marie Le 14/02/2021