Traqueur de ligne
Le module traqueur de ligne TCL1543 est pourvu de 5 détecteurs optiques à infrarouges ITR20001 dont le principe de fonctionnement est le suivant :
Un émetteur émet un rayon IR en direction du sol. Un photo-transistor détecte la fraction de ce rayonnement réfléchi par le sol. Si le sol est réfléchissant ou clair, le récepteur recevra davantage de lumière que s’il est sombre.
Chaque détecteur fournit au microcontrôleur une valeur analogique.
Il suffit de comparer les valeurs des 5 détecteurs pour juger de la position de la ligne noire, et ainsi contrôler la trajectoire du robot.
Le TCL1543 communique avec le microcontrôleur par un protocole SPI (SPI sur Raspberry Pi)
Calibrage
Selon l’éclairement ambiant et la réflexivité des surfaces constituant le sol et la ligne, les détecteurs vont renvoyer des valeurs extrêmes (surface « noire », surface »blanche ») différentes.
Il faut calibrer le capteur, afin d’optimiser le « contraste de l’image ».
Pour cela, une procédure de calibrage doit être faite :
- on balaye toute la ligne avec le capteur
- on enregistre les valeurs minimum et maximum obtenues par chaque détecteur IR
- on utilise ces valeurs extrêmes pour déterminer si le détecteur voit du noir ou du blanc.
Utilisation avec Arduino
Bibliothèque
Pour utiliser plus simplement le détecteur de ligne, il faut installer la bibliothèque TRSensors2.
Elle procure aux programmes une classe TRSensors
représentant le traqueur. Ainsi on peut créer un objet (appelé par exemple trs
) avec la ligne suivante, placé en début de programme (avant la fonction setup
) :
TRSensors trs = TRSensors();
Calibrage
Le calibrage est nécessaire pour adapter le détecteur au contraste de la ligne à suivre (dépend des matériaux, de l’éclairement, …).
Il peut être réalisé à l’aide de ce petit script :
#include "TRSensors2.h" #define NUM_SENSORS 5 TRSensors trs = TRSensors(); unsigned int sensorValues[NUM_SENSORS]; void setup() { Serial.begin(115200); Serial.println("TRSensor : calibration en cours ..."); for (int i = 0; i < 400; i++) // la procedure dure environ 10 secondes { trs.calibrate(); // calibration ... } Serial.println("Calibration terminee"); for (int i = 0; i < NUM_SENSORS; i++) { Serial.print(trs.calibratedMin[i]); Serial.print('\t'); } Serial.println(); for (int i = 0; i < NUM_SENSORS; i++) { Serial.print(trs.calibratedMax[i]); Serial.print('\t'); } Serial.println(); } void loop() { delay(250); }
Téléverser le programme et ouvrir le moniteur série .
- Lorsque le premier message apparait, balayer lentement le capteur au dessus de la ligne à détecter.
- Noter soigneusement les valeurs qui s’affichent.
par exemple :
213 229 231 210 170
358 373 389 358 298
Dans la fonction setup()
des futurs programmes utilisant le capteur, il faudra ajouter quelques lignes pour adapter le capteur à la ligne à détecter.
par exemple :
unsigned int minSensorValues[NUM_SENSORS] = {213, 229, 231, 210, 170}; unsigned int maxSensorValues[NUM_SENSORS] = {358, 373, 389, 358, 298}; trs.SetCalibrates(minSensorValues, maxSensorValues);
Il faut effectuer la procédure de calibrage une seule fois pour une ligne et un éclairage donnés.
Détection d’une ligne
#include "TRSensors2.h" #define NUM_SENSORS 5 // sensors 0 through 5 are connected to analog inputs 0 through 5, respectively TRSensors trs = TRSensors(); unsigned int sensorValues[NUM_SENSORS]; void setup() { Serial.begin(115200); Serial.println("TRSensor"); // Donnees de calibrations unsigned int minSensorValues[NUM_SENSORS] = {213, 229, 231, 210, 170}; unsigned int maxSensorValues[NUM_SENSORS] = {358, 373, 389, 358, 298}; trs.SetCalibrates(minSensorValues, maxSensorValues); } void loop() { // Lecture de la position de la ligne (nombre entre 0 et 4000) unsigned int position = trs.readLine(sensorValues); Serial.println(position); delay(250); }
La position de la ligne est donnée par la méthode readLine
qui renvoie un nombre entre 0 et 4000 :
Position de la ligne par rapport au capteur |
gauche | centre | droite |
Nombre renvoyé parreadLine |
0 | 2000 | 4000 |
Autres méthodes
Lecture des valeurs « brutes » renvoyées par le capteur.
trs.AnalogRead(sensorValues);
Lecture des valeurs « calibrées » renvoyées par le capteur
trs.readCalibrated(sensorValues);
Utilisation avec Raspberry Pi
Bibliothèque
On peut utiliser une bibliothèque « maison » : TRsensor.py
Téléchargement : TRsensor
Calibrage
La procédure d’autocalibrage nécessite de déplacer le capteur au dessus de la ligne à suivre.
On doit réaliser un calibrage à chaque fois que l’on change l’éclairement ambiant, ou la nature de la ligne à suivre.
La classe TRSensor
dispose d’une méthode d’autocalibration autoCalibration
Une fois les valeurs obtenues, on peut les conserver et les fournir lors des constructions futures de l’objet TRSensor
:
TR = TRSensor(cMin = [421, 448, 451, 490, 348], cMax = [92, 106, 109, 125, 152])