/************************************************************************** I2C ADDRESS/BITS **************************************************************************/ #define LSM9DS0_DEFAULT_ADDRESS_GYRO (0x6A) // D4 >> 1 = 7-bit default #define LSM9DS0_ADDRESS_GYRO_UPDATED (0x6B) // D6 >> 1 = 7-bit default #define LSM9DS0_DEFAULT_ADDRESS_ACCELMAG (0x1E) // 3C >> 1 = 7-bit default #define LSM9DS0_ADDRESS_ACCELMAG_UPDATED (0x1D) // 3B >> 1 = 7-bit default #define LSM9DS0_ACCELMAG_DEV_ID (0x49) // 0100 1001 #define LSM9DS0_GYRO_DEV_ID (0xD4) // 1101 0100 /************************************************************************** CONVERSION DELAY (in mS) **************************************************************************/ #define LSM9DS0_CONVERSIONDELAY (100) /************************************************************************** GYROSCOPE REGISTERS **************************************************************************/ #define LSM9DS0_REG_GYRO_WHO_AM_I (0x0F) // Device identification Register #define LSM9DS0_REG_GYRO_CTRL_REG1 (0x20) // Gyroscope Control Register 1 #define LSM9DS0_REG_GYRO_CTRL_REG2 (0x21) // Gyroscope Control Register 2 #define LSM9DS0_REG_GYRO_CTRL_REG3 (0x22) // Gyroscope Control Register 3 #define LSM9DS0_REG_GYRO_CTRL_REG4 (0x23) // Gyroscope Control Register 4 #define LSM9DS0_REG_GYRO_CTRL_REG5 (0x24) // Gyroscope Control Register 5 #define LSM9DS0_REG_GYRO_REFERENCE (0x25) // Reference/Datacapture Register #define LSM9DS0_REG_GYRO_STATUS (0x27) // Status Register #define LSM9DS0_REG_GYRO_OUT_X_L (0x28) // X-Axis Angular Rate Data Low Register #define LSM9DS0_REG_GYRO_OUT_X_H (0x29) // X-Axis Angular Rate Data High Register #define LSM9DS0_REG_GYRO_OUT_Y_L (0x2A) // Y-Axis Angular Rate Data Low Register #define LSM9DS0_REG_GYRO_OUT_Y_H (0x2B) // Y-Axis Angular Rate Data High Register #define LSM9DS0_REG_GYRO_OUT_Z_L (0x2C) // Z-Axis Angular Rate Data Low Register #define LSM9DS0_REG_GYRO_OUT_Z_H (0x2D) // Z-Axis Angular Rate Data High Register #define LSM9DS0_REG_GYRO_FIFO_CTRL (0x2E) // FIFO Control Register #define LSM9DS0_REG_GYRO_FIFO_SRC (0x2F) // FIFO Source Register #define LSM9DS0_REG_GYRO_INT1_CFG (0x30) // Interrupt Configuration Register #define LSM9DS0_REG_GYRO_INT1_SRC (0x31) // Interrupt Source Register #define LSM9DS0_REG_GYRO_INT1_THS_XH (0x32) // Interrupt X-Axis High Threshold Register #define LSM9DS0_REG_GYRO_INT1_THS_XL (0x33) // Interrupt X-Axis Low Threshold Register #define LSM9DS0_REG_GYRO_INT1_THS_YH (0x34) // Interrupt Y-Axis High Threshold Register #define LSM9DS0_REG_GYRO_INT1_THS_YL (0x35) // Interrupt Y-Axis Low Threshold Register #define LSM9DS0_REG_GYRO_INT1_THS_ZH (0x36) // Interrupt Z-Axis High Threshold Register #define LSM9DS0_REG_GYRO_INT1_THS_ZL (0x37) // Interrupt Z-Axis Low Threshold Register #define LSM9DS0_REG_GYRO_INT1_DURATION (0x38) // Interrupt Duration Register /************************************************************************** TEMPERATURE REGISTERS **************************************************************************/ #define LSM9DS0_REG_TEMP_OUT_L (0x05) // Temperature Sensor Low Register #define LSM9DS0_REG_TEMP_OUT_H (0x06) // Temperature Sensor High Register /************************************************************************** MAGNETOMETER/ACCELEROMETER REGISTERS **************************************************************************/ #define LSM9DS0_REG_MAG_STATUS_M (0x07) // Magnetic Data Status Register #define LSM9DS0_REG_MAG_OUT_X_L (0x08) // X-Axis Magnetic Data Low Register #define LSM9DS0_REG_MAG_OUT_X_H (0x09) // X-Axis Magnetic Data High Register #define LSM9DS0_REG_MAG_OUT_Y_L (0x0A) // Y-Axis Magnetic Data Low Register #define LSM9DS0_REG_MAG_OUT_Y_H (0x0B) // Y-Axis Magnetic Data High Register #define LSM9DS0_REG_MAG_OUT_Z_L (0x0C) // Z-Axis Magnetic Data Low Register #define LSM9DS0_REG_MAG_OUT_Z_H (0x0D) // Z-Axis Magnetic Data High Register #define LSM9DS0_REG_MAG_WHO_AM_I (0x0F) // Device identification Register #define LSM9DS0_REG_MAG_INT_CTRL (0x12) // Interrupt Recognition Register #define LSM9DS0_REG_MAG_INT_SRC (0x13) // Interrupt Source Register #define LSM9DS0_REG_MAG_INT_THS_L (0x14) // Magnetic Interrupt Threshold Low Register #define LSM9DS0_REG_MAG_INT_THS_H (0x15) // Magnetic Interrupt Threshold High Register #define LSM9DS0_REG_MAG_OFFSET_X_L (0x16) // Magnetic Offset for X-Axis Low Register #define LSM9DS0_REG_MAG_OFFSET_X_H (0x17) // Magnetic Offset for X-Axis High Register #define LSM9DS0_REG_MAG_OFFSET_Y_L (0x18) // Magnetic Offset for Y-Axis Low Register #define LSM9DS0_REG_MAG_OFFSET_Y_H (0x19) // Magnetic Offset for Y-Axis High Register #define LSM9DS0_REG_MAG_OFFSET_Z_L (0x1A) // Magnetic Offset for Z-Axis Low Register #define LSM9DS0_REG_MAG_OFFSET_Z_H (0x1B) // Magnetic Offset for Z-Axis High Register #define LSM9DS0_REG_ACCEL_REF_X (0x1C) // Reference Value for High-Pass Filter for X-Axis Acceleration Data #define LSM9DS0_REG_ACCEL_REF_Y (0x1D) // Reference Value for High-Pass Filter for Y-Axis Acceleration Data #define LSM9DS0_REG_ACCEL_REF_Z (0x1E) // Reference Value for High-Pass Filter for Z-Axis Acceleration Data #define LSM9DS0_REG_ACCELMAG_CTRL_REG0 (0x1F) // Accelerometer/Magnetometer Control Register 0 #define LSM9DS0_REG_ACCELMAG_CTRL_REG1 (0x20) // Accelerometer/Magnetometer Control Register 1 #define LSM9DS0_REG_ACCELMAG_CTRL_REG2 (0x21) // Accelerometer/Magnetometer Control Register 2 #define LSM9DS0_REG_ACCELMAG_CTRL_REG3 (0x22) // Accelerometer/Magnetometer Control Register 3 #define LSM9DS0_REG_ACCELMAG_CTRL_REG4 (0x23) // Accelerometer/Magnetometer Control Register 4 #define LSM9DS0_REG_ACCELMAG_CTRL_REG5 (0x24) // Accelerometer/Magnetometer Control Register 5 #define LSM9DS0_REG_ACCELMAG_CTRL_REG6 (0x25) // Accelerometer/Magnetometer Control Register 6 #define LSM9DS0_REG_ACCELMAG_CTRL_REG7 (0x26) // Accelerometer/Magnetometer Control Register 7 #define LSM9DS0_REG_ACCEL_STATUS (0x27) // Acceleration Status Register #define LSM9DS0_REG_ACCEL_OUT_X_L (0x28) // X-Axis Acceleration Data Low Register #define LSM9DS0_REG_ACCEL_OUT_X_H (0x29) // X-Axis Acceleration Data High Register #define LSM9DS0_REG_ACCEL_OUT_Y_L (0x2A) // Y-Axis Acceleration Data Low Register #define LSM9DS0_REG_ACCEL_OUT_Y_H (0x2B) // Y-Axis Acceleration Data High Register #define LSM9DS0_REG_ACCEL_OUT_Z_L (0x2C) // Z-Axis Acceleration Data Low Register #define LSM9DS0_REG_ACCEL_OUT_Z_H (0x2D) // Z-Axis Acceleration Data High Register #define LSM9DS0_REG_ACCELMAG_FIFO_CTRL (0x2E) // FIFO Control Register #define LSM9DS0_REG_ACCELMAG_FIFO_SRC (0x2F) // FIFO Source Register #define LSM9DS0_REG_ACCELMAG_INT1_GEN (0x30) // Interrupt 1 Recognition Register #define LSM9DS0_REG_ACCELMAG_INT1_SRC (0x31) // Interrupt 1 Source Register #define LSM9DS0_REG_ACCELMAG_INT1_THS (0x32) // Interrupt 1 Threshold Register #define LSM9DS0_REG_ACCELMAG_INT1_DUR (0x33) // Interrupt 1 Duration Register #define LSM9DS0_REG_ACCELMAG_INT2_GEN (0x34) // Interrupt 2 Recognition Register #define LSM9DS0_REG_ACCELMAG_INT2_SRC (0x35) // Interrupt 2 Source Register #define LSM9DS0_REG_ACCELMAG_INT2_THS (0x36) // Interrupt 2 Threshold Register #define LSM9DS0_REG_ACCELMAG_INT2_DUR (0x37) // Interrupt 2 Duration Register #define LSM9DS0_REG_ACCELMAG_CLICK_CFG (0x38) // Interrupt Click Recognition Register #define LSM9DS0_REG_ACCELMAG_CLICK_SRC (0x39) // Interrupt Click Source Register #define LSM9DS0_REG_ACCELMAG_CLICK_THS (0x3A) // Interrupt Click Threshold Register #define LSM9DS0_REG_ACCELMAG_TIME_LIMIT (0x3B) // Click Time Limit Register #define LSM9DS0_REG_ACCELMAG_TIME_LAT (0x3C) // Click Time Latency Register #define LSM9DS0_REG_ACCELMAG_TIME_WIN (0x3D) // Click Time Window Register #define LSM9DS0_REG_ACCELMAG_ACT_THS (0x3E) // Sleep-to-Wake, Return-to-Sleep Activation Threshold Register #define LSM9DS0_REG_ACCELMAG_ACT_DUR (0x3F) // Sleep-to-Wake, Return-to-Sleep Duration Register /************************************************************************** GYROSCOPE CONTROL REGISTER 1 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_MASK (0xF0) // Output Data Rate and Bandwidth Selection #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_12_5 (0x00) // ODR (Hz): 95, Cutoff: 12.5 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_25 (0x30) // ODR (Hz): 95, Cutoff: 25 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_12_5 (0x40) // ODR (Hz): 190, Cutoff: 12.5 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_25 (0x50) // ODR (Hz): 190, Cutoff: 25 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_50 (0x60) // ODR (Hz): 190, Cutoff: 50 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_70 (0x70) // ODR (Hz): 190, Cutoff: 70 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_20 (0x80) // ODR (Hz): 380, Cutoff: 20 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_25 (0x90) // ODR (Hz): 380, Cutoff: 25 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_50 (0xA0) // ODR (Hz): 380, Cutoff: 50 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_100 (0xB0) // ODR (Hz): 380, Cutoff: 100 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_30 (0xC0) // ODR (Hz): 760, Cutoff: 30 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_35 (0xD0) // ODR (Hz): 760, Cutoff: 35 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_50 (0xE0) // ODR (Hz): 760, Cutoff: 50 #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_100 (0xF0) // ODR (Hz): 760, Cutoff: 100 #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_MASK (0x08) // Power-Down Mode Enable #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_DOWN (0x00) // Power-Down Mode #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_NORMAL (0x08) // Normal Mode or Sleep Mode #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_MASK (0x04) // Gyroscope Z-axis Enable #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_DISABLE (0x00) // Gyroscope Z-axis Disabled #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_ENABLE (0x04) // Gyroscope Z-axis Enabled #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_MASK (0x02) // Gyroscope Y-axis Enable #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_DISABLE (0x00) // Gyroscope Y-axis Disabled #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_ENABLE (0x02) // Gyroscope Y-axis Enabled #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_MASK (0x01) // Gyroscope X-axis Enable #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_DISABLE (0x00) // Gyroscope X-axis Disabled #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_ENABLE (0x01) // Gyroscope X-axis Enabled /************************************************************************** GYROSCOPE CONTROL REGISTER 4 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_MASK (0x80) // Block Data Update #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_CONTINUOUS (0x00) // Continuous Update #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_NOTUPDATE (0x80) // Output Registers Not Updated until MSB and LSB Read #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MASK (0x40) // Big/Little Endian Data Selection #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_LSB (0x00) // Data LSB @ lower address #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MSB (0x40) // Data MSB @ lower address #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_MASK (0x30) // Full-Scale Selection #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_245 (0x00) // 245 dps #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_500 (0x10) // 500 dps #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_2000 (0x30) // 2000 dps #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_MASK (0x06) // Self-Test Enable #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_NORMAL (0x00) // Normal Mode #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_0 (0x02) // Self-Test 0 (X Positive Sign, Y and Z Negative Sign) #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_1 (0x06) // Self-Test 1 (X Negative Sign, Y and Z Positive Sign) #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_MASK (0x01) // SPI Serial Interface Mode Selection #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_4WIRE (0x00) // 4-Wire Interface #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_3WIRE (0x01) // 3-Wire Interface /************************************************************************** ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 1 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_MASK (0xF0) // Acceleration Data Rate Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_PD (0x00) // Power-Down Mode #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_3_125 (0x10) // 3.125 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_6_25 (0x20) // 6.25 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_12_5 (0x30) // 12.5 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_25 (0x40) // 25 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_50 (0x50) // 50 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_100 (0x60) // 100 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_200 (0x70) // 200 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_400 (0x80) // 400 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_800 (0x90) // 800 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_1600 (0xA0) // 1600 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_MASK (0x08) // Block Data Update for Acceleration and Magnetic Data #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_CONTINUOUS (0x00) // Continuous Update #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_NOTUPDATE (0x08) // Output Registers Not Updated until MSB and LSB Read #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_MASK (0x04) // Acceleration Z-axis Enable #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_DISABLE (0x00) // Acceleration Z-axis Disabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_ENABLE (0x04) // Acceleration Z-axis Enabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_MASK (0x02) // Acceleration Y-axis Enable #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE (0x00) // Acceleration Y-axis Disabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE (0x02) // Acceleration Y-axis Enabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_MASK (0x01) // Acceleration X-axis Enable #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_DISABLE (0x00) // Acceleration X-axis Disabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_ENABLE (0x01) // Acceleration X-axis Enabled /************************************************************************** ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 2 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_MASK (0xC0) // Accelerometer Anti-Alias Filter Bandwidth #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_773 (0x00) // 773 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_194 (0x40) // 194 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_362 (0x80) // 362 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_50 (0xC0) // 50 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_MASK (0x38) // Acceleration Full-Scale Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_2G (0x00) // ±2 g #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_4G (0x08) // ±4 g #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_6G (0x10) // ±6 g #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_8G (0x18) // ±8 g #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_16G (0x20) // ±16 g #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_MASK (0x06) // Acceleration Self-Test Enable #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NORMAL (0x00) // Normal Mode #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_POSITIVE (0x02) // Positive Sign Self-Test #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NEGATIVE (0x04) // Negative Sign Self-Test #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NOT (0x06) // Not Allowed #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_MASK (0x01) // SPI Serial Interface Mode Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_4WIRE (0x00) // 4-Wire Interface #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_3WIRE (0x01) // 3-Wire Interface /************************************************************************** ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 5 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_MASK (0x80) // Temperature Sensor Enable #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_DISABLED (0x00) // Temperature Sensor Disabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_ENABLED (0x80) // Temperature Sensor Enabled #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_MASK (0x60) // Magnetic Resolution Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_LOW (0x00) // Magnetic Resolution Low #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_HIGH (0x60) // Magnetic Resolution High #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_MASK (0x1C) // Magnetic Data Rate Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_3_125 (0x00) // 3.125 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_6_25 (0x04) // 6.25 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_12_5 (0x08) // 12.5 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_25 (0x0C) // 25 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_50 (0x10) // 50 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_100 (0x14) // 100 Hz #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_RES (0x1C) // Reserved #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_MASK (0x02) // Latch Interrupt Request on INT2_SRC Register, with INT2_SRC Register Cleared by Reading INT2_SRC Itself #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_NOLATCH (0x00) // Interrupt Request Not Latched #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_LATCH (0x02) // Interrupt Request Latched #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_MASK (0x01) // Latch Interrupt Request on INT1_SRC Register, with INT1_SRC Register Cleared by Reading INT1_SRC Itself #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_NOLATCH (0x00) // Interrupt Request Not Latched #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_LATCH (0x01) // Interrupt Request Latched /************************************************************************** ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 6 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_MASK (0x60) // Magnetic Full-Scale Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_2G (0x00) // ±2 gauss #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_4G (0x20) // ±4 gauss #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_8G (0x40) // ±8 gauss #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_12G (0x60) // ±12 gauss /************************************************************************** ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 7 DESCRIPTION **************************************************************************/ #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_MASK (0xC0) // High-Pass Filter Mode Selection for Acceleration Data #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_NORMAL (0x00) // Normal mode (resets x, y and z-axis reading REFERENCE_X (1Ch), REFERENCE_Y (1Dh) and REFERENCE_Y (1Dh) registers respectively) #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_REF (0x40) // Reference signal for filtering #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_NORMAL1 (0x80) // Normal mode #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_AUTO (0xC0) // Autoreset on interrupt event #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_MASK (0x20) // Filtered Acceleration Data Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_BYPASS (0x00) // Internal Filter Bypassed #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_INTFILTER (0x20) // Data From Internal Filter Sent to Output Register and FIFO #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_MASK (0x04) // Magnetic Sensor Mode Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_MODR (0x00) // Magnetic Data Rate is Configured by MODR Bits #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_3_125 (0x04) // MODR is Set to 3.125 Hz Independently From the MODR Settings #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_MASK (0x03) // Magnetic Sensor Mode Selection #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_CONTINUOUS (0x00) // Continuous-Conversion Mode #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_SINGLE (0x01) // Single-conversion mode #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_PDOWN (0x03) // Power-Down mode typedef enum { GYRO_DATARATE_95_12_5 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_12_5, GYRO_DATARATE_95_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_25, GYRO_DATARATE_190_12_5 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_12_5, GYRO_DATARATE_190_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_25, GYRO_DATARATE_190_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_50, GYRO_DATARATE_190_70 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_70, GYRO_DATARATE_380_20 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_20, GYRO_DATARATE_380_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_25, GYRO_DATARATE_380_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_50, GYRO_DATARATE_380_100 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_100, GYRO_DATARATE_760_30 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_30, GYRO_DATARATE_760_35 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_35, GYRO_DATARATE_760_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_50, GYRO_DATARATE_760_100 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_100 } lsmGyroDataRate_t; typedef enum { GYRO_POWER_DOWN_MODE = LSM9DS0_REG_GYRO_CTRL_REG1_PD_DOWN, GYRO_NORMAL_MODE = LSM9DS0_REG_GYRO_CTRL_REG1_PD_NORMAL } lsmGyroMode_t; typedef enum { GYRO_Z_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_DISABLE, GYRO_Z_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_ENABLE } lsmGyroZen_t; typedef enum { GYRO_Y_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_YEN_DISABLE, GYRO_Y_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_YEN_ENABLE } lsmGyroYen_t; typedef enum { GYRO_X_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_XEN_DISABLE, GYRO_X_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_XEN_ENABLE } lsmGyroXen_t; typedef enum { GYRO_CONTINUOUS = LSM9DS0_REG_GYRO_CTRL_REG4_BDU_CONTINUOUS, GYRO_NOT_UPDATED = LSM9DS0_REG_GYRO_CTRL_REG4_BDU_NOTUPDATE } lsmGyroBlockData_t; typedef enum { GYRO_DATA_LSB = LSM9DS0_REG_GYRO_CTRL_REG4_BLE_LSB, GYRO_DATA_MSB = LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MSB } lsmGyroEndianData_t; typedef enum { GYRO_SCALE_245DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_245, GYRO_SCALE_500DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_500, GYRO_SCALE_2000DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_2000 } lsmGyroScale_t; typedef enum { GYRO_SELF_TEST_NORMAL = LSM9DS0_REG_GYRO_CTRL_REG4_ST_NORMAL, GYRO_SELF_TEST_0 = LSM9DS0_REG_GYRO_CTRL_REG4_ST_0, GYRO_SELF_TEST_1 = LSM9DS0_REG_GYRO_CTRL_REG4_ST_1 } lsmGyroSelfTest_t; typedef enum { GYRO_SPI_WIRE_4 = LSM9DS0_REG_GYRO_CTRL_REG4_SIM_4WIRE, GYRO_SPI_WIRE_3 = LSM9DS0_REG_GYRO_CTRL_REG4_SIM_3WIRE } lsmGyroSPIWire_t; typedef enum { ACCEL_DATARATE_POWERDOWN = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_PD, ACCEL_DATARATE_3_125HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_3_125, ACCEL_DATARATE_6_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_6_25, ACCEL_DATARATE_12_5HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_12_5, ACCEL_DATARATE_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_25, ACCEL_DATARATE_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_50, ACCEL_DATARATE_100HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_100, ACCEL_DATARATE_200HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_200, ACCEL_DATARATE_400HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_400, ACCEL_DATARATE_800HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_800, ACCEL_DATARATE_1600HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_1600 } lsmAccelDataRate_t; typedef enum { ACCELMAG_CONTINUOUS = LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_CONTINUOUS, ACCELMAG_NOT_UPDATED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_NOTUPDATE } lsmAccelMagBlockData_t; typedef enum { ACCEL_Z_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_DISABLE, ACCEL_Z_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_ENABLE } lsmAccelZen_t; typedef enum { ACCEL_Y_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE, ACCEL_Y_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE } lsmAccelYen_t; typedef enum { ACCEL_X_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE, ACCEL_X_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE } lsmAccelXen_t; typedef enum { ACCEL_BANDWIDTH_773HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_773, ACCEL_BANDWIDTH_194HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_194, ACCEL_BANDWIDTH_362HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_362, ACCEL_BANDWIDTH_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_50 } lsmAccelBandwidth_t; typedef enum { ACCEL_RANGE_2G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_2G, ACCEL_RANGE_4G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_4G, ACCEL_RANGE_6G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_6G, ACCEL_RANGE_8G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_8G, ACCEL_RANGE_16G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_16G } lsmAccelRange_t; typedef enum { ACCEL_SELF_TEST_NORMAL = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NORMAL, ACCEL_SELF_TEST_POSITIVE = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_POSITIVE, ACCEl_SELF_TEST_NEGATIVE = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NEGATIVE } lsmAccelSelfTest_t; typedef enum { ACCEL_MAG_SPI_WIRE_4 = LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_4WIRE, ACCEL_MAG_SPI_WIRE_3 = LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_3WIRE } lsmAccelMagSPIWire_t; typedef enum { TEMP_SENSOR_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_DISABLED, TEMP_SENSOR_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_ENABLED } lsmTempSensor_t; typedef enum { MAG_RESOLUTION_LOW = LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_LOW, MAG_RESOLUTION_HIGH = LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_HIGH } lsmMagResolution_t; typedef enum { MAG_DATARATE_3_125HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_3_125, MAG_DATARATE_6_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_6_25, MAG_DATARATE_12_5HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_12_5, MAG_DATARATE_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_25, MAG_DATARATE_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_50, MAG_DATARATE_100HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_100 } lsmMagDataRate_t; typedef enum { MAG_INTR2_NOT_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_NOLATCH, MAG_INTR2_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_LATCH } lsmMagIntr2Latch_t; typedef enum { MAG_INTR1_NOT_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_NOLATCH, MAG_INTR1_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_LATCH } lsmMagIntr1Latch_t; typedef enum { MAG_GAIN_2GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_2G, MAG_GAIN_4GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_4G, MAG_GAIN_8GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_8G, MAG_GAIN_12GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_12G } lsmMagGain_t; typedef enum { MAG_CONTINUOUS = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_CONTINUOUS, MAG_SINGLE = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_SINGLE, MAG_POWER_DOWN = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_PDOWN } lsmMagMode_t; typedef struct { int16_t X; int16_t Y; int16_t Z; float T; } lsmSensorData_t; class LSM9DS0 { protected: // Instance-specific properties uint8_t lsm_conversionDelay; lsmGyroDataRate_t lsm_gyrodatarate; lsmGyroMode_t lsm_gyromode; lsmGyroZen_t lsm_gyrozen; lsmGyroYen_t lsm_gyroyen; lsmGyroXen_t lsm_gyroxen; lsmGyroBlockData_t lsm_gyroblockdata; lsmGyroEndianData_t lsm_gyroendiandata; lsmGyroScale_t lsm_gyroscale; lsmGyroSelfTest_t lsm_gyroselftest; lsmGyroSPIWire_t lsm_gyrospiwire; lsmAccelDataRate_t lsm_acceldatarate; lsmAccelMagBlockData_t lsm_accelmagblockdata; lsmAccelZen_t lsm_accelzen; lsmAccelYen_t lsm_accelyen; lsmAccelXen_t lsm_accelxen; lsmAccelBandwidth_t lsm_accelbandwidth; lsmAccelRange_t lsm_accelrange; lsmAccelSelfTest_t lsm_accelselftest; lsmAccelMagSPIWire_t lsm_accelmagspiwire; lsmTempSensor_t lsm_tempsensor; lsmMagResolution_t lsm_magresolution; lsmMagDataRate_t lsm_magdatarate; lsmMagIntr2Latch_t lsm_magintr2latch; lsmMagIntr1Latch_t lsm_magintr1latch; lsmMagGain_t lsm_maggain; lsmMagMode_t lsm_magmode; public: uint8_t lsm_i2cAddressG; uint8_t lsm_i2cAddressXM; lsmSensorData_t lsm_gyroData; lsmSensorData_t lsm_accelData; lsmSensorData_t lsm_magData; lsmSensorData_t lsm_tempData; int16_t tempData; void getAddrG_LSM9DS0(uint8_t i2cAddress); void getAddrXM_LSM9DS0(uint8_t i2cAddress); bool begin(void); void Measure_Sensor(void); void setUpGyroscope(void); void setUpAccelerometer(void); void setUpMagnetometer(void); void Measure_Gyroscope(void); void Measure_Accelerometer(void); void Measure_Magnetometer(void); void Measure_Temperature(void); void setGyroDataRate(lsmGyroDataRate_t gyrodatarate); lsmGyroDataRate_t getGyroDataRate(void); void setGyroMode(lsmGyroMode_t gyromode); lsmGyroMode_t getGyroMode(void); void setGyroZen(lsmGyroZen_t gyrozen); lsmGyroZen_t getGyroZen(void); void setGyroYen(lsmGyroYen_t gyroyen); lsmGyroYen_t getGyroYen(void); void setGyroXen(lsmGyroXen_t gyroxen); lsmGyroXen_t getGyroXen(void); void setGyroBlockData(lsmGyroBlockData_t gyroblockdata); lsmGyroBlockData_t getGyroBlockData(void); void setGyroEndianData(lsmGyroEndianData_t gyroendiandata); lsmGyroEndianData_t getGyroEndianData(void); void setGyroScale(lsmGyroScale_t gyroscale); lsmGyroScale_t getGyroScale(void); void setGyroSelfTest(lsmGyroSelfTest_t gyroselftest); lsmGyroSelfTest_t getGyroSelfTest(void); void setGyroSPIWire(lsmGyroSPIWire_t gyrospiwire); lsmGyroSPIWire_t getGyroSPIWire(void); void setAccelDataRate(lsmAccelDataRate_t acceldatarate); lsmAccelDataRate_t getAccelDataRate(void); void setAccelMagBlockData(lsmAccelMagBlockData_t accelmagblockdata); lsmAccelMagBlockData_t getAccelMagBlockData(void); void setAccelZen(lsmAccelZen_t accelzen); lsmAccelZen_t getAccelZen(void); void setAccelYen(lsmAccelYen_t accelyen); lsmAccelYen_t getAccelYen(void); void setAccelXen(lsmAccelXen_t accelxen); lsmAccelXen_t getAccelXen(void); void setAccelBandwidth(lsmAccelBandwidth_t accelbandwidth); lsmAccelBandwidth_t getAccelBandwidth(void); void setAccelRange(lsmAccelRange_t accelrange); lsmAccelRange_t getAccelRange(void); void setAccelSelfTest(lsmAccelSelfTest_t accelselftest); lsmAccelSelfTest_t getAccelSelfTest(void); void setAccelMagSPIWire(lsmAccelMagSPIWire_t accelmagspiwire); lsmAccelMagSPIWire_t getAccelMagSPIWire(void); void setTempSensor(lsmTempSensor_t tempsensor); lsmTempSensor_t getTempSensor(void); void setMagResolution(lsmMagResolution_t magresolution); lsmMagResolution_t getMagResolution(void); void setMagDataRate(lsmMagDataRate_t magdatarate); lsmMagDataRate_t getMagDataRate(void); void setMagIntr2Latch(lsmMagIntr2Latch_t magintr2latch); lsmMagIntr2Latch_t getMagIntr2Latch(void); void setMagIntr1Latch(lsmMagIntr1Latch_t magintr1latch); lsmMagIntr1Latch_t getMagIntr1Latch(void); void setMagGain(lsmMagGain_t maggain); lsmMagGain_t getMagGain(void); void setMagMode(lsmMagMode_t magmode); lsmMagMode_t getMagMode(void); private: };