Problème communication I2C et compas

Bonsoir bonsoir !

Dans le cadre d’un projet en deuxième année de méca, je dois créer un sous-marin à l’aide d’une carte arduino. (1ére fois que je l’utilise)

Je possède une carte Arduino Uno, un SD shield ainsi qu’un motorshield adafruit V2. Je les ai donc imbriqués entre eux.

Je veux connecter un compas (hmc5883l) sur mon motorshield. Mais impossible de recueillir des informations sur l’angle. Je reçois seulement des données qui ne varient pas dans le temps malgré la variation de l’angle, ou alors la lettre ‘e’ (je ne sais pas ce que cela signifie).

J’ai branché mon hmc5883l sur le port SCL, SDA, GND, 5V de mon motorshield.
J’ai cherché sur un conflit d’adresse mais rien n’y fait je ne trouve vraiment pas, si vous pourriez m’éclairer cela m’aiderai énormément !

#include <Wire.h>   //Librairie Wire pour la communication I2C
#define HMC5803L_Address 0x1E  //Adresse I2C du module
#include <Adafruit_MotorShield.h>

#define X 3  //Adresses de registres pour les données X Y et Z
#define Y 7
#define Z 5
double Xmagnetic;
double Ymagnetic;
double Zmagnetic;
double Module_magnetic;
double angle;
float angle2;
Adafruit_MotorShield monShield = Adafruit_MotorShield(); //création de l'objet shield

void setup() 
{
  Serial.begin(9600);
  Wire.begin();         //Initialisation de la livrairie Wire
    monShield.begin(); //On lance la communication avec le shield

    Init_HMC5803L();    //Initialiser le module boussole
}

// Boucle de mesures de champ magnétique
void loop() 
{
  Xmagnetic = HMC5803L_Read(X);  //lecture sur 3 axes et sortie sur le port sériel
  Ymagnetic = HMC5803L_Read(Y);
  Zmagnetic = HMC5803L_Read(Z);
  Serial.print(" ");
  Serial.print (Xmagnetic);
  Serial.print(" ");
  Serial.print (Ymagnetic);


   //Module du champ
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic;

  
  Module_magnetic = sqrt(Module_magnetic);
  Serial.print(" M= ");
  Serial.print(Module_magnetic);
  
  //Calculer l'angle de la boussole à partir de X et Y (à plat)
  angle2= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres
  //angle= -3.0*pow(10.0,-10.0)*pow(angle,5.0)+ 2.0*pow(10.0,-7.0)*pow(angle,4.0)-1*pow(10.0,-5.0)*pow(angle,3.0)-0.0116*pow(angle,2.0)+2.3674*pow(angle,1.0)-4.4881;
  //angle= 3.0*pow(10.0,-12.0)*pow(angle,6.0)-3.0*pow(10.0,-9.0)*pow(angle,5.0)+1.0*pow(10.0,-6.0)*pow(angle,4.0)-0.00002*pow(angle,3.0)+0.0069*pow(angle,2.0)+1.2982*(angle)-0.4194;
  
 // if (angle2<0) {angle2=angle2+360;}
  
  //angle= -6.0*pow(10.0,-8.0)*pow(angle2,4.0)+5.0*pow(10.0,-5.0)*pow(angle2,3.0)-0.0138*pow(angle2,2.0)+2.0219*(angle2)-5.7188;



  

  Serial.print("  ");  
  Serial.print("Angle  ");  //en degres
  Serial.println(angle2);

 delay(100);
}


  
// === Fonction qui initialise le module boussole (à lancer une seule fois)
void Init_HMC5803L(void)
{
  /* Set the module to 8x averaging and 15Hz measurement rate */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x00);
  Wire.write(0x70);
         
  Wire.write(0x01);
  Wire.write(0xA0);   //Règle un gain de 5
  Wire.endTransmission();
}

// === Fonction qui lit le module boussole (registre d'un des 3 axes, retourne 16 bits)
int HMC5803L_Read(byte Axis)
{
  int Result;
   /* Initiate a single measurement */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x02);
  Wire.write(0x01);
  Wire.endTransmission();
  delay(6);
  
  /* Move modules the resiger pointer to one of the axis data registers */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(Axis);
  Wire.endTransmission();
   
  /* Read the data from registers (there are two 8 bit registers for each axis) */  
  Wire.requestFrom(HMC5803L_Address, 2);
  Result = Wire.read() << 8;
  Result |= Wire.read();

  return Result;
}

Merci d’avance !

Tu dois déclarer tes variables Xmagnetic, Ymagnetic et Zmagnetic comme des int et non des double