Codeur rotatif incrémental : Différence entre versions

De Wiki LOGre
Aller à : navigation, rechercher
m (Mise en parallèle de 2 codeurs en quadrature)
m (Mise en parallèle de 2 codeurs)
Ligne 56 : Ligne 56 :
  
 
Suite à une [https://listes.logre.eu/pipermail/grenoble-hackerspace/2015-December/000446.html discussion sur la liste], cet chapitre tente de trouver une solution pour mettre en parallèle 2 codeurs incrémentaux.
 
Suite à une [https://listes.logre.eu/pipermail/grenoble-hackerspace/2015-December/000446.html discussion sur la liste], cet chapitre tente de trouver une solution pour mettre en parallèle 2 codeurs incrémentaux.
 +
 +
=== Solution avec portes XOR ===
  
 
Une proposition de [[Utilisateur:Guy|Guy]] est de combiner deux à deux les signaux des codeurs avec des portes XOR. On obtient alors ceci comme table de vérité :
 
Une proposition de [[Utilisateur:Guy|Guy]] est de combiner deux à deux les signaux des codeurs avec des portes XOR. On obtient alors ceci comme table de vérité :
Ligne 97 : Ligne 99 :
  
 
Comment régler ce problème ?
 
Comment régler ce problème ?
 +
 +
À noter que suivant le type de ''détente'' du codeur, c'est à dire les positions stables forcées par les ''clicks'' mécaniques, on peut se retrouver dans le cas 1 uniquement (type A ci-dessous), ou dans les cas 1 et 2 seulement (type B ci-dessous). Le sens de rotation sera alors bien conservé.
 +
 +
[[Fichier:detente_codeur.jpg]]
 +
 +
=== Solution avec diodes ===
 +
 +
[[Utilisateur:Mbxddp|Marc]] propose le montage suivant (non testé) :
 +
 +
[[Fichier:HamsterMolettes.png|650px]]
 +
 +
C à ajuster en fonction de la fréquence du créneau de la molette, R à ajuster en fonction des résistances de pull-up du chip (commencer par R = 4 x Rchip environ).

Version du 6 décembre 2015 à 11:53


Je vais essayer de compiler sur cette page tout ce que je sais et qui peut être utile à propos des codeurs rotatifs incrémentaux en quadrature.

Qu'est ce qu'un codeur ?

Ici nous allons parler de codeurs rotatifs incrémentaux, par la suite je dirais simplement codeur pour parler de ce type précis de codeur.
Un codeur rotatif sert à donner une information d'angle en mesurant la rotation autours d'un axe, un peu comme un potentiomètre rotatif.
Ici, avec les codeurs incrémentaux, on incrémente un compteur à chaque fois que le codeur tourne d'un cran, cran qui correspond à sa résolution.
C'est grâce à ce compteur qu'on connaît par la suite l'angle du codeur.

Comment lire le codeur ?

Le codeur agit un peu comme deux switchs. On regarde en permanence si il y a un changement d'état sur chacun de ces deux switchs.
En analysant les changements on peut par la suite définir si le codeur a été tourné dans un sens ou dans l'autre.
Pour cela on a besoin de l'état précédent de chacun des deux pôle, ainsi que leur état actuel.
Voici la variation de l'état des deux pôle d'un codeur :

2000px-Quadrature Diagram.svg.png
Source : Wikipedia

Lorsque le codeur tourne dans le sens des aiguilles d'une montre, l'état des deux pôles change comme sur le dessin en allant vers la droite, et dans le sens inverse il change comme en allant vers la gauche.

Ici les phases de 1 à 4 correspondent à un cran. Mais en réalité on peut lire un changement à chaque phase et ainsi multiplier la précision par 4.

Voici le code le plus simple possible pour analyser l'état du codeur et incrémenter une position. Il faudra exécuter ce code à chaque fois qu'un changement est détecté sur un des deux pôles du codeur :

// a contient l'état actuel du pôle 1, et pa contient l'état précedent
// Idem pour b et pb
// pos est la valeur d'incrémentation de la position du codeur
if(!b) {
   if(pa) pos++;
   else pos--;
}
else {
   if(!pa) pos++; 
   else pos--; 
}

Ici nous avons une précision de 4 fois le nombre de cran du codeur. Par exemple pour un codeur à 20 crans, on pourra détecter 80 positions différentes.

Une variante pour retrouver la direction est de faire un simple XOR entre les signaux a et b, dans la routine d'interruption.

Les crans d'un codeur rotatif

Sur la pluspart des codeurs il y a des crans. Pour certaines applications il ne sont pas souhaitables, surtout si vous voulez utiliser un précision supérieure au nombre de crans.
Je ne sais pas si c'est pareil sur tous les codeurs, mais sur ceux que j'utilise il suffit d'enlever une bille à l'intérieur pour se passer des crans :

Encodeur - bille.jpg

Codeurs, Arduino, et Midi

Lire un codeur avec un arduino, et envoyer sa position en midi.

Mise en parallèle de 2 codeurs

Suite à une discussion sur la liste, cet chapitre tente de trouver une solution pour mettre en parallèle 2 codeurs incrémentaux.

Solution avec portes XOR

Une proposition de Guy est de combiner deux à deux les signaux des codeurs avec des portes XOR. On obtient alors ceci comme table de vérité :

Aout = A1 ⊕ A2
Bout = B1 ⊕ B2

1) Si la molette 2 tourne et que la molette 1 est posée sur deux valeurs low :

A1 A2 Ao B1 B2 Bo
0  0  0  0  0  0
0  1  1  0  0  0
0  1  1  0  1  1
0  0  0  0  1  1

2) Si la molette 2 tourne et que la molette 1 est posée sur deux valeurs high :

A1 A2 Ao B1 B2 Bo
1  0  1  1  0  1
1  1  0  1  0  1
1  1  0  1  1  0
1  0  1  1  1  0

3) Si la molette 2 tourne et que la molette 1 est posée sur des valeurs low/high :

A1 A2 Ao B1 B2 Bo
0  0  0  1  0  1
0  1  1  1  0  1
0  1  1  1  1  0
0  0  0  1  1  0

4) Si la molette 2 tourne et que la molette 1 est posée sur des valeurs high/low :

A1 A2 Ao B1 B2 Bo
1  0  1  0  0  0
1  1  0  0  0  0
1  1  0  0  1  1
1  0  1  0  1  1

Le hic, c'est que le sens de rotation des cas 1 et 2 est inversé par rapport au cas 3 et 4. Donc suivant comment est arrêté le codeur 1, le codeur 2 va inverser le sens de codage.

Comment régler ce problème ?

À noter que suivant le type de détente du codeur, c'est à dire les positions stables forcées par les clicks mécaniques, on peut se retrouver dans le cas 1 uniquement (type A ci-dessous), ou dans les cas 1 et 2 seulement (type B ci-dessous). Le sens de rotation sera alors bien conservé.

Detente codeur.jpg

Solution avec diodes

Marc propose le montage suivant (non testé) :

HamsterMolettes.png

C à ajuster en fonction de la fréquence du créneau de la molette, R à ajuster en fonction des résistances de pull-up du chip (commencer par R = 4 x Rchip environ).