Sample program on how to use the LIS3DH sensor on the RAKWireless iTracker module

Committer:
knaresh89
Date:
Mon Feb 12 05:05:29 2018 +0000
Revision:
0:cd96b05ace6e
Sample program on how to use the LIS3DH sensor on the RAKWireless iTracker module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
knaresh89 0:cd96b05ace6e 1 /*
knaresh89 0:cd96b05ace6e 2 * mbed library program
knaresh89 0:cd96b05ace6e 3 * LIS3DH MEMS motion sensor: 3-axis "nano" accelerometer, made by STMicroelectronics
knaresh89 0:cd96b05ace6e 4 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC444/PF250725
knaresh89 0:cd96b05ace6e 5 *
knaresh89 0:cd96b05ace6e 6 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
knaresh89 0:cd96b05ace6e 7 * http://www.page.sannet.ne.jp/kenjia/index.html
knaresh89 0:cd96b05ace6e 8 * http://mbed.org/users/kenjiArai/
knaresh89 0:cd96b05ace6e 9 * Created: July 14th, 2014
knaresh89 0:cd96b05ace6e 10 * Revised: August 23rd, 2017
knaresh89 0:cd96b05ace6e 11 */
knaresh89 0:cd96b05ace6e 12
knaresh89 0:cd96b05ace6e 13 #ifndef LIS3DH_H
knaresh89 0:cd96b05ace6e 14 #define LIS3DH_H
knaresh89 0:cd96b05ace6e 15
knaresh89 0:cd96b05ace6e 16 #include "mbed.h"
knaresh89 0:cd96b05ace6e 17
knaresh89 0:cd96b05ace6e 18 // revision 6 have two bugs, (1) read_mg_data, (2) divided by 15 (16 is coorect value)
knaresh89 0:cd96b05ace6e 19 #define OLD_REV 0 // KEEP 0!! (If you set 1, work as old revision)
knaresh89 0:cd96b05ace6e 20
knaresh89 0:cd96b05ace6e 21 // LIS3DH Address
knaresh89 0:cd96b05ace6e 22 // 7bit address = 0b001100x(0x18 or 0x19 depends on SA0/SDO)
knaresh89 0:cd96b05ace6e 23 #define LIS3DH_G_CHIP_ADDR (0x18 << 1) // SA0(=SDO pin) = Ground
knaresh89 0:cd96b05ace6e 24 #define LIS3DH_V_CHIP_ADDR (0x19 << 1) // SA0(=SDO pin) = Vdd This is the one for itracker module
knaresh89 0:cd96b05ace6e 25
knaresh89 0:cd96b05ace6e 26
knaresh89 0:cd96b05ace6e 27 // LIS3DH ID
knaresh89 0:cd96b05ace6e 28 #define I_AM_LIS3DH 0x33
knaresh89 0:cd96b05ace6e 29
knaresh89 0:cd96b05ace6e 30 // Register's definition
knaresh89 0:cd96b05ace6e 31 #define LIS3DH_STATUS_REG_AUX 0x07
knaresh89 0:cd96b05ace6e 32 #define LIS3DH_OUT_ADC1_L 0x08
knaresh89 0:cd96b05ace6e 33 #define LIS3DH_OUT_ADC1_H 0x09
knaresh89 0:cd96b05ace6e 34 #define LIS3DH_OUT_ADC2_L 0x0a
knaresh89 0:cd96b05ace6e 35 #define LIS3DH_OUT_ADC2_H 0x0b
knaresh89 0:cd96b05ace6e 36 #define LIS3DH_OUT_ADC3_L 0x0c
knaresh89 0:cd96b05ace6e 37 #define LIS3DH_OUT_ADC3_H 0x0d
knaresh89 0:cd96b05ace6e 38 #define LIS3DH_INT_COUNTER_REG 0x0e
knaresh89 0:cd96b05ace6e 39 #define LIS3DH_WHO_AM_I 0x0f
knaresh89 0:cd96b05ace6e 40 #define LIS3DH_TEMP_CFG_REG 0x1f
knaresh89 0:cd96b05ace6e 41 #define LIS3DH_CTRL_REG1 0x20
knaresh89 0:cd96b05ace6e 42 #define LIS3DH_CTRL_REG2 0x21
knaresh89 0:cd96b05ace6e 43 #define LIS3DH_CTRL_REG3 0x22
knaresh89 0:cd96b05ace6e 44 #define LIS3DH_CTRL_REG4 0x23
knaresh89 0:cd96b05ace6e 45 #define LIS3DH_CTRL_REG5 0x24
knaresh89 0:cd96b05ace6e 46 #define LIS3DH_CTRL_REG6 0x25
knaresh89 0:cd96b05ace6e 47 #define LIS3DH_REFERENCE 0x26
knaresh89 0:cd96b05ace6e 48 #define LIS3DH_STATUS_REG 0x27
knaresh89 0:cd96b05ace6e 49 #define LIS3DH_OUT_X_L 0x28
knaresh89 0:cd96b05ace6e 50 #define LIS3DH_OUT_X_H 0x29
knaresh89 0:cd96b05ace6e 51 #define LIS3DH_OUT_Y_L 0x2a
knaresh89 0:cd96b05ace6e 52 #define LIS3DH_OUT_Y_H 0x2b
knaresh89 0:cd96b05ace6e 53 #define LIS3DH_OUT_Z_L 0x2c
knaresh89 0:cd96b05ace6e 54 #define LIS3DH_OUT_Z_H 0x2d
knaresh89 0:cd96b05ace6e 55 #define LIS3DH_FIFO_CTRL_REG 0x2e
knaresh89 0:cd96b05ace6e 56 #define LIS3DH_FIFO_SRC_REG 0x2f
knaresh89 0:cd96b05ace6e 57 #define LIS3DH_INT1_CFG 0x30
knaresh89 0:cd96b05ace6e 58 #define LIS3DH_INT1_SOURCE 0x31
knaresh89 0:cd96b05ace6e 59 #define LIS3DH_INT1_THS 0x32
knaresh89 0:cd96b05ace6e 60 #define LIS3DH_INT1_DURATION 0x33
knaresh89 0:cd96b05ace6e 61 #define LIS3DH_CLICK_CFG 0x38
knaresh89 0:cd96b05ace6e 62 #define LIS3DH_CLICK_SRC 0x39
knaresh89 0:cd96b05ace6e 63 #define LIS3DH_CLICK_THS 0x3a
knaresh89 0:cd96b05ace6e 64 #define LIS3DH_TIME_LIMIT 0x3b
knaresh89 0:cd96b05ace6e 65 #define LIS3DH_TIME_LATENCY 0x3c
knaresh89 0:cd96b05ace6e 66 #define LIS3DH_TIME_WINDOW 0x3d
knaresh89 0:cd96b05ace6e 67
knaresh89 0:cd96b05ace6e 68 // Output Data Rate (ODR)
knaresh89 0:cd96b05ace6e 69 #define LIS3DH_DR_PWRDWN 0
knaresh89 0:cd96b05ace6e 70 #define LIS3DH_DR_NR_LP_1HZ 1
knaresh89 0:cd96b05ace6e 71 #define LIS3DH_DR_NR_LP_10HZ 2
knaresh89 0:cd96b05ace6e 72 #define LIS3DH_DR_NR_LP_25HZ 3
knaresh89 0:cd96b05ace6e 73 #define LIS3DH_DR_NR_LP_50HZ 4
knaresh89 0:cd96b05ace6e 74 #define LIS3DH_DR_NR_LP_100HZ 5
knaresh89 0:cd96b05ace6e 75 #define LIS3DH_DR_NR_LP_200HZ 6
knaresh89 0:cd96b05ace6e 76 #define LIS3DH_DR_NR_LP_400HZ 7
knaresh89 0:cd96b05ace6e 77 #define LIS3DH_DR_LP_1R6KHZ 8
knaresh89 0:cd96b05ace6e 78 #define LIS3DH_DR_NR_1R25KHZ 9
knaresh89 0:cd96b05ace6e 79
knaresh89 0:cd96b05ace6e 80 // Bandwidth (Low pass)
knaresh89 0:cd96b05ace6e 81 #define LIS3DH_BW_LOW 0
knaresh89 0:cd96b05ace6e 82 #define LIS3DH_BW_M_LOW 1
knaresh89 0:cd96b05ace6e 83 #define LIS3DH_BW_M_HI 2
knaresh89 0:cd96b05ace6e 84 #define LIS3DH_BW_HI 3
knaresh89 0:cd96b05ace6e 85
knaresh89 0:cd96b05ace6e 86 // Low power mode enable/disable
knaresh89 0:cd96b05ace6e 87 #define LIS3DH_LP_EN 0
knaresh89 0:cd96b05ace6e 88 #define LIS3DH_LP_DIS 1
knaresh89 0:cd96b05ace6e 89
knaresh89 0:cd96b05ace6e 90 // Axis control
knaresh89 0:cd96b05ace6e 91 #define LIS3DH_X_EN 1
knaresh89 0:cd96b05ace6e 92 #define LIS3DH_X_DIS 0
knaresh89 0:cd96b05ace6e 93 #define LIS3DH_Y_EN 1
knaresh89 0:cd96b05ace6e 94 #define LIS3DH_Y_DIS 0
knaresh89 0:cd96b05ace6e 95 #define LIS3DH_Z_EN 1
knaresh89 0:cd96b05ace6e 96 #define LIS3DH_Z_DIS 0
knaresh89 0:cd96b05ace6e 97
knaresh89 0:cd96b05ace6e 98 // Full Scale
knaresh89 0:cd96b05ace6e 99 #define LIS3DH_FS_2G 0
knaresh89 0:cd96b05ace6e 100 #define LIS3DH_FS_4G 1
knaresh89 0:cd96b05ace6e 101 #define LIS3DH_FS_8G 2
knaresh89 0:cd96b05ace6e 102 #define LIS3DH_FS_16G 3
knaresh89 0:cd96b05ace6e 103
knaresh89 0:cd96b05ace6e 104 // definition for Nomalization
knaresh89 0:cd96b05ace6e 105 #if OLD_REV
knaresh89 0:cd96b05ace6e 106 #define LIS3DH_SENSITIVITY_2G (0.001F)
knaresh89 0:cd96b05ace6e 107 #define LIS3DH_SENSITIVITY_4G (0.002F)
knaresh89 0:cd96b05ace6e 108 #define LIS3DH_SENSITIVITY_8G (0.004F)
knaresh89 0:cd96b05ace6e 109 #define LIS3DH_SENSITIVITY_16G (0.012F)
knaresh89 0:cd96b05ace6e 110 #else
knaresh89 0:cd96b05ace6e 111 #define LIS3DH_SENSITIVITY_2G 1
knaresh89 0:cd96b05ace6e 112 #define LIS3DH_SENSITIVITY_4G 2
knaresh89 0:cd96b05ace6e 113 #define LIS3DH_SENSITIVITY_8G 4
knaresh89 0:cd96b05ace6e 114 #define LIS3DH_SENSITIVITY_16G 12
knaresh89 0:cd96b05ace6e 115 #endif
knaresh89 0:cd96b05ace6e 116
knaresh89 0:cd96b05ace6e 117 //Gravity at Earth's surface in m/s/s
knaresh89 0:cd96b05ace6e 118 #if OLD_REV
knaresh89 0:cd96b05ace6e 119 #define GRAVITY (9.80665F)
knaresh89 0:cd96b05ace6e 120 #else
knaresh89 0:cd96b05ace6e 121 #define GRAVITY (9.80665F / 1000)
knaresh89 0:cd96b05ace6e 122 #endif
knaresh89 0:cd96b05ace6e 123
knaresh89 0:cd96b05ace6e 124 /** Interface for STMicronics MEMS motion sensor: 3-axis "nano" accelerometer
knaresh89 0:cd96b05ace6e 125 * Chip: LIS3DH
knaresh89 0:cd96b05ace6e 126 *
knaresh89 0:cd96b05ace6e 127 * @code
knaresh89 0:cd96b05ace6e 128 * #include "mbed.h"
knaresh89 0:cd96b05ace6e 129 *
knaresh89 0:cd96b05ace6e 130 * // I2C Communication
knaresh89 0:cd96b05ace6e 131 * LIS3DH acc(p_sda, p_scl, chip_addr, datarate, bandwidth, fullscale);
knaresh89 0:cd96b05ace6e 132 * // If you connected I2C line not only this device but also other devices,
knaresh89 0:cd96b05ace6e 133 * // you need to declare following method.
knaresh89 0:cd96b05ace6e 134 * I2C i2c(dp5,dp27); // SDA, SCL
knaresh89 0:cd96b05ace6e 135 * LIS3DH acc(i2c, chip_addr, datarate, bandwidth, fullscale);
knaresh89 0:cd96b05ace6e 136 *
knaresh89 0:cd96b05ace6e 137 * int main() {
knaresh89 0:cd96b05ace6e 138 * float f[3];
knaresh89 0:cd96b05ace6e 139 *
knaresh89 0:cd96b05ace6e 140 * if (acc.read_id() == I_AM_LIS3DH){
knaresh89 0:cd96b05ace6e 141 * acc.read_data(f);
knaresh89 0:cd96b05ace6e 142 * }
knaresh89 0:cd96b05ace6e 143 * }
knaresh89 0:cd96b05ace6e 144 * @endcode
knaresh89 0:cd96b05ace6e 145 */
knaresh89 0:cd96b05ace6e 146
knaresh89 0:cd96b05ace6e 147 class LIS3DH
knaresh89 0:cd96b05ace6e 148 {
knaresh89 0:cd96b05ace6e 149 public:
knaresh89 0:cd96b05ace6e 150 /** Configure data pin
knaresh89 0:cd96b05ace6e 151 * @param data SDA and SCL pins
knaresh89 0:cd96b05ace6e 152 * @param device address LIS3DH(SA0=0 or 1), LIS3DH_G_CHIP_ADDR or LIS3DH_V_CHIP_ADDR
knaresh89 0:cd96b05ace6e 153 * @param output data rate selection, power down mode, 1Hz to 5KHz
knaresh89 0:cd96b05ace6e 154 * @param full scale selection, +/-2g to +/-16g
knaresh89 0:cd96b05ace6e 155 */
knaresh89 0:cd96b05ace6e 156 LIS3DH(PinName p_sda, PinName p_scl,
knaresh89 0:cd96b05ace6e 157 uint8_t addr, uint8_t data_rate, uint8_t fullscale);
knaresh89 0:cd96b05ace6e 158
knaresh89 0:cd96b05ace6e 159 /** Configure data pin
knaresh89 0:cd96b05ace6e 160 * @param data SDA and SCL pins
knaresh89 0:cd96b05ace6e 161 * @param device address LIS3DH(SA0=0 or 1), LIS3DH_G_CHIP_ADDR or LIS3DH_V_CHIP_ADDR
knaresh89 0:cd96b05ace6e 162 * @default output data rate selection = 50Hz
knaresh89 0:cd96b05ace6e 163 * @default full scale selection = +/-8g
knaresh89 0:cd96b05ace6e 164 */
knaresh89 0:cd96b05ace6e 165 LIS3DH(PinName p_sda, PinName p_scl, uint8_t addr);
knaresh89 0:cd96b05ace6e 166
knaresh89 0:cd96b05ace6e 167 /** Configure data pin (with other devices on I2C line)
knaresh89 0:cd96b05ace6e 168 * @param I2C previous definition
knaresh89 0:cd96b05ace6e 169 * @param other parameters -> please see LIS3DH(PinName p_sda, PinName p_scl,...)
knaresh89 0:cd96b05ace6e 170 */
knaresh89 0:cd96b05ace6e 171 LIS3DH(I2C& p_i2c,
knaresh89 0:cd96b05ace6e 172 uint8_t addr, uint8_t data_rate, uint8_t fullscale);
knaresh89 0:cd96b05ace6e 173
knaresh89 0:cd96b05ace6e 174 /** Configure data pin (with other devices on I2C line)
knaresh89 0:cd96b05ace6e 175 * @param I2C previous definition
knaresh89 0:cd96b05ace6e 176 * @param other parameters -> please see LIS3DH(PinName p_sda, PinName p_scl,...)
knaresh89 0:cd96b05ace6e 177 * @default output data rate selection = 50Hz
knaresh89 0:cd96b05ace6e 178 * @default full scale selection = +/-8g
knaresh89 0:cd96b05ace6e 179 */
knaresh89 0:cd96b05ace6e 180 LIS3DH(I2C& p_i2c, uint8_t addr);
knaresh89 0:cd96b05ace6e 181
knaresh89 0:cd96b05ace6e 182 /** Read a float type data from acc
knaresh89 0:cd96b05ace6e 183 * @param float type of three arry's address, e.g. float dt_usr[3];
knaresh89 0:cd96b05ace6e 184 * @return acc motion data unit: m/s/s(m/s2)
knaresh89 0:cd96b05ace6e 185 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
knaresh89 0:cd96b05ace6e 186 */
knaresh89 0:cd96b05ace6e 187 void read_data(float *dt_usr);
knaresh89 0:cd96b05ace6e 188
knaresh89 0:cd96b05ace6e 189 /** Read a float type data from acc
knaresh89 0:cd96b05ace6e 190 * @param float type of three arry's address, e.g. float dt_usr[3];
knaresh89 0:cd96b05ace6e 191 * @return acc motion data unit: mg
knaresh89 0:cd96b05ace6e 192 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
knaresh89 0:cd96b05ace6e 193 */
knaresh89 0:cd96b05ace6e 194 void read_mg_data(float *dt_usr);
knaresh89 0:cd96b05ace6e 195
knaresh89 0:cd96b05ace6e 196 /** Read a acc ID number
knaresh89 0:cd96b05ace6e 197 * @param none
knaresh89 0:cd96b05ace6e 198 * @return if STM MEMS acc, it should be I_AM_ LIS3DH(0x33)
knaresh89 0:cd96b05ace6e 199 */
knaresh89 0:cd96b05ace6e 200 uint8_t read_id();
knaresh89 0:cd96b05ace6e 201
knaresh89 0:cd96b05ace6e 202 /** Read Data Ready flag
knaresh89 0:cd96b05ace6e 203 * @param none
knaresh89 0:cd96b05ace6e 204 * @return 1 = Ready
knaresh89 0:cd96b05ace6e 205 */
knaresh89 0:cd96b05ace6e 206 uint8_t data_ready();
knaresh89 0:cd96b05ace6e 207
knaresh89 0:cd96b05ace6e 208 /** Set I2C clock frequency
knaresh89 0:cd96b05ace6e 209 * @param freq.
knaresh89 0:cd96b05ace6e 210 * @return none
knaresh89 0:cd96b05ace6e 211 */
knaresh89 0:cd96b05ace6e 212 void frequency(int hz);
knaresh89 0:cd96b05ace6e 213
knaresh89 0:cd96b05ace6e 214 /** Read register (general purpose)
knaresh89 0:cd96b05ace6e 215 * @param register's address
knaresh89 0:cd96b05ace6e 216 * @return register data
knaresh89 0:cd96b05ace6e 217 */
knaresh89 0:cd96b05ace6e 218 uint8_t read_reg(uint8_t addr);
knaresh89 0:cd96b05ace6e 219
knaresh89 0:cd96b05ace6e 220 /** Write register (general purpose)
knaresh89 0:cd96b05ace6e 221 * @param register's address
knaresh89 0:cd96b05ace6e 222 * @param data
knaresh89 0:cd96b05ace6e 223 * @return none
knaresh89 0:cd96b05ace6e 224 */
knaresh89 0:cd96b05ace6e 225 void write_reg(uint8_t addr, uint8_t data);
knaresh89 0:cd96b05ace6e 226
knaresh89 0:cd96b05ace6e 227 protected:
knaresh89 0:cd96b05ace6e 228 void initialize(uint8_t, uint8_t, uint8_t);
knaresh89 0:cd96b05ace6e 229 void read_reg_data(char *data);
knaresh89 0:cd96b05ace6e 230
knaresh89 0:cd96b05ace6e 231 I2C *_i2c_p;
knaresh89 0:cd96b05ace6e 232 I2C &_i2c;
knaresh89 0:cd96b05ace6e 233
knaresh89 0:cd96b05ace6e 234 private:
knaresh89 0:cd96b05ace6e 235 #if OLD_REV
knaresh89 0:cd96b05ace6e 236 float fs_factor; // full scale factor
knaresh89 0:cd96b05ace6e 237 #else
knaresh89 0:cd96b05ace6e 238 uint8_t fs_factor; // full scale factor
knaresh89 0:cd96b05ace6e 239 #endif
knaresh89 0:cd96b05ace6e 240 char dt[2]; // working buffer
knaresh89 0:cd96b05ace6e 241 uint8_t acc_addr; // acc sensor address
knaresh89 0:cd96b05ace6e 242 uint8_t acc_id; // acc ID
knaresh89 0:cd96b05ace6e 243 uint8_t acc_ready; // acc is on I2C line = 1, not = 0
knaresh89 0:cd96b05ace6e 244 };
knaresh89 0:cd96b05ace6e 245
knaresh89 0:cd96b05ace6e 246 #endif // LIS3DH_H
knaresh89 0:cd96b05ace6e 247