caméra gyroscopique moto/ mpu6050 / arduino uno

bonjour a tous,
voila j'aurais besoin de vous car je me suis procurer une carte mpu6050 ayant pour fonction accéléromètre et gyroscope. Mon problème est qu'avec les infos que m’envoie le gyro, je n'ai aucune idée de comment retrouver mon angle de rotation.

Alors j'explique, sur une table j'ai -70 en x et 0 en y et z normal.
Pendant la rotation jai une valeur en y qui varie. Cette valeur je n'arrive pas a l'exploiter.
malgré des recherches sur le net, je n'ai pas trouvé de solution. Pouvait vous m'éclaircir sur le sujet?
merci d'avance

De mon côté je divise la valeur lue "brute" (sur une rotation autour de l'axe X, avec la méthode getRotationX()) par 131 pour avoir la valeur en deg/s

A part ça, tout est normal ? Les rotations sont sur les bons axes ? Tu utilises les bibliothèques adéquates, etc,... ?
Ce serait intéressant de voir ton code pour vérifier que tout est OK

Je complète (voir ligne 1844 du code à l'adresse suivante: i2cdevlib/MPU6050.cpp at master · jrowberg/i2cdevlib · GitHub pour voir d'où sort le 131):

  • FS_SEL | Full Scale Range | LSB Sensitivity
  • -------+--------------------+----------------
  • 0 | +/- 250 degrees/s | 131 LSB/deg/s
  • 1 | +/- 500 degrees/s | 65.5 LSB/deg/s
  • 2 | +/- 1000 degrees/s | 32.8 LSB/deg/s
  • 3 | +/- 2000 degrees/s | 16.4 LSB/deg/s

Ca dépend donc de la sensibilité que tu as définie, mais par défaut c'est 250 deg/s en pleine échelle.

Yep!

Je m'étais un peu amusé avec ce chip l'année passée. Sans avoir plus de souvenir que ça sur son fonctionnement précis (ça peut revenir vite), j'ai quelques croquis qui trainent dans mon pc, dont celui-ci :

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

void setup() {
    Wire.begin();
    Serial.begin(57600);
    accelgyro.initialize();
}

void loop() {
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    ax = map(ax, -32767, 32767, -255, 255);
    ay = map(ay, -32767, 32767, -255, 255);
    az = map(az, -32767, 32767, -255, 255);
 
    Serial.print(ax); Serial.print("\t");
    Serial.print(ay); Serial.print("\t");
    Serial.print(ay); Serial.print("\t");
    Serial.print(az); Serial.print("\t");
    Serial.print(gx); Serial.print("\t");
    Serial.print(gy); Serial.print("\t");
    Serial.print(gz); Serial.print("\t\n");
    
    delay(50);
}

En espérant avoir aidé.

@+

Zoroastre.

la valeur brute divisé par la sensibilité et donc en deg/s? ne serait ce pas des radians? car il me semble que les autres valeurs sont en radian donc sa m'étonne mais je vous fait confiance, vous avez l'air plus calé que moi.
de plus si je divise cette valeur en deg/s par ma freq d’échantillonnage je doit retrouver l'angle parcouru a chaque mesure, c'est bien sa?

moi mon but est de connaitre l'angle de mon capteur en temps réel, comment dois je m'y prendre? je me doute que l'on doit se servir de l'angle calculé a t-1 alors nan?

et zoroastre a quoi sert ton instruction map exactement?

et merci de vos réponses

C'est bien des deg/s.
Pour avoir l'angle parcouru entre deux mesures, tu dois multiplier par le temps entre deux mesures donc en effet, tu dois diviser par la fréquence d'échantillonnage.
Le gros problème que tu vas avoir en faisant ça, c'est que tu vas cumuler l'offset et la dérive du capteur.
Offset: le capteur mesure une valeur non nulle même s'il ne bouge pas. Tu peux donc imaginer ce que ça donne sur l'angle au bout d'un certain temps...
Bref, un gyro tout seul pour mesurer un angle n'est pas une bonne idée. Tu veux faire quoi au juste au final ? Quelle est ton application de mesure d'angle ?

en faite mon projet est de faire une gyro cam a installer sur ma moto. petit délire perso ^^
et j’avais donc penser combiner accéléromètre avec le gyro pour calculer l’angle de ma moto a un instant t
pour ce qui est de accéléromètre j’ai réussi a calculer l’angle.

Dans ce cas, ça change tout. Tu peux en effet combiner l'accéléro et le gyro pour avoir une mesure d'angle.
Tu as (au moins) deux options: filtre de Kalman ou filtre complémentaire.
Le plus simple est le second, tu peux toujours démarrer avec celui-là si le filtre de Kalman te fait peur.

Voici le code que j'utilise dans mon gyropode:

// Vitesse de rotation mesurée par le gyroscope convertie en rad/s
omega = -((double)gyroint/131)*3.141592/180.;

// Angle mesuré par l'accéléromètre longitudinal
thetames = -((double)axint/16384);
  
// Estimation de l'angle à partir de l'accélération horizontale et de la vitesse de rotation (filtre complémentaire)
// tau: paramètre de réglage, ici égal à 1.0
// dt: période d'échantillonnage, ici égale à 0.01 s
thetaest = (tau*dt*omega + dt*thetames + tau*thetaest)/(dt+tau);

Pour les explications théoriques, Google est ton ami :wink:

d'accord je vais essayer ça
et j'ai vu aussi pour éviter les dérives qu'il était possible de lisser les valeurs. Par exemple je fait 10 mesures et je fait une moyenne de tout sa.
T'en pense quoi sa pourrait éviter les dérives ,non?
car je sais pas toi mais quand je lit les valeurs envoyées par le module, elles varient pas mal pour ma part

Ce que tu observes (les valeurs qui bougent beaucoup), c'est plutôt du bruit de mesure.
Faire une moyenne permettrait de le diminuer mais il est nettement préférable de traiter le problème au plus près possible de la source. Et pour ça, tu peux paramétrer les caractéristiques du filtre qui se trouve déjà sur le composant (voir la ligne 177 du lien que j'ai donné précédemment, c'est la fonction getDLPFMode()).
Par défaut, le capteur est peu filtré (bande passante de 256 Hz). Tu peux filtrer plus et descendre jusqu'à une bande passante de 5 Hz, mais peut-être qu'une valeur intermédiaire sera suffisante.

ok merci beaucoup de ton aide, plus qu' tester sur le servo, la l'angle calculée a l'air stable et proche de la réalité donc je croise les doigts :stuck_out_tongue:

bonjour, je reviens a vous pour un nouveau problème, voila le projet avance, j'ai commancé l'installation sur la moto, le seul problème est au niveau de l'acceleromètre, voila je l'ai fixer comme j'ai pu dans la moto, le problème est que vu que la carte n'est pas bien droite, il me donne des valeurs erronées par rapport a la moto. y 'aurait il un moyen d'initialiser les valeurs ou de rajouter un offset?

Il y a une fonction setXAccelOffset, etc... Je n'ai jamais testé.

d'accord je vais essayer ^^

bon alors j'ai fait mon premier essai de la caméra embarquée
Moteur a l’arrêt, niquel
moteur démarré
résultats: pas vraiment top :~
les vibrations de la moto avec le moteur font bouger le capteur et la caméra tremble
quand je met un coup de gaz, la caméra fait n'importe quoi
et roulant: trop de vibration

PS: j'ai placer le capteur sous la selle a l'arrière

je sais pas trop comment faire pour réduire les effets des vibrations du moteurs sur le capteur ^^'

résulat esperé pour vous donner une idées

Tu as essayé de filtrer au max avec setDLPFMode() ?
Ca donne quoi si tu ne contrôles plus la caméra avec l'Arduino ? Bien sûr, elle va rester fixe mais peut-être qu'elle vibre déjà pas mal ? Je veux dire que le problème ne vient pas forcément uniquement du capteur mais aussi de la partie mécanique qui gère le mouvement de la caméra.

antoconde:
PS: j'ai placer le capteur sous la selle a l'arrière

A placer plutôt le plus près possible du montage de la caméra.

bonjour,
un truc comme ca?
http://arduino4projects.com/gyro-camera-for-motorcycle-using-arduino/

antoconde:
bon alors j'ai fait mon premier essai de la caméra embarquée
...
PS: j'ai placer le capteur sous la selle a l'arrière

Bonjour
dèja sur ça
le principe de base de la gyrostabilisation est que les axes à compenser et les axes compensateurs soient le plus possibles confondus,
quelle distance entre la selle et la motorisation de stabilsation ?

bah il y avait pas loin de 50 cm entre le capteur et le servo
la j'ai penser mettre l'accelerometre dans de la mousse, faire faire silent block et atténuer les vibrations de la moto. Pas encore tester donc bon

Est-ce vraiment important que le capteur et le servo soit confondu? Parce que le servo joue ici un role action et n'intervient pas sur le capteur. si j'envoie des valeurs au servo a une distance de 5cm ou 50 cm le résultat sera la même. Si mon capteur subit des der perturbations du aux vibrations de sont supports, ici la moto. Le résultat seras le même non?

de plus ,je vais essayer de placer la caméra au niveau de l'avant sous la tete de fourche

voila a peu près ce que sa donne

désolé pour la qualité, les vidéos sont moins grande comme sa