Boussole électronique : HMC5883 / HMC5983

Pour gérer les déplacements et la localisation d’un robot, il faut connaître ses coordonnées et son orientation (la direction dans laquelle il regarde). Une boussole lui fournira un référentiel pour lui permettre de définir son orientation.

J’ai commandé les 2 modules suivants pour faire mes tests : le HMC5883 et le HMC5983 (on les trouve facilement pour 3€ sur ebay, banggood et autres vendeurs) :

En fait, j’avais déjà un HMC5883, j’ai commandé un HMC5983 qui est son successeur et qui apporte quelques améliorations mineures (SPI, compensation de la température…).

C’est là que mes mésaventures ont commencé : le module HMC5983 peut s’alimenter en 5V (le 5983 tournant à 3.3V), donc je l’ai bêtement connecté à mon Arduino. Mais il marchait très mal (quelques secondes au mieux). J’ai contacté le vendeur (bsfrance sur ebay) qui m’a répondu très rapidement : le module peut s’alimenter en 5V, mais le niveau logique pour les pins i2c est lui toujours à 3.3V ! Bref, il me faut un convertisseur de niveaux pour l’utiliser correctement. C’est commandé, en espérant que le 5983 n’est pas été abîmé par mes tests à 5V.

En attendant, je suis passé sur mon HMC5883, qui lui a été beaucoup plus tolérant : le niveau logique à 5V ne pose pas de problème.

Voici le montage de test :

Un Arduino Nano (non visible), le module HMC5883 (à gauche) et un servomoteur. Le but est que lorsque l’on fait tourner la boussole électronique (le 5883), l’axe du servomoteur se déplace du même angle (par rapport au nord). On voit sur la photos que le HMC5883, la boussole manuelle et l’axe du servomoteur sont tous orientés au nord.

La librairie de Adafruit fonctionne très bien, c’est celle que j’utilise pour le moment.

Voici la démo en vidéo :

Le code source est disponible ici.

C’est un bon début. Je m’inquiétais aussi des effets que pouvaient avoir les éléments magnétiques du robot sur la boussole. Les moteurs ainsi que le haut-parleur contiennent des aimants assez puissants. Et je n’avais pas tord de m’en inquiéter, la preuve un images :

Comme on peut le voir, les moteurs comme le HP rendent la boussole totalement inutilisable. C’est facheux, mais on ne va pas se laisser abattre :

  • il existe peut-être des moyens de calibrer la boussole pour compenser les interférences environnantes fixes (qui ne varient pas), à creuser
  • Quand je recevrai le convertisseur de niveaux, je testerai le HMC5983, il sera peut-être moins sensible aux interférences
  • A partir d’une quinzaine de centimètres, les interférences deviennent négligeables, je pourrai ajuster le design du robot pour éloigner au maximum la boussole des moteurs et du HP (voir même le surélever sur une petite tourelle).

Edit du 21/11/2015 :

J’ai reçu les convertisseurs de niveau et j’ai retesté le HMC5983 et ce n’est pas mieux (même avec un autre HMC5983, c’est pareil).

J’ai mis la main sur une librairie spécifique au 5983 (dispo ici, qui fonctionne très bien avec le 5883 aussi). Et je vois qu’il y a beaucoup de lectures en erreur (50%). Au moins, avec cette librairie, j’arrive facilement à écarter les erreurs et obtenir des données utilisables. Par contre, si je lis trop rapidement le capteur, les données ne sont plus exploitables… (en gros, jusqu’à une lecture toutes les 100ms, ça va).

Bref, j’ai perdu bien assez de temps avec ce capteur. J’ai trouvé très peu de cas d’utilisation avec un Arduino, ça n’aide pas. J’aurais aimé comprendre ce qui ne tourne pas rond mais tant pis, j’utiliserai le HMC5883 qui lui ne pose aucun problème.

Dernier point concernant les interférences, j’ai commandé une feuille de Mu-metal, qui est un matériau qui à la faculté de bloquer/dévier les champs magnétiques. Il me permettra d’isoler un peu les moteurs et le HP pour limiter les interférences sur la boussole.

11 thoughts on “Boussole électronique : HMC5883 / HMC5983

  1. Bonjour mes amis.

    Je viens de copier ce programme sur arduino IDE et après me l’avoir compilété il affiche toujours un message  » erreur de compilation « .

    Merci à l’avance de m’aider

      1. Bonsoir
        Merci mosieur ,à été effectué avec succès
        Mais lorsque vous téléverser le programme vers arduino nano le servomoteur MG996R ne suivi pas le boussole. J ai fait le montage comme il faut
        Merci de votre compréhension mosieur lordGG

        1. Si le servomoteur de bouge pas, c’est qu’il est mal branché au circuit, il faut vérifier que :
          – servo est bien connecté alimenté par du 5-6V et qu’il partage la masse du reste du circuit
          – le fil de pilotage du servo est raccordé à la bonne entrée/sortie du Nano (la 9 dans mon code)
          – la lecture des données de la boussole fonctionne bien

          Si ça ne fonctionne toujours pas, il faut procéder par étape : d’abord faire un programme qui ne fait que déplacer le servo, un autre pour voir si on récupère correctement les données de la boussole (en debug).

  2. Bonjour
    Merci pour le tutoriel en francais.
    Voila quelques heures que je suis sur le meme probleme.
    Les librairies sont correctements installées,
    le HMC5883 connecté correctement mais le moniteur
    affiche uniquement ce message:
    HMC5883 Magnetometer Test

    ————————————
    Sensor: HMC5883
    Driver Ver: 1
    Unique ID: 12345
    Max Value: 800.00 uT
    Min Value: -800.00 uT
    Resolution: 0.20 uT
    ————————————

    Rien de plus
    Avez vous une solution a me propoer?
    Merci

  3. Bonjour,
    J’utilise une boussole CMPS03 sur un bateau modèle réduit. J’ai pris soin de l’éloigner de toutes sources magnétique et les résultats sont très convenables pour le guider. Je testerai prochainement le HMC5983 pour faire des comparaisons. Je vous recontacte quand j’en saurai plus.
    Thierry

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *