zurück

Drehgeber - Rotary Encoder

08.11.2018

Drehgeber oder auch Inkrementalgeber werden Sensoren zur Erfassung von Lageänderungen (linear) oder Winkeländerungen (rotierend) bezeichnet, die Wegstrecke und Wegrichtung bzw. Winkelveränderung und Drehrichtung erfassen können. In unserem Fall wird eine Winkeländerung gemessen:

Rotary Encoder-Modul für Arduino

Funktionsweise

Der Drehgeber hat im Gegenstatz zum Potentiometer keinen Start- und Endpunkt. Er lässt sich unbegrenzt in beide Richtungen drehen. Daher kann man auch seine Position nicht direkt abfragen, sondern nur die Impulse, die er beim Drehen abgibt. Einige Drehgeber haben auch noch Zusätzlich einen Knopf.
Zum Auswerten werden zwei Signale geliefert, anhand derer man ermitteln kann, ob und in welche Richtung der Encoder gerade gedreht wird. Je nachdem ob nach dem Signal des Anschlusses S1 eine steigende oder fallende Flanke auf S2 folgt ist die Drehrichtung entweder im oder gegen den Uhrzeigersinn.

Signalflanken beim Drehgeber im Uhrzeigersinn
Abb.: Signalflanken beim Drehgeber im Uhrzeigersinn
Signalflanken beim Drehgeber gegen den Uhrzeigersinn
Abb.: Signalflanken beim Drehgeber gegen den Uhrzeigersinn

Verwendete Bauteile

Aufbau der Schaltung

Aufbau der Schaltung auf dem Breadboard
Abb.: Bei diesem Schaltungsaufbau fehlen die GND- und Vcc-Anschlüsse, da das Bauteil im Editor nicht vorhanden war, jedoch müssen in der richtigen Schaltung Masse und 5V mit diesen Anschlüssen auf dem Drehgeber richtig verschaltet werden.

Sketch 1

Der folgende Sketch erkennt die Drehrichtung bzw. den Knopfdruck und gibt das Ergebnis in der seriellen Konsole aus.

byte value, valueOld;
int encoderValue = 0;

#define PIN_S1 3
#define PIN_S2 2
#define PIN_KEY 7

void setup()
{
    pinMode(PIN_S1, INPUT);
    pinMode(PIN_S2, INPUT);
    pinMode(PIN_KEY, INPUT);
    Serial.begin(9600);

    valueOld = digitalRead(PIN_S1);
}

void loop()
{
    if (digitalRead(PIN_KEY) == LOW) {
        Serial.println ("Key pressed");
    }

    value = digitalRead(PIN_S1);
    if (value != valueOld) {
        if (digitalRead(PIN_S2) != value) {
            encoderValue++;
        } else {
            encoderValue--;
        }
        valueOld = value;
        Serial.println (encoderValue);
    }
}
Ausgabe des Ergebnisses in der seriellen Konsole
Abb.: Ausgabe des Ergebnisses in der seriellen Konsole

Sketch 2

Zwei LEDs werden mit dem Drehgeber gesteuert.

#define PIN_S1 2
#define PIN_S2 3
#define PIN_KEY 7

#define PIN_LED_GREEN 9
#define PIN_LED_RED   10

byte value, valueOld, ledMask = 0;

void setup()
{
    pinMode(PIN_S1, INPUT);
    pinMode(PIN_S2, INPUT);
    pinMode(PIN_KEY, INPUT);
    pinMode(PIN_LED_GREEN, OUTPUT);
    pinMode(PIN_LED_RED, OUTPUT);

    valueOld = digitalRead(PIN_S1);
}

void loop()
{
    if (digitalRead(PIN_KEY) == LOW) {
        ledMask |= B00000011;
    }

    value = digitalRead(PIN_S1);
    if (value != valueOld) {
        if (digitalRead(PIN_S2) != value) {
            ledMask = 0;
            ledMask |= B00000001;
        } else {
            ledMask = 0;
            ledMask |= B00000010;
        }
        valueOld = value;
    }

    digitalWrite(PIN_LED_GREEN, LOW);
    digitalWrite(PIN_LED_RED, LOW);
    if (ledMask & B00000001) {
        digitalWrite(PIN_LED_RED, HIGH);
    }
    if (ledMask & B00000010) {
        digitalWrite(PIN_LED_GREEN, HIGH);
    }
}