Arduino Nano - Drehencoder

Dieses Tutorial erklärt dir, wie man den Drehencoder mit dem Arduino Nano verwendet. Folgendes werden wir behandeln:

Erforderliche Hardware

1×Official Arduino Nano
1×Alternativ: DIYables ATMEGA328P Nano Development Board
1×USB-A-zu-Mini-B-Kabel
1×Drehgeber
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Breakout-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Stromverteiler für Arduino Nano

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 Drehencoder

Ein drehender Knopf, der als Drehencoder bezeichnet wird, kann Drehungen in ein Signal umwandeln. Er zeigt, wie stark sich etwas gedreht hat und wo es sich befindet. Es gibt zwei Haupttypen:

  • Inkrementalencoder: Er verwendet schnelle Signale, um festzustellen, wie weit sich etwas bewegt hat.
  • Absolutencoder: Diese Art liefert für jede Position einen eindeutigen Code, der dabei hilft, genau zu bestimmen, wo sich etwas befindet, auch wenn die Stromversorgung ausfällt.

Dieser Leitfaden dreht sich ganz um den Inkrementalencoder.

Drehgeber-Modul Pinbelegung

Drehencoder-Pinbelegung

Ein Drehencoder-Modul hat 4 Pins:

  • CLK-Pin (Ausgang A): ist der Hauptimpuls, der uns sagt, wie viel Drehung erfolgt ist. Immer wenn du den Drehknopf um eine Rastung (Klick) in eine Richtung drehst, liefert 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, gibt aber ein Signal aus, das dem CLK-Signal um 90 Grad hinterherhinkt. Es hilft uns, die Drehrichtung (im Uhrzeigersinn oder gegen den Uhrzeigersinn) zu ermitteln.
  • SW-Pin: ist der Ausgang des Druckknopfs im Encoder. Er ist normalerweise offen. Wenn wir an diesem Pin einen Pull-up-Widerstand verwenden, 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

Drehencoder im Vergleich zu Potentiometer

Sie könnten den Drehencoder mit dem Potentiometer verwechseln, aber es handelt sich um zwei unterschiedliche Bauteile. Hier ist ein Vergleich zwischen ihnen:

  • Der Drehgeber kann sich vollständig um 360° drehen, ohne anzuhalten, während das Potentiometer nur etwa drei Viertel einer Umdrehung schafft.
  • Der Drehgeber gibt Impulse aus, während das Potentiometer eine analoge Spannung liefert.
  • Wenn Sie nur wissen müssen, wie weit der Drehknopf gedreht wurde, ohne seine genaue Position zu bestimmen, ist der Drehgeber praktisch. Andererseits ist das Potentiometer wertvoll, wenn Sie die genaue Position eines Drehknopfs benötigen.

Wie ein Drehencoder funktioniert

Drehencoder-Ausgang

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

  • Wenn Sie den Drehknopf drehen, berühren die Pins A und B den gemeinsamen Massepin C, jedoch in einer bestimmten Reihenfolge, abhängig davon, in welche Richtung Sie den Drehknopf drehen (im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • Diese Berührungen erzeugen zwei Signale. Sie unterscheiden sich zeitlich leicht, weil einer der Pins die Masse vor dem anderen berührt. Zwei Signale sind zueinander um 90 Grad phasenverschoben. Dies wird Quadraturkodierung genannt.
  • Wenn Sie den Drehknopf im Uhrzeigersinn drehen, berührt Pin A die Masse, bevor Pin B die Masse berührt. Wenn Sie den Drehknopf gegen den Uhrzeigersinn drehen, berührt Pin B die Masse, bevor Pin A die Masse berührt.
  • Indem wir überwachen, wann jeder Pin die Masse berührt oder von der Masse trennt, können wir feststellen, in welche Richtung der Drehknopf sich dreht. Das tun wir, indem wir beobachten, was mit Pin B passiert, wenn Pin A sich ändert.
Wie ein Drehencoder funktioniert

Wenn A den Zustand von LOW auf HIGH ändert:

  • 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 CLK- und DT-Pins verbunden. Je nach Hersteller kann jedoch die Reihenfolge unterschiedlich sein. Die untenstehenden Codes wurden mit dem Drehencoder von DIYables getestet.

Wie programmiert man einen Drehencoder

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

Verdrahtungsdiagramm

Arduino Nano Drehencoder Verdrahtungsdiagramm

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

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

Arduino Nano Code – Drehencoder

Der folgende Arduino-Nano-Code führt Folgendes aus:

  • Ermittelt die Richtung und den Betrag der Drehung des Drehencoders.
    • Wird erkannt, dass der Drehencoder um eine Rastung (Klick) im Uhrzeigersinn gedreht wird, erhöhe den Zähler um eins.
    • Wird erkannt, dass der Drehencoder um eine Rastung (Klick) gegen den Uhrzeigersinn gedreht wird, verringere den Zähler um eins.
  • Ermittelt, ob der Knopf gedrückt wird.
/* * Dieser Arduino Nano Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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-nano/arduino-nano-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 // anticlockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); 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 anticlockwise 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("Twisted direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - counter: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Zur Vereinfachung des Codes für das Entprellen von Tasten wird die ezButton-Bibliothek verwendet.

Schnelle Schritte

  • Installieren Sie die ezButton-Bibliothek in der Arduino-IDE. Siehe Anleitung
  • 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 Nano hochzuladen.
  • Drehen Sie den Knopf im Uhrzeigersinn und anschließend gegen den Uhrzeigersinn.
  • Drücken Sie den Knopf.
  • Sehen Sie sich das Ergebnis im Serial Monitor an.
COM6
Send
Twisted direction: CLOCKWISE - counter: 1 Twisted direction: CLOCKWISE - counter: 2 Twisted direction: CLOCKWISE - counter: 3 Twisted direction: CLOCKWISE - counter: 4 Twisted direction: CLOCKWISE - counter: 5 Twisted direction: ANTICLOCKWISE - counter: 4 Twisted direction: ANTICLOCKWISE - counter: 3 Twisted direction: ANTICLOCKWISE - counter: 2 Twisted direction: ANTICLOCKWISE - counter: 1 Twisted direction: ANTICLOCKWISE - counter: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code-Erklärung

Schau dir die Zeile-für-Zeile-Kommentare im Code an.

Arduino Nano-Code – Drehencoder mit Interrupt

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

  • Ressourcen des Arduino Nano verschwenden
  • Einige Zähler könnten verpasst werden, wenn ein anderer Code zu lange braucht, um ausgeführt zu werden.

Ein Ansatz, dies zu handhaben, besteht darin, Unterbrechungen zu verwenden. Unterbrechungen beseitigen die Notwendigkeit, ein bestimmtes Ereignis ständig zu überprüfen. Dies ermöglicht dem Arduino Nano, andere Aufgaben auszuführen, ohne ein Ereignis zu übersehen.

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

/* * Dieser Arduino Nano Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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-nano/arduino-nano-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN 2 // The Arduino Nano pin D2 connect to the pin CLK of the rotary encoder #define DT_PIN 3 // The Arduino Nano pin D3 connect to the pin DT of the rotary encoder #define SW_PIN 4 // The Arduino Nano pin D4 connect to the pin SW of the rotary encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // anticlockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); void INTERRUPT_handler() { if ((millis() - last_time) < 50) // debounce time is 10ms return; if (digitalRead(DT_PIN) == HIGH) { // The encoder is rotating in anticlockwise 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 INTERRUPT_handler() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), INTERRUPT_handler, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("Twisted direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - counter: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Jetzt, während du den Drehknopf drehst, wirst du feststellen, dass Informationen auf dem seriellen Monitor erscheinen, ähnlich wie du es im früheren Code gesehen hast.

※ Notiz:

  • Wenn Sie den Interrupt verwenden, müssen Sie den CLK-Pin des Encoders an einen Pin des Arduino Nano anschließen, der Interrupts verarbeiten kann. Beachten Sie jedoch, dass nicht alle Pins des Arduino Nano dazu in der Lage sind. Zum Beispiel können beim Arduino Nano nur die Pins 2 und 3 Interrupts verarbeiten.
  • 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 ineffizient. 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 dies zu unerwarteten Problemen führen.
  • Halten Sie den Code innerhalb des Interrupts so einfach wie möglich. Vermeiden Sie es, Serial.print() oder Serial.println() im Interrupt zu verwenden.

Arduino Nano Drehencoder-Anwendung

Mit einem Drehencoder können wir die folgenden Anwendungen durchführen, aber diese Liste ist nicht abschließend.

  • Arduino Nano – Drehencoder steuert die Position des Servomotors
  • Arduino Nano – Drehencoder steuert die Helligkeit der LED
  • Arduino Nano – 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.

Funktionsverweise

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!