Arduino Forum

International => Français => Topic started by: HC11F1ST on Aug 07, 2013, 06:57 pm

Title: mpu6050
Post by: HC11F1ST on Aug 07, 2013, 06:57 pm
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 
Title: Re: mpu6050
Post by: B@tto on Aug 07, 2013, 08:18 pm
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
Title: Re: mpu6050
Post by: HC11F1ST on Aug 07, 2013, 09:58 pm

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

Title: Re: mpu6050
Post by: B@tto on Aug 08, 2013, 08:51 am
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 ...
Title: Re: mpu6050
Post by: Viproz on Aug 08, 2013, 10:57 am
Si tu veux une librairie avec des filtres tout fait : https://github.com/TKJElectronics/KalmanFilter
Title: Re: mpu6050
Post by: HC11F1ST on Aug 08, 2013, 02:43 pm
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 :)   
Title: Re: mpu6050
Post by: HC11F1ST on Aug 08, 2013, 03:52 pm
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 ?
Title: Re: mpu6050
Post by: Viproz on Aug 08, 2013, 06:19 pm
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 ?
Title: Re: mpu6050
Post by: B@tto on Aug 08, 2013, 07:12 pm

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 ;)
Title: Re: mpu6050
Post by: HC11F1ST on Aug 08, 2013, 09:27 pm
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 .
Title: Re: mpu6050
Post by: -Standby on Aug 08, 2013, 10:18 pm
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);
Title: Re: mpu6050
Post by: B@tto on Aug 08, 2013, 10:18 pm

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)
Title: Re: mpu6050
Post by: HC11F1ST on Aug 09, 2013, 09:43 am
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 ?
Title: Re: mpu6050
Post by: Viproz on Aug 09, 2013, 10:19 am
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
Title: Re: mpu6050
Post by: Christian_R on Aug 09, 2013, 10:25 am
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).
Title: Re: mpu6050
Post by: HC11F1ST on Aug 10, 2013, 11:35 am
B@tto: Pour Excel, c'est bon maintenant  :)

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