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


    0 0 votes
    Article Rating
    Abonnieren
    Benachrichtige mich bei

    Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

    10 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    Kleiner Hinweis
    3 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
    3 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
    3 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
    3 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
    4 Jahre zuvor

    „int val;“ ist überflüßig

    Matthias
    4 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ß
    5 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