library for using LSM303DM chip
Diff: LSM303.h
- Revision:
- 6:22556393747b
- Parent:
- 5:9786e0a13a3a
--- a/LSM303.h Tue Aug 12 11:43:45 2014 +0000 +++ b/LSM303.h Mon Sep 08 01:46:11 2014 +0000 @@ -1,54 +1,6 @@ #ifndef LSM303_h #define LSM303_h #include "mbed.h" -/* LSM303DLM mbed code based on AN3192 Application note and LSM303DLH example code by Jim Lindblom SparkFun Electronics - modified by Frankie.Chu to arduino in year 2012. - - date: 13/10/13 - license: Use this with your own risk:-) - - Calibration is a must to make your compass to work: - - //displays integer value with sign in 4 digit led display and waits delay seconds - void displayInt(TM1637 &tm, int value, float delay)... - // displays a digit in position of 4 digit led display - void TM1637::display(uint8_t position,int8_t digit)... - //calibration loop - for(int i = 0; i <200; i++) { - - lsm.getLSM303_mag(); - -// Mmin handler - if(lsm.m.x < lsm.m_min.x) - lsm.m_min.x = lsm.m.x; - - if(lsm.m.y < lsm.m_min.y) - lsm.m_min.y = lsm.m.y; - - if(lsm.m.z < lsm.m_min.z) - lsm.m_min.z = lsm.m.z; - -// Mmax handler - if(lsm.m.x > lsm.m_max.x) - lsm.m_max.x = lsm.m.x ; - - if(lsm.m.y > lsm.m_max.y) - lsm.m_max.y = lsm.m.y; - - if(lsm.m.z > lsm.m_max.z) - lsm.m_max.z = lsm.m.z; - - tm.clearDisplay(); - tm.display(i%4,0); - wait(0.1); - } - displayInt(tm, lsm.m_min.x, 8); - displayInt(tm, lsm.m_min.y, 8); - displayInt(tm, lsm.m_min.z, 8); - displayInt(tm, lsm.m_max.x, 8); - displayInt(tm, lsm.m_max.y, 8); - displayInt(tm, lsm.m_max.z, 8); -*/ /* LSM303 Address definitions */ #define LSM303_MAG 0x3C // assuming SA0 grounded @@ -99,42 +51,85 @@ #define PI 3.14159265 //#define CALIBRATING //uncomment when calibrating +/** LSM303DLM mbed code based on AN3192 Application note and LSM303DLH example code by Jim Lindblom SparkFun Electronics + modified by Frankie.Chu to arduino in year 2012. + + date: 13/10/13 + license: Use this with your own risk:-) + + Calibration the compass and accelometer is a must to make your compass to work: +@code + //calibration loop + for(int i = 0; i <200; i++) { + + lsm.getLSM303_mag(); + +// Mmin handler + if(lsm.m.x < lsm.m_min.x) + lsm.m_min.x = lsm.m.x; + + if(lsm.m.y < lsm.m_min.y) + lsm.m_min.y = lsm.m.y; + + if(lsm.m.z < lsm.m_min.z) + lsm.m_min.z = lsm.m.z; + +// Mmax handler + if(lsm.m.x > lsm.m_max.x) + lsm.m_max.x = lsm.m.x ; + + if(lsm.m.y > lsm.m_max.y) + lsm.m_max.y = lsm.m.y; + + if(lsm.m.z > lsm.m_max.z) + lsm.m_max.z = lsm.m.z; + wait(0.1); + } +@endcode +*/ class LSM303 -{// I am LSM303DLM +{ public: + //! A plane with x,y and z axis typedef struct Plane { float x, y, z; } Plane; - Plane a; // accelerometer readings + //! accelerometer readings + Plane a; Plane a_max; Plane a_min; - Plane m; // magnetometer readings + //! magnetometer readings + Plane m; Plane m_max; // maximum magnetometer values, used for calibration Plane m_min; // minimum magnetometer values, used for calibration + Plane scale; //soft magneting field scaling + //! Initialises LSM303DLM chip + void setup(); + //!Tests Accelometer. Returns 0xFF on error, 0x30 if succesful. + int testAcc(); + //!Tests Compass. Returns 0xFF on error, 0x0F if succesful and LSM303DLM; 0x3C if LSM303DH. + int testMag(); + //! Returns compass heading in degrees + float getTiltHeading(); + //! Reads magnetometer values to m + void getLSM303_mag(); + //! Reads accelerometer values to a + void getLSM303_accel(); + +private: + int _i2c_address; float pitch; float roll; - int setup(); - - void getLSM303_mag(); - void getLSM303_accel(); + int LSM303_read(int address); - int LSM303_write(int data, int address); - - int testAcc(); - int testMag(); - - float getTiltHeading(); - + int LSM303_write(int data, int address); // Plane functions static void vector_cross(const Plane *a, const Plane *b, Plane *out); static float vector_dot(const Plane *a,const Plane *b); static void vector_normalize(Plane *a); - - -private: - - int _i2c_address; + + void getScale(Plane *scale); }; #endif