Arduino Mega - Rotary Encoder (Drehgeber)

Diese Anleitung zeigt, wie Sie einen Incremental Encoder mit Arduino Mega verwenden. Wir behandeln:

Arduino Mega rotary encoder

Benötigte Hardware

1×Arduino Mega
1×USB 2.0 Kabel Typ A/B
1×Rotary Encoder (Drehgeber)
1×Jumper Kabel
1×(Empfohlen) Screw Terminal Block Shield for Arduino Uno/Mega
1×(Empfohlen) Breadboard Shield for Arduino Mega
1×(Empfohlen) Enclosure for Arduino Mega

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über Rotary Encoder (Drehgeber)

Ein Rotary Encoder ist ein Gerät, das Drehbewegungen in ein elektrisches Signal umwandelt. Es misst, wie weit sich eine Welle oder ein Knopf gedreht hat und deren Position. Es gibt zwei Haupttypen:

  • Incremental Encoder: Er sendet Impulse zur Verfolgung von Bewegungen.
  • Absolute Encoder: Er gibt einen eindeutigen digitalen Code für jede Position aus, sodass er auch bei ausgeschalteter Stromversorgung die exakte Position anzeigt.

Diese Anleitung behandelt den Incremental Encoder.

Rotary Encoder Modul Pinbelegung

rotary encoder pinout

Ein Rotary Encoder Modul hat vier Pins:

  • CLK Pin (Output A): Sendet bei jeder Drehung des Knopfs um einen Klick in beide Richtungen einen Impuls, von niedrig zu hoch und zurück zu niedrig. Dies zeigt, wie weit sich der Knopf bewegt hat.
  • DT Pin (Output B): Genauso wie CLK, aber der Impuls kommt etwas später—90 Grad nach dem CLK-Impuls. Diese Verzögerung hilft uns zu erkennen, ob die Drehung im oder gegen den Uhrzeigersinn erfolgt.
  • SW Pin: Verbindet sich mit dem eingebauten Druckknopf des Encoders, der normalerweise offen ist. Mit einem Pull-up-Widerstand liest dieser Pin HIGH, wenn er nicht gedrückt wird, und LOW, wenn er gedrückt wird.
  • VCC Pin (+): Verbindung zu einer Stromversorgung von 3,3 bis 5 Volt.
  • GND Pin: Verbindung zur Masse (0V).

Rotary Encoder vs Potentiometer

Sie könnten den Rotary Encoder mit dem Potentiometer verwechseln, aber es sind zwei verschiedene Bauteile. So unterscheiden sie sich:

  • Ein Rotary Encoder kann endlos drehen, aber ein Potentiometer kann nur etwa 3/4 eines Kreises drehen.
  • Ein Rotary Encoder sendet Impulse, während ein Potentiometer eine sich ändernde Spannung liefert.
  • Ein Rotary Encoder hilft Ihnen ungefähr zu wissen, wie weit der Knopf gedreht wurde, aber nicht die exakte Position. Ein Potentiometer gibt die exakte Position des Knopfs an.

Wie der Rotary Encoder funktioniert

rotary encoder output

Im Encoder ist eine runde Scheibe mit Schlitzen mit einem Pin namens C verbunden, welcher die gemeinsame Masse ist. Es gibt auch zwei andere Pins, A und B.

  • Wenn Sie den Knopf drehen, berühren die Pins A und B den gemeinsamen Masse-Pin C in einer bestimmten Reihenfolge. Die Reihenfolge hängt davon ab, ob Sie im oder gegen den Uhrzeigersinn drehen.
  • Diese Berührung erzeugt zwei Signale, die etwas außer Tritt sind, weil ein Pin vor dem anderen zur Masse geht. Die Signale sind um 90 Grad phasenverschoben. Diese Methode wird Quadratur-Kodierung genannt.
  • Drehung im Uhrzeigersinn: Pin A erreicht die Masse vor Pin B. Drehung gegen den Uhrzeigersinn: Pin B erreicht die Masse vor Pin A.
  • Indem wir beobachten, wann jeder Pin den Kontakt zur Masse herstellt oder unterbricht, können wir erkennen, in welche Richtung sich der Knopf dreht. Wir bestimmen die Richtung, indem wir schauen, wie sich Pin B relativ zu Pin A ändert.
How rotary encoder works

Wenn A von niedrig zu hoch wechselt:

  • Drehen Sie den Knopf nach rechts, wenn B niedrig ist.
  • Drehen Sie den Knopf nach links, wenn B hoch ist.

※ Notiz:

Die Pins A und B verbinden sich mit den CLK- und DT-Pins. Die Konfiguration kann je nach Hersteller variieren. Die hier gezeigten Codes wurden mit dem Rotary Encoder von DIYables getestet.

Programmierung für Rotary Encoder

  • Überprüfen Sie das Signal am CLK-Pin.
  • Wenn das Signal von niedrig zu hoch wechselt, überprüfen Sie den DT-Pin.
  • Wenn der DT-Pin hoch ist, wurde der Knopf gegen den Uhrzeigersinn (nach links) bewegt. Addieren Sie 1 zum Zähler.
  • Wenn der DT-Pin niedrig ist, wurde der Knopf im Uhrzeigersinn (nach rechts) bewegt. Subtrahieren Sie 1 vom Zähler.

Schaltplan

Arduino Mega rotary encoder Wiring Diagram

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Arduino Mega Code – Rotary Encoder ohne Interrupt

Dieser Arduino Mega Code macht folgende Dinge:

  • Er erkennt, wie weit der Knopf gedreht wird.
  • Wenn der Knopf eine Raste nach rechts gedreht wird, addiert er eins zum Zähler.
  • Wenn der Knopf eine Raste nach links gedreht wird, subtrahiert er eins vom Zähler.
  • Er erkennt, wenn der Button gedrückt wird.
/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-mega/arduino-mega-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino Mega pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino Mega pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino Mega pin connected to the SW pin of encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object that attach to pin 4 void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // read the initial state of the rotary encoder's CLK pin prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); // MUST call the loop() function first // read the current state of the rotary encoder's CLK pin CLK_state = digitalRead(CLK_PIN); // If the state of CLK is changed, then pulse occurred // React to only the rising edge (from LOW to HIGH) to avoid double count if (CLK_state != prev_CLK_state && CLK_state == HIGH) { // if the DT state is HIGH // the encoder is rotating in counter-clockwise direction => decrease the counter if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } Serial.print("DIRECTION: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" | COUNTER: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Wir verwenden die ezButton-Bibliothek, um den Button-Code einfacher zu gestalten und Mehrfachdruck zu vermeiden.

Schnelle Schritte

Folgen Sie diesen Schritten nacheinander.

  • Verbinden Sie den Rotary Encoder mit dem Arduino Mega wie im Diagramm gezeigt.
  • Verbinden Sie den Arduino Mega über ein USB-Kabel mit Ihrem Computer.
  • Öffnen Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das Arduino Mega Board und den korrekten COM-Port.
  • Installieren Sie die ezButton-Bibliothek in der Arduino IDE. Für die Schritte besuchen Sie https://arduinogetstarted.com/tutorials/arduino-button-library#content_how_to_install
  • Kopieren Sie den angegebenen Code und öffnen Sie ihn in der Arduino IDE.
  • Klicken Sie auf die Upload-Schaltfläche in der Arduino IDE, um den Code zum Arduino Mega zu senden.
  • Drehen Sie den Knopf im Uhrzeigersinn, dann gegen den Uhrzeigersinn.
  • Drücken Sie den Knopf.
  • Überprüfen Sie die Ergebnisse im Serial Monitor.
COM6
Send
DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Clockwise | COUNTER: 4 DIRECTION: Clockwise | COUNTER: 5 DIRECTION: Counter-clockwise | COUNTER: 4 DIRECTION: Counter-clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 DIRECTION: Counter-clockwise | COUNTER: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code-Erklärung

Lesen Sie die Kommentare im Code für jede Zeile.

Arduino Mega Code – Rotary Encoder mit Interrupt

Im vorherigen Code-Beispiel haben wir Polling verwendet, das ständig den Pin-Zustand überprüft. Dieser Ansatz hat zwei Nachteile:

  • Schlechte Nutzung der Arduino Mega Ressourcen.
  • Einige Zählungen könnten übersprungen werden, wenn ein anderes Programm zu langsam läuft.

Eine Lösung hierfür sind Interrupts. Interrupts ersparen Ihnen die ständige Überprüfung auf ein bestimmtes Ereignis. Dies ermöglicht es dem Arduino Mega, andere Aufgaben zu erledigen, während er trotzdem auf Ereignisse achtet.

Schauen wir uns den folgenden Code an, der einen Interrupt verwendet, um den Encoder-Wert zu lesen.

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino-mega/arduino-mega-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino Mega pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino Mega pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino Mega pin connected to the SW pin of encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); // create ezButton object that attach to pin 4 void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // use interrupt for CLK pin is enough // call ISR_encoderChange() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("DIRECTION: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" | COUNTER: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here } void ISR_encoderChange() { if ((millis() - last_time) < 50) // debounce time is 50ms return; if (digitalRead(DT_PIN) == HIGH) { // the encoder is rotating in counter-clockwise direction => decrease the counter counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } last_time = millis(); }
  • Kopieren Sie den angegebenen Code und öffnen Sie ihn in der Arduino IDE.
  • Klicken Sie auf die Upload-Schaltfläche in der Arduino IDE, um den Code zum Arduino Mega hochzuladen.

Wenn Sie nun den Knopf drehen, werden Sie Informationen im Serial Monitor sehen, genau wie beim vorherigen Code.

※ Notiz:

  • Um den CLK-Pin des Encoders mit einem Interrupt an einen Arduino Mega anzuschließen, verwenden Sie Pin 2 oder 3. Dies sind die einzigen Pins, die Interrupts verarbeiten können.
  • Einige Online-Anleitungen sagen, Sie sollten zwei Interrupts für einen Encoder verwenden, aber das ist nicht nötig. Ein Interrupt reicht aus.
  • Deklarieren Sie alle globalen Variablen, die im Interrupt verwendet werden, als volatile, um Probleme zu vermeiden.
  • Halten Sie den Code innerhalb des Interrupts einfach. Verwenden Sie dort nicht Serial.print() oder Serial.println().

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Funktionsreferenzen

Verwandte Tutorials

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!