Added code to manage Orientation, FreeFall and Motion Detection. Data is also available via IRQ.

Dependents:   Test_FRDM_MMA8451Q AccelTest FRDM-KL46-Template KL25Z_Demo ... more

Fork of MMA8451Q by Emilio Monti

Committer:
clemente
Date:
Sun Aug 25 21:53:40 2013 +0000
Revision:
11:13e2af71e2cf
Parent:
10:fa532bf396fb
changed the name of the pointer to user callback function.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 1:d2630136d51e 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
samux 1:d2630136d51e 2 *
samux 1:d2630136d51e 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
samux 1:d2630136d51e 4 * and associated documentation files (the "Software"), to deal in the Software without
samux 1:d2630136d51e 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
samux 1:d2630136d51e 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
samux 1:d2630136d51e 7 * Software is furnished to do so, subject to the following conditions:
samux 1:d2630136d51e 8 *
samux 1:d2630136d51e 9 * The above copyright notice and this permission notice shall be included in all copies or
samux 1:d2630136d51e 10 * substantial portions of the Software.
samux 1:d2630136d51e 11 *
samux 1:d2630136d51e 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
samux 1:d2630136d51e 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
samux 1:d2630136d51e 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
samux 1:d2630136d51e 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
samux 1:d2630136d51e 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
samux 1:d2630136d51e 17 */
samux 1:d2630136d51e 18
emilmont 0:6149091f755d 19 #ifndef MMA8451Q_H
emilmont 0:6149091f755d 20 #define MMA8451Q_H
emilmont 0:6149091f755d 21
emilmont 0:6149091f755d 22 #include "mbed.h"
emilmont 0:6149091f755d 23
samux 1:d2630136d51e 24 /**
samux 1:d2630136d51e 25 * MMA8451Q accelerometer example
samux 2:a077541cbadc 26 *
samux 2:a077541cbadc 27 * @code
samux 1:d2630136d51e 28 * #include "mbed.h"
samux 1:d2630136d51e 29 * #include "MMA8451Q.h"
chris 3:db7126dbd63f 30 *
samux 1:d2630136d51e 31 * #define MMA8451_I2C_ADDRESS (0x1d<<1)
chris 3:db7126dbd63f 32 *
chris 4:c4d879a39775 33 * int main(void) {
chris 4:c4d879a39775 34 *
chris 3:db7126dbd63f 35 * MMA8451Q acc(P_E25, P_E24, MMA8451_I2C_ADDRESS);
chris 3:db7126dbd63f 36 * PwmOut rled(LED_RED);
chris 3:db7126dbd63f 37 * PwmOut gled(LED_GREEN);
chris 3:db7126dbd63f 38 * PwmOut bled(LED_BLUE);
chris 3:db7126dbd63f 39 *
chris 3:db7126dbd63f 40 * while (true) {
chris 3:db7126dbd63f 41 * rled = 1.0 - abs(acc.getAccX());
chris 3:db7126dbd63f 42 * gled = 1.0 - abs(acc.getAccY());
chris 3:db7126dbd63f 43 * bled = 1.0 - abs(acc.getAccZ());
chris 3:db7126dbd63f 44 * wait(0.1);
chris 3:db7126dbd63f 45 * }
samux 1:d2630136d51e 46 * }
samux 2:a077541cbadc 47 * @endcode
samux 1:d2630136d51e 48 */
clemente 6:c52175d13e0a 49
clemente 6:c52175d13e0a 50 // Z-Lock Threshold Angles
clemente 6:c52175d13e0a 51 #define Z_LOCKOUT_14 0 // Angle to 14°
clemente 6:c52175d13e0a 52 #define Z_LOCKOUT_18 1 // Angle to 18°
clemente 6:c52175d13e0a 53 #define Z_LOCKOUT_21 2 // Angle to 21°
clemente 6:c52175d13e0a 54 #define Z_LOCKOUT_25 3 // Angle to 25°
clemente 6:c52175d13e0a 55 #define Z_LOCKOUT_29 4 // Angle to 29°
clemente 6:c52175d13e0a 56 #define Z_LOCKOUT_33 5 // Angle to 33°
clemente 6:c52175d13e0a 57 #define Z_LOCKOUT_37 6 // Angle to 37°
clemente 6:c52175d13e0a 58 #define Z_LOCKOUT_42 7 // Angle to 42°
clemente 6:c52175d13e0a 59 // Back/Front Orientation Definition
clemente 6:c52175d13e0a 60 #define Z_BKFR_80 0 // Back and Front trip angle
clemente 6:c52175d13e0a 61 #define Z_BKFR_75 1 // Back and Front trip angle
clemente 6:c52175d13e0a 62 #define Z_BKFR_70 2 // Back and Front trip angle
clemente 6:c52175d13e0a 63 #define Z_BKFR_65 3 // Back and Front trip angle
clemente 6:c52175d13e0a 64 // Threshold Angle Thresholds Lookup Table
clemente 6:c52175d13e0a 65 #define PL_THS_15 0x07 // Set Threshold to 15°
clemente 6:c52175d13e0a 66 #define PL_THS_20 0x09 // Set Threshold to 20°
clemente 6:c52175d13e0a 67 #define PL_THS_30 0x0C // Set Threshold to 30°
clemente 6:c52175d13e0a 68 #define PL_THS_35 0x0D // Set Threshold to 35°
clemente 6:c52175d13e0a 69 #define PL_THS_40 0x0F // Set Threshold to 40°
clemente 6:c52175d13e0a 70 #define PL_THS_45 0x10 // Set Threshold to 45°
clemente 6:c52175d13e0a 71 #define PL_THS_55 0x13 // Set Threshold to 55°
clemente 6:c52175d13e0a 72 #define PL_THS_60 0x14 // Set Threshold to 60°
clemente 6:c52175d13e0a 73 #define PL_THS_70 0x17 // Set Threshold to 70°
clemente 6:c52175d13e0a 74 #define PL_THS_75 0x19 // Set Threshold to 75°
clemente 6:c52175d13e0a 75 // Trip Angles with Hysteresis for 45° Angle
clemente 6:c52175d13e0a 76 #define PL_HYS_0 0x00 // Set Hysteresis to ±0°
clemente 6:c52175d13e0a 77 #define PL_HYS_4 0x01 // Set Hysteresis to ±4°
clemente 6:c52175d13e0a 78 #define PL_HYS_7 0x02 // Set Hysteresis to ±7°
clemente 6:c52175d13e0a 79 #define PL_HYS_11 0x03 // Set Hysteresis to ±11°
clemente 6:c52175d13e0a 80 #define PL_HYS_14 0x04 // Set Hysteresis to ±14°
clemente 6:c52175d13e0a 81 #define PL_HYS_17 0x05 // Set Hysteresis to ±17°
clemente 6:c52175d13e0a 82 #define PL_HYS_21 0x06 // Set Hysteresis to ±21°
clemente 6:c52175d13e0a 83 #define PL_HYS_24 0x07 // Set Hysteresis to ±24°
clemente 8:7e6013f11b10 84 // Landscape/Portrait orientation
clemente 8:7e6013f11b10 85 #define cLAPO_PU 0 // Portrait Up: Equipment standing vertically in the normal orientation
clemente 8:7e6013f11b10 86 #define cLAPO_PD 1 // Portrait Down: Equipment standing vertically in the inverted orientation
clemente 8:7e6013f11b10 87 #define cLAPO_LR 2 // Landscape Right: Equipment is in landscape mode to the right
clemente 8:7e6013f11b10 88 #define cLAPO_LL 3 // Landscape Left: Equipment is in landscape mode to the left.
clemente 9:2aa9b1668d14 89 // System Output Data Rate for acceleration samples
clemente 9:2aa9b1668d14 90 #define cODR_800HZ 0 // 1.25 ms
clemente 9:2aa9b1668d14 91 #define cODR_400HZ 1 // 2.5 ms
clemente 9:2aa9b1668d14 92 #define cODR_200HZ 2 // 5 ms
clemente 9:2aa9b1668d14 93 #define cODR_100HZ 3 // 10 ms
clemente 9:2aa9b1668d14 94 #define cODR_50HZ 4 // 20 ms
clemente 9:2aa9b1668d14 95 #define cODR_12_5HZ 5 // 80 ms
clemente 9:2aa9b1668d14 96 #define cODR_6_25HZ 6 // 160 ms
clemente 9:2aa9b1668d14 97 #define cODR_1_56HZ 7 // 640 ms
clemente 6:c52175d13e0a 98
emilmont 0:6149091f755d 99 class MMA8451Q
emilmont 0:6149091f755d 100 {
emilmont 0:6149091f755d 101 public:
clemente 5:695063448f2a 102 /**
clemente 5:695063448f2a 103 * MMA8451Q constructor
clemente 5:695063448f2a 104 *
clemente 5:695063448f2a 105 * @param sda SDA pin
clemente 5:695063448f2a 106 * @param sdl SCL pin
clemente 5:695063448f2a 107 * @param addr addr of the I2C peripheral
clemente 5:695063448f2a 108 */
clemente 5:695063448f2a 109 MMA8451Q(PinName sda, PinName scl, int addr);
clemente 5:695063448f2a 110
clemente 5:695063448f2a 111 /**
clemente 5:695063448f2a 112 * MMA8451Q destructor
clemente 5:695063448f2a 113 */
clemente 5:695063448f2a 114 ~MMA8451Q();
clemente 5:695063448f2a 115
clemente 5:695063448f2a 116 /**
clemente 5:695063448f2a 117 * Get the value of the WHO_AM_I register
clemente 5:695063448f2a 118 *
clemente 5:695063448f2a 119 * @returns WHO_AM_I value
clemente 5:695063448f2a 120 */
clemente 5:695063448f2a 121 uint8_t getWhoAmI();
clemente 5:695063448f2a 122
clemente 5:695063448f2a 123 /**
clemente 5:695063448f2a 124 * Get X axis acceleration
clemente 5:695063448f2a 125 *
clemente 5:695063448f2a 126 * @returns X axis acceleration
clemente 5:695063448f2a 127 */
clemente 5:695063448f2a 128 float getAccX();
clemente 5:695063448f2a 129
clemente 5:695063448f2a 130 /**
clemente 5:695063448f2a 131 * Get Y axis acceleration
clemente 5:695063448f2a 132 *
clemente 5:695063448f2a 133 * @returns Y axis acceleration
clemente 5:695063448f2a 134 */
clemente 5:695063448f2a 135 float getAccY();
clemente 5:695063448f2a 136
clemente 5:695063448f2a 137 /**
clemente 5:695063448f2a 138 * Get Z axis acceleration
clemente 5:695063448f2a 139 *
clemente 5:695063448f2a 140 * @returns Z axis acceleration
clemente 5:695063448f2a 141 */
clemente 5:695063448f2a 142 float getAccZ();
clemente 5:695063448f2a 143
clemente 5:695063448f2a 144 /**
clemente 5:695063448f2a 145 * Get XYZ axis acceleration
clemente 5:695063448f2a 146 *
clemente 5:695063448f2a 147 * @param res array where acceleration data will be stored
clemente 5:695063448f2a 148 */
clemente 5:695063448f2a 149 void getAccAllAxis(float * res);
emilmont 0:6149091f755d 150
clemente 8:7e6013f11b10 151 /**
clemente 10:fa532bf396fb 152 * Get raw value for X axis acceleration
clemente 10:fa532bf396fb 153 *
clemente 10:fa532bf396fb 154 * @returns X axis acceleration
clemente 10:fa532bf396fb 155 */
clemente 10:fa532bf396fb 156 int16_t getAccRawX( int16_t * res);
clemente 10:fa532bf396fb 157
clemente 10:fa532bf396fb 158 /**
clemente 10:fa532bf396fb 159 * Get raw value for Y axis acceleration
clemente 10:fa532bf396fb 160 *
clemente 10:fa532bf396fb 161 * @returns Y axis acceleration
clemente 10:fa532bf396fb 162 */
clemente 10:fa532bf396fb 163 int16_t getAccRawY( int16_t * res);
clemente 10:fa532bf396fb 164
clemente 10:fa532bf396fb 165 /**
clemente 10:fa532bf396fb 166 * Get raw value for Z axis acceleration
clemente 10:fa532bf396fb 167 *
clemente 10:fa532bf396fb 168 * @returns Z axis acceleration
clemente 10:fa532bf396fb 169 */
clemente 10:fa532bf396fb 170 int16_t getAccRawZ( int16_t * res);
clemente 10:fa532bf396fb 171
clemente 10:fa532bf396fb 172 /**
clemente 10:fa532bf396fb 173 * Get raw values for XYZ axis acceleration
clemente 10:fa532bf396fb 174 *
clemente 10:fa532bf396fb 175 * @param res array where acceleration data will be stored
clemente 10:fa532bf396fb 176 */
clemente 10:fa532bf396fb 177 unsigned int getAccRawAllAxis(int16_t * res);
clemente 10:fa532bf396fb 178
clemente 10:fa532bf396fb 179 /**
clemente 8:7e6013f11b10 180 * Configure the Accelerometere for free fall detection
clemente 8:7e6013f11b10 181 *
clemente 8:7e6013f11b10 182 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 183 * @return none
clemente 8:7e6013f11b10 184 */
clemente 8:7e6013f11b10 185 void FreeFallDetection( void(*fptr)(void));
clemente 8:7e6013f11b10 186
clemente 8:7e6013f11b10 187 /**
clemente 8:7e6013f11b10 188 * Configure the Accelerometere for motion detection
clemente 8:7e6013f11b10 189 *
clemente 8:7e6013f11b10 190 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 191 * @return none
clemente 8:7e6013f11b10 192 */
clemente 5:695063448f2a 193 void MotionDetection( void(*fptr)(void));
clemente 8:7e6013f11b10 194
clemente 8:7e6013f11b10 195 /**
clemente 8:7e6013f11b10 196 * Configure the Accelerometere for orientation detection
clemente 8:7e6013f11b10 197 *
clemente 8:7e6013f11b10 198 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 199 * @param Z lockout value, Z Backfront, Port/Landscape Thsld, Port/Landscape Hysteresis
clemente 8:7e6013f11b10 200 * @return none
clemente 8:7e6013f11b10 201 */
clemente 7:ba0016258d5d 202 void OrientationDetect( void(*fptr)(void), unsigned int Z_LockOut, unsigned int Z_BkFr, unsigned int PL_Thsld, unsigned int PL_Hyst);
clemente 7:ba0016258d5d 203 void OrientationDetect( void(*fptr)(void));
clemente 8:7e6013f11b10 204
clemente 8:7e6013f11b10 205 /**
clemente 8:7e6013f11b10 206 * Get the orientation state.
clemente 8:7e6013f11b10 207 *
clemente 8:7e6013f11b10 208 * 0x10: PL_STATUS Register (Read Only)
clemente 8:7e6013f11b10 209 * Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
clemente 8:7e6013f11b10 210 * NEWLP LO — — — LAPO[1] LAPO[0] BAFRO
clemente 8:7e6013f11b10 211 *
clemente 8:7e6013f11b10 212 * NEWLP
clemente 8:7e6013f11b10 213 * Landscape/Portrait status change flag. Default value: 0.
clemente 8:7e6013f11b10 214 * 0: No change, 1: BAFRO and/or LAPO and/or Z-Tilt lockout value has changed
clemente 8:7e6013f11b10 215 * LO
clemente 8:7e6013f11b10 216 * Z-Tilt Angle Lockout. Default value: 0.
clemente 8:7e6013f11b10 217 * 0: Lockout condition has not been detected.
clemente 8:7e6013f11b10 218 * 1: Z-Tilt lockout trip angle has been exceeded. Lockout has been detected.
clemente 8:7e6013f11b10 219 * LAPO[1:0](*)
clemente 8:7e6013f11b10 220 * Landscape/Portrait orientation. Default value: 00
clemente 8:7e6013f11b10 221 * 00: Portrait Up: Equipment standing vertically in the normal orientation
clemente 8:7e6013f11b10 222 * 01: Portrait Down: Equipment standing vertically in the inverted orientation
clemente 8:7e6013f11b10 223 * 10: Landscape Right: Equipment is in landscape mode to the right
clemente 8:7e6013f11b10 224 * 11: Landscape Left: Equipment is in landscape mode to the left.
clemente 8:7e6013f11b10 225 * (*) The default power up state is BAFRO = 0, LAPO = 0, and LO = 0.
clemente 8:7e6013f11b10 226 * BAFRO
clemente 8:7e6013f11b10 227 * Back or Front orientation. Default value: 0
clemente 8:7e6013f11b10 228 * 0: Front: Equipment is in the front facing orientation.
clemente 8:7e6013f11b10 229 * 1: Back: Equipment is in the back facing orientation.
clemente 8:7e6013f11b10 230 */
clemente 8:7e6013f11b10 231 unsigned char GetOrientationState( void);
clemente 8:7e6013f11b10 232
clemente 8:7e6013f11b10 233 /**
clemente 9:2aa9b1668d14 234 * Configure the Accelerometer to generate a IRQ when a new sample is available
clemente 9:2aa9b1668d14 235 *
clemente 9:2aa9b1668d14 236 * @param pointer to the user function to execute after IRQ assertion
clemente 9:2aa9b1668d14 237 * @return none
clemente 9:2aa9b1668d14 238 */
clemente 9:2aa9b1668d14 239 void DataReady( void(*fptr)(void), unsigned char ODR);
clemente 9:2aa9b1668d14 240
clemente 10:fa532bf396fb 241 unsigned int isDataAvailable( void);
clemente 10:fa532bf396fb 242
clemente 9:2aa9b1668d14 243 /**
clemente 8:7e6013f11b10 244 * Soft Reset
clemente 8:7e6013f11b10 245 * @param none
clemente 8:7e6013f11b10 246 * @return none
clemente 8:7e6013f11b10 247 */
clemente 8:7e6013f11b10 248 void Reset( void);
clemente 5:695063448f2a 249
emilmont 0:6149091f755d 250 private:
clemente 5:695063448f2a 251 I2C m_i2c;
clemente 5:695063448f2a 252 int m_addr;
clemente 5:695063448f2a 253 void readRegs(int addr, uint8_t * data, int len);
clemente 5:695063448f2a 254 void writeRegs(uint8_t * data, int len);
clemente 5:695063448f2a 255 int16_t getAccAxis(uint8_t addr);
clemente 5:695063448f2a 256 void Standby( void);
clemente 5:695063448f2a 257 void Active( void);
clemente 5:695063448f2a 258 void Fall_IRQ( void);
clemente 5:695063448f2a 259 void Motion_IRQ( void);
clemente 7:ba0016258d5d 260 void Orientation_IRQ( void);
clemente 9:2aa9b1668d14 261 void DataReady_IRQ( void);
clemente 8:7e6013f11b10 262 //
clemente 8:7e6013f11b10 263 unsigned char OrientationState;
clemente 8:7e6013f11b10 264 unsigned char OrientationStateUpdated;
emilmont 0:6149091f755d 265 };
emilmont 0:6149091f755d 266
emilmont 0:6149091f755d 267 #endif