-
HDMM01 Problem
Hallo zusammen, ich versuch derzeit mein neues HDMM01 von Pollin zum laufen zu bringen.
Es hängt an einem ArduinoUnoSMD mit folgendem Sketch:
Code:
#include <Wire.h>
#define I2ADDR 0×30
#define TakeMeasure 0×01
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("Start Programm");
Wire.beginTransmission(0x30);
Wire.write(0x00);
Wire.write(0x02);
delay(10);
Wire.write(0x04);
delay(10);
}
void loop(){
byte MsbX,LsbX,MsbY,LsbY;
int x,y;
char line[80];
Wire.beginTransmission(0x30); // Pollin HDMM01
Wire.write(0x00);
Wire.write(0x01);
Wire.endTransmission();
delay(20);
Wire.beginTransmission(0x30);
Wire.write(0x01);
Wire.requestFrom(0x30, 4);
while(Wire.available()<4);
MsbX =Wire.read(); // obere 4 Bit X
LsbX =Wire.read(); // untere 8 Bit X
MsbY =Wire.read(); // obere 4 Bit Y
LsbY =Wire.read(); // untere 8 Bit Y
Wire.endTransmission(); // stop transmitting
x=((MsbX&0x0f)*256)+(LsbX);
y=((MsbY&0x0f)*256)+(LsbY);
// Ausgabe von X, Y
Serial.print("KOM:");
Serial.print(x);
Serial.print(";");
Serial.println(y);
delay(500);
}
Es werden auch Werte ausgegeben. Allerding kann ich den Kompass drehen und wenden wie ich will, die Werte verändern sich kaum (2080-2099;2050-2070).
Kann mir da jemand weiterhelfen?
vg malte
-
Vielleicht kannst du aus dieser Library etwas gebrauchen.
Auf jeden Fall müssen die Rohwerte erst skaliert werden (siehe Funktion normalizeHDMM01!), bevor man damit weiter rechnen kann.
-
Skalieren hieße beim Arduino dann:
Code:
x = map(x,x_min,x_max,-180,180);
y = map(y,y_min,y_max,-180,180);
???
vg Malte
-
Nein, die Werte sollen nicht auf +-180 begrenzt werden.
Schau dir die oben genannte Funktion mal in der Source Datei an,- die kann man sicher auf den Arduino portieren.
Davor im Absatz zum Configuration Header stehen die Kalibrierungswerte im Bereich "// MMC2120MG magnetometer calibration data:". Diese Werte brauchst du auch als Konstanten.
Wie man diese Werte findet (d.h. den Sensor kalibriert), wird in dem Configuration Header Absatz ab dem Satz "Wenn der 2D-Compass (HDMM01) benutzt wird, muss man zunächst den Sensor kalibrieren." beschrieben. Die kalibrierten Werte werden dann für die Skalierung benutzt.
-
Ja aber map begrenzt die Werte doch nicht nur, oder?
Laut arduino.cc wird bei:
Code:
map(input,in_min,in_max,out_min,out_max);
ein input, der zwischen in_min und in_max liegt so skaliert, dass er werte zwischen out_min und out_max annimmt.
vg Malte