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(""); }