serial-core-mcu.py
Le duo de cerveaux de la X8 communique par un port série interne : ce script envoie l'heure Linux au core Arduino et décode ses messages JSON ligne à ligne. Le protocole texte est le dénominateur commun des deux mondes.
Matériel requis
Une Arduino Portenta X8 (module ST STM32MP1 : quad Cortex-A7 Linux + double cœur Cortex-M4 temps réel, 8 Go eMMC, 2 Go LPDDR4, Wi-Fi/BT embarqués, option LTE). Aucun : le lien est interne au module.
Câblage
Rien à câbler. Identifier le bon périphérique /dev/tty* du lien MCU (dmesg après boot).
Fonctionnement
pyserial ouvre le port interne à 115200 ; le script envoie un JSON horodaté par seconde et readline() lit les réponses du core, décodées si valides.
Exécution
Côté Linux : accès SSH (USB-C routed ou réseau) sur l'image Portenta Linux, scripts bash/Python. Côté temps réel : Arduino IDE avec le core « Arduino Mbed OS Portenta X8 Boards », cœur M7 applicatif, flash via mboot depuis Linux.
Variantes
Monter un protocole de commandes (allumer LED, lire capteur côté MCU), ou relayer vers MQTT côté Linux.
serial-core-mcu.py
#!/usr/bin/env python3
# Pont Linux <-> core Arduino : trames texte sur le lien serie interne.
# sudo apt install python3-serial
# Lister les ports : ls /dev/tty* puis dmesg pour trouver le lien MCU.
import serial
import time
import json
PORT = "/dev/ttyMCU" # nom du port interne : voir dmesg/ls /dev
lien = serial.Serial(PORT, 115200, timeout=1)
print("Lien serie vers le core Arduino ouvert", PORT)
try:
while True:
# 1) Envoyer l'heure Linux au core.
trame = json.dumps({"t": int(time.time())}) + "\n"
lien.write(trame.encode())
# 2) Lire les messages du core (JSON par ligne).
ligne = lien.readline().decode(errors="ignore").strip()
if ligne:
try:
print("core dit :", json.loads(ligne))
except json.JSONDecodeError:
print("core (brut) :", ligne)
time.sleep(1)
except KeyboardInterrupt:
lien.close()
# Cote Arduino (X8-M7) : lire/ecouter le lien serie interne
# expose par le core (documente dans la doc Portenta X8).