AU.ROB Menü

6. Nov. 2011

Heute wird das Kompass Modul HDMM01 von Pollin verbaut. Viel gibt es zu dem Modul nicht zu sagen. Angeschlossen wird VCC, GND, SCL (Clock) und SLD (Data). Das Kompassmodul gibt zwei Werte zurück – jede Achse misst eine Komponente des Magnetfeldvektors (sagen wir mal x und y dazu).

Mit dem unten gelisteten Programm lese ich die Daten aus dem Kompass Modul aus.

In Excel dargestellt sieht eine (sehr ungenaue) Drehung nach link und daraufvolgende Drehung nach rechts wie folgt aus.

Rechnet man die Ergebnisse entsprechend um, bekommt man x/y Punkte (siehe Bild Nr.2) welche man dann ganz einfach in einen Winkel umrechnen kann – das ist alles.

Die hieraus resultierenden Daten verwende ich für die Darstellung meiner Kompassnadel.

Noch eine kleine Anmerung – je nachdem ob
x = positiv oder neagtiv
y = positiv oder negativ

-> abhängig davon ist dann klar in welchen Quadranten ich mich bewege.

#include <Wire.h>

#define  I2ADDR       0×30
#define  TakeMeasure  0×01
void setup(){
Wire.begin();
Serial.begin(9600);
Serial.println(“Start Programm”);
}
void loop(){
byte MsbX,LsbX,MsbY,LsbY;
int x,y;
char line[80];
Wire.beginTransmission(I2ADDR); // Pollin HDMM01
Wire.send(0×00);   // Adressfeld ist hier nicht wichtig
Wire.send(TakeMeasure);
Wire.endTransmission();
delay(20);
Wire.beginTransmission(I2ADDR);
Wire.send(0×01);
Wire.requestFrom(I2ADDR, 4);

while(Wire.available()<4);
MsbX  =Wire.receive();          // obere  4 Bit X
LsbX  =Wire.receive();          // untere 8 Bit X
MsbY  =Wire.receive();          // obere  4 Bit Y
LsbY  =Wire.receive();          // untere 8 Bit Y
Wire.endTransmission();         // stop transmitting
x=((MsbX&0x0f)*256)+(LsbX);
y=((MsbY&0x0f)*256)+(LsbY);
x = map(x, 1900, 2188, -180, 180);
y = map(y, 1910, 2193, -180, 180);
double mygrad = atan2(x, y)*180/3.1415927410;
if (mygrad < 0)    mygrad = mygrad +360;
// Ausgabe von X, Y und Grad
Serial.print(“KOM:”);
Serial.print(x);
Serial.print(“;”);
Serial.print(y);
Serial.print(“;”);
Serial.println(mygrad);
delay(200);
}

7 Kommentare »

  1. Neumi schreibt:

    Also ich hab bisher keinen Plan von i2c gehabt und hab seit Monaten versucht meinen HDMM01 Sensor zum laufen zu bekommen und jetzt hab ich endlich diese Website gefunden und bin unsagbar dankbar, dass du mir helfen konntest! DANKE!
    Ich hatte dennoch einige Probleme den Code zu verwenden … auf deiner Website sind einige Zeichen nicht so angezeigt wie in der Arduino IDE und nur durch viel Ausprobieren hab ich es jetzt geschafft! Vielleicht solltest du so ein “Codefester” wie in den Arduino Foren benutzen, damit alle was davon haben und die Codes so herauskopieren können! Mit überglücklichen Grüßen Neumi :-)

    Hier nochmal dein Code in einer “Arduino IDE lesbaren Fassung”:

    #include

    #define I2ADDR 0×30
    #define TakeMeasure 0×01

    void setup(){
    Wire.begin();
    Serial.begin(9600);
    Serial.println(“Start Programm”);
    }
    void loop(){
    byte MsbX,LsbX,MsbY,LsbY;
    int x,y;
    char line[80];
    Wire.beginTransmission(0×30); // Pollin HDMM01
    Wire.send(0×00);
    Wire.send(0×01);
    Wire.endTransmission();
    delay(20);
    Wire.beginTransmission(0×30);
    Wire.send(0×01);
    Wire.requestFrom(0×30, 4);

    while(Wire.available()<4);
    MsbX =Wire.receive(); // obere 4 Bit X
    LsbX =Wire.receive(); // untere 8 Bit X
    MsbY =Wire.receive(); // obere 4 Bit Y
    LsbY =Wire.receive(); // untere 8 Bit Y
    Wire.endTransmission(); // stop transmitting
    x=((MsbX&0x0f)*256)+(LsbX);
    y=((MsbY&0x0f)*256)+(LsbY);
    x = map(x, 1900, 2188, -180, 180);
    y = map(y, 1910, 2193, -180, 180);
    double mygrad = atan2(x, y)*180/3.1415927410;
    if (mygrad < 0) mygrad = mygrad +360;
    // Ausgabe von X, Y und Grad
    Serial.print("KOM:");
    Serial.print(x);
    Serial.print(";");
    Serial.print(y);
    Serial.print(";");
    Serial.println(mygrad);
    delay(200);
    }

    9. Apr. 2012 | #

  2. admin schreibt:

    Hello Neumi!
    Sorry, bin länger nicht dazugekommen … aber jetzt ;)
    Danke mal für Deine Antwort und den Code. Bzgl. Codeanzeige muss ich Dir recht geben – das ist bei weitem nicht optimal – werd mich mal auf die Suche machen da was besseres zu finden.

    Was mich interessieren würde – setzt Du den Kompass auf einem bewegtem Teil (Roboter, …) ein oder ist der Kompass stationär?

    Ich hatte das Problem der Justierung – immer wenn der Kompass in Bewegung war/ist war eigentlich vor einer Neumessung eine Justierung nötig (um den Nullpunkt zu finden).

    9. Mai. 2012 | #

  3. Wolfgang schreibt:

    Moin Moin,

    beschäftige mich auch mit dem Kompas und war auch froh diese Seite zu finden.

    Im neuen Code von Neumi fehlt in der ersten Zeile nach dem include :

    Nach all den Versuchen werde ich letztendlich wohl einen anderen Kompas nehmen, billig ist nicht immer gut!

    Viele Grüße
    Wolfgang

    10. Mai. 2012 | #

  4. Wolfgang schreibt:

    ups das scheint so das wire.h hinter include wird vom HTML interpreter geklaut!

    10. Mai. 2012 | #

  5. admin schreibt:

    Hab den Kompass auch nicht mehr im Einsatz – bin einfach mit der Nullstellung nicht zurechtgekommen. Hab jetzt den ein wenig teureren CMPS10 im Einsatz und bin vollauf zufrieden!

    15. Mai. 2012 | #

  6. FrankWL schreibt:

    Vielen Dank für den Code.
    Habe die Zeilen von Neumi übernommen und nach Arduino 1.0.2 portiert.
    Seit Arduino 1.0 hatte sich scheinbar die Lib geändert.
    Wire.send wird jetzt zu Wire.write
    Wire.receive wird jetzt zu Wire.read
    Wo ich am meinsten gepuzzled habe war allerdrings ein banaler Kopierfehler.
    In den Code übernommen wurden die Hex-Zahlen als 0× abgebildet.
    (Das x ist leicht hochgerückt dargestellt )
    Fehlermeldung vom Compiler: …error: stray ‘\’ in program….
    Nachdem ich die dann alle durch ein neu getipptes 0x ersetzt hatte, liess sich der Code auch gleich auf anhieb kompilieren.
    Übrigens ist auf dem mir von Pollin vorliegenden Datenblatt die Basisadresse mit 60 hex an gegeben. 0×60 läufft bloss nicht. Die hier verwendete 0×30 ist schon richtig.

    Viele Grüße
    Frank

    25. Dez. 2012 | #

  7. AJG059 schreibt:

    Hallo Zusammen,
    habe auch lange gebraucht bis ich die Fehler draussen hatte. Bei mir soll der Kompass die Windrichtung einer Wetterstation anzeigen, dafür ist die Genauigkeit gut genug. Mit dem Datenblatt von Pollin konnte ich es nicht zum laufen bringen. Die angegebene Adresse 60 stimmte halt nicht.

    TakeMeasure kann man raus schmeissen, anbei nochmal der code und die Ausgabe.

    Gruß Andreas

    #include

    #define I2ADDR 0×30

    void setup(){
    Wire.begin();
    Serial.begin(9600);
    Serial.println(“Start Programm”);
    }
    void loop(){
    byte MsbX,LsbX,MsbY,LsbY;
    int x,y;
    char line[80];
    Wire.beginTransmission(0×30); // Pollin HDMM01
    Wire.write(0×00);
    Wire.write(0×01);
    Wire.endTransmission();
    delay(20);
    Wire.beginTransmission(0×30);
    Wire.write(0×01);
    Wire.requestFrom(0×30, 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);
    x = map(x, 1900, 2188, -180, 180);
    y = map(y, 1910, 2193, -180, 180);
    double mygrad = atan2(x, y)*180/3.1415927410;
    if (mygrad < 0) mygrad = mygrad +360;
    // Ausgabe von X, Y und Grad
    Serial.print("KOM:");
    Serial.print(x);
    Serial.print(";");
    Serial.print(y);
    Serial.print(";");
    Serial.println(mygrad);
    delay(200);
    }

    .
    .
    .
    KOM:43;-238;169.76
    KOM:92;-178;152.67
    KOM:122;-74;121.24
    KOM:90;8;84.92
    KOM:-4;70;356.73
    KOM:33;34;44.14
    KOM:63;-52;129.54
    KOM:16;-153;174.03
    KOM:11;-178;176.46
    KOM:108;-25;103.03
    KOM:-29;162;349.85
    KOM:-110;237;335.10
    KOM:-164;237;325.32
    KOM:-163;239;325.71
    KOM:-164;238;325.43
    KOM:-165;238;325.27
    KOM:-167;237;324.83
    KOM:-168;235;324.44
    KOM:-169;234;324.16
    KOM:-168;233;324.21
    KOM:-168;234;324.32
    KOM:-168;235;324.44
    KOM:-168;235;324.44
    .
    .
    .

    13. Feb. 2013 | #

Kommentar schreiben

RSS-Feed für diese Kommentare. | TrackBack URI

Letzte Kommentare

Links

Letzte Artikel

Roboternetz.de

Copyright © Roboternetz.de - Alle Rechte vorbehalten.

Archive