Library for driving the MMA8452 accelerometer over I2C

Dependents:   MMA8452_Test MMA8452_Demo Dualing_Tanks IMU-Controlled_MP3_Player ... more

Here is a simple example:

#include "mbed.h"
#include "MMA8452.h"

int main() {
   Serial pc(USBTX,USBRX);
   pc.baud(115200);
   double x = 0, y = 0, z = 0;

   MMA8452 acc(p28, p27, 40000);
   acc.setBitDepth(MMA8452::BIT_DEPTH_12);
   acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
   acc.setDataRate(MMA8452::RATE_100);
   
   while(1) {
      if(!acc.isXYZReady()) {
         wait(0.01);
         continue;
      }
      acc.readXYZGravity(&x,&y,&z);
      pc.printf("Gravities: %lf %lf %lf\r\n",x,y,z);
   }
}

An easy way to test that this actually works is to run the loop above and hold the MMA8452 parallel to the ground along the respective axis (and upsidedown in each axis). You will see 1G on the respective axis and 0G on the others.

Revision:
13:4bd8b4cd479d
Parent:
12:172540ff6b8b
Child:
14:0602b45ca70f
--- a/MMA8452.h	Tue Mar 04 17:50:47 2014 +0000
+++ b/MMA8452.h	Wed Mar 05 15:04:13 2014 +0000
@@ -262,8 +262,13 @@
        * BIT_DEPTH_8 and 6 bytes for BIT_DEPTH_12. It is upto the caller to ensure this.
        * @return 0 for success, and 1 for failure
        */ 
-      int readRawXYZ(char *dst); 
+      int readXYZRaw(char *dst); 
+      int readXYZCounts(int *x, int *y, int *z);
+      int readXYZGravity(double *x, double *y, double *z);
       
+      int isXReady();
+      int isYReady();
+      int isZReady();
       int isXYZReady();
             
       /** Read from specified MMA8452 register
@@ -308,6 +313,10 @@
     private:
       int readRaw(char src, char *dst, int len);
       int maskAndApplyRegister(char reg, char mask, char value, int toggleActivation);
+      
+      int twelveBitToSigned(char *buf);
+      int eightBitToSigned(char *buf);
+      double convertCountToGravity(int count, int countsPerG);
     
       I2C _i2c;
       int _frequency;
@@ -315,6 +324,7 @@
       int _writeAddress;
       
       BitDepth _bitDepth;
+      DynamicRange _dynamicRange;
          
 };