Table des matières:
Vidéo: Décodeur rotatif simple : 4 étapes
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Cette instructable décrit une méthode simple de décodage d'un encodeur rotatif séquentiel à l'aide d'un Arduino Uno R3.
Des routines logicielles compactes sont utilisées pour compter le nombre de transitions, éliminer les rebonds de contact et déterminer le sens de rotation. Des composants et des tables de recherche supplémentaires ne sont pas nécessaires.
Des versions avec et sans interruption du code sont fournies.
La version d'interruption du code ne nécessite qu'une seule broche d'interruption.
Images:
- La photo d'ouverture montre l'encodeur assemblé.
- La capture d'écran montre le code de la version d'interruption et le nombre lorsque l'arbre du codeur est tourné dans le sens horaire et antihoraire.
- La vidéo montre le décompte pendant la rotation rapide.
Étape 1: schéma de circuit
Le schéma de câblage de l'encodeur est représenté sur la fig.1.
Les cavaliers sont soudés directement aux broches de l'encodeur.
Échangez les deux fils bleus si le sens de comptage est inversé.
Étape 2: Liste des pièces
Les pièces suivantes ont été obtenues à partir de
- 1 seul Arduino UNO R3 avec câble USB.
- 1 seul encodeur rotatif séquentiel (EC11 ou équivalent) avec interrupteur.
- 1 seul bouton pour s'adapter à l'arbre.
- 3 fils de cavalier Arduino mâle-mâle uniquement.
Étape 3: Théorie
Les encodeurs rotatifs séquentiels génèrent deux ondes carrées dont chacune est déplacée de 90 degrés, comme le montre la Fig.1.
Les schémas logiques au contact A et au contact B sont différents lorsque l'arbre est tourné dans le sens horaire (CW) et antihoraire (CCW) sur les positions 1 à 6.
Les méthodes courantes de détermination du sens de rotation comprennent:
- Matériel
- interruptions jumelles
- tables de recherche de modèle
Ce projet utilise une méthode logicielle qui ne nécessite pas de tables de recherche. [1]
Direction
Au lieu de regarder les modèles de sortie du contact A et du contact B, concentrons-nous sur le contact A.
Si nous échantillonnons le contact B après chaque transition du contact A, nous notons que:
- Le contact A et le contact B ont des états logiques opposés lorsque l'encodeur est tourné dans le sens horaire
- Le contact A et le contact B ont le même état logique lorsque l'encodeur est tourné dans le sens antihoraire
Code réel:
// ----- Compter les transitions
CurrentStateA = stateContactA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); if (CurrentStateA == CurrentStateB) Count++; if (CurrentStateA != CurrentStateB) Count--; LastStateA = CurrentStateA; }
Cette méthode offre les avantages suivants:
- les tables de recherche ne sont pas nécessaires
- une seule ligne d'interruption est requise
Anti-rebond
Tous les codeurs mécaniques souffrent de « rebond de contact ».
Si un contact d'interrupteur n'ouvre/s'ouvre pas proprement, son état logique oscillera rapidement de HAUT à BAS jusqu'à ce que le contact d'interrupteur se stabilise. Cela se traduit par de faux décomptes.
Une méthode pour supprimer le rebond de contact consiste à ajouter un petit condensateur entre chaque contact de commutateur. Le condensateur et la résistance de rappel associée forment un intégrateur qui court-circuite efficacement les hautes fréquences et permet à la tension de commutation de monter/baisser gracieusement.
L'inconvénient de cette approche est que des transitions peuvent être manquées si l'arbre du codeur est tourné rapidement.
Anti-rebond logiciel
Cette méthode utilise deux compteurs (Open, Closed) qui ont été mis à zéro. [2]
Une fois qu'une transition est détectée sur le contact A:
- Sondage en continu Contact A.
- Incrémentez le compteur d'ouverture et réinitialisez le compteur de fermeture chaque fois que le contact A est au niveau haut.
- Incrémentez le compteur Fermé et réinitialisez le compteur Ouvert, chaque fois que le Contact A est BAS.
- Quittez la boucle lorsque l'un des compteurs atteint un nombre prédéterminé. Nous recherchons effectivement la période d'équilibre après tout rebond de contact.
Code réel:
// ----- Anti-rebond Contact A
while (1) { if (digitalRead(ContactA)) { // ----- ContactA is Open Closed = 0; // Intégrateur inverse vide Open++; // Intégrer if (Open > MaxCount) return HIGH; } else { // ----- ContactA est Fermé Ouvert = 0; // Intégrateur inverse vide Closed++; // Intégrer if (Fermé > MaxCount) return LOW; } }
Il n'est pas nécessaire de neutraliser le contact B car les transitions du contact A et du contact B ne coïncident pas.
Compte
Un "détente" mécanique double efficacement votre compte car deux comptes sont enregistrés entre les clics (voir fig 1).
Le nombre de « détentes » peut être déterminé en utilisant l'arithmétique modulo 2 comme indiqué ci-dessous.
Code réel:
// ----- Compter "détentes"
if (Count % 2 == 0) { Serial.print("Count: "); Serial.println(Count / 2); }
Les références
De plus amples informations peuvent être trouvées sur:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
Étape 4: Logiciel
Ce projet nécessite une version récente de l'IDE Ardino Uno R3 (environnement de développement intégré) disponible sur
Téléchargez chacun des deux croquis Arduino suivants (ci-joints)
- Rotary_encoder_1.ino (version d'interrogation)
- Rotary_encoder_2.no (version d'interruption)
Double-cliquez sur votre version préférée et suivez les instructions à l'écran.
Prendre plaisir …
Cliquez ici pour voir mes autres instructables.