Zum Inhalt springen
Arduino Encoder Drehimpulsgeber

Arduino und Encoder – Schaltplan, Erklärung, Code

    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.


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


    Arduino Encoder – Uhrzeigersinn
    Arduino Encoder – Gegen Uhrzeigersinn

    Arduino Encoder – Schaltplan

    Arduino Encoder (Drehimpulsgeber) 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


    10 Gedanken zu „Arduino und Encoder – Schaltplan, Erklärung, Code“

    1. Kleiner Hinweis

      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.

    2. Kleiner Hinweis

      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.

    3. 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?

      1. 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).

    4. 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.

      1. 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

    5. 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

      1. 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

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht.

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.