Utilisation de l'encodeur rotatif KY-040
publication: 6 janvier 2022 / mis à jour 6 janvier 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Présentation de l'encodeur
Pour faire varier un signal, nous disposons de plusieurs solutions:
- une résistance variable dans un potentiomètre
- deux boutons gérant par logiciel la variation
- un encodeur rotatif
L'encodeur rotatif est une solution intéressante. On peut le faire agir comme un potentiomètre, avec l'avantage de ne pas avoir de butée de début et fin de course.
Son principe est très simple. Voici les signaux émis par notre encodeur rotatif:
Voici notre encodeur:
Schéma du fonctionnement interne:
Selon ce schéma, deux bornes nous intéressent:
- A (DT) -> switch X
- B (CLK) -> switch Y
Cet encodeur peut être alimenté en 5V ou 3,3V. Ça nous arrange, car la carte ESP32 dispose d'une sortie 3,3V.
Montage de l'encodeur sur la plaque d'essai
Le câblage de notre encodeur à la carte ESP32 ne nécessite que 4 fils:
ATTENTION: la position des pins G4 et G15 peut varier selon la version de votre carte ESP32.
Analyse des signaux de l'encodeur
Tel que notre encodeur est connecté, chaque borne A ou B reçoit une tension, ici 3,3V, dont l'intensité est limitée par une résistance de 10Kohms.
L'analyse du signal sur la borne G15 montre bien une présence de la tension 3,3V:
Sur cette capture de signal, le niveau bas sur la borne G15 apparait quand on manoeuvre la tige de commande de l'encodeur. Au repos, le signal sur la borne G15 est au niveau haut.
Ceci change tout, car, au niveau programmation, on doit traiter l'interruption de G15 en front descendant.
Programmation de l'encodeur
L'encodeur sera géré par interruption. Les interruptions déclenchent le programme seulement si un signal particulier atteint un niveau bien défini.
Pour nous, nous allons gérer une seule interruption sur la borne GPIO G15:
interrupts \ enable interrupt on GPIO G15 : intG15enable ( -- ) 15 GPIO_INTR_POSEDGE gpio_set_intr_type drop ; \ disable interrupt on GPIO G15 : intG15disable ( -- ) 15 GPIO_INTR_DISABLE gpio_set_intr_type drop ; : pinsInit ( -- ) 04 input pinmode \ GO4 as an input 04 gpio_pulldown_en drop \ Enable pull-down on GPIO 04 15 input pinmode \ G15 as an input 15 gpio_pulldown_en drop \ Enable pull-down on GPIO 15 intG15enable ;
Dans le mot pinsInit
, on initialise les pins GPIO G4 et G15 en
entrée. Puis on détermine le mode d'interruption de G15 sur front
descendant avec 15 GPIO_INTR_POSEDGE gpio_set_intr_type drop
.
Test de l'encodage
Cette partie de code n'est pas à exploiter dans un montage définitif. Elle sert seulement à vérifier que l'encodeur est correctement branché et fonctionne bien:
: test ( -- ) cr ." PIN: " cr ." - G15: " 15 digitalRead . cr ." - G04: " 04 digitalRead . ; pinsInit \ initialise G4 and G15 ' test 15 pinchange
C'est la séquence ' test 15 pinchange
qui indique à ESP32Forth
d'exécuter le code de test
si une interruption se déclenche sur action
de la borne G15.
Résultat de l'action sur notre encodeur. Nous n'avons conservé que les résultats d'actions arrivant en butée, une fois dans le sens horaire inverse, puis dans le sens horaire:
PIN: - G15: 1 \ reverse clockwise turn - G04: 1 PIN: - G15: 0 \ clockwise turn - G04: 1
Incrémenter et décrémenter une variable avec l'encodeur
Maintenant que nous avons testé l'encodeur par interruption matérielle, on va pouvoir gérer le contenu d'une variable.
Pour ce faire, on définit notre variable KYvar
et les mots
permettant d'en modifier son contenu:
0 value KYvar \ content is incremented or decremented \ increment content of KYvar : incKYvar ( n -- ) 1 +to KYvar ; \ decrement content of KYvar : decKYvar ( n -- ) -1 +to KYvar ;
Le mot incKYvar
incrémente le contenu de KYvar
.
Le mot decKYvar
décrémente le contenu de KYvar
.
On teste la modification du contenu de la variable KYvar
via ce
mot testIncDec
défini ainsi:
\ used by interruption when G15 activated : testIncDec ( -- ) intG15disable 15 digitalRead if 04 digitalRead if decKYvar else incKYvar then cr ." KYvar: " KYvar . then 1000 0 do loop \ small wait loop intG15enable ; pinsInit ' testIncDec 15 pinchange
Tournez la commande de l'encodeur vers la doite (sens horaire) va incrémenter
le contenu de la variable KYvar
. Une rotation vers la gauche
décrémente le contenu de la variable KYvar
:
pinsInit ' testIncDec 15 pinchange --> KYvar: 1 \ rotate Clockwise KYvar: 2 KYvar: 3 KYvar: 4 KYvar: 3 \ rotate Contra Clockwise KYvar: 2 KYvar: 1 KYvar: 0 KYvar: -1 KYvar: -2
Listing complet: using the KY-040 Rotary Encoder
Legal: site web personnel sans commerce / personal site without seling