L3GD20 & L3G4200D / STMicroelectronics / MEMS motion sensor, three-axis gyroscope library

Dependents:   GR-PEACH_test_wo_rtos GR-PEACH_test_on_rtos_works_well

Committer:
kenjiArai
Date:
Tue Feb 24 12:21:41 2015 +0000
Revision:
5:81fc00bd76fe
Parent:
4:7d0cec583aa3
Child:
6:451811697299
unified format, data name and others, added function call

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:de66621e5370 1 /*
kenjiArai 0:de66621e5370 2 * mbed library program
kenjiArai 0:de66621e5370 3 * L3GD20 MEMS motion sensor: 3-axis digital gyroscope, made by STMicroelectronics
kenjiArai 0:de66621e5370 4 * http://www.st.com/web/catalog/sense_power/FM89/SC1288
kenjiArai 0:de66621e5370 5 * /PF252443?sc=internet/analog/product/252443.jsp
kenjiArai 0:de66621e5370 6 * L3G4200D MEMS motion sensor: three-axis digital output gyroscope, made by STMicroelectronics
kenjiArai 0:de66621e5370 7 * http://www.st.com/web/catalog/sense_power/FM89/SC1288
kenjiArai 0:de66621e5370 8 * /PF250373?sc=internet/analog/product/250373.jsp
kenjiArai 0:de66621e5370 9 *
kenjiArai 5:81fc00bd76fe 10 * Copyright (c) 2014,'15 Kenji Arai / JH1PJL
kenjiArai 0:de66621e5370 11 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:de66621e5370 12 * http://mbed.org/users/kenjiArai/
kenjiArai 0:de66621e5370 13 * Created: July 13th, 2014
kenjiArai 5:81fc00bd76fe 14 * Revised: Feburary 24th, 2015
kenjiArai 0:de66621e5370 15 *
kenjiArai 0:de66621e5370 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:de66621e5370 17 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:de66621e5370 18 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:de66621e5370 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:de66621e5370 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:de66621e5370 21 */
kenjiArai 0:de66621e5370 22
kenjiArai 0:de66621e5370 23 #ifndef L3GD20_GYRO_H
kenjiArai 0:de66621e5370 24 #define L3GD20_GYRO_H
kenjiArai 0:de66621e5370 25
kenjiArai 0:de66621e5370 26 #include "mbed.h"
kenjiArai 0:de66621e5370 27
kenjiArai 0:de66621e5370 28 // L3G4200DMEMS Address
kenjiArai 0:de66621e5370 29 // 7bit address = 0b110100x(0x68 or 0x69 depends on SA0/SDO)
kenjiArai 5:81fc00bd76fe 30 #define L3G4200D_G_CHIP_ADDR (0x68 << 1) // SA0(=SDO pin) = Ground
kenjiArai 5:81fc00bd76fe 31 #define L3G4200D_V_CHIP_ADDR (0x69 << 1) // SA0(=SDO pin) = Vdd
kenjiArai 0:de66621e5370 32 // L3GD20MEMS Address
kenjiArai 0:de66621e5370 33 // 7bit address = 0b110101x(0x6a or 0x6b depends on SA0/SDO)
kenjiArai 5:81fc00bd76fe 34 #define L3GD20_G_CHIP_ADDR (0x6a << 1) // SA0(=SDO pin) = Ground
kenjiArai 5:81fc00bd76fe 35 #define L3GD20_V_CHIP_ADDR (0x6b << 1) // SA0(=SDO pin) = Vdd
kenjiArai 0:de66621e5370 36
kenjiArai 0:de66621e5370 37 // L3G4200DMEMS ID
kenjiArai 5:81fc00bd76fe 38 #define I_AM_L3G4200D 0xd3
kenjiArai 0:de66621e5370 39 // L3GD20MEMS ID
kenjiArai 5:81fc00bd76fe 40 #define I_AM_L3GD20 0xd4
kenjiArai 0:de66621e5370 41
kenjiArai 0:de66621e5370 42 // Register's definition
kenjiArai 0:de66621e5370 43 #define L3GX_WHO_AM_I 0x0f
kenjiArai 0:de66621e5370 44 #define L3GX_CTRL_REG1 0x20
kenjiArai 0:de66621e5370 45 #define L3GX_CTRL_REG2 0x21
kenjiArai 0:de66621e5370 46 #define L3GX_CTRL_REG3 0x22
kenjiArai 0:de66621e5370 47 #define L3GX_CTRL_REG4 0x23
kenjiArai 0:de66621e5370 48 #define L3GX_CTRL_REG5 0x24
kenjiArai 0:de66621e5370 49 #define L3GX_REFERENCE 0x25
kenjiArai 0:de66621e5370 50 #define L3GX_OUT_TEMP 0x26
kenjiArai 0:de66621e5370 51 #define L3GX_STATUS_REG 0x27
kenjiArai 0:de66621e5370 52 #define L3GX_OUT_X_L 0x28
kenjiArai 0:de66621e5370 53 #define L3GX_OUT_X_H 0x29
kenjiArai 0:de66621e5370 54 #define L3GX_OUT_Y_L 0x2a
kenjiArai 0:de66621e5370 55 #define L3GX_OUT_Y_H 0x2b
kenjiArai 0:de66621e5370 56 #define L3GX_OUT_Z_L 0x2c
kenjiArai 0:de66621e5370 57 #define L3GX_OUT_Z_H 0x2d
kenjiArai 0:de66621e5370 58 #define L3GX_FIFO_CTRL_REG 0x2e
kenjiArai 0:de66621e5370 59 #define L3GX_FIFO_SRC_REG 0x2f
kenjiArai 0:de66621e5370 60 #define L3GX_INT1_CFG 0x30
kenjiArai 0:de66621e5370 61 #define L3GX_INT1_SRC 0x31
kenjiArai 0:de66621e5370 62 #define L3GX_INT1_TSH_XH 0x32
kenjiArai 0:de66621e5370 63 #define L3GX_INT1_TSH_XL 0x33
kenjiArai 0:de66621e5370 64 #define L3GX_INT1_TSH_YH 0x34
kenjiArai 0:de66621e5370 65 #define L3GX_INT1_TSH_YL 0x35
kenjiArai 0:de66621e5370 66 #define L3GX_INT1_TSH_ZH 0x36
kenjiArai 0:de66621e5370 67 #define L3GX_INT1_TSH_ZL 0x37
kenjiArai 0:de66621e5370 68 #define L3GX_INT1_DURATION 0x38
kenjiArai 0:de66621e5370 69
kenjiArai 0:de66621e5370 70 // Output Data Rate (ODR)
kenjiArai 0:de66621e5370 71 // L3G4200DMEMS
kenjiArai 0:de66621e5370 72 #define L3GX_DR_100HZ 0
kenjiArai 0:de66621e5370 73 #define L3GX_DR_200HZ 1
kenjiArai 0:de66621e5370 74 #define L3GX_DR_400HZ 2
kenjiArai 0:de66621e5370 75 #define L3GX_DR_800HZ 3
kenjiArai 0:de66621e5370 76 // L3GD20MEMS
kenjiArai 0:de66621e5370 77 #define L3GX_DR_95HZ 0
kenjiArai 0:de66621e5370 78 #define L3GX_DR_190HZ 1
kenjiArai 0:de66621e5370 79 #define L3GX_DR_380HZ 2
kenjiArai 0:de66621e5370 80 #define L3GX_DR_760HZ 3
kenjiArai 0:de66621e5370 81
kenjiArai 0:de66621e5370 82 // Bandwidth (Low pass)
kenjiArai 0:de66621e5370 83 #define L3GX_BW_LOW 0
kenjiArai 0:de66621e5370 84 #define L3GX_BW_M_LOW 1
kenjiArai 0:de66621e5370 85 #define L3GX_BW_M_HI 2
kenjiArai 0:de66621e5370 86 #define L3GX_BW_HI 3
kenjiArai 0:de66621e5370 87
kenjiArai 0:de66621e5370 88 // Power-down mode enable/disable
kenjiArai 0:de66621e5370 89 #define L3GX_PD_EN 0
kenjiArai 0:de66621e5370 90 #define L3GX_PD_DIS 1
kenjiArai 0:de66621e5370 91
kenjiArai 0:de66621e5370 92 // Axis control
kenjiArai 0:de66621e5370 93 #define L3GX_X_EN 1
kenjiArai 0:de66621e5370 94 #define L3GX_X_DIS 0
kenjiArai 0:de66621e5370 95 #define L3GX_Y_EN 1
kenjiArai 0:de66621e5370 96 #define L3GX_Y_DIS 0
kenjiArai 0:de66621e5370 97 #define L3GX_Z_EN 1
kenjiArai 0:de66621e5370 98 #define L3GX_Z_DIS 0
kenjiArai 0:de66621e5370 99
kenjiArai 0:de66621e5370 100 // Full Scale
kenjiArai 0:de66621e5370 101 #define L3GX_FS_250DPS 0
kenjiArai 0:de66621e5370 102 #define L3GX_FS_500DPS 1
kenjiArai 0:de66621e5370 103 #define L3GX_FS_2000DPS 2
kenjiArai 0:de66621e5370 104
kenjiArai 0:de66621e5370 105 //Convert from degrees to radians.
kenjiArai 0:de66621e5370 106 #define toRadians(x) (x * 0.01745329252)
kenjiArai 0:de66621e5370 107 //Convert from radians to degrees.
kenjiArai 0:de66621e5370 108 #define toDegrees(x) (x * 57.2957795)
kenjiArai 0:de66621e5370 109
kenjiArai 0:de66621e5370 110 /** Interface for STMicronics MEMS motion sensor: 3-axis digital gyroscope
kenjiArai 0:de66621e5370 111 * Chip: L3GD20 (new one) and L3G4200 (old one)
kenjiArai 0:de66621e5370 112 *
kenjiArai 0:de66621e5370 113 * @code
kenjiArai 0:de66621e5370 114 * #include "mbed.h"
kenjiArai 0:de66621e5370 115 *
kenjiArai 0:de66621e5370 116 * // I2C Communication
kenjiArai 0:de66621e5370 117 * L3GX_GYRO gyro(p_sda, p_scl, chip_addr, datarate, bandwidth, fullscale);
kenjiArai 0:de66621e5370 118 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:de66621e5370 119 * // you need to declare following method.
kenjiArai 0:de66621e5370 120 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:de66621e5370 121 * L3GX_GYRO gyro(i2c, chip_addr, datarate, bandwidth, fullscale);
kenjiArai 0:de66621e5370 122 *
kenjiArai 0:de66621e5370 123 * int main() {
kenjiArai 0:de66621e5370 124 * float f[3];
kenjiArai 0:de66621e5370 125 * int8_t t;
kenjiArai 0:de66621e5370 126 *
kenjiArai 0:de66621e5370 127 * if (gyro.read_id() == I_AM_L3G4200D){
kenjiArai 0:de66621e5370 128 * t = gyro.read_temp();
kenjiArai 0:de66621e5370 129 * gyro.read_data(f);
kenjiArai 0:de66621e5370 130 * }
kenjiArai 0:de66621e5370 131 * }
kenjiArai 0:de66621e5370 132 * @endcode
kenjiArai 0:de66621e5370 133 */
kenjiArai 0:de66621e5370 134
kenjiArai 0:de66621e5370 135 class L3GX_GYRO{
kenjiArai 0:de66621e5370 136 public:
kenjiArai 0:de66621e5370 137 /** Configure data pin
kenjiArai 0:de66621e5370 138 * @param data SDA and SCL pins
kenjiArai 0:de66621e5370 139 * @param device address L3G4200D(SA0=0 or 1) or L3GD20(SA0=0 or 1)
kenjiArai 0:de66621e5370 140 * @param ->L3G4200D_G_CHIP_ADDR to L3GD20_V_CHIP_ADDR
kenjiArai 0:de66621e5370 141 * @param output data rate selection, DR_100HZ/DR_95HZ to DR_800HZ/DR_760HZ
kenjiArai 0:de66621e5370 142 * @param bandwidth selection, BW_LOW to BW_HI
kenjiArai 0:de66621e5370 143 * @param full scale selection, FS_250DPS, FS_500DPS, FS_2000DPS
kenjiArai 0:de66621e5370 144 */
kenjiArai 0:de66621e5370 145 L3GX_GYRO(PinName p_sda, PinName p_scl,
kenjiArai 0:de66621e5370 146 uint8_t addr, uint8_t data_rate, uint8_t bandwidth, uint8_t fullscale);
kenjiArai 5:81fc00bd76fe 147
kenjiArai 5:81fc00bd76fe 148 /** Configure data pin
kenjiArai 5:81fc00bd76fe 149 * @param data SDA and SCL pins
kenjiArai 5:81fc00bd76fe 150 * @param device address L3G4200D(SA0=0 or 1) or L3GD20(SA0=0 or 1)
kenjiArai 5:81fc00bd76fe 151 * @param ->L3G4200D_G_CHIP_ADDR to L3GD20_V_CHIP_ADDR
kenjiArai 5:81fc00bd76fe 152 * @default output data rate selection = DR_100HZ/DR_95HZ
kenjiArai 5:81fc00bd76fe 153 * @default bandwidth selection = BW_HI
kenjiArai 5:81fc00bd76fe 154 * @default full scale selection = FS_250DPS
kenjiArai 5:81fc00bd76fe 155 */
kenjiArai 5:81fc00bd76fe 156 L3GX_GYRO(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:de66621e5370 157
kenjiArai 0:de66621e5370 158 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:de66621e5370 159 * @param I2C previous definition
kenjiArai 0:de66621e5370 160 * @param other parameters -> please see L3GX_GYRO(PinName p_sda, PinName p_scl,...)
kenjiArai 0:de66621e5370 161 */
kenjiArai 0:de66621e5370 162 L3GX_GYRO(I2C& p_i2c,
kenjiArai 0:de66621e5370 163 uint8_t addr, uint8_t data_rate, uint8_t bandwidth, uint8_t fullscale);
kenjiArai 0:de66621e5370 164
kenjiArai 5:81fc00bd76fe 165 /** Configure data pin (with other devices on I2C line)
kenjiArai 5:81fc00bd76fe 166 * @param I2C previous definition
kenjiArai 5:81fc00bd76fe 167 * @param other parameters -> please see L3GX_GYRO(PinName p_sda, PinName p_scl,...)
kenjiArai 5:81fc00bd76fe 168 * @default output data rate selection = DR_100HZ/DR_95HZ
kenjiArai 5:81fc00bd76fe 169 * @default bandwidth selection = BW_HI
kenjiArai 5:81fc00bd76fe 170 * @default full scale selection = FS_250DPS
kenjiArai 5:81fc00bd76fe 171 */
kenjiArai 5:81fc00bd76fe 172 L3GX_GYRO(I2C& p_i2c, uint8_t addr);
kenjiArai 5:81fc00bd76fe 173
kenjiArai 0:de66621e5370 174 /** Read a tow's complemet type data from Gyro
kenjiArai 0:de66621e5370 175 * @param none
kenjiArai 0:de66621e5370 176 * @return temperature unit:degreeC(Celsius)
kenjiArai 0:de66621e5370 177 */
kenjiArai 0:de66621e5370 178 int8_t read_temp();
kenjiArai 0:de66621e5370 179
kenjiArai 0:de66621e5370 180 /** Read a float type data from Gyro
kenjiArai 5:81fc00bd76fe 181 * @param float type of three arry's address, e.g. float dt_usr[3];
kenjiArai 0:de66621e5370 182 * @return Gyro motion data unit in param array:dps(degree per second)
kenjiArai 5:81fc00bd76fe 183 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
kenjiArai 0:de66621e5370 184 */
kenjiArai 5:81fc00bd76fe 185 void read_data(float *dt_usr);
kenjiArai 0:de66621e5370 186
kenjiArai 0:de66621e5370 187 /** Read a Gyro ID number
kenjiArai 0:de66621e5370 188 * @param none
kenjiArai 0:de66621e5370 189 * @return if STM MEMS Gyro, it should be I_AM_L3G4200D(0xd3) or I_AM_L3GD20(0xd4)
kenjiArai 0:de66621e5370 190 */
kenjiArai 0:de66621e5370 191 uint8_t read_id();
kenjiArai 0:de66621e5370 192
kenjiArai 0:de66621e5370 193 /** Read Data Ready flag
kenjiArai 0:de66621e5370 194 * @param none
kenjiArai 0:de66621e5370 195 * @return 1 = Ready
kenjiArai 0:de66621e5370 196 */
kenjiArai 0:de66621e5370 197 uint8_t data_ready();
kenjiArai 0:de66621e5370 198
kenjiArai 1:9475fd0e35ff 199 /** Set I2C clock frequency
kenjiArai 1:9475fd0e35ff 200 * @param freq.
kenjiArai 1:9475fd0e35ff 201 * @return none
kenjiArai 1:9475fd0e35ff 202 */
kenjiArai 1:9475fd0e35ff 203 void frequency(int hz);
kenjiArai 1:9475fd0e35ff 204
kenjiArai 0:de66621e5370 205 /** Read register (general purpose)
kenjiArai 0:de66621e5370 206 * @param register's address
kenjiArai 0:de66621e5370 207 * @return register data
kenjiArai 0:de66621e5370 208 */
kenjiArai 0:de66621e5370 209 uint8_t read_reg(uint8_t addr);
kenjiArai 0:de66621e5370 210
kenjiArai 0:de66621e5370 211 /** Write register (general purpose)
kenjiArai 0:de66621e5370 212 * @param register's address
kenjiArai 0:de66621e5370 213 * @param data
kenjiArai 0:de66621e5370 214 * @return none
kenjiArai 0:de66621e5370 215 */
kenjiArai 0:de66621e5370 216 void write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:de66621e5370 217
kenjiArai 0:de66621e5370 218 protected:
kenjiArai 0:de66621e5370 219 void initialize(uint8_t, uint8_t, uint8_t, uint8_t);
kenjiArai 0:de66621e5370 220
kenjiArai 5:81fc00bd76fe 221 I2C _i2c;
kenjiArai 0:de66621e5370 222
kenjiArai 0:de66621e5370 223 private:
kenjiArai 5:81fc00bd76fe 224 float fs_factor; // full scale factor
kenjiArai 5:81fc00bd76fe 225 char dt[2]; // working buffer
kenjiArai 0:de66621e5370 226 uint8_t gyro_addr; // gyro sensor address
kenjiArai 0:de66621e5370 227 uint8_t gyro_id; // gyro ID
kenjiArai 0:de66621e5370 228 uint8_t gyro_ready; // gyro is on I2C line = 1, not = 0
kenjiArai 0:de66621e5370 229 };
kenjiArai 0:de66621e5370 230
kenjiArai 0:de66621e5370 231 #endif // L3GD20_GYRO_H