🛠 Nœud IoT de datalogging : capteurs sur le M4, stockage et transport en conteneur
Objectifs
Le cas d'usage signature de la X8, documenté par le tuto officiel datalogging-iot : les capteurs se branchent côté MCU (le STM32H747 expose côté Arduino 8 entrées ADC avec VREF séparé, 3 SPI, 4 sorties PWM, 7 GPIO — plus les 3 ADC/2 DAC/comparateurs et RNG du SoC), et le conteneur Docker côté Linux fait le stockage, la file d'attente et le transport (MQTT/HTTP). Séparation des responsabilités : le temps réel et l'analogique sur le M4, la mémoire (2 Go LPDDR4, 16 Go eMMC), le réseau et les libs modernes sur l'A53.
Matériel
- 1 × Arduino Portenta X8 + porteuse (Breakout/Max Carrier) pour accéder aux broches capteur
- 1 × capteur analogique (sonde, potentiomètre) sur une entrée ADC face-M4, ou capteur numérique sur SPI/I²C
- Réseau IP actif (tuto réseau) pour le transport
- Core « Arduino Mbed OS Portenta Boards » + adb
- Un broker MQTT de test (ou un simple serveur HTTP) sur le LAN
Code complet
// capteur_m4.ino — acquisition sur le M4, exposition RPC au conteneur
#include "SerialRPC.h"
#include "RPC.h"
const int BROCHE_CAPTEUR = A0; // >
// Le conteneur Linux appelle cette fonction a son rythme d'echantillonnage
int readSensor {
long somme = 0;
for (int i = 0; i < 16; i++) { somme += analogRead(BROCHE_CAPTEUR); }
return (int)(somme / 16); // moyenne de 16 lectures
}
void setup {
Serial.begin(115200);
RPC.bind("readSensor", readSensor);
}
void loop { delay(50); }
# Cote Linux : un conteneur de logging qui appelle readSensor via le
# broker m4-proxy (5001), journalise sur l'eMMC et publie en MQTT.
# Image de depart officielle pour le pont Python<->M4 :
docker run -d --name logger \
--restart unless-stopped \
-p 5002-5020:5002-5020 \
-v /home/fio/logs:/data \
--device /dev/ttyGS0 \
arduino/python-rpc-serial
# >
# (lecture RPC + file + MQTT) — reproduis-le depuis le tuto officiel.
Vérification attendue
Le conteneur appelle readSensor à intervalle régulier, les valeurs défilent dans le journal sur l'eMMC (dossier monté depuis l'hôte) et arrivent sur le broker MQTT. L'intérêt du montage : le M4 ne connaît ni TCP ni JSON — il expose une fonction ; tout le reste (bufferisation pendant les coupures réseau, TLS, formats) vit dans le conteneur, remplaçable et mis à jour par OTA sans toucher au firmware.
Erreurs fréquentes
- Faire tourner le stack réseau complet sur le M4 : c'est possible mais contre-productif sur X8 — le design officiel met le transport côté Linux ; le M4 reste un périphérique d'E/S temps réel.
readSensorqui bloque : un appel RPC doit rester court ; si tu moyennes sur 10 000 échantillons, l'appel Python attend et le watchod du conteneur peut gronder.- Perte de données pendant les coupures : le
--restart unless-stoppedrelance le conteneur, mais seule une file d'attente persistée sur l'eMMC (fichier, SQLite) survit aux redémarrages — ne te contente pas d'un buffer mémoire. - Confondre les ADC : la table du datasheet X8 (8 entrées ADC avec VREF séparé côté M4) ne correspond pas au brochage complet du STM32H747 — câble d'après la porteuse et la page pinout, pas d'après une fiche SoC.
- Alimentation des capteurs : les broches de la carte sont en 3,3 V, 8 mA max par broche — un capteur 5 V ou gourmand passe par un étage de niveau/translation, jamais directement.
- >
- >
Autres tutoriels pour cette carte
- Premiers pas : comprendre le monstre à 9 cœurs et entrer dans Linux via ADB
- Premier sketch sur le cœur M4 : le blink qui se flash par ADB
- Docker dès la sortie de l'emballage : premier conteneur sur le Linux embarqué
- Pont Linux ↔ Arduino : appeler des fonctions du sketch M4 depuis Python (RPC)
- Mettre la X8 en réseau : Wi-Fi du Murata 1DX et Gigabit Ethernet sur porteuse
- Le firmware caché : mettre à jour le bridge STM32H7 M7 qui expose les périphériques à Linux
Exemples de code pour cette carte
etat-systeme.shBashgpio-libgpiod.shBashpython-gpio.pyPythondocker-hello.shBashflasher-core-arduino.shBashwifi-nmcli.shBash