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:
- Wie die Bridge funktioniert und was die Arduino_RouterBridge-Bibliothek bewirkt
- Wie die Linux-Seite (Python) Funktionen auf der MCU-Seite aufrufen kann
- Wie die MCU-Seite Daten an die Linux-Seite zurücksendet
- Wie man Argumente übergeben und Rückgabewerte über die Bridge empfangen kann

Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
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
Python Code
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.

- Geben Sie der App einen Namen, zum Beispiel: LinuxMcuComm1
- Klicken Sie auf Create, um zu bestätigen.

- 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.

- Search for Arduino_RouterBridge created by Arduino and click the Install button.
- Upload: Klicken Sie auf die Schaltfläche "Run" in Arduino App Lab.

App Lab Console Output
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
Python Code
App Lab Console Output
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
Python Code
App Lab Console Output
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.