Ok

Dependencies:   mbed_rtos_types Mutex mbed_rtos_storage mbed Semaphore

Committer:
daniwestside
Date:
Wed Nov 27 11:16:17 2019 +0000
Branch:
Sinthreads
Revision:
1:c9ef27da97b5
Parent:
0:85df64b421a8
Ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniwestside 0:85df64b421a8 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
daniwestside 0:85df64b421a8 2 *
daniwestside 0:85df64b421a8 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
daniwestside 0:85df64b421a8 4 * and associated documentation files (the "Software"), to deal in the Software without
daniwestside 0:85df64b421a8 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
daniwestside 0:85df64b421a8 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
daniwestside 0:85df64b421a8 7 * Software is furnished to do so, subject to the following conditions:
daniwestside 0:85df64b421a8 8 *
daniwestside 0:85df64b421a8 9 * The above copyright notice and this permission notice shall be included in all copies or
daniwestside 0:85df64b421a8 10 * substantial portions of the Software.
daniwestside 0:85df64b421a8 11 *
daniwestside 0:85df64b421a8 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
daniwestside 0:85df64b421a8 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
daniwestside 0:85df64b421a8 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
daniwestside 0:85df64b421a8 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
daniwestside 0:85df64b421a8 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
daniwestside 0:85df64b421a8 17 */
daniwestside 0:85df64b421a8 18
daniwestside 0:85df64b421a8 19 #ifndef MMA8451Q_H
daniwestside 0:85df64b421a8 20 #define MMA8451Q_H
daniwestside 0:85df64b421a8 21
daniwestside 0:85df64b421a8 22 #include "mbed.h"
daniwestside 0:85df64b421a8 23
daniwestside 0:85df64b421a8 24 /**
daniwestside 0:85df64b421a8 25 * MMA8451Q accelerometer example
daniwestside 0:85df64b421a8 26 *
daniwestside 0:85df64b421a8 27 * @code
daniwestside 0:85df64b421a8 28 * #include "mbed.h"
daniwestside 0:85df64b421a8 29 * #include "MMA8451Q.h"
daniwestside 0:85df64b421a8 30 *
daniwestside 0:85df64b421a8 31 * #define MMA8451_I2C_ADDRESS (0x1d<<1)
daniwestside 0:85df64b421a8 32 *
daniwestside 0:85df64b421a8 33 * int main(void) {
daniwestside 0:85df64b421a8 34 *
daniwestside 0:85df64b421a8 35 * MMA8451Q acc(P_E25, P_E24, MMA8451_I2C_ADDRESS);
daniwestside 0:85df64b421a8 36 * PwmOut rled(LED_RED);
daniwestside 0:85df64b421a8 37 * PwmOut gled(LED_GREEN);
daniwestside 0:85df64b421a8 38 * PwmOut bled(LED_BLUE);
daniwestside 0:85df64b421a8 39 *
daniwestside 0:85df64b421a8 40 * while (true) {
daniwestside 0:85df64b421a8 41 * rled = 1.0 - abs(acc.getAccX());
daniwestside 0:85df64b421a8 42 * gled = 1.0 - abs(acc.getAccY());
daniwestside 0:85df64b421a8 43 * bled = 1.0 - abs(acc.getAccZ());
daniwestside 0:85df64b421a8 44 * wait(0.1);
daniwestside 0:85df64b421a8 45 * }
daniwestside 0:85df64b421a8 46 * }
daniwestside 0:85df64b421a8 47 * @endcode
daniwestside 0:85df64b421a8 48 */
daniwestside 0:85df64b421a8 49 class MMA8451Q
daniwestside 0:85df64b421a8 50 {
daniwestside 0:85df64b421a8 51 public:
daniwestside 0:85df64b421a8 52 /**
daniwestside 0:85df64b421a8 53 * MMA8451Q constructor
daniwestside 0:85df64b421a8 54 *
daniwestside 0:85df64b421a8 55 * @param sda SDA pin
daniwestside 0:85df64b421a8 56 * @param sdl SCL pin
daniwestside 0:85df64b421a8 57 * @param addr addr of the I2C peripheral
daniwestside 0:85df64b421a8 58 */
daniwestside 0:85df64b421a8 59 MMA8451Q(PinName sda, PinName scl, int addr);
daniwestside 0:85df64b421a8 60
daniwestside 0:85df64b421a8 61 /**
daniwestside 0:85df64b421a8 62 * MMA8451Q destructor
daniwestside 0:85df64b421a8 63 */
daniwestside 0:85df64b421a8 64 ~MMA8451Q();
daniwestside 0:85df64b421a8 65
daniwestside 0:85df64b421a8 66 /**
daniwestside 0:85df64b421a8 67 * Get the value of the WHO_AM_I register
daniwestside 0:85df64b421a8 68 *
daniwestside 0:85df64b421a8 69 * @returns WHO_AM_I value
daniwestside 0:85df64b421a8 70 */
daniwestside 0:85df64b421a8 71 uint8_t getWhoAmI();
daniwestside 0:85df64b421a8 72
daniwestside 0:85df64b421a8 73 /**
daniwestside 0:85df64b421a8 74 * Get X axis acceleration
daniwestside 0:85df64b421a8 75 *
daniwestside 0:85df64b421a8 76 * @returns X axis acceleration
daniwestside 0:85df64b421a8 77 */
daniwestside 0:85df64b421a8 78 float getAccX();
daniwestside 0:85df64b421a8 79
daniwestside 0:85df64b421a8 80 /**
daniwestside 0:85df64b421a8 81 * Get Y axis acceleration
daniwestside 0:85df64b421a8 82 *
daniwestside 0:85df64b421a8 83 * @returns Y axis acceleration
daniwestside 0:85df64b421a8 84 */
daniwestside 0:85df64b421a8 85 float getAccY();
daniwestside 0:85df64b421a8 86
daniwestside 0:85df64b421a8 87 /**
daniwestside 0:85df64b421a8 88 * Get Z axis acceleration
daniwestside 0:85df64b421a8 89 *
daniwestside 0:85df64b421a8 90 * @returns Z axis acceleration
daniwestside 0:85df64b421a8 91 */
daniwestside 0:85df64b421a8 92 float getAccZ();
daniwestside 0:85df64b421a8 93
daniwestside 0:85df64b421a8 94 /**
daniwestside 0:85df64b421a8 95 * Get XYZ axis acceleration
daniwestside 0:85df64b421a8 96 *
daniwestside 0:85df64b421a8 97 * @param res array where acceleration data will be stored
daniwestside 0:85df64b421a8 98 */
daniwestside 0:85df64b421a8 99 void getAccAllAxis(float * res);
daniwestside 0:85df64b421a8 100
daniwestside 0:85df64b421a8 101 private:
daniwestside 0:85df64b421a8 102 I2C m_i2c;
daniwestside 0:85df64b421a8 103 int m_addr;
daniwestside 0:85df64b421a8 104 void readRegs(int addr, uint8_t * data, int len);
daniwestside 0:85df64b421a8 105 void writeRegs(uint8_t * data, int len);
daniwestside 0:85df64b421a8 106 int16_t getAccAxis(uint8_t addr);
daniwestside 0:85df64b421a8 107
daniwestside 0:85df64b421a8 108 };
daniwestside 0:85df64b421a8 109 #define REG_WHO_AM_I 0x0D
daniwestside 0:85df64b421a8 110 #define REG_CTRL_REG_1 0x2A
daniwestside 0:85df64b421a8 111 #define REG_OUT_X_MSB 0x01
daniwestside 0:85df64b421a8 112 #define REG_OUT_Y_MSB 0x03
daniwestside 0:85df64b421a8 113 #define REG_OUT_Z_MSB 0x05
daniwestside 0:85df64b421a8 114 #define MMA8451_I2C_ADDRESS (0x1d<<1)
daniwestside 0:85df64b421a8 115
daniwestside 0:85df64b421a8 116 #define UINT14_MAX 16383
daniwestside 0:85df64b421a8 117
daniwestside 0:85df64b421a8 118
daniwestside 0:85df64b421a8 119 MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
daniwestside 0:85df64b421a8 120 // activate the peripheral
daniwestside 0:85df64b421a8 121 uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
daniwestside 0:85df64b421a8 122 writeRegs(data, 2);
daniwestside 0:85df64b421a8 123 }
daniwestside 0:85df64b421a8 124 MMA8451Q::~MMA8451Q() { }
daniwestside 0:85df64b421a8 125
daniwestside 0:85df64b421a8 126 uint8_t MMA8451Q::getWhoAmI() {
daniwestside 0:85df64b421a8 127 uint8_t who_am_i = 0;
daniwestside 0:85df64b421a8 128 readRegs(REG_WHO_AM_I, &who_am_i, 1);
daniwestside 0:85df64b421a8 129 return who_am_i;
daniwestside 0:85df64b421a8 130 }
daniwestside 0:85df64b421a8 131
daniwestside 0:85df64b421a8 132 float MMA8451Q::getAccX() {
daniwestside 0:85df64b421a8 133 return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
daniwestside 0:85df64b421a8 134 }
daniwestside 0:85df64b421a8 135
daniwestside 0:85df64b421a8 136 float MMA8451Q::getAccY() {
daniwestside 0:85df64b421a8 137 return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
daniwestside 0:85df64b421a8 138 }
daniwestside 0:85df64b421a8 139
daniwestside 0:85df64b421a8 140 float MMA8451Q::getAccZ() {
daniwestside 0:85df64b421a8 141 return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
daniwestside 0:85df64b421a8 142 }
daniwestside 0:85df64b421a8 143
daniwestside 0:85df64b421a8 144 void MMA8451Q::getAccAllAxis(float * res) {
daniwestside 0:85df64b421a8 145 res[0] = getAccX();
daniwestside 0:85df64b421a8 146 res[1] = getAccY();
daniwestside 0:85df64b421a8 147 res[2] = getAccZ();
daniwestside 0:85df64b421a8 148 }
daniwestside 0:85df64b421a8 149
daniwestside 0:85df64b421a8 150 int16_t MMA8451Q::getAccAxis(uint8_t addr) {
daniwestside 0:85df64b421a8 151 int16_t acc;
daniwestside 0:85df64b421a8 152 uint8_t res[2];
daniwestside 0:85df64b421a8 153 readRegs(addr, res, 2);
daniwestside 0:85df64b421a8 154
daniwestside 0:85df64b421a8 155 acc = (res[0] << 6) | (res[1] >> 2);
daniwestside 0:85df64b421a8 156 if (acc > UINT14_MAX/2)
daniwestside 0:85df64b421a8 157 acc -= UINT14_MAX;
daniwestside 0:85df64b421a8 158
daniwestside 0:85df64b421a8 159 return acc;
daniwestside 0:85df64b421a8 160 }
daniwestside 0:85df64b421a8 161
daniwestside 0:85df64b421a8 162 void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {
daniwestside 0:85df64b421a8 163 char t[1] = {addr};
daniwestside 0:85df64b421a8 164 m_i2c.write(m_addr, t, 1, true);
daniwestside 0:85df64b421a8 165 m_i2c.read(m_addr, (char *)data, len);
daniwestside 0:85df64b421a8 166 }
daniwestside 0:85df64b421a8 167
daniwestside 0:85df64b421a8 168 void MMA8451Q::writeRegs(uint8_t * data, int len) {
daniwestside 0:85df64b421a8 169 m_i2c.write(m_addr, (char *)data, len);
daniwestside 0:85df64b421a8 170 }
daniwestside 0:85df64b421a8 171 #endif
daniwestside 0:85df64b421a8 172