Interface library for ST LSM303DLM 3-axis magnetometer/accelerometer
Dependents: AVC_2012 m3pi_Kompass Fish_2014Fall Fish_2014Fall ... more
LSM303DLM.h
- Committer:
- shimniok
- Date:
- 2012-01-24
- Revision:
- 1:fc5c9258ec45
- Parent:
- 0:faef9e4c8bea
File content as of revision 1:fc5c9258ec45:
#ifndef __LSM303DLM_H #define __LSM303DLM_H #include "mbed.h" // register addresses #define CTRL_REG1_A 0x20 #define CTRL_REG2_A 0x21 #define CTRL_REG3_A 0x22 #define CTRL_REG4_A 0x23 #define CTRL_REG5_A 0x24 #define CTRL_REG6_A 0x25 // DLHC only #define HP_FILTER_RESET_A 0x25 // DLH, DLM only #define REFERENCE_A 0x26 #define STATUS_REG_A 0x27 #define OUT_X_L_A 0x28 #define OUT_X_H_A 0x29 #define OUT_Y_L_A 0x2A #define OUT_Y_H_A 0x2B #define OUT_Z_L_A 0x2C #define OUT_Z_H_A 0x2D #define INT1_CFG_A 0x30 #define INT1_SRC_A 0x31 #define INT1_THS_A 0x32 #define INT1_DURATION_A 0x33 #define INT2_CFG_A 0x34 #define INT2_SRC_A 0x35 #define INT2_THS_A 0x36 #define INT2_DURATION_A 0x37 #define CRA_REG_M 0x00 #define CRB_REG_M 0x01 #define MR_REG_M 0x02 #define OUT_X_H_M 0x03 #define OUT_X_L_M 0x04 #define OUT_Y_H_M 0x07 #define OUT_Y_L_M 0x08 #define OUT_Z_H_M 0x05 #define OUT_Z_L_M 0x06 #define SR_REG_M 0x09 #define IRA_REG_M 0x0A #define IRB_REG_M 0x0B #define IRC_REG_M 0x0C #define WHO_AM_I_M 0x0F #define OUT_Z_H_M 0x05 #define OUT_Z_L_M 0x06 #define OUT_Y_H_M 0x07 #define OUT_Y_L_M 0x08 /** Tilt-compensated compass interface Library for the STMicro LSM303DLm 3-axis magnetometer, 3-axis acceleromter * @author Michael Shimniok http://www.bot-thoughts.com/ * * This is an early revision; I've not yet implemented heading calculation and the interface differs from my * earlier LSM303DLH; I hope to make this library drop in compatible at some point in the future. * setScale() and setOffset() have no effect at this time. * * @code * #include "mbed.h" * #include "LSM303DLM.h" * * LSM303DLM compass(p28, p27); * ... * int a[3], m[3]; * ... * compass.readAcc(a); * compass.readMag(m); * * @endcode */ class LSM303DLM { public: /** Create a new interface for an LSM303DLM * * @param sda is the pin for the I2C SDA line * @param scl is the pin for the I2C SCL line */ LSM303DLM(PinName sda, PinName scl); /** sets the x, y, and z offset corrections for hard iron calibration * * Calibration details here: * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/ * * If you gather raw magnetometer data and find, for example, x is offset * by hard iron by -20 then pass +20 to this member function to correct * for hard iron. * * @param x is the offset correction for the x axis * @param y is the offset correction for the y axis * @param z is the offset correction for the z axis */ void setOffset(float x, float y, float z); /** sets the scale factor for the x, y, and z axes * * Calibratio details here: * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/ * * Sensitivity of the three axes is never perfectly identical and this * function can help to correct differences in sensitivity. You're * supplying a multipler such that x, y and z will be normalized to the * same max/min values */ void setScale(float x, float y, float z); /** read the calibrated accelerometer and magnetometer values * * @param a is the accelerometer 3d vector, written by the function * @param m is the magnetometer 3d vector, written by the function */ void read(int a[3], int m[3]); /** read the calibrated accelerometer values * * @param a is the accelerometer 3d vector, written by the function */ void readAcc(int a[3]); /** read the calibrated magnetometer values * * @param m is the magnetometer 3d vector, written by the function */ void readMag(int m[3]); /** sets the I2C bus frequency * * @param frequency is the I2C bus/clock frequency, either standard (100000) or fast (400000) */ void frequency(int hz); private: I2C _device; char _data[6]; int offset[3]; int scale[3]; void init(); }; #endif