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:
Der Drehgeber hat im Gegensatz 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.
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);
}
}
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);
}
}
zurück