QMC5883L - wo habe ich den Knopf?

Moin. Ich habe erst mit Arduino begonnen ... muss meine alten grauen bewegen.
Ich will den Azimut und die Elevation mit dem QMC5883L bekommen. (bin ca bei (27° 45' 15'' N) (18° 2' 0'' W)
Nach Tagen kennen lernen des QMC5883L (mit dem studieren des RICHTIGEN) Datenblattes dann dieses Ergebnis bekommen (siehe Bild).

Die Daten scheinen zu stimmen (es zeigt nach Nord und senkrecht ist es auch) - das Shield.
Doch kippe ich es gegen rechts - müsste ja die Richtung bleiben und der Azimut gegen 0 sein....macht es aber nicht,
komme auf ca Az 300° und Elevation 39°
Ergo - das Board steht und -X zeigt nach Norden dann stimmt es sehr gut. Alles andere gibt unkorrekte Werte. Oder mach ich was mit der Berechnung falsch ? (Trigo war vor 50 Yrs bei mir ..hmm schon was vergessen).
TNX für nen Tip. Erich

Code:
float azimut=atan2(y,x)180/PI - 180;
azimut = abs(azimut);
//.................
elevation= atan2((double)-y,(double)z) + elevation_korrektur ;
elevation= elevation
(180/PI);
elevation = elevation -90;
if ( elevation < 0 ) {
elevation = elevation + 360;
}

//....................
Rohdaten:
X: -593 Y: -137 Z: -1137 Azimuth°: 346.99 Elevation°: 83.13
X: -576 Y: -126 Z: -1145 Azimuth°: 347.66 Elevation°: 83.72
X: -588 Y: -113 Z: -1150 Azimuth°: 349.12 Elevation°: 84.39
X: -583 Y: -118 Z: -1118 Azimuth°: 348.56 Elevation°: 83.97
X: -588 Y: -118 Z: -1150 Azimuth°: 348.65 Elevation°: 84.14
X: -576 Y: -108 Z: -1142 Azimuth°: 349.38 Elevation°: 84.60
X: -596 Y: -123 Z: -1150 Azimuth°: 348.34 Elevation°: 83.90
X: -593 Y: -118 Z: -1150 Azimuth°: 348.75 Elevation°: 84.14
X: -593 Y: -118 Z: -1123 Azimuth°: 348.75 Elevation°: 84.00
X: -596 Y: -116 Z: -1152 Azimuth°: 348.99 Elevation°: 84.25
X: -583 Y: -123 Z: -1147 Azimuth°: 348.09 Elevation°: 83.88

Hier mal das Bild sichtbar: :slight_smile:

hb9fih:
Doch kippe ich es gegen rechts - müsste ja die Richtung bleiben und der Azimut gegen 0 sein...

Hallo,

Die auf der Platine aufgezeichnete X-Achse, zeigt bei Dir nach Süden. Ist das Absicht? Den so rechnest Du mit X- <- Am Display steht ja die Erklärung! :slight_smile:
Etwas später werde ich das mal 'Nachbauen' (sind ja nur 4 Kabeln) und Deine Werte vergleichen.

Ich habe mir mit dem HMC5883L einmal einen digitalen Kompass gebaut. Aber die Z-Achse wird hier aussen vor gelassen, wenn ich den Kompass Kippen/Aufstelle bekomme ich deswegen auch 'komische' Werte. Hier die Berrechnung:

// heading ist der Kurs
float heading = atan2(event.magnetic.y, event.magnetic.x);
 
float declinationAngle = 0.22;
heading += declinationAngle;
  
if(heading < 0)
  heading += 2*PI;
    
if(heading > 2*PI)
  heading -= 2*PI;
 
headingDegrees = heading * 180/M_PI;

M_PI ist Vordefiniert. Zum Vergleich:
M_PI = 3.141592653589793238462643
PI = 3.1415926535897932384626433832795

lg dony
edit

Ich poste hier mal meinen Code
Hatte gestern Nacht nochmals die Richtung Nord (den Polarstern) kontrolliert.

Ich bemerke auch dass sich die "korrekten" erst nach paar Messungen stabilisieren.
Gemäss Internet Recherchen soll das Magnetfeld hier auf El Hierro besonders ruhig sein - aber ob das stimmt (?). (traue keiner Statistik die du nicht selbst gefälscht hast)

Mit der Berechnung von Dony bin ich noch nicht auf nen grünen Zweig gekommen.
Aber danke und ich denke weiter..

#include <Wire.h> //I2C Arduino Library
#include <math.h>
#include <LiquidCrystal_I2C.h>

#define SensAdr 0x0D   // Adresse für den QMC5883L  
LiquidCrystal_I2C lcd(0x27, 16, 2);

double azimut, elevation;

void setup() {

  Serial.begin(9600);
  Wire.begin();

  lcd.begin();
  lcd.backlight();

  Wire.beginTransmission(SensAdr); //start talking
  Wire.write(0x0B);      // set register
  Wire.write(0x01);      // set contunous
  Wire.endTransmission();
  
  Wire.beginTransmission(SensAdr); //start talking
  Wire.write(0x09); // Reg 09 Configuration
  Wire.write(0x1D); // Set the Register 1101
  Wire.endTransmission();
}

// Deklination in rad for your location (let 0 for world)
float Missweisung = 0  ; 
float elevation_korrektur = 0 ;

void loop() {

  int x, y, z; //triple axis data

  //Tell the HMC what regist to begin writing data into

  Wire.beginTransmission(SensAdr);
  Wire.write(0x00); // Start Register
  Wire.endTransmission();

delay(100);   // Nach Set ... beruhigen lassen

  // lese 3 * 2 Bytes 
  Wire.requestFrom(SensAdr, 6);
  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
  }

  // Azimuth
  // If compass module lies flat on the ground with no tilt,
  // just x and y are needed for calculation
float azimut=atan2(y,x)*180/PI - 180;
  azimut = abs(azimut);

  // Elevation
   elevation= atan2((double)-y,(double)z) + elevation_korrektur ;
   elevation= elevation*(180/PI);
   elevation = elevation -90;  
   if ( elevation < 0 ) {
      elevation = elevation + 360;
       }
   if ( elevation > 90 ) {
      elevation = 180 - elevation;
       }    

// Ausgabe auf Console
  Serial.print("  X: ");
  Serial.print(x);
  Serial.print("  Y: ");
  Serial.print(y);
  Serial.print("  Z: ");
  Serial.print(z);
  Serial.print("  Azimuth°: ");
  Serial.print(azimut); 
  Serial.print("  Elevation°: ");
  Serial.print(elevation);  
  Serial.println();

// Ausgabe auf LCD
  lcd.clear();
  lcd.print("Az: ");
  lcd.print(azimut);
  lcd.setCursor(0, 1);
  lcd.print("El: ");
  lcd.print(elevation);

  
// Warten für nächste Messung
  delay(1000);
}

Hallo nochmal,

Der Azimut ist der Horizentalwinkel, beginnend beim Süden!?
Ein Foto meines Kompass.
digital_compass.jpg
Das Servo Horn zeigt immer nach Norden, wenn der Nordpol in Reichweite ist, sonst leuchtet eine LED die anzeigt, dass der Aufbau gedreht werden muss.

Die Variable headingDegress ist der Winkel den der Servo Motor (abgesehen vom 180° Problem) braucht damit er zum Nordpol zeigt. Ausgegangen vom IC bzw. den Aufdruck auf der Platine. Wenn ich den Aufbau zum Nordpol drehe, zeigt das Servo Horn in einer Linie mit der X-Achse zum Nordpol. (= headingDegress = 0)

Ich verstehe zu wenig von Astronomie aber ist dann nicht meine headingDegress Variable + 180° der Azimut?

Ich kann Dir aus Erfahrung sagen, beim Kippen des Sensors ändern sich alle (x,y,z) Werte. Das Ergibt eigentlich auch Sinn, in meinem Beispiel, liegt der Sensor, wenn ich ihn Aufstelle, muss ich im Prinzip mit der Z-Achse anstelle der Y-Achse rechnen. Den die Referenz verlagert sich.

float heading = atan2(event.magnetic.x, event.magnetic.z);

Natürlich kann man das nicht so einfach sagen, ich bin leider auch kein Astronom.

lg dony
edit: Ich werde es heute nicht mehr schaffen, Dein Sketch wie versprochen zu testen, aber das hol ich noch nach. :wink:

digital_compass.jpg

Danke Dony für Deine Mühen...

Hatte heute wenig Zeit doch gedreht habe ich das - nun zeigt die X auch in Richtung Norden..
Wenn das Ding schön senkrecht steht stimmt alles SUPER.
Ich weiss dass sich dann alle Werte ändern, das Magnetfeld ist ja auch nicht homogen.
Es ist übrigens sehr empfindlich. Habe noch meinen Tranceiver (Amateurfunk) auf dem Tisch
Und wenn das Mikrofon in die Nähe kommt ab ca 30cm dann läuft der Kompass schon davon.
Heute um Mitternach beginnt ein Contest den ich bis Sonntag mitmache. Also bin dann sehr wenig am Arduino, wenn überhaupt.

20180209_202539-800.jpg

20180209_202539-800.jpg

Hallo,

hb9fih:
Heute um Mitternach beginnt ein Contest den ich bis Sonntag mitmache. Also bin dann sehr wenig am Arduino, wenn überhaupt.

Ich bin leider auch erst jetzt dazugekommen. Und ich habe leider nur einen HMC5883L gefunden, ich glaub der QMC ist damals kapput gegangen. Leider konnte ich so Dein Sketch nicht testen. Ich werd es noch anpassen aber wie gesagt, leider ein MHC5883L.

Ich hab das Beispiel der lib erst mal hergenommen.
Es ist im Grunde wie ich es mir dacht.
Beim Aufstellen (von liegend) ändert sich die X- und Z-Achse. Die Y-Achse bleibt wie sie ist.

Was die Berechnungen angeht, ich bin kein Astronom.

Vielleicht kannst Du Deine Frage/Bitte bitte präzisieren.
Soll ich Dein Sketch mit meiner Hardware testen?
Warum ändert sich der Wert beim aufstellen? < Das habe ich bereits 'versucht' zu beantworten.

Sorry, steht ja im Start Post:

Die Daten scheinen zu stimmen (es zeigt nach Nord und senkrecht ist es auch) - das Shield.
Doch kippe ich es gegen rechts - müsste ja die Richtung bleiben und der Azimut gegen 0 sein....macht es aber nicht,
komme auf ca Az 300° und Elevation 39°
Ergo - das Board steht und -X zeigt nach Norden dann stimmt es sehr gut. Alles andere gibt unkorrekte Werte. Oder mach ich was mit der Berechnung falsch ? (Trigo war vor 50 Yrs bei mir ..hmm schon was vergessen).

IMHO: Was die Berechnungen angeht, solltest Du vielleicht besser in einem Astronomie Forum oder so Fragen.
Wenn Du mir eine Formel und ein Sketch gibts, könnte ich (bis zu einem gewissen Grad) schauen ob das Sketch auch so rechnet wie in der Formel.

Ich wunder mich über die Z-Achse (-1147), egal was ich mache, ich komme nicht mal in die Nähe. Aber ich habe leider einen HMC5883L nicht QMC5883L verwenden müssen. War mir sicher, das ich einen habe aber dem ist nicht so. :slightly_frowning_face:
Verwende doch eine Library, die erledigt die Sensor Abfragen für Dich. Damit schließt Du evtl. Fehlerquellen auf. Versteh mich nicht falsch, nur mit Wire zu arbeiten ist schon eine Herausvorderung mehr. :wink:

So wie ich das sehe, wir bei den Formeln die Du verwendest (Azimut) nur die X- und Y-Achse berücksichtigt. Kippst Du den Sensor, verändern sich allerdings die Werte, natürlich könnte man mit einer Berechnung welche, die Z-Achse berücksichtigt, dieses Problem vermeiden. Mein Kompass funktioniert nur liegend UND keine Magnete in der Nähe. Die sind sehr sensiebel.

lg dony
edit

Danke Dony für Deine Forschungen.

Ich habe das richtige Datenblatt.
Der QMC5883L hat den wesentlichen Unterschied der anderen I2C Adresse:

"The default I2C address is 0D: 0001101"

Ansonsten (Register etc sind dasselbe) (Auszug aus dem Datenblatt)

Das mit dem Wire ist schon richtig, das habe ich im Griff (hatte mal Assembler programmiert mit 8085 und Z80 - sogar noch Lochstreifen und Karten, so sind mir die Bits binär oder in HEX geläufig).

Das Problem ist in der Zwischenzeit bei mir "nur" noch dass die Änderung einer Achse zB kippen, auch die anderen Achsen beeinflusst, theoretisch eigentlich nicht ganz logisch aber begreiflich. Denn es ist ein Magnetometer das den Fluss misst und nichts weiter kompensiert.
Aber ich studiere mal die Original QMC Library dazu ob die was drin hat.

Jedenfalls Du brauchst nicht weiter zu forschen, spare Deine Zeit für Deine Projekte - ich bin ja in Pension und "habe Zeit" :wink:

Ich melde dies dann wieder wenn sich Erfolg einstellt.

Für mein Projekt habe ich auch eine Lösung B
Nämlich die Positionen mittel Potentiometer in einen Arduino zurückmelden.
Das ist absolut genau genug, es geht nicht um 1/10° - für die Nachführung meiner Antenne ist ca 5° genau genug da die Antenne einen Öffnungswinkel von ca 20° hat.

Gute Idee mal in einem Astronomen Forum nachzuschlagen. - mach ich.
Werde dazu auch noch Kollegen fragen von der Grupo Astronomico de El Hierro .

Besten Dank und viel Erfolg mit den Arduinos
Erich

Kein Problem, interessiert mich ja auch. :wink:

Lochstreifen :wink: Ich dachte gerade an den 386er: Post

Was ich Dir noch sagen kann, der x-, y-Achsen aufdruck auf der Platine ist nicht zum Spaß da. Wenn der Sensor steht geht die Z-Achse seitlich weg, wenn er liegt, geht sie nach oben. Ich hoffe Du verstehst was ich meine. Grundsätzlich ist es möglich, das aufstellen abzufangen aber nur indem man die Z-Achse mit einbindet, anstelle eines Potis, ist die eigentlich dafür da. Natürlich ist es mit einem Poti einfacher und ein guter Plan B aber ich glaube Du schaffst das schon. Im Prinzip brauchst Du nur die richtige Formel. <- Alles auf den Azimut bezogen.

Danke, wünsche Dir noch viel Erfolg mit Deinem Projekt.
lg dony