lord-maricek
25.09.2011, 12:28
Moin,
wir haben auf einer Platinen einen HMC5883L und einen Mega644p, über I2C verbunden.
Als Testcode habe ich einen Schematisch von den Arduinos übernommen. Das Problem, dass beim drehen nur Richtungen zwischen 280Grad bis 360Grad errechnet werden.
Das ist die Formel:
angle = atan2((double)y,(double)x) * 180 / 3.14159265 + 180;
Hier 4 Testmessungen, immer den Kompass um 90° gedreht:
1.Heading: 309
X: -9
Y: 11
Z: 6
2.
Heading: 351
X: -14
Y: 2
Z: 7
3.
Heading: 339
X: -27
Y: 10
Z: 7
4.
Heading: 325
X: -23
Y: 16
Z: 6
Im Anhang ist das Avr Studio 5 Projekt.
Schematisch:
-Start des I2C Netzwerkes.
-Compass Init -> write: Register 0x02 = 0x00 (Continuous-measurement mode mit 15Hz (default))
-Compass write Register Indexer auf 0x03-Dann werden die 6 Bytes ab Register 0x03 gelesen, jeweils in MSB und LSB für alle 3 Achsen.
-LSB und MSB werden so zusammengefügt:
*x = i2c_readAck()<<8;
*x |= i2c_readAck();
Was könnte falsch sein, dass so falsche Daten rauskommen?
Ich habs einfach nur nach dem Arduino Code gemacht, da gehts auch.
MfG
Philipp
wir haben auf einer Platinen einen HMC5883L und einen Mega644p, über I2C verbunden.
Als Testcode habe ich einen Schematisch von den Arduinos übernommen. Das Problem, dass beim drehen nur Richtungen zwischen 280Grad bis 360Grad errechnet werden.
Das ist die Formel:
angle = atan2((double)y,(double)x) * 180 / 3.14159265 + 180;
Hier 4 Testmessungen, immer den Kompass um 90° gedreht:
1.Heading: 309
X: -9
Y: 11
Z: 6
2.
Heading: 351
X: -14
Y: 2
Z: 7
3.
Heading: 339
X: -27
Y: 10
Z: 7
4.
Heading: 325
X: -23
Y: 16
Z: 6
Im Anhang ist das Avr Studio 5 Projekt.
Schematisch:
-Start des I2C Netzwerkes.
-Compass Init -> write: Register 0x02 = 0x00 (Continuous-measurement mode mit 15Hz (default))
-Compass write Register Indexer auf 0x03-Dann werden die 6 Bytes ab Register 0x03 gelesen, jeweils in MSB und LSB für alle 3 Achsen.
-LSB und MSB werden so zusammengefügt:
*x = i2c_readAck()<<8;
*x |= i2c_readAck();
Was könnte falsch sein, dass so falsche Daten rauskommen?
Ich habs einfach nur nach dem Arduino Code gemacht, da gehts auch.
MfG
Philipp