🛠 Pont Linux ↔ Arduino : appeler des fonctions du sketch M4 depuis Python (RPC)

Arduino Portenta X8 · intermediaire · Schéma : IMG-portenta-x8-intermediaire-1-portenta-x8-rpc-python-m4.svg — Arduino Portenta X8 en deux colonnes : à gauche un conteneur Python avec un script appelant subtract(7,4), à droite le cœur Cortex-M4 du STM32H747XI avec la fonction bindée, flèches aller-retour étiquetées msgpack-RPC et m4-proxy ports 5001-5020, terminal affichant le résultat 3

Objetivos

El núcleo de la arquitectura X8: hacer que Linux y Arduino dialoguen. El puente oficial es un msgpack-RPC: en el lado de Linux, el servicio systemd m4-proxy (preinstalado, escucha en el puerto 5001) actúa como broker; en el lado M4, la biblioteca RPC del core Mbed permite usar RPC.bind para exponer funciones C++ invocables desde contenedores, y RPC.call para llamar a funciones servidas por Linux. Vas a repetir el tutorial oficial «Python ↔ Arduino data exchange»: un sketch M4 que expone subtract, y un contenedor Python que lo llama — con el monitor serie del M4 proxyfiado en /dev/ttyGS0.

Material

Código completo

// rpc_server_m4.ino — pattern de l'exemple officiel PortentaX8_EchoServer
#include "SerialRPC.h"   // proxy du moniteur serie vers Linux
#include "RPC.h"         // msgpack-RPC M4 <-> Linux via m4-proxy

// Fonction tournee sur le M4, appelable depuis un conteneur Linux
int subtract(int a, int b) { return a - b; }

void setup {
  Serial.begin(115200);          // visible cote Linux via m4-proxy
  pinMode(LED_BUILTIN, OUTPUT);
  RPC.bind("subtract", subtract);   // enregistre l'API pour Linux
}

void loop {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  // Appel vers Linux : « whoami » est servi par le service m4-proxy
  if (Serial.available) {
    String cmd = Serial.readStringUntil('\n');
    if (cmd.startsWith("whoami")) {
      auto res = RPC.call("whoami").as<std::string>;
      Serial.println(res.c_str);
    }
  }
}
# cote Linux (conteneur arduino/python-rpc-serial) — appel du M4
# lance : adb shell puis docker exec -it python-rpc-serial python3
import rpc
client = rpc.Client("127.0.0.1", 5001)     # le broker m4-proxy
print(client.call("subtract", 7, 4))        # -> 3, calcule sur le M4

Verificación esperada

Tras flashear el sketch M4 y lanzar el contenedor, la llamada Python subtract(7, 4) devuelve 3 — calculado físicamente en el Cortex-M4. Al escribir whoami en la serie proxyfiada, es el M4 quien interroga a Linux e imprime fio. El servicio broker se supervisa con sudo journalctl -fu m4-proxy: es el primer lugar donde mirar cuando el RPC no responde.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales