BTS Mesure BTS Mesure
DébutTP 01TP 02Trouve NombreCourbesCTNPT100VISABT VISAArduinoCp et CpkNI6009ChenillardRé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("");  
}