Go Down

Topic: mpu6050 (Read 4966 times) previous topic - next topic

HC11F1ST

Bonsoir à tous,

La question a du  être déjà posée; comment fait on pour convertir les les "raw values" en degré pour l'inclinaison et grammes pour l'accélération ?
                                                                                                 Merci 

B@tto

Suffit de lire la datasheet et de savoir quelle échelle tu as programmé

http://www.daedalus.ei.tum.de/attachments/article/57/PS-MPU-6000A.pdf     p12 et 13
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

HC11F1ST


MPU6050.cpp
void MPU6050::initialize() {
    setClockSource(MPU6050_CLOCK_PLL_XGYRO);
    setFullScaleGyroRange(MPU6050_GYRO_FS_250); ======> donc 250°/sec
    setFullScaleAccelRange(MPU6050_ACCEL_FS_2);   ======> donc 2g
    setSleepEnabled(false);
C'est la config par défaut que je n'ai pas modifié.

Voila ce que j'ai essayé:
....
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
int Degrees_ax = map(ay, -32768, +32768, -250, +250);

Et l'angle est faux.
Je débute sur ARDUINO , and then i'm swimming  a litle  :)


B@tto

As tu essayé cet exemple : https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino ??

Il semble que la conversion soit moins triviale qu'un simple mapping, et nécessite diverses corrections.

Si tu débutes, tu n'as pas choisi la facilité ... J'ai toujours évité ce chip d'une part parce que pour le moment les gyro et accéléromètre j'en ai rien à fiche ( xD ), et d'autre part parce c'est d'une complexité certaine, autant au niveau du contrôle du chip en lui même que l'interprétation des données qu'il fournit ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Viproz

Si tu veux une librairie avec des filtres tout fait : https://github.com/TKJElectronics/KalmanFilter

HC11F1ST

Bonjour,

J'ai besoin absolument des paramètres d'inclinaison et d'accélération pour gérer un véhicule électrique.
Le projet initiale était : micro 68hc11F1+LCD 4x20+ capteurs d'inclinaison sortie analogique+ joystick+..., ça c'est ok  :)
Le nouveaux projet; Arduino2560 Master+2xDS18B20 ou TC77(spi)+joystick+MPU6050+rtc 1307+...+ Arduino2560 Slave+TFT 5"+... , ça, y a encore un peu de boulot.
Le cœur du système est la centrale inertielle, et c'est le dernier morceaux où je bute donc ... merci pour toutes ces infos :)   

HC11F1ST

Ces deux exemples de programme fonctionnent, mais les angles ne correspondent toujours pas à la réalité:

Serial.print(kalAngleX);Serial.print("\t"); donc avec filtre  Kalman me donne 278° pour 270°  c'est mauvais
                                                                                                 me donne 182° pour 180°  c'est limite
                                                                                                 me donne 230° pour 225°  c'est mauvais
                                                                                                 me donne 80° pour 90°     c'est très mauvais  :0
                                                                                                me donne 40° pour 45°     c'est mauvais

Pour l'accélération la précision est moins importante , 5% d'erreur est pas trop important.
Viproz, chez toi ça donne le même % d'erreur ?

Viproz

Personnellement je n'ai pas fais de tests de mesure, j'ai juste relié ça a un servo motor, le mouvement a l'air plutot identique. Où as-tu acheté ton MPU6050 ?

B@tto


Serial.print(kalAngleX);Serial.print("\t"); donc avec filtre  Kalman me donne 278° pour 270°  c'est mauvais
                                                                                                 me donne 182° pour 180°  c'est limite
                                                                                                 me donne 230° pour 225°  c'est mauvais
                                                                                                 me donne 80° pour 90°     c'est très mauvais  :0
                                                                                                me donne 40° pour 45°     c'est mauvais


Trace tes données sur un graph excel et t'auras une surprise ;)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

HC11F1ST

B@tto,je ne connais pas trop  Excel  :smiley-red:, peus tu m'en dire plus ?
A première vue, ce n'est pas un simple problème d'offset ; ça  n 'a pas l'aire très linéaire tout ça.

Je l'ai acheté sur Ebay; ceci explique peut être cela .

-Standby

Bonsoir je partage mon code si sa peut aider, il est extrêmement simple il suffit juste d'avoir des notions en trigo.


Code: [Select]
#include "Wire.h"
#include "math.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 acc;

int ax, ay, az;

  void setup() {
    Wire.begin();
    Serial.begin(38400);
    Serial.println("Initializing MPU6050...");
    acc.initialize();
    Serial.println("Testing MPU6050 connection...");
    Serial.println(acc.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
  }
 
  void loop() {
    acc.getAcceleration(&ax, &ay, &az);
    float accXangleDeg = (atan2(ay,az)*180)/PI;
    float accYangleDeg = (atan2(ax,az)*180)/PI;
    float accXangleRad = accXangleDeg * DEG_TO_RAD;
    float accYangleRad = accYangleDeg * DEG_TO_RAD;
   
    Serial.print("RawX: "), Serial.print(ax), Serial.print("  ");
    Serial.print("RawY: "), Serial.print(ay), Serial.print("  ");
    Serial.print("RawZ: "), Serial.print(az), Serial.print("  ");
   
    Serial.print("xAngleDeg: "), Serial.print(accXangleDeg), Serial.print("  ");
    Serial.print("yAngleDeg: "), Serial.print(accYangleDeg), Serial.print("  ");
    Serial.print("xAngleRad: "), Serial.print(accXangleRad), Serial.print("  ");
    Serial.print("yAngleRad: "), Serial.print(accYangleRad), Serial.println("  ");
    delay(100);
The Mind is like a parachute it works best when opened.

B@tto


B@tto,je ne connais pas trop  Excel  :smiley-red:, peus tu m'en dire plus ?
A première vue, ce n'est pas un simple problème d'offset ; ça  n 'a pas l'aire très linéaire tout ça.

Je l'ai acheté sur Ebay; ceci explique peut être cela .


Avec tes valeurs j'ai une assez bonne linéarité entre tes mesures et la réalité que tu constates (cf image jointe)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

HC11F1ST

Bonjour,
Le problème est que pour mon projet, je mesure de 0 à 45° max ! et là, 5° c'est plus de 10% ? c'est beaucoup trop.
Connaissez vous un gyro plus précis, ou est ce du à la mauvaise qualité du mien ?

Viproz

Le graph c'est une bonne nouvelle !

Si ton gyro n'est pas précis de manière linéaire, tu peux corriger !

B@tto t'as même donné la correction à effectuer (la petite fonction affine)
Si ton projet ne va que de 0 à 45°, retrace cette courbe avec les bonnes et les mauvaises valeurs de mesure

Christian_R

Le MPU6050 est normalement précis.

Est ce que tu fais des mesures en statique ou en déplaçant le MPU ?

En utilisation inclinomètre (statique) j'avais fait des tests avec l'accéléromètre seul (pas besoin du gyroscope, ni utilisé de filtre) et ça détectait très bien des tout petits angles (même une table imperceptiblement bancale).

L'accélération de la pesanteur (selon Z) est projetée selon les axes Ax, Ay, Az du MPU et avec de la trigonométrie simple on a une bonne précision sur l'angle d'inclinaison.
Az = P.cos(pente)
De 0° à 45° la mesure passe de 1.0 à 0.70, la sensibilité est élevée.
Avec cette méthode ce n'est pas linéaire mais du arcosinus pour Z (et arcsinus pour X ou Y).
Christian

Go Up