Arduino UNO R4 - Drehencoder

In diesem Leitfaden lernen wir, wie man einen inkrementalen Encoder mit dem Arduino UNO R4 verwendet. Wir werden Folgendes behandeln:

Arduino UNO R4 Drehencoder

Über Drehencoder

Ein Drehgeber ist ein Bauteil, das Drehbewegungen in ein elektrisches Signal umwandelt. Er überwacht die Drehung und Stellung einer Welle oder eines Knopfes. Es gibt zwei Haupttypen:

  • Inkremental-Encoder: Er erzeugt Impulse, um Positionsänderungen zu messen.
  • Absolut-Encoder: Dies liefert für jede Position einen speziellen digitalen Code, der eine präzise Positionierung ermöglicht, auch wenn die Stromversorgung ausfällt.

Dieses Tutorial befasst sich mit dem inkrementellen Encoder.

Pinbelegung des Drehencoder-Moduls

Drehencoder-Pinbelegung

Ein Drehgeber-Modul verfügt über vier Anschlüsse:

  • CLK-Pin (Ausgang A): Dieser Pin sendet ein Signal jedes Mal, wenn du den Drehknopf um einen Klick in irgendeine Richtung drehst, und zeigt einen vollständigen Signalzyklus von niedrig zu hoch zu niedrig. Dies zeigt uns, wie weit der Drehknopf gedreht wurde.
  • DT-Pin (Ausgang B): Ähnlich wie der CLK-Pin, aber das Signal dieses Pins tritt leicht verzögert auf und erscheint 90 Grad nach dem CLK-Signal. Diese Verzögerung hilft uns zu bestimmen, ob die Drehung im Uhrzeigersinn oder gegen den Uhrzeigersinn erfolgt.
  • SW-Pin: Dieser Anschluss verbindet den internen Taster des Encoders, der normalerweise offen ist. Die Verwendung eines Pull-Up-Widerstands an diesem Pin sorgt dafür, dass er hoch anzeigt, wenn der Knopf nicht gedrückt ist, und niedrig, wenn er gedrückt wird.
  • VCC-Pin (+): Schließen Sie diesen Pin an eine Stromversorgung an, die zwischen 3,3 und 5 Volt liefert.
  • GND-Pin: Schließen Sie diesen Pin an die Masse (0 V) an.

Drehgeber im Vergleich zum Potentiometer

Sie könnten den Drehencoder mit dem Potentiometer verwechseln, aber sie sind unterschiedliche Bauteile. So unterscheiden sie sich:

  • Ein Drehencoder kann sich kontinuierlich vollständig drehen, während ein Potentiometer sich nur drei Viertel eines vollständigen Kreises drehen kann.
  • Ein Drehencoder liefert Impulse, während ein Potentiometer eine analoge Spannung ausgibt.
  • Ein Drehencoder ist nützlich, um zu wissen, wie weit sich ein Knopf gedreht hat, aber nicht seine genaue Position. Ein Potentiometer eignet sich gut, um die genaue Position eines Knopfes festzustellen.

Wie Drehencoder funktionieren

Drehencoder-Ausgang

Im Encoder gibt es eine Scheibe mit Schlitzen, die mit einem Pin namens C verbunden ist und als gemeinsame Masse dient. Es gibt außerdem zwei weitere Pins, A und B.

  • Wenn Sie den Drehknopf drehen, berühren die Pins A und B den gemeinsamen Erdungspin C, jedoch in einer bestimmten Reihenfolge, die sich nach der Drehrichtung richtet – entweder im Uhrzeigersinn oder gegen den Uhrzeigersinn.
  • Dieser Kontakt erzeugt zwei Signale, deren zeitliches Verhalten sich leicht unterscheidet, weil ein Pin früher mit der Erdung verbunden wird als der andere. Diese Signale sind um 90 Grad phasenverschoben, und dies wird als Quadraturkodierung bezeichnet.
  • Wenn der Drehknopf im Uhrzeigersinn gedreht wird, kommt Pin A früher mit der Erdung in Kontakt als Pin B. Wird er gegen den Uhrzeigersinn gedreht, kommt Pin B früher mit der Erdung in Kontakt als Pin A.
  • Indem Sie beobachten, wann jeder Pin Kontakt mit der Erdung herstellt oder trennt, können Sie die Drehrichtung des Drehknopfs bestimmen. Dies erreichen Sie, indem Sie die Änderungen von Pin B relativ zu Pin A analysieren.
Wie Drehencoder funktionieren

Wenn A von LOW auf HIGH umschaltet:

  • Drehen Sie den Drehknopf im Uhrzeigersinn, wenn B niedrig ist.
  • Drehen Sie den Drehknopf gegen den Uhrzeigersinn, wenn B hoch ist.

※ Notiz:

Pin A und B sind mit den CLK- und DT-Pins verbunden. Die Anordnung kann je nach Hersteller variieren. Die hier angegebenen Codes wurden mit dem Drehencoder von DIYables getestet.

Wie man einen Drehencoder programmiert

  • Prüfe das Signal am CLK-Pin.
  • Wenn das Signal von LOW zu HIGH wechselt, prüfe, was der DT-Pin anzeigt.
    • Zeigt der DT-Pin HIGH an, wird der Drehknopf gegen den Uhrzeigersinn gedreht. Addiere 1 zum Zähler.
    • Zeigt der DT-Pin LOW an, wird der Drehknopf im Uhrzeigersinn gedreht. Subtrahiere 1 vom Zähler.

Verdrahtungsdiagramm

Arduino UNO R4 Drehencoder Verdrahtungsdiagramm

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

Siehe Der beste Weg, den Arduino Uno R4 und andere Komponenten mit Strom zu versorgen.

Arduino UNO R4 Code – Drehencoder ohne Unterbrechung

Dieser Arduino UNO R4-Code führt die folgenden Aktionen aus:

  • Es erkennt, wie der Encoder sich dreht und in welchem Ausmaß.
    • Wenn es erkennt, dass der Drehknopf um einen Klick nach rechts gedreht wird, addiert es eins zum Zähler.
    • Wenn es erkennt, dass der Drehknopf um einen Klick nach links gedreht wird, reduziert es den Zähler um eins.
  • Es bemerkt, wenn der Knopf gedrückt wird.
/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 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-uno-r4/arduino-uno-r4-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino UNO R4 pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino UNO R4 pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino UNO R4 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 Code zur Entprellung des Buttons zu vereinfachen.

Schnelle Schritte

Befolgen Sie diese Anweisungen Schritt für Schritt:

  • Wenn dies Ihre erste Verwendung des Arduino Uno R4 WiFi/Minima ist, schauen Sie sich das Tutorial zur Einrichtung der Umgebung für Arduino Uno R4 WiFi/Minima in der Arduino IDE an.
  • Schließen Sie den Drehencoder gemäß dem bereitgestellten Diagramm an den Arduino UNO R4 an.
  • Schließen Sie das Arduino Uno R4-Board über ein USB-Kabel an Ihren Computer an.
  • Starten Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das geeignete Arduino Uno R4-Board (z. B. Arduino Uno R4 WiFi) und den COM-Port aus.
  • Fügen Sie der Arduino IDE die ezButton-Bibliothek hinzu. Anleitungen finden Sie unter diesem Link: ezButton-Bibliothek.
  • Kopieren Sie den bereitgestellten Code und öffnen Sie ihn in der Arduino IDE.
  • Klicken Sie in der Arduino IDE auf die Schaltfläche Upload, um den Code auf das Arduino UNO R4 zu laden.
  • Drehen Sie den Knopf im Uhrzeigersinn und anschließend 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

Schau dir die Kommentare im Code zu jeder Zeile an.

Arduino UNO R4 Code – Drehencoder mit Interrupt

Im vorherigen Code-Beispiel haben wir die Polling-Methode verwendet, die den Zustand des Pins ständig überprüft. Diese Methode hat zwei Nachteile:

  • Verwende die Ressourcen des Arduino UNO R4 ineffizient.
  • Manche Zählungen können übersprungen werden, wenn ein anderer Code zu lange läuft.

Eine Methode zur Steuerung ist der Einsatz von Unterbrechungen. Unterbrechungen helfen dabei, den ständigen Bedarf zu vermeiden, auf ein bestimmtes Ereignis zu prüfen. Dadurch kann der Arduino UNO R4 weitere Aufgaben ausführen, während er weiterhin Ereignisse überwacht.

Lass uns den untenstehenden Code ansehen, der einen Interrupt verwendet, um den Wert des Encoders auszulesen.

/* * Dieser Arduino UNO R4 Code wurde von newbiely.de entwickelt * Dieser Arduino UNO R4 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-uno-r4/arduino-uno-r4-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino UNO R4 pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino UNO R4 pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino UNO R4 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 bereitgestellten Code und öffnen Sie ihn in der Arduino-IDE.
  • Klicken Sie in der Arduino-IDE auf die Hochladen-Schaltfläche, um den Code auf den Arduino UNO R4 zu laden.

Wenn du jetzt am Drehknopf drehst, erscheinen Informationen im Serial Monitor, ähnlich wie du es zuvor im Code bemerkt hast.

※ Notiz:

  • Um den CLK-Pin des Encoders mit einem Arduino UNO R4 über einen Interrupt zu verbinden, sollten Sie Pins 2 oder 3 verwenden. Dies sind die einzigen Pins, die Interrupts unterstützen.
  • Einige Online-Anleitungen könnten vorschlagen, für einen Encoder zwei Interrupts zu verwenden, aber das ist nicht notwendig. Es reicht aus, nur einen Interrupt zu verwenden.
  • Stellen Sie sicher, dass Sie das Schlüsselwort volatile für alle globalen Variablen im Interrupt verwenden, um Probleme zu vermeiden.
  • Halten Sie die Programmierung im Interrupt einfach. Verwenden Sie dort keine Serial.print()- oder Serial.println()-Ausgaben.

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!