integration d'une vitesse angulaire

bonsoir,
Je suis en CPGE et pour mon TIPE il faut que je mesure un angle avec un gyroscope.
Je possède comme gyroscope un L3G4200 mal documenté je trouve mais bon il était pas cher :stuck_out_tongue:
J’ai réussi à acquérir les données du capteurs soit la vitesse angulaire que j’intègre afin d’obtenir la position angulaire.

voici mon programme (minimal pour l’instant):

#include <Wire.h>
#include <L3G4200D.h>
int compteur=0;
int moteurg=2;
int moteurd=3;
float moyennex=0.00; //on definit les variables
float moyenney=0.00;
float moyennez=0.00;
float Z=0.00;
long temps;
long ecart;
L3G4200D gyro;

///////////////////

void setup()
{

//start communication
Serial.begin(9600);
Wire.begin();
gyro.enableDefault();

//attribution des modes
pinMode(moteurg,OUTPUT); //sert à rien pour l’instant
pinMode(moteurd,OUTPUT);

//soustraction de la moyenne du bruit du capteur
while (compteur < 1000)
{
moyennex+=(int)gyro.g.x; //à l’état initial, le capteur me donne une vitesse angulaire non nulle
moyenney+=(int)gyro.g.y; //(peut être un défaut du capteur) je fais donc une moyenne de 1000
moyennez+=(int)gyro.g.z; //valeurs que je vais soustraire pour être centré en 0
compteur+=1;
}
moyennex = moyennex/1000;
moyenney = moyenney/1000; //mes moyennes des 3 axes
moyennez = moyennez/1000;
}

/////////////////////

void loop()
{
temps=millis(); //je prend le temps
gyro.read();
Z+=((int)gyro.g.y-moyennez) * ecart /10000;

//en faisant ça je lis la valeur du gyroscope puis je soustrait la moyenne. je multiplie le tout par un petit intervalle de temps afin d’intégrer et je divise par 10000 afin de rendre plus conviviale la lecture du resultat.

Serial.println(Z); //j’affiche
ecart=millis() - temps; // j’ai mon ecart de temps

}

En faite, j’ai deux problèmes:

•1er: mon programme fonctionne bien j’obtiens les valeurs d’angle en degré, mais arrivé vers 70° mon programme stop (un peu comme si une variable était en overflow)

•2eme problème: même en supprimant la valeur de la moyenne au début , je dois toujours avoir une petite erreur ce qui veux dire que lorsque je ne touche pas à mon gyroscope, la valeur de l’angle augmente petit à petit :frowning:

Avez vous une petit idée pour m’aider s’il vous plait ? :slight_smile:
merci bonne soirée :slight_smile:

Bonjour,

Mesurer un angle en intégrant la mesure d'un gyroscope n'est en général pas une bonne idée.
Quel angle souhaites-tu mesurer ?

Ah bon?
en faite c'est pour mesurer l'inclinaison d'un drone.
donc avec un giro c'est pas possible? :frowning:

Sur un objet qui n'est pas en mouvement, les mesures d'angle se font avec un accéléromètre car l'accélération de la pesanteur se projète sur les axes de l'accéléro. Donc, à partir de la valeur de l'accélération sur chaque axe, connaissant l'accélération de la pesanteur (9.8 m/s^2), on peut remonter aux valeurs des angles.

Sur un objet en mouvement, c'est plus compliqué car il s'ajoute à la pesanteur l'accélération de l'objet lui-même. On a donc besoin dans ce cas des deux, accéléro et gyro. On utilise souvent un filtre de Kalman pour essayer de remonter aux angles.

d'accord merci 3Sigma!
le filtre de kalman est il difficile à mettre en œuvre pour un débutant comme moi?
Y'a t'il quelques exemples de programmes qui utilisent à la fois un gyro et un accéléro?
merci bonne journée :slight_smile:

Oui, pas facile de pondre un filtre de Kalman si tu ne connais pas. Mais tu trouveras plein d'exemple sur Internet. N'hésite pas à faire des recherches en anglais, tu trouveras plus de choses.