Arduino - Drehencoder

In diesem Tutorial lernen wir, wie man den Inkrementalgeber mit Arduino verwendet. Im Detail werden wir lernen:

Erforderliche Hardware

1×Arduino Uno R3
1×USB 2.0 Kabel Typ A/B (für USB-A PC)
1×USB 2.0 Kabel Typ C/B (für USB-C PC)
1×Drehgeber
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V3 Starter-Kit (Arduino enthalten)
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 Drehgeber

Ein Drehgeber ist ein elektromechanisches Gerät, das Rotationsbewegung in ein elektrisches Signal umwandelt. Es misst die Rotation und die Position einer Welle oder eines Knopfes. Es gibt zwei Haupttypen:

  • Inkrementaler Encoder: Er erzeugt Impulse, um relative Änderungen zu messen.
  • Absolutencoder: Er liefert für jede Position einen eindeutigen digitalen Code, was ihn ideal für eine präzise Positionierung auch nach einem Spannungsverlust macht.

Dieser Leitfaden befasst sich mit dem Inkrementalencoder.

Pinbelegung des Drehencoder-Moduls

Drehencoder-Pinbelegung

Ein Drehencoder-Modul hat 4 Pins:

  • CLK-Pin (Ausgang A): ist der Hauptimpuls, der uns sagt, wie viel Rotation erfolgt ist. Jedes Mal, wenn Sie den Knopf um eine Rastung (Klick) in eine der Richtungen drehen, gibt der CLK-Pin ein Signal aus, das einen vollständigen Zyklus abschließt (LOW HIGH LOW).
  • DT-Pin (Ausgang B): funktioniert wie der CLK-Pin, gibt jedoch ein Signal aus, das dem CLK-Signal um 90 Grad phasenversetzt ist. Es hilft uns, die Drehrichtung zu bestimmen (im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • SW-Pin: ist der Ausgang des Druckknopfs im Encoder. Er ist normalerweise geöffnet. Wenn wir an diesem Pin einen Pull-up-Widerstand verwenden, wird der SW-Pin HIGH sein, wenn der Knopf nicht gedrückt ist, und LOW, wenn er gedrückt wird.
  • VCC-Pin (+): muss mit VCC verbunden werden (zwischen 3,3 V und 5 V)
  • GND-Pin: muss mit GND (0 V) verbunden werden.

Drehencoder vs Potentiometer

Man könnte den Drehencoder mit dem Potentiometer verwechseln, aber sie sind unterschiedliche Bauteile. Hier ist ein Vergleich zwischen ihnen:

  • Der Drehencoder ist wie die moderne Version des Potentiometers, aber er kann mehr Dinge tun.
  • Der Drehencoder kann sich eine vollständige Umdrehung drehen, ohne anzuhalten, während das Potentiometer sich nur etwa drei Viertel einer Umdrehung drehen kann.
  • Der Drehencoder erzeugt Impulse, während das Potentiometer die analoge Spannung ausgibt.
  • Der Drehencoder ist praktisch, wenn man nur herausfinden muss, wie weit sich der Drehknopf gedreht hat, nicht genau, wo er sich befindet. Das Potentiometer ist nützlich, wenn man wirklich genau wissen muss, wo sich ein Drehknopf befindet.

Wie ein Drehencoder funktioniert

Ausgang des Drehencoders

Im Encoder gibt es eine Scheibe mit Schlitzen, die an einen Pin namens C angeschlossen ist, der wie eine gemeinsame Masse fungiert. Es gibt zwei weitere Pins, A und B.

  • Wenn Sie den Drehknopf drehen, berühren die Pins A und B den gemeinsamen Massepin C, aber in einer bestimmten Reihenfolge, abhängig davon, in welche Richtung Sie den Drehknopf drehen (im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • Diese Kontakte erzeugen zwei Signale. Sie unterscheiden sich im Timing, weil ein Pin die Masse früher berührt als der andere. Zwei Signale sind zeitlich um 90 Grad zueinander versetzt. Dies wird Quadraturkodierung genannt.
  • Wenn Sie den Drehknopf im Uhrzeigersinn drehen, berührt Pin A die Masse früher als Pin B. Wenn Sie den Drehknopf gegen den Uhrzeigersinn drehen, berührt Pin B die Masse früher als Pin A.
  • Indem wir überwachen, wann jeder Pin die Masse berührt oder verlässt, können wir herausfinden, in welche Richtung sich der Drehknopf dreht. Das tun wir, indem wir prüfen, was mit Pin B passiert, wenn Pin A seinen Zustand ändert.
Wie ein Drehencoder funktioniert

Wenn A von LOW auf HIGH wechselt:

  • Wenn B LOW ist, wird der Drehknopf im Uhrzeigersinn gedreht.
  • Wenn B HIGH ist, wird der Drehknopf gegen den Uhrzeigersinn gedreht.

※ Notiz:

Pin A und Pin B sind mit den Pins CLK und DT verbunden. Je nach Hersteller kann die Reihenfolge jedoch unterschiedlich sein. Die unten angegebenen Codes wurden mit dem Drehencoder von DIYables getestet.

Wie man einen Drehencoder programmiert

  • Prüfe das Signal am CLK-Pin
  • Wenn der Zustand sich von LOW nach HIGH ändert, prüfe den Zustand des DT-Pins.
    • Wenn der Zustand des DT-Pins HIGH ist, dreht sich der Drehknopf gegen den Uhrzeigersinn, der Zähler wird um 1 erhöht
    • Wenn der Zustand des DT-Pins LOW ist, dreht sich der Drehknopf im Uhrzeigersinn, der Zähler wird um 1 verringert

Verdrahtungsdiagramm

Arduino Drehencoder Verdrahtungsdiagramm

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

Arduino-Code – Drehencoder ohne Interrupt

Der untenstehende Arduino-Code macht Folgendes:

  • Erkennt die Richtung und das Ausmaß der Drehung des Encoders.
    • Wenn festgestellt wird, dass der Drehknopf durch eine Rastung (Klick) im Uhrzeigersinn gedreht wurde, erhöhe den Zähler um eins.
    • Wenn festgestellt wird, dass der Drehknopf durch eine Rastung (Klick) gegen den Uhrzeigersinn gedreht wurde, verringere den Zähler um eins.
  • Erkennt, ob der Knopf gedrückt wird.
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/arduino-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 #define DT_PIN 3 #define SW_PIN 4 #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"); } }

Um den Code für das Entprellen von Tastern zu vereinfachen, wird die ezButton-Bibliothek verwendet.

Schnelle Schritte

  • Installieren Sie die ezButton-Bibliothek in der Arduino IDE. Siehe How To
  • Kopieren Sie den obigen Code und öffnen Sie ihn in der Arduino IDE
  • Klicken Sie auf die Schaltfläche Hochladen in der Arduino IDE, um den Code auf den Arduino hochzuladen
  • Drehen Sie den Knopf zuerst im Uhrzeigersinn, dann gegen den Uhrzeigersinn
  • Drücken Sie den Knopf
  • Sehen Sie das Ergebnis im seriellen 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

Schau dir die Zeilenkommentare im Code an.

Arduino Code – Drehencoder mit Interrupt

Im vorherigen Beispielcode verwenden wir die Polling-Methode, die den Zustand des Pins kontinuierlich überprüft. Dies hat zwei Nachteile:

  • Arduino-Ressourcen verschwenden
  • Einige Zähler könnten übersprungen werden, wenn ein anderer Code lange läuft.

Ein Ansatz, dies zu handhaben, besteht darin, Unterbrechungen zu verwenden. Unterbrechungen eliminieren die Notwendigkeit einer ständigen Überprüfung eines bestimmten Ereignisses. Dadurch kann der Arduino andere Aufgaben ausführen, ohne ein Ereignis zu übersehen.

Hier ist ein Beispiel dafür, wie man einen Drehencoder mit Interrupts ausliest.

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino 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/arduino-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 #define DT_PIN 3 #define SW_PIN 4 #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(); }

Nun, während du den Drehknopf drehst, wirst du feststellen, dass Informationen im Serial Monitor erscheinen, ähnlich wie du sie im früheren Code gesehen hast.

※ Notiz:

  • Wenn Sie den Interrupt verwenden, müssen Sie den CLK-Pin des Encoders mit einem Arduino-Pin verbinden, der Unterbrechungen verarbeiten kann. Aber daran denken: Nicht alle Arduino-Pins können das. Zum Beispiel können beim Arduino Uno nur die Pins 2 und 3 Unterbrechungen verarbeiten.
  • Möglicherweise stoßen Sie auf Tutorials auf anderen Websites, die zwei Interrupts für einen einzelnen Encoder verwenden, aber das ist unnötig und verschwenderisch. Nur ein Interrupt ist ausreichend.
  • Es ist wichtig, das volatile-Schlüsselwort für globale Variablen zu verwenden, die im Interrupt verwendet werden. Das Unterlassen davon könnte zu unerwarteten Problemen führen.
  • Halten Sie den Code im Interrupt so einfach wie möglich. Vermeiden Sie es, innerhalb des Interrupts Serial.print() oder Serial.println() zu verwenden.

Arduino-Drehencoder-Anwendung

Mit dem Drehencoder können wir die folgenden Anwendungen durchführen, aber nicht darauf beschränkt:

  • Arduino - Drehencoder steuert die Position des Servomotors
  • Arduino - Drehencoder steuert die Helligkeit der LED
  • Arduino - Drehencoder steuert die Geschwindigkeit des Schrittmotors

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

※ 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!