Gyroscope arduino

Bonjour a tous je programme un robot et j aimerais lors d un virage pouvoir mesurer une valeur d angle afin d obtenir un virage a 180°. J ai donc fait un programme qui me permet d obtenir une valeur d angle selon l axe z verticale mais je n obtient pas de mesure d angle .

Quelqu'un aurait une idée svp ?
Merci

gyro.ino (1011 Bytes)

Bonjour,

La première chose à faire est d'écrire la formule mathématique. Celle qui semble implémentée dans ton programme me semble peu catholique. Tu peux dire d'où elle sort ? Ou bien la justifier ?

Sachant que le gyroscope ne renvoie que des vitesses angulaires en radians par secondes et que l on cherche a avoir un angle en degré et que la vitesse est la derivée de la valeur d angle par rapport au temps alors j ai integrer cette valeur de vitesse par rapport au temps pour obtenir l angle et ou le 0.01 correspond au dt(le temps) on divise cette valeur par 131 car d apres la doc constructeur c est celle qui nous permet d avoir un precision a plus ou moins 250rad/s . Ensuite on ajoute le fait que le vecteur pesanteur dans un repere orthonormé incliné ait des composantes sur diferents axes et tout on peut en deduire une relation de trigonometrieet on va ensuite convertir cette valeur en °/s en multipliant par 180 et en divisant par PI .On ajoute cette valeur a l'angle de depart pour obtenir la valeur finale .
Les coefficient 0.98 ET 0.02 sont les coefficieets qui correspondent au filtrage du bruit .
Voila tout j'espere que vous reussirez a comprendre :slight_smile:

Admettons, mais alors pourquoi gy pour une mesure de vitesse autour de la verticale ?
Et puis le cast, c'est (float)gy, pas float(gy).

Je me suis trompé de programme voila le bon

gyro.ino (1.01 KB)

La bonne méthode pour débugger ça si l'erreur ne saute pas aux yeux (et après avoir corrigé ce que j'ai plus haut sur le cast de gz) est d'afficher chaque terme pour vérifier s'il n'y a pas un problème sur l'un d'eux.

c est a dire afficher chaque terme?

void loop() {
  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  Serial.println(gz);
  Serial.println((float)gz);
  Serial.println(angle);
  Serial.println(ax);
  Serial.println((double)ax);
  Serial.println(az);
  Serial.println((double)az);
  Serial.println(az);
  Serial.println(atan2((double)ax,(double)az));
  // J'arrête là mais c'est pas fini, je pense que tu as compris le principe
  angle=0.98*(angle+float(gz)*0.01/131) + 0.02*atan2((double)ax,(double)az)*180/PI;
  Serial.println(angle); 
  delay(10);
}

Très ch... mais d'une efficacité diabolique.

J ai essayé de faire comme vous m'avez indiqué mais je ne trouve pas d' ou vient l erreur. :slight_smile: :slight_smile:

10 minutes entre ma réponse et la tienne, il y a peu de chance que tu trouves en aussi peu de temps. La méthode est efficace mais il faut quand même passer un peu de temps à réfléchir pour se demander si chaque terme a un sens.

Par exemple, 0.98*(angle+float(gz)0.01/131) est en radians alors que 0.02atan2((double)ax,(double)az)*180/PI est en degrés. Or, on ne peut pas additionner des choux et des carottes (sauf dans la soupe).

Bonne nuit (perso je vais me coucher) :wink:

j ai analyser le programme en detail et j ai remarqué que le probleme venait de la projection des vecteurs aceleration sur les axes qui ne permettaient pas d obtenir un angle autour de l axe de lacet vertical d apresles relations de trigonometrie mais je ne vois absolument pas comment corriger ca

Dans un premier temps tu peux peut-être te contenter d'intégrer la vitesse de rotation du gyro, non ?

cela fonctionne correctement juste en intégrant cependant pour une position donnée les valeurs ne restent pas stable un peu comme si il y avait une dérive . De plus l angle est soit négatif soit positif en fonction du sens de rotation est l angle excède 360°

Hosseindemars:
cela fonctionne correctement juste en intégrant cependant pour une position donnée les valeurs ne restent pas stable un peu comme si il y avait une dérive

C'est normal, il y a une dérive. Pour éviter ça, il faut calculer cette dérive: gyro fixe, tu fais une moyenne sur un millier de mesures et ensuite tu retranches cette valeur à chaque mesure. Ca permettra de réduire la dérive, mais pas de l'annuler.

Hosseindemars:
De plus l angle est soit négatif soit positif en fonction du sens de rotation

Normal, non ?

Hosseindemars:
l'angle excède 360°

Tu peux faire en sorte qu'il reste compris entre -360 et 360.

mais comment faire pour que dans mon cas l'angle soit compris entre 0 et 360° ?

C'est mon explication qui n'est pas claire ou bien tu ne sais pas le programmer ?