Robot suiveur de ligne
Objectif : programmer un robot pour lui permettre de suivre une ligne dessinée au sol !
Le robot AlphaBot est équipé un capteur appelé traqueur de ligne. C’est ce capteur qui va servir au guidage du robot …
Le robot est piloté par un microcontrôleur Arduino UNO.
- Mise en œuvre du capteur « Traqueur de ligne » (15′)
- Mise en œuvre des moteurs :
- en ligne droite pour déterminer les sens de rotation (15′)
- pilotage du robot avec deux paramètres : vitesse du centre et « taux » de rotation (équivalent du torseur cinématique)
- Contrôle de la trajectoire par deux méthodes :
- tout ou rien
- asservissement
Le traqueur de ligne
Analyse du capteur et du programme
Consulter l’article sur le traqueur de ligne utilisé sur l’AlphaBot.
Calibration
Téléverser le programme de calibration dans l’Arduino. Réaliser la manipulation de calibration (voir la technique de calibration ). Noter les valeurs affichées dans le moniteur série.
Essais sur la ligne au sol
Configurer (avec les valeurs relevées) puis téléverser le programme de détection de ligne dans l’Arduino. Vérifier que le capteur est correctement calibré en le déplaçant sur la ligne au sol.
Mouvements du robot
Analyse de la technique de pilotage des moteurs
Consulter l’article sur la motorisation de l’AlphaBot.
Contrôle de la vitesse et du sens
MotorRun
pour que le robot se déplace vers l’avant : il faudra utiliser les mêmes par la suite …
Pour que la vitesse évolue au cours du temps, et de manière prédéterminée, il faut fournir au programme la loi d’évolution de la vitesse en fonction du temps.
Cela implique :
- de mesurer le temps écoulé, depuis une origine que l’on peut décaler
- de calculer la valeur de la vitesse en fonction de ce temps
Pour cela, on peut utiliser la structure de programme ci-dessous :
// les variables de temps [ms] unsigned long dt = 100; // pas de temps () unsigned long t = 0; // le temps "courant" unsigned long t0 = 0; // l'instant "initial" void setup() { t0 = millis(); // initialisation de l'origine du temps } void loop() { t = millis() - t0; // mesure du temps écoulé depuis t0 if (t ...) { // phase 1 // on fait des calculs ... } else if (t ...) { // phase 2 // on fait des calculs ... } else { // fin du cycle t0 += t; // début d'une nouvelle phase } delay(dt); }
Contrôle de la direction
Nous souhaitons que le contrôle du mouvement puisse se faire à l’aide de 2 paramètres :
- la vitesse du centre du robot : nombre entier de -255 à 255
- le « taux » de rotation : nombre entier de -100 (rotation à gauche = roue gauche fixe) à 100 (rotation à droite = roue droite fixe)
La vitesse du centre du robot est la vitesse moyenne des centres des roues.
Elle doit rester constante, dans la mesure du possible.
Pour que la vitesse du centre du robot \(v_c\) reste constante, le taux de rotation \(r\) est calculé à l’aide de l’abaque ci dessous :
À partir d’un taux de rotation \(r\) et d’une vitesse souhaitée \(v_c\), on trouve les valeurs des vitesses des deux roues, \(v_g\) et \(v_d\), sur les deux droites passant par les deux points exprimant les taux de rotation extrêmes (roue gauche fixe et roue droite fixe), pour lesquels la vitesse de la roue opposée est égale au double de la vitesse \(v_c\).
Programmation du suivi de ligne
À présent que tout est en place pour :
- mesurer la position relative de la ligne sous le robot
- contrôler la vitesse et la direction du robot
il ne reste plus qu’à écrire le programme de suivi de ligne.
Dans cette partie, et afin d’accélérer la fréquence de calcul, nous allons réduire le pas de temps à 10ms
Approche « tout ou rien »
Dans une première approche, on se propose de guider le robot en appliquant l’algorithme suivant :
Résultat attendu (avec une vitesse de 80) :
On constate que le comportement est un peu instable : le robot fait des rotations rapides et brusques. Parfois même, il quitte la piste !!
Il faut fortement réduire la vitesse.
Asservissement
Afin d’améliorer le comportement du robot, il faut envisager de le doter d’un comportement plus continu, en suivant le schéma bloc ci dessous.
Résultat attendu (avec une vitesse de 100) :