Lorsque le commutateur rotatif est déplacé, le sens du mouvement et la position actuelle du commutateur rotatif sont codés et émis via les sorties et peuvent donc être utilisés dans d'autres applications.

Codage

L'idée avec un commutateur/encodeur rotatif est que pour chaque "pas" de rotation, l'état ne change qu'une des deux broches de sortie à la fois. En fonction de celui des deux qui a changé en premier, on peut conclure au sens de rotation en faisant attention au codage suivant.

Dans le sens des aiguilles d'une montre [A change en premier] -> Pin_CLK

A B
0 0
1 0
1 1
0 1
0 0

Dans le sens inverse des aiguilles d'une montre [B change en premier] -> Pin_DT.

A B
0 0
0 1
1 1
1 0
0 0

Affectation des broches

Exemple de code Arduino

Affectation des broches Arduino

Arduino Capteur
5V +V
Masse GND
Pin 3 CLK
Pin 4 DT
Pin 5 Bouton

Si un changement d'état de la broche s'est produit, le programme vérifie laquelle des deux broches a changé en premier, ce qui indique le sens de rotation. Cette information est obtenue en comparant l'une des deux valeurs de la broche d'une manche précédente avec la valeur de la manche actuelle.

Une fois la direction déterminée, les pas depuis la position de départ sont comptés et édités. Appuyer sur le bouton de l'encodeur réinitialise la position actuelle.

Pour la sortie série : Baud rate = 115200.

// Initialisation des variables nécessaires
int Compteur = 0; 
boolean Direction;
int Pin_clk_Letzter;  
int Pin_clk_Aktuell;
 
// Définition des broches d'entrées
int pin_clk = 3;  
int pin_dt = 4; 
int button_pin = 5;
  
  
void setup() 
{ 
   // Initialisation des broches d'entrées...
   pinMode (pin_clk,INPUT);
   pinMode (pin_dt,INPUT);
   pinMode (button_pin,INPUT);
    
   // ...et activation de leurs résistances de PULL-UP
   digitalWrite(pin_clk, true);
   digitalWrite(pin_dt, true);
   digitalWrite(button_pin, true);
    
   // Lecture initiale de Pin_CLK
   Pin_clk_Letzter = digitalRead(pin_clk);   
   Serial.begin (115200);
 } 
 
// Le programme vérifie si un changement des états des broches a eu lieu, 
// et selon la broche qui est modifiée en premier, détermine le sens de rotation.
// Cette information est obtenue par la comparaison des signaux présents sur les 2 sorties.
// Une fois que la direction a été déterminée, on compte les mouvements depuis la position
// de départ et on les envoie vers la sortie série.
// Une pression sur le bouton de l'encodeur réinitialise la position actuelle.
 
void loop()
{ 
   // Lecture des statuts actuels
   Pin_clk_Aktuell = digitalRead(pin_clk);
    
   // Vérification de changement
   if (Pin_clk_Aktuell != Pin_clk_Letzter)
   { 
          
        if (digitalRead(pin_dt) != Pin_clk_Aktuell) 
        {  
            // Pin_CLK a changé en premier
            Compteur ++;
            Direction = true;
        } 
          
        else
        {       // Sinon Pin_DT achangé en premier
            Direction = false;
            Compteur--;
        }
        Serial.println ("Rotation detectee: ");
        Serial.print ("Sens de rotation: ");
         
        if (Direction)
        {
           Serial.println ("dans le sens des aiguilles d'une montre");
        }
        else
        {
           Serial.println("dans le sens contraire des aiguilles d'une montre");
        }
         
        Serial.print("Position actuelle: ");
        Serial.println(Compteur);
        Serial.println("------------------------------");
          
   } 
    
   // Préparation de la prochaine exécution:
   Pin_clk_Letzter = Pin_clk_Aktuell;
    
   // fonction Reset remise à la position actuelle
   if (!digitalRead(button_pin) && Compteur!=0)
     {
       Compteur = 0;
       Serial.println("Position reset");
     }
      
 } 

Téléchargement d'un exemple de programme

KY040-Arduino.zip

Exemple de code Raspberry Pi

Affectation des broches Raspberry Pi

Raspberry Pi Capteur
GPIO 14 [Pin 8] Bouton
3,3V [Pin 1] +V
Masse [Pin 6] GND
GPIO 16 [Pin 36] CLK
GPIO 15 [Pin 10] DT

Si un changement d'état de la broche s'est produit, le programme vérifie laquelle des deux broches a changé en premier, ce qui indique le sens de rotation. Cette information est obtenue en comparant l'une des deux valeurs de la broche d'une manche précédente avec la valeur de la manche actuelle.

Une fois la direction déterminée, les pas depuis la position de départ sont comptés et édités. Appuyer sur le bouton de l'encodeur réinitialise la position actuelle.

#!/usr/bin/python
# coding=utf-8
 
# Les modules nécessaires sont importés et mis en place
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
 
# Déclaration des broches d'entrée auxquelles est raccordé le capteur
PIN_CLK = 16
PIN_DT = 15
BUTTON_PIN = 14
 
GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
# Les variables nécessaires sont initialisées
Counter = 0
Direction = True
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
delayTime = 0.01
 
# Lecture initiale de Pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)
 
# Cette fonction de sortie est exécutée par détection d'un signal
def ausgabeFunktion(null):
    global Counter
 
    PIN_CLK_AKTUELL = GPIO.input(PIN_CLK)
 
    if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:
 
        if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL:
            Counter += 1
            Direction = True;
        else:
            Direction = False
            Counter = Counter - 1
 
        print("Rotation détectée: ")
 
        if Direction:
            print("Sens de rotation: sens des aiguilles d'une montre")
        else:
            print("Sens de rotation: sens contraire des aiguilles d'une montre")
 
        print("Position actuelle: ", Counter)
        print("------------------------------")
 
def CounterReset(null):
    global Counter
 
    print("Position remise à 0!")
    print("------------------------------")
    Counter = 0
 
# Pour intégrer directement un temps de stabilisation, on initialise
# les GPIO au moyen de l'option CallBack
GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=50)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50)
 
 
print("Sensor-Test [Appuyez sur Ctrl + C pour terminer le test]")
 
# Boucle de programme principale
try:
        while True:
            time.sleep(delayTime)
 
# réinitialisation de tous les GPIO en entrées
except KeyboardInterrupt:
        GPIO.cleanup()

Exemple de téléchargement de programme

KY040-RPi.zip

Pour commencer avec la commande :

sudo python3 KY040-RPi.py

Exemple de code Micro:Bit

Affectation des connexions Micro:Bit :

Micro:Bit Capteur
3V +V
Masse GND
Pin 1 CLK
Pin 2 DT
Pin 0 Bouton

C'est un exemple MakeCode pour Micro:Bit qui fait essentiellement la même chose que les exemples pour les deux autres variantes. Cependant, cet exemple est plus proche de celui du Raspberry Pi que de celui de l'Arduino.

Téléchargement d'un exemple de programme

microbit-KY-040.zip