Arduino UNO Q - Communication entre Linux et le MCU

L'Arduino UNO Q dispose de deux processeurs : un MCU STM32 exécutant des programmes Arduino et un MPU Linux Qualcomm exécutant Python. Dans ce tutoriel, vous apprendrez comment ces deux processeurs se parlent en utilisant le Bridge — le mécanisme clé qui rend l'Arduino UNO Q unique.

Dans ce tutoriel, vous apprendrez :

Communication Linux MCU Arduino UNO Q

Matériel Requis

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
1×Recommandé: Shield à bornier à vis pour Arduino Uno
1×Recommandé: Sensors/Servo Expansion Shield for Arduino Uno
1×Recommandé: Shield plaque d'essai pour Arduino Uno
1×Recommandé: Boîtier pour Arduino Uno
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Arduino Uno

Ou vous pouvez acheter les kits suivants:

1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Fonctionnement du Bridge

L'Arduino UNO Q utilise une liaison série interne entre les deux processeurs — cela est géré automatiquement par la bibliothèque Arduino_RouterBridge. Vous n'ouvrez jamais cette liaison directement dans votre code.

※ Note:

/dev/ttyHS1 (côté Linux) et Serial1 (côté MCU) sont réservés par le bridge routeur. Ne les ouvrez jamais dans votre code — cela briserait la communication Bridge.

La communication suit un modèle requête → réponse — comme un appel téléphonique :

  • Linux (Python) fait toujours l'appel — il demande au MCU de faire quelque chose ou demande une valeur.
  • Le MCU répond toujours — il exécute la fonction demandée et peut renvoyer une valeur comme réponse.
  • Le MCU n'appelle jamais Linux de lui-même — il répond seulement quand Linux demande.
Qui Ce qu'il fait API
Linux (Python) Envoie une requête au MCU Bridge.call("fn")
MCU (C/C++) Reçoit la requête, exécute la fonction, répond Bridge.provide_safe("fn", fn)

Cela signifie que les données peuvent circuler dans les deux sens — mais Linux commence toujours la conversation :

  • Linux → MCU : Linux envoie une commande (ex. "allume la LED") et le MCU l'exécute.
  • MCU → Linux : Linux demande "quelle est la valeur du capteur ?" et le MCU répond avec les données.

Le MCU ne peut pas démarrer une conversation de lui-même. Si le MCU doit rapporter quelque chose (ex. un bouton a été appuyé), la solution est l'interrogation : le MCU sauvegarde l'événement dans une variable, et Python vérifie cette variable en appelant régulièrement une fonction Bridge.call("get_event").

À Propos du Moniteur vs Série

Sur Arduino UNO Q, il existe deux façons d'afficher des sorties depuis le MCU :

Méthode Visible dans la Console App Lab Bibliothèque requise
Monitor.println() ✅ Oui Arduino_RouterBridge
Serial.println() ❌ Non Aucune (intégrée)

Utilisez Monitor.println() quand vous voulez voir la sortie MCU dans Arduino App Lab. La sortie Serial va aux broches UART uniquement et n'est pas visible dans App Lab.

Exemple 1 : Linux Appelle le MCU (Linux → MCU)

C'est le modèle le plus courant. Le script Python appelle une fonction sur le MCU — par exemple, pour allumer ou éteindre une LED.

Code MCU

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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() {}

Code Python

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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)

Étapes Rapides

Première utilisation de l'Arduino UNO Q ? Suivez le tutoriel Démarrer avec Arduino UNO Q avant de continuer.

  • Connecter : Branchez le câble USB-C sur l'Arduino UNO Q.
  • Ouvrir Arduino App Lab : Lancez Arduino App Lab et attendez qu'il détecte votre carte.
  • Créer une nouvelle application : Cliquez sur le bouton Créer une nouvelle application.
Créer une nouvelle application dans Arduino App Lab sur Arduino UNO Q
  • Donnez un nom à l'application, par exemple : LinuxMcuComm1
  • Cliquez sur Créer pour confirmer.
Dossiers et fichiers de l'application Arduino App Lab sur Arduino UNO Q
  • Coller le programme MCU : Copiez le code MCU ci-dessus et collez-le dans sketch/sketch.ino.
  • Coller le code Python : Copiez le code Python ci-dessus et collez-le dans le fichier Python de l'application.
  • 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
  • Téléverser : Cliquez sur le bouton Exécuter dans Arduino App Lab.
Cliquer sur le bouton Exécuter dans Arduino App Lab sur Arduino UNO Q

Sortie de la Console App Lab

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

Fonctionnement

  • Le MCU enregistre une fonction set_led via Bridge.provide_safe().
  • Le script Python appelle Bridge.call("set_led", 1) — cela envoie une requête RPC au MCU.
  • Le MCU exécute set_led(1) et affiche une confirmation via Monitor.println().
  • Bridge.call() retourne "OK" quand la fonction se termine.

Exemple 2 : Le MCU Envoie des Données à Linux (MCU → Linux via valeur de retour)

Dans ce modèle, le côté Python demande une lecture de capteur au MCU. Le MCU lit le capteur et retourne la valeur à Python via le Bridge.

Code MCU

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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() {}

Code Python

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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)

Sortie de la Console App Lab

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

Fonctionnement

  • La fonction MCU lit un capteur (ici simulé avec analogRead(A0)) et retourne la valeur sous forme de chaîne.
  • Côté Python, Bridge.call("get_value") retourne cette chaîne — Python peut ensuite l'analyser et l'utiliser.
  • C'est le modèle standard pour lire n'importe quel capteur MCU depuis le côté Linux.

Exemple 3 : Passage d'Arguments de Linux au MCU

Le côté Python peut passer des arguments à la fonction MCU. C'est utile pour les commandes qui incluent des paramètres — par exemple, définir un angle cible, un seuil ou une valeur de vitesse.

Code MCU

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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() {}

Code Python

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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)

Sortie de la Console App Lab

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

Tutoriels connexes

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !