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:
Tue May 28 17:18:30 2013 +0000
Revision:
8:7e6013f11b10
Parent:
7:ba0016258d5d
Child:
9:2aa9b1668d14
Orientation tested. Freefall need some more tests.

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 6:c52175d13e0a 89
emilmont 0:6149091f755d 90 class MMA8451Q
emilmont 0:6149091f755d 91 {
emilmont 0:6149091f755d 92 public:
clemente 5:695063448f2a 93 /**
clemente 5:695063448f2a 94 * MMA8451Q constructor
clemente 5:695063448f2a 95 *
clemente 5:695063448f2a 96 * @param sda SDA pin
clemente 5:695063448f2a 97 * @param sdl SCL pin
clemente 5:695063448f2a 98 * @param addr addr of the I2C peripheral
clemente 5:695063448f2a 99 */
clemente 5:695063448f2a 100 MMA8451Q(PinName sda, PinName scl, int addr);
clemente 5:695063448f2a 101
clemente 5:695063448f2a 102 /**
clemente 5:695063448f2a 103 * MMA8451Q destructor
clemente 5:695063448f2a 104 */
clemente 5:695063448f2a 105 ~MMA8451Q();
clemente 5:695063448f2a 106
clemente 5:695063448f2a 107 /**
clemente 5:695063448f2a 108 * Get the value of the WHO_AM_I register
clemente 5:695063448f2a 109 *
clemente 5:695063448f2a 110 * @returns WHO_AM_I value
clemente 5:695063448f2a 111 */
clemente 5:695063448f2a 112 uint8_t getWhoAmI();
clemente 5:695063448f2a 113
clemente 5:695063448f2a 114 /**
clemente 5:695063448f2a 115 * Get X axis acceleration
clemente 5:695063448f2a 116 *
clemente 5:695063448f2a 117 * @returns X axis acceleration
clemente 5:695063448f2a 118 */
clemente 5:695063448f2a 119 float getAccX();
clemente 5:695063448f2a 120
clemente 5:695063448f2a 121 /**
clemente 5:695063448f2a 122 * Get Y axis acceleration
clemente 5:695063448f2a 123 *
clemente 5:695063448f2a 124 * @returns Y axis acceleration
clemente 5:695063448f2a 125 */
clemente 5:695063448f2a 126 float getAccY();
clemente 5:695063448f2a 127
clemente 5:695063448f2a 128 /**
clemente 5:695063448f2a 129 * Get Z axis acceleration
clemente 5:695063448f2a 130 *
clemente 5:695063448f2a 131 * @returns Z axis acceleration
clemente 5:695063448f2a 132 */
clemente 5:695063448f2a 133 float getAccZ();
clemente 5:695063448f2a 134
clemente 5:695063448f2a 135 /**
clemente 5:695063448f2a 136 * Get XYZ axis acceleration
clemente 5:695063448f2a 137 *
clemente 5:695063448f2a 138 * @param res array where acceleration data will be stored
clemente 5:695063448f2a 139 */
clemente 5:695063448f2a 140 void getAccAllAxis(float * res);
emilmont 0:6149091f755d 141
clemente 8:7e6013f11b10 142 /**
clemente 8:7e6013f11b10 143 * Configure the Accelerometere for free fall detection
clemente 8:7e6013f11b10 144 *
clemente 8:7e6013f11b10 145 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 146 * @return none
clemente 8:7e6013f11b10 147 */
clemente 8:7e6013f11b10 148 void FreeFallDetection( void(*fptr)(void));
clemente 8:7e6013f11b10 149
clemente 8:7e6013f11b10 150 /**
clemente 8:7e6013f11b10 151 * Configure the Accelerometere for motion detection
clemente 8:7e6013f11b10 152 *
clemente 8:7e6013f11b10 153 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 154 * @return none
clemente 8:7e6013f11b10 155 */
clemente 5:695063448f2a 156 void MotionDetection( void(*fptr)(void));
clemente 8:7e6013f11b10 157
clemente 8:7e6013f11b10 158 /**
clemente 8:7e6013f11b10 159 * Configure the Accelerometere for orientation detection
clemente 8:7e6013f11b10 160 *
clemente 8:7e6013f11b10 161 * @param pointer to the user function to execute after IRQ assertion
clemente 8:7e6013f11b10 162 * @param Z lockout value, Z Backfront, Port/Landscape Thsld, Port/Landscape Hysteresis
clemente 8:7e6013f11b10 163 * @return none
clemente 8:7e6013f11b10 164 */
clemente 7:ba0016258d5d 165 void OrientationDetect( void(*fptr)(void), unsigned int Z_LockOut, unsigned int Z_BkFr, unsigned int PL_Thsld, unsigned int PL_Hyst);
clemente 7:ba0016258d5d 166 void OrientationDetect( void(*fptr)(void));
clemente 8:7e6013f11b10 167
clemente 8:7e6013f11b10 168 /**
clemente 8:7e6013f11b10 169 * Get the orientation state.
clemente 8:7e6013f11b10 170 *
clemente 8:7e6013f11b10 171 * 0x10: PL_STATUS Register (Read Only)
clemente 8:7e6013f11b10 172 * Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
clemente 8:7e6013f11b10 173 * NEWLP LO — — — LAPO[1] LAPO[0] BAFRO
clemente 8:7e6013f11b10 174 *
clemente 8:7e6013f11b10 175 * NEWLP
clemente 8:7e6013f11b10 176 * Landscape/Portrait status change flag. Default value: 0.
clemente 8:7e6013f11b10 177 * 0: No change, 1: BAFRO and/or LAPO and/or Z-Tilt lockout value has changed
clemente 8:7e6013f11b10 178 * LO
clemente 8:7e6013f11b10 179 * Z-Tilt Angle Lockout. Default value: 0.
clemente 8:7e6013f11b10 180 * 0: Lockout condition has not been detected.
clemente 8:7e6013f11b10 181 * 1: Z-Tilt lockout trip angle has been exceeded. Lockout has been detected.
clemente 8:7e6013f11b10 182 * LAPO[1:0](*)
clemente 8:7e6013f11b10 183 * Landscape/Portrait orientation. Default value: 00
clemente 8:7e6013f11b10 184 * 00: Portrait Up: Equipment standing vertically in the normal orientation
clemente 8:7e6013f11b10 185 * 01: Portrait Down: Equipment standing vertically in the inverted orientation
clemente 8:7e6013f11b10 186 * 10: Landscape Right: Equipment is in landscape mode to the right
clemente 8:7e6013f11b10 187 * 11: Landscape Left: Equipment is in landscape mode to the left.
clemente 8:7e6013f11b10 188 * (*) The default power up state is BAFRO = 0, LAPO = 0, and LO = 0.
clemente 8:7e6013f11b10 189 * BAFRO
clemente 8:7e6013f11b10 190 * Back or Front orientation. Default value: 0
clemente 8:7e6013f11b10 191 * 0: Front: Equipment is in the front facing orientation.
clemente 8:7e6013f11b10 192 * 1: Back: Equipment is in the back facing orientation.
clemente 8:7e6013f11b10 193 */
clemente 8:7e6013f11b10 194 unsigned char GetOrientationState( void);
clemente 8:7e6013f11b10 195
clemente 8:7e6013f11b10 196 /**
clemente 8:7e6013f11b10 197 * Soft Reset
clemente 8:7e6013f11b10 198 * @param none
clemente 8:7e6013f11b10 199 * @return none
clemente 8:7e6013f11b10 200 */
clemente 8:7e6013f11b10 201 void Reset( void);
clemente 5:695063448f2a 202
emilmont 0:6149091f755d 203 private:
clemente 5:695063448f2a 204 I2C m_i2c;
clemente 5:695063448f2a 205 int m_addr;
clemente 5:695063448f2a 206 void readRegs(int addr, uint8_t * data, int len);
clemente 5:695063448f2a 207 void writeRegs(uint8_t * data, int len);
clemente 5:695063448f2a 208 int16_t getAccAxis(uint8_t addr);
clemente 5:695063448f2a 209 void Standby( void);
clemente 5:695063448f2a 210 void Active( void);
clemente 5:695063448f2a 211 void Fall_IRQ( void);
clemente 5:695063448f2a 212 void Motion_IRQ( void);
clemente 7:ba0016258d5d 213 void Orientation_IRQ( void);
clemente 8:7e6013f11b10 214 //
clemente 8:7e6013f11b10 215 unsigned char OrientationState;
clemente 8:7e6013f11b10 216 unsigned char OrientationStateUpdated;
emilmont 0:6149091f755d 217 };
emilmont 0:6149091f755d 218
emilmont 0:6149091f755d 219 #endif