Skip to Content

Magnétomètre AK8975 avec Arduino

Magnétomètre AK8975 avec Arduino

Dans ce tutoriel, vous apprendrez à utiliser le magnétomètre 3 axes AK8975 avec un Arduino. L’AK8975 est essentiellement une boussole électronique qui vous permet de mesurer la force du champ magnétique terrestre (et d’autres sources magnétiques) selon trois axes.

L’AK8975 utilise des capteurs Hall très sensibles et est conçu pour la navigation piétonne en milieu urbain dans les téléphones portables et autres applications portables.

Pièces requises

Évidemment, vous aurez besoin d’un capteur AK8975. En général, on n’achète pas le capteur brut mais une carte breakout qui intègre quelques composants supplémentaires facilitant la connexion du capteur.

De plus, vous aurez besoin d’un microcontrôleur. J’ai utilisé un Arduino Uno pour ce projet, mais tout autre Arduino ou ESP32/ESP8266 conviendra.

Magnétomètre 3 axes AK8975 

Arduino

Arduino Uno

USB Data Sync cable Arduino

Câble USB pour Arduino UNO

Dupont wire set

Jeu de fils Dupont

Half_breadboard56a

Plaque d’essai (breadboard)

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Caractéristiques de l’AK8975

L’AK8975 est un magnétomètre 3 axes adapté aux applications de boussole. Il a une sensibilité typique de 0,3 µT / LSB avec une résolution de 13 bits et intègre une source magnétique pour l’auto-test. Le capteur offre des interfaces de communication I2C et SPI 4 fils. Il fonctionne sous 3-5V et consomme typiquement 350 µA. L’image suivante montre le schéma fonctionnel interne de l’AK8975 :

Block Diagram of AK8975
Schéma fonctionnel de l’AK8975 (source)

Vous pouvez facilement identifier le capteur Hall 3 axes pour détecter les champs magnétiques, le multiplexeur (MUX) pour basculer entre les 3 axes, la source magnétique intégrée pour l’auto-test, le convertisseur analogique-numérique (ADC) et l’interface de communication.

Les broches de l’AK8975 sont les suivantes : VSS est la masse, VDD est l’alimentation analogique et VID est l’alimentation pour l’interface numérique.

CAD0 et CAD1 permettent de sélectionner l’adresse I2C de l’AK8975 (0x0C–0x0F). CSB active l’interface I2C ou SPI. Pour activer l’interface I2C, connectez cette broche à VID. SO est une sortie série si l’interface SPI est activée.

SCL/SK et SDA/SI sont les broches de communication de données pour I2C ou SPI, respectivement. DRDY est la broche indiquant que les données sont prêtes. Un niveau haut signifie qu’une mesure est terminée.

Enfin, TST1, TST2 et TST6 sont des points de test pour la fabrication et RSF est une broche réservée. Pour plus d’informations, consultez la fiche technique de l’AK8975 liée ci-dessous :

Carte breakout pour AK8975

En général, on n’achète pas la puce AK8975 seule mais une carte breakout qui facilite grandement la connexion de la puce à un Arduino et intègre aussi les composants électroniques nécessaires. L’image ci-dessous montre une carte breakout typique pour l’AK8975 :

Pinout of the AK8975
Brochage de l’AK8975

Le brochage suit essentiellement les broches décrites dans le schéma fonctionnel de l’AK8975. VCC est l’alimentation positive et GND est la masse. SCL et SDA sont les broches de communication pour l’interface I2C. SO est la sortie série – si vous utilisez l’interface SPI. CSB active l’interface I2C ou SPI. DRDY est la broche indiquant que les données sont prêtes. Enfin, CAD0 et CAD1 servent à sélectionner l’adresse I2C de l’AK8975. Le tableau suivant montre quelles configurations de CAD0 et CAD1 correspondent à quelles adresses I2C :

Adresse I2C et broches CAD0/1 (source)

Notez qu’il existe plusieurs cartes breakout pour l’AK8975 où la broche CAD1 est incorrectement étiquetée CADY. Voir l’exemple ci-dessous :

AK8975 breakout board with CADY pin
Carte breakout AK8975 avec broche CADY

Mais ne vous inquiétez pas, elles fonctionnent généralement bien, c’est juste une erreur d’étiquetage sur la sérigraphie.

Connexion de l’AK8975 à l’Arduino

Dans cette section, je vous montre comment connecter l’AK8975 à un Arduino. D’abord, connectez les broches SCL et SDA de la carte breakout AK8975 aux broches correspondantes de l’Arduino comme indiqué ci-dessous. Ensuite, connectez la masse à GND et le 3,3V (ou 5V) à VCC de l’AK8975.

Pour activer l’interface I2C, il faut maintenant connecter CSB à 3,3V. Enfin, nous sélectionnons l’adresse I2C 0x0C en connectant CAD1 et CAD0 à la masse.

Connecting AK8975 to Arduino
Connexion de l’AK8975 à l’Arduino

Si vous avez d’autres appareils connectés au bus I2C (par exemple un écran) et qu’ils ont des adresses I2C conflictuelles, vous pouvez facilement changer l’adresse I2C de l’AK8975 en câblant CAD1 et CAD0 différemment. Pour référence, consultez le tableau montré précédemment.

Pour vérifier quelle adresse I2C est sélectionnée, vous pouvez exécuter le code suivant I2C scanner. Il devrait afficher l’adresse I2C 0x0C. Sinon, il y a un problème avec votre câblage.

#include "I2CScanner.h"

I2CScanner scanner;

void setup() {
  Serial.begin(9600);
  scanner.Init();
}

void loop() {
  scanner.Scan();
  delay(5000);
}

Code pour mesurer le champ magnétique avec l’AK8975

Dans cette section, je vous montre un exemple de code pour effectuer des mesures avec l’AK8975. Je vais utiliser la AK8975 Library de Jeff Rowberg. Vous pouvez télécharger la bibliothèque au format ZIP depuis ce lien et l’installer. Mais cette bibliothèque est assez volumineuse et supporte beaucoup plus de capteurs, ce dont vous n’avez pas besoin et qui pourrait entrer en conflit avec d’autres bibliothèques.

J’ai donc extrait les fichiers nécessaires et créé une bibliothèque plus légère qui contient uniquement le code requis pour le capteur AK8975. Vous pouvez télécharger la ZIP file de cette bibliothèque. Pour installer cette bibliothèque ZIP, suivez les étapes habituelles. Cliquez sur Sketch -> Add .ZIP Library, puis sélectionnez le fichier AK8975_lib.zip que vous venez de télécharger.

Installing a .ZIP Arduino library
Installation d’une bibliothèque Arduino au format .ZIP

Une fois la bibliothèque installée, testons le capteur. Le code suivant lit la force du champ magnétique terrestre selon les trois axes (X, Y et Z) et l’affiche sur le moniteur série toutes les demi-secondes.

#include "Wire.h"
#include "AK8975.h"

AK8975 mag(0x0C);  

void setup() {
  Wire.begin();
  Serial.begin(9600);
  mag.initialize();
  if (!mag.testConnection()) {
    Serial.println("AK8975 connection failed!");
  }
}

void loop() {
  int16_t mx, my, mz;

  mag.getHeading(&mx, &my, &mz);

  Serial.print("X:");
  Serial.println(mx);
  Serial.print("Y:");
  Serial.println(my);
  Serial.print("Z:");
  Serial.println(mz);

  delay(500);
}

Décomposons le code en ses composants pour une meilleure compréhension.

Inclusion des bibliothèques

D’abord, nous incluons la bibliothèque Wire et la bibliothèque nécessaire pour le magnétomètre AK8975. Cette bibliothèque contient les fonctions et définitions nécessaires pour communiquer avec le capteur.

#include "Wire.h"
#include "AK8975.h"

Création d’une instance

Ensuite, nous créons une instance de la classe AK8975 nommée mag. Cette instance nous permettra d’accéder aux fonctions définies dans la bibliothèque pour interagir avec le magnétomètre. Notez que l’adresse I2C 0x0C est spécifiée ici.

AK8975 mag(0x0C);  

Fonction setup

Dans la fonction setup(), nous initialisons d’abord la bibliothèque Wire. Serial.begin(9600) initialise la communication série à un débit de 9600 bauds. Cela nous permet d’envoyer des données au moniteur série pour le débogage et le suivi.

Wire.begin();
Serial.begin(9600);

Ensuite, nous appelons la méthode initialize() sur l’instance mag pour initialiser le magnétomètre. Après cela, nous vérifions la connexion au magnétomètre avec la méthode testConnection(). Si la connexion échoue, un message d’erreur est affiché sur le moniteur série.

mag.initialize();
if (!mag.testConnection()) {
  Serial.println("AK8975 connection failed!");
}

Fonction loop

Dans la fonction loop(), nous lançons une mesure en appelant la méthode getHeading(), qui remplit les valeurs du champ magnétique mx, my, mz pour les 3 axes.

int16_t mx, my, mz;
mag.getHeading(&mx, &my, &mz);

Nous affichons ensuite les valeurs du champ magnétique pour les axes X, Y et Z sur le moniteur série.

Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);

Enfin, nous introduisons un délai de 500 millisecondes avant de commencer le cycle de mesure suivant, ce qui permet une lecture claire sur le moniteur série.

delay(500);

Exécution du code

Si vous téléversez et exécutez le code, vous devriez commencer à voir des mesures du champ magnétique, similaires à celles ci-dessous, apparaître sur le moniteur série :

Output of AK8975 on Serial Monitor
Sortie de l’AK8975 sur le moniteur série

Si vous inclinez et faites pivoter le capteur, vous pouvez observer les valeurs changeantes des mesures du champ magnétique pour les trois axes sur le traceur série :

Output of HSCDTD008A on Serial Plotter
Sortie de l’AK8975 sur le traceur série

Et voilà ! Ce tutoriel devrait vous donner un bon départ avec l’AK8975.

Conclusions

Dans ce tutoriel, vous avez appris à utiliser le magnétomètre 3 axes AK8975 avec un Arduino.

L’AK8975 est très similaire au magnétomètre HSCDTD008A, bien que le HSCDTD008A ait une résolution de 0,15 μT/LSB tandis que celle de l’AK8975 est seulement de 0,3 μT/LSB. En revanche, l’AK8975 propose quatre adresses I2C différentes parmi lesquelles choisir, alors que le HSCDTD008A a une adresse I2C unique et fixe.

Le HSCDTD008A est la puce la plus petite, mais sur une carte breakout cela n’a pas vraiment d’importance. Cependant, en raison de son adresse I2C fixe, le HSCDTD008A est un peu plus facile à connecter. Les deux magnétomètres conviennent tout aussi bien à la plupart des applications.

Si vous avez des questions ou des commentaires, n’hésitez pas à les laisser dans la section commentaires.

Bon bricolage ; )