Accueil

COMPTER LES TOURS DE ROUE du ROBOT

et LEURS FRACTIONS de QUELQUES DEGRES

POUR FAIRE UN PARCOURS PLUS PRECIS

(ODOMETRIE : Encodeurs mythes et réalités ! )

Pour faire un parcours plus précis on peut mesurer combien de tours de roue , et fractions de tour , a fait un robot. Ce sont des méthodes dites d'odométrie.Elles peuvent servir soit a commander les déplacements d'un robot en précisant de combien de tours (et fractions) doivent tourner ses roues donc a commander un déplacement , soit a surveiller le nombre de tours de roues pour calculer la trajectoire qu'a suivi un robot.

Principe:

On colle sur les roues du robot (a la face tournée vers la carcasse, a l'abri des éclairages parasites) un disque ou alternent des secteurs blancs et noirs.

Un couple diode émettrice / phototransitor placé face a ce disque, permet de compter les passages du noir au blanc par variation de la lumiére réfléchie. Pour limiter les parasites on utilise souvent des diodes infra rouges et on peut utiliser une émission modulée en fréquence.

Montages: on les appelle "encodeurs"

Il faut un disque bien plan,solidement fixé sur la roue du robot, avec des raies trés nettes et contrastées (en général 44 secteurs noirs et autant de blancs ).

Comme les détecteurs sont efficaces entre 1 a 2 mm du disque il faut une fixation précise et solide de la petite carte électronique qui porte les détecteurs .Deplus il faut bien vérifier que la distance de 1 a 2 mmm est respectée pendant toute la rotation de la roue, sinon ça ne marche pas . On peut par exemple prévoir des trous dans la carte pour y passer 2 des boulons qui fixent les servo moteurs a la carcasse.

Nous utilisons des détecteurs infrarouges ITR8307 (Everlight) contenus dans un tout petit circuit qui fait environ 3*3 mm, un des coins est légérement tronqué ce qui permet de répérer la patte 2 . Il comporte une diode IR connectée entre la patte 2 (+ relié au 5 volts par une résistance de 4,7 K ) et la patte 1 (-) et un phototransistor entre la patte 4 (patte emetteur du transistor , qu'on relie a la terre ) et la patte 3 (Collecteur qu'on relie au 5 volts avec une résistance de 38 K )..Les pattes 1et 4 , terres sont reliées entre elles.

La patte 3 , collecteur, est reliée au Propeller par une résistance de 4,7 K.

Pour choisir ces résistances on tient compte ici du fait que le Propeller considére toute tension inférieure a 1,65 volt arrivant sur une de ses patte comme un 0 et toute tension supérieure a 1,65 volt comme un 1 . Comme nous ne voulions pas avoir a transformer des valeurs analogiques en numériques nous avons donc choisi des résistances qui permettent d'envoyer au Propeller environ 0,3 volts face a une surface blanche et 3,5 volts face a une surface noire , de façon a être centré autour de 1,65 volts et a avoir une réponse nette , "0" ou "1", entre noir et blanc.Chacun doit faire ses essais pour améliorer son montage et dans ces cas la visualisation des signaux a l'oscilloscope peut bien aider.

Pour pouvoir calculer avec précision les distances parcourues il faut connaitre précisément le diamétre des roues. Si de plus on veut faire des virages d'un angle précis il faut connaitre exactement l'écartement des roues motrices et s'assurer qu'elles sont exactement sur le même axe et parfaitement paralléles !

 

Programmes:

Si le robot roulait vite il serait nécessaire d'utiliser un programme en assembleur ou au moins d'utiliser les compteurs rapides du Propeller.

Comme avec ses 2 servo moteurs notre robot fait moins de un tour de roue par seconde. Donc pour lire 2 fois 40 secteurs nous disposons de plus de 10 millisecondes pour repérer le passage d'un secteur blanc a un noir, ce qui est suffisant pour utiliser un programme en SPIN.

Pour chaque détecteur ce programme repére le passage du signal de 0 a 1 pour compter le nombre de secteurs qui passent devant lui.

Aussi pour avancer de 30 secteurs on a une méthode "score" qui fonctionne dans un COG a part et qui incrémente un compteur a chaque transition. De sorte que le programme qui pilote le moteur lui envoie des impulsions tant que ce score est inférieur a 30.

Le score est obtenu en lisant les valeurs 0 ou 1 de la patte reliée au détecteur:

dira[pindetecteur]:= 0 'on est en réception

score:=0

repeat while (score < cible)

lecture:= ina [pindetecteur]

if (lecture <> dernierelecture) 'on vérifie qu'on a changé de couleur de fond

score:=score+1

dernierelecture:=lecture

La réalité des résultats obtenus

Les encodeurs demandent un montage trés précis et une surveillance du bon fonctionnement (propreté des disques et détecteurs ; respect de la toute petite distance disque /détecteur pendant toute la rotation). Nous avons vu que les roues doivent aussi être parfaitement alignées.

Il faut également éviter les lumiéres parasites sur les détecteurs.

D'autre part leurs résultats deviennent faux si une roue patine sur le sol. Certains ajoutent donc une roue non motrice pour lire un décodeur et éviter ce probléme.Pour avoir des résultats acceptables il faut un robot qui se déplace sur un sol plat, lisse , par exemple sur une table formica . Sur une moquette les erreurs sont importantes.

Même avec des conditions idéales , comme les erreurs sont cumulatives , les encodeurs donnent des résultats insuffisants pour une navigation précise:

En effet,voyons si des encodeurs classiques, utilisant 44 secteurs blancs et 44 secteurs noirs donnent une bonne précision de déplacement et permettent de sortir d'un labyrinthe formé sur des cases représentées par des dalles de Gerflex d'environ 30 centimétres de coté , avec un robot qui a des roues de 6,6 cm de diamétre , soit 21 cm de progression par tour de roue ? Avec 88 secteurs, chaque secteur correspond a 360/88 soit environ 4 degrés et 0,235 cm de progression . Si ce robot se positionne case par case il peut se tromper d'un secteur dans la lecture de chaque roue. Si il fait toujours la même erreur d'un secteur, au bout d'une progression de 20 cases il se sera déja déplacé d'environ 5 centimétres de trop et si l'erreur ne porte que sur l'une des 2 roues il aura par exemple tourné vers la droite de *** degrés soit un décalage latéral d'environ *****centimétres.

Pour tourner a 90 degrés a droite ou a gauche on peut calculer de combien doit avancer chaque roue or c'est rarement d'un nombre entier de secteurs d'ou de nouvelles erreurs qui s'ajoutent.Pour ce calcul on tient compte de la distance entre les roues (16,5 cm pour notre robot).Pour simplifier on prendra le cas ou les 2 roues tournent dans de directions opposées (le robot pivote comme une toupie sur un axe placé juste entre les 2 roues).Ici le robot va parcourir un cercle de 16,5 cm de diamétre et pour 90 degrés cela fait 12,93 centimétres de trajet par roue , soit environ 55 secteurs. La encore une erreur d'un secteur , cumulative est a prévoir.

Lorqu'on veut parcourir un cercle plus large, sans pivoter en toupie. On est obligé d'envoyer le même nombre d'impulsions a chaque roue , on va donc modifier leur durée (afin de modifier la distance parcourue).Pour faire un cercle de 50 cm de diamétre intérieur avec le robot précédent , il faudra que pour le même nombre d'impulsions la roue interne parcoure : 50*3,1416= 157 centimétres (soit 7,47 tours de roue) et la roue externe : (50+16,5 ) *3.1416=209 centimétres (soit 9,95 tour de roue) soit 1,33 fois plus.D'ou l'utilité d'étalonner chaque roue pour connaître la distance parcourue par impulsion en fonction de la durée de chaque impulsion.

En fait, dans des conditions réélles, les erreurs sont 2 a 3 fois plus importantes. En effet nous verrons plus loin que lorsque l'on envoie des impulsions aux servos tant que le nombre de secteurs n'est pas atteint , il est clair que le robot continuera a avancer aprés la derniére impulsion grâce a son élan.

On appelle les méthodes précédentes de calcul du trajet des roues a partir des encodeurs :"ODOMETRIE" et les anglosaxons appellent la navigation correspondante "DEAD RECKONING".

Etalonner les déplacements du robot : c'est indispensable mais insuffisant :

Pour avoir des résultats acceptables on fait déplacer le robot par exemple d'un métre en ligne droite et on note le nombre d'impulsions que donnent les encodeurs. En principe avec la moitié de ce chiffre il fera 50 cm , mais c'est a vérifier!

De même on fera faire au robot 4 fois un tour a 90 degrés (il doit revenir a sa direction exacte de départ). A faire pour un virage a droite et a gauche (pas nécessairement identiques !

Et là encore on est pas sûr de tomber sur un nombre entier de secteurs et il restera de petites erreurs.On peut limiter cette dérive en gardant un total des écarts cumulés et a attendre qu'il avoisine un entier pour faire une correction.

Il ne faut pas non plus oublier que lorsqu'on arrête d'envoyer des impulsions aux servos le robot continue a avancer un peu sur son inertie et ceci d'autant plus qu'il va plus vite ! IL ne faut donc pas s'étonner si on demande un tour de roue complet et si on enregistre le nombre de secteurs lus avant arret il y ait un excédent! Si on veut un parcours précis il faut faire une accélération et un freinage progressifs , avec une courbe de vitesse en forme de trapéze (voir le chapitre sur le "ramping").

Bien entendu au départ on aura déterminé pour chaque servo moteur la durée d'impulsion correspondant a l'arrêt (c'est rarement les 1500 microsecondes théoriques).

Si on veut des résultats précis il faut tenir compte du fait que chaque servo a une courbe de réponse vitesse/ durée d'impulsions différente. Donc il faut la déterminer et la stocker pour adapter les commandes envoyées a chaque servo.

En conclusion, il faut :