Ich habe in Projekt, bei dem mittels 4 HMC5883L die Drehposition von
Objekten durch einen kleinen untergeklebten Magneten erfasst wird. Das
funktioniert auch hervorragend.
Nun soll das Projekt auf einen 5. Sensor erweitert werden, ich habe also
einen Sensor bestellt und musste zu meinem Ärger feststellen, dass es
sich diesmal nicht um einen HMCxxx, sondern um den QMCxxx handelt.
Reklamieren und neu bestrellen geht aber nicht, weil die Zeit extrem
knapp ist, dauert mindestens 3 Tage (Lieferung in die anhaltinische
Provinz).
Nun habe ich im Web diverse Codebeispiele gefunden, die alle nicht
funktionieren. Entweder kommen immer nur kostante Werte oder quasi
Zufallszahlen (ich benötige nur den horizontalen Winkelwert). Ausser der
Adesse (0x0D statt 0xE1) ist da noch wesentlich mehr anders ...
Hat jemand ein kleines Stückchen (Arduino-) Code für mich, der mit dem
Mistding (QMCxxx!) halbwegs stabile Werte liefert? Wenn möglich als
reine I2C-Aufruf-Abfolge, nicht "versteckt" in irgend einer Compass-Lib
(die alle nicht funktionieren) ...
Hier ist mein Code für den HMC5883L, der tut, was er soll. Ich benutze
der Reihe nach die Anschlüsse A0-A3 für SDA und immer A5 für SCL ...
1 | int get_maga(int pin)
|
2 | {
|
3 | int x,y,z; // 3 Achsen
|
4 | SoftwareI2C s;
|
5 | s.begin(pin,A5);
|
6 | s.beginTransmission(hmc_adr); // Verbindung öffnen mit dem HMC5883
|
7 | s.write(hmc_mode); // Mode Register
|
8 | s.write(hmc_cont); // Kontinuierliche Messung
|
9 | s.endTransmission();
|
10 |
|
11 | s.beginTransmission(hmc_adr); // Verbindung öffnen mit dem HMC5883
|
12 | s.write(hmc_regb); // Mode Register
|
13 | s.write(hmc_gain); // Empfindlichkeit auf 8 Gauss
|
14 | s.endTransmission();
|
15 |
|
16 | s.beginTransmission(hmc_adr);
|
17 | s.write(hmc_out); // Register 3, X MSB Register, Lesemodus
|
18 | s.endTransmission();
|
19 |
|
20 | s.requestFrom(hmc_adr, 6);
|
21 | x = s.read()<<8; x |= s.read();
|
22 | z = s.read()<<8; z |= s.read();
|
23 | y = s.read()<<8; y |= s.read();
|
24 | s.endTransmission();
|
25 | float w = atan2(-y , x) / M_PI * 180.0;
|
26 | if(w < 0){w = w + 360.0;}
|
27 | return w;
|
28 | }
|