Hello, I'm using the HMC5883l magnetometer.
I've been trying to measure a rotation angle and it always have given me tremendously wrong results, for example: if I turned the compass about 90 degrees, it showed 40 degrees turn, I've tried to change the gain, but it didn't affect the results and I noticed when I took measurements from different places on my desk, the results were different.
Can someone advise me how to get accurate measurements?
Here's the code I'm using:
#include <Wire.h>
#define address 0x1E //0011110b
int x, y, z;
float alpha = 0, beta = 0, prevbeta = -1, angle_1 = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(address);
Wire.write(0x02); //mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
delay(6);
}
void loop() {
Wire.beginTransmission(address);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();
//Read data from each axis, 2 registers per axis
Wire.requestFrom(address, 6);
if (6 <= Wire.available()) {
x = Wire.read() << 8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read() << 8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read() << 8; //Y msb
y |= Wire.read(); //Y ls
}
beta = atan2(y,x) * (180 / 3.14) + 180;
if(prevbeta != -1)
{
if (prevbeta >= 270 && prevbeta <= 360 && beta >= 0 && beta <= 90) {
angle_1 -= (beta + (360 - prevbeta));
}
else if (prevbeta >= 0 && prevbeta <= 90 && beta >= 270 && beta <= 360) {
angle_1 += (prevbeta + (360 - beta));
}
else
angle_1 += (prevbeta - beta);
}
Serial.println(angle_1);
prevbeta = beta;
delay(67);
}
Thank you, Dan.