CMPS03 de Devantech, un compas magnétique

Facebooktwitterredditpinterestlinkedinmail

Devantech CMPS03Le module Devantech CMPS03 est une boussole digitale. Il sait communiquer par signal PWM ou par le protocole i2c. C’est ce dernier qui va nous intéresser avec le Raspberry Pi.

Ce module s’alimente en 5v, et consomme 15 mA pour les révisions antérieures à la 14 (reconnaissables à la présence d’un quartz gris au milieu du circuit), ou 25 mA pour les versions plus récentes (qui à la place du quartz ont trois pastilles non-utilisées).

Il est basé sur deux détecteurs de champs magnétique [Philips KMZ51], montés à 90°. Il atteint une précision théorique de 0,1°. En pratique on considérera une précision de 3 à 4 °. Il faudra aussi prendre en compte le fait que ce type de capteur est très sensible à l’environnement extérieur, et perd beaucoup en précision lorsqu’il prend de l’inclinaison.

Le Raspberry Pi supporte matériellement le protocole I2C, mais il n’est pas actif par défaut. Nous allons donc voir comment l’activer.

Activation du bus i2c

Le fichier  »/etc/modprobe.d/raspi-blacklist.conf » contient la liste des modules du noyau à ne jamais charger. Mettre en commentaire l’instruction  »blacklist i2c-bcm2708 » en plaçant un dièse (#) en début de ligne.

Avant :

Après :

Le fichier  »/etc/modules » contient la liste des modules du noyau à charger. Nous allons y ajouter le module  »i2c-dev ».

Avant :

Après :

Installer le package i2c-tools. Il contient les commandes  »i2cdetect »,  »i2cdump »,  »i2cget », et  »i2cset », qui permettent le dialogue en i2c par la ligne de commande.

Ajouter votre utilisateur au groupe i2c afin qu’il puisse accéder au bus i2c. Sans cette étape, vous devrez lancer toute commande qui communique avec le bus i2c en tant que  »root », ou via  »sudo ».

Redémarrer le RaspberryPi afin de charger les modules du noyau appropriés, et de prendre en compte votre nouveau groupe.

On peut ensuite tester l’activation du module i2c grâce à  »i2cdetect ».

Si le module i2c du noyau est bien chargé, lorsqu’aucun périphérique i2c n’est connecté, on doit obtenir quelque chose comme cela :

Le module CMPS03

Devantech CMPS03Nous allons connecter le CMPS03 au connecteur P1 du Raspberry Pi (les broches indiquées sont celles d’un révision 2) :

  • La broche 1 du CMPS03 (+5v) à la broche 2 du RPi
  • La broche 2 du CMPS03 (SCL) à la broche 5 du RPi
  • La broche 3 du CMPS03 (SDA) à la broche 3 du RPi
  • La broche 9 du CMPS03 (GND) à la broche 9 du RPi

Dans la mesure où le calibrage peut se faire de manière logicielle, nous n’allons pas utiliser de broche dédiée.

Aucun composant externe n’est nécessaire, les résistances de pull-up requises sur le bus i2c sont déjà intégrées au Raspberry Pi.

Note: Sur la photo ci-contre, le nord est situé à gauche.

Une fois la boussole connectée, en relançant  »i2cdetect », on doit obtenir quelque chose de semblable à ceci (essayer  »-y 0 » sur un RPi revision 1 et  »-y 1 » sur un RPi revision 2) :

Le module est donc à l’adresse 0x60 du port i2c 1 (sur un RaspberryPi révision 2).

On peut tester le branchement grâce aux outils i2c :

Doit afficher toutes les secondes la valeur héxadécimale sur 8 bit du cap observé. On peut le voir évoluer en pivotant lentement le module. Pour quitter, presser CTRL+C.

Fonctionnement logiciel

Le CMPS03 expose 16 registres de 8 bits. Lorsqu’une valeur sur 16 bits est disponible, elle prend deux registres, bit de poids fort en tête.

Reg. Révision <14 Révision >= 14
0 Révision du firmware. Idem.
1 Cap sur 8 bits non signés. Retourne une valeur de 0 pour 0° à 255 pour un peu moins de 360°. Idem.
2, 3 Cap sur 16 bits non signés. Retourne une valeur de 0 pour 0° à 3599 pour 359,9°. Idem.
4, 5 Signal de différence 1 sur 16 bits signés. Idem.
6, 7 Signal de différence 2 sur 16 bits signés. Idem.
8, 9 Signal de calibration 1 sur 16 bits signés. Signal brut 1 sur 16 bits signés.
10, 11 Signal de calibration 2 sur 16 bits signés. Signal brut 2 sur 16 bits signés.
12 Inutilisé, retourne zéro. Code de déblocage 1.
13 Inutilisé, retourne zéro. Code de déblocage 2.
14 Inutilisé, retour indéfini. Code de déblocage 3.
15 Commande de calibrage. Registre de commandes.

Connaître la version du firmware peut vous permettre de prendre en compte différentes versions du module, et adapter le comportement du logiciel à chaque module. Pour ma part, ne disposant que d’un seul exemplaire en révision 9, je ne vais m’en servir que pour valider ou non la communication.

Je n’utiliserais pas non plus les registres 4 à 11. Ils exposent des valeurs internes permettant de calculer le cap exposé aux registres 1, 2 et 3.

Je ne serais pas en mesure de jouer avec les codes de déblocage des registres 12, 13 et 14 puisque mon modèle (en révision 9) ne les prend pas en compte.

Même chose pour le registre de commandes (le 15), que j’utiliserais simplement pour calibrer la boussole.

Mise en pratique 1: Script Bash

La première mise en pratique consistera à créer un script Bash qui utilisera i2cget afin :

  • De pouvoir lire le numéro de révision du CMPS03
  • De pouvoir lire le cap sur 8 bits (de 0 à 255)
  • De pouvoir lire le cap sur 16 bits (de 0 à 360)

Voici l’utilisation de ce script :

Voici maintenant le code source :

Pour plus de simplicité, je vous conseille d’activer le bit d’exécution de ce script avec la commande :

Vous pouvez aussi le placer ou placer un lien symbolique dans votre path; ou bien ajouter l’emplacement du script à la fin de votre path.

Exemple d’utilisation : Lecture du numéro de révision.

Exemple d’utilisation : Lecture du cap sur 16 bits.

Une prochaine version mise à jour intégrera aussi le calibrage par logiciel du module CMPS03. Mais cette fonctionnalité attendra que le module soit monté sur un châssis avec le reste de ce qui constituera un robot.

Note: Cet article n’est pas terminé, merci de visiter cette page à nouveau dans quelque temps.

Références

  • Documentation à priori officielle en anglais du module CMPS03, révisions 13 et antérieures.
  • Documentation à priori officielle en anglais du module CMPS03, révisions 14 et postérieures.
Facebooktwitterredditpinterestlinkedinmail

Laisser un commentaire

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