Arduino UNO Q - Drehimpulsgeber

Ein Drehimpulsgeber erkennt Rotationsbewegungen und -richtungen. Im Gegensatz zu einem Potentiometer kann er sich unbegrenzt drehen. In diesem Tutorial lernen Sie, wie Sie einen Drehimpulsgeber an Arduino UNO Q anschließen, Rotationsschritte zählen, die Richtung erkennen und den Zähler remote über Telegram überprüfen.

Arduino UNO Q - Drehimpulsgeber

Erforderliche Hardware

1×Arduino UNO Q
1×USB-Kabel für Arduino Uno Q
1×Drehimpulsgeber
1×Jumper-Kabel
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Sensors/Servo Expansion Shield for 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 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 den Drehimpulsgeber

Pinbelegung

Ein Drehimpulsgeber-Modul hat normalerweise 5 Pins:

  • CLK (Ausgang A): Pulsiert einmal pro Rastklick (LOW→HIGH→LOW)
  • DT (Ausgang B): Derselbe Puls wie CLK, aber um 90° verzögert; wird verwendet, um die Richtung zu erkennen
  • SW: Eingebauter Druckknopf (LOW wenn gedrückt, HIGH wenn freigegeben über Pull-up)
  • VCC (+): 3,3V oder 5V
  • GND: Masse
Drehimpulsgeber Pinbelegung

Drehimpulsgeber vs. Potentiometer

  • Ein Drehimpulsgeber dreht sich kontinuierlich in beide Richtungen; ein Potentiometer ist auf ~270° begrenzt
  • Ein Drehimpulsgeber gibt Impulse aus (digital); ein Potentiometer gibt Spannung aus (analog)
  • Verwenden Sie einen Encoder, wenn Sie verfolgen müssen, wie viel sich etwas gedreht hat; verwenden Sie ein Potentiometer, wenn Sie die absolute Position kennen müssen

Wie es funktioniert

Drehimpulsgeber Ausgang

Wenn der Drehknopf gedreht wird, pulsieren CLK und DT abwechselnd. Der 90°-Phasenunterschied zwischen ihnen gibt die Richtung an:

  • CLK steigt von LOW auf HIGH:
    • DT ist LOW → Drehung im Uhrzeigersinn → Zähler inkrementieren
    • DT ist HIGH → Drehung gegen den Uhrzeigersinn → Zähler dekrementieren
    Wie der Drehimpulsgeber funktioniert

    Programmiervorgehen

    • Erkennen Sie, wenn CLK von LOW zu HIGH übergeht
    • Lesen Sie DT, um die Richtung zu bestimmen
    • Aktualisieren Sie einen Zähler: +1 für im Uhrzeigersinn, -1 für gegen den Uhrzeigersinn

Schaltplan

Arduino UNO Q Drehimpulsgeber Schaltplan

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

MCU-Code — Drehimpulsgeber (Polling)

Die Arduino UNO Q hat zwei Prozessoren: das STM32 MCU (verwaltet Echtzeit-Hardware-Steuerung) und das Qualcomm MPU (führt Debian Linux aus). In diesem Abschnitt wird nur das STM32 MCU programmiert — die Linux-Seite bleibt inaktiv. Ein späterer Abschnitt zeigt, wie beide Prozessoren zusammenarbeiten.

Diese Version verwendet Polling, um CLK-Übergänge zu erkennen. Sie ist einfach, kann aber Zählungen verpassen, wenn loop() langsam läuft:

/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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-q/arduino-uno-q-rotary-encoder */ #include <ezButton.h> #define CLK_PIN 2 // pin connected to CLK of encoder #define DT_PIN 3 // pin connected to DT of encoder #define SW_PIN 4 // pin connected to SW of encoder #define DIRECTION_CW 0 #define DIRECTION_CCW 1 int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object for SW pin void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); CLK_state = digitalRead(CLK_PIN); if (CLK_state != prev_CLK_state && CLK_state == HIGH) { if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } // TO DO: use counter and direction here } prev_CLK_state = CLK_state; if (button.isPressed()) { // TO DO: button pressed action here } }

Schnelle Schritte

  • Erstes Mal mit Arduino UNO Q? Folgen Sie dem Tutorial Getting Started with Arduino UNO Q, um Ihre Entwicklungsumgebung vorzubereiten.
  • Schließen Sie den Encoder an: Verbinden Sie CLK mit Pin 2, DT mit Pin 3, SW mit Pin 4, VCC mit 3,3V, GND mit GND.
  • Verbinden: Schließen Sie Arduino UNO Q mit einem USB-C-Kabel an Ihren Computer an.
  • Öffnen Sie Arduino App Lab: Starten Sie Arduino App Lab und warten Sie, bis es Arduino UNO Q erkennt.
  • Erstellen Sie eine neue App: Klicken Sie auf die Schaltfläche Create New App.
Neue App in Arduino App Lab auf Arduino UNO Q erstellen
  • Geben Sie der App einen Namen, zum Beispiel: DIYables_RotaryEncoder
  • Klicken Sie auf Create zum Bestätigen.
  • Sie sehen eine Reihe von Ordnern und Dateien in Ihrer neuen App.
Arduino App Lab App-Ordner und -Dateien auf Arduino UNO Q
  • Finden Sie die sketch/sketch.ino Datei — hier fügen Sie die MCU-Skizze ein.
  • Fügen Sie die Skizze ein: Kopieren Sie den MCU-Code oben und fügen Sie ihn in die Skizzendatei ein. Behalten Sie andere Dateien als Standard.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    Add sketch library in Arduino App Lab on Arduino UNO Q
    • Search for ezButton created by ArduinoGetStarted.com and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    ezButton ArduinoGetStarted.com

    Button library supports debounce, pressed/released events and the press counting. It is easy to use with multiple buttons. The library can be used for push-button, momentary switches, toggle switch, magnetic contact switch (door sensor)... It is designed for not only beginners but also experienced users.

    1.0.6
    Install
    More Info
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • Hochladen: Klicken Sie auf die Run-Schaltfläche in Arduino App Lab, um zum STM32 zu kompilieren und hochzuladen.
    Klicken Sie auf Run-Schaltfläche in Arduino App Lab auf Arduino UNO Q
    • Drehen Sie den Drehknopf im Uhrzeigersinn und gegen den Uhrzeigersinn. Zähleränderungen werden im nächsten Abschnitt über Bridge Monitor protokolliert.
    • Drücken Sie den Drehknopf — ein Druckknopf-Ereignis wird ausgelöst.

    MCU-Code — Drehimpulsgeber (Interrupt-basiert)

    Die Verwendung eines Hardware-Interrupts auf dem CLK-Pin stellt sicher, dass keine Rotationszählungen verpasst werden, auch wenn loop() beschäftigt ist:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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-q/arduino-uno-q-rotary-encoder */ #include <ezButton.h> #define CLK_PIN 2 // pin connected to CLK of encoder #define DT_PIN 3 // pin connected to DT of encoder #define SW_PIN 4 // pin connected to SW of encoder #define DIRECTION_CW 0 #define DIRECTION_CCW 1 volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time = 0; int prev_counter; ezButton button(SW_PIN); void ISR_encoderChange() { if ((millis() - last_time) < 50) return; if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); } void loop() { button.loop(); if (prev_counter != counter) { // TO DO: use counter and direction here prev_counter = counter; } if (button.isPressed()) { // TO DO: button pressed action here } }

    Schnelle Schritte

    • Verwenden Sie die gleiche Verdrahtung und App aus dem vorherigen Beispiel.
    • Ersetzen Sie die Skizze durch die Interrupt-Version und klicken Sie auf Run.
    • Drehen Sie den Drehknopf und drücken Sie die Schaltfläche — Ergebnisse werden über Bridge Monitor protokolliert.

    Linux + MCU Bridge-Programmierung

    Die Arduino UNO Q hat zwei Prozessoren, die zusammenarbeiten: das MPU (Qualcomm, führt Debian Linux aus) und das MCU (STM32, führt Zephyr OS mit Ihrem Arduino-Sketch aus). Sie kommunizieren über RPC über die Bibliothek Arduino_RouterBridge — niemals über Raw-Serienports.

    • Der Drehimpulsgeber ist mit dem MCU (STM32) verbunden — verdrahtet mit digitalen Pins mit Interrupt-Unterstützung. Das MCU verfolgt den Zähler und die Richtung in Echtzeit.
    • Das MPU kann den Encoder nicht direkt lesen — es muss den Zählerwert über Bridge.call() vom MCU anfordern. Das MCU antwortet sofort.
    • Das MPU hat Wi-Fi — da das MPU vollständiges Debian Linux mit Wi-Fi ausführt, kann es den Encoder-Zähler bei Bedarf über Telegram melden.
    • Kommunikation: Bridge.call() auf der Linux-Seite ruft Bridge.provide() Funktionen auf der MCU-Seite auf
    • ⚠️ Reserviert: /dev/ttyHS1 (Linux) und Serial1 (MCU) werden vom Arduino Router verwendet — öffnen Sie sie niemals direkt

    Kurz gesagt: MPU fordert Zähler an → MCU liest aktuelle Zählung und Richtung → MCU meldet Werte → MPU protokolliert oder leitet weiter.

    MCU-Sketch — Drehimpulsgeber mit Bridge und Monitor-Ausgabe:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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-q/arduino-uno-q-rotary-encoder */ #include "Arduino_RouterBridge.h" #include <ezButton.h> #define CLK_PIN 2 #define DT_PIN 3 #define SW_PIN 4 #define DIRECTION_CW 0 #define DIRECTION_CCW 1 volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time = 0; int prev_counter; ezButton button(SW_PIN); void get_counter() { Monitor.print("Counter: "); Monitor.print(counter); Monitor.print(", Direction: "); Monitor.println(direction == DIRECTION_CW ? "Clockwise" : "Counter-clockwise"); } void reset_counter() { counter = 0; Monitor.println("Counter reset to 0"); } void ISR_encoderChange() { if ((millis() - last_time) < 50) return; if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); Bridge.begin(); Monitor.begin(); Bridge.provide("get_counter", get_counter); Bridge.provide("reset_counter", reset_counter); Monitor.println("Rotary Encoder Bridge ready"); } void loop() { button.loop(); if (prev_counter != counter) { Monitor.print("DIRECTION: "); Monitor.print(direction == DIRECTION_CW ? "Clockwise" : "Counter-clockwise"); Monitor.print(" | COUNTER: "); Monitor.println(counter); prev_counter = counter; } if (button.isPressed()) { Monitor.println("Button pressed"); } }

    Python-Skript (Arduino App Lab) — Encoder-Zähler von Linux abfragen:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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-q/arduino-uno-q-rotary-encoder */ from arduino.app_utils import * import time def loop(): while True: Bridge.call("get_counter") time.sleep(2) App.run(user_loop=loop)
    • Hinweis: Stellen Sie sicher, dass Bridge.begin() im MCU-Sketch aufgerufen wird und der Sketch hochgeladen wird, bevor Sie das Python-Skript auf der Linux-Seite ausführen.
    • ⚠️ Warnung: Öffnen Sie /dev/ttyHS1 (auf Linux) oder verwenden Sie Serial1 (auf MCU) niemals direkt in Ihrem Code — diese sind vom Arduino Router reserviert und der Zugriff darauf zerstört die Bridge.

    Schnelle Schritte

    • Laden Sie den MCU-Sketch hoch: Öffnen Sie Arduino App Lab, erstellen Sie eine neue App, fügen Sie den Bridge MCU-Sketch oben in sketch/sketch.ino ein, installieren Sie die Bibliotheken ezButton und Arduino_RouterBridge, und klicken Sie auf Run.
    • Fügen Sie das Python-Skript hinzu: Fügen Sie den Python-Code oben in die Python-Registerkarte derselben App ein.
    • Führen Sie die App aus: Klicken Sie auf Run — die Python-Seite fragt den Encoder-Zähler alle 2 Sekunden ab.
    • Drehen Sie den Encoder-Knopf in beide Richtungen.
    • Überprüfen Sie die Konsole: Öffnen Sie die Registerkarte Konsole → Unterregisterkarte MCU Monitor, um Zähleränderungen in Echtzeit zu protokollieren.

    App Lab Konsolenausgabe

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Rotary Encoder Bridge ready DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 Button pressed

    Telegram-Integration

    Überprüfen Sie den Encoder-Zähler von überall remote über Telegram.

    Wenn Sie noch keinen Telegram-Bot haben, lesen Sie How to Create a Telegram Bot, um vor dem Fortfahren Ihr Bot-Token zu erhalten.

    MCU-Sketch: Behalten Sie den gleichen MCU-Sketch aus dem vorherigen Bridge-Abschnitt — keine Änderungen erforderlich. Stellen Sie sicher, dass er bereits auf dem STM32 hochgeladen und ausgeführt wird.

    Python-Skript (Arduino App Lab) — Telegram-Bot für Encoder-Zähler:

    /* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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-q/arduino-uno-q-rotary-encoder */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/count": counter = Bridge.call("get_counter") send_message(chat_id, counter) elif text == "/reset": Bridge.call("reset_counter") send_message(chat_id, "Encoder counter has been reset to 0.") else: send_message(chat_id, "Commands:\n/count — read encoder counter value\n/reset — reset counter to 0") time.sleep(1) App.run(user_loop=loop)
    • Hinweis: Ersetzen Sie YOUR_BOT_TOKEN durch das Token, das Sie von @BotFather auf Telegram erhalten haben.
    • Senden Sie /count, um den aktuellen Encoder-Zählerwert zu überprüfen.
    • Senden Sie /reset, um den Zähler auf 0 zurückzusetzen.

    Schnelle Schritte

    • Laden Sie den MCU-Sketch hoch: Verwenden Sie den Bridge MCU-Sketch aus dem vorherigen Abschnitt (laden Sie ihn zuerst hoch, falls noch nicht geschehen).
    • Fügen Sie das Telegram-Skript ein: Kopieren Sie den Python-Code oben in die Python-Registerkarte Ihrer App in Arduino App Lab.
    • Legen Sie Ihr Token fest: Ersetzen Sie YOUR_BOT_TOKEN im Skript durch Ihr aktuelles Bot-Token.
    • Führen Sie die App aus: Klicken Sie auf Run — der Bot beginnt, auf Telegram-Nachrichten zu lauschen.
    • Testen Sie es: Drehen Sie den Encoder, senden Sie /count — der Bot antwortet mit dem Zählerwert und der Richtung.

    App Lab Python-Konsolenausgabe

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /count [2026-04-29 12:00:01] Counter: 5, Direction: Clockwise [2026-04-29 12:03:20] Telegram: /reset [2026-04-29 12:03:20] Encoder counter has been reset to 0.
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /count
    10:15 AM ✓✓
    Counter: 5, Direction: Clockwise
    10:16 AM
    /reset
    10:17 AM ✓✓
    Encoder counter has been reset to 0.
    10:18 AM

    OpenClaw-Integration

    Sie können die OpenClaw an dieses Tutorial anpassen, indem Sie sich auf die Anleitung im Tutorial Arduino Uno Q - OpenClaw beziehen.

    Ideen für Anwendungen/Projekte

    • Remote-Lautstärkeregelung: Ordnen Sie die Encoder-Drehung Audio-Lautstärkepegeln zu — überprüfen Sie den aktuellen Pegel über Telegram
    • Schrittkoordinatensystem: Zählen Sie Encoder-Impulse, um Bewegungen in einem mechanischen System zu messen — melden Sie über Telegram
    • Menü-Navigator: Verwenden Sie Encoder-Drehung, um durch Optionen in einem von MPU gesteuerten Fernmenü zu zykleln
    • Positionsverfolgung: Verfolgen Sie die absolute Position, indem Sie Schritte von einer bekannten Ausgangsposition zählen
    • Schnellwahl: Drehen Sie den Encoder, um eine Zielgeschwindigkeit für einen Motor einzustellen — bestätigen Sie die Einstellung über Telegram

    Herausforderung für Sie selbst

    • Einfach: Fügen Sie einen Buzzer hinzu, der jedes Mal piept, wenn der Encoder-Knopf gedrückt wird
    • Mittel: Stellen Sie separate Callbacks für get_counter(), get_direction() und get_button_count() bereit
    • Fortgeschritten: Erstellen Sie einen Telegram-Bot, der automatisch eine Warnung sendet, wenn der Zähler einen konfigurierbaren Schwellenwert überschreitet — speichern Sie den Schwellenwert in einer über Telegram einstellbaren Python-Variablen

    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!