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.
MMA8452.h@1:ef026bf28798, 2013-10-08 (annotated)
- Committer:
- nherriot
- Date:
- Tue Oct 08 15:25:32 2013 +0000
- Revision:
- 1:ef026bf28798
- Parent:
- 0:bcf2aa85d7f9
- Child:
- 2:66db0f91b215
adding device id method detection
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nherriot | 0:bcf2aa85d7f9 | 1 | // Author: Nicholas Herriot |
nherriot | 0:bcf2aa85d7f9 | 2 | /* Copyright (c) 2013 Vodafone, MIT License |
nherriot | 0:bcf2aa85d7f9 | 3 | * |
nherriot | 0:bcf2aa85d7f9 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
nherriot | 0:bcf2aa85d7f9 | 5 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
nherriot | 0:bcf2aa85d7f9 | 6 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
nherriot | 0:bcf2aa85d7f9 | 7 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
nherriot | 0:bcf2aa85d7f9 | 8 | * furnished to do so, subject to the following conditions: |
nherriot | 0:bcf2aa85d7f9 | 9 | * |
nherriot | 0:bcf2aa85d7f9 | 10 | * The above copyright notice and this permission notice shall be included in all copies or |
nherriot | 0:bcf2aa85d7f9 | 11 | * substantial portions of the Software. |
nherriot | 0:bcf2aa85d7f9 | 12 | * |
nherriot | 0:bcf2aa85d7f9 | 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
nherriot | 0:bcf2aa85d7f9 | 14 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
nherriot | 0:bcf2aa85d7f9 | 15 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
nherriot | 0:bcf2aa85d7f9 | 16 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
nherriot | 0:bcf2aa85d7f9 | 17 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
nherriot | 0:bcf2aa85d7f9 | 18 | */ |
nherriot | 0:bcf2aa85d7f9 | 19 | |
nherriot | 0:bcf2aa85d7f9 | 20 | // the SparkFun breakout board defaults to 1, set to 0 if SA0 jumper on the bottom of the board is set |
nherriot | 0:bcf2aa85d7f9 | 21 | // see the Table 10. I2C Device Address Sequence in Freescale MMA8452Q pdf |
nherriot | 0:bcf2aa85d7f9 | 22 | |
nherriot | 0:bcf2aa85d7f9 | 23 | //#define SA0 1 |
nherriot | 0:bcf2aa85d7f9 | 24 | //#if SA0 |
nherriot | 0:bcf2aa85d7f9 | 25 | //#define MMA8452_ADDRESS 0x3A // SA0 is high, 0x1C if low - it should be 0x1D, but we shift now to save shifting in the code |
nherriot | 0:bcf2aa85d7f9 | 26 | //#else |
nherriot | 0:bcf2aa85d7f9 | 27 | //#define MMA8452_ADDRESS 0x1C |
nherriot | 0:bcf2aa85d7f9 | 28 | //#endif |
nherriot | 0:bcf2aa85d7f9 | 29 | |
nherriot | 0:bcf2aa85d7f9 | 30 | //#ifndef MBED_MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 31 | |
nherriot | 0:bcf2aa85d7f9 | 32 | //#define MBED_MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 33 | |
nherriot | 0:bcf2aa85d7f9 | 34 | #include "mbed.h" |
nherriot | 0:bcf2aa85d7f9 | 35 | |
nherriot | 0:bcf2aa85d7f9 | 36 | /** Accelerometer MMA8452 class |
nherriot | 0:bcf2aa85d7f9 | 37 | * |
nherriot | 0:bcf2aa85d7f9 | 38 | * Example: |
nherriot | 0:bcf2aa85d7f9 | 39 | * @code |
nherriot | 0:bcf2aa85d7f9 | 40 | * |
nherriot | 0:bcf2aa85d7f9 | 41 | * #include "mbed.h" |
nherriot | 0:bcf2aa85d7f9 | 42 | * #include "MMA8452.h" |
nherriot | 0:bcf2aa85d7f9 | 43 | * |
nherriot | 0:bcf2aa85d7f9 | 44 | * |
nherriot | 0:bcf2aa85d7f9 | 45 | * Accelerometer_MMA8452 Acc(p28, p27); |
nherriot | 0:bcf2aa85d7f9 | 46 | * serial pc(USBTX, USBRX); |
nherriot | 0:bcf2aa85d7f9 | 47 | * |
nherriot | 0:bcf2aa85d7f9 | 48 | * int main() |
nherriot | 0:bcf2aa85d7f9 | 49 | * { |
nherriot | 0:bcf2aa85d7f9 | 50 | * Acc.init(); |
nherriot | 0:bcf2aa85d7f9 | 51 | * while(1) |
nherriot | 0:bcf2aa85d7f9 | 52 | * { |
nherriot | 0:bcf2aa85d7f9 | 53 | * int x=0, y=0, z=0; |
nherriot | 0:bcf2aa85d7f9 | 54 | * Acc.read_Tilt(&x, &y, &z); |
nherriot | 0:bcf2aa85d7f9 | 55 | * pc.printf("Tilt x: %2.2f degree \n", x); // Print the tilt orientation of the X axis |
nherriot | 0:bcf2aa85d7f9 | 56 | * pc.printf("Tilt y: %2.2f degree \n", y); // Print the tilt orientation of the Y axis |
nherriot | 0:bcf2aa85d7f9 | 57 | * pc.printf("Tilt z: %2.2f degree \n", z); // Print the tilt orientation of the Z axis |
nherriot | 0:bcf2aa85d7f9 | 58 | * wait(1); |
nherriot | 0:bcf2aa85d7f9 | 59 | * } |
nherriot | 0:bcf2aa85d7f9 | 60 | * } |
nherriot | 0:bcf2aa85d7f9 | 61 | * @endcode |
nherriot | 0:bcf2aa85d7f9 | 62 | */ |
nherriot | 0:bcf2aa85d7f9 | 63 | |
nherriot | 0:bcf2aa85d7f9 | 64 | // More info on MCU Master address can be found on section 5.10.1 of http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8452Q |
nherriot | 0:bcf2aa85d7f9 | 65 | #define SA0 1 |
nherriot | 0:bcf2aa85d7f9 | 66 | #if SA0 |
nherriot | 0:bcf2aa85d7f9 | 67 | #define MMA8452_ADDRESS 0x1D // SA0 is high, 0x1C if low - |
nherriot | 0:bcf2aa85d7f9 | 68 | #else |
nherriot | 0:bcf2aa85d7f9 | 69 | #define MMA8452_ADDRESS 0x1C |
nherriot | 0:bcf2aa85d7f9 | 70 | #endif |
nherriot | 0:bcf2aa85d7f9 | 71 | |
nherriot | 0:bcf2aa85d7f9 | 72 | // Register descriptions found in section 6 of pdf |
nherriot | 0:bcf2aa85d7f9 | 73 | #define STATUS 0x00 // Type 'read' : Real time status, should return 0x00 |
nherriot | 0:bcf2aa85d7f9 | 74 | #define OUT_X_MSB 0x01 // Type 'read' : x axis - 8 most significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 75 | #define OUT_X_LSB 0x02 // Type 'read' : x axis - 4 least significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 76 | #define OUT_Y_MSB 0x03 // Type 'read' : y axis - 8 most significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 77 | #define OUT_Y_LSB 0x04 // Type 'read' : y axis - 4 least significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 78 | #define OUT_Z_MSB 0x05 // Type 'read' : z axis - 8 most significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 79 | #define OUT_Z_LSB 0x06 // Type 'read' : z axis - 4 least significatn bit of a 12 bit sample |
nherriot | 0:bcf2aa85d7f9 | 80 | |
nherriot | 0:bcf2aa85d7f9 | 81 | #define SYSMOD 0x0B // Type 'read' : This tells you if device is active, sleep or standy 0x00=STANDBY 0x01=WAKE 0x02=SLEEP |
nherriot | 0:bcf2aa85d7f9 | 82 | #define WHO_AM_I 0x0D // Type 'read' : This should return the device id of 0x2A |
nherriot | 0:bcf2aa85d7f9 | 83 | |
nherriot | 0:bcf2aa85d7f9 | 84 | #define PL_STATUS 0x10 // Type 'read' : This shows portrait landscape mode orientation |
nherriot | 0:bcf2aa85d7f9 | 85 | #define PL_CFG 0x11 // Type 'read/write' : This allows portrait landscape configuration |
nherriot | 0:bcf2aa85d7f9 | 86 | #define PL_COUNT 0x12 // Type 'read' : This is the portraint landscape debounce counter |
nherriot | 0:bcf2aa85d7f9 | 87 | #define PL_BF_ZCOMP 0x13 // Type 'read' : |
nherriot | 0:bcf2aa85d7f9 | 88 | #define PL_THS_REG 0x14 // Type 'read' : |
nherriot | 0:bcf2aa85d7f9 | 89 | |
nherriot | 0:bcf2aa85d7f9 | 90 | #define FF_MT_CFG 0X15 // Type 'read/write' : Freefaul motion functional block configuration |
nherriot | 0:bcf2aa85d7f9 | 91 | #define FF_MT_SRC 0X16 // Type 'read' : Freefaul motion event source register |
nherriot | 1:ef026bf28798 | 92 | #define FF_MT_THS 0X17 // Type 'read' : Freefaul motion threshold register |
nherriot | 0:bcf2aa85d7f9 | 93 | #define FF_COUNT 0X18 // Type 'read' : Freefaul motion debouce counter |
nherriot | 0:bcf2aa85d7f9 | 94 | |
nherriot | 0:bcf2aa85d7f9 | 95 | #define ASLP_COUNT 0x29 // Type 'read/write' : Counter setting for auto sleep |
nherriot | 0:bcf2aa85d7f9 | 96 | #define CTRL_REG_1 0x2A // Type 'read/write' : |
nherriot | 0:bcf2aa85d7f9 | 97 | #define CTRL_REG_2 0x2B // Type 'read/write' : |
nherriot | 0:bcf2aa85d7f9 | 98 | #define CTRL_REG_3 0x2C // Type 'read/write' : |
nherriot | 0:bcf2aa85d7f9 | 99 | #define CTRL_REG_4 0x2D // Type 'read/write' : |
nherriot | 0:bcf2aa85d7f9 | 100 | #define CTRL_REG_5 0x2E // Type 'read/write' : |
nherriot | 0:bcf2aa85d7f9 | 101 | |
nherriot | 0:bcf2aa85d7f9 | 102 | |
nherriot | 0:bcf2aa85d7f9 | 103 | |
nherriot | 0:bcf2aa85d7f9 | 104 | #define TILT_STATUS 0x03 // Tilt Status (Read only) |
nherriot | 0:bcf2aa85d7f9 | 105 | #define SRST_STATUS 0x04 // Sample Rate Status Register (Read only) |
nherriot | 0:bcf2aa85d7f9 | 106 | #define SPCNT_STATUS 0x05 // Sleep Count Register (Read/Write) |
nherriot | 0:bcf2aa85d7f9 | 107 | #define INTSU_STATUS 0x06 // Interrupt Setup Register |
nherriot | 0:bcf2aa85d7f9 | 108 | #define MODE_STATUS 0x07 // Mode Register (Read/Write) |
nherriot | 0:bcf2aa85d7f9 | 109 | #define SR_STATUS 0x08 // Auto-Wake and Active Mode Portrait/Landscape Samples per Seconds Register (Read/Write) |
nherriot | 0:bcf2aa85d7f9 | 110 | #define PDET_STATUS 0x09 // Tap/Pulse Detection Register (Read/Write) |
nherriot | 0:bcf2aa85d7f9 | 111 | #define PD_STATUS 0xA // Tap/Pulse Debounce Count Register (Read/Write) |
nherriot | 0:bcf2aa85d7f9 | 112 | |
nherriot | 0:bcf2aa85d7f9 | 113 | |
nherriot | 0:bcf2aa85d7f9 | 114 | |
nherriot | 0:bcf2aa85d7f9 | 115 | |
nherriot | 0:bcf2aa85d7f9 | 116 | |
nherriot | 0:bcf2aa85d7f9 | 117 | |
nherriot | 0:bcf2aa85d7f9 | 118 | class Accelerometer_MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 119 | { |
nherriot | 0:bcf2aa85d7f9 | 120 | public: |
nherriot | 0:bcf2aa85d7f9 | 121 | |
nherriot | 0:bcf2aa85d7f9 | 122 | |
nherriot | 0:bcf2aa85d7f9 | 123 | /** Create an accelerometer object connected to the specified I2C object |
nherriot | 0:bcf2aa85d7f9 | 124 | * |
nherriot | 0:bcf2aa85d7f9 | 125 | * @param sda I2C data port |
nherriot | 0:bcf2aa85d7f9 | 126 | * @param scl I2C8452 clock port |
nherriot | 0:bcf2aa85d7f9 | 127 | * |
nherriot | 0:bcf2aa85d7f9 | 128 | */ |
nherriot | 1:ef026bf28798 | 129 | Accelerometer_MMA8452(PinName sda, PinName scl, int frequency); |
nherriot | 1:ef026bf28798 | 130 | //Accelerometer_MMA8452(PinName sda, PinName scl); |
nherriot | 0:bcf2aa85d7f9 | 131 | |
nherriot | 0:bcf2aa85d7f9 | 132 | /** Destroys an MMA8452 object |
nherriot | 0:bcf2aa85d7f9 | 133 | * |
nherriot | 0:bcf2aa85d7f9 | 134 | */ |
nherriot | 0:bcf2aa85d7f9 | 135 | ~Accelerometer_MMA8452(); |
nherriot | 0:bcf2aa85d7f9 | 136 | |
nherriot | 0:bcf2aa85d7f9 | 137 | /** Activate the MMA8452 (required) |
nherriot | 1:ef026bf28798 | 138 | * returns 0 for success in activating the chip |
nherriot | 1:ef026bf28798 | 139 | * returns 1 for failure in activating the chip |
nherriot | 1:ef026bf28798 | 140 | * -currrently no retries or waiting is done, this method tries 1 time the exits. |
nherriot | 1:ef026bf28798 | 141 | */ |
nherriot | 0:bcf2aa85d7f9 | 142 | int activate(); |
nherriot | 0:bcf2aa85d7f9 | 143 | |
nherriot | 0:bcf2aa85d7f9 | 144 | /** Initialization of device MMA8452 (required) |
nherriot | 0:bcf2aa85d7f9 | 145 | */ |
nherriot | 0:bcf2aa85d7f9 | 146 | void init(); |
nherriot | 0:bcf2aa85d7f9 | 147 | |
nherriot | 1:ef026bf28798 | 148 | /** Read the device ID from the accelerometer |
nherriot | 1:ef026bf28798 | 149 | * |
nherriot | 1:ef026bf28798 | 150 | * @param *deviceID Value of device - is should be 0x2A |
nherriot | 1:ef026bf28798 | 151 | * return 0 for success or |
nherriot | 1:ef026bf28798 | 152 | * return 1 for failure. |
nherriot | 1:ef026bf28798 | 153 | */ |
nherriot | 1:ef026bf28798 | 154 | int Get_DeviceID(int *deviceID); |
nherriot | 0:bcf2aa85d7f9 | 155 | /** Read the Tilt Angle using Three Axis |
nherriot | 0:bcf2aa85d7f9 | 156 | * |
nherriot | 0:bcf2aa85d7f9 | 157 | * @param *x Value of x tilt |
nherriot | 0:bcf2aa85d7f9 | 158 | * @param *y Value of y tilt |
nherriot | 0:bcf2aa85d7f9 | 159 | * @param *z Value of z tilt |
nherriot | 0:bcf2aa85d7f9 | 160 | */ |
nherriot | 0:bcf2aa85d7f9 | 161 | void read_Tilt(float *x, float *y, float *z); |
nherriot | 0:bcf2aa85d7f9 | 162 | |
nherriot | 0:bcf2aa85d7f9 | 163 | /** Read the x register of the MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 164 | * |
nherriot | 0:bcf2aa85d7f9 | 165 | * @returns The value of x acceleration |
nherriot | 0:bcf2aa85d7f9 | 166 | */ |
nherriot | 0:bcf2aa85d7f9 | 167 | int read_x(); |
nherriot | 0:bcf2aa85d7f9 | 168 | |
nherriot | 0:bcf2aa85d7f9 | 169 | /** Read the y register of the MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 170 | * |
nherriot | 0:bcf2aa85d7f9 | 171 | * @returns The value of y acceleration |
nherriot | 0:bcf2aa85d7f9 | 172 | */ |
nherriot | 0:bcf2aa85d7f9 | 173 | int read_y(); |
nherriot | 0:bcf2aa85d7f9 | 174 | |
nherriot | 0:bcf2aa85d7f9 | 175 | /** Read the z register of the MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 176 | * |
nherriot | 0:bcf2aa85d7f9 | 177 | * @returns The value of z acceleration |
nherriot | 0:bcf2aa85d7f9 | 178 | */ |
nherriot | 0:bcf2aa85d7f9 | 179 | int read_z(); |
nherriot | 1:ef026bf28798 | 180 | |
nherriot | 1:ef026bf28798 | 181 | /** Read the x,y and z registers of the MMA8452 |
nherriot | 1:ef026bf28798 | 182 | * |
nherriot | 1:ef026bf28798 | 183 | * takes a 2 byte char buffer to store the value |
nherriot | 1:ef026bf28798 | 184 | * for each axis. |
nherriot | 1:ef026bf28798 | 185 | * returns 0 for success, and 1 for failure |
nherriot | 1:ef026bf28798 | 186 | * |
nherriot | 1:ef026bf28798 | 187 | */ |
nherriot | 1:ef026bf28798 | 188 | int read_xyz(char *x, char *y, char *z); |
nherriot | 0:bcf2aa85d7f9 | 189 | |
nherriot | 0:bcf2aa85d7f9 | 190 | /** Read from specified MMA8452 register |
nherriot | 0:bcf2aa85d7f9 | 191 | * |
nherriot | 0:bcf2aa85d7f9 | 192 | * @param addr The internal registeraddress of the MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 193 | * @returns The value of the register |
nherriot | 0:bcf2aa85d7f9 | 194 | */ |
nherriot | 0:bcf2aa85d7f9 | 195 | char read_reg(char addr); |
nherriot | 0:bcf2aa85d7f9 | 196 | |
nherriot | 0:bcf2aa85d7f9 | 197 | /** Write to specified MMA8452 register |
nherriot | 0:bcf2aa85d7f9 | 198 | * |
nherriot | 0:bcf2aa85d7f9 | 199 | * @param addr The internal registeraddress of the MMA8452 |
nherriot | 0:bcf2aa85d7f9 | 200 | * @param data New value of the register |
nherriot | 0:bcf2aa85d7f9 | 201 | */ |
nherriot | 0:bcf2aa85d7f9 | 202 | void write_reg(char addr, char data); |
nherriot | 0:bcf2aa85d7f9 | 203 | |
nherriot | 0:bcf2aa85d7f9 | 204 | |
nherriot | 0:bcf2aa85d7f9 | 205 | private: |
nherriot | 0:bcf2aa85d7f9 | 206 | I2C m_i2c; |
nherriot | 1:ef026bf28798 | 207 | int m_frequency; |
nherriot | 0:bcf2aa85d7f9 | 208 | |
nherriot | 0:bcf2aa85d7f9 | 209 | }; |
nherriot | 0:bcf2aa85d7f9 | 210 | |
nherriot | 0:bcf2aa85d7f9 | 211 | //#endif |