BTS Mesure BTS Mesure
DébutTP 01TP 02Trouve NombreCourbesCTNPT100VISABT VISAArduinoNI6009ChenillardMétrologieRégulationMPUCodeurC2IEtalon

MPU6050 détermination offset

Ce programme permet de déterminer pour le capteur utilisé son décalage d'offset.

C'est primordial pour le gyroscope lorsque l'offset dépasse 131.
C'est aussi facile : il suffit de ne pas bouger.

Corriger l'offset du gyroscope est primordial, car la vitesse angulaire est intégrée pour calculer θ.
Aussi la mesure dérive rapidement avec le temps : Δθ = G_offset * t

On peut aussi régler les offset de l'accéléromètre avec un niveau à bulle pour contrôler la position du capteur.
C'est plus délicat, et moins problématique de ne pas le corriger car 1g = 16 384 LSB.
De plus nous n'avons pas de problème de dérive dans le temps. L'erreur est fixe.
Si lors du calcul de θ on constate un offset de 1,4° il suffira de donner comme consigne d'équilibre 1,4° lors de la régulation.

Exemple de protocole pour détérminer offset_Ay et offset_Az :

  1. Vérifier avec un niveau que votre plan de travail soit horizontal en X et Y.
  2. Caler votre robot entre 2 masses et vérifier son horizontalité en X et Y.
  3. Lancer le programme offset
    En déduire  offset_Ax = - Ax
    En déduire  offset_Ay = - Ay
    Noter  offset_Az1 à l'endroit
  4. Retourner le robot (le plan de travail doit être parfaitement horizontal)
    Noter  offset_Az2 à l'envers
    En déduire offset_Az =- ( offset_Az1 +offset_Az2 ) / 2
  5. Vérifier alors que Az est proche de 16384, la sensibilité annoncée par le constructeur pour 1 g.
#include <MPU6050.h>      //MPU6050 library
#include <Wire.h>        //IIC communication library

MPU6050 mpu;                    // Création de l'objet mpu
int ax, ay, az, gx, gy, gz;     // 3 accélérations et 3 vitesses angulaires
long Ax, Ay, Az, Gx, Gy, Gz;
int N=400;
int i;
// Offset gyroscope à déterminer dans ce programme
int offset_gx=0,offset_gy=0, offset_gz=0;
int offset_ax=0,offset_ay=0, offset_az=0;

void setup() 
{
  Wire.begin();       //Initialisation bus I2C
  Serial.begin(9600);
  delay(200);

  mpu.initialize();  //initialisation MPU6050
  delay(200);
  Serial.println("Sensibilite d'apres Datasheet MPU6050");
  Serial.println("Accel. : 1 g <-> 16 384 LSB");
  Serial.println("Gyro. : 1°/s <->    131 LSB");
  Serial.println("Détermination offset sur "+String(N)+" mesures");
  Serial.println("Ne pas bouger, merci...");   
}

void loop() 
{
  Ax=0;Ay=0;Az=0;
  Gx=0;Gy=0;Gz=0;
  for (i=0;i<N;i++) {
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  //Récupérer les 6 axes  ax ay az gx gy gz
    Ax+=ax; Ay+=ay; Az+=az;
    Gx+=gx; Gy+=gy; Gz+=gz;
    delay(4);}
  Ax=Ax/N;Ay=Ay/N;Az=Az/N;
  Gx=Gx/N;Gy=Gy/N;Gz=Gz/N;
  Serial.println("Ax="+String(Ax)+" \tAy="+String(Ay)+" \tAz="+String(Az));
  Serial.println("Gx="+String(Gx)+" \tGy="+String(Gy)+" \tGz="+String(Gz));  
  Serial.println("");  
}