@Dirk:
das mit der kalibrierung werde ich probieren, sobald ich an meine daten komme, habe momentan probleme mit meiner netzwerkplatte - nach einem heftigen gewitter war sie auf einmal weg
@inka:
Ich habe noch mal die Lib mit der M256 getestet. Die M32-Lib müßte eigentlich genauso funktionieren.
Den "Fehler" mit der fixen Richtungsanzeige von ~270° kann ich nachvollziehen,- und zwar dann, wenn der Sensor noch nicht kalibriert wurde.
Du müßtest also die Definitionen MAX_X_2DM, MIN_X_2DM, MAX_Y_2DM und MIN_Y_2DM in der RP6M256_Orientation.h an deine Hardware anpassen, d.h. den Sensor kalibrieren.
Gruß
Dirk
@Dirk:
das mit der kalibrierung werde ich probieren, sobald ich an meine daten komme, habe momentan probleme mit meiner netzwerkplatte - nach einem heftigen gewitter war sie auf einmal weg
gruß inka
@Dirk:
habe jetzt die kalibrierung durchgeführt. nach dem eintragen in die "RP6Control_Orientation.h":
nach einer neukompilierung der "RP6Control_MultiIO_05.c" sind aber die ausgaben auf dem display fast identisch mit denen ohne kalibrierung. Auch die 270. So langsam bin ich am aufgeben...Code:// 2D-Compass (HDMM01): // MMC2120MG magnetometer: #define I2C_MULTIIO_HDMM01_ADR 0x60 // Default // MMC2120MG magnetometer calibration data: #define MAX_X_2DM 2016.0 // Max. X-axis value 2042.0 #define MIN_X_2DM 1831.0 // Min. X-axis value 1863 #define BIAS_X_2DM (MAX_X_2DM + MIN_X_2DM) / 2.0 #define SF_X_2DM 2.0 / (MAX_X_2DM - MIN_X_2DM) #define MAX_Y_2DM 2228.0 // Max. Y-axis value 2220 #define MIN_Y_2DM 2028.0 // Min. Y-axis value 2040 #define BIAS_Y_2DM (MAX_Y_2DM + MIN_Y_2DM) / 2.0 #define SF_Y_2DM 2.0 / (MAX_Y_2DM - MIN_Y_2DM)
kann man in der "RP6Control_Orientation.h" irgendwelche extremwete eingeben um zu sehen ob es überhaupt eine reaktion des HDMM gibt?
gruß inka
@inka:
2 Fragen:
1. Kalibrierung wie hier beschrieben durchgeführt?
2. Vor dem Neukompilieren "Make clean" gemacht bzw. die Files RP6Control_OrientationLib.lst und .o gelöscht?
Ja, wäre möglich. Du kannst probeweise auch anders kalibrieren: Neige den RP6/Sensor in alle Richtungen und notiere dir die Min./Max.-Werte der beiden Achsen. Die trägst du dann in die RP6Control_Orientation.h ein.kann man in der "RP6Control_Orientation.h" irgendwelche extremwete eingeben um zu sehen ob es überhaupt eine reaktion des HDMM gibt?
Andere Möglichkeit zur Fehlersuche: Die normalizeHDMM01() Funktion nicht nutzen, sondern die nicht normalisierten Werte direkt verwenden.
Gruß
Dirk
@Dirk:
ich teste jetzt nur noch mit der RP6Control_MultiIO_05.c, die zeile mit "normalize" habe ich auskomentiert, statt Heading 270, wird Heading 0 angezeigt, ansosnten keine änderung zum positiven...
jaCode:#ifdef COMPASS_2D // 2D-Compass test: task_I2CTWI(); SRF02_getFirmware(CH_SRF02_1); intreg2dm = readHDMM01(); // Get sensor values task_I2CTWI(); if(!intreg2dm) { // Data valid? // normalizeHDMM01(); // Normalize data heading2dm = headingHDMM01(); // Calculate heading setCursorPosLCD(0, 0); // line 1 writeStringLCD_P("Heading "); writeIntegerLCD(heading2dm, DEC); writeStringLCD_P(" "); writeStringLCD(dir); writeStringLCD_P(" "); setCursorPosLCD(1, 0); // line 2 writeStringLCD_P("X "); writeIntegerLCD(x_axis2dm, DEC); writeStringLCD_P(" "); setCursorPosLCD(1, 8); // line 2 pos 9 writeStringLCD_P("Y "); writeIntegerLCD(y_axis2dm, DEC); writeStringLCD_P(" "); } task_I2CTWI(); mSleep(3000); #endif
alle dateien gelöscht...
siehe oben, btw. der Y wert wird negativ (mit -) angezeigt...
gruß inka
@inka:
So einfach geht es nicht, weil normalizeHDMM01() die Variablen x_axis2dm, y_axis2dm nutzt, um daraus die double Variablen x2dm, y2dm zu berechnen. Mit x2dm, y2dm wird dann die Richtung errechnet....die zeile mit "normalize" habe ich auskomentiert, statt Heading 270, wird Heading 0 angezeigt, ...
Gruß
Dirk
@inka:
Ja, die x_axis2dm, y_axis2dm Werte können auch negativ werden.Zitat von inka: der Y wert wird negativ (mit -) angezeigt... wie ist es damit? ok?
Bei der Kalibrierung müßte man negative Minimal-Werte dann natürlich auch unter MIN_X_2DM und MIN_Y_2DM eintragen.
Gruß
Dirk
@Dirk:
ich habe jetzt diese werte für X_2dm un Y_2dm eingetragen:
und bekomme auch in der LCD die headingwerte angezeigt, diese verändern sich auch entsprechend der position in die ich den RP6 drehe. So weit so gut...Code:// MMC2120MG magnetometer calibration data: #define MAX_X_2DM 2015.0 // Max. X-axis value 2042.0 #define MIN_X_2DM 1840.0 // Min. X-axis value 1863 #define BIAS_X_2DM (MAX_X_2DM + MIN_X_2DM) / 2.0 #define SF_X_2DM 2.0 / (MAX_X_2DM - MIN_X_2DM) #define MAX_Y_2DM -2038.0 // Max. Y-axis value 2220 #define MIN_Y_2DM -2228.0 // Min. Y-axis value 2040 #define BIAS_Y_2DM (MAX_Y_2DM + MIN_Y_2DM) / 2.0
wenn ich ihn aber in die richtung NORD drehe (ausgerichtet nach einem uralten analogen kompass) dann zeigt er nicht 360 (oder so) sondern ein wert um die 250. Das der RP in fahrtrichtung NORD steht, konnte ich anhand der umgebung verifizieren, der analoge kompass ist also ok...
Wurden schon die abhängigkeiten der angezeigten/berechneten himmelsrichtungen zu den in der orientation.h eingetragenen werten (s.o.) hier irgendwo erklärt? Oder könnte ich bei irgendeinem der werte einen bestimmten bertrag ab-/hinzu-addieren um auf die 360/NORD zu kommen? Wie komme ich zu diesem wert?
gruß inka
@inka:
Das ist schon mal gut.bekomme auch in der LCD die headingwerte angezeigt, diese verändern sich auch entsprechend der position in die ich den RP6 drehe.
Was aber auffällt:
Deine Min-/Max-Werte sind auffällig: Die Amplitude der Y-Achse bleibt im neg. Bereich und die der X-Achse im pos. Bereich.
Das könnte dafür sprechen, dass dein Sensor in einem stark von Magnetfeldern oder in einem (durch Metalle) verfälschten Erdmagnetfeld arbeitet. Dadurch kriegst du auch keine richtige Richtungsanzeige und bei der Kalibrierung keine sinnvollen Min-/Max-Werte.
Wichtig ist:
- Auf dem RP6 sollte er möglichst weit weg von den Motoren sitzen
- In der direkten Nähe sollten auch keine Metallteile sein (Stahlschrauben, Abstandhalter, Kabel ...)
- In der weiteren Umgebung (>2m) genauso (Handy, PC, Tisch mit Stahlbeinen, Netzteil, Kabel ...)
Gruß
Dirk
Lesezeichen