AU.ROB Menü

6. Nov. 2011
12. Mrz. 2012 |Bearbeiten

CMPS10 Tilt Compass ModuleNach vielen Fehlversuchen mein Kompassmodul HDMM01 vernünftige und vor allem stabile Werte zu entlocken habe ich mir eine neues Kompassmodul zugelegt. Das CMPS10 kann sowohl per I2C, Seriell als auch PWM angesprochen werden.

Ich greife auf die Daten per I2C zu – ausgelesen wird alles was zur Verfügung steht. Nachfolgend die Tabelle der Register:

Register    Function
0 Software version
1 Compass Bearing as a byte, i.e. 0-255 for a full circle
2,3 Compass Bearing as a word, i.e. 0-3599 for a full circle,
representing 0-359.9 degrees.
4 Pitch angle – signed byte giving angle
in degrees from the horizontal plane
5 Roll angle – signed byte giving angle in
degrees from the horizontal plane
6 Unused
7 Unused
8 Unused
9 Unused
10,11 Magnetometer X axis raw
output, 16 bit signed integer with register 10 being the upper 8 bits
12,13 Magnetometer Y axis raw
output, 16 bit signed integer with register 12 being the upper 8 bits
14,15 Magnetometer Z axis raw
output, 16 bit signed integer with register 14 being the upper 8 bits
16,17 Accelerometer  X axis
raw output, 16 bit signed integer with register 16 being the upper 8
bits
18,19 Accelerometer  Y axis
raw output, 16 bit signed integer with register 18 being the upper 8
bits
20,21 Accelerometer  Z axis
raw output, 16 bit signed integer with register 20 being the upper 8
bits
22 Command register

HDMM01

Das Kompass Modul HDMM01 von Pollin – 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 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 Anmerkung – 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);
}

Keine Kommentare »

Keine Kommentare vorhanden.

Kommentar schreiben

RSS-Feed für diese Kommentare.

Letzte Kommentare

Links

Letzte Artikel

Roboternetz.de

Copyright © Roboternetz.de - Alle Rechte vorbehalten.

Archive