Intégrer et dériver données gyroscope MU9250

Bonjour,

Dans le cadre d'un projet, je souhaite déterminer l'angle et l'accélération angulaire que parcours un levier soumis à une force donnée (poids que je pose sur le levier).

j'ai donc acheté un MPU 9250, que je positionne sur le levier et l'ai relié à une carte Arduino UNO.

J'utilise cette bibliothèque : GitHub - bolderflight/invensense-imu: Arduino and CMake library for communicating with the InvenSense MPU-6500, MPU-9250 and MPU-9255 nine-axis IMUs.

Et j'affiche les données sur Excel à l'aide de PLX-DAQ.

Voici mon programme pour l'instant :

#include "MPU9250.h"

MPU9250 IMU(Wire,0x68);

/**********/
// Variables globales
// Moyennes utilisées pour la calibration du gyroscope
float GyroX_Moy;
float GyroY_Moy;
float GyroZ_Moy;

// Mesures relevées
float AccelX;
float AccelY;
float AccelZ;
float GyroX;
float GyroY;
float GyroZ;

// Vecteur "global"
float Vect_Accel_3D;

// Positions angulaires
float AccelAngleX;
float AccelAngleY;
float GyroAngleX;
float GyroAngleY;

/**********/
// Initialisation et paramétrage
void setup() {
  
  int status;

  Serial.begin(128000);

  while(!Serial) {}
    status = IMU.begin();
    if (status < 0) {
      Serial.println("Echec de l'initialisation");
      Serial.print("Status: ");
      Serial.println(status);
      while(1) {}
    }

  // Paramétrage des capteurs :
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_16G);
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);
  
  // Bande passante (à voir)
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_184HZ);
  
  // Débit de données (à voir)
  // https://github.com/bolderflight/MPU9250/blob/master/README.md
  IMU.setSrd(0);

  // Calibration du gyroscope
  calibration_gyro();
  
  // Suppression des données précédentes
  Serial.println("CLEARDATA");

  // Réinitialisation du timer
  Serial.println("RESETTIMER");
  
  // Préparation des colonnes (Excel)
  Serial.println("LABEL,Timer,AccelAngleX,AccelAngleY,GyroAngleX,GyroAngleY");
}
/**********/
// Calibration du gyroscope
// Moyenne des mesures relevées sur un échantillon "au repos"
void calibration_gyro() {

  // Taille de l'échantillon
  int Taille_Echantillon = 1000;

  // Acquisition et somme des données
  for (int i = 0; i < Taille_Echantillon; i++){
    IMU.readSensor();
    GyroX_Moy += IMU.getGyroX_rads();
    GyroY_Moy += IMU.getGyroY_rads();
    GyroZ_Moy += IMU.getGyroZ_rads();
    delay(3);
  }
  //Calcul des moyennes
  GyroX_Moy /= Taille_Echantillon;
  GyroY_Moy /= Taille_Echantillon;
  GyroZ_Moy /= Taille_Echantillon; 
}
/**********/
// Mesure d'angle avec l'accéléromètre (en °)
void AccelAngle(){
  // Normalisation du vecteur ( √(Ax² + Ay² + Az²) )
  Vect_Accel_3D = sqrt(pow(AccelX, 2) + pow(AccelY, 2) + pow(AccelZ, 2));

  // Calcul des angles
  if (abs(AccelX) < Vect_Accel_3D) {
    AccelAngleX = asin(AccelY / Vect_Accel_3D) * 57.2958;
  }
  if (abs(AccelY) < Vect_Accel_3D) {
    AccelAngleY = asin(AccelX / Vect_Accel_3D) * 57.2958;
  }
}
/**********/
// Mesure d'angle avec le gyroscope (en °)
void GyroAngle() {
  // Intégration
  GyroAngleX += GyroX * 57.2958 * 0.005;
  GyroAngleY += GyroY * 57.2958 * 0.005;

  // Correction
  GyroAngleY += GyroAngleX * sin(GyroZ * 0.005);
  GyroAngleX -= GyroAngleY * sin(GyroZ * 0.005); 
}
/**********/
// Acquisition et affichage des données
void loop(){
  IMU.readSensor();
  AccelX = IMU.getAccelX_mss();
  AccelY = IMU.getAccelY_mss();
  AccelZ = IMU.getAccelZ_mss();
  GyroX = IMU.getGyroX_rads() - GyroX_Moy;
  GyroY = IMU.getGyroY_rads() - GyroY_Moy;
  GyroZ = IMU.getGyroZ_rads() - GyroZ_Moy;

  // Calcul des angles via gyroscope
  GyroAngle();

  // Calcul des angles via acceléromètre
  AccelAngle();
  
  // Affichage des données sur Excel
  Serial.print("DATA,TIMER,");
  Serial.print(AccelAngleX,6);
  Serial.print(",");
  Serial.print(AccelAngleY,6);
  Serial.print(",");
  Serial.print(GyroAngleX,6);
  Serial.print(",");
  Serial.println(GyroAngleY,6);
}

Mon problème est de définir la période pour intégrer les données du gyroscope afin d'obtenir ma position angulaire. J'ai arbitrairement mis une période de 0.005s, ce qui correspondrait à une fréquence de 200 Hz car c'est la valeur qui colle le plus avec la position fournie par l'accéléromètre mais je ne comprend pas d'où sort cette valeur ni comment la fixer.

Je sais qu'il n'est pas conseillé d'utiliser un gyroscope pour déterminer une position angulaire du fait de la dérive mais les mesures que j'effectue sont très brèves et je compte les combiner avec celles de l'accéléromètre une fois ce problème résolu.

Merci d'avoir pris le temps de me lire et j'espère que quelqu'un pourra m'aider.