Wenn der Drehschalter bewegt wird wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben und somit benutzbar in anderen Anwendungen.

Kodierung

Die Idee bei einem Drehschalter/Drehgeber ist es, dass zu jedem gedrehten "Schritt", sich der Zustand jeweils immer nur einer der beiden Ausgangs-Pins ändert. Je nachdem welcher der beiden sich zuerst geändert hat, so kann man auf die Drehrichtung schließen, wenn man auf die folgende Kodierung achtet.

Im Uhrzeigersinn [A ändert sich zuerst] -> Pin_CLK

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

Gegen den Uhrzeigersinn [B ändert sich zuerst] -> Pin_DT

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

Pin-Belegung

Codebeispiel Arduino

Anschlussbelegung Arduino

Arduino Sensor
5V +V
Masse GND
Pin 3 CLK
Pin 4 DT
Pin 5 Knopf

Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt. Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.

Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.

Für die serielle Ausgabe: Baudrate = 115200

// Initialisierung benötigter Variablen
int Counter = 0; 
boolean Richtung;
int Pin_clk_Letzter;  
int Pin_clk_Aktuell;
 
// Definition der Eingangs-Pins
int pin_clk = 3;  
int pin_dt = 4; 
int button_pin = 5;
  
  
void setup() 
{ 
   // Eingangs-Pins werden initialisiert...
   pinMode (pin_clk,INPUT);
   pinMode (pin_dt,INPUT);
   pinMode (button_pin,INPUT);
    
   // ...und deren Pull-Up Widerstände aktiviert
   digitalWrite(pin_clk, true);
   digitalWrite(pin_dt, true);
   digitalWrite(button_pin, true);
    
   // Initiales Auslesen des Pin_CLK
   Pin_clk_Letzter = digitalRead(pin_clk);   
   Serial.begin (115200);
 } 
 
// Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden
// Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.
// Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen
// Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.
// Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.
// Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.
 
void loop()
{ 
   // Auslesen des aktuellen Statuses  
   Pin_clk_Aktuell = digitalRead(pin_clk);
    
   // Überprüfung auf Änderung
   if (Pin_clk_Aktuell != Pin_clk_Letzter)
   { 
          
        if (digitalRead(pin_dt) != Pin_clk_Aktuell) 
        {  
            // Pin_CLK hat sich zuerst verändert
            Counter ++;
            Richtung = true;
        } 
          
        else
        {       // Andernfalls hat sich Pin_DT zuerst verändert
            Richtung = false;
            Counter--;
        }
        Serial.println ("Drehung erkannt: ");
        Serial.print ("Drehrichtung: ");
         
        if (Richtung)
        {
           Serial.println ("Im Uhrzeigersinn");
        }
        else
        {
           Serial.println("Gegen den Uhrzeigersinn");
        }
         
        Serial.print("Aktuelle Position: ");
        Serial.println(Counter);
        Serial.println("------------------------------");
          
   } 
    
   // Vorbereitung für den nächsten Druchlauf:
   // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
   Pin_clk_Letzter = Pin_clk_Aktuell;
    
   // Reset-Funktion um aktuelle Position zu speichern
   if (!digitalRead(button_pin) && Counter!=0)
     {
       Counter = 0;
       Serial.println("Position resettet");
     }
      
 }

Beispielprogramm Download

KY040-Arduino.zip

Codebeispiel Raspberry Pi

Anschlussbelegung Raspberry Pi

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

Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt. Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.

Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.

# coding=utf-8
# Benoetigte Module werden importiert und eingerichtet
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
 
# Hier werden die Eingangs-Pins deklariert, an dem der Sensor angeschlossen ist.
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)
 
# Benötigte Variablen werden initialisiert
Counter = 0
Richtung = True
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
delayTime = 0.01
 
# Initiales Auslesen des Pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)
 
# Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrt
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
            Richtung = True;
        else:
            Richtung = False
            Counter = Counter - 1
 
        print ("Drehung erkannt: ")
 
        if Richtung:
            print ("Drehrichtung: Im Uhrzeigersinn")
        else:
            print ("Drehrichtung: Gegen den Uhrzeigersinn")
 
        print ("Aktuelle Position: ", Counter)
        print ("------------------------------")
 
def CounterReset(null):
    global Counter
 
    print ("Position resettet!")
    print ("------------------------------")
    Counter = 0
 
# Um einen Debounce direkt zu integrieren, werden die Funktionen zur Ausgabe mittels
# CallBack-Option vom GPIO Python Modul initialisiert
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 [druecken Sie STRG+C, um den Test zu beenden]")
 
# Hauptprogrammschleife
try:
    while True:
        time.sleep(delayTime)
 
# Aufraeumarbeiten nachdem das Programm beendet wurde
except KeyboardInterrupt:
    GPIO.cleanup()

Beispielprogramm Download

KY040-RPi.zip

Zu starten mit dem Befehl:

sudo python3 KY040-RPi.py

Codebeispiel Micro:Bit

Anschlussbelegung Micro:Bit:

Micro:Bit Sensor
3V +V
Masse GND
Pin 1 CLK
Pin 2 DT
Pin 0 Knopf

Hierbei handelt es sich um ein MakeCode Beispiel für Micro:Bit welches essenziel das gleiche macht wie die Beispiele der anderen beiden Varianten. Jedoch ist dieses Beispiel eher näher an das Beispiel des Raspberry Pi angelehnt als an das Beispiel des Arduino.

Beispielprogramm Download

microbit-KY-040