Lecture d’un encodeur rotatif (ATtiny2313 et assembleur)

Cet article sort un peu du cadre habituel de l’initiation aux AVR car il fait appel à des notions qui n’ont pas encore été expliquées dans les pages précédentes.

Dans le cadre du projet de conception d’une carte de développement pour AVR, je suis amené à monter un petit module composé d’un LCD (probablement 16 caractères x 2 lignes) géré par un Attiny2313 et raccordé à la carte principale par une liaison Rx/Tx.

Le LCD devrait fonctionner tantôt comme un terminal (chaque envoi se terminant par « CR » provoque un scroll vers le haut et s’affiche sur la ligne 2), tantôt pour afficher un système de menu dans lequel on peut se déplacer et sélectionner des options.

Pour le fonctionnement en menu, je prévois d’utiliser un encodeur rotatif. Quand on tourne dans le sens horaire, on descend dans le menu. En tournant dans l’autre sens, on remonte. Quand on appuie sur l’axe, on sélectionne l’option sous le curseur et si on appuie plus d’un certain temps (par exemple ¼ de seconde), on quitte le sous-menu ou le menu sans sélectionner. Les lignes du menu sont reçues par Rx et la sélection est renvoyée par Tx.

Je vous livre ici le fruit de mon expérience de lecture d’un encodeur rotatif.

10 x Rotary Encoder  eBay

10 x Rotary Encoder eBay

J’ai donc commandé sur eBay des encodeurs rotatifs (rotary encoder) pas chers (8,49 USD pour 10 pièces) et dont je n’ai pas à me plaindre jusqu’ici.

La plupart des sites parlant de l’utilisation des encodeurs mentionnent le problème des rebonds et y remédient généralement en ajoutant au programme des boucles d’attente et des comptages divers pour pallier aux rebonds.

J’ai suivi une approche différente : l’anti-rebond hardware. Le matériel est rudimentaire et la programmation très simple. Je me suis inspiré du schéma ci-dessous :

Le signal du bouton poussoir est modifié par un filtre R/C empêchant les rebonds significatifs.

Un encodeur rotatif comporte généralement 3 pins d’un côté et 2 pins de l’autre.

Les pins situées en haut du schéma correspondent à un simple bouton poussoir actionné en appuyant sur l’axe.

Les pins A et B sont mises en contact avec la borne centrale par la rotation de l’axe mais les contacts sont décalés dans le temps.

Lorsqu’on tourne l’axe dans le sens horaire, la borne B donne un contact d’une certaine durée. A la moitié de cette durée, A entre en contact pour la même durée.

En tournant l’axe dans le sens antihoraire, c’est le contact A qui se produit en premier.

J’ai donc réalisé le montage suivant :

Les pins A et B sont reliées à la borne centrale et à GND par des petits condensateurs céramiques de 100 nF. Elles sont également reliées au +5V à travers 2 résistances de 10K.

La pin A est connectée à l’entrée INT0 de l’ATtiny2313, tandis que la pin B est connectée à n’importe quelle entrée. La routine d’interruption sera appelée lorsque l’entrée INT0 présente un front descendant. La routine teste alors l’état de l’entrée B. Si celle-ci est à un niveau bas, la rotation est horaire. Si c’est un niveau haut, la rotation est antihoraire. Simple, non ?

Si le signal B est raccordé à l’entrée PinD4, voici à quoi pourrait ressembler le code de la routine d’interruption :

L’encodeur ne donne pas qu’un seul signal par tour. Il existe de multiples variantes mais mon encodeur donne 20 pas par tour. On peut sentir ces pas en tournant l’axe.

Par conséquent, on peut mesurer la vitesse de rotation en évaluant le temps entre deux pas successifs.

Pour ce faire on va se servir du Timer1 qui se compose de 2 bytes. On met le Timer1 en route en quittant la routine INT0, et on l’arrête à l’appel suivant de la routine.

On estime que si le temps entre deux pas dépasse 1 seconde, il y a eu un temps d’arrêt et le temps n’est donc plus à prendre en considération. En considérant un µC à une fréquence de 8 MHz, il faut 8 millions de cycles pour une seconde. Si le prescaler est à 1024, cela correspond à 8000000 / 1024 = 7812,5 tics. Si on divise encore par 256, on obtient 30,5 tics du High byte du Timer. On va donc choisir le prescaler à 1024, tenir compte seulement du High byte du Timer et initialiser le Timer à 255 – 30 = 225. On peut sans problème négliger le LOW byte car son changement est si rapide que sa valeur n’est pas significative.

Il reste à utiliser l’USART pour pouvoir envoyer  au terminal du PC le sens et la vitesse de rotation.

En mettant tout cela en musique, cela donne le programme suivant :

Encodeur rotatif sur ATtiny2313

Retour au Menu

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s