Dass die Berechnung nach Graden nicht stimmt, kann gut sein. Aber es müssten doch trozdem verschiedene Werte kommen wenn ich den Kompass nieige/kippe.
Druckbare Version
Dass die Berechnung nach Graden nicht stimmt, kann gut sein. Aber es müssten doch trozdem verschiedene Werte kommen wenn ich den Kompass nieige/kippe.
Kompass wurde kalibriert?
s. CMPS Anleitung
ouu :DZitat:
Ja das hab ich vergessen ^^ werd ich dann mal so schnell wie möglich machen.
@SlyD: Ich habe den LSM303DLH und nicht den CMPS ^^
Also ich habe den Kompass wie in diesem beispiel Kalibriert:
Das Problem bei dieser Methode ist, dass ich zum Teil falsche Werte schon beim lesen der "raw" daten wirre Sachen wie 0 oder so bekomme. Daher bringt die Kalibrierung nicht wirklich etwas.Code:// Returns a set of acceleration and raw magnetic readings from the cmp01a.
void read_data_raw(vector *a, vector *m)
{
// read accelerometer values
i2c_start();
i2c_write_byte(0x30); // write acc
i2c_write_byte(0xa8); // OUT_X_L_A, MSB set to enable auto-increment
i2c_start(); // repeated start
i2c_write_byte(0x31); // read acc
unsigned char axl = i2c_read_byte();
unsigned char axh = i2c_read_byte();
unsigned char ayl = i2c_read_byte();
unsigned char ayh = i2c_read_byte();
unsigned char azl = i2c_read_byte();
unsigned char azh = i2c_read_last_byte();
i2c_stop();
// read magnetometer values
i2c_start();
i2c_write_byte(0x3C); // write mag
i2c_write_byte(0x03); // OUTXH_M
i2c_start(); // repeated start
i2c_write_byte(0x3D); // read mag
unsigned char mxh = i2c_read_byte();
unsigned char mxl = i2c_read_byte();
unsigned char myh = i2c_read_byte();
unsigned char myl = i2c_read_byte();
unsigned char mzh = i2c_read_byte();
unsigned char mzl = i2c_read_last_byte();
i2c_stop();
a->x = axh << 8 | axl;
a->y = ayh << 8 | ayl;
a->z = azh << 8 | azl;
m->x = mxh << 8 | mxl;
m->y = myh << 8 | myl;
m->z = mzh << 8 | mzl;
}
// Returns a set of acceleration and adjusted magnetic readings from the cmp01a.
void read_data(vector *a, vector *m)
{
read_data_raw(a, m);
// shift and scale
m->x = (m->x - m_min.x) / (m_max.x - m_min.x) * 2 - 1.0;
m->y = (m->y - m_min.y) / (m_max.y - m_min.y) * 2 - 1.0;
m->z = (m->z - m_min.z) / (m_max.z - m_min.z) * 2 - 1.0;
}
...
read_data_raw(&a, &m);
if (m.x < cal_m_min.x) cal_m_min.x = m.x
if (m.x > cal_m_max.x) cal_m_max.x = m.x;
if (m.y < cal_m_min.y) cal_m_min.y = m.y;
if (m.y > cal_m_max.y) cal_m_max.y = m.y;
if (m.z < cal_m_min.z) cal_m_min.z = m.z;
if (m.z > cal_m_max.z) cal_m_max.z = m.z;
Nach dem Kalibrieren verwende ich natürlich die read_data Methode sonst würde das Kalibrieren nichts bringen.
Hallo,
Wo kalibrierst Du den Kompass?
Auf dem RP6 oder irgendwo weit daneben?
(die Motoren erzeugen ein Magnetfeld - kann ja sein das Du den Kompass zu nah dran hast... )
Das Teil ist ja 3.3V also 3.3V<->5V Levelshifter hast Du drin bzw. sind auf der fertigen Platine die Du verwendest?
MfG,
SlyD
Hallo,
Die sind schon auf der Platine genau so wie die Pull-Up Wiederstände.
Der Kompass ist etwa 11-12 cm über der RP6 Platine und die Motoren steuere ich nicht an, gerade wegen dem Magnetfeld.
MFG,
Berghuhn
Also ich habe einen Rundungsfehler gefunden und bekomme nun folgende Werte:
x: 130.15
y: 211.51
z: 154.95
diese verändern sich aber wie zuvor nicht.
MfG Berghuhn
(gelöscht)
Nur mal so nebenbei eine Frage.
Wir sprechen schon von den auf dem Bild Grün markierten I²C Port, oder sind die Ports für z.B. die Experemetierplatine gemeint (XBUS)?
http://imageshack.us/photo/my-images/716/rp6u.jpg/
Die Grün markierten spreche ich trozdem über PC1 und PC0 an richtig?
Hallo,
der I2C Bus ist natürlich mit allen Pads verbunden die auf dem Mainboard mit SCL und SDA beschriftet sind.
Pullup Widerstände sind schon auf dem Mainboard vorhanden (4K7).
Beim anderen Problem kann ich leider wenig helfen da ich diesen Typ Kompass noch nie verwendet habe.
Funktioniert der I2C Bus denn allgemein noch problemlos?
Also mal mit RP6Base_I2CSlave und dem RP6-M32 mit einem der normalen Beispielprogramme laufen lassen...
MfG,
SlyD