Centrale inertielle 10 DoF

Bonjour,

Je vous présente un petit sketch qui a la capacité d'afficher la totalité des données d'une centrale inertielle à 10 degrés de liberté.

Ce sketch est une modification de plusieurs autres, afin de les fusionner entre eux, pour afficher les datas qui m’intéressaient.
Il est basé sur les capteurs suivants:

Accéleromètre 3 axes
Gyroscope 3 axes
Magnétomètre 3 axes
Capteur de pression

L'ensemble des capteurs est monté sur une petite centrale DFRobot Fermion: 10 DOF Mems IMU Sensor-ADXL345/ITG3205/HMC5883L/BMP280 (Arduino Compatible) - DFRobot
Cette centrale envoie les données à l'Arduino via le protocole serie I2C.
Bien entendu, vous pouvez essayer avec d'autres centrales I2C.

Le sketch affiche donc sur la sortie serie:

Les axes X,Y, Z associés à un algorithme basé sur les quaternions pour la fusion des capteurs.
Le cap en degrés
La température en degré Celsius
La pression barométrique
L'altitude au niveau de la mer
L'altitude réelle si vous connaissez la pression barométrique chez vous

Il manque encore deux ou trois petites choses, mais dans les grandes lignes, ca fonctionne.

Pour les librairies:

Adafruit: GitHub - adafruit/Adafruit-BMP085-Library: A powerful but easy to use BMP085/BMP180 Arduino library
FreeSixImu: ardusat/sensor_code/RequiredLibraries/FreeSixIMU at master · spaceappsatlanta/ardusat · GitHub
HMC5883L: arduino/Libraries/HMC5883L at master · manifestinteractive/arduino · GitHub

Voici donc le code:

//------------------------------//
//--Importation des librairies--//
//------------------------------//
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <FreeSixIMU.h>
#include <FIMU_ADXL345.h>
#include <FIMU_ITG3200.h>
#include <HMC5883L.h>


float angles[3]; // Z,X,Y
float heading;

//----------------------------//
//--Declaration des capteurs--//
//----------------------------//
Adafruit_BMP085 bmp;
FreeSixIMU sixDOF = FreeSixIMU();
HMC5883L compass;
int error = 0; //detection d'erreur sur le compas

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  
  if (!bmp.begin()) // verification de l'adressage I2C du capteur de pression
  {
	Serial.println("Pas de capteur de pression trouve!");
	while (1) {}
  }
  
  delay(5);
  sixDOF.init(); //initialisation du gyroscope et de l'accelerometre
  delay(5);
  compass = HMC5883L(); // initialisation du compas
  
  error = compass.SetScale(1.3); // Mise a l'echelle du compas
  error = compass.SetMeasurementMode(Measurement_Continuous); // Acquisition continue et non discrete  
  if(error != 0) // Detection d'une erreur sur le compas
    Serial.println(compass.GetErrorText(error));
}

void loop()
{  
  sixDOF.getEuler(angles);
  
 getHeading();
  PrintData();
  
  delay(300);
}

//------------------------------//
//--Recuperation du cap compas--//
//------------------------------//
void getHeading()
{
  // Affichage des lignes du compas (Pas de mise a l'echelle)
  MagnetometerRaw raw = compass.ReadRawAxis();
  // Affichage des valeurs compas avec mise a l'echelle
  MagnetometerScaled scaled = compass.ReadScaledAxis();
  
  int MilliGauss_OnThe_XAxis = scaled.XAxis;// (ou YAxis, ou ZAxis)

  // Calcul du cap une fois le compas calibrer, correction du signe
  heading = atan2(scaled.YAxis, scaled.XAxis);  
  
  float declinationAngle = 0.0457;
  heading += declinationAngle;
  
  // Correction du signe
  if(heading < 0)
    heading += 2*PI;
    
  // verification du sens de la calibration (declinaison)
  if(heading > 2*PI)
    heading -= 2*PI;
   
  // Convertion radian/degre
  heading = heading * 180/M_PI; 
}

//---------------------------//
//--Affichage des variables--//
//---------------------------//
void PrintData()
{  
  Serial.print("Z: ");
  Serial.print(angles[0]);
  Serial.print("  "); 
  Serial.print("X:"); 
  Serial.print(angles[1]);
  Serial.print("  ");
  Serial.print("Y:");
  Serial.print(angles[2]);
  Serial.print("  ");
  Serial.print(" Cap: ");
  Serial.print(heading);
  Serial.print("  ");
  Serial.print("Temperature: ");
  Serial.print(bmp.readTemperature());
  Serial.print("  Pa  ");
  Serial.print("Pression: ");
  Serial.print(bmp.readPressure());
  Serial.print("  Pa  ");
  Serial.print("Altitude = ");
  Serial.print(bmp.readAltitude());
  Serial.print("  metres  ");
  Serial.print("Altitude corrigee = ");
  Serial.print(bmp.readAltitude(101410));
  Serial.print("  metres  ");
  Serial.println("  ");
  delay(50);
}

Amitiés,

Merci beaucoup cherault ! 8)
C'est toujours sympathique de partager ses codes, merci ! :wink:
Je testerais ça quand j'aurais la carte !
Bonne journée !