Magnétomètre: GY-273: HMC5883L ou QMC5883L ?

-ce petit tuto est destiné aux débutants en particulier et à tous les utilisateurs de boussole en galère-

Bonjour
Le module GY-273 peut avoir changé, certainement pour des raisons de coût.
Résultat, il ne fonctionne pas avec la bibliothèque qui lui est destinée, puisque ce n'est pas le bon composant ^^


Le composant en question

Avant de le jeter, faites un scan i²c. L'i²c est un protocole de communication vraiment génial puisque deux fils (SCA/SCL) suffisent à récupérer les infos du capteur.
Chaque type de module i²c a donc sa petite adresse à lui, ce qui permet d'en empiler des tas mais aussi, dans notre cas, de l'identifier :wink:

Voici le code du scanner qui va rechercher tous les modules en i²c connectés à votre carte arduino.

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Copiez-le et collez le tout dans votre IDE Arduino.
Module connecté et alimenté (vérifiez la datasheet de votre module), téléversez le code, ouvrez le moniteur série d'IDE. Si vous lisez ceci sur votre moniteur:
Scanning...
I2C device found at address 0x0D !
done
Vous n'avez pas acheté un HMC5883L mais un QMC5883L. Bah ouais.

La bibliothèque qui marche et qui va bien est :sur ce lien.

Ce code fait appel à la bibliothèque <Wire.h> qui est incluse dans IDE, donc rien à aller chercher.
Je le colle ici, mais il se trouve sur la même page:

#include <Wire.h>
#include <MechaQMC5883.h>

MechaQMC5883 qmc;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  qmc.init();
  //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
}

void loop() {
  int x, y, z;
  int azimuth;
  //float azimuth; //is supporting float too
  qmc.read(&x, &y, &z,&azimuth);
  //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" y: ");
  Serial.print(y);
  Serial.print(" z: ");
  Serial.print(z);
  Serial.print(" a: ");
  Serial.print(azimuth);
  Serial.println();
  delay(100);
}

Et bim! ça fonctionne...

Merci à dfgh et Artouste pour leur contribution!