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 :
- Vérifier avec un niveau que votre plan de travail soit horizontal en X et Y.
- Caler votre robot entre 2 masses et vérifier son horizontalité en X et Y.
- Lancer le programme offset
En déduire offset_Ax = - Ax
En déduire offset_Ay = - Ay
Noter offset_Az1 à l'endroit - 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 - 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("");
}





