Bonjour,
je suis en train de désespérer, actuellement je possède un IMU Sparkfun composé d'un ITG-3200 et d'un ADXL-345. J'ai déjà réussie à récupérer les angles pitch et roll maintenant je cherche à avoir le yaw.
J'ai essayé plusieurs solutions (par moi même à partir de plusieurs tutoriels et en utilisant la librairie IMUFilter) mais pour l'instant c'est l'échec. Au premier abords, à chaque fois ça donne l'impression de fonctionner (valeur bien à 0 en valeur initiale, valeur qui change en fonction de l'angle) puis on remarque que les valeurs s'incrémentent en continue... Et si je donne un coup de point sur la table, les valeurs disent n'importe quoi (je passe de 0 à 90 puis à -90 -_-)
Voici mon code:
#include <Wire.h>
#include <ITG3200.h>
#include <ADXL345.h>
#include <IMUfilter.h>
#define toDegrees(x) (x * 57.2957795)
#define toRadians(x) (x * 0.01745329252)
#define FILTER_RATE 0.1
float gyro_data[3];
float acc_data[3];
int i;
float pitch, roll, yaw;
ITG3200 gyro = ITG3200();
ADXL345 Accel;
IMUfilter imuFilter(FILTER_RATE, 0.3);
void lectureAcc(void)
{
Accel.get_Gxyz(acc_data);
acc_data[0] *= 9.812865328;
acc_data[1] *= 9.812865328;
acc_data[2] *= 9.812865328;
}
void lectureGyro(void)
{
float x, y, z;
gyro.readGyro(&x,&y,&z);
gyro_data[0] = toRadians(x);
gyro_data[1] = toRadians(y);
gyro_data[2] = toRadians(z);
}
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(1000);
Serial.println("InitAcc");
Accel.init(ADXL345_ADDR_ALT_LOW);
Serial.println("InitGyro");
gyro.init(ITG3200_ADDR_AD0_LOW);
Serial.println("AccCalibration");
Accel.set_bw(ADXL345_BW_12);
Serial.println("GyroCalibration");
gyro.zeroCalibrate(1000, 2);
}
void loop()
{
lectureAcc();
lectureGyro();
imuFilter.updateFilter(gyro_data[0], gyro_data[1], gyro_data[2], acc_data[0], acc_data[1], acc_data[2]);
imuFilter.computeEuler();
roll = toDegrees(imuFilter.getRoll());
pitch = toDegrees(imuFilter.getPitch());
yaw = toDegrees(imuFilter.getYaw());
Serial.print(i);
i++;
Serial.print(";");
Serial.print(pitch);
Serial.print(";");
Serial.print(roll);
Serial.print(";");
Serial.println(yaw);
delay(100);
}[/quote]
Avez-vous une idée pour m'aider à résoudre ce problème ?
Et pouvez vous me confirmer que pour avoir l'angle yaw, normalement, je suis censé faire: (Gyro_data_n - Gyro_data_n-1) / (Tn - Tn-1) où Gyro_data est la valeur récupérer en deg/s et T le moment où l'on récupère la valeur ?
Merci d'avance pour votre aide précieuse !