Arduino Encoder Tutorial: Rotary Encoder auslesen & steuern

Heute zeige ich dir, wie du einen Rotary Encoder (Drehimpulsgeber) mit dem Arduino ausließt und für deine Projekte nutzen kannst. Ein Arduino Encoder ist ein vielseitiges Bauteil, das dir unbegrenzte Drehbewegungen ermöglicht – im Gegensatz zu einem Potentiometer, das nur einen begrenzten Drehwinkel hat.

Was ist ein Rotary Encoder?

Ein Rotary Encoder ist ein elektromechanisches Bauteil, das Drehbewegungen in digitale Signale umwandelt. Anders als ein Potentiometer kannst du ihn unendlich oft in beide Richtungen drehen. Er liefert digitale Impulse, die der Arduino zählen und auswerten kann.


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


Typische Anwendungen:

  • Lautstärkeregler in Audio-Projekten
  • Menünavigation in Display-Anwendungen
  • Präzise Steuerung von Robotern
  • Einstellungen für LED-Helligkeit oder Motorgeschwindigkeit

In diesem Tutorial lernst du die Grundlagen des Arduino Encoders kennen, wie du ihn verkabelst und mit zwei verschiedenen Code-Varianten ausließt – einmal manuell zum Verstehen des Prinzips und einmal mit einer professionellen Bibliothek für maximale Zuverlässigkeit.

Diese Bauteile brauchst du

Wie funktioniert ein Rotary Encoder?

Bevor du mit der Verkabelung beginnst, solltest du das Grundprinzip verstehen. Ein Rotary Encoder hat zwei Ausgangskontakte (A und B), die beim Drehen versetzt schalten. Diese Phasenverschiebung zwischen den Signalen ermöglicht es, die Drehrichtung zu erkennen.

Das Funktionsprinzip im Detail:

Bei einer Drehung im Uhrzeigersinn schaltet Signal A vor Signal B:

Arduino Encoder Drehung im Uhrzeigersinn - Signalverlauf von Pin A und B

Bei einer Drehung gegen den Uhrzeigersinn schaltet Signal B vor Signal A:

Arduino Encoder Drehung gegen den Uhrzeigersinn - Signalverlauf von Pin A und B

Der Arduino erkennt die Drehrichtung, indem er die Reihenfolge der Signalwechsel auswertet. Durch das Zählen der Impulse kann ich die aktuelle Position bestimmen. Pull-Up-Widerstände (entweder im Encoder-Modul oder im Arduino aktiviert) sorgen dafür, dass die Signale stabil auf HIGH-Pegel liegen, wenn kein Kontakt besteht.

Verkabelung des Arduino Encoders

Die Verkabelung ist erfreulich einfach. Ich zeige dir jetzt, wie du den Rotary Encoder mit deinem Arduino verbindest:

Anschluss-Schema:

  • CLK (Clock/Pin A) → Arduino Pin 2
  • DT (Data/Pin B) → Arduino Pin 3
  • SW (Switch) → Lassen wir zunächst frei (für spätere Projekte mit Taster-Funktion)
  • + (VCC) → 5V (bei Modulen mit separater Stromversorgung)
  • GND → GND

Wichtige Hinweise zur Verkabelung:

Ich empfehle dir, die Pins 2 und 3 zu verwenden, weil diese Hardware-Interrupts unterstützen. Das sorgt für die beste Performance und zuverlässigste Erkennung. Bei Encoder-Modulen ohne separate Stromversorgung aktivierst du im Code einfach die internen Pull-Up-Widerstände mit INPUT_PULLUP.

Halte die Kabelverbindungen möglichst kurz, um Störsignale zu vermeiden und stabile Messwerte zu erhalten.

Arduino Encoder Verkabelung - Rotary Encoder mit Arduino Uno verbinden

Der Arduino Encoder Code

Ich stelle dir zwei Varianten vor: Eine einfache Version ohne Bibliothek, mit der du das Grundprinzip verstehst, und eine professionelle Variante mit der Encoder-Bibliothek für maximale Zuverlässigkeit.

Variante 1: Einfache Version ohne Bibliothek

Diese Version eignet sich perfekt, wenn du verstehen möchtest, wie die Encoder-Auswertung im Detail funktioniert:

int encoderPinA = 2;
int encoderPinB = 3;
int encoderPos = 0;
int encoderPinALast = LOW;
int encoderPinANow = LOW;

void setup() {
  pinMode (encoderPinA, INPUT_PULLUP);
  pinMode (encoderPinB, INPUT_PULLUP);
  Serial.begin (115200);
}

void loop() {
  encoderPinANow = digitalRead(encoderPinA);
  if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
    if (digitalRead(encoderPinB) == HIGH) {
      encoderPos++;
    } else {
      encoderPos--;
    }
    Serial.println(encoderPos);
  }
  encoderPinALast = encoderPinANow;
}

So funktioniert dieser Code:

Der Code liest kontinuierlich den Zustand von Pin A in die Variable encoderPinANow. Wenn ich eine fallende Flanke erkenne (Übergang von HIGH zu LOW), werte ich den aktuellen Zustand von Pin B aus:

  • Ist Pin B HIGH → Du drehst im Uhrzeigersinn → Position wird erhöht (encoderPos++)
  • Ist Pin B LOW → Du drehst gegen den Uhrzeigersinn → Position wird verringert (encoderPos--)

Die aktuelle Position gibst du über den Serial Monitor aus, den du mit 115200 Baud öffnen kannst.

Variante 2: Mit Encoder-Bibliothek (empfohlen!)

Für echte Projekte empfehle ich dir die Encoder-Bibliothek von Paul Stoffregen. Sie bietet deutlich bessere Performance und Zuverlässigkeit.

Installation der Bibliothek:

  1. Öffne die Arduino IDE
  2. Gehe zu Sketch → Bibliothek einbinden → Bibliotheken verwalten
  3. Suche nach „Encoder“ (von Paul Stoffregen)
  4. Klicke auf „Installieren“

Der Code mit Bibliothek:

/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(2, 3);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(115200);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
}

Vorteile der Bibliothek:

  • Nutzt Hardware-Interrupts optimal aus
  • Erkennt auch sehr schnelle Drehbewegungen zuverlässig
  • Deutlich einfachere Implementierung
  • Praktisch keine verpassten Impulse mehr

Code hochladen und testen:

  1. Kopiere den Code in die Arduino IDE
  2. Wähle das richtige Board und den richtigen Port aus
  3. Klicke auf „Hochladen“
  4. Öffne den Serial Monitor (Baudrate: 115200)
  5. Drehe den Encoder und beobachte die Werte

Du wirst sofort sehen, wie präzise die Erkennung funktioniert!

Fazit: Arduino Encoder erfolgreich einsetzen

Du hast jetzt gelernt, wie du einen Rotary Encoder mit dem Arduino ausließt und in deinen Projekten nutzen kannst. Ich habe dir zwei Varianten gezeigt: eine einfache manuelle Auswertung zum Verständnis des Grundprinzips und die professionelle Lösung mit der Encoder-Bibliothek.

Zusammenfassung:

  • Rotary Encoder ermöglichen präzise Erkennung von Drehbewegungen in beide Richtungen
  • Die manuelle Variante hilft dir, das Funktionsprinzip zu verstehen
  • Die Encoder-Bibliothek empfehle ich dir für alle ernsthaften Projekte
  • Vielseitig einsetzbar: von Lautstärkereglern über Menüsteuerungen bis zur Robotik

Deine nächsten Schritte:

Jetzt kannst du den Arduino Encoder in vielfältiger Weise erweitern:

  • Nutze den SW-Pin für die integrierte Taster-Funktion
  • Begrenze die Werte (z.B. 0-100 für Prozentanzeigen)
  • Kombiniere den Encoder mit einem LED-Ring oder OLED-Display zur visuellen Darstellung
  • Setze ihn für die Menünavigation in größeren Projekten ein

Probleme lösen (Troubleshooting):

  • Encoder zählt in die falsche Richtung: Tausche Pin A und B in der Verkabelung oder im Code
  • Werte springen unkontrolliert: Verbessere die Verkabelung oder füge Entstörkondensatoren (100nF) zwischen Signal und GND hinzu
  • Keine Ausgabe im Serial Monitor: Prüfe die Baudrate (muss 115200 sein)

Viel Erfolg mit deinem Arduino Encoder Projekt! Du wirst sehen, wie vielseitig du dieses kleine Bauteil einsetzen kannst.


Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

  • Die beliebtesten Arduino-Projekte von StartHardware
  • Inklusive Schaltplan, Beschreibung und Code
  • Arduino-Schnellstart-Kapitel
  • Kompakter Programmierkurs


0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
10 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
Kleiner Hinweis
4 Jahre zuvor

Ah sorry. Die Zeitachse im zweiten Bild ist von Rechts nach Links zu lesen.
So stimmt es natürlich.
Hätte die beiden untereinanderliegenden Darstellungen zunächst beide von links nach Rechts gelesen.
Oszillogramme lese ich eher so.

Kleiner Hinweis
4 Jahre zuvor

ich glaube, die Skizze mit dem Phasendiagramm ist nicht korrekt
Der dargestellte Phasenverlauf ist gleich nur die Detektionspunkte sind unterschiedlich eingezeichnet. Die Drehrichtung würde aber bei beiden Diagrammen in die gleiche Richtung zeigen.

Joerg
4 Jahre zuvor

Hi,

der Code ohne lib (ohne Interrupts) funktioniert wunderbar. Wenn ich ihn allerdings in mein Projekt integriere, gibt er zwar noch Werte aus, aber das hoch-und runterzählen funktioniert eigentlich überhaupt nicht mehr. Warum? Dazu muss ich sagen, dass in meiner loop() noch eine paar andere Sachen ablaufen. Ist der Abfrage Code sehr zeitkritisch?

Peter
Antworte an  Joerg
4 Jahre zuvor

Du solltest den Encoder mit Interrupts verwenden. Wenn in der loop() noch weitere Sachen laufen, bekommst du timing-Probleme (wie du ja bereits festgestellt hast).

kolaha
5 Jahre zuvor

„int val;“ ist überflüßig

Matthias
5 Jahre zuvor

Hallo Stefan,
ist weist du wie man auch andere Pins beim Arduino (MEGA) verwenden kann. Da einfach Umstecken und andere Pins im Code eingeben nicht geht es muss scheinbar etwas mit Pin 2&3 zu tun haben.
Brauche für mein Projekt 2 Encoder.
Würde mich sehr freuen danke für den super Artikel.

Michael Kleß
6 Jahre zuvor

Hallo Stefan,
besten Dank für deine / Ihre super Information.
Mir ist noch aufgefallen, dass beim einfachen Arduino Encoder – Beispiel die Angabe der PINs verrutscht ist. Im Code und Bild sind es PIN 2 & 3. In der Beschreibung dazwischen 3 & 4.
Grüße

10
0
Ich würde mich über deine Meinung freuen.x