← Retour au portfolio English

Antenne

Vue d'ensemble de l'architecture — capteur de mouvement 9DoF vers OSC via Ethernet

Objectif

Une « antenne » de capteur de mouvement autonome : branchez le module MPU9150 directement dans le connecteur UEXT de l'ESP32-PoE, alimentez la carte via un seul câble Ethernet (PoE — pas d'alimentation séparée), et elle diffuse les données d'accéléromètre, de gyroscope, de magnétomètre et d'orientation fusionnée en OSC vers n'importe quel logiciel récepteur (Max/MSP, Pure Data, TouchDesigner, etc.) à 50 Hz. Le calibrage du gyroscope s'exécute automatiquement au démarrage, et un calibrage du magnétomètre (ponctuel ou au besoin) — déclenché par un appui bouton ou un message OSC distant — est conservé en mémoire flash afin de survivre aux redémarrages.

Matériel

PièceRéférence
Carte MCUOlimex ESP32-PoE (16 Mo de flash)
Capteur de mouvementOlimex MOD-MPU9150 (accéléromètre/gyroscope MPU-6050 + magnétomètre AK8975, dans un seul boîtier)
ConnexionConnecteur UEXT — se branche directement, sans câblage
RéseauEthernet RJ45, alimenté par PoE
Broches I2C (UEXT)SDA = GPIO13, SCL = GPIO16
LED intégréeGPIO33, actif à l'état haut
BTN1GPIO34, actif à l'état bas, pull-up externe

Vue d'ensemble du système

Vue d'ensemble du système Antenne Un capteur de mouvement 9DoF MOD-MPU9150 se connecte via I2C au firmware Olimex ESP32-PoE, qui fusionne l'orientation et diffuse un paquet OSC via Ethernet PoE vers un logiciel récepteur à 50 Hz. L'OSC entrant peut déclencher un calibrage du magnétomètre sur la carte. MOD-MPU9150 (UEXT, I2C) Accéléromètre,gyroscope, magnétomètre Firmware Olimex ESP32-PoE Lit les capteurs, fusionne l'orientation Paquet OSC sortant, Ethernet PoE 50 Hz vers DEST_IP:DEST_PORT Logiciel récepteur Max/MSP, Pure Data, TouchDesigner... L'OSC entrant sur le port 8888 (/mpu/calibrate) peut déclencher une session de calibrage du magnétomètre sur la carte à tout moment
Capteur → firmware → OSC via Ethernet → logiciel récepteur

L'OSC entrant sur le port 8888 (/mpu/calibrate) peut déclencher une session de calibrage du magnétomètre sur la carte à tout moment, indépendamment du flux de données sortant.

Boucle principale du firmware

La carte exécute une boucle à fréquence fixe de 50 Hz (LOOP_MS = 20) :

Boucle principale du firmware Antenne Après le calibrage au démarrage et le chargement de tout biais de magnétomètre sauvegardé, le firmware lit le MPU9150 et l'AK8975 via I2C, applique le biais du magnétomètre et exécute une fusion Kalman 9 axes, envoie le paquet OSC résultant via Ethernet, puis met à jour la LED et vérifie le bouton et l'OSC entrant avant de répéter toute la boucle toutes les 20 millisecondes. Démarrage : Ethernet, biais mag., calibrage gyro Calibrage immobile d'1 seconde Lire MPU9150 + AK8975 via I2C Accel, gyro, magnétomètre brut Correction de biais + fusion Kalman 9 axes puara-gestures — roulis, tangage, lacet compensé Envoyer le paquet OSC via Ethernet Accel, gyro, mag, angles d'Euler, inclinaison Mettre à jour la LED, vérifier BTN1 et l'OSC entrant Peut déclencher une session de calibrage ↻ se répète toutes les 20 ms (boucle à 50 Hz)
La boucle principale à fréquence fixe, de la lecture capteur à l'envoi OSC
  1. Démarrage — établit la liaison Ethernet (IP statique, jusqu'à 8 s d'attente), charge tout biais de magnétomètre précédemment sauvegardé depuis la flash (NVS), initialise le MPU9150 via I2C, et exécute un calibrage de biais du gyroscope d'1 seconde (200 échantillons, le capteur devant rester immobile).
  2. Lecture des capteurs — une rafale de lecture I2C de 14 octets couvre ensemble les registres de l'accéléromètre et du gyroscope ; le magnétomètre est lu séparément (via le mode bypass I2C du MPU9150 donnant un accès direct à l'AK8975 intégré) chaque fois que son bit de données prêtes est activé.
  3. Fusion d'orientation — si un calibrage du magnétomètre a été effectué, le biais correspondant par axe est soustrait avant que le vecteur soit normalisé à une longueur unitaire. Le résultat alimente un filtre de Kalman 9 axes (issu de puara-gestures) qui fusionne accéléromètre, gyroscope et magnétomètre en roulis, tangage, et lacet compensé en inclinaison.
  4. Envoi OSC — un paquet par itération de boucle, conditionné à ce que la liaison Ethernet soit active.
  5. Gestion LED / entrées — la machine à états de la LED et le détecteur d'appui long de BTN1 s'exécutent à chaque cycle, et toute demande de calibrage OSC entrante est également traitée ici.

Calibrage du magnétomètre

Les interférences ferromagnétiques (métal à proximité, haut-parleurs, alimentations) décalent le point zéro du magnétomètre, ce qui fausse le lacet. Le calibrage supprime ce décalage constant — nécessaire une fois lors de la première installation, et à nouveau chaque fois que la configuration physique de l'instrument change.

Séquence de calibrage du magnétomètre Antenne Le calibrage est déclenché soit en maintenant un bouton pendant 5 secondes, soit par un message OSC entrant. Une fenêtre de 30 secondes suit alors la lecture minimale et maximale du magnétomètre sur chaque axe pendant que le capteur est tourné dans toutes les orientations. Le point médian du min et du max de chaque axe devient le biais ferromagnétique, sauvegardé en flash et chargé automatiquement à chaque démarrage futur. Déclencher le calibrage Maintenir BTN1 5s, ouenvoyer l'OSC /mpu/calibrate Fenêtre de rotation de 30s LED clignotement rapide (4 Hz), suit min/max par axe Calculer le biais ferromagnétique biais = (min + max) / 2, par axe Sauvegarder en flash (NVS) LED fixe pendant 1s confirme la fin Chargé automatiquement à chaque démarrage futur Survit aux coupures de courant et mises à jour
Séquence de calibrage, du déclenchement au biais persisté

Le calibrage peut être démarré de deux façons — en maintenant le bouton physique, ou en envoyant un message OSC depuis le même réseau vers lequel la carte diffuse — afin de pouvoir être déclenché soit directement sur l'instrument, soit à distance depuis le logiciel qui reçoit déjà ses données. Pendant la fenêtre de 30 secondes, faire tourner le capteur à travers toutes les orientations (un mouvement en huit couvrant tous les axes fonctionne bien) permet au firmware d'enregistrer le minimum et le maximum réels sur chaque axe du magnétomètre ; le point médian du min/max de chaque axe devient le biais de cet axe. Le résultat est écrit en mémoire non volatile et survit aux coupures de courant et aux reflashages du firmware.

États de la LED

Comportement LEDSignification
ÉteintePas de liaison Ethernet
Clignotement lent (1 Hz)Connectée et en diffusion
Fixe (allumée)BTN1 est maintenu enfoncé — continuer à maintenir pour démarrer le calibrage
Clignotement rapide (4 Hz)Calibrage du magnétomètre en cours
Fixe pendant 1 secondeCalibrage venant de se terminer avec succès

Référence OSC

Sortant (carte → ordinateur), un paquet toutes les 20 ms

AdresseTypeUnitéDescription
/mpu/accel/x /mpu/accel/y /mpu/accel/zfloatgAccéléromètre brut
/mpu/gyro/x /mpu/gyro/y /mpu/gyro/zfloat°/sGyroscope, corrigé du biais
/mpu/mag/x /mpu/mag/y /mpu/mag/zfloatsphère unitaireMagnétomètre, normalisé ; décalé avant calibrage, centré sur l'origine après
/mpu/euler/rollfloat° (0–360)Rotation autour de X
/mpu/euler/pitchfloat° (−90–+90)Rotation autour de Y
/mpu/euler/yawfloat° (0–360)Cap, compensé en inclinaison
/mpu/tiltfloat° (0–180)Magnitude d'inclinaison combinée, sqrt(roll² + pitch²), plafonnée
/mpu/btn1int—1 tant que BTN1 est maintenu, sinon 0
/mpu/cal/statusint—0 = non calibré, 1 = calibrage en cours, 2 = calibré

Entrant (ordinateur → carte), port 8888

AdresseArgumentsDescription
/mpu/calibrate(aucun)Démarre une session de calibrage du magnétomètre de 30 secondes

Paramètres ajustables

ParamètreEmplacementDéfautEffet
Fréquence d'envoiLOOP_MS20 (50 Hz)Plus bas = mises à jour plus rapides ; ne pas descendre sous 10 (100 Hz)
Bruit de processus Kalman (Q)kalman(Q, R)0,001À quel point le filtre fait confiance à l'intégration du gyroscope ; plus bas = plus lisse mais plus lent à réagir
Bruit de mesure Kalman (R)kalman(Q, R)0,01À quel point le filtre fait confiance aux corrections accéléromètre/magnétomètre ; plus haut = plus lisse mais dérive davantage en cas de perturbation
Bande passante DLPF du gyroscopeÉcriture registre R_CONFIG0x04 (~21 Hz)0x02=98 Hz (mouvement rapide) … 0x05=10 Hz (quasi statique) ; le réglage actuel convient aux mouvements lents et délibérés

Structure du projet

├── boards/
│   └── esp32-poe-16mb.json     définition de carte PlatformIO personnalisée
├── examples/
│   ├── ESP32_PoE_Ethernet_SD_Card_Arduino.ino
│   ├── ESP32_PoE_WebServer_Demo.ino
│   └── MagnetometreCalibrationDemo.cpp
├── mpu9150_demo/                démo brute originale du capteur
├── src/
│   └── main.cpp                 firmware (à modifier)
└── platformio.ini

Les dossiers examples/ et mpu9150_demo/ sont du matériel de référence inclus, ne faisant pas partie du firmware réellement exécuté — chacun provient d'une origine différente et est conservé pour référence plutôt qu'exécuté :

Définition de carte PlatformIO personnalisée

boards/esp32-poe-16mb.json définit la variante 16 Mo de flash de l'Olimex ESP32-PoE pour PlatformIO, puisqu'elle ne fait pas partie des cartes intégrées par défaut : table de partitions et script de l'éditeur de liens corrects pour 16 Mo de flash, câblage du PHY Ethernet spécifique à cette carte (LAN8720 via RMII, broches MDC/MDIO, broche d'alimentation, mode d'horloge), et paramètres de téléversement (921 600 bauds, esptool/espota).

Dépendances

Gérées automatiquement par PlatformIO :