🛠 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

Objectifs

Le cœur de l'architecture X8 : faire dialoguer Linux et l'Arduino. Le pont officiel est un msgpack-RPC : côté Linux, le service systemd m4-proxy (préinstallé, écoute sur le port 5001) fait le broker ; côté M4, la bibliothèque RPC du core Mbed permet de RPC.bind des fonctions C++ appelables depuis des conteneurs, et RPC.call d'appeler des fonctions servies par Linux. Tu vas rejouer le tuto officiel « Python ↔ Arduino data exchange » : un sketch M4 qui expose subtract, et un conteneur Python qui l'appelle — avec le monitor série du M4 proxyfié sur /dev/ttyGS0.

Matériel

Code complet

// rpc_server_m4.ino — pattern de l'exemple officiel PortentaX8_EchoServer
#include "SerialRPC.h"   // proxy du moniteur série 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

Vérification attendue

Après flash du sketch M4 et lancement du conteneur, l'appel Python subtract(7, 4) renvoie 3 — calculé physiquement sur le Cortex-M4. En tapant whoami sur la série proxyfiée, c'est le M4 qui interroge Linux et imprime fio. Le service broker se surveille avec sudo journalctl -fu m4-proxy : c'est le premier endroit à regarder quand le RPC ne répond pas.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels