-
Hi Dirk,
ich habe den code für den gyro um die ausgabe der normalisierten werte ergänzt, die funktion sieht jetzt so aus:
Code:
void gyroscope(void) // L3GD20 gyroscope
{
mSleep(1000);
task_I2CTWI();
readL3GD20(); // Get sensor values
normalizeL3GD20();
task_I2CTWI();
clearLCD();
setCursorPosLCD(0, 0); // line 1
writeStringLCD_P("X");
writeIntegerLCD(x_axisg, DEC);
setCursorPosLCD(0, 6); // line 1 pos 6
writeStringLCD_P("Y");
writeIntegerLCD(y_axisg, DEC);
setCursorPosLCD(0, 12); // line1 pos 12
writeStringLCD_P("Z");
writeIntegerLCD(z_axisg, DEC);
setCursorPosLCD(1, 0); // line 2
writeStringLCD_P("X");
writeIntegerLCD(xg, DEC);
setCursorPosLCD(1, 6); // line 2 pos 6
writeStringLCD_P("Y");
writeIntegerLCD(yg, DEC);
setCursorPosLCD(1, 12); // line 2 pos 12
writeStringLCD_P("Z");
writeIntegerLCD(zg, DEC);
#ifdef GET_TEMP
temperatureg = calcTempL3GD20(temperatureg) + 5;
temperatureg += OFFSET_TEMP;
setCursorPosLCD(1, 8); // line 2 pos 9
writeStringLCD_P("T");
writeIntegerLCD(temperatureg, DEC);
writeStringLCD_P(" ");
#endif
mSleep(2000);//3 sec
clearLCD();
task_I2CTWI();
}
ich habe Deine erklärungen so verstanden, dass die normalisierten werte sich durch die normalisierung von den rohwerten unterscheiden, in der ausgabe dieser funktion sind beide zeilen gleich, oben die rohwerte (x_axisg) unten die normalisierten (xg). Da ist doch irgendwas falsch, oder?
-
Die Variablen xg, yg und zg sind Floating Points.
Du müßtest also die Funktion writeDoubleLCD() zur Ausgabe nehmen.
Das passt dann kaum noch aufs LCD: Ich würde die Werte über das Terminal ausgeben.
-
ok, habe nun den code etwas verändert:
Code:
// setCursorPosLCD(1, 0); // line 2
// writeStringLCD_P("X");
writeString_P("x: ");
writeDouble(xg, 5, 5);
writeString_P("\n");
im terminal wird der wert der xg-variablen jetzt ausgegeben, ist aber immer noch identisch mit x_axis_g, nur mit angehängten 5 nullen hinterm koma...
ob die zwei zahlen 5, 5 nun passend sind weiss ich nicht so genau, auch bei 1, 1 verändert sich nur die zahl der nullen...
irgendwie habe ich erwartet, dass der unterschied zwischen x_axis_g und xg signifikanter ist?
-
Hi inka,
du bist ja da beim Gyro:
Die "Normalisierung" geschieht in der Funktion normalizeL3GD20() zum einen durch eine Begrenzung der Werte nach oben/unten auf 20000/-20000.
Zum anderen wird ein OFFSET addiert (OFFSET_X/Y/Z).
Nach der Normalisierung werden sich die kalibrierten Werte (xg, yg, zg) nicht von den Rohwerten (x_axisg, y_axisg, z_axisg) unterscheiden.
-
@Dirk,
die sache mit dem "make" und den "strukturen" scheine ich jetzt verstanden zu haben. Die kalibrierung des gyro mit der "demo_05_02" hat auch einigermassen geklapt, jetzt möchte ich weitermachen mit accelerometer und magnetometer.
Dieser code hier (als beispiel für den accelerometer):
Code:
#ifdef IMU_9D
// LSM303DLHC accelerometer:
task_I2CTWI();
readLSM303DLHC_A(); // Get sensor values
task_I2CTWI();
setCursorPosLCD(0, 0); // line 1
writeStringLCD_P("X");
writeIntegerLCD(x_axisa, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 5); // line 1 pos 6
writeStringLCD_P("Y");
writeIntegerLCD(y_axisa, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 10); // line 1 pos 11
writeStringLCD_P(" Z");
writeIntegerLCD(z_axisa, DEC);
writeStringLCD_P(" ");
normalizeLSM303DLHC_A(); // Normalize data
positionLSM303DLHC_A(); // Calculate position
setCursorPosLCD(1, 0); // line 2
writeStringLCD_P("P");
writeDoubleLCD(pitch, 6, 1);
writeStringLCD_P(" ");
setCursorPosLCD(1, 8); // line 2 pos 9
writeStringLCD_P("R");
writeDoubleLCD(roll, 6, 1);
writeStringLCD_P(" ");
task_I2CTWI();
mSleep(1000);
clearLCD();
#endif
sollte das "normalize" nun auskommentiert werden, oder nicht? Wie ist der letzter stand in der lib?
btw: meine kalibriervorrichtung, auf die ich soo stolz war taugt nicht viel. habe festgestellt, dass beim umschrauben 1° versatz reicht, um völlig andere werte zu bekommen. Eigentlich müsste man sich über eine genaue und zwar wiederholbar genaue befestigung der minIMU gedanken machen!
-
@inka:
Beschleunigungssensor:
In der Funktion normalizeLSM303DLHC_A() werden die X/Y/Z-Rohwerte nur begrenzt. Außerdem erfolgt die Ausgabe in der Demo ja VOR Aufruf der normalizeLSM303DLHC_A()-Funktion, so dass du sie ruhig drin lassen kannst.
Aber: Pitch und Roll werden NACH Normalisierung berechnet, also aus den begrenzten Rohwerten.
Magnetfeldsensor:
Auch hier werden die Rohwerte in der Demo VOR der Normalisierungsfunktion ausgegeben, so dass sie unverändert sind.
Aber: Die Berechnung der Richtung erfolgt dann mit den normalisierten Rohwerten.
-
@Dirk:
ich kämpfe immer noch mit dem begriff "negativer Maximalwert". Beim kalibrieren des magnetometers waren diese negativen maximalwerte werte alle drei (X,Y und Z) nahe null, oder sogar gleicn null. Die "negativen Minimalwerte" entsprachen in ihrem absolutwert aber in etwa dem absoluten wert der "positiven Maximalwerte". Irgendwie würde ich dazu tendieren für das "nullen" eines sensors die jeweils maximalen "ausschläge" in positiver wie auch negativer richtung zu verwenden. Gibt es eine allgemeinverständliche erklärung dafür, dass es hier anders ist?
-
@inka:
Möglicherweise habe ich mich nicht mathematisch korrekt ausgedrückt:
Zur Kalibrierung wird der jeweils größte (MAX) und jeweils kleinste Wert (MIN) benötigt.
Beispiele:
a) -20 -14 -8 +2 +23 +177
==> MIN = -20 und MAX = +177
b) +44 +56 +126 +1244 +2833
==> MIN = +44 und MAX = +2833
c) -2833 -574 -233 -88 -12
==> MIN = -2833 und MAX = -12
So klarer?