ESP32 - Drehencoder

In diesem Leitfaden lernen Sie, wie man den Drehencoder mit einem ESP32 verwendet. Hier ist, was wir lernen werden:

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Drehgeber
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 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 Drehencoder

Ein drehender Knopf, wie bei einem Radio, kann Signale senden, die sich in Elektrizität umwandeln. Es hilft uns zu wissen, wie weit er gedreht wurde und wo er platziert ist. Es gibt zwei Haupttypen:

  • Inkrementalencoder: Dieser verwendet schnelle Signale, um zu messen, wie stark sich die Position eines Objekts verändert hat.
  • Absolutencoder: Diese Art liefert für jeden Punkt einen Geheimcode, der dabei hilft, die Position eines Objekts zu bestimmen, selbst wenn die Stromversorgung ausfällt.

Diese Lektion handelt hauptsächlich vom ersten Typ, dem inkrementellen Encoder.

Pinbelegung des Drehencoder-Moduls

Drehencoder-Pinbelegung

Ein Drehencoder-Modul hat vier Pins:

  • CLK-Pin (Ausgang A): ist der Hauptimpuls, der angibt, wie viel Drehung erfolgt ist. Jedes Mal, wenn Sie den Drehknopf um eine Detent (Klick) in eine der Richtungen drehen, gibt der CLK-Pin ein Signal aus, das einen vollständigen Zyklus durchläuft (LOW HIGH LOW).
  • DT-Pin (Ausgang B): verhält sich wie der CLK-Pin, liefert jedoch ein Signal, das dem CLK-Signal um 90 Grad hinterherhinkt. Es hilft uns, die Drehrichtung (im Uhrzeigersinn oder gegen den Uhrzeigersinn) zu bestimmen.
  • SW-Pin: stammt vom Encoder-Knopf. Er ist normalerweise offen. Wenn wir diesem Pin einen Pull-up-Widerstand hinzufügen, ist der SW-Pin HIGH, wenn der Knopf nicht gedrückt ist, und LOW, wenn er gedrückt wird.
  • VCC-Pin (+): muss mit VCC verbunden werden (zwischen 3,3 und 5 Volt)
  • GND-Pin: muss mit GND (0 V) verbunden werden

Drehgeber gegen Potentiometer

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

  • Ein Drehencoder ist wie die moderne Version eines Potentiometers, aber er kann mehr leisten.
  • Ein Drehencoder kann sich in einer vollen Umdrehung drehen, ohne anzuhalten, während ein Potentiometer nur etwa drei Viertel des Kreises drehen kann.
  • Ein Drehencoder erzeugt Impulse, während ein Potentiometer die analoge Spannung ausgibt.
  • Ein Drehencoder ist praktisch, wenn man einfach herausfinden muss, wie weit sich der Drehknopf bewegt hat, nicht genau, wo er sich befindet. Ein Potentiometer ist praktisch, wenn man wirklich genau wissen muss, wo sich der Drehknopf befindet.

Wie ein Drehencoder funktioniert

Drehencoder-Ausgang

Im Encoder befindet sich eine kleine Scheibe mit Schlitzen, die mit einem Pin namens C verbunden ist, der als gemeinsame Masse fungiert. Du hast noch zwei weitere Pins, A und B.

  • Wenn Sie den Drehknopf drehen, berühren die Pins A und B den gemeinsamen Massepin C, aber die Reihenfolge, in der sie ihn berühren, hängt davon ab, in welche Richtung Sie den Drehknopf drehen (entweder im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • Diese Kontakte erzeugen zwei Signale. Sie unterscheiden sich im Timing leicht, weil der eine Pin die Masse früher berührt als der andere. Diese Signale sind um 90 Grad phasenverschoben, was als Quadraturkodierung bezeichnet wird.
  • Wenn Sie den Drehknopf im Uhrzeigersinn drehen, berührt Pin A die Masse früher als Pin B. Wenn Sie ihn gegen den Uhrzeigersinn drehen, trifft Pin B zuerst die Masse, noch bevor Pin A dies tut.
  • Indem wir überprüfen, wann jeder Pin die Masse berührt oder verlässt, können wir herausfinden, in welche Richtung der Drehknopf sich dreht. Das tun wir, indem wir prüfen, was mit Pin B passiert, wenn Pin A sich ändert.
Wie ein Drehencoder funktioniert

Wenn A von LOW auf HIGH wechselt:

  • Wenn B hoch ist, wird der Drehknopf gegen den Uhrzeigersinn gedreht.
  • Wenn B niedrig ist, wird der Drehknopf im Uhrzeigersinn gedreht.

※ Notiz:

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

So programmiert man einen Drehencoder

  • ESP32 liest das Signal vom CLK-Pin
  • Wenn der Zustand von LOW auf HIGH wechselt, liest der ESP32 den Zustand des DT-Pins.
    • Wenn der DT-Pin HIGH ist, dreht sich der Knopf gegen den Uhrzeigersinn, der ESP32 erhöht den Zähler um 1
    • Wenn der DT-Pin LOW ist, dreht sich der Knopf im Uhrzeigersinn, der ESP32 verringert den Zähler um 1

Verdrahtungsdiagramm

ESP32 Drehencoder Verdrahtungsdiagramm

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

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

ESP32-Code – Drehencoder

Der untenstehende ESP32-Code tut Folgendes:

  • Erkennt die Richtung und den Betrag der Drehung des Drehencoders.
    • Wenn festgestellt wird, dass der Knopf um eine Raststufe (Klick) im Uhrzeigersinn gedreht wird, erhöhe den Zähler um eins.
    • Wenn festgestellt wird, dass der Knopf um eine Raststufe (Klick) gegen den Uhrzeigersinn gedreht wird, verringere den Zähler um eins.
  • Erkennt, ob der Knopf gedrückt ist.
/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin #define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin #define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin #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 7; 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("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" - count: "); 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

Wenn dies das erste Mal ist, dass Sie den ESP32 verwenden, sehen Sie sich wie man die Entwicklungsumgebung für ESP32 in der Arduino IDE einrichtet.

  • Installieren Sie die ezButton-Bibliothek in der Arduino-IDE.
  • 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 ESP32 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
Rotary Encoder:: direction: CLOCKWISE - count: 1 Rotary Encoder:: direction: CLOCKWISE - count: 2 Rotary Encoder:: direction: CLOCKWISE - count: 3 Rotary Encoder:: direction: CLOCKWISE - count: 4 Rotary Encoder:: direction: CLOCKWISE - count: 5 Rotary Encoder:: direction: ANTICLOCKWISE - count: 4 Rotary Encoder:: direction: ANTICLOCKWISE - count: 3 Rotary Encoder:: direction: ANTICLOCKWISE - count: 2 Rotary Encoder:: direction: ANTICLOCKWISE - count: 1 Rotary Encoder:: direction: ANTICLOCKWISE - count: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code-Erklärung

Schau dir die Kommentarzeilen im Code an.

ESP32-Code – Drehencoder mit Interrupt

Im vorherigen Code kann das Polling, um den Zustand des Pins kontinuierlich zu überprüfen, Ressourcen des ESP32 verschwenden und zu verpassten Zählwerten führen, wenn die Ausführung anderer Codeabschnitte langsam ist.

Eine effektive Lösung besteht darin, den Interrupt zu verwenden, wodurch die Notwendigkeit des Pollings entfällt. Dies ermöglicht dem ESP32, weitere Aufgaben auszuführen, ohne Zählungen zu verpassen. Der folgende ESP32-Code verwendet den Interrupt, um die Richtung und Position des Drehencoders auszulesen.

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin #define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin #define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin #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 7; void IRAM_ATTR ISR_encoder() { 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(); } 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_encoder() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoder, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Jetzt, während Sie den Drehknopf drehen, werden Sie Informationen im Serial Monitor sehen, ähnlich dem, was Sie im vorherigen Code gesehen haben.

※ Notiz:

  • Sie könnten auf Tutorials auf anderen Websites stoßen, 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 Schlüsselwort volatile für globale Variablen zu verwenden, die im Interrupt verwendet werden. Wenn man dies vernachlässigt, kann das zu unerwarteten Problemen führen.
  • Halten Sie den Code innerhalb des Interrupts so einfach wie möglich. Vermeiden Sie die Verwendung von Serial.print() oder Serial.println() innerhalb des Interrupts.

ESP32 Drehencoder-Anwendung

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

  • ESP32 - Drehencoder steuert die Position des Servomotors
  • ESP32 - Drehencoder steuert die Helligkeit der LED
  • ESP32 - 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!