Pages: [1]   Go Down
Author Topic: Centrale inertielle 10 DoF  (Read 1862 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 http://www.dfrobot.com/index.php?route=product/product&product_id=818#.UgC9X1NI4ss
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: https://github.com/adafruit/Adafruit-BMP085-Library
FreeSixImu: https://github.com/spaceappsatlanta/ardusat/tree/master/sensor_code/RequiredLibraries/FreeSixIMU
HMC5883L: https://github.com/manifestinteractive/arduino/tree/master/Libraries/HMC5883L

Voici donc le code:

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,
Logged

50% homme + 50% machine = 100% linux

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci beaucoup cheraultsmiley-cool
C'est toujours sympathique de partager ses codes, merci !  smiley-wink
Je testerais ça quand j'aurais la carte !
Bonne journée !
Logged

Pages: [1]   Go Up
Jump to: