Arduino UNO Q - Antrieb mit Rückmeldung

In diesem Leitfaden erfahren Sie, wie Sie einen Linearantrieb mit Positionsrückmeldung mithilfe eines Potentiometers auf Arduino UNO Q und des Motor Shield Rev3 steuern. Sie erfahren:

Für grundlegende Aus-/Einfahrsteuerung ohne Rückmeldung siehe Arduino UNO Q - Antrieb.

Arduino UNO Q Antrieb mit Rückmeldung

Erforderliche Hardware

1×Arduino UNO Q
1×USB-Kabel für Arduino Uno Q
1×12V Linearantrieb mit Rückmeldung
1×Motor Shield für Arduino
1×12V Netzteil
1×DC-Stromstecker
1×Überbrückungskabel
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 Linearantrieb mit Rückmeldung

Ein Linearantrieb mit Rückmeldung hat ein integriertes Potentiometer, dessen Widerstand sich ändert, wenn sich der Stab ausfährt und einzieht. Durch das Auslesen dieses Potentiometers können Sie die aktuelle Position des Stabes berechnen und ihn zu einer genauen Zielposition fahren.

Linearantrieb mit Rückmeldungs-Pinbelegung

Ein Linearantrieb mit Rückmeldung hat 5 Drähte (oder 4 bei einigen Modellen):

  • Motordrähte (2): Stromversorgung und Polaritätskontrolle über Motor Shield Rev3 Kanal A
  • Potentiometerdrähte (3): VCC, GND und Signal (Schleifer)
Linearantrieb mit Rückmeldungs-Pinbelegung

※ Notiz:

Der Motor Shield Rev3 Kanal A verwendet A0 für die Stromerfassung. Verbinden Sie den Signaldraht des Potentiometers des Antriebs mit A2, um Konflikte zu vermeiden.

Funktionsweise

  1. Stromversorgung des Motors über den Motor Shield Rev3 (motor.run(MOTOR_FORWARD, 255) zum Ausfahren, motor.run(MOTOR_BACKWARD, 255) zum Einfahren, motor.brake() zum Stoppen).
  2. Lesen Sie das Potentiometersignal mit analogRead(A2) — gibt einen 12-Bit-Wert (0–4095) auf Arduino UNO Q zurück.
  3. Verwenden Sie map(), um den rohen ADC-Wert in Millimetern zu konvertieren.
  4. Vergleichen Sie die aktuelle Position mit dem Ziel; fahren Sie weiter oder halten Sie entsprechend an.

※ Notiz:

Bevor Sie die Position steuern, müssen Sie den Antrieb kalibrieren: Fahren Sie zur vollständigen Grenze aus, lesen Sie POTENTIOMETER_MAX; fahren Sie zur vollständigen Grenze ein, lesen Sie POTENTIOMETER_MIN. Diese Werte ersetzen die Platzhalter im Code.

Wenn Sie den Motor Shield Rev3 nicht kennen (Pinbelegung, Funktionsweise und Programmierung), siehe zuerst das Tutorial Arduino UNO Q - DC Motor Shield.

Schaltplan

Arduino UNO Q Antrieb mit Rückmeldungs-Motor Shield Schaltplan

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

MCU-Code

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

Dieses Tutorial ist in drei Schritte unterteilt:

Schritt 1 – Kalibrierung

Führen Sie diesen Code aus, um die rohen ADC-Werte zu finden, wenn der Antrieb vollständig ausgefahren und vollständig eingezogen ist. Notieren Sie sich die Werte — Sie werden sie in den Schritten 2 und 3 verwenden.

/* * 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-actuator-with-feedback */ // Step 1: Calibration — find POTENTIOMETER_MIN and POTENTIOMETER_MAX values // NOTE: Motor Shield Channel A uses A0 for current sensing. // Connect the actuator's feedback potentiometer signal wire to A2. #include <DIYables_DC_Motor.h> #define POTENTIOMETER_PIN A2 // The Arduino UNO Q pin connected to the actuator's feedback potentiometer DIYables_DC_Motor motor(MOTOR_CH_A); void setup() { motor.begin(); } void loop() { // extend the actuator fully motor.run(MOTOR_FORWARD, 255); delay(20000); // wait for actuator to reach its limit int POTENTIOMETER_MAX = analogRead(POTENTIOMETER_PIN); // read max position value (0-4095 on UNO Q) // TODO: note this value // retract the actuator fully motor.run(MOTOR_BACKWARD, 255); delay(20000); // wait for actuator to reach its limit int POTENTIOMETER_MIN = analogRead(POTENTIOMETER_PIN); // read min position value // TODO: note this value // stop motor.brake(); while (true); // stop after one calibration cycle }

Schnellschritte

  • Schild stapeln: Drücken Sie das Motor Shield Rev3 fest auf die Arduino UNO Q Header. Verbinden Sie die Motordrähte des Antriebs mit den Schraubklemmen von Kanal A. Verbinden Sie die 12V-Stromversorgung mit den Schraubklemmen des Schildes. Verbinden Sie den Signaldraht des Potentiometers mit A2, Potentiometer VCC mit 3,3V, Potentiometer GND mit GND.
  • Verbinden: Stecken Sie den Arduino UNO Q mit einem USB-C-Kabel in Ihren Computer.
  • Arduino App Lab öffnen: Starten Sie Arduino App Lab und warten Sie, bis es Ihren Arduino UNO Q erkennt.
  • Erstellen Sie eine neue App: Klicken Sie auf die Schaltfläche Neue App erstellen.
Neue App in Arduino App Lab auf Arduino UNO Q erstellen
  • Geben Sie der App einen Namen, z.B.: DIYables_ActuatorFeedback
  • Klicken Sie auf Erstellen, um zu bestätigen.
  • Suchen Sie die Datei sketch/sketch.ino und fügen Sie den Kalibrierungscode oben ein.
  • 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 DIYables_DC_Motor created by DIYables.io 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
DIYables_DC_Motor DIYables.io

Easy-to-use library for controlling DC motors via the Arduino Motor Shield Rev3 (L298P). Supports both Channel A and Channel B with direction control, PWM speed, brake, and current sensing. Custom pin assignments also supported.

1.0.0
Install
More Info
  • Hochladen: Klicken Sie auf „Ausführen", um hochzuladen.
  • Notieren Sie sich die Werte: Nach 40 Sekunden (Ausfahren 20 s + Einfahren 20 s) notieren Sie sich die Werte POTENTIOMETER_MAX und POTENTIOMETER_MIN.

Schritt 2 – Position berechnen

Verwenden Sie die kalibrierten Werte, um die aktuelle Position in Millimetern zu berechnen:

  • Ersetzen Sie STROKE_LENGTH durch die Hubhöhe Ihres Antriebs in mm.
  • Ersetzen Sie POTENTIOMETER_MAX und POTENTIOMETER_MIN durch die in Schritt 1 notierten Werte.
/* * 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-actuator-with-feedback */ // Step 2: Calculate position from potentiometer feedback // NOTE: Motor Shield Channel A uses A0 for current sensing. // Connect the actuator's feedback potentiometer signal wire to A2. #include <DIYables_DC_Motor.h> #define POTENTIOMETER_PIN A2 // The Arduino UNO Q pin connected to the actuator's feedback potentiometer #define STROKE_LENGTH 102 // PLEASE UPDATE THIS VALUE (in mm) #define POTENTIOMETER_MAX 4050 // PLEASE UPDATE THIS VALUE (from calibration) #define POTENTIOMETER_MIN 50 // PLEASE UPDATE THIS VALUE (from calibration) DIYables_DC_Motor motor(MOTOR_CH_A); void setup() { motor.begin(); // extend the actuator continuously while displaying position motor.run(MOTOR_FORWARD, 255); } void loop() { int potentiometer_value = analogRead(POTENTIOMETER_PIN); int stroke_pos = map(potentiometer_value, POTENTIOMETER_MIN, POTENTIOMETER_MAX, 0, STROKE_LENGTH); // stroke_pos is the current position in mm — use this to verify feedback accuracy (void)stroke_pos; }

Schnellschritte

  • Aktualisieren Sie die Platzhalter oben im Code mit Ihren tatsächlichen Werten.
  • Hochladen und beobachten: Beobachten Sie, wie der Antrieb ausfährt, während Sie die berechnete Position überprüfen.

Schritt 3 – Position steuern

Mit kalibrierten Werten fahren Sie den Antrieb zu einer bestimmten Zielposition:

  • Stellen Sie targetPosition_mm auf die gewünschte Position (0 = vollständig eingezogen, STROKE_LENGTH = vollständig ausgefahren).
/* * 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-actuator-with-feedback */ // Step 3: Control actuator position using feedback // NOTE: Motor Shield Channel A uses A0 for current sensing. // Connect the actuator's feedback potentiometer signal wire to A2. #include <DIYables_DC_Motor.h> #define POTENTIOMETER_PIN A2 // The Arduino UNO Q pin connected to the actuator's feedback potentiometer #define STROKE_LENGTH 102 // PLEASE UPDATE THIS VALUE (in mm) #define POTENTIOMETER_MAX 4050 // PLEASE UPDATE THIS VALUE (from calibration) #define POTENTIOMETER_MIN 50 // PLEASE UPDATE THIS VALUE (from calibration) #define TOLERANCE 5 // position tolerance in mm int targetPosition_mm = 50; // target position in mm DIYables_DC_Motor motor(MOTOR_CH_A); void setup() { motor.begin(); motor.brake(); } void loop() { int potentiometer_value = analogRead(POTENTIOMETER_PIN); int stroke_pos = map(potentiometer_value, POTENTIOMETER_MIN, POTENTIOMETER_MAX, 0, STROKE_LENGTH); if (stroke_pos < (targetPosition_mm - TOLERANCE)) motor.run(MOTOR_FORWARD, 255); else if (stroke_pos > (targetPosition_mm + TOLERANCE)) motor.run(MOTOR_BACKWARD, 255); else motor.brake(); }

Schnellschritte

  • Aktualisieren Sie die Platzhalter (STROKE_LENGTH, POTENTIOMETER_MAX, POTENTIOMETER_MIN) und stellen Sie targetPosition_mm ein.
  • Hochladen und testen: Der Antrieb bewegt sich zur Zielposition und hält diese.

Linux + MCU Bridge-Programmierung

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

  • Der Motor Shield Rev3 und der Antrieb werden von der MCU (STM32) gesteuert — die DIYables_DC_Motor-Bibliothek steuert Kanal A; Potentiometer-Rückmeldung auf A2.
  • Die MPU kann den Antrieb nicht direkt steuern — sie ruft Bridge.call("read_position") auf, um die MCU-Funktion aufzurufen, die Position liest und den Antrieb steuert.
  • Die MPU hat Wi-Fi — damit kann sie Telegram-Befehle akzeptieren, um die Antriebsposition remote zu überwachen oder zu ändern.
  • Kommunikation: Bridge.call() auf der Linux-Seite ruft Bridge.provide_safe() auf der MCU-Seite auf (da motor.run() und motor.brake() Hardware-APIs verwenden).
  • ⚠️ Reserviert: /dev/ttyHS1 (Linux) und Serial1 (MCU) werden vom Arduino Router verwendet — öffnen Sie sie niemals direkt.

MCU-Sketch — Positions-Rückmeldung mit Bridge:

/* * 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-actuator-with-feedback */ #include "Arduino_RouterBridge.h" #include <DIYables_DC_Motor.h> #define POTENTIOMETER_PIN A2 // NOTE: A0 is used by Motor Shield current sensing; use A2 #define STROKE_LENGTH 102 #define POTENTIOMETER_MAX 4050 // PLEASE UPDATE THIS VALUE (from calibration) #define POTENTIOMETER_MIN 50 // PLEASE UPDATE THIS VALUE (from calibration) #define TOLERANCE 5 int targetPosition_mm = 50; DIYables_DC_Motor motor(MOTOR_CH_A); void read_position() { int potentiometer_value = analogRead(POTENTIOMETER_PIN); int stroke_pos = map(potentiometer_value, POTENTIOMETER_MIN, POTENTIOMETER_MAX, 0, STROKE_LENGTH); if (stroke_pos < (targetPosition_mm - TOLERANCE)) motor.run(MOTOR_FORWARD, 255); else if (stroke_pos > (targetPosition_mm + TOLERANCE)) motor.run(MOTOR_BACKWARD, 255); else motor.brake(); Monitor.print("Position: "); Monitor.print(stroke_pos); Monitor.print(" mm | Target: "); Monitor.print(targetPosition_mm); Monitor.println(" mm"); } void setup() { Bridge.begin(); Monitor.begin(); motor.begin(); motor.brake(); Bridge.provide_safe("read_position", read_position); Monitor.println("Actuator Feedback Bridge ready"); } void loop() {}

Python-Skript (Arduino App Lab) — kontinuierliches Lesen und Steuern der Position:

/* * 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-actuator-with-feedback */ from arduino.app_utils import * import time def loop(): Bridge.call("read_position") time.sleep(0.2) App.run(user_loop=loop)
  • Hinweis: Stellen Sie sicher, dass Bridge.begin() im MCU-Sketch aufgerufen wird und der Sketch hochgeladen ist, bevor Sie das Python-Skript ausführen.
  • ⚠️ Warnung: Öffnen Sie niemals direkt /dev/ttyHS1 (auf Linux) oder verwenden Sie Serial1 (auf MCU) — diese sind vom Arduino Router reserviert.

Schnellschritte

  • Aktualisieren Sie die Platzhalter im Bridge-MCU-Sketch (STROKE_LENGTH, POTENTIOMETER_MAX, POTENTIOMETER_MIN) und stellen Sie targetPosition_mm ein.
  • Aktualisieren Sie die Platzhalter im Bridge-MCU-Sketch (STROKE_LENGTH, POTENTIOMETER_MAX, POTENTIOMETER_MIN) und stellen Sie targetPosition_mm ein.
  • Laden Sie den MCU-Sketch hoch: Öffnen Sie Arduino App Lab, fügen Sie den Bridge-MCU-Sketch in sketch/sketch.ino ein, installieren Sie sowohl DIYables_DC_Motor als auch Arduino_RouterBridge Bibliotheken, und klicken Sie auf „Ausführen".
  • Fügen Sie das Python-Skript hinzu: Fügen Sie den Python-Code oben in die Python-Registerkarte ein.
  • Führen Sie die App aus: Python ruft read_position alle 200 ms auf; die MCU bewegt sich zum Ziel und meldet die Position.
  • Überprüfen Sie die Konsole: Öffnen Sie die Konsole → Subtab „MCU-Monitor".

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
Actuator Feedback Bridge ready Position: 30 mm | Target: 50 mm Position: 38 mm | Target: 50 mm Position: 47 mm | Target: 50 mm Position: 50 mm | Target: 50 mm

Telegram-Integration

Überwachen Sie die Antriebsposition und melden Sie sie via Telegram mit dem /position-Befehl.

Wenn Sie noch keinen Telegram-Bot haben, finden Sie unter So erstellen Sie einen Telegram-Bot Ihr Bot-Token, bevor Sie fortfahren.

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, bevor Sie fortfahren.

Python-Skript (Arduino App Lab) — Telegram-Bot für Antriebsposition:

/* * 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-actuator-with-feedback */ 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 == "/position": position = Bridge.call("read_position") send_message(chat_id, position) else: send_message(chat_id, "Commands:\n/position — read and control actuator position") time.sleep(0.5) App.run(user_loop=loop)
  • Hinweis: Ersetzen Sie YOUR_BOT_TOKEN durch das Token, das Sie von @BotFather erhalten haben.
  • Senden Sie /position, um einen Positionsabfrage auf der MCU auszulösen.

Schnellschritte

  • Laden Sie den MCU-Sketch hoch: Verwenden Sie den Bridge-MCU-Sketch (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.
  • Stellen Sie Ihr Token ein: Ersetzen Sie YOUR_BOT_TOKEN durch Ihr tatsächliches Bot-Token.
  • Führen Sie die App aus und senden Sie /position über Telegram.

App Lab-Konsolenausgabe

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 12:00:01] Telegram: /position [2026-04-29 12:00:01] Position: 30 mm | Target: 50 mm
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
/position
10:15 AM ✓✓
Position: 30 mm | Target: 50 mm
10:16 AM

OpenClaw-Integration

Sie können die OpenClaw mit diesem Tutorial anpassen, indem Sie auf die Anleitung im Tutorial Arduino Uno Q - OpenClaw verweisen.

Anwendungs- und Projektideen

  • Präzisions-Tor: Öffnen Sie ein Tor zu einer exakten Position (z.B. 50 % Weg) basierend auf einem Zeitplan
  • Verstellbares Solarpanel: Kippen Sie das Panel in einem berechneten Winkel mithilfe der Antriebspositionsrückmeldung
  • Höhenverstellbare Vorrichtung: Bewegen Sie ein Werkstück zu einer kalibrierten Höhe in einem Fertigungsaufbau
  • Automatisiertes Ventil: Positionieren Sie ein Ventil auf einen bestimmten offenen Prozentsatz basierend auf dem Durchsatzanforderung
  • Rehabilitationsgerät: Fahren Sie einen Übungsantrieb zu Zielwinkeln mit Positionsverfolgung

Fordern Sie sich selbst heraus

  • Einfach: Ändern Sie targetPosition_mm, um den Antrieb auf 25 mm zu fahren und überprüfen Sie die Genauigkeit
  • Mittel: Fügen Sie einen /set50-Telegram-Befehl hinzu, der den Antrieb zu 50 mm fährt
  • Fortgeschritten: Akzeptieren Sie einen /goto <mm>-Befehl mit einem dynamischen Ziel und validieren Sie den Bereich, bevor Sie fahren

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!