L3GD20 & L3G4200D / STMicroelectronics / MEMS motion sensor, three-axis gyroscope library
Dependents: GR-PEACH_test_wo_rtos GR-PEACH_test_on_rtos_works_well
Diff: L3GD20.h
- Revision:
- 0:de66621e5370
- Child:
- 1:9475fd0e35ff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/L3GD20.h Fri Aug 29 13:26:33 2014 +0000 @@ -0,0 +1,208 @@ +/* + * mbed library program + * L3GD20 MEMS motion sensor: 3-axis digital gyroscope, made by STMicroelectronics + * http://www.st.com/web/catalog/sense_power/FM89/SC1288 + * /PF252443?sc=internet/analog/product/252443.jsp + * L3G4200D MEMS motion sensor: three-axis digital output gyroscope, made by STMicroelectronics + * http://www.st.com/web/catalog/sense_power/FM89/SC1288 + * /PF250373?sc=internet/analog/product/250373.jsp + * + * Copyright (c) 2014 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: July 13th, 2014 + * Revised: August 29th, 2014 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef L3GD20_GYRO_H +#define L3GD20_GYRO_H + +#include "mbed.h" + +// L3G4200DMEMS Address +// 7bit address = 0b110100x(0x68 or 0x69 depends on SA0/SDO) +// -> 8bit = 0b1101000x0(0xd0,0xd2) -> 0xd1,0xd3(Read) or 0xd0,0xd2(Write) +#define L3G4200D_G_CHIP_ADDR 0xd0 // SA0(=SDO pin) = Ground +#define L3G4200D_V_CHIP_ADDR 0xd2 // SA0(=SDO pin) = Vdd +// L3GD20MEMS Address +// 7bit address = 0b110101x(0x6a or 0x6b depends on SA0/SDO) +// -> 8bit = 0b1101001x0(0xd4,0xd6) -> 0xd5,0xd7(Read) or 0xd4,0xd6(Write) +#define L3GD20_G_CHIP_ADDR 0xd4 // SA0(=SDO pin) = Ground +#define L3GD20_V_CHIP_ADDR 0xd6 // SA0(=SDO pin) = Vdd + +// L3G4200DMEMS ID +#define I_AM_L3G4200D 0xd3 +// L3GD20MEMS ID +#define I_AM_L3GD20 0xd4 + +// Register's definition +#define L3GX_WHO_AM_I 0x0f +#define L3GX_CTRL_REG1 0x20 +#define L3GX_CTRL_REG2 0x21 +#define L3GX_CTRL_REG3 0x22 +#define L3GX_CTRL_REG4 0x23 +#define L3GX_CTRL_REG5 0x24 +#define L3GX_REFERENCE 0x25 +#define L3GX_OUT_TEMP 0x26 +#define L3GX_STATUS_REG 0x27 +#define L3GX_OUT_X_L 0x28 +#define L3GX_OUT_X_H 0x29 +#define L3GX_OUT_Y_L 0x2a +#define L3GX_OUT_Y_H 0x2b +#define L3GX_OUT_Z_L 0x2c +#define L3GX_OUT_Z_H 0x2d +#define L3GX_FIFO_CTRL_REG 0x2e +#define L3GX_FIFO_SRC_REG 0x2f +#define L3GX_INT1_CFG 0x30 +#define L3GX_INT1_SRC 0x31 +#define L3GX_INT1_TSH_XH 0x32 +#define L3GX_INT1_TSH_XL 0x33 +#define L3GX_INT1_TSH_YH 0x34 +#define L3GX_INT1_TSH_YL 0x35 +#define L3GX_INT1_TSH_ZH 0x36 +#define L3GX_INT1_TSH_ZL 0x37 +#define L3GX_INT1_DURATION 0x38 + +// Output Data Rate (ODR) +// L3G4200DMEMS +#define L3GX_DR_100HZ 0 +#define L3GX_DR_200HZ 1 +#define L3GX_DR_400HZ 2 +#define L3GX_DR_800HZ 3 +// L3GD20MEMS +#define L3GX_DR_95HZ 0 +#define L3GX_DR_190HZ 1 +#define L3GX_DR_380HZ 2 +#define L3GX_DR_760HZ 3 + +// Bandwidth (Low pass) +#define L3GX_BW_LOW 0 +#define L3GX_BW_M_LOW 1 +#define L3GX_BW_M_HI 2 +#define L3GX_BW_HI 3 + +// Power-down mode enable/disable +#define L3GX_PD_EN 0 +#define L3GX_PD_DIS 1 + +// Axis control +#define L3GX_X_EN 1 +#define L3GX_X_DIS 0 +#define L3GX_Y_EN 1 +#define L3GX_Y_DIS 0 +#define L3GX_Z_EN 1 +#define L3GX_Z_DIS 0 + +// Full Scale +#define L3GX_FS_250DPS 0 +#define L3GX_FS_500DPS 1 +#define L3GX_FS_2000DPS 2 + +//Convert from degrees to radians. +#define toRadians(x) (x * 0.01745329252) +//Convert from radians to degrees. +#define toDegrees(x) (x * 57.2957795) + +/** Interface for STMicronics MEMS motion sensor: 3-axis digital gyroscope + * Chip: L3GD20 (new one) and L3G4200 (old one) + * + * @code + * #include "mbed.h" + * + * // I2C Communication + * L3GX_GYRO gyro(p_sda, p_scl, chip_addr, datarate, bandwidth, fullscale); + * // If you connected I2C line not only this device but also other devices, + * // you need to declare following method. + * I2C i2c(dp5,dp27); // SDA, SCL + * L3GX_GYRO gyro(i2c, chip_addr, datarate, bandwidth, fullscale); + * + * int main() { + * float f[3]; + * int8_t t; + * + * if (gyro.read_id() == I_AM_L3G4200D){ + * t = gyro.read_temp(); + * gyro.read_data(f); + * } + * } + * @endcode + */ + +class L3GX_GYRO{ +public: + /** Configure data pin + * @param data SDA and SCL pins + * @param device address L3G4200D(SA0=0 or 1) or L3GD20(SA0=0 or 1) + * @param ->L3G4200D_G_CHIP_ADDR to L3GD20_V_CHIP_ADDR + * @param output data rate selection, DR_100HZ/DR_95HZ to DR_800HZ/DR_760HZ + * @param bandwidth selection, BW_LOW to BW_HI + * @param full scale selection, FS_250DPS, FS_500DPS, FS_2000DPS + */ + L3GX_GYRO(PinName p_sda, PinName p_scl, + uint8_t addr, uint8_t data_rate, uint8_t bandwidth, uint8_t fullscale); + + /** Configure data pin (with other devices on I2C line) + * @param I2C previous definition + * @param other parameters -> please see L3GX_GYRO(PinName p_sda, PinName p_scl,...) + */ + L3GX_GYRO(I2C& p_i2c, + uint8_t addr, uint8_t data_rate, uint8_t bandwidth, uint8_t fullscale); + + /** Read a tow's complemet type data from Gyro + * @param none + * @return temperature unit:degreeC(Celsius) + */ + int8_t read_temp(); + + /** Read a float type data from Gyro + * @param float type of three arry's address, e.g. float dt[3]; + * @return Gyro motion data unit in param array:dps(degree per second) + * @return dt[0]->x, dt[1]->y, dt[2]->z + */ + void read_data(float *dt); + + /** Read a Gyro ID number + * @param none + * @return if STM MEMS Gyro, it should be I_AM_L3G4200D(0xd3) or I_AM_L3GD20(0xd4) + */ + uint8_t read_id(); + + /** Read Data Ready flag + * @param none + * @return 1 = Ready + */ + uint8_t data_ready(); + + /** Read register (general purpose) + * @param register's address + * @return register data + */ + uint8_t read_reg(uint8_t addr); + + /** Write register (general purpose) + * @param register's address + * @param data + * @return none + */ + void write_reg(uint8_t addr, uint8_t data); + +protected: + void initialize(uint8_t, uint8_t, uint8_t, uint8_t); + + I2C i2c; + +private: + float fs_factor; // full scale factor + char dbf[2]; // working buffer + uint8_t gyro_addr; // gyro sensor address + uint8_t gyro_id; // gyro ID + uint8_t gyro_ready; // gyro is on I2C line = 1, not = 0 +}; + +#endif // L3GD20_GYRO_H