PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HDMM01 Problem



Artemis_Simetra
01.12.2013, 22:10
Hallo zusammen, ich versuch derzeit mein neues HDMM01 von Pollin zum laufen zu bringen.
Es hängt an einem ArduinoUnoSMD mit folgendem Sketch:


#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

Dirk
01.12.2013, 22:54
Vielleicht kannst du aus dieser (http://www.rn-wissen.de/index.php/RP6_Multi_IO_Projekt_-_Software#Library_f.C3.BCr_die_Orientierung_im_Rau m) Library etwas gebrauchen.
Auf jeden Fall müssen die Rohwerte erst skaliert werden (siehe Funktion normalizeHDMM01!), bevor man damit weiter rechnen kann.

Artemis_Simetra
02.12.2013, 17:34
Skalieren hieße beim Arduino dann:


x = map(x,x_min,x_max,-180,180);
y = map(y,y_min,y_max,-180,180);

???
vg Malte

Dirk
02.12.2013, 20:11
Nein, die Werte sollen nicht auf +-180 begrenzt werden.

Schau dir die oben genannte Funktion mal in der Source Datei (http://www.rn-wissen.de/index.php/RP6_Multi_IO_Projekt_-_Software#Library_Source_4) an,- die kann man sicher auf den Arduino portieren.

Davor im Absatz zum Configuration Header (http://www.rn-wissen.de/index.php/RP6_Multi_IO_Projekt_-_Software#Configuration_Header_2) 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.

Artemis_Simetra
06.12.2013, 13:19
Ja aber map begrenzt die Werte doch nicht nur, oder?
Laut arduino.cc wird bei:

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