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.
Hi Dirk,
ich habe den code für den gyro um die ausgabe der normalisierten werte ergänzt, die funktion sieht jetzt so aus:
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?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(); }
gruß inka
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.
Gruß
Dirk
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?
gruß inka
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.
Geändert von Dirk (24.07.2013 um 21:00 Uhr) Grund: Text verbessert
Gruß
Dirk
@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):
sollte das "normalize" nun auskommentiert werden, oder nicht? Wie ist der letzter stand in der lib?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
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!
gruß inka
@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.
Gruß
Dirk
@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?
gruß inka
@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?
Gruß
Dirk
Lesezeichen