Pages: [1]   Go Down
Author Topic: Roue codeuse Pololu  (Read 811 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Je me suis lancé dans la construction d'un petit robot, et j'ai acheté un ensemble de roues/encodeur Popolu.

La page de l'encodeur en question chez le constructeur : pololu.com/catalog/product/1217

Le problème c'est qu'ils expliquent vraiment très rapidement le fonctionnement de l'encodeur, et ne proposent même pas d'algorithme "générique" à implémenter. Le seul code que j'ai pu trouver est dans leur bibliothèque, et je n'ai pas vraiment tout compris... Je n'ai pas non plus réussi à la faire fonctionner.

J'ai essayé une bonne dizaine de méthodes différentes, imaginées ou trouvées, et aucune n'a su fonctionner correctement... J'ai toujours un problème, soit parce que je n'arrives pas à faire la distinction avancer/reculer (problème de timing ?) ou soit parce qu'une interruption est coupée par une autre (y'a moyen de gérer ce genre de cas ?).

Je suis maintenant un peu à court d'idées, si quelqu'un pouvait m'aider la dessus...

Merci d'avance,
Antoine.
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faut utiliser seulement une interruption, par exemple sur la sortie A. Quand l'interruption est déclenchée (lib external interrupt de l'Arduino), il faut aller lire l'autre sortie (B) pour en déduire le sens et savoir s'il faut incrémenter le compteur de pas ou le décrémenter.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut, merci pour ta réponse smiley.

C'est ce que j'ai commencé à faire. J'ai remarqué que dans un sens, A et B étaient toujours égaux :

a = 1; b = 1
a = 0; b = 0
a = 1; b = 1

Dans l'autre, ils étaient différents :

a = 1; b = 0
a = 0; b = 1
a = 1; b = 0

J'ai donc mis une interruption sur le changement de A, et je compare simplement A et B pour incrémenter ou décrémenter un compteur.

Le problème c'est qu'à grande vitesse, j'ai beaucoup d'erreurs...

D'autre part, j'ai deux encodeurs sur mon robot. Si l'encodeur 1 déclenche l'interruption car il vient de changer, et qu'au même moment (ou très très très peu de temps après), l'encodeur 2 déclenche aussi l'interruption. Que se passe-t-il exactement ?

J'ai l'impression que dans ce cas, l'encodeur 1 perd l'exécution de son interruption et donc l'incrémentation de son compteur... C'est donc une autre source d'erreurs...

Comment gérer ce cas ?
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non, la seconde interruption est mémorisée donc elle sera activée dès que tu auras fini avec la première.

Par contre la troisième sera perdue (ou la seconde sur la même interruption) donc il ne faut pas rester longtemps dans ton interruption : comparaison + incrément/décrément et puis c'est tout. C'est bien ce que tu fais ?

Fais un calcul : vitesse de ta roue, vitesse de tes incréments, temps passé dans l'interruption.

Envoie moi ton code si jamais tu as un doute.

++
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait... Après plusieurs heures perdues la dedans je me suis rendu compte que j'avais inversé deux pins dans le programme, et c'est ce qui rendais les incréments aléatoires...

Je viens de recoder tout proprement ce soir (en faisant attention aux pins !!!), et mon robot avance maintenant correctement \o/.

Et merci pour tes indications (en particulier sur les interruptions, je me demandais vraiment comment l'µC gérait ça...) smiley
Logged

Pages: [1]   Go Up
Jump to: