Magnétomètre Haute Précision : Défis de conception

Après avoir finalisé plusieurs projets, j'ai lancé mon blog pour partager mes réalisations. Dans mes articles, je me concentrais principalement sur les résultats obtenus, sans détailler la démarche de conception. Cependant, alors que mon travail actuel coïncide avec la rédaction de nouveaux articles, je vais proposer un contenu plus prospectif, mettant davantage en lumière les défis et les choix liés à la conception d’un nouveau dispositif. C’est pourquoi, dans ce qui suit, je vais aborder les différentes difficultés et les changements de cap que j’ai dû affronter lors de la conception de mon projet en cours : un magnétomètre de haute précision. J’espère également qu’il sera évident, à travers cet exemple, que pour l’embarqué, les projets relèvent souvent d’une logique très pluridisciplinaire, où il est nécessaire de considérer l’ensemble du dispositif pour obtenir un résultat fonctionnel. Dans ce cas précis, j'ai changé plusieurs fois de stratégie, il a fallu tenir compte des couplages entre le champ magnétique mesuré et les moteurs pas à pas utilisés, etc. Cela m’a conduit à revoir la géométrie, à concevoir une tourelle motorisée, à rajouter des actionneurs, à changer la stratégie de gestion des biais des capteurs, puis à revoir le PCB en conséquence, etc. Beaucoup de ces éléments sont relativement simples pris individuellement, mais c’est leur intégration dans un tout cohérent qui représente un défi. C’est cette démarche globale que je souhaitais restituer et que j’apprécie particulièrement : jongler entre différentes disciplines, équilibrer des contraintes parfois contradictoires et, surtout, transformer une idée en un système fonctionnel.

Bertrand Selva

11/19/202415 min read

Exploration du Dithering pour Améliorer la Précision des Mesures

J'ai déjà écrit plusieurs billets sur l'utilisation du dithering pour augmenter la résolution effective des capteurs. Le dithering est une technique de traitement du signal qui consiste à ajouter un bruit contrôlé à un signal avant sa quantification (mais cela marche aussi en utilisant le bruit "naturel" des capteurs). Cette méthode permet de réduire les erreurs de quantification et d'améliorer la précision des mesures, en particulier lorsqu'on travaille avec des signaux de faible amplitude ou des résolutions limitées.

Un résultat notable du dithering est la réduction de la variance des erreurs de mesure en fonction de l'inverse de la racine carrée du nombre de mesures n, soit :

Cette propriété statistique est particulièrement utile lorsqu'il est possible d'effectuer un grand nombre de mesures, permettant ainsi de diminuer le bruit de fond et d'augmenter la fiabilité des résultats.
J'ai mis en pratique cette technique avec des gyroscopes MEMS pour mesurer une grandeur aussi ténue que le taux de rotation de la Terre https://selvasystems.net/systemes-embarques-et-traitement-du-signal ou encore pour mettre au point un gyrocompas qui trouve le nord sans recours à la mesure du champs magnétique terrestre : https://selvasystems.net/innovations.

Une difficulté majeure dans l'amélioration de la précision des capteurs par cette approche est la gestion des biais individuels des capteurs. Pour surmonter ce problème, j'ai utilisé deux approches :

  1. Utilisation de Plusieurs Capteurs : En intégrant plusieurs capteurs, il est possible de comparer les valeurs mesurées par chaque capteur dans la même orientation, ce qui permet d'obtenir des informations sur les biais individuels.

  2. Rotation des Capteurs lors des Mesures : En faisant tourner les capteurs à l'aide d'une tourelle motorisée, on peut mesurer le signal dans des directions opposées. Dans un sens, on obtient biais+signal, et dans l'autre sens biais - signal. En combinant ces mesures, il est possible d’identifier les biais systématiques des différents capteurs.

Application aux Magnétomètres MEMS

Fort de cette expérience, j'ai eu l'idée d'appliquer cette méthode à un nouveau type de capteur : les magnétomètres MEMS. Mon objectif est de mesurer le champ magnétique terrestre et ses variations, ce qui présente un défi technique en raison de la faiblesse du champ (~50 000 nT) et surtout de ses variations, encore plus ténues (de l'ordre de 100 nT pour les cycles circadiens et 10 nT pour les variations saisonnières).

Importance de la Mesure du Champ Magnétique Terrestre

C'est une mesure d'autant plus intéressante que la magnétosphère joue un rôle crucial dans la protection de la vie sur Terre (elle nous protège des rayonnements cosmiques et des particules chargées émises par le Soleil). Le champ magnétique terrestre est influencé localement par la nature du sous-sol local. Il change en présence de tempêtes solaires. Il présente également des anomalies, comme l'Anomalie de l'Atlantique Sud, qui est une zone où le champ magnétique terrestre est particulièrement faible. Ces anomalies pourraient être autant de signes précurseurs d'une inversion ou d'une excursion des pôles magnétiques. Ces événements arrivent en moyenne tous les 200 000 ans, et la dernière inversion a eu lieu il y a environ 780 000 ans. Bref c’est un phénomène intéressant et complexe, très couplé à la vie sur terre et aujourd’hui il n’est pas (encore) possible de procéder à sa mesure précisément pour un particulier…

Première Version Envisagée

L’idée était d’exploiter des capteurs MEMS, les MMC5603, qui sont des capteurs AMR (Anisotropic MagnetoResistance), caractérisés par un faible bruit RMS (entre 200 et 700 nT en fonction des conditions d’acquisition, un peu meilleur que la concurrence et disposant de 20 bits significatifs alors que la concurrence est souvent à 16 bits ou 12 bits).
Les capteurs AMR fonctionnent sur le principe suivant : ils utilisent la variation de résistance électrique d’un matériau ferromagnétique en fonction du champ magnétique appliqué. Cette variation, due à l’effet magnétorésistif anisotrope, permet de mesurer l’intensité et la direction du champ magnétique.

En lisant la documentation, je pensais qu’il serait possible de gérer les biais grâce aux étapes de SET/RESET. En fait les étapes de SET/RESET permettent de réaligner les domaines magnétiques internes du capteur, éliminant ainsi les aimantations résiduelles qui pourraient affecter la précision des mesures.

Le premier PCB envisagé ressemblait à cela : une gestion de l’alimentation avec une alimentation à découpage LM2596 et un filtre passe-bas en aval, un microcontrôleur ESP32, un multiplexeur pour le port I2C, et en bord de PCB les 4 capteurs MEMS. Un GPS NEO-6M, relié au port UART du microcontrôleur permettait l’horodatage des mesures et leur localisation. Les différents plans de masse en étoile étaient reliés par des ponts de masse contrôlés pour minimiser les boucles de masse et les interférences électromagnétiques.

J’ai commencé à développer sur cette base. Je pensais que ce serait un projet « facile ». Et les ennuis ont commencé…

Problème de Saturation du Port I2C : Deuxième Version

Avant les premières expérimentations avec mes capteurs MMC5603, il a fallu écrire des drivers adaptés au framework Espressif pour permettre un contrôle précis de ces capteurs. Cependant, dès que j’ai essayé d’atteindre la fréquence d’acquisition visée, j’ai rencontré une difficulté: pour gérer quatre capteurs sur le même bus I2C, le multiplexeur (l’adresse I2C des capteurs n’est pas réglable) devait commuter plusieurs centaines de fois par seconde. Cela fonctionnait, mais au prix d’une fiabilité insuffisante. Sur plusieurs dizaines de milliers de mesures, des plantages réguliers se produisaient, compromettant l’intégrité des données.

En réévaluant les performances du port I2C, j’ai constaté que le débit nécessaire ne dépassait pourtant pas les capacités du bus. Avec une fréquence cible de 1000 échantillons par capteur par seconde (soit 4000 échantillons par seconde au total), chaque trame I2C nécessitait environ 45 bits (1 octet pour l’adresse, 4 octets pour les données, et les bits d’acknowledgment). Cela correspondait à un débit théorique de :

J’ai envisagé une autre solution : émuler un port I2C en Bit Banging et me passer du multiplexeur. L’idée était d’émuler un second port I2C en réalisant les commutations « à la main » via des GPIOs, comme cela se fait avec des ports I2C logiciels sous Arduino. Cette solution a effectivement permis de créer un port I2C supplémentaire fonctionnel. Cependant, elle s’est révélée très lente, avec une fréquence maximale d’environ 60 kHz, bien inférieure à celle du port I2C natif. De plus, cette approche consommait des ressources CPU nécessaire pour d’autres parties du projet. Et le besoin du respect des timing rendait son usage difficilement compatible avec un environnement multitâche sous FreeRTOS. Les problèmes de synchronisation et de timing auraient introduit des instabilités supplémentaires, ce qui m’a conduit à abandonner cette solution.

Solution :

Sur un ESP32, on dispose de deux ports I2C. Je ne voulais pas renoncer aux 4 capteurs pour des questions de temps d’acquisition de la mesure (et parce que je les avais déjà achetés !). J’ai donc décidé d’utiliser deux ESP32. Le second PCB envisagé ressemblait à ceci : un ESP32 maître pour l’écran, le port SPI de la carte SD et deux capteurs MEMS, tandis qu’un autre ESP32, l’esclave, relié au maître par un port UART, gérerait sur son autre port UART le GPS ainsi que deux des 4 capteurs MEMS. Vous pouvez voir le PCB envisagé à l’époque. Mais ça ne faisait toujours pas l’affaire…

Nouveau Problème Lié au Changement d’Architecture : Parallélisation du Calcul pour Kalman

J’avais initialement envisagé un seul filtre de Kalman gérant le calcul des biais des capteurs, la détermination des valeurs de champ suivant les 3 directions et les dépendances à la température pour chacun des capteurs (comme j’avais fait ici : https://selvasystems.net/innovations).

Un élément qui me gênait la version équipée de deux ESP32, donc virtuellement d’une puissance double par rapport à la situation initiale, était de ne pas en tirer profit :le filtre de Kalman est un filtre itératif qui utilise la mesure précédente pour être réactualisé à chaque itération. C’est typiquement le type de calcul qu’on ne peut pas paralléliser facilement.

Solution :

Pour tirer parti des 4 cœurs disponibles, il fallait revoir l’architecture du traitement du signal. Dans la littérature, il existe des filtrages de Kalman distribués dans des contextes analogues au mien, utilisant une approche à deux niveaux. Appliquée à mon problème, cela donne :

  • Niveau 1 : Sur chaque ESP32, un filtre de Kalman calcule localement les valeurs de champ magnétique, les variances et les offsets pour les axes X, Y, Z de chaque capteur. Ce filtrage de premier niveau permet de lisser les fluctuations rapides et de donner les informations sur les variances et les valeurs des champs estimés suivant les trois axes ainsi que l’offset propre au capteur pour chacun de ses axes.

  • Niveau 2 : Le microcontrôleur maître applique un filtre de Kalman de second niveau sur les données agrégées des quatre capteurs. Ce processus, effectué toutes les 100 mesures environ pour réduire la charge de calcul, inclut : la fusion des valeurs de champ pour les trois axes en une estimation globale, l’estimation des biais spécifiques à chaque capteur, l’évaluation des dépendances à la température pour adapter les mesures en fonction des variations thermiques, et l’estimation des variances.

Cette solution est plus complexe mais elle permet de tirer le meilleur parti des ressources disponibles. C’est ce que je vais tenter d’implémenter quand j’aurais fini la conception et la fabrication de la partie matériel.

Problème de Gestion des biais : Vers la Troisième Version

Un nouveau problème, et pas des moindres : la gestion du biais ne fonctionnait pas comme attendu. J’ai procédé à de nombreux tests avec 7 capteurs différents.

Les aspects positifs :
  • J’ai caractérisé un bruit moyen d’environ 240 nT sur l’ensemble des capteurs avec la bande passante la plus faible (6.6 ms par mesure) et un bruit à peine supérieur pour le temps d’acquisition le plus rapide de 1.2ms. C’est meilleur que la concurrence dans cette gamme de prix et correspond aux performances attendues.

  • Les capteurs fonctionnent vraiment. Lorsque j’approche un aimant néodyme même à une cinquantaine de centimètres, les valeurs changent significativement. Cela suggère que les capteurs ont la sensibilité attendue.

Les aspects négatifs :
  • Les cycles de SET/RESET appliqués avec le mode auto des capteurs ou calculés manuellement en associant les mesures en SET et les mesures en RESET ne conduisent pas à des valeurs recentrées en 0. Pire : les mesures obtenues à l’issue d’un cycle SET/RESET changent pour chaque capteur utilisé !

Conclusion

Le SET/RESET est conçu principalement pour restaurer les propriétés fondamentales du capteur, notamment en termes de sensibilité et de polarisation interne, mais il n'est pas conçu pour éliminer les offsets propres au capteur. Cela offre seulement une situation de référence pour le fonctionnement du capteur (en réalignant les domaines magnétiques internes du capteur afin de restaurer sa sensibilité et réduire les effets d'hystérésis), mais ne permet pas réellement de calculer le biais du capteur, contrairement à ce qui est suggéré dans la documentation.

En approfondissant mes recherches, je me suis rendu compte que c’était un défaut inhérent aux capteurs AMR. Ils sont sensibles et relativement linéaires mais sujets à des biais de mesure, et la gestion des biais par la bobine interne et les phases de SET et de RESET du capteur est critique (et ne fonctionne pas comme attendu dans mon cas). En réalité, j’avais des doutes dès le début : je ne comprenais pas comment une seule bobine pouvait conduire au comportement espéré.

Solution pour Pallier cette Difficulté

C’est une solution que j’ai déjà employée ailleurs (cf. mon article sur la compensation des biais dans les gyroscopes MEMS https://selvasystems.net/innovations). Il s’agit de considérer que, au cours de la mesure, le champ extérieur n’évolue pas et de s’en servir pour procéder à l’identification, en retournant mécaniquement le capteur, du biais et de la valeur du champ. Dans un sens, on mesure le champ plus le biais du capteur. Une fois retourné, le capteur mesure moins le champ plus le biais. Et là, c’est gagné.

Mais cette technique appliquée à notre problème engendre encore deux nouvelles difficultés :

  1. Il faut 2 degrés de liberté et non un seul pour “retourner” tous les axes. En effectuant une seule rotation, il est impossible de faire en sorte que x devienne -x, y devienne -y et z devienne -z simultanément. Il faut donc combiner deux rotations autour d’axes différents. Le système devient plus complexe car il nécessite 2 degrés de liberté (Précédemment j’avais utilisé des mesures impliquant seulement 2 composantes du vecteur mesure et un seul degré de liberté suffisait au retournement).

  2. Dans mon contexte expérimental et technique (peu de ressources, un dispositif qui doit rester peu cher, etc.), je suis contraint d’utiliser des moteurs pas à pas pour faire bouger les axes. Qui sont équipés de puissants aimants permanents…

On pourrait utiliser des moteurs sans aimant permanent pour éviter les perturbations magnétiques, mais le coût serait bien supérieur. J’ai également pensé à utiliser des solénoïdes pour bouger les axes car ils ne sont pas équipés d’aimant permanent non plus, mais c’est compliqué de transformer le mouvement linéaire des solénoïdes en rotation exacte de 180 degrés.
J’ai donc décidé d’utiliser des moteurs pas à pas classiques, des NEMA17 (j’en avais déjà une paire en plus).

Ils sont équipés d’aimants permanents assez puissants sur leur rotor. Pour ne pas perturber la mesure, la seule solution est d’écarter les moteurs des capteurs et d’opérer les mesures avec les moteurs éteints. J’ai caractérisé l’influence sur la distance d’un NEMA17 sur la valeur de la composante du champ aligné avec l’axe du moteur (la configuration où on peut attendre l’effet le plus important).

Sur cette figure vous voyez l’amplitude du champ suivant la direction de mesure du capteur colinéaire à l’axe du moteur (en bleu). En jaune, vous voyez l’amplitude lorsqu’on tourne de 90 degré le moteur (l’axe du moteur et la direction de mesure forment un angle de 90°).
Voici ce qu’on observe : la dépendance attendue (décroissance avec le cube de la distance) est bien là. Un aimant peut être assimilé à un dipôle magnétique. Et l’influence d’un dipôle décroît avec le cube de la distance. Par ailleurs, on voit que dès 30 cm environ la perturbation n’est plus mesurable et se confond avec le bruit. On voit que le couplage est beaucoup plus intense dans le premier cas, avec l’orientation colinéaire.
Cela me donne une bonne indication sur la conception future : il faut écarter les moteurs d’au moins 30 cm des capteurs.

Après c’est une question de compromis : des capteurs trop éloignés des moteurs entraînent une structure lourde et encombrante et augmentent les défauts de positionnement. J’ai choisi de fabriquer les éléments de liaison à l’impression 3D, mais la poutre principale du dispositif est réalisée avec des tubes en fibre de verre. En plus il faut veiller à utiliser des matériaux amagnétiques : la structure sera en PLA et en fibre de verre, les bagues de guidage en laiton, les axes en aluminium, etc. Pas d’acier.

Il y a aussi le problème du bus I2C, qui est limité par la capacité parasite des fils et des composants connectés, ce qui influence la stabilité et le débit de communication, en particulier lorsque la distance augmente. Chaque centimètre de fil ajoute une capacité parasite d'environ 50 à 60 pF par mètre, et les composants eux-mêmes contribuent généralement entre 5 et 10 pF chacun. La capacité totale du bus ne doit pas dépasser 400 pF pour garantir un fonctionnement stable, notamment à des fréquences élevées (400 Khz dans mon cas).
À des distances de 30 cm, la capacité parasite cumulée, incluant les fils et plusieurs capteurs, est généralement d'environ 50 à 100 pF. Cela reste compatible avec une fréquence de 400 kHz, mais au-delà, par exemple à 50 cm, la capacité parasite peut dépasser 100 pF, ce qui limite le débit maximal à environ 100-200 kHz. Si la distance atteint ou dépasse 1 mètre, la capacité peut approcher 400 pF, rendant le bus instable, même à des fréquences basses.
Pour maintenir la qualité des signaux je torsaderai les paires de fils SDA/SCL pour réduire les interférences électromagnétiques, mais cela n’a pas d’effet direct sur la capacité parasite. Sinon il faudra peut être diminuer la vitesse du port... A voir. Ça marchera surement au prix d’un petit sacrifice sur les temps d’acquisition.

La nouvelle (et dernière !) version

40 cm semble être une distance acceptable entre les moteurs et les capteurs. À cette distance, le moteur pas à pas semble ne plus avoir d’influence significative sur la mesure. Et j’essaierai de mettre à profit le fait d’avoir deux moteurs pour casser l’influence de celui dont l’axe est dirigé vers les capteurs avec le boitier du second, qui sera entre les capteurs et le premier moteur et incliné de 90 degré. Concrètement, il y aura une tourelle motorisée qui permettra de supporter les capteurs et d’assurer les deux degrés de liberté.

Quoi qu’il en soit, l'influence du moteur introduira principalement une erreur statique dans la mesure, car le champ généré par le moteur reste constant tant que sa position par rapport aux capteurs ne change pas pendant l'acquisition. Cela limite l'impact sur les variations du champ mesuré, ce qui est l’objectif principal. Par conséquent, cette erreur statique, qui est attendue très faible, n'est pas un problème majeur : je peux obtenir des mesures absolues du champ avec une précision raisonnable, en acceptant une très légère erreur associée au moteur. En revanche, grâce à l’approche statistique utilisée, je reste très sensible aux variations du champ avec un niveau de bruit qui devrait être de l’ordre du nT (pour 40000 mesures acquise en 10s, c'est l'objectif final).

Cela me parait donc pas mal du tout.

Mais ce nouveau design comporte beaucoup d’inconvénients : le dispositif est très encombrant et difficile à intégrer dans un boîtier. Il est plus complexe et plus cher (il faut deux actionneurs, deux drivers, deux PCB au lieu d'un, des capteurs fin de course, une nappe de 10 fils qui courent sur 40 cm, etc). Et il y a des parties mobiles. Il faut une alimentation compatible avec le mouvement des moteurs.

J’avais pensé au début de mon projet avoir trouvé LE magnétomètre pas cher et précis. En définitive, il n’en est rien. Celui-ci devrait fonctionner mais au prix de cette tourelle rotative, nécessaire pour la gestion des biais.

Voici une nouvelle version du PCB incluant deux drivers A9488, pour piloter les moteurs pas à pas. J’ai enlevé la partie capteur qui sera déportée dans la tourelle. Les résistances de pull-up sont installées sur le PCB pour limiter la taille du PCB qui sera embarquée dans la tourelle.

Et la CAO de la tourelle, qui sera réalisée en fibre de verre et en PLA. La tourelle mesure 400 mm de haut. Le moteur assurant le premier degré de liberté en rotation (selon l’axe vertical) n’est pas représenté ici.

Pourquoi Continuer dans ces Conditions ?

Il est clair que ce projet ne deviendra jamais un produit véritablement « commercial ». Cependant, d’un point de vue expérimental, il offre une perspective intéressante : rendre accessible à n’importe qui la mesure des variations du champ magnétique terrestre. À ce jour, les magnétomètres capables de ce type de mesure, comme les magnétomètres à proton, coûtent souvent plusieurs dizaine de milliers d'euros, les rendant inaccessibles au grand public.

À terme, mon ambition dépasse les simples mesures. J’aimerais intégrer du Deep Learning dans ce dispositif. Les données recueillies sur plusieurs jours (mois) sur la carte SD permettraient d’entraîner un modèle capable de définir le comportement « normal » de la séquence temporelle constituée par le relevé du champ magnétique et, ainsi, le cas échéant, de détecter des anomalies significatives, comme celles induites par des tempêtes solaires.
En définitive, ce projet pourrait déboucher sur un détecteur de tempêtes solaires personnel ou sur la possibilité de cartographier les variations du champ magnétique terrestre dans son jardin. Indispensable donc ! :)

Le PCB est commandé, j'ai reçu la plupart des pièces : la suite dans quelques semaines…

Les futurs menus du magnétomètre en cours de conception avec la librairie LVGL