Read a KY-040 rotary encoder with an Arduino

FunduinoLast updated on

Drehrichtung und Schritte auslesen – mit Interrupt für den Taster

Wie funktioniert der Encoder?

Der Rotary Encoder KY-040 ist im Grunde ein rotierendes Eingabemodul, das einem Potentiometer stark ähnelt. Seine Besonderheit: Du kannst relativ simpel auslesen, in welche Richtung du den Knopf gedreht hast und wie viele Schritte dabei zurückgelegt wurden. Die einzelnen Schritte spürst du beim Drehen auch.

Die Pins heißen A, B und C. Dabei sind jeweils Pin A und Pin C sowie Pin B und Pin C miteinander verbunden. In jeder Encoder-Position sind beide Verbindungen entweder geöffnet oder geschlossen. Drehst du den Knopf in eine beliebige Richtung, verändert sich der Status: Sind beide Verbindungen geschlossen, öffnet die Drehung sie. Sind beide geöffnet, schließt die Drehung sie.

Drehst du im Uhrzeigersinn, ändert sich zuerst der Status zwischen den Pins A und C. Drehst du gegen den Uhrzeigersinn, zuerst der zwischen B und C. Diese Reihenfolge liest der Controller aus und wertet sie aus.

Rotary Encoder KY-040 von oben mit Drehknopf
Der Rotary Encoder KY-040 von oben
Rotary Encoder KY-040 am Arduino verkabelt
Aufbau und Verkabelung des Rotary Encoders
1 / 2

Pinbelegung

Der Rotary Encoder KY-040 hat fünf Pins:

  • CLK (Serial Clock), Daten-Ausgang 1 – an den digitalen Pin 6 des Mikrocontrollers
  • DT, Daten-Ausgang 2 – an den digitalen Pin 5 des Mikrocontrollers
  • SW (Switch) – gibt ein LOW-Signal, wenn du den Knopf drückst. An einen Interrupt-Pin anschließen.
  • + – Spannungsversorgung, an den 5V-Pin des Mikrocontrollers
  • GND – an den GND-Pin des Mikrocontrollers

Eine Übersicht aller Interrupt-Pins findest du auf der offiziellen Seite von Arduino.

CLK und DT kannst du an digitale Pins deiner Wahl anschließen. Im folgenden Sketch sind es D5 und D6.

Beispielsketch

Jetzt liest du die Schrittposition des Encoders aus. Außerdem sollst du erkennen, ob du den Knopf gedrückt hast. Beides lässt du dir im seriellen Monitor anzeigen – unter anderem mit dem Befehl attachInterrupt().

Eine ausführliche Dokumentation dieser Funktion findest du hier.

Achtung: Das Modul KY-040 braucht eine eigene Bibliothek. Du findest die Encoder Library unter github.com/PaulStoffregen/Encoder.

Serieller Monitor mit Schrittpositionen des Encoders
Ausgabe im seriellen Monitor
Schrittposition und Tastendruck auslesen
#include <Encoder.h>    // Verwendung der  Bibliothek
const int CLK = 6;      // Definition der Pins. CLK an D6, DT an D5.
const int DT = 5;
const int SW = 2;       // Der Switch wird mit Pin D2 verbunden. ACHTUNG: Verwende einen Interrupt-Pin!
long altePosition = -999;  // Definition der "alten" Position (Diese fiktive alte Position wird benötigt, damit die aktuelle Position später im seriellen Monitor nur dann angezeigt wird, wenn wir den Rotary Head bewegen)
Encoder meinEncoder(DT,CLK);  // An dieser Stelle wird ein neues Encoder Projekt erstellt. Dabei wird die Verbindung über die zuvor definierten Variablen (DT und CLK) hergestellt.
void setup()   // Beginn des Setups
{
  Serial.begin(9600);
  pinMode(SW, INPUT);   // Hier wird der Interrupt installiert.
  attachInterrupt(digitalPinToInterrupt(SW), Interrupt, CHANGE); // Sobald sich der Status (CHANGE) des Interrupt-Pins (SW = D2) ändert, soll der Interrupt-Befehl ausgeführt werden.
}
void loop()
{
    long neuePosition = meinEncoder.read();  // Die "neue" Position des Encoders wird definiert. Dabei wird die aktuelle Position des Encoders über die Variable.Befehl() ausgelesen.
        if (neuePosition != altePosition)  // Sollte die neue Position ungleich der alten (-999) sein (und nur dann!!)…
        {
        altePosition = neuePosition;
        Serial.println(neuePosition);      // …soll die aktuelle Position im seriellen Monitor ausgegeben werden.
        }
}
void Interrupt() // Beginn des Interrupts. Wenn der Rotary-Knopf betätigt wird, springt das Programm automatisch an diese Stelle. Nachdem…
{
  Serial.println("Switch betaetigt"); //… das Signal ausgegeben wurde, wird das Programm fortgeführt.
}
Rate the instructions

Comments

Ask a question or share an experience

Contact us if something doesn’t work. Please include your board and the error message.

We review every comment before publication. Your email address remains with us.