Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs de position > CMPS03 : une boussole I2C simple

CMPS03 : une boussole I2C simple

jeudi 22 décembre 2011, par Julien H.

La carte CMPS03 de Devantech est une boussole électronique : deux capteurs Philips KMZ51 orientés à 90° l’un de l’autre mesurent une résistance variant selon le champ magnétique terrestre, et un micro-contrôleur PIC 18F transmet les informations selon le mode souhaité (PWM ou I2C).

CMPS03 prête à fonctionner
Connexion à une Arduino via I2C

C’est la plus ancienne des boussoles électroniques dans le monde amateur (première utilisation au club en 2002) et depuis des solutions plus robustes (correction d’inclinaison sont apparues) ou moins chères (modèles ZZC210 ou ZZC212 de Zhichuan Electronic) . Son prix est très variable chez les différents distributeurs donc choisissez-bien (le moins cher à ce jour : 36,50€ chez Gotronic).

Longtemps réputée difficile à utiliser sur les forums, elle est pourtant simple à mettre en œuvre et nous l’avons utilisée dans plusieurs projets avec succès. Bien entendu il faut des conditions d’utilisation adaptées, notamment concernant l’effet d’autres systèmes électro-magnétiques (moteurs) dans l’environnement immédiat des capteurs, ainsi que d’objets en fer (chaises). Enfin, l’alimentation du module doit être très régulière et l’ensemble du circuit en général doit respecter des règles élémentaires de compatibilité électro-magnétique ou C.E.M.

Principe

Les capteurs contiennent un alliage magnétique NiFe15 composé comme son nom l’indique de fer (15%) et de nickel, appelé "permalloy". Entre autres propriétés, il présente une magnétorésistance anisotropique variable : c’est l’un des principes utilisé pour les boussoles électroniques.

La résistance du film d’alliage est mesurée par un pont de Wheatstone, ce qui rappellera des souvenirs à tous les lycéens qui ont subi Millman et ses acolytes : Ohm, Kirchhoff, Thévenin... La boussole est donc une sorte de potentiomètre.

Cette résistance donne une forte sensibilité au composant, mais implique une variabilité aux perturbations tout aussi importante : le contrôle de la dérive nécessite un mécanisme de compensation, intégré à la puce. Un second mécanisme permet le "reset" de la puce.

Datasheet KMZ51

Cablage

Voici une vue de toutes les pattes de la boussole :

La CMPS03

Les deux modes (PWM et I2C) sont disponibles sur des pattes différentes (4 et 2-3) mais pas en même temps : il faut mettre des résistances (10 kOhms) de tirage à 5 volts sur les pattes 2 et 3 si on veut utiliser le mode PWM. Il n’y a rien de particulier pour le mode I2C, ce qui sera notre cas le plus souvent.

Utilisation

Calibrage

Une boussole est sensée indiquer le nord, mais pour certaines raisons (suivi de cap), on peut préférer indiquer une autre direction. C’est pour cela qu’il existe une patte spéciale et un registre logiciel particulier pour pouvoir redéfinir le cap connu par le logiciel. Bien sûr on utilise l’un des deux à la fois.

Mode direct : pointez la boussole vers le cap souhaité (nord ou autre) et shuntez (court-circuit avec un simple fil) la patte 9 avec la patte 6 un court instant. Pointez ensuite les 3 autres directions à 90°, 180° et 270° de la première et shuntez à chaque fois de nouveau la patte 6. C’est terminé !

Mode logiciel : pointez la boussole vers le cap souhaité (nord ou autre) et écrivez la valeur 255 (0xFF) sur le registre 15 (0x0F). Pointez ensuite les 3 autres directions à 90°, 180° et 270° de la première et écrivez de nouveau la valeur 255 sur le registre 15 à chaque fois (le logiciel remettant à 0 automatiquement le contenu du registre).

Mode PWM

La précision annoncée est de 0,1 ° et c’est vrai que le signal PWM généré a des variations de la longueur de niveau haut (celle qui porte l’information d’angle) de l’ordre de la micro-seconde (10 µs pour 0,1 °) entre 1 ms et 36.99 ms. Mais cette précision est obtenue avec un timer 16 bits. La plupart des micro-contrôleurs embarquent désormais des timers 8 bits et 16 bits, mais attention si vous avez des ressources limitées.

Mode I2C

L’utilisation du bus I2C est plus simple. Il y a quelques petites astuces à connaitre.

Tout d’abord, l’adresse annoncée est 0xC0 en écriture et 0xC1 en lecture. Si vous utilisez une carte Arduino ou toute autre bibliothèque de code récente, où la norme est désormais d’utiliser une adresse I2C sur 7 bits et de ne pas faire de distinction lecture/écriture lors des appels de méthode, alors l’adresse I2C de la boussole CMPS03 est 0x60 (soit en binaire 110 0000 au lieu de 1100 000X avec X = 0 ou 1).

La puce PIC18F reproduit le mode d’échange d’une mémoire EEPROM 24C, ce qui donne une communication simple : une écriture puis une lecture.

Deux "registres" donnent une lecture directe de l’angle :
 1 qui retourne un octet (entre 0 et 255, pas 360 !)
 2 qui retourne deux octets (entre 0 et 3599)

Le premier peut être utile pour diminuer les ressources nécessaires, accélérer la lecture et piloter directement une autre partie de votre robot (un servomoteur par exemple).

Le second est préférable pour un affichage à l’utilisateur. Ne vous faites pas leurrer par la définition de la valeur : même sans bouger, on observe une variation de 0,5 degré.

Lecture "sans bouger"

Problèmes

Outre la fiabilité de la mesure (3 à 4 degrés), c’est surtout l’altération de la direction lue en fonction de l’environnement et de l’inclinaison qui rend ce capteur à utiliser seulement dans des conditions maitrisées, et avec beaucoup de tests.

Passage à la verticale
Sans changer le cap, on perd 30 degrés pour 90 degrés d’inclinaison (cas très très limite)

Liens utiles

Documentation sur le site du fabricant Devantech

Vente de boussoles électroniques par Gotronic

Vos commentaires

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.