Go Down

Topic: tilt compensate a compass (Read 1 time)previous topic - next topic

arduinopi

Dec 27, 2012, 01:47 pm
I have a digital compass, accelerometer and a gyroscope. I am trying to tilt compensate the compass so it continues to give readings when tilted.
how can I go about doing this?

code for accelerometer.
Code: [Select]
`/*   Memsic2125      Read the Memsic 2125 two-axis accelerometer.  Converts the   pulses output by the 2125 into milli-g's (1/1000 of earth's   gravity) and prints them over the serial connection to the   computer.      The circuit: * X output of accelerometer to digital pin 2 * Y output of accelerometer to digital pin 3 * +V of accelerometer to +5V * GND of accelerometer to ground     http://www.arduino.cc/en/Tutorial/Memsic2125      created 6 Nov 2008   by David A. Mellis   modified 30 Aug 2011   by Tom Igoe      This example code is in the public domain. */// these constants won't change:const int xPin = 2; // X output of the accelerometerconst int yPin = 3; // Y output of the accelerometervoid setup() {  // initialize serial communications:  Serial.begin(9600);  // initialize the pins connected to the accelerometer  // as inputs:  pinMode(xPin, INPUT);  pinMode(yPin, INPUT);}void loop() {  // variables to read the pulse widths:  int pulseX, pulseY;  // variables to contain the resulting accelerations  int accelerationX, accelerationY;    // read pulse from x- and y-axes:  pulseX = pulseIn(xPin,HIGH);    pulseY = pulseIn(yPin,HIGH);    // convert the pulse width into acceleration  // accelerationX and accelerationY are in milli-g's:   // earth's gravity is 1000 milli-g's, or 1g.  accelerationX = ((pulseX / 10) - 500) * 8;  accelerationY = ((pulseY / 10) - 500) * 8;  // print the acceleration  Serial.print(accelerationX);  // print a tab character:  Serial.print("\t");  Serial.print(accelerationY);  Serial.println();  delay(100);}`

code for compass
Code: [Select]
`#define HMC5883_WriteAddress 0x1E //  i.e 0x3C >> 1#define HMC5883_ModeRegisterAddress 0x02#define HMC5883_ContinuousModeCommand 0x00#define HMC5883_DataOutputXMSBAddress  0x03 #include <Wire.h> int regb=0x01;int regbdata=0x40;int outputData[6];int pos = 0;    // variable to store the servo position void setup(){     Serial.begin(9600);    Wire.begin();       //Initiate the Wire library and join the I2C bus as a master //  myservo.attach(9);  // attaches the servo on pin 9 to the servo object } void loop() {    int i,x,y,z;    double angle;    Wire.beginTransmission(HMC5883_WriteAddress);    Wire.send(regb);    Wire.send(regbdata);    Wire.endTransmission();    delay(10);    Wire.beginTransmission(HMC5883_WriteAddress); //Initiate a transmission with HMC5883 (Write address).    Wire.send(HMC5883_ModeRegisterAddress);       //Place the Mode Register Address in send-buffer.    Wire.send(HMC5883_ContinuousModeCommand);     //Place the command for Continuous operation Mode in send-buffer.    Wire.endTransmission();                       //Send the send-buffer to HMC5883 and end the I2C transmission.    delay(10);    Wire.beginTransmission(HMC5883_WriteAddress);  //Initiate a transmission with HMC5883 (Write address).    Wire.requestFrom(HMC5883_WriteAddress,6);      //Request 6 bytes of data from the address specified.    delay(10);    if(6 <= Wire.available()) // If the number of bytes available for reading be <=6.    {        for(i=0;i<6;i++)        {            outputData[i]=Wire.receive();  //Store the data in outputData buffer        }    }    x=outputData[0] << 8 | outputData[1]; //Combine MSB and LSB of X Data output register    z=outputData[2] << 8 | outputData[3]; //Combine MSB and LSB of Z Data output register    y=outputData[4] << 8 | outputData[5]; //Combine MSB and LSB of Y Data output register    angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees        Serial.print(angle,0);    Serial.println();    }`
All of my projects --> http://www.frankmagazu.com/

AWOL

#1
Dec 27, 2012, 01:48 pmLast Edit: Dec 27, 2012, 01:49 pm by AWOL Reason: 1
Tricky with a two axis accelerometer, I would have thought.

"tilt compensated compass algorithm" on Google only gave 434000 results
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

fkeel

#2
Dec 27, 2012, 01:56 pm

google "sparkfun razor" and check out the example code they provide. it works like a charm. i assume you can modify it to fit your hardware setup.

p.
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

Go Up