Arduino gyro inakkurat?
Servus. Ich bin gerade an einem Projekt für das ich einen Sensor brauche der die Orientierung und die G Kräfte misst. Bin noch komplett am Anfang, aber scheitere hier schon.
Mein teurer BMI088 V1.0 bringt sehr variierende Werte. Sieht eigentlich schon fast willkürlich aus, aber reagiert auf bewegungen.
Ist es mein Code der Falsch ist? Bin jetzt schon seit über 2 Stunden dran und so weit gekommen bis jetzt:
#include "BMI088.h"
#include "SensorFusion.h" //SF
SF fusion;
float deltat;
float pitch, roll, yaw;
float ax = 0, ay = 0, az = 0;
float gx = 0, gy = 0, gz = 0;
float gx_all;
float gy_all;
float gz_all;
float ax_all;
float ay_all;
float az_all;
BMI088 bmi088( 0x19, 0x69 );
void setup(void) {
Wire.begin();
Serial.begin(115200);
Serial.println("Bereit");
while (!Serial);
Serial.println("BMI088 Raw Data");
while (1) {
if (bmi088.isConnection()) {
bmi088.initialize();
Serial.println("BMI088 is connected");
break;
} else {
Serial.println("BMI088 is not connected");
}
delay(2000);
}
}
void loop(void) {
bmi088.getAcceleration(&ax, &ay, &az);
bmi088.getGyroscope(&gx, &gy, &gz);
/*
Serial.print(ax);
Serial.print("(ax), ");
Serial.print(ay);
Serial.print("(ay), ");
Serial.print(az);
Serial.print("(az), ");
Serial.print(gx);
Serial.print("(gx), ");
Serial.print(gy);
Serial.print("(gy), ");
Serial.print(gz);
Serial.print("(gz), ");
Serial.println();
*/
//Nimmt den Mittelwert aus 10000 Messungen
for (int i = 0; i < 10000; i++) {
gx_all = gx_all + gx;
gy_all = gy_all + gy;
gz_all = gz_all + gz;
ax_all = ax_all + ax;
ay_all = ay_all + ay;
az_all = az_all + az;
}
Serial.println("Fertig :");
gx_all = gx_all / 10000;
gy_all = gy_all / 10000;
gz_all = gz_all / 10000;
ax_all = ax_all / 10000;
ay_all = ay_all / 10000;
az_all = az_all / 10000;
deltat = fusion.deltatUpdate();
fusion.MahonyUpdate(gx_all, gy_all, gz_all, ax_all, ay_all, az_all, deltat);
pitch = fusion.getPitch();
roll = fusion.getRoll();
yaw = fusion.getYaw();
Serial.print("Pitch: ");
Serial.print(pitch);
Serial.print(", Roll: ");
Serial.print(roll);
Serial.print(", Yaw: ");
Serial.print(yaw);
Serial.println();
delay(1);
}
Und wenn ich gerade schon dabei bin, ich finde online über den BMI088 in kombination mit einem Arduino fast nichts. Wie bekomme ich die Beschleunigung und die wirkenden G Kräfte?
Danke und Grüße, Leo
2 Antworten
Sind die rohen ax usw. Werte denn richtig?
Deine ganze Rechnung mit den „Mittelwerten“ macht für mich keinen Sinn. Dein neuer Wert hat so ja einen extrem großen Einfluss und man hat quasi keine Glättung
Die Werte sind ja aktuell alle
Werte = (alter_Wert + (neuer Wert * 10000)) / 10000
Und welche Bibliothek nimmt du genau?
Die https://github.com/bolderflight/bmi088-arduino welche ich auf den ersten Blick gefunden haben muss man etwas anders benutzen. Da am besten mal die Beispiele ausprobieren ob die richtig funktionieren
Quasi genau nach dem Muster: https://wiki.seeedstudio.com/zh-CN/Grove-6-Axis_Accelerometer&Gyroscope_BMI088/
Bringt es was wenn du den Delay höher stellst?
Je nachdem wie der BMI konfiguriert ist machst du eventuell zu viele reads obwohl die Daten noch nicht bereit sind.
In dem ursprünglichen Beispiel nehmen die ja einen Delay von 50 und nicht 1
Ich hatte den Delay auf 100ms in den ersten tests. Leider hat das nichts gebracht :/
Du glättest nicht 10000 Werte, sondern Du zählst einen WErt 10000x dazu und dann teilst Du durch 10000.
Mach eine FIFO und davon den Durchschnitt. Aber je nach Arduino wirst Du gar keine 10000 glätten können, so viel Speicher hat der nicht. Nimm mal 10 oder so.
Oh stimmt. Das andere Problem ist dass meine Rohen Daten auch komplett abweichen, deshalb habe ich eine "Glättung erst versucht"
Wenn er sich 0 bewegt und flach auf dem Tisch liegt
68.30(ax), -1.46(ay), 1005.62(az), 3.30(gx), -1.22(gy), 1.22(gz),
68.12(ax), -2.38(ay), 1007.63(az), -7.08(gx), 2.08(gy), -1.95(gz),
68.12(ax), -2.38(ay), 1007.63(az), -3.78(gx), -0.98(gy), -3.66(gz),
64.09(ax), -2.75(ay), 1005.43(az), 0.12(gx), 1.10(gy), 0.61(gz),
64.09(ax), -2.75(ay), 1005.43(az), 0.73(gx), 1.10(gy), -4.76(gz),
64.64(ax), -2.20(ay), 1004.88(az), 6.10(gx), -4.15(gy), 0.00(gz),
65.92(ax), -0.18(ay), 1003.42(az), 7.57(gx), 4.64(gy), 4.27(gz),
65.92(ax), -0.18(ay), 1003.42(az), -5.00(gx), -5.49(gy), 3.17(gz),
65.55(ax), -1.65(ay), 1003.78(az), -0.12(gx), 5.49(gy), 10.25(gz),
65.55(ax), -1.65(ay), 1003.78(az), -1.83(gx), -2.44(gy), -2.44(gz),
65.73(ax), -2.56(ay), 1003.42(az), 1.59(gx), 1.83(gy), 0.49(gz),
65.73(ax), -2.56(ay), 1003.42(az), -1.22(gx), -4.39(gy), -0.73(gz),
65.37(ax), -1.28(ay), 1005.43(az), -2.44(gx), 1.34(gy), -5.98(gz),
67.57(ax), -1.10(ay), 1005.62(az), -0.85(gx), 2.20(gy), -5.25(gz),
Das sollen Doubles sein? Ich denk da ist was sehr falsch. Such mal auf Youtube, wie so ein Kunstflieger bei 10g im Gesicht aussieht :-D.
Also das ist was der Sensor mir als Rohdaten bei folgendem Code liefert:
#include "BMI088.h"
#include <Wire.h>
float ax = 0, ay = 0, az = 0;
float gx = 0, gy = 0, gz = 0;
BMI088 bmi088( 0x19, 0x69 );
void setup(void) {
Serial.begin(115200);
Wire.begin();
while (!Serial);
Serial.println("BMI088 Raw Data");
while (1) {
if (bmi088.isConnection()) {
bmi088.initialize();
Serial.println("BMI088 is connected");
break;
} else {
Serial.println("BMI088 is not connected");
}
delay(2000);
}
}
void loop(void) {
bmi088.getAcceleration(&ax, &ay, &az);
bmi088.getGyroscope(&gx, &gy, &gz);
Serial.print(ax);
Serial.print("(ax), ");
Serial.print(ay);
Serial.print("(ay), ");
Serial.print(az);
Serial.print("(az), ");
Serial.print(gx);
Serial.print("(gx), ");
Serial.print(gy);
Serial.print("(gy), ");
Serial.print(gz);
Serial.print("(gz), ");
Serial.println();
Hab ich. Deshalb bin ich hier. Da find ich nix was mir hilft
also ich kapiere es. Die Schwankungen sind effektiv klein. Das Objekt liegt schief auf dem Tisch. 1000 entspricht ca 1g.
981 az bedeutet dass es gerade auf dem tisch liegt und 1g auf den sensor in der z achse wirken oder wie? Also muss ich die ganzen a werte einfach durch 981teilen? um die G Kraft zu bekommen?
Ich würde sagen 1000 ist ungefähr 1g. Aber halt nicht ganz genau. Und die gs sind die Rotation pro Sekunde. Und das scheint ja wohl auch an der Nachweisgrenze zu sein.
Hey. Ich benutze die Seed Library da die andere für mich nicht funktioniert hat: https://github.com/Seeed-Studio/Grove_6Axis_Accelerometer_And_Gyroscope_BMI088/archive/master.zip
Die Rohen Werte sind auch absolut ungenau, deshalb habe ich eine Glättung versucht (und wie es aussieht gescheitert)