Developer

First Arduino IMU test

I'm trying to develop an IMU for my Arduino-based UAVS (heli) project. In my first test I just used a three-axis accelerometer, but it didn't work because the motor vibration generated too much noise. I then tried it just with gyros, but of course the the gyros drifted. So I learned through experience what everyone already knows: that the onlyway to make a good IMU is by mixing accelerometers with gyros andKalman Filters, which is eventually what I did ;-)

I ran a test to see how my IMU is responding, and I made a line chart to see the results. The test consists of rotating the device to 70 degrees and then shake it, to see how the filters reduce the "noise". It looks pretty good:


The samples was taken every 20 miliseconds, the blue line is just accelerometer and the red line is Accelerometer+Gyros+KalmanFilters.

Source code here: ArduIMU Beta1

Special thanks to Tom Pycke



E-mail me when people leave their comments –

You need to be a member of diydrones to add comments!

Join diydrones

Comments

  • Very impressive work, thank you very much for posting the code, i was wondering though how much is the Arduino able to handle? I have one on order, but would it also be able to process the data from a compass and also control 3 motors if the proper hardware was used? As you may have guessed i am working on a tri copter style AUV. Thanks to anyone that can shine some light on this.
  • thanks for your hepls..
  • 3D Robotics
    Jordi's account got hacked and he's out of the country and away from his files. I'll remind him to upload them again when he gets back.
  • hello!

    why ı can not see the source code
    it gives an error like this "This site has been disabled for violations of our Program Policies. If you feel this disabling was in error, please visit our contact page to let us know. Contact Us"
  • Developer
    well, at the beginnig of the code, put this code:
    //////////////////////////////////////////////////////
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif
    ///////////////////////
    And thats all!!! just connect a ref voltage to the aref pin and ready!!!
  • I'm running into the same problem as you two with the resolution of a 3.3v accelerometer on the Arduino. Although I think I've found a way to get full 10-bit resolution on ANY voltage range with using op-amps. Using an op-amp, a reference voltage, and trim pots, exactly 0v can be outputted on the low end of the accelerometer ~ .8v (or whatever you choose), and exactly 5v outputted on the high end, ~1.8v( "" ). All you need is a few equations to trim up the pot values.

    If I get it working, I'll be sure to let you guys know..

    Btw, how difficult is it to set the +aref pin on the Arduino?
  • no, i've been testing with the 5v. it's a bad idea, but nobody else had mentioned having problems.

    i dropped the speed in twi.h from 400000 to 300000 and it seems to be working now. maybe it's just flaky when overpowered.
  • Developer
    Are u using 3.3V for power supply???
  • Anyone having trouble getting the boarduino working with the nunchuck accelerometer? The example code just hangs during the nunchuck_init function for me.
  • Developer
    Yes sounds possible, some solutions cross my mind, but i don't know exactly how to do that (clip off the low voltage), the high voltage you can adjust it using the external reference pin (AREF), so we only need to investigate how clip off the low voltage. Some ADC have the option of two external reference pins (+AREF and -AREF), so in that way you can adjust the lowest voltage too. Arduino only have +AREF.
This reply was deleted.