Dass ich ein Problem habe und so kann ich mir inzwischen ja schon sparen.
Also: Ich habe mir letztens aus dem Land der hochwertigen Produkte, China, mir eine handvoll Elektrobauteile zukommen lassen, darunter auch ein paar HMC5883L-Kompass-3-Achsen-Module. Da ich eine Datenblattophobie besitze, habe ich mir also den ersten Google-Treffer von "hmc5883l library" (Hier)runtergeladen, zu meinen Libraries hinzugefügt und das Beispiel "HMC5883_simple" auf meinen verkabelten Uno gezogen. Beim öffnen des seriellen Monitors begrüßte mich der Arduino freundlich mit der Tatsache, dass er keinen Kompass finden kann. Das war beim ersten Mal nicht verwunderlich, da bei mir fast noch nie etwas am Anfang funktioniert hat, manchmal nicht mal die idiotensicheren Beispiele trotz richtiger Verkabelung, aber 5 Verkabelungschecks, 1 Datenblattbilck (!) und ein weiteres zusammengelötetes Modul später fand ich das nicht mehr so lustig.
Liegt es einfach daran, dass der Kram aus dem Land der hochwertigen Produkte kommt, oder habe ich mal wieder was danebengehen lassen, gibt es vielleicht bei dem Modul eine Tendenz zu Problemen?
Da du ja schon öfter hier mit Problemen aufgeschlagen bist, solltest du eigentlich Wissen, das man zu den geschilderten Problemen auch Informationen liefert.
Wie wäre es mit dem Sketch, dem aktuellen Schaltbild oder/und ein gutes Foto deines Aufbaus ?
Ich habe eben einfach gegooglet und das bekommen. Und da es zig mal abgebaut und wieder aufgebaut worden ist, kann da einfach kein Fehler bei mir sein. Der Sketch ist das Beispiel hmc5883l_simple von dieser Library, kann ich bei Bedarf morgen hier vollständig posten, müsste dazu an meinen eigenen WinXp-Rechner rüberrennen.
es scheint sich ja um einen I2c Bus zu handeln, da solltest Du mal die Adresse scannen die auf dem Ding eingestellt ist.Dazu gibts einen Sketch der die Adresse ermittelt.
Das Ding hat laut Datenblatt die Adresse 0x3C, der Sketch scheint schon irgendwie entweder das zu wissen oder er ermittelt das irgendwie, hier ist er übrigens:
/*
HMC5883L Triple Axis Digital Compass. Simple Example.
Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html
GIT: https://github.com/jarzebski/Arduino-HMC5883L
Web: http://www.jarzebski.pl
(c) 2014 by Korneliusz Jarzebski
*/
#include <Wire.h>
#include <HMC5883L.h>
HMC5883L compass;
void setup()
{
Serial.begin(9600);
// Initialize HMC5883L
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
delay(500);
}
// Set measurement range
// +/- 0.88 Ga: HMC5883L_RANGE_0_88GA
// +/- 1.30 Ga: HMC5883L_RANGE_1_3GA (default)
// +/- 1.90 Ga: HMC5883L_RANGE_1_9GA
// +/- 2.50 Ga: HMC5883L_RANGE_2_5GA
// +/- 4.00 Ga: HMC5883L_RANGE_4GA
// +/- 4.70 Ga: HMC5883L_RANGE_4_7GA
// +/- 5.60 Ga: HMC5883L_RANGE_5_6GA
// +/- 8.10 Ga: HMC5883L_RANGE_8_1GA
compass.setRange(HMC5883L_RANGE_1_3GA);
// Set measurement mode
// Idle mode: HMC5883L_IDLE
// Single-Measurement: HMC5883L_SINGLE
// Continuous-Measurement: HMC5883L_CONTINOUS (default)
compass.setMeasurementMode(HMC5883L_CONTINOUS);
// Set data rate
// 0.75Hz: HMC5883L_DATARATE_0_75HZ
// 1.50Hz: HMC5883L_DATARATE_1_5HZ
// 3.00Hz: HMC5883L_DATARATE_3HZ
// 7.50Hz: HMC5883L_DATARATE_7_50HZ
// 15.00Hz: HMC5883L_DATARATE_15HZ (default)
// 30.00Hz: HMC5883L_DATARATE_30HZ
// 75.00Hz: HMC5883L_DATARATE_75HZ
compass.setDataRate(HMC5883L_DATARATE_15HZ);
// Set number of samples averaged
// 1 sample: HMC5883L_SAMPLES_1 (default)
// 2 samples: HMC5883L_SAMPLES_2
// 4 samples: HMC5883L_SAMPLES_4
// 8 samples: HMC5883L_SAMPLES_8
compass.setSamples(HMC5883L_SAMPLES_1);
// Check settings
checkSettings();
}
void checkSettings()
{
Serial.print("Selected range: ");
switch (compass.getRange())
{
case HMC5883L_RANGE_0_88GA: Serial.println("0.88 Ga"); break;
case HMC5883L_RANGE_1_3GA: Serial.println("1.3 Ga"); break;
case HMC5883L_RANGE_1_9GA: Serial.println("1.9 Ga"); break;
case HMC5883L_RANGE_2_5GA: Serial.println("2.5 Ga"); break;
case HMC5883L_RANGE_4GA: Serial.println("4 Ga"); break;
case HMC5883L_RANGE_4_7GA: Serial.println("4.7 Ga"); break;
case HMC5883L_RANGE_5_6GA: Serial.println("5.6 Ga"); break;
case HMC5883L_RANGE_8_1GA: Serial.println("8.1 Ga"); break;
default: Serial.println("Bad range!");
}
Serial.print("Selected Measurement Mode: ");
switch (compass.getMeasurementMode())
{
case HMC5883L_IDLE: Serial.println("Idle mode"); break;
case HMC5883L_SINGLE: Serial.println("Single-Measurement"); break;
case HMC5883L_CONTINOUS: Serial.println("Continuous-Measurement"); break;
default: Serial.println("Bad mode!");
}
Serial.print("Selected Data Rate: ");
switch (compass.getDataRate())
{
case HMC5883L_DATARATE_0_75_HZ: Serial.println("0.75 Hz"); break;
case HMC5883L_DATARATE_1_5HZ: Serial.println("1.5 Hz"); break;
case HMC5883L_DATARATE_3HZ: Serial.println("3 Hz"); break;
case HMC5883L_DATARATE_7_5HZ: Serial.println("7.5 Hz"); break;
case HMC5883L_DATARATE_15HZ: Serial.println("15 Hz"); break;
case HMC5883L_DATARATE_30HZ: Serial.println("30 Hz"); break;
case HMC5883L_DATARATE_75HZ: Serial.println("75 Hz"); break;
default: Serial.println("Bad data rate!");
}
Serial.print("Selected number of samples: ");
switch (compass.getSamples())
{
case HMC5883L_SAMPLES_1: Serial.println("1"); break;
case HMC5883L_SAMPLES_2: Serial.println("2"); break;
case HMC5883L_SAMPLES_4: Serial.println("4"); break;
case HMC5883L_SAMPLES_8: Serial.println("8"); break;
default: Serial.println("Bad number of samples!");
}
}
void loop()
{
Vector raw = compass.readRaw();
Vector norm = compass.readNormalize();
Serial.print(" Xraw = ");
Serial.print(raw.XAxis);
Serial.print(" Yraw = ");
Serial.print(raw.YAxis);
Serial.print(" Zraw = ");
Serial.print(raw.ZAxis);
Serial.print(" Xnorm = ");
Serial.print(norm.XAxis);
Serial.print(" Ynorm = ");
Serial.print(norm.YAxis);
Serial.print(" ZNorm = ");
Serial.print(norm.ZAxis);
Serial.println();
delay(100);
}
Okay, jetzt habe ich's raus: Die Adresse ist nicht, wie laut Datenblatt, 0x3C, sondern 0x0D. Trifft sich gut und schlecht, gut, weil die Adresse dann doch nicht mit der Gleichen meines I2C-Bildschirms Probleme bekommt, schlecht, weil dadurch wohl der Fehler entstanden ist. Vielleicht ist gleich das Problem gelöst ...
Ja, das stimmt. Es ist schon die halbe Arbeit, aber erst die halbe Arbeit.
So, jetzt habe ich lange die Tastertur beackert, versucht, die Adresse in der Library zu verändern, es kam immer nur ein Fehler. Dann habe ich einen Sketch programmiert, der alle Veränderungen im wie ein EEPROM funktionierenden Modul auflistet, es kam irgendwas, wenn ich den Kompass rauszog, sonst nichts.
HTML-Fan:
Ja, das stimmt. Es ist schon die halbe Arbeit, aber erst die halbe Arbeit.
So, jetzt habe ich lange die Tastertur beackert, versucht, die Adresse in der Library zu verändern, es kam immer nur ein Fehler. Dann habe ich einen Sketch programmiert, der alle Veränderungen im wie ein EEPROM funktionierenden Modul auflistet, es kam irgendwas, wenn ich den Kompass rauszog, sonst nichts.
Kannst du das auch besser beschreiben ?
Was genau hast du geändert ?
Was hast du programmiert und was hat das mit dem EEProm zu tun ?
HTML-Fan:
Ich habe diese Adresse auf 0x0D verändert - ohne Erfolg. Auf die Idee, dass da irgendwas fest in der Lib steht, bin ich auch schon gekommen.
Warum beschreibst du dein Getue nicht mal besser, wie schon in Post #10 gefragt.
Dann können wir evtl. auch mal nachvollziehen, was für komische Dinge du da machst.
Also: Ich habe in der Kompass-Library die definierte Adresse 0x1E auf 0x0D abgeändert. Dann habe ich den Beispiel-Sketch draufgeladen und wieder die Nachricht bekommen, dass kein Kompass gefunden wurde.
Das Geraet ist besimmt ein QMC5883L, aber es gibt leider zwei Versionen. Version 'A' mit "DA 5883L" darauf geschrieben und 'B' mit "DB 5883L". Diese zwei Geraete sind jedoch total anders mit verschiedene Registers.
Version 'B' hat die I2C Adresse 0x0D und funktioniert wie das QMC5883L Datenblatt.
Version 'A' ist voellig undokumentiert. Es hat die I2C Adresse 0x1E und funktioniert wie den HMC5883L, aber das Statusregister funktioniert nicht. Deshalb ist es nicht moeglich die HMC5883L Bibliothek zu benutzen. Obwohl es glücklicherweise noch moeglich ist, die X, Y, Z Datenregisters ohne Statusregsiter zu lesen.