KY-040 Kodierter Drehschalter (Rotary Encoder)
Wenn der Drehschalter bewegt wird wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben.
- Arduino
- Raspberry Pi
- Raspberry Pi Pico
- Micro:Bit

Wenn der Drehschalter bewegt wird, wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben.
Kodierung
Bei einem Drehschalter ändern sich pro Schritt der Zustand der beiden Ausgänge. Dabei kann die Drehrichtung ermittelt werden, indem geprüft wird, welcher der beiden Zustände sich zuerst geändert hat.
Pin-Belegung
Codebeispiel Arduino
Anschlussbelegung Arduino
Arduino | Sensor |
---|---|
5 V | +V |
GND | GND |
Pin 3 | CLK |
Pin 4 | DT |
Pin 5 | Knopf |
Das Beispielprogramm prüft auf die Änderung der Pin-Zustände und ermittelt die Drehrichtung, sobald eine Drehung erkannt wurde. Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken des Knopfes setzt dabei die Zählung zurück.
// 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

Wenn der Drehschalter bewegt wird, wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben.
Kodierung
Bei einem Drehschalter ändern sich pro Schritt der Zustand der beiden Ausgänge. Dabei kann die Drehrichtung ermittelt werden, indem geprüft wird, welcher der beiden Zustände sich zuerst geändert hat.
Pin-Belegung
Codebeispiel Raspberry Pi
Anschlussbelegung Raspberry Pi
Raspberry Pi | Sensor |
---|---|
GPIO 14 [Pin 8] | Knopf |
3,3 V [Pin 1] | +V |
GND [Pin 6] | GND |
GPIO 16 [Pin 36] | CLK |
GPIO 15 [Pin 10] | DT |
Das Beispielprogramm prüft auf die Änderung der Pin-Zustände und ermittelt die Drehrichtung, sobald eine Drehung erkannt wurde. Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken des Knopfes setzt dabei die Zählung zurück.
# 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
Zu starten mit dem Befehl:
sudo python3 KY040-RPi.py

Wenn der Drehschalter bewegt wird, wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben.
Kodierung
Bei einem Drehschalter ändern sich pro Schritt der Zustand der beiden Ausgänge. Dabei kann die Drehrichtung ermittelt werden, indem geprüft wird, welcher der beiden Zustände sich zuerst geändert hat.
Pin-Belegung
Codebeispiel Micro:Bit
Anschlussbelegung Micro:Bit:
Micro:Bit | Sensor |
---|---|
3 V | +V |
GND | GND |
Pin 1 | CLK |
Pin 2 | DT |
Pin 0 | Knopf |
Das Beispielprogramm prüft auf die Änderung der Pin-Zustände und ermittelt die Drehrichtung, sobald eine Drehung erkannt wurde. Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken des Knopfes setzt dabei die Zählung zurück.

Beispielprogramm Download

Wenn der Drehschalter bewegt wird, wird die Bewegungsrichtung und die aktuelle Position des Drehschalters kodiert über die Ausgänge ausgegeben.
Kodierung
Bei einem Drehschalter ändern sich pro Schritt der Zustand der beiden Ausgänge. Dabei kann die Drehrichtung ermittelt werden, indem geprüft wird, welcher der beiden Zustände sich zuerst geändert hat.
Pin-Belegung
Codebeispiel Raspberry Pi Pico
Anschlussbelegung Raspberry Pi Pico
Raspberry Pi Pico | Sensor |
---|---|
3 V | +V |
GND | GND |
GPIO16 | CLK |
GPIO17 | DT |
GPIO18 | Knopf |
Das Beispielprogramm prüft auf die Änderung der Pin-Zustände und ermittelt die Drehrichtung, sobald eine Drehung erkannt wurde. Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. Ein Drücken des Knopfes setzt dabei die Zählung zurück.
# Bibliotheken laden
from machine import Pin
from time import sleep
# Initialisierung von GPIO16, GPIO17 und GPIO18 als Input
CLK = Pin(16,Pin.IN, Pin.PULL_DOWN)
DT = Pin(17,Pin.IN, Pin.PULL_DOWN)
switch = Pin(18,Pin.IN, Pin.PULL_UP)
# Variablen Definierung
counter = 0
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
Richtung = True
PIN_CLK_LETZTER = CLK.value()
print("----------------------------------------------------")
def ausgabe():
Blue = CLK.value()
Purple = DT.value()
global PIN_CLK_AKTUELL
global counter
global Richtung
# Auslesen des aktuellen Statuses
PIN_CLK_AKTUELL = Blue
# Überprüfung auf Änderung
if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:
# Pin_CLK hat sich zuerst verändert
if Purple != PIN_CLK_AKTUELL:
counter = counter + 1
Richtung = True
# Andernfalls hat sich Pin_DT zuerst verändert
else:
Richtung = False
counter = counter - 1
print("Drehung erkannt: ")
if Richtung:
print("Drehrichtung: Im Uhrzeigersinn")
else:
print("Drehrichtung: Gegen den Uhrzeigersinn")
print("Aktuelle Position: " + str(counter))
print("-------------------------------------------")
# Funktion: Counter Variable wird zurück gesetzt wenn der Knopf gedrückt wird
def CounterReset():
global counter
if switch.value() == 0:
print("Position resetted!")
print("-----------------------")
counter = 0
sleep(0.5)
# Endlosschleife zum konstanten Auslesen des Sensors
while True:
ausgabe()
PIN_CLK_LETZTER = PIN_CLK_AKTUELL
CounterReset()