autocalibration sur magnetometre

Bonjour à tous, je commence tout juste à expérimenter le HMC5883 pour un spectacle.

je souhaite avec ce magnétomètre faire un capteur m'indiquant la proximité ou non sur un à deux axes d'un aimant que je manipule, ainsi que l'angle.

pour l'angle il me semble que j'ai tout ce qu'il me faut ici: http://www.adafruit.com/datasheets/AN203_Compass_Heading_Using_Magnetometers.pdf

cependant, le HMC5883 a l'air d'être très affecté durablement par l'ntensité de l'aimant, et les données brutes envoyées varient grandement, entre la première mesure prise sans aimant, puis en utilisant un aimant. Comme si le capteur était "polarisé"

j ai vu sur une vidéo de sparkfun qu' avec l'usage d' un aimant il fallait recalibrer le magnetomètre: https://www.youtube.com/watch?v=sBKHdt0OdPg

comme cet aimant va être utilisé entre 60 et 10cm par rapport au capteur, et en spectacle, pas de manière fixe, je me demandais comment coder une calibration à la volée, permettant de redéfinir le point de référence comme étant l'aimant.

Je veux d'abord travailler pour avoir des données de proximité de l'aimant par rapport au capteur, la mesure d'angle étant le deuxième objectif.

Quelle approche me conseillez vous ?

merci ! christoph

doc: http://cdn.sparkfun.com/datasheets/Sensors/Magneto/HMC5883L-FDS.pdf

Salut,

Pour moi la vraie question est est-ce qu'un compas est le meilleur moyen pour détecter la position d'un aimant ? Pour moi non et tes expériences en sont la preuve, et quelque part c'est normal, tu lui envois des Gauss quand il est conçu pour des mG.

Perso je verrais plus un capteur à effet hall analogique monté sur un servo qui fonctionnera comme un radar.

Parce que la calibration c'est fait pour recaler le zéro, pas en définir un nouveau au choix

bonjour batto, le capteur sera sur mon corps, donc pas possible de faire le radar avec un servo

mais j'entends le "tu lui envois des Gauss quand il est conçu pour des mG.",...

ce qui m intéresse c est une mesure relative: la main qui tient l aimant plus ou moins proche de la poche qui contient le capteur

mon utilisation finale s'exprime en 0-255

Dans ce cas peut-être qu'un triangle formé de trois hall analogique ? une triangulation te permettra d'avoir l'angle et la puissance totale la distance

le capteur posséde déjà les 3 axes.

j avance sur le code et reviens à toi

bonjour Il ne serait pas plus simple pour determiner la position de ton aimant tenu en main d'avoir 3 (voir plus) capteurs de magnetisme disseminé sur toi ? le calcul des magnetisme relatifs "perçus" est surement plus simple à determiner. apres : a voir les meilleurs capteurs et les emplacements les plus adaptés, sans oublier le choix de l'aimant et son type de magnetisation.

appli sympa , mais sur laquelle il risque d'y avoir du "boulot"

l'amplitude de deplacement souhaitée en volume est celle d'un bras humain ?

|267x500

bonjour philippe !

joli croquis ! :) :)

le controle est en effet envisagé ainsi, à distance de bras maximum. Ca peut même être dans un range de 30-40cm.

mais capteur par capteur (c est à dire sur ton ex, on ne traite QUE la hanche ou la gorge, pas les deux en même temps)

C'est pour remplacer les sharps IR et éviter toute interférence type tissu, ou autre personne autour.

karistouf: bonjour philippe !

joli croquis ! :) :)

le controle est en effet envisagé ainsi, à distance de bras maximum. Ca peut même être dans un range de 30-40cm.

mais capteur par capteur (c est à dire sur ton ex, on ne traite QUE la hanche ou la gorge, pas les deux en même temps)

C'est pour remplacer les sharps IR et éviter toute interférence type tissu, ou autre personne autour.

Salut Christoph Alors je n'ai pas compris ton souhait sur le croquis , je reprensente 3 capteurs de champ magnetique, en partant du postulat que tu cherche à determiner où se trouve ta main (plus exactement l'aimant dans ta main) .

j'ai disposé tres arbitrairement 3 capteurs, le but etant de faire une "triangulation" (ou plus) permettant en fonction du magnetisme relatif perçu par chaque capteur

cependant, le HMC5883 a l'air d'être très affecté durablement par l'ntensité de l'aimant, et les données brutes envoyées varient grandement, entre la première mesure prise sans aimant, puis en utilisant un aimant. Comme si le capteur était "polarisé"

Là tu travailles avec un champs magnétique élevé. Il faudrait envisager plusieurs pistes:

  • Utiliser un aimant pas trop puissant (dans la limite de ce que supporte le composant soit 8 Gauss)
  • Jouer sur le gain pour ne pas saturer l'ADC.

ATTENTION aussi aux interférences avec le champs magnétique terrestre. La mesure que tu fais contient une composition du champs magnétique terrestre avec le champs généré par ton aimant.

j'étais en train d'arriver au gain :) merci fdufnews pour l instant je n arrive pas à extirper un angle correct avec l aimant chippé à mon fils (oh le vilain)

oui, philippe, la main va vers un capteur, ou l'autre. qui seront des controles de choses différentes, qui ne fonctionneront pas en meme temps.

un controle pour un grand jet de sable par ex, qui comprend: la hauteur du jet par l'axe y la lumière par l axe z

un autre controle pour autre chose, avec juste l axe x

etc etc...

karistouf: j'étais en train d'arriver au gain :) merci fdufnews pour l instant je n arrive pas à extirper un angle correct avec l aimant chippé à mon fils (oh le vilain)

oui, philippe, la main va vers un capteur, ou l'autre. qui seront des controles de choses différentes, qui ne fonctionneront pas en meme temps.

un controle pour un grand jet de sable par ex, qui comprend: la hauteur du jet par l'axe y la lumière par l axe z

un autre controle pour autre chose, avec juste l axe x

etc etc...

ok , je cerne un peux mieux ton souhait je ne suis pas certain que passer par de la mesure de magnetisme soit la meilleure solution. Tu n'a pas envisagé d'utiliser un petit module IMU 9 DOF ? aujourd'hui c'est devenu tres abordable , tu "colle" ton IMU dans ta paume de main , tu demarre ta presta en etant dans une position de reference connue , et sur la durée de presta tu sera quasi certain de determiner/extraire des infos pertinentes de la position de l'IMU (ta main)

hello philippe, on y viendra peut être plus tard sur l IMU pour l'instant c'est plutot une phase de tatonnements et de recherches pour trouver des capteurs qui me plaisent et que je puisse exploiter correctement.

donc on part surtout la semaine prochaine sur des essais des différents types de capteurs. la recombination se fera plus tard je pense ... quand on aura une vision claire

finalement, j'ai trouvé la réponse à mes problèmes dans cette librairie plutôt sympa et simple http://www.meccanismocomplesso.org/en/arduino-magnetic-magnetic-magnetometer-hmc5883l/

MagnetometerScaled HMC5883L::ReadScaledAxis()
{
 MagnetometerRaw raw = ReadRawAxis();
 MagnetometerScaled scaled = MagnetometerScaled();
 scaled.XAxis = raw.XAxis * m_Scale;
 scaled.ZAxis = raw.ZAxis * m_Scale;
 scaled.YAxis = raw.YAxis * m_Scale;
 return scaled;
}

Je n'avais pas compris qu'il fallait non seulement envoyer le scale au chipset, mais aussi rescaller les données qu'il envoie ! (d'où mes soucis)

du coup j'ai désormais des données facilement exploitables et manipulables. y compris pour l angle.

youpi ! merci à tous