Arduino UNO Q - Kommunikation zwischen Linux und MCU

Die Arduino UNO Q verfügt über zwei Prozessoren: einen STM32 MCU, der Arduino-Sketches ausführt, und einen Qualcomm Linux MPU, der Python ausführt. In diesem Tutorial erfahren Sie, wie diese beiden Prozessoren miteinander über die Bridge kommunizieren – der Schlüsselmechanismus, der die Arduino UNO Q einzigartig macht.

In diesem Tutorial erfahren Sie:

Arduino UNO Q Linux MCU Communication

Erforderliche Hardware

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
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.

Wie die Bridge funktioniert

Die Arduino UNO Q verwendet eine interne serielle Verbindung zwischen den beiden Prozessoren – diese wird automatisch von der Arduino_RouterBridge-Bibliothek verwaltet. Sie öffnen diese Verbindung niemals direkt in Ihrem Code.

※ Notiz:

/dev/ttyHS1 (auf der Linux-Seite) und Serial1 (auf der MCU-Seite) sind reserviert vom Router Bridge. Öffnen Sie diese niemals in Ihrem Code – dies würde die Bridge-Kommunikation unterbrechen.

Die Kommunikation folgt einem Anfrage-Antwort-Modell – stellen Sie sich vor, es wäre ein Telefonanruf:

  • Linux (Python) ruft immer an – es bittet den MCU, etwas zu tun oder fordert einen Wert an.
  • MCU antwortet immer – es führt die angeforderte Funktion aus und kann einen Wert als Antwort zurücksendet.
  • Die MCU ruft Linux niemals von selbst an – sie antwortet nur, wenn Linux fragt.
Wer Was es tut API
Linux (Python) Sendet eine Anfrage an den MCU Bridge.call("fn")
MCU (C/C++) Empfängt die Anfrage, führt die Funktion aus, antwortet Bridge.provide_safe("fn", fn)

Dies bedeutet, dass Daten in beide Richtungen fließen können – aber Linux startet immer das Gespräch:

  • Linux → MCU: Linux sendet einen Befehl (z. B. "LED einschalten") und der MCU führt ihn aus.
  • MCU → Linux: Linux fragt "Was ist der Sensorwert?" und der MCU antwortet mit den Daten.

Der MCU kann nicht von sich aus ein Gespräch starten. Wenn der MCU etwas melden muss (z. B. wenn eine Taste gedrückt wurde), ist der Workaround Polling: Der MCU speichert das Ereignis in einer Variable, und Python überprüft diese Variable, indem er regelmäßig eine Bridge.call("get_event")-Funktion aufruft.

Über Monitor vs Serial

Auf Arduino UNO Q gibt es zwei Möglichkeiten, die Ausgabe des MCU auszudrucken:

Methode In App Lab Console sichtbar Erfordert Bibliothek
Monitor.println() ✅ Ja Arduino_RouterBridge
Serial.println() ❌ Nein Keine (eingebaut)

Verwenden Sie Monitor.println(), wenn Sie MCU-Ausgabe in Arduino App Lab sehen möchten. Serial-Ausgabe geht nur zu den UART-Pins und ist in App Lab nicht sichtbar.

Beispiel 1: Linux ruft den MCU auf (Linux → MCU)

Dies ist das häufigste Muster. Das Python-Skript ruft eine Funktion auf dem MCU auf – zum Beispiel, um eine LED ein- oder auszuschalten.

MCU Code

/* * 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-communication-between-linux-and-mcu */ #include "Arduino_RouterBridge.h" #define LED_PIN LED_BUILTIN // Built-in RGB LED on Arduino UNO Q (LED3 on the board, lights up RED, active LOW) void set_led(int state) { // Active LOW: state 1 = on (LOW), state 0 = off (HIGH) digitalWrite(LED_PIN, state ? LOW : HIGH); Monitor.print("set_led called: state="); Monitor.println(state); } void setup() { Bridge.begin(); Monitor.begin(); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); // start with LED off Bridge.provide_safe("set_led", set_led); Monitor.println("Bridge ready"); } void loop() {}

Python Code

/* * 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-communication-between-linux-and-mcu */ from arduino.app_utils import * import time def loop(): print("Turning LED ON...") result = Bridge.call("set_led", 1) print(result) time.sleep(1) print("Turning LED OFF...") result = Bridge.call("set_led", 0) print(result) time.sleep(1) App.run(user_loop=loop)

Schnelle Schritte

Zum ersten Mal mit Arduino UNO Q? Folgen Sie dem Erste Schritte mit Arduino UNO Q-Tutorial, bevor Sie fortfahren.

  • Verbinden: Stecken Sie das USB-C-Kabel in die Arduino UNO Q.
  • Öffnen Sie Arduino App Lab: Starten Sie Arduino App Lab und warten Sie, bis Ihr Board erkannt wird.
  • Erstellen Sie eine neue App: Klicken Sie auf die Schaltfläche Create New App.
Create New App in Arduino App Lab on Arduino UNO Q
  • Geben Sie der App einen Namen, zum Beispiel: LinuxMcuComm1
  • Klicken Sie auf Create, um zu bestätigen.
Arduino App Lab App folders and files on Arduino UNO Q
  • Fügen Sie den MCU-Sketch ein: Kopieren Sie den MCU-Code oben und fügen Sie ihn in sketch/sketch.ino ein.
  • Fügen Sie den Python-Code ein: Kopieren Sie den Python-Code oben und fügen Sie ihn in die Python-Datei der App 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 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
  • Upload: Klicken Sie auf die Schaltfläche "Run" in Arduino App Lab.
Click Run button in Arduino App Lab on Arduino UNO Q

App Lab Console Output

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
[2026-05-07 09:00:01] Bridge ready [2026-05-07 09:00:02] set_led called: state=1 [2026-05-07 09:00:03] set_led called: state=0 [2026-05-07 09:00:04] set_led called: state=1 [2026-05-07 09:00:05] set_led called: state=0
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-05-07 09:00:01] Turning LED ON... [2026-05-07 09:00:02] OK [2026-05-07 09:00:03] Turning LED OFF... [2026-05-07 09:00:04] OK

Wie es funktioniert

  • Der MCU registriert eine Funktion set_led über Bridge.provide_safe().
  • Das Python-Skript ruft Bridge.call("set_led", 1) auf – dies sendet eine RPC-Anfrage an den MCU.
  • Der MCU führt set_led(1) aus und druckt eine Bestätigung über Monitor.println().
  • Bridge.call() gibt "OK" zurück, wenn die Funktion abgeschlossen ist.

Beispiel 2: MCU sendet Daten an Linux (MCU → Linux über Rückgabewert)

In diesem Muster fordert die Python-Seite eine Sensorablesung vom MCU an. Der MCU liest den Sensor und gibt den Wert über die Bridge an Python zurück.

MCU Code

/* * 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-communication-between-linux-and-mcu */ #include "Arduino_RouterBridge.h" const char* get_value() { int raw = analogRead(A0); // read analog sensor on A0 static char buf[8]; itoa(raw, buf, 10); Monitor.print("get_value called — returning "); Monitor.println(buf); return buf; } void setup() { Bridge.begin(); Monitor.begin(); Bridge.provide_safe("get_value", get_value); Monitor.println("Bridge ready"); } void loop() {}

Python Code

/* * 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-communication-between-linux-and-mcu */ from arduino.app_utils import * import time def loop(): result = Bridge.call("get_value") print("MCU returned:", result) time.sleep(2) App.run(user_loop=loop)

App Lab Console Output

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
[2026-05-07 09:00:01] Bridge ready [2026-05-07 09:00:02] get_value called — returning 42 [2026-05-07 09:00:04] get_value called — returning 43 [2026-05-07 09:00:06] get_value called — returning 41
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-05-07 09:00:02] MCU returned: 42 [2026-05-07 09:00:04] MCU returned: 43 [2026-05-07 09:00:06] MCU returned: 41

Wie es funktioniert

  • Die MCU-Funktion liest einen Sensor (hier simuliert mit analogRead(A0)) und gibt den Wert als String zurück.
  • Auf der Python-Seite gibt Bridge.call("get_value") diesen String zurück – Python kann ihn dann analysieren und verwenden.
  • Dies ist das Standardmuster zum Lesen eines MCU-Sensors von der Linux-Seite.

Beispiel 3: Übergeben von Argumenten von Linux an MCU

Die Python-Seite kann Argumente an die MCU-Funktion übergeben. Dies ist nützlich für Befehle, die Parameter enthalten – zum Beispiel das Setzen eines Zielwinkels, eines Schwellwerts oder eines Geschwindigkeitswerts.

MCU Code

/* * 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-communication-between-linux-and-mcu */ #include "Arduino_RouterBridge.h" #define LED_PIN LED_BUILTIN // Built-in RGB LED on Arduino UNO Q (LED3 on the board, lights up RED, active LOW) void set_brightness(int value) { // analogWrite simulates brightness (0 = off, 255 = full on) // Note: active LOW — invert for LED_BUILTIN analogWrite(LED_PIN, 255 - value); Monitor.print("set_brightness called: value="); Monitor.println(value); } void setup() { Bridge.begin(); Monitor.begin(); pinMode(LED_PIN, OUTPUT); Bridge.provide_safe("set_brightness", set_brightness); Monitor.println("Bridge ready"); } void loop() {}

Python Code

/* * 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-communication-between-linux-and-mcu */ from arduino.app_utils import * import time def loop(): for brightness in [0, 64, 128, 192, 255]: print(f"Setting brightness to {brightness}...") result = Bridge.call("set_brightness", brightness) print(result) time.sleep(1) App.run(user_loop=loop)

App Lab Console Output

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
[2026-05-07 09:00:01] Bridge ready [2026-05-07 09:00:02] set_brightness called: value=0 [2026-05-07 09:00:03] set_brightness called: value=64 [2026-05-07 09:00:04] set_brightness called: value=128 [2026-05-07 09:00:05] set_brightness called: value=192 [2026-05-07 09:00:06] set_brightness called: value=255
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-05-07 09:00:01] Setting brightness to 0... [2026-05-07 09:00:02] Done [2026-05-07 09:00:03] Setting brightness to 64... [2026-05-07 09:00:04] Done [2026-05-07 09:00:05] Setting brightness to 128... [2026-05-07 09:00:06] Done

Wie es funktioniert

  • Argumente werden als zusätzliche Parameter an Bridge.call("function_name", arg1, arg2, ...)übergeben.
  • Auf der MCU-Seite erhält die registrierte Funktion Argumente als int- (oder const char * für Strings) Parameter.
  • Der MCU kann ein Ergebnisstring über den Funktionsrückgabewert an Python zurückgeben.

Zusammenfassung

Muster MCU Seite Python Seite
Linux ruft MCU auf Bridge.provide_safe("fn", fn) Bridge.call("fn")
MCU gibt einen Wert zurück return "value" result = Bridge.call("fn")
Linux übergibt Argumente void fn(int a, int b) Bridge.call("fn", a, b)
MCU Konsolenausgabe Monitor.println("...") *(sichtbar in App Lab console)*

※ Notiz:

Alle Bridge-Funktionen müssen nicht blockierend sein – verwenden Sie nicht delay() in einer Bridge-registrierten Funktion. Die Bridge läuft ab, wenn die MCU-Funktion zu lange dauert.

Fehlerbehebung

Bridge.call() gibt einen Fehler oder einen leeren String zurück:

  • Überprüfen Sie, dass der Funktionsname in Bridge.call("name") genau mit dem Namen übereinstimmt, der in Bridge.provide_safe("name", fn) auf der MCU-Seite verwendet wird – der Name unterscheidet zwischen Groß- und Kleinbuchstaben.
  • Stellen Sie sicher, dass Bridge.begin() in setup() vor Bridge.provide_safe() aufgerufen wird.

MCU-Ausgabe wird nicht in App Lab angezeigt:

  • Verwenden Sie Monitor.println() – nicht Serial.println(). Nur Monitor-Ausgabe wird in der App Lab-Konsole angezeigt.
  • Stellen Sie sicher, dass Monitor.begin() in setup() aufgerufen wird.

Das Board reagiert nach einer Weile nicht mehr:

  • Öffnen Sie nicht /dev/ttyHS1 (Linux) oder Serial1 (MCU) in Ihrem Code – diese sind für den Bridge-Router reserviert.
  • Vermeiden Sie die Verwendung von delay() in Bridge-registrierten Funktionen.

※ 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!