Connecter une boussole électronique CMPS03 à un NXT, via I2C.

Cette boussole a été spécialement développée pour les besoins d’aide à la navigation des robots, le but étant de renvoyer un nombre unique représentant l’angle du robot par rapport au Nord Magnétique.

But : se bricoler un capteur de type boussole pour le NXT, à partir d’un module « tout en un », facilement disponible dans le commerce.

Introduction

Module CMPS03

Pour renvoyer l’azimut, ce module CMPS03 utilise le capteur de champ magnétique KMZ51 de Phillips, qui est suffisamment sensible pour détecter le champ magnétique terrestre. Deux capteurs, disposés orthogonalement, sont utilisés pour retrouver la composante horizontale du champ magnétique terrestre.

La consommation nominale du module est 15mA. Il y a deux manières de récupérer l’angle du module avec le nord magnétique, par interface I2C et par un signal PWM.

Doc CMPS03
toute la doc du capteur en 1 pdf

Avertissement : Enfant, ne faites pas cette manipulation. Demandez à un adulte de vous aider. A tous, les auteurs ne sauraient être tenus responsables de blessure éventuelle et/ou de dommage provoqué par de mauvais branchements électriques.

Connexion via I2C

Le protocole de communication I2C implémenté dans le CMPS03 est le même que celui utilisé pour accéder à la très populaire EEPROM 24C04.

Chronogramme I2C

Premièrement, envoyer un bit de start, ensuite l’adresse du module(0xC0 par défaut) avec le bit de lecture/écriture au niveau bas, puis le numéro du registre que l’on veut lire.

Attention

Deuxièmement, répéter le bit de start, ensuite l’adresse du module avec le bit de lecture/écriture au niveau haut (0xC1 par défaut).
Attention, la documentation est fausse, il n’y a pas besoin de cette étape, j’ai passé une soirée complète à chercher, avant de remettre en cause la documentation, et de supprimer ce bout de code...

Enfin il ne vous reste plus qu’à lire 1 ou 2 octets représentant les valeurs des registres (8 ou 16 bits) à l’instant de la demande. Les registres de 16 bits sont lus octet de poids fort en premier.

Registre Fonction
0 Numéro de version logicielle
1 Direction du nord magnétique codée sur 1 octet, Lecture [0..255] pour un tour complet (0-360°)
2,3 Direction du nord magnétique codée sur 16 bits, Lecture[0..3599] pour un tour complet (0-359.9°)
15 Calibration, Écriture de l’octet « 255 » pour initier la procédure de calibration.

Le module CMPS03 est conçu sans résistances de tirage pré-cablées, afin de permettre une meilleure gestion du bus au niveau du maître I2C. Le bus I2C nécessite des résistances de tirage sur les deux lignes, une seule fois pour tout le bus. Les valeurs de résistance recommandées par Devantech sont 10K pour 100KHz, 1,8K jusqu’à 400Khz, et 1,2K (ou même 1K) jusqu’à 1,3 Mhz. Au delà de 160Khz, ils préconisent d’ajouter un délai de 50µs de chaque coté de l’écriture de l’adresse du registre, par précaution.
J’ai câblé des résistances de tirage de 82K, comme préconisé par LEGO.

Résistances de tirage I2C

Calibration

Avant de calibrer le module, repérez les points cardinaux précisément. Rappelez vous que ce sont les pôles magnétiques, pas géographiques. Trouvez une boussole à aiguille, et vérifiez. Posez le module CMPS03 à l’horizontal, composants au dessus. Dégagez l’espace autour du module de tous éléments magnétiques, électriques ou ferreux, et pensez à enlever votre montre.
Il y a deux méthodes, l’une logicielle, l’autre mécanique.

Par bouton poussoir (le truc vert sur le module) :
-* mettre le module à plat, pointez le nord, appuyer ;
-* recommencer pour l’est, le sud et l’ouest.

Par I2C (non implémenté dans mon code) :
-* mettre le module à plat, pointez le nord, écrire 255 (0xff) dans le registre 15 ;
-* recommencer pour l’est, le sud et l’ouest.

Vous pouvez câbler une LED entre la patte 5 et le 5V (avec résistance de limitation de courant de 390ohm), comme indicateur de calibration. En effet, cette patte passe à l’état bas pendant la calibration, et haut le reste du temps (non testé).

Réalisation cablage bus I2C et poussoir de calibration

Code

Un PC avec Brixcc, NBC/NXC, et un NXT avec le « enhanced firmware by John Hansen »

Tests grandeur nature

Pensez à éloigner la boussole au maximum de vos moteurs, 20 cm minimum. En deçà, la boussole se transforme en un grand détecteur de fonctionnement des moteurs.
Dans le cas où les mesures seraient trop perturbées par les moteurs, et que vous ne puissiez pas éloigner plus la boussole, pensez à effectuer vos mesures à l’arrêt !

La précision de la mesure est de l’ordre de 2/3° en mode précis, et de 3/5° en mode rapide, ce qui est déjà pas si mal, et permet bien des « rattrapages ».

Voilà, une boussole pour votre robot, n’oubliez pas de laisser des commentaires et des retours d’expériences/Bouts de code. En espérant que cet article vous sera utile.

Navigation

AgendaTous les événements

avril 2024 :

Rien pour ce mois

mars 2024 | mai 2024

Brèves Toutes les brèves