Compas numérique - HMC5883L - fonctionnement

Bonjour à tous,

Voilà bientôt 1 semaine que je tente de faire fonctionner un module HMC5883L avec mon arduino pro mini : (http://www.gotronic.fr/art-magnetometre-3-axes-hmc5883l-20989.htm)

1ère question, il y a un repère X,Y,Z sur le pcb, est-ce bien le Y qui est sensé indiquer le Nord ? impossible de trouver l'info sur le net, personne ne le précise.

2 - J'ai vu sur pas mal de site qu'il était question de calibrer le compass, mais je n'ai jamais rien réussi à tirer de ce capteur, par exemple si je ne le touche pas, il peut indiquer 20° puis quelques lecture plus tard 27° etc.

Des fois je le fais tourner d'environ 90° voir 180° mais la valeur lu en degré va varier de seulement 10/15 degré...

Auriez-vous quelques explications claires sur le fonctionneemnt de ce module ??? car là ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Merci pour votre aide :slight_smile:

Ton sujet m'intéresse car j'ai commandé le mien et suis en attente de livraison (par bateau à vapeur depuis l'asie).

C'est vrai qu'en regardant le datasheet du HMC5883L, le calcul du cap ne m'a pas semblé d'une grande évidence.

Si j'ai bien compris il ne s'agit pas simplement de prendre la valeur x,y, ou z, mais d'effectuer un calcul d'arc-tangente à partir de x et y.

La librairie par laquelle je compte commencer mes tests est celle-là.

Voici un extrait de leur code source, dont les commentaires sont assez parlants sur la manière d'exploiter le résultat :

  /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print("  ");
  Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print("  ");
  Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print("  ");Serial.println("uT");

  // Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
  // Calculate heading when the magnetometer is level, then correct for signs of axis.
  float heading = atan2(event.magnetic.y, event.magnetic.x);
  
  // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.
  // Find yours here: http://www.magnetic-declination.com/
  // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
  // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  float declinationAngle = 0.22;
  heading += declinationAngle;
  
  // Correct for when signs are reversed.
  if(heading < 0)
    heading += 2*PI;
    
  // Check for wrap due to addition of declination.
  if(heading > 2*PI)
    heading -= 2*PI;
   
  // Convert radians to degrees for readability.
  float headingDegrees = heading * 180/M_PI; 
  
  Serial.print("Heading (degrees): "); Serial.println(headingDegrees);

Salut,

Effectivement il y a bien une histoire d'arc tangeant.

Après avoir essayé je ne sais combien de librairies, j'utilise, pour le moment, celle ci: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html

Elle offre notamment un code qui permet d'effectuer la calibration, mais je n'ai pas bien compris le fonctionnement pour le moment.

A force de tester, je viens de m'apercevoir d'une chose: mon HMC5883 est monté sur connecter "secable" classique et il y a du jeu... il n'est en fait pas vraiment de niveau et on peut le bouger un peu à la main.
Et justement ça change de beaucoup les valeur, je peux changer le résultat de 20°....

Je vais dans un premier temps devoir revoir ma fixation...

Il y aurait bien peut-être ce site : tinycompass c'est bien le HMC5883 dessus...

Salut,

Est-ce qu'il y d'autres choses à côté de ton compas ? Y'a pas longtemps je me suis pris la tête avec, à lire toute les doc dessus parce qu'il faisait n'importe quoi. En fait c'était l'antenne du GPS à côté qui le faisait déconner. Ce chip mesure des champs magnétiques faibles, on a vite fait de le perturber

Salut,

Il y a en effet un GPS à proximité, ainsi que l'arduino et un module ethernet.
Depuis que je l'ai soudé directement sur la plaque à trou (je ne passe donc plus par un header 2.54mm) il a l'air de moins délirer....

Je vais le laisser tourner toute la nuit et je regarderai les logs pour voir s'il y a eu des changements énormes de valeur.

Mais du coup pour que la lecture soit fiable, il faut, comme j'ai pu le voir sur le net, le coupler à un accéléromètre, j'ai l'impression.
Car il est assez sensible sur le fait de ne pas être parfaitement horizontal... (d’ailleurs la librairie que j'utilise propose deux sketch avec compensation de l'inclinaison via accéléromètre).

cassiope34:
Merci pour le site, je vais regarder ça de plus prêt =D

Il faut que je comprenne aussi ce qu'apporte le "self test" qui est intégré au chip par rapport à ce que "tinycompass" propose (morceau de code que j'ai d'ailleur croisé dans plusieurs librairies)
(Dans la doc ils disent que le self test peut aussi être utilisé pour compenser une dérive du à la température)

C'est un peu nouveau pour moi ces compass et je patauge un peu, surtout sur la partie calibration qui à pourtant l'air d'être capitale... (si quelqu'un saurait m'expliquer la différence entre le self test et la calibration via le code arduino, je suis preneur :slight_smile: )

Hexor:
Salut,

Il y a en effet un GPS à proximité, ainsi que l'arduino et un module ethernet.
Depuis que je l'ai soudé directement sur la plaque à trou (je ne passe donc plus par un header 2.54mm) il a l'air de moins délirer....

Hey hey :slight_smile:

Après avoir virer le GPS perso c'était bien réactif

Il y a aussi un super gars (Nulentout) qui s'est bien amusé avec un HMC6352 (aussi un compass) dans son excellent receuil de programmes.
C'est dans ! Test des divers modules / Boussole_statique et aussi dans ! Mini PROJETS / Barre_automatique_MC1811 où il parle des contraintes d'horizontalité et de sensibilité à l'environnement magnétique parasite du composant mais pas de nécessité d'association avec un accéléromètre...
Par contre il parle d'un delai de 6ms nécessaire au composant lorsqu'il reçoit une commande.

Dans le code TinyCompass Compass_V2.ino je n'ai pas lu de self-test mais la callibration semble se faire en faisant faire plusieurs tours sur lui-même au composant puis une moyenne des valeurs reçues serait prise comme référence...

Après il faut toute proportion garder : c'est pas un chip très haut de gamme ... Faut pas non plus lui demander la lune.

Bon, bah à priori il déraille un peu moins depuis qu'il est soudé directement sur la platine...
Il oscille de quelques degrés quand même (3°) entre plusieurs mesures, mais bon, dans mon cas c'est acceptable.

A l'instant je test sans le GPS à proximité, et la valeur retournée à changée de -3° environ (avec toujours l’oscillation à +/- 3°)

Mais si j'ai bien compris, le "self test" inclus dans le chip permet justement d’atténuer les perturbations électromagnétiques environnantes (GPS, électronique etc.)

Je vais le laisser tourner encore un peu comme ça et voir ce que ça donne.
Après je vais tester en lui donnant différentes orientations, car pour le moment il est resté fixe.

Après il faut toute proportion garder : c'est pas un chip très haut de gamme ... Faut pas non plus lui demander la lune.

Pour le prix, c'est sur ! :grinning:

Prochaines étapes:

  • me familiariser avec la calibration que propose les librairies, et aussi le self test.
  • Etudier l'importance, ou non, d'être bien horizontal.

Le self test ne permet que de calibrer la mesure en elle même, ça ne change rien par rapport à une influence externe. Les procédures de calibration complète sont beaucoup plus complexe

Ha ok, je pensais que ce self test permettait de tenir compte de la perturbation ambiante, vu que par exemple dans la doc ils disent qu'il est possible d'utiliser ce self test pour palier à une dérive du à la T° ambiante.
Je pensais que le chip générait un champ magnétique, donc connu, qu'il mesurait "l'orientation" de ce champs, et corrigeait les perturbation en comparant valeur attendu et valeur réellement lu.

Bon sinon pour le moment le compass ne débloque plus, le soucis venait apparemment de l'endroit où je faisais mes tests, car même la boussole de mon téléphone portable avait un comportement très étrange à cet endroit là....

Affaire à suivre :slight_smile:

Bonjour à tous,

Me revoilà à l'attaque avec ces fameux compass ! :grin:

J'ai une petite question aux possesseurs de ce chip:
en général il y a un repère sur le PCB (X, Y, Z), quelle axe entre X et Y est sensé "indiquer la mesure" ?
(Autrement dit, si je lit la valeur 0° sur l'arduino, ce qui veut donc dire qu'il s'agit du Nord, qui de X ou Y pointe vers le Nord à ce moment là ?)

Car là avec un chip c'est apparemment le X qui indique l'axe de mesure, mais sur un autre, c'est le Y qui m'indiquait la mesure, soit donc un décalage de 90°....

Merci pour votre aide,
Bonne journée,

Une note d'application : http://107.23.57.149/sitecore/shell/Controls/Rich%20Text%20Editor//~/media/Images/Plymouth%20Website%20PDFs/Magnetic%20Sensors/Application%20Notes/AN203_Compass_Heading_Using_Magnetometers.ashx
Si j'en crois les équations l'angle est donné par rapport à Y.

Le repère X Y Z écrit sur le module n'indique évidemment pas l'axe Nord, puisqu'on peut tourner le module dans tous les sens, c'est un repère lié au PCB lui même.

Le module mesure le champ magnétique autour de lui (champ terrestre ou aimants, bobinages, antennes....).

Ce champ est est un vecteur, on projette ses 3 composantes selon les trois axes propres.

Ce sont ces 3 mesures à la fois qu'il faut prendre en considération, pour trouver le module, la direction et le sens du champ vectoriel.

Il y quelques choses que je ne comprends pas.
Le module me retourne, via une librairie, un nombre en degré me séparant du Nord.
Donc une valeur de 0° m'indique le Nord.

Il faut donc bien une "référence" afin que je puisse utiliser ce nombre de degré que me retourne le module, non ?

Ou alors je n'ai pas du tout compris comment utiliser ce chip.
Mon but étant de fixer ce module à un objet, et je souhaite connaitre l'orientation de la face de l'objet. Du genre la face pointe vers le Nord, ou le Sud, ou... etc.

Donc dans ce cas comment dois-je l'utiliser ? car là, je suis perdu.. :astonished:

Merci :slight_smile:

La librairie calcule à partir de Ax et Ay l'angle en degrés entre un axe du PCB et le nord, quand le module est placé horizontalement.

un axe du PCB et le nord,

Justement, qu'elle est cet axe ?

Bonjour,

Ce module est en train de me rendre chèvre.
Je suis loin d'être expert arduino, mais je pense avoir un peu de bon sens.

1 j'ai commencé par installer ce module avec des logiciels de compas, a peu tous basés sur le même code
résultat une rotation sur 360° ne me donnait pas de valeurs cohérentes comme par exemple 90° à chaque quart de tour.

2 j'ai trouvé une méthode pour étalonner le module, alors que personne n'éprouve le besoin de le faire et cela semble fonctionner sur un des 2 modules dont je dispose, l'autre reste récalcitrant.

Bien entendu je travaille toujours avec les modules dans le plan horizontal, ne souhaitant pas aggraver les difficultés pour l'instant avec la correction de tilt.

Tout retour d'expérience est bien entendu bienvenu.

D'après mon expérience il semble que ce soit l'axe X qui indique 0° lorsqu'il est au nord (à la déclinaison près, mais très faible ne France)