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.
Hallo zusammen, ich versuch derzeit mein neues HDMM01 von Pollin zum laufen zu bringen.
Es hängt an einem ArduinoUnoSMD mit folgendem Sketch:
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).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); }
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.
Gruß
Dirk
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.
Gruß
Dirk
Ja aber map begrenzt die Werte doch nicht nur, oder?
Laut arduino.cc wird bei:
ein input, der zwischen in_min und in_max liegt so skaliert, dass er werte zwischen out_min und out_max annimmt.Code:map(input,in_min,in_max,out_min,out_max);
vg Malte
Lesezeichen