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.

Démarche de l'activité :
  • 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.

 

Donner le nom de la grandeur mesurée par chacun des détecteurs du traqueur ?
×
Donner le nom de la bibliothèque Arduino à utiliser pour utiliser de manière simple ce capteur.
×
Donner le nom du type d’objet (ou classe) à créer en début de programme pour utiliser le traqueur dans un programme Arduino.
×
Donner le nom de la méthode (sorte de fonction) à utiliser pour obtenir la position de la ligne sous le traqueur.
×
Donner le type de la valeur renvoyée par cette fonction.
×

 

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.

 

Donner le nom du signal utilisé pour moduler la tension aux bornes des moteurs ?
×
Donner le nom de la bibliothèque Arduino à utiliser pour utiliser de manière simple les moteurs de l’AlphaBot.
×
Donner le nom de la méthode (sorte de fonction) à utiliser pour mettre en mouvement les moteurs.
×

 

 

Contrôle de la vitesse et du sens

Écrire et tester un petit programme permettant au robot de se déplacer en ligne droite, vers l’avant. Noter soigneusement les signes des valeurs à fournir à 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);
}
Adapter ce programme pour faire que le robot atteigne sa vitesse maximale progressivement (voir courbe d’évolution ci-dessous).

 

Modifier le programme pour que le robot suive une loi de mouvement trapézoïdale.

Un peu d'aide ?

Pour les phases où la vitesse n’est pas constante, il faut calculer l’accélération (c’est à dire la pente de la droite).

Cela permet d’établir les lois d’évolution de la vitesse : des équations de droites.

 

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\).

Déduire de l’abaque ci-dessus les expressions des vitesses \(v_g\) et \(v_d\) en fonction de \(v_c\) et \(r\).

 

Écrire un programme de telle sorte que le robot se déplace en zigzag, à vitesse maximale (voir loi d’évolution du taux de rotation ci-dessous).

 

 

 


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

Base de programme
#include "AlphaBot.h"
#include "TRSensors2.h"

#define NUM_SENSORS 5
TRSensors trs = TRSensors();

AlphaBot bot = AlphaBot(); 

// les variables de temps [ms]
unsigned long dt = 10;    // pas de temps
unsigned long t = 0;      // le temps "courant"
unsigned long t0 = 0;     // l'instant "initial"

// Paramètres de la loi du mouvement
int Vitesse = 80;
int Rotation = 0;   // taux de rotation

// Vitesses des roues
int Lspeed = 0;
int Rspeed = 0;

void setup() {
  // Donnees de calibrations
  unsigned int minSensorValues[NUM_SENSORS] = {209, 229, 281, 256, 198};
  unsigned int maxSensorValues[NUM_SENSORS] = {640, 728, 872, 828, 716};
  trs.SetCalibrates(minSensorValues, maxSensorValues);

  t0 = millis();
} 

void loop() { 
  // Lecture de la position de la ligne (nombre entre 0 et 4000)
  ...

  if (position > ...) {  // trop à gauche
    ...

  } else if (position < .) {  // trop à droite
    ...

  } else {
    ...
  }

  // calcul des vitesses des roues
  Lspeed = ...
  Rspeed = ...
  bot.MotorRun(-Lspeed, -Rspeed);

  delay(dt);
}

 

 

Approche « tout ou rien »

Dans une première approche, on se propose de guider le robot en appliquant l’algorithme suivant :

Écrire un programme de guidage qui utilise cet algorithme (réduire la vitesse si nécessaire).

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.

 

Écrire un programme de guidage basé sur cette technique d’asservissement. Ajuster le paramètre K afin d’optimiser le comportement du robot. Réduire la vitesse si nécessaire.

Résultat attendu (avec une vitesse de 100) :

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *