10DOF FreeIMU port for FreeIMU v4 board and GY-86. This library was modified extensively to specifically suit the Mbed platform. Used threads and interrupts to achieve async mode.

Dependencies:   HMC58X3 AK8963 MS561101BA MODI2C MPU9250

Dependents:   MTQuadControl FreeIMU_serial FreeIMU_demo

Port of FreeIMU library from Arduino to Mbed

10DOF FreeIMU port for FreeIMU v4 board and GY-86. This library was modified extensively to specifically suit the Mbed platform. Maximum sampling rate of 500hz can be achieved using this library.

Improvements

Sensor fusion algorithm fast initialization

This library implements the ARHS hot start algorithm, meaning that you can get accurate readings seconds after the algorithm is started, much faster than the Arduino version, where outputs slowly converge to the correct value in about a minute.

Caching

Sensors are read at their maximum output rates. Read values are cached hence multiple consecutive queries will not cause multiple reads.

Fully async

Acc & Gyro reads are performed via timer interrupts. Magnetometer and barometer are read by RTOS thread. No interfering with main program logic.

Usage

Declare a global FreeIMU object like the one below. There should only be one FreeIMU instance existing at a time.

#include "mbed.h"
#include "FreeIMU.h"
FreeIMU imu;

int main(){
    imu.init(true);
}

Then, anywhere in the code, you may call imu.getQ(q) to get the quarternion, where q is an array of 4 floats representing the quarternion structure.

You are recommended to call getQ frequently to keep the filter updated. However, the frequency should not exceed 500hz to avoid redundant calculation. One way to do this is by using the RtosTimer:

void getIMUdata(void const *);     //method definition

//in main
RtosTimer IMUTimer(getIMUdata, osTimerPeriodic, (void *)NULL);
IMUTimer.start(2);     //1 / 2ms = 500hz

//getIMUdata function
void getIMUdata(void const *dummy){
    imu.getQ(NULL);
}
Committer:
tyftyftyf
Date:
Tue Nov 05 11:31:39 2013 +0000
Revision:
1:794e9cdbc2a0
Parent:
0:21840c01d3d7
Child:
9:a79af1283446

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tyftyftyf 0:21840c01d3d7 1
tyftyftyf 0:21840c01d3d7 2 /**
tyftyftyf 0:21840c01d3d7 3 * FreeIMU calibration header. Automatically generated by FreeIMU_GUI.
tyftyftyf 0:21840c01d3d7 4 * Do not edit manually unless you know what you are doing.
tyftyftyf 0:21840c01d3d7 5 */
tyftyftyf 0:21840c01d3d7 6
tyftyftyf 0:21840c01d3d7 7
tyftyftyf 0:21840c01d3d7 8 #define CALIBRATION_H
tyftyftyf 0:21840c01d3d7 9
tyftyftyf 1:794e9cdbc2a0 10 const int acc_off_x = 291;
tyftyftyf 1:794e9cdbc2a0 11 const int acc_off_y = -236;
tyftyftyf 1:794e9cdbc2a0 12 const int acc_off_z = -2330;
tyftyftyf 1:794e9cdbc2a0 13 const float acc_scale_x = 15073.187570;
tyftyftyf 1:794e9cdbc2a0 14 const float acc_scale_y = 16496.811960;
tyftyftyf 1:794e9cdbc2a0 15 const float acc_scale_z = 16887.470139;
tyftyftyf 0:21840c01d3d7 16
tyftyftyf 1:794e9cdbc2a0 17 const int magn_off_x = 41;
tyftyftyf 1:794e9cdbc2a0 18 const int magn_off_y = -67;
tyftyftyf 1:794e9cdbc2a0 19 const int magn_off_z = -150;
tyftyftyf 1:794e9cdbc2a0 20 const float magn_scale_x = 486.457717;
tyftyftyf 1:794e9cdbc2a0 21 const float magn_scale_y = 503.317575;
tyftyftyf 1:794e9cdbc2a0 22 const float magn_scale_z = 410.482174;