Go Down

Topic: Guide to gyro and accelerometer with Arduino including Kalman filtering (Read 334554 times) previous topic - next topic

Hi again Lauzurus , :)
Thank you verry much for your answer ,but i am afraid that I won't need your source anymore.I just found out this link it is a source for Arduino and MinIMU-9 board wich is exactly what i have.Once again I am really sorry for wasting your time. :) I hope you that you won't get angry at me. :)


Hey Lauszus!

I was hoping to learn something about using IMU effectively with the help of Kalman filtering as I came across this wonderful tutorial. The only problem I have is I have 2 separate gyro and accelerometer modules (L3G4200D and ADXL 335). How do I combine and use them according to your pin config.

gyro has pins GND, VIN, SCL, SDA, SDD, INT1, INT2 and accelerometer pins are VCC, GND,X,Y,Z,ST. Where do these pins go?


The gyroscope is a digital gyroscope so you need to connect it to the SDA and SCL on the Arduino. See the following page for more information: http://arduino.cc/en/Reference/Wire. Then connect VIN to 3.3V and GND to GND on the Arduino.

Your accelerometer is a analog one, so you need to connect X, Y, and Z to your analog inputs. And yet again connect VIN to 3.3V and GND to GND on the Arduino.


Thanks! this really helps but aren't A4 and A5 analog input pins?

Yes they are, but pins can have several capabilities.

For instance you can also use any analog pin as a digital pin like so:
Code: [Select]


You can read more about it in the datasheet: http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.pdf.


Tell me if I have configured it correctly

Acc_Gyro          Arduino
3.3V       <-->   3.3V   
GND       <-->   GND
X           <-->   AN0
Y           <-->   AN1
Z           <-->   AN2
SDA        <-->   AN4
SCL        <-->    AN5 

Yes that looks correct. But beware that if there is no logic level circuit on your breakout board, you might damage the IC. So get a logic level converter if you need to use if on the long run: https://www.sparkfun.com/products/8745.


I don't think there is a need for any logic level converter device since the arduino I'm using already gives a 3.3V signal.

Thanks for the quick responses. Really hope I learn something from this tutorial.

You are using an Arduino Uno, right?
Then there is need for a logic level converter! Since the ATmega328P is running at 5V.


Thanks for clearing it up. Will definitely have to get a converter circuit then..


I see a lot of experience embedded in this thread, so I have a question about any noticed issues with the LSM303DLM or DLH regarding bad readings in abrupt changes in orientation. Abrupt is defined as peak accelerations of about 3 g's in all directions.  I am experiencing abrupt / large heading changes in a tilt compensated compass implemented with this device.  In relatively "flat" conditions I don't see failures, but in severe conditions, especially sharp pitch (dx/dt) and sharp roll (dy/dt) I seem to get non linear readings. I say I seem, because as of yet I have not captured the case live as trials are expensive to duplicate in my moving platform. 

My question is two fold:

1) Has anyone experienced big non linear results in the accelerometers ?
2) Has anyone noticed big non linear results in the magnetometer that are somehow induced with strong acceleration ?

My application is using a 9DOF IMU and I have wrapped the sensors in filters that limit rate of change of data as well as do a variety of selectable filter algorithms.


Mar 28, 2013, 03:30 pm Last Edit: Mar 28, 2013, 03:32 pm by doantrungnghia05 Reason: 1
Hi Lauszus,

I have read your codes about the gyro sensor and it's very helpfull. So thank you about it. Now i try to modify your code to my quadrotor project but it stills have some problem about "gyro drift". I know that i have to use the Kalmal filter but my board just only has 3 angular rate sensors (the gyro sensor as i think) and have no accelerometer, so i don't know how to use the Kamal filter. Could you take a look at my problem in here:

And could you show me some simple equation like the Complementary Filter which can aplly to my board.


I haven't got much experience with magnetometers, sorry.

The Kalman I filter I wrote can't be used without an accelerometer. The easiest thing would be to use a digital high-pass filter.

Mar 29, 2013, 02:13 am Last Edit: Mar 29, 2013, 02:15 am by doantrungnghia05 Reason: 1

I haven't got much experience with magnetometers, sorry.

The Kalman I filter I wrote can't be used without an accelerometer. The easiest thing would be to use a digital high-pass filter.

Thank Lauszus, here is my board, i bought it because in the internet many people use this board and they also buid their quad fly, but they just assembly these things like: motors, rf-controller, ...together without writing any code for the uController.

1.Kk_board datasheet: http://www.kkmulticopter.com/downloads/resources/KKmulticontroller%20v.5.5.pdf

2.The angular rate sensor use in kk board: (ENC series) http://www.murata.com/products/catalog/pdf/s42e.pdf


My code is C++ for atmega168pa and i know this forum is about adruino, but i think my code is very cleary and easy to understand. Here is it:

Code: [Select]
/*  MAIN FUNTION                                                       */
int main(void)

//----------- system init --------------------
DDRB|=(1<<PINB3);// measure loop time for cheking
//---------- update the zero value ---------
timer2_start();//start measure system time by timer2
//--------------   get value in 3 sensors -----------------------
PORTB^=(1<<PINB3);// toogle this pin per main loop

//-------- just process roll gyro--------------------------------------------------------------
roll_rate=(roll_zero-roll_adc)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
roll_angle-=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]

roll_rate=(roll_adc-roll_zero)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
roll_angle+=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]

usart_print_nb(roll_angle);//print roll_angle to computer screen

//----------------------- creat fixed_loop_time= 25ms per loop---------------------------------
dtime=sys_time-last_time;//dtime=time per main loop (ms)
last_time=sys_time;//update the last_time value for the next loop

ISR(TIMER2_OVF_vect)//when the timer2 over flow we have: sys_time=sys_time +1(ms)
{ // so we can caculate the dtime( time per main loop)

In my board, the three gyro sensors also have the high-pass filter as you say, but it still drifs.
Could you take a look at my "gyro drift" problem and show me how to fix it ?


Go Up