Besoin d'aide avec gyroscope MPU6050

Bonjour,

j'ai créer un programme pour calculer l'angle X du capteur MPU6050:

#include <Wire.h>

float angleX = 0;
float angleY = 0;

long tmpLoop = 0;

void setup() {
  Serial.begin(9600);

  //Initialisation de la communication avec MPU6050
  Wire.begin();                      
  Wire.beginTransmission(0x68);
  Wire.write(0x6B);
  Wire.write(0x00);
  Wire.endTransmission(true);

  

}

void loop() {
  Wire.beginTransmission(0x68);
  Wire.write(0x43);
  Wire.endTransmission(false);
  Wire.requestFrom(0x68, 6, true);


  float GyroX = (Wire.read() << 8 | Wire.read()) / 131.0;
  float GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  float GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;

  long tmp = millis();
  long tmpIntervalMesure = tmp - tmpLoop;
  tmpLoop = tmp;
  
  angleX += GyroX * tmpIntervalMesure;
  //angleX -= 11.89;
  Serial.println(angleX);

  
  

}

Le résultat n'est pas tout à fait ce que j'attendais, lorsque je fais tourner le module sur l'axe X, il y a bien une variation qui correspond au mouvement, mais ce qui est bizzare c'est que les valeurs n'arrêtent pas de descendre. Voici une capture du traceur série pour vous montrer:

Avez vous une idée du problème?

Merci d'avance :slight_smile:

Utilisez des unsigned long pour ce qui est lié au temps

Le gyroscope vous donne la vitesse angulaire en rad/s, si vous voulez intégrer il faut compter en secondes pas en ms. Je suppose que vous voulez faire un truc du genre intégration de base:

angleactuel = angleprécédent + Gx . DeltaT

Le soucis c’est qu’avec le temps vous accumulez des erreurs et ça ne va pas être top. Il y a pas mal de littérature sur tout cela

Merci pour votre réponse, j'ai changé pour que ça calcul en seconde.

Connaissez vous un moyen de compenser ses erreurs ? Car je vais l'utiliser pour un drone et si il y a 10 degré de décalage au bout de quelques minutes c'est problématique...

Si tu veux un angle entre-180 et +180 degrés, il faut que tu testes le passage à +-180 et que tu ramènes dans l'intervalle.

  angleX += GyroX * tmpIntervalMesure;
  if (angleX <-180) angleX  +=360;
  else if (angleX >180) angleX  -=360;

Il y a énormément de tutos sur le sujet et des librairies éventuellement

Bonjour les amis,
Si tu vas sur :

Tu trouveras un gros didacticiel en 7 tomes sur une petite sonde nommée JEKERT. C’est un petit robot sur 4 membres.
Ce dernier est gyrostabilisé par un 6050. Un tableau de bord exploite cette centrale inertielle pour afficher le cap sur 360°. En particulier il y a une option qui corrige la dérive gyroscopique due à la rotation terrestre. (15° par heure, ce n’est pas négligeable.)
Le programme sur Arduino utilise le 6050 pour indiquer en permanence l’inclinaison en tangage, en roulis et le lacet pour son orientation.
Entre autre on peut caler la centrale en utilisant un capteur magnétique pour détecter le Nord. Les problèmes de passage à 180° sont résolus. Sur l’afficheur du pupitre de pilotage l’indicateur de cap présente l’aspect d’un cercle avec une aiguille qui tourne. Tu peux afficher en « absolu » avec le Nord « en haut », ou en relatif par rapport au cap désiré. Aiguille en haut la direction est correcte. Lorsqu’elle dévie à droite ou à gauche elle indique la dérive par rapport au cap désiré.
En mode absolu, un "bug" indique sur l'instrument virtuel le cap désiré.
Bref, ce n’est pas un drone, mais probablement que tu y trouveras des informations utiles.
Quelques vidéo montrent la sonde en mouvement, mais aussi l'aspect du putitre de pilotage, pour éventuellement te donner des idées ...

Désolé, mais je ne sais plus dans quel tome j’aborde l’aspect logiciel, il te faudra « fouiller ». Probablement dans l’un des trois derniers …

Dans le didacticiel en ligne les tomes sont chaînés. Pour chaque tome tu as un lien pour télécharger le didacticiel PDF et les divers documents dont les programmes pour Arduino.

Amicalement : Nulentout.