mpu6050

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

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

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 :slight_smile:

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 ...

Si tu veux une librairie avec des filtres tout fait : GitHub - TKJElectronics/KalmanFilter: This is a Kalman filter used to calculate the angle, rate and bias from from the input of an accelerometer/magnetometer and a gyroscope.

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 :slight_smile:
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 :slight_smile:

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 ?

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 ?

HC11F1ST:
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 :wink:

B@tto,je ne connais pas trop Excel :blush:, 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 .

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

#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);

HC11F1ST:
B@tto,je ne connais pas trop Excel :blush:, 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)

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 ?

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

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).

B@tto: Pour Excel, c'est bon maintenant :slight_smile:

Christian_R: Mes mesures sont effectuées en statique avec rapporteur+ niveau à bulle.
La trigo de base, même si elle remonte à très loin, c'est ok, par contre ton explication, ça l'est moins; peux tu développer ou ajouter un petit croquis ?

Le programme de -Standby est basé sur cette méthode apparemment .
acc.getAcceleration(&ax, &ay, &az);
float accXangleDeg = (atan2(ay,az)*180)/PI;

Je cherche à avoir deux angles (0 à 45°) et accélérations (0 à ??? g puisque pas mesuré) , suivant x et y.
L'accélération peut être calculée sachant que le véhicule fait le 0 à 10kmh sur 15 mètres avec une accélération constante.
Il faut que je travail sur tout ça:
-afficher(numérique) les valeurs d'angle x et y avec 1° max d'erreur (correction par une fonction math. ou tableau de valeurs + interpolation)

  • afficher(bargraph TFT) les valeurs d'accel. x et y
    -faire les asservissements (je pense sans PID, mais à voir ...)

Merci encore une fois pour toutes vos infos :slight_smile: