Hallo Gemeinde,
ich versuche brauchbare Ergebnisse mit einem GY-271 Kompass-Modul am Arduino zu erzielen und habe dazu zwei Fragen.
Klicke auf die Grafik für eine größere Ansicht

Name:	GY271-1.jpg
Hits:	5
Größe:	36,4 KB
ID:	33044
Zuerst aber der Stand: Mein Modul ist offensichtlich nicht das Original, sondern ein Clone. Es reagiert auf die I2C Adresse 0x0D (normal wäre wohl 0x1E). Nach längerer Suche im Netz und ausprobieren mehrerer Scripte, habe ich jetzt zumindest eine halbwegs brauchbare Funktion gefunden.
Das Script sieht im Moment so aus:
Code:
#include <Wire.h>                           // I2C Arduino library

#define addr 0x0D                           // unusual I2C address for compass module!

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(addr);             // start talking
  Wire.write(0x0B);                         // tell the HMC5883 to continuously measure
  Wire.write(0x01);                         // set the register
  Wire.endTransmission();
  Wire.beginTransmission(addr);             
  Wire.write(0x09);                         
  Wire.write(0x1D);                         
  Wire.endTransmission();
  }

void loop() {
    
    int x, y, z;                            // triple axis data 
    Wire.beginTransmission(addr);           // tell the HMC what regist to begin writing data into
    Wire.write(0x00);                       // start with register 3.
    Wire.endTransmission();
  
    Wire.requestFrom(addr, 6);              // read the data.. 2 bytes for each axis.. 6 total bytes
    if (6 <= Wire.available())
      {
        x = Wire.read();                    // MSB x
        x |= Wire.read() << 8;              // LSB x
        z = Wire.read();                    // MSB z
        z |= Wire.read() << 8;              // LSB z
        y = Wire.read();                    // MSB y
        y |= Wire.read() << 8;              // LSB y
      }
    int angle = atan2(-y , x) / M_PI * 180; // angle is atan(-y/x)
    if(angle < 0) angle = angle  + 360;     // angle from 0 to 359 instead of plus/minus 180
    

Serial.println(angle);
delay(1000);

}
Meine erste Frage bezieht sich auf das Script, speziell die beiden farblich (rot/grün) markierten Teile. In allen anderen, von mir getesteten Scripts ist jeweils nur ein solcher Block enthalten. Hier sind es zwei, die gleich aussehen, aber verschiedenen Adressen benutzen. Ich habe versucht jeweils einen davon wegzulassen, dann funktioniert das Script nicht mehr. Die Frage ist also: Warum wird das hier zweimal gebraucht und was genau macht das?

Die zweite Frage ist bezüglich der Arbeitslage des Moduls. In diversen Tutorials sehe ich die Module immer flach auf dem Tisch liegen. In dieser Lage bringt mein Script nur Werte zwischen 68 und 133 Grad, die nichts mit der realen Richtung zu tun haben.
Nur wenn ich mein Modul senkrecht stelle, wie auf dem Foto unten, erhalte ich Werte zwischen 0 ond 360 Grad, die in etwa der realen Himmelsrichtung entsprechen. Kann das Normal sein?
Klicke auf die Grafik für eine größere Ansicht

Name:	GY271-2.jpg
Hits:	10
Größe:	44,8 KB
ID:	33045
Wenn er so senkrecht steht, sind die Werte halbwegs logisch!?

Für Ideen wäre ich sehr Dankbar.
Gruß Uwe