Les impulsions qui sont comptées par le LM ne correspondent à
aucune réalité physique. Or, pour faciliter la mise en oeuvre et
la compréhension du système, il est pratique d'utiliser en haut
niveau des unités courantes (m, cm, mmm...). De plus, on a
constaté une dissymétrie entre les deux roues codeuses et on a dû
introduire un facteur correctif. Là aussi, il est plus convivial
de ne pas avoir à se soucier de ce facteur en haut niveau.
D'autre part, le câblage et le montage des moteurs et des roues
codeuses peuvent faire que les signes soient plus ou moins
n'importe quoi. Or, on aimerait bien lorsqu'on dit aux deux roues
d'avancer de 10 cm, qu'elles avancent (Je dis bien avancent et non
reculent) de 10 cm. Ce qui est loin d'être gagné au départ.
C'est pourquoi, on a implémenté dans le DSP une sorte de couche bas niveau qui permet de convertir les données brutes en informations classiques et vice-versa. Les fonctions ou macros ainsi écrites permettent d'accéder à l'asservissement sans trop se soucier des conversions d'unités une fois que tout les paramètres de la couche basse sont bien réglés.
La seule unité de distance que le LM connaisse est ce que nous
allons appeler le count. Ainsi avec une roue codeuse de 500
points, le LM s'incrémente de 2000 counts en un tour de roue. En
haut niveau, on souhaite n'utiliser que des unités classiques ; le
millimètre a été retenu bien qu'après coup le mètre eu été
préférable.
Notons , le nombre de points que possèdent une roue codeuse. Le
LM est alors capable de décoder
counts sur cette roue
codeuse. Donc un déplacement de
counts correspond à un
déplacement effectif de la roue d'une distance équivalente à sa
circonférence qui vaut
où
représente le diamètre de la
roue codeuse.
La constante qui est utilisée dans le DSP pour les conversions de
distances est COUNT_PER_MM
qui représente le nombre de
counts produits par le LM lorsqu'une roue codeuse avance d'un
millimètre. Son unité est donc le count/mm. Pour déterminer cette
constante, il suffit de faire avancer le robot de 2 m par exemple,
de regarder le nombre de counts produits et d'en déduire la valeur
du COUNT_PER_MM
. Cette valeur est commune aux deux roues
codeuses et correspond à la moyenne des valeurs de cette
constante pour chaque roue.
Comme on l'a déjà dit et répété, il y a une dissymétrie entre les
circonférences des deux roues codeuses et c'est pour cette raison
que l'on a introduit le facteur de correction SYM_LM
1.4. Une valeur positive de cette constante
permet de corriger une dérive du robot vers la droite. Pour être
ajustée, cette valeur nécessite beaucoup de tests. L'une des
techniques les plus fiables consiste à faire effectuer au robot
une trajectoire rectangulaire qui suit des lignes 1.5. Si
au bout d'un certain nombre de tours le robot coupe les lignes de
la gauche vers la droite, alors il faut
augmenter la valeur du SYM_LM
.
Avant de modifier la valeur de la constante, il faut s'assurer de
la répétabilité de l'opération. Il est bon de refaire au moins 2
fois la même expérience pour d'affranchir des erreurs de calage au
départ ...et pour dégager une tendance moyenne. Une fois que
le SYM_LM
est correctement réglé, on peut avoir une dérive
qui reste limitée sur la durée souhaitée et qui surtout est alors
aléatoire. On peut estimer que le robot est bien calibré quand
:
Ces deux conversions ont été regroupées en deux constantes :
COUNT_PER_MM_D = COUNT_PER_MM*(1-SYM_LM) COUNT_PER_MM_G = COUNT_PER_MM*(1+SYM_LM)Ainsi, dès que l'on veut envoyer une distance au LM il suffit de la multiplier par l'une de ces valeurs. Et inversement, quand on récupère une donnée du LM, il faut la diviser par l'une de ces constantes pour retrouver une valeur en mm.
ATTENTION : Toutes les valeurs qui sont transmises au LM sont des entiers alors que les calculs sont fait en virgule flottante sur le DSP et ceci pour des raisons de précision. Il ne faut donc pas oublier de les convertir avant de les envoyer.
La seule unité de vitesse que le LM connaisse est le count/sample.
Curieuse unité me direz-vous alors essayons d'éclaircir la chose.
Le count, on a déjà vu avec les distances. Maintenant qu'est que
le sample. Le sample est l'unité de temps du LM, elle correspond à
la période de la boucle d'asservissement qui est de
où
est la fréquence de l'oscillateur qui pilote le LM.
Donc, pour un oscillateur à 8 MHz, un sample correspond à
256
s. Dans le code DSP, cette constante a été appelée
SAMPLING_PERIOD
et son unité est la seconde/sample.
Mais la ruse du LM ne s'arrête pas là. En fait, lorsque l'on
charge une vitesse dans le LM, on l'envoie sur 32 bits. Or, seuls
les 16 bits de poids forts correspondent à des counts/sample alors
que les 16 bits de poids faible correspondent à la partie
décimale.
Si on dispose d'une vitesse v_DSP
en cm/s que l'on souhaite
l'envoyer au LM droit sur 32 bits dans v_LM
, il faut
appliquer la formule suivante pour la convertir :
v_LM = v_DSP * 10 * COUNT_PER_MM_D * SAMPLING_PERIOD * 65536
Si on récupère une vitesse du LM sur 32 bits et que l'on veut la convertir en cm/s, on appliquera :
v_DSP = v_LM / (10 * COUNT_PER_MM_D * SAMPLING_PERIOD * 65536)
ATTENTION : Les vitesses envoyées au LM sont sur 32 bits et certaines de celles que l'on peut récupérer sont sur 16 bits seulement. Dans ce cas, il ne faut pas oublier de décaler de 16 bits vers la droite la valeur récupérée. Lorsque l'on, ne récupère que 16 bits, il s'agit des 16 bits de poids forts dont l'unité est le count/sample.
Comme pour la vitesse, le LM ne connaît que des accélérations en
counts/sample/sample. Et là aussi les 16 bits de poids forts
correspondent à la partie entière et les 16 bits de poids faible à
la partie décimale.
Si on dispose d'une accélération a_DSP
en cm/s que l'on
souhaite l'envoyer au LM droit sur 32 bits dans
a_LM
, il faut
appliquer la formule suivante pour la convertir :
a_LM = a_DSP * 10 * COUNT_PER_MM_D * SAMPLING_PERIOD * SAMPLING_PERIOD * 65536
Si on récupère une vitesse du LM sur 32 bits et que l'on veut la convertir en cm/s, on appliquera :
v_DSP = v_LM / (10 * COUNT_PER_MM_D * SAMPLING_PERIOD * SAMPLING_PERIOD * 65536)
ATTENTION : Là aussi le LM renvoie dans certains cas les accélérations sur 16 bits.
Ces routines de conversion bas niveau permettent de s'abstraire légèrement du matériel dans le code de traitement. Cependant, nous avons commencé un peu tard à vouloir faire une couche de conversion bas niveau si bien qu'elle n'est pas vraiment opérationnelle et que l'on retrouve souvent les formules de conversion au milieu du code. Ces conversions gagneraient sans doute à être intégrées dans des routines bas niveau d'accès au LM.