mardi 11 février 2014

DIY règle électronique (ou encodeur linéaire) : programme

Voilà, la règle électronique est terminée.
A partir des exemples pour des encodeurs rotatifs (voir précédent message), j'ai abouti à un code qui donne des résultats satisfaisants.

Le secret est d'utiliser les interruptions. Celles-ci permettent d'interrompre le programme principal lors d'un évènement externe. Les interruptions dites "external" sont limitées à deux pins. Pour le projet, il me fallait deux voies pour faire fonctionner l'encodeur en quadrature (afin de connaitre le sens du mouvement), ainsi que d'une voie pour une référence absolue.

J'ai du coup utilisé le programme proposé par J. Carter sur le site Arduino, mais en ajoutant une interruption logicielle (grâce à la bibliothèque pinchangeint) pour rajouter une remise à zéro avec la référence absolue.

J'ai assez facilement réussi à pouvoir compter les graduations, mais il y avait des erreurs lorsque le chariot se déplaçait rapidement. J'ai utilisé arduoscillo pour pouvoir vérifier les signaux.

Le compteur (bleu) s'incrémente (ou se décrémente) sur les fronts montants ou descendants de la voie en rouge. L'autre voie (en vert) permet de savoir s'il faut incrémenter ou décrémenter le compteur
Ceci a permis de se rendre compte que des fronts n'étaient pas comptés, alors qu'ils étaient bien visibles au niveau des courbes. Le problème semblait venir d'un seuil dans le programme qui sert au "debouncing" (sur certains capteurs les signaux oscillent lors des transitions, et différentes techniques logicielles permettent de s'affranchir de ceci, mais au prix d'une perte sur la vitesse maximale de mouvement). En simplifiant, j'ai passé le seuil de temporisation de 10 à 1 ms. Les résultats semblent depuis satisfaisants. Le code est disponible ici
 

Résultats satisfaisants


Pour ceux qui voudraient se lancer dans la fabrication d'une telle règle numérique, un autre nom commun est encodeur linéaire. Une autre bonne solution semble être la récupération dans une vieille imprimante.

http://www.renishaw.fr/fr/codeur-lineaire-optique-rg2--6441
http://eliottdumeix.blogspot.fr/2013/05/hack-dun-axe-dimprimante-avec-un-arduino.html
http://en.wikipedia.org/wiki/Linear_encoder
http://benkrasnow.blogspot.fr/2010/02/linear-position-tracking-with.html
http://reprap.org/wiki/Optical_encoders_01
http://www.digikey.com/en-US/articles/techzone/2012/apr/a-designers-guide-to-encoders

Aucun commentaire:

Enregistrer un commentaire