Arduino Encoder: Rotary Encoder oder auch Dreh-Impulsgeber sehen aus wie Potentiometer. Man kann sie aber unendlich drehen. Manche Leute nennen sie deshalb auch Endlos-Potentiometer. Technisch funktionieren sie aber ganz anders.
Im Innern eines Encoders (Impulsgebers) sind zwei Taster integriert. Sie schalten um einen halben Klick phasenverschoben.
Detektiert man auf dem Kanal 1 (also vom ersten Taster) einen Wechsel von LOW zu HIGH prüft man, ob Kanal 2. Ist dieser LOW, wurde in die eine Richtung gedreht, ist er HIGH, wurde er in die andere Richtung gedreht.
Arduino Encoder – Schaltplan
Vom GND des Arduinos in den mittleren Anschluss des Encoders, die äußeren Anschlüsse sind mit den Arduino-Pins 2 und 3 verbunden.
Code (Einfache Version)
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; }
Encoder mit Programm-Bibliothek
Eine elegante und wesentlich einfachere Herangehensweise ist die Verwendung eine Programm-Bibliothek (Library). Die Encoder-Bibliothek von Paul Stoffregen ist super funktional. Um sie zu installieren, klicke in der Arduino-Software auf Sketch>Bibliothek einbinden>Bibliotheken verwalten und trage im Suchfeld Encoder ein. In der Liste findest du die Bibliothek Encoder by Paul Stoffregen. Installiere die aktuelle Version. Im Menü Datei>Beispiele>Encoder findest du Beispiel-Programme wie dieses:
/* 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); } }
Die Bibliothek übernimmt nun das ganze Encoder-Handling für dich und gibt einfach den aktuellen Wert aus.
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
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.
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.
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?
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).
“int val;” ist überflüßig
Ha! Stimmt, danke :-)
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.
Hi Matthias, das ist echt komisch. Beim Mega sollten mit der Encoder-Library auf jeden Fall folgende Pins funktionieren: 2, 3, 18, 19, 20, 21 Probier mal die anderen aus. Liebe Grüße Stefan
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
Hallo Michael, vielen Dank für den Hinweis und die netten Worte. Hab es im Text geändert, jetzt sollte es passen. Liebe Grüße Stefan