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