Utilisation de l'encodeur rotatif KY-040

publication: 6 janvier 2022 / mis à jour 6 janvier 2022

Read this page in english

 

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:

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:

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