serial-core-mcu.py

Arduino Portenta X8 · Archivo : serial-core-mcu.py · Lenguaje : Python · Uso : Dialoguer entre le Linux et le cœur Arduino via série interne

El dúo de cerebros de la X8 se comunica por un puerto serie interno: este script envía la hora de Linux al core Arduino y decodifica sus mensajes JSON línea a línea. El protocolo de texto es el común denominador de los dos mundos.

Hardware

Un Arduino Portenta X8 (módulo ST STM32MP1: quad Cortex-A7 Linux + doble núcleo Cortex-M4 de tiempo real, 8 GB eMMC, 2 GB LPDDR4, Wi-Fi/BT integrados, opción LTE). Ninguno: el enlace es interno al módulo.

Cableado

Nada que cablear. Identificar el dispositivo /dev/tty* correcto del enlace MCU (dmesg tras el arranque).

Funcionamiento

pyserial abre el puerto interno a 115200; el script envía un JSON con marca de tiempo por segundo y readline() lee las respuestas del core, decodificadas si son válidas.

Ejecución

Lado Linux: acceso SSH (USB-C routed o red) sobre la imagen Portenta Linux, scripts bash/Python. Lado tiempo real: Arduino IDE con el core « Arduino Mbed OS Portenta X8 Boards », núcleo M7 de aplicación, grabado vía mboot desde Linux.

Variantes

Montar un protocolo de órdenes (encender LED, leer sensor lado MCU), o retransmitir a MQTT por el lado 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).

← Volver a la ficha