Interfacing Arduino with the LSM9DS0 Accelerometer Gyroscope and Magnetometer Sensor

How to Interface Arduino to the LSM9DS0 Accelerometer

This simple guide shows you how to interface your favorite Arduino to the LSM9DS0 accelerometer sensor.  The LSM9DS0 is a combination of digital 3D accelerometer, gyroscope and magnetometer. This device has inbuilt interrupt signals on dedicated pins and is capable of motion and magnetic field detection. The working voltage of this device is 5V with 16-bit data output resolution. On its full-scale operation, acceleration goes from ±2g/±4g/±6g/±8g/±16g , magnetic field of scale ±2/±4/±8/±12 Gauss and angular rate of ±245/±500/±2000 dps.

Applications for the LSM9DS0

– Measuring orientation changes in aircraft and changing orientation in satellites and space vehicles.
– Auto rotation of the display view when a Phone is rotated
– Angular motion in a Mobile Game by 3D motion of the device
– RC Airplane Flight Dynamics and quad copter using Arduino
– Detect buried and submerged objects
– Gaming and virtual input devices

LSM9DS0 Sensor Overview

The LSM9DS0 is a system-in-package featuring a 3D digital linear acceleration sensor, a 3D digital angular rate sensor, and a 3D digital magnetic sensor. Magnetic, accelerometer and gyroscope sensing can be enabled or set in power-down mode separately for smart power management.  The LSM9DS0 it is guaranteed to operate over an extended temperature range from -40 °C to +85 °C.

Hardware Required

  1.  LSM9DS1 3D Accelerometer Gyroscope Magnetometer I2C Mini Module
  2. Arduino Nano
  3. I2C Shield for Arduino Nano

Note: We also have hardware for interfacing this sensor to just about any Arduino platform

Advantage of Choosing LSM9DS0 Sensor

The device is considered very helpful in designing prototypes of self-balanced robots because this device is a combination of 3 sensors in a single chip. We can calculate acceleration and angular velocity of any moving object with high accuracy. To detect magnetic fields, the in-built magnetometer helps mobile phones and other devices in detecting magnetic North.

Addressing the LSM9DS0

Integrated I2C address jumpers make it easy to connect up to 4 LSM9DS0 Mini Modules to a single I2C address buss.  The LSM9DS0 has a I2C Start Address of 0x1E, which changes depending on the I2C address jumper settings.

LSM9DS0 Address Jumpers

0x1E = Jumper 0 Removed, Jumper 1 Removed
0x1F = Jumper 0 Installed, Jumper 1 Removed
0x20 = Jumper 0 Removed, Jumper 1 Installed
ox21 = Jumper 0 Installed, Jumper 1 Installed

Register Description

The device has registers for Gyroscope (REG_GYRO_), Accelerometer(REG_ACCELMAG_), Temperature(REG_TEMP_) and Magnetometer(REG_MAG_) with address of every X,Y,Z  axis and other device configuration addresses. These addresses are selected by the programmer according to requirement like data rate selection, gyro scale etc.

LSM9DS0 Arduino Library

In  Arduino library we define address of every register, enabling commands, XYZ axis, high-low commands.

  1. /**************************************************************************
  2. I2C ADDRESS/BITS
  3. **************************************************************************/
  4. #define LSM9DS0_DEFAULT_ADDRESS_GYRO (0x6A) // D4 >> 1 = 7-bit default
  5. #define LSM9DS0_ADDRESS_GYRO_UPDATED (0x6B) // D6 >> 1 = 7-bit default
  6. #define LSM9DS0_DEFAULT_ADDRESS_ACCELMAG (0x1E) // 3C >> 1 = 7-bit default
  7. #define LSM9DS0_ADDRESS_ACCELMAG_UPDATED (0x1D) // 3B >> 1 = 7-bit default
  8. #define LSM9DS0_ACCELMAG_DEV_ID (0x49) // 0100 1001
  9. #define LSM9DS0_GYRO_DEV_ID (0xD4) // 1101 0100
  10.  
  11. /**************************************************************************
  12. CONVERSION DELAY (in mS)
  13. **************************************************************************/
  14. #define LSM9DS0_CONVERSIONDELAY (100)
  15.  
  16. /**************************************************************************
  17. GYROSCOPE REGISTERS
  18. **************************************************************************/
  19. #define LSM9DS0_REG_GYRO_WHO_AM_I (0x0F) // Device identification Register
  20. #define LSM9DS0_REG_GYRO_CTRL_REG1 (0x20) // Gyroscope Control Register 1
  21. #define LSM9DS0_REG_GYRO_CTRL_REG2 (0x21) // Gyroscope Control Register 2
  22. #define LSM9DS0_REG_GYRO_CTRL_REG3 (0x22) // Gyroscope Control Register 3
  23. #define LSM9DS0_REG_GYRO_CTRL_REG4 (0x23) // Gyroscope Control Register 4
  24. #define LSM9DS0_REG_GYRO_CTRL_REG5 (0x24) // Gyroscope Control Register 5
  25. #define LSM9DS0_REG_GYRO_REFERENCE (0x25) // Reference/Datacapture Register
  26. #define LSM9DS0_REG_GYRO_STATUS (0x27) // Status Register
  27. #define LSM9DS0_REG_GYRO_OUT_X_L (0x28) // X-Axis Angular Rate Data Low Register
  28. #define LSM9DS0_REG_GYRO_OUT_X_H (0x29) // X-Axis Angular Rate Data High Register
  29. #define LSM9DS0_REG_GYRO_OUT_Y_L (0x2A) // Y-Axis Angular Rate Data Low Register
  30. #define LSM9DS0_REG_GYRO_OUT_Y_H (0x2B) // Y-Axis Angular Rate Data High Register
  31. #define LSM9DS0_REG_GYRO_OUT_Z_L (0x2C) // Z-Axis Angular Rate Data Low Register
  32. #define LSM9DS0_REG_GYRO_OUT_Z_H (0x2D) // Z-Axis Angular Rate Data High Register
  33. #define LSM9DS0_REG_GYRO_FIFO_CTRL (0x2E) // FIFO Control Register
  34. #define LSM9DS0_REG_GYRO_FIFO_SRC (0x2F) // FIFO Source Register
  35. #define LSM9DS0_REG_GYRO_INT1_CFG (0x30) // Interrupt Configuration Register
  36. #define LSM9DS0_REG_GYRO_INT1_SRC (0x31) // Interrupt Source Register
  37. #define LSM9DS0_REG_GYRO_INT1_THS_XH (0x32) // Interrupt X-Axis High Threshold Register
  38. #define LSM9DS0_REG_GYRO_INT1_THS_XL (0x33) // Interrupt X-Axis Low Threshold Register
  39. #define LSM9DS0_REG_GYRO_INT1_THS_YH (0x34) // Interrupt Y-Axis High Threshold Register
  40. #define LSM9DS0_REG_GYRO_INT1_THS_YL (0x35) // Interrupt Y-Axis Low Threshold Register
  41. #define LSM9DS0_REG_GYRO_INT1_THS_ZH (0x36) // Interrupt Z-Axis High Threshold Register
  42. #define LSM9DS0_REG_GYRO_INT1_THS_ZL (0x37) // Interrupt Z-Axis Low Threshold Register
  43. #define LSM9DS0_REG_GYRO_INT1_DURATION (0x38) // Interrupt Duration Register
  44.  
  45. /**************************************************************************
  46. TEMPERATURE REGISTERS
  47. **************************************************************************/
  48. #define LSM9DS0_REG_TEMP_OUT_L (0x05) // Temperature Sensor Low Register
  49. #define LSM9DS0_REG_TEMP_OUT_H (0x06) // Temperature Sensor High Register
  50.  
  51. /**************************************************************************
  52. MAGNETOMETER/ACCELEROMETER REGISTERS
  53. **************************************************************************/
  54. #define LSM9DS0_REG_MAG_STATUS_M (0x07) // Magnetic Data Status Register
  55. #define LSM9DS0_REG_MAG_OUT_X_L (0x08) // X-Axis Magnetic Data Low Register
  56. #define LSM9DS0_REG_MAG_OUT_X_H (0x09) // X-Axis Magnetic Data High Register
  57. #define LSM9DS0_REG_MAG_OUT_Y_L (0x0A) // Y-Axis Magnetic Data Low Register
  58. #define LSM9DS0_REG_MAG_OUT_Y_H (0x0B) // Y-Axis Magnetic Data High Register
  59. #define LSM9DS0_REG_MAG_OUT_Z_L (0x0C) // Z-Axis Magnetic Data Low Register
  60. #define LSM9DS0_REG_MAG_OUT_Z_H (0x0D) // Z-Axis Magnetic Data High Register
  61. #define LSM9DS0_REG_MAG_WHO_AM_I (0x0F) // Device identification Register
  62. #define LSM9DS0_REG_MAG_INT_CTRL (0x12) // Interrupt Recognition Register
  63. #define LSM9DS0_REG_MAG_INT_SRC (0x13) // Interrupt Source Register
  64. #define LSM9DS0_REG_MAG_INT_THS_L (0x14) // Magnetic Interrupt Threshold Low Register
  65. #define LSM9DS0_REG_MAG_INT_THS_H (0x15) // Magnetic Interrupt Threshold High Register
  66. #define LSM9DS0_REG_MAG_OFFSET_X_L (0x16) // Magnetic Offset for X-Axis Low Register
  67. #define LSM9DS0_REG_MAG_OFFSET_X_H (0x17) // Magnetic Offset for X-Axis High Register
  68. #define LSM9DS0_REG_MAG_OFFSET_Y_L (0x18) // Magnetic Offset for Y-Axis Low Register
  69. #define LSM9DS0_REG_MAG_OFFSET_Y_H (0x19) // Magnetic Offset for Y-Axis High Register
  70. #define LSM9DS0_REG_MAG_OFFSET_Z_L (0x1A) // Magnetic Offset for Z-Axis Low Register
  71. #define LSM9DS0_REG_MAG_OFFSET_Z_H (0x1B) // Magnetic Offset for Z-Axis High Register
  72. #define LSM9DS0_REG_ACCEL_REF_X (0x1C) // Reference Value for High-Pass Filter for X-Axis Acceleration Data
  73. #define LSM9DS0_REG_ACCEL_REF_Y (0x1D) // Reference Value for High-Pass Filter for Y-Axis Acceleration Data
  74. #define LSM9DS0_REG_ACCEL_REF_Z (0x1E) // Reference Value for High-Pass Filter for Z-Axis Acceleration Data
  75. #define LSM9DS0_REG_ACCELMAG_CTRL_REG0 (0x1F) // Accelerometer/Magnetometer Control Register 0
  76. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1 (0x20) // Accelerometer/Magnetometer Control Register 1
  77. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2 (0x21) // Accelerometer/Magnetometer Control Register 2
  78. #define LSM9DS0_REG_ACCELMAG_CTRL_REG3 (0x22) // Accelerometer/Magnetometer Control Register 3
  79. #define LSM9DS0_REG_ACCELMAG_CTRL_REG4 (0x23) // Accelerometer/Magnetometer Control Register 4
  80. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5 (0x24) // Accelerometer/Magnetometer Control Register 5
  81. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6 (0x25) // Accelerometer/Magnetometer Control Register 6
  82. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7 (0x26) // Accelerometer/Magnetometer Control Register 7
  83. #define LSM9DS0_REG_ACCEL_STATUS (0x27) // Acceleration Status Register
  84. #define LSM9DS0_REG_ACCEL_OUT_X_L (0x28) // X-Axis Acceleration Data Low Register
  85. #define LSM9DS0_REG_ACCEL_OUT_X_H (0x29) // X-Axis Acceleration Data High Register
  86. #define LSM9DS0_REG_ACCEL_OUT_Y_L (0x2A) // Y-Axis Acceleration Data Low Register
  87. #define LSM9DS0_REG_ACCEL_OUT_Y_H (0x2B) // Y-Axis Acceleration Data High Register
  88. #define LSM9DS0_REG_ACCEL_OUT_Z_L (0x2C) // Z-Axis Acceleration Data Low Register
  89. #define LSM9DS0_REG_ACCEL_OUT_Z_H (0x2D) // Z-Axis Acceleration Data High Register
  90. #define LSM9DS0_REG_ACCELMAG_FIFO_CTRL (0x2E) // FIFO Control Register
  91. #define LSM9DS0_REG_ACCELMAG_FIFO_SRC (0x2F) // FIFO Source Register
  92. #define LSM9DS0_REG_ACCELMAG_INT1_GEN (0x30) // Interrupt 1 Recognition Register
  93. #define LSM9DS0_REG_ACCELMAG_INT1_SRC (0x31) // Interrupt 1 Source Register
  94. #define LSM9DS0_REG_ACCELMAG_INT1_THS (0x32) // Interrupt 1 Threshold Register
  95. #define LSM9DS0_REG_ACCELMAG_INT1_DUR (0x33) // Interrupt 1 Duration Register
  96. #define LSM9DS0_REG_ACCELMAG_INT2_GEN (0x34) // Interrupt 2 Recognition Register
  97. #define LSM9DS0_REG_ACCELMAG_INT2_SRC (0x35) // Interrupt 2 Source Register
  98. #define LSM9DS0_REG_ACCELMAG_INT2_THS (0x36) // Interrupt 2 Threshold Register
  99. #define LSM9DS0_REG_ACCELMAG_INT2_DUR (0x37) // Interrupt 2 Duration Register
  100. #define LSM9DS0_REG_ACCELMAG_CLICK_CFG (0x38) // Interrupt Click Recognition Register
  101. #define LSM9DS0_REG_ACCELMAG_CLICK_SRC (0x39) // Interrupt Click Source Register
  102. #define LSM9DS0_REG_ACCELMAG_CLICK_THS (0x3A) // Interrupt Click Threshold Register
  103. #define LSM9DS0_REG_ACCELMAG_TIME_LIMIT (0x3B) // Click Time Limit Register
  104. #define LSM9DS0_REG_ACCELMAG_TIME_LAT (0x3C) // Click Time Latency Register
  105. #define LSM9DS0_REG_ACCELMAG_TIME_WIN (0x3D) // Click Time Window Register
  106. #define LSM9DS0_REG_ACCELMAG_ACT_THS (0x3E) // Sleep-to-Wake, Return-to-Sleep Activation Threshold Register
  107. #define LSM9DS0_REG_ACCELMAG_ACT_DUR (0x3F) // Sleep-to-Wake, Return-to-Sleep Duration Register
  108.  
  109. /**************************************************************************
  110. GYROSCOPE CONTROL REGISTER 1 DESCRIPTION
  111. **************************************************************************/
  112. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_MASK (0xF0) // Output Data Rate and Bandwidth Selection
  113. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_12_5 (0x00) // ODR (Hz): 95, Cutoff: 12.5
  114. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_25 (0x30) // ODR (Hz): 95, Cutoff: 25
  115. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_12_5 (0x40) // ODR (Hz): 190, Cutoff: 12.5
  116. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_25 (0x50) // ODR (Hz): 190, Cutoff: 25
  117. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_50 (0x60) // ODR (Hz): 190, Cutoff: 50
  118. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_70 (0x70) // ODR (Hz): 190, Cutoff: 70
  119. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_20 (0x80) // ODR (Hz): 380, Cutoff: 20
  120. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_25 (0x90) // ODR (Hz): 380, Cutoff: 25
  121. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_50 (0xA0) // ODR (Hz): 380, Cutoff: 50
  122. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_100 (0xB0) // ODR (Hz): 380, Cutoff: 100
  123. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_30 (0xC0) // ODR (Hz): 760, Cutoff: 30
  124. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_35 (0xD0) // ODR (Hz): 760, Cutoff: 35
  125. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_50 (0xE0) // ODR (Hz): 760, Cutoff: 50
  126. #define LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_100 (0xF0) // ODR (Hz): 760, Cutoff: 100
  127.  
  128. #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_MASK (0x08) // Power-Down Mode Enable
  129. #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_DOWN (0x00) // Power-Down Mode
  130. #define LSM9DS0_REG_GYRO_CTRL_REG1_PD_NORMAL (0x08) // Normal Mode or Sleep Mode
  131.  
  132. #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_MASK (0x04) // Gyroscope Z-axis Enable
  133. #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_DISABLE (0x00) // Gyroscope Z-axis Disabled
  134. #define LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_ENABLE (0x04) // Gyroscope Z-axis Enabled
  135.  
  136. #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_MASK (0x02) // Gyroscope Y-axis Enable
  137. #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_DISABLE (0x00) // Gyroscope Y-axis Disabled
  138. #define LSM9DS0_REG_GYRO_CTRL_REG1_YEN_ENABLE (0x02) // Gyroscope Y-axis Enabled
  139.  
  140. #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_MASK (0x01) // Gyroscope X-axis Enable
  141. #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_DISABLE (0x00) // Gyroscope X-axis Disabled
  142. #define LSM9DS0_REG_GYRO_CTRL_REG1_XEN_ENABLE (0x01) // Gyroscope X-axis Enabled
  143.  
  144. /**************************************************************************
  145. GYROSCOPE CONTROL REGISTER 4 DESCRIPTION
  146. **************************************************************************/
  147. #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_MASK (0x80) // Block Data Update
  148. #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_CONTINUOUS (0x00) // Continuous Update
  149. #define LSM9DS0_REG_GYRO_CTRL_REG4_BDU_NOTUPDATE (0x80) // Output Registers Not Updated until MSB and LSB Read
  150.  
  151. #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MASK (0x40) // Big/Little Endian Data Selection
  152. #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_LSB (0x00) // Data LSB @ lower address
  153. #define LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MSB (0x40) // Data MSB @ lower address
  154.  
  155. #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_MASK (0x30) // Full-Scale Selection
  156. #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_245 (0x00) // 245 dps
  157. #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_500 (0x10) // 500 dps
  158. #define LSM9DS0_REG_GYRO_CTRL_REG4_FS_2000 (0x30) // 2000 dps
  159.  
  160. #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_MASK (0x06) // Self-Test Enable
  161. #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_NORMAL (0x00) // Normal Mode
  162. #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_0 (0x02) // Self-Test 0 (X Positive Sign, Y and Z Negative Sign)
  163. #define LSM9DS0_REG_GYRO_CTRL_REG4_ST_1 (0x06) // Self-Test 1 (X Negative Sign, Y and Z Positive Sign)
  164.  
  165. #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_MASK (0x01) // SPI Serial Interface Mode Selection
  166. #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_4WIRE (0x00) // 4-Wire Interface
  167. #define LSM9DS0_REG_GYRO_CTRL_REG4_SIM_3WIRE (0x01) // 3-Wire Interface
  168.  
  169. /**************************************************************************
  170. ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 1 DESCRIPTION
  171. **************************************************************************/
  172. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_MASK (0xF0) // Acceleration Data Rate Selection
  173. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_PD (0x00) // Power-Down Mode
  174. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_3_125 (0x10) // 3.125 Hz
  175. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_6_25 (0x20) // 6.25 Hz
  176. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_12_5 (0x30) // 12.5 Hz
  177. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_25 (0x40) // 25 Hz
  178. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_50 (0x50) // 50 Hz
  179. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_100 (0x60) // 100 Hz
  180. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_200 (0x70) // 200 Hz
  181. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_400 (0x80) // 400 Hz
  182. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_800 (0x90) // 800 Hz
  183. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_1600 (0xA0) // 1600 Hz
  184.  
  185. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_MASK (0x08) // Block Data Update for Acceleration and Magnetic Data
  186. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_CONTINUOUS (0x00) // Continuous Update
  187. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_NOTUPDATE (0x08) // Output Registers Not Updated until MSB and LSB Read
  188.  
  189. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_MASK (0x04) // Acceleration Z-axis Enable
  190. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_DISABLE (0x00) // Acceleration Z-axis Disabled
  191. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_ENABLE (0x04) // Acceleration Z-axis Enabled
  192.  
  193. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_MASK (0x02) // Acceleration Y-axis Enable
  194. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE (0x00) // Acceleration Y-axis Disabled
  195. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE (0x02) // Acceleration Y-axis Enabled
  196.  
  197. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_MASK (0x01) // Acceleration X-axis Enable
  198. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_DISABLE (0x00) // Acceleration X-axis Disabled
  199. #define LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_ENABLE (0x01) // Acceleration X-axis Enabled
  200.  
  201. /**************************************************************************
  202. ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 2 DESCRIPTION
  203. **************************************************************************/
  204. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_MASK (0xC0) // Accelerometer Anti-Alias Filter Bandwidth
  205. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_773 (0x00) // 773 Hz
  206. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_194 (0x40) // 194 Hz
  207. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_362 (0x80) // 362 Hz
  208. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_50 (0xC0) // 50 Hz
  209.  
  210. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_MASK (0x38) // Acceleration Full-Scale Selection
  211. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_2G (0x00) // ±2 g
  212. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_4G (0x08) // ±4 g
  213. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_6G (0x10) // ±6 g
  214. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_8G (0x18) // ±8 g
  215. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_16G (0x20) // ±16 g
  216.  
  217. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_MASK (0x06) // Acceleration Self-Test Enable
  218. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NORMAL (0x00) // Normal Mode
  219. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_POSITIVE (0x02) // Positive Sign Self-Test
  220. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NEGATIVE (0x04) // Negative Sign Self-Test
  221. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NOT (0x06) // Not Allowed
  222.  
  223. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_MASK (0x01) // SPI Serial Interface Mode Selection
  224. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_4WIRE (0x00) // 4-Wire Interface
  225. #define LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_3WIRE (0x01) // 3-Wire Interface
  226.  
  227. /**************************************************************************
  228. ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 5 DESCRIPTION
  229. **************************************************************************/
  230. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_MASK (0x80) // Temperature Sensor Enable
  231. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_DISABLED (0x00) // Temperature Sensor Disabled
  232. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_ENABLED (0x80) // Temperature Sensor Enabled
  233.  
  234. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_MASK (0x60) // Magnetic Resolution Selection
  235. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_LOW (0x00) // Magnetic Resolution Low
  236. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_HIGH (0x60) // Magnetic Resolution High
  237.  
  238. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_MASK (0x1C) // Magnetic Data Rate Selection
  239. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_3_125 (0x00) // 3.125 Hz
  240. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_6_25 (0x04) // 6.25 Hz
  241. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_12_5 (0x08) // 12.5 Hz
  242. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_25 (0x0C) // 25 Hz
  243. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_50 (0x10) // 50 Hz
  244. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_100 (0x14) // 100 Hz
  245. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_RES (0x1C) // Reserved
  246.  
  247. #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
  248. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_NOLATCH (0x00) // Interrupt Request Not Latched
  249. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_LATCH (0x02) // Interrupt Request Latched
  250.  
  251. #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
  252. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_NOLATCH (0x00) // Interrupt Request Not Latched
  253. #define LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_LATCH (0x01) // Interrupt Request Latched
  254.  
  255. /**************************************************************************
  256. ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 6 DESCRIPTION
  257. **************************************************************************/
  258. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_MASK (0x60) // Magnetic Full-Scale Selection
  259. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_2G (0x00) // ±2 gauss
  260. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_4G (0x20) // ±4 gauss
  261. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_8G (0x40) // ±8 gauss
  262. #define LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_12G (0x60) // ±12 gauss
  263.  
  264. /**************************************************************************
  265. ACCELEROMETER/MAGNETOMETER CONTROL REGISTER 7 DESCRIPTION
  266. **************************************************************************/
  267. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_MASK (0xC0) // High-Pass Filter Mode Selection for Acceleration Data
  268. #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)
  269. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_REF (0x40) // Reference signal for filtering
  270. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_NORMAL1 (0x80) // Normal mode
  271. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_AUTO (0xC0) // Autoreset on interrupt event
  272.  
  273. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_MASK (0x20) // Filtered Acceleration Data Selection
  274. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_BYPASS (0x00) // Internal Filter Bypassed
  275. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_INTFILTER (0x20) // Data From Internal Filter Sent to Output Register and FIFO
  276.  
  277. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_MASK (0x04) // Magnetic Sensor Mode Selection
  278. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_MODR (0x00) // Magnetic Data Rate is Configured by MODR Bits
  279. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_3_125 (0x04) // MODR is Set to 3.125 Hz Independently From the MODR Settings
  280.  
  281. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_MASK (0x03) // Magnetic Sensor Mode Selection
  282. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_CONTINUOUS (0x00) // Continuous-Conversion Mode
  283. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_SINGLE (0x01) // Single-conversion mode
  284. #define LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_PDOWN (0x03) // Power-Down mode
  285.  
  286.  
  287. typedef enum
  288. {
  289. GYRO_DATARATE_95_12_5 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_12_5,
  290. GYRO_DATARATE_95_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_95_25,
  291. GYRO_DATARATE_190_12_5 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_12_5,
  292. GYRO_DATARATE_190_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_25,
  293. GYRO_DATARATE_190_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_50,
  294. GYRO_DATARATE_190_70 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_190_70,
  295. GYRO_DATARATE_380_20 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_20,
  296. GYRO_DATARATE_380_25 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_25,
  297. GYRO_DATARATE_380_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_50,
  298. GYRO_DATARATE_380_100 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_380_100,
  299. GYRO_DATARATE_760_30 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_30,
  300. GYRO_DATARATE_760_35 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_35,
  301. GYRO_DATARATE_760_50 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_50,
  302. GYRO_DATARATE_760_100 = LSM9DS0_REG_GYRO_CTRL_REG1_DRBW_760_100
  303. } lsmGyroDataRate_t;
  304.  
  305. typedef enum
  306. {
  307. GYRO_POWER_DOWN_MODE = LSM9DS0_REG_GYRO_CTRL_REG1_PD_DOWN,
  308. GYRO_NORMAL_MODE = LSM9DS0_REG_GYRO_CTRL_REG1_PD_NORMAL
  309. } lsmGyroMode_t;
  310.  
  311. typedef enum
  312. {
  313. GYRO_Z_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_DISABLE,
  314. GYRO_Z_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_ENABLE
  315. } lsmGyroZen_t;
  316.  
  317. typedef enum
  318. {
  319. GYRO_Y_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_YEN_DISABLE,
  320. GYRO_Y_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_YEN_ENABLE
  321. } lsmGyroYen_t;
  322.  
  323. typedef enum
  324. {
  325. GYRO_X_AXIS_DISABLED = LSM9DS0_REG_GYRO_CTRL_REG1_XEN_DISABLE,
  326. GYRO_X_AXIS_ENABLED = LSM9DS0_REG_GYRO_CTRL_REG1_XEN_ENABLE
  327. } lsmGyroXen_t;
  328.  
  329. typedef enum
  330. {
  331. GYRO_CONTINUOUS = LSM9DS0_REG_GYRO_CTRL_REG4_BDU_CONTINUOUS,
  332. GYRO_NOT_UPDATED = LSM9DS0_REG_GYRO_CTRL_REG4_BDU_NOTUPDATE
  333. } lsmGyroBlockData_t;
  334.  
  335. typedef enum
  336. {
  337. GYRO_DATA_LSB = LSM9DS0_REG_GYRO_CTRL_REG4_BLE_LSB,
  338. GYRO_DATA_MSB = LSM9DS0_REG_GYRO_CTRL_REG4_BLE_MSB
  339. } lsmGyroEndianData_t;
  340.  
  341. typedef enum
  342. {
  343. GYRO_SCALE_245DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_245,
  344. GYRO_SCALE_500DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_500,
  345. GYRO_SCALE_2000DPS = LSM9DS0_REG_GYRO_CTRL_REG4_FS_2000
  346. } lsmGyroScale_t;
  347.  
  348. typedef enum
  349. {
  350. GYRO_SELF_TEST_NORMAL = LSM9DS0_REG_GYRO_CTRL_REG4_ST_NORMAL,
  351. GYRO_SELF_TEST_0 = LSM9DS0_REG_GYRO_CTRL_REG4_ST_0,
  352. GYRO_SELF_TEST_1 = LSM9DS0_REG_GYRO_CTRL_REG4_ST_1
  353. } lsmGyroSelfTest_t;
  354.  
  355. typedef enum
  356. {
  357. GYRO_SPI_WIRE_4 = LSM9DS0_REG_GYRO_CTRL_REG4_SIM_4WIRE,
  358. GYRO_SPI_WIRE_3 = LSM9DS0_REG_GYRO_CTRL_REG4_SIM_3WIRE
  359. } lsmGyroSPIWire_t;
  360.  
  361. typedef enum
  362. {
  363. ACCEL_DATARATE_POWERDOWN = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_PD,
  364. ACCEL_DATARATE_3_125HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_3_125,
  365. ACCEL_DATARATE_6_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_6_25,
  366. ACCEL_DATARATE_12_5HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_12_5,
  367. ACCEL_DATARATE_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_25,
  368. ACCEL_DATARATE_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_50,
  369. ACCEL_DATARATE_100HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_100,
  370. ACCEL_DATARATE_200HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_200,
  371. ACCEL_DATARATE_400HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_400,
  372. ACCEL_DATARATE_800HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_800,
  373. ACCEL_DATARATE_1600HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AODR_1600
  374. } lsmAccelDataRate_t;
  375.  
  376. typedef enum
  377. {
  378. ACCELMAG_CONTINUOUS = LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_CONTINUOUS,
  379. ACCELMAG_NOT_UPDATED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_NOTUPDATE
  380. } lsmAccelMagBlockData_t;
  381.  
  382. typedef enum
  383. {
  384. ACCEL_Z_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_DISABLE,
  385. ACCEL_Z_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_ENABLE
  386. } lsmAccelZen_t;
  387.  
  388. typedef enum
  389. {
  390. ACCEL_Y_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE,
  391. ACCEL_Y_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE
  392. } lsmAccelYen_t;
  393.  
  394. typedef enum
  395. {
  396. ACCEL_X_AXIS_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_DISABLE,
  397. ACCEL_X_AXIS_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE
  398. } lsmAccelXen_t;
  399.  
  400. typedef enum
  401. {
  402. ACCEL_BANDWIDTH_773HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_773,
  403. ACCEL_BANDWIDTH_194HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_194,
  404. ACCEL_BANDWIDTH_362HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_362,
  405. ACCEL_BANDWIDTH_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_50
  406.  
  407. } lsmAccelBandwidth_t;
  408.  
  409.  
  410. typedef enum
  411. {
  412. ACCEL_RANGE_2G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_2G,
  413. ACCEL_RANGE_4G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_4G,
  414. ACCEL_RANGE_6G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_6G,
  415. ACCEL_RANGE_8G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_8G,
  416. ACCEL_RANGE_16G = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AFS_16G
  417. } lsmAccelRange_t;
  418.  
  419. typedef enum
  420. {
  421. ACCEL_SELF_TEST_NORMAL = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NORMAL,
  422. ACCEL_SELF_TEST_POSITIVE = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_POSITIVE,
  423. ACCEl_SELF_TEST_NEGATIVE = LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NEGATIVE
  424. } lsmAccelSelfTest_t;
  425.  
  426. typedef enum
  427. {
  428. ACCEL_MAG_SPI_WIRE_4 = LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_4WIRE,
  429. ACCEL_MAG_SPI_WIRE_3 = LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_3WIRE
  430. } lsmAccelMagSPIWire_t;
  431.  
  432. typedef enum
  433. {
  434. TEMP_SENSOR_DISABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_DISABLED,
  435. TEMP_SENSOR_ENABLED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_ENABLED
  436. } lsmTempSensor_t;
  437.  
  438. typedef enum
  439. {
  440. MAG_RESOLUTION_LOW = LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_LOW,
  441. MAG_RESOLUTION_HIGH = LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_HIGH
  442. } lsmMagResolution_t;
  443.  
  444. typedef enum
  445. {
  446. MAG_DATARATE_3_125HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_3_125,
  447. MAG_DATARATE_6_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_6_25,
  448. MAG_DATARATE_12_5HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_12_5,
  449. MAG_DATARATE_25HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_25,
  450. MAG_DATARATE_50HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_50,
  451. MAG_DATARATE_100HZ = LSM9DS0_REG_ACCELMAG_CTRL_REG5_MODR_100
  452. } lsmMagDataRate_t;
  453.  
  454. typedef enum
  455. {
  456. MAG_INTR2_NOT_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_NOLATCH,
  457. MAG_INTR2_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR2_LATCH
  458. } lsmMagIntr2Latch_t;
  459.  
  460. typedef enum
  461. {
  462. MAG_INTR1_NOT_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_NOLATCH,
  463. MAG_INTR1_LATCHED = LSM9DS0_REG_ACCELMAG_CTRL_REG5_LIR1_LATCH
  464. } lsmMagIntr1Latch_t;
  465.  
  466. typedef enum
  467. {
  468. MAG_GAIN_2GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_2G,
  469. MAG_GAIN_4GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_4G,
  470. MAG_GAIN_8GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_8G,
  471. MAG_GAIN_12GAUSS = LSM9DS0_REG_ACCELMAG_CTRL_REG6_MFS_12G
  472. } lsmMagGain_t;
  473.  
  474. typedef enum
  475. {
  476. MAG_CONTINUOUS = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_CONTINUOUS,
  477. MAG_SINGLE = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_SINGLE,
  478. MAG_POWER_DOWN = LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_PDOWN
  479. } lsmMagMode_t;
  480.  
  481. typedef struct
  482. {
  483. int16_t X;
  484. int16_t Y;
  485. int16_t Z;
  486. float T;
  487. } lsmSensorData_t;
  488.  
  489.  
  490. class LSM9DS0
  491. {
  492. protected:
  493. // Instance-specific properties
  494. uint8_t lsm_conversionDelay;
  495. lsmGyroDataRate_t lsm_gyrodatarate;
  496. lsmGyroMode_t lsm_gyromode;
  497. lsmGyroZen_t lsm_gyrozen;
  498. lsmGyroYen_t lsm_gyroyen;
  499. lsmGyroXen_t lsm_gyroxen;
  500. lsmGyroBlockData_t lsm_gyroblockdata;
  501. lsmGyroEndianData_t lsm_gyroendiandata;
  502. lsmGyroScale_t lsm_gyroscale;
  503. lsmGyroSelfTest_t lsm_gyroselftest;
  504. lsmGyroSPIWire_t lsm_gyrospiwire;
  505. lsmAccelDataRate_t lsm_acceldatarate;
  506. lsmAccelMagBlockData_t lsm_accelmagblockdata;
  507. lsmAccelZen_t lsm_accelzen;
  508. lsmAccelYen_t lsm_accelyen;
  509. lsmAccelXen_t lsm_accelxen;
  510. lsmAccelBandwidth_t lsm_accelbandwidth;
  511. lsmAccelRange_t lsm_accelrange;
  512. lsmAccelSelfTest_t lsm_accelselftest;
  513. lsmAccelMagSPIWire_t lsm_accelmagspiwire;
  514. lsmTempSensor_t lsm_tempsensor;
  515. lsmMagResolution_t lsm_magresolution;
  516. lsmMagDataRate_t lsm_magdatarate;
  517. lsmMagIntr2Latch_t lsm_magintr2latch;
  518. lsmMagIntr1Latch_t lsm_magintr1latch;
  519. lsmMagGain_t lsm_maggain;
  520. lsmMagMode_t lsm_magmode;
  521.  
  522. public:
  523. uint8_t lsm_i2cAddressG;
  524. uint8_t lsm_i2cAddressXM;
  525. lsmSensorData_t lsm_gyroData;
  526. lsmSensorData_t lsm_accelData;
  527. lsmSensorData_t lsm_magData;
  528. lsmSensorData_t lsm_tempData;
  529. int16_t tempData;
  530. void getAddrG_LSM9DS0(uint8_t i2cAddress);
  531. void getAddrXM_LSM9DS0(uint8_t i2cAddress);
  532. bool begin(void);
  533. void Measure_Sensor(void);
  534. void setUpGyroscope(void);
  535. void setUpAccelerometer(void);
  536. void setUpMagnetometer(void);
  537. void Measure_Gyroscope(void);
  538. void Measure_Accelerometer(void);
  539. void Measure_Magnetometer(void);
  540. void Measure_Temperature(void);
  541. void setGyroDataRate(lsmGyroDataRate_t gyrodatarate);
  542. lsmGyroDataRate_t getGyroDataRate(void);
  543. void setGyroMode(lsmGyroMode_t gyromode);
  544. lsmGyroMode_t getGyroMode(void);
  545. void setGyroZen(lsmGyroZen_t gyrozen);
  546. lsmGyroZen_t getGyroZen(void);
  547. void setGyroYen(lsmGyroYen_t gyroyen);
  548. lsmGyroYen_t getGyroYen(void);
  549. void setGyroXen(lsmGyroXen_t gyroxen);
  550. lsmGyroXen_t getGyroXen(void);
  551. void setGyroBlockData(lsmGyroBlockData_t gyroblockdata);
  552. lsmGyroBlockData_t getGyroBlockData(void);
  553. void setGyroEndianData(lsmGyroEndianData_t gyroendiandata);
  554. lsmGyroEndianData_t getGyroEndianData(void);
  555. void setGyroScale(lsmGyroScale_t gyroscale);
  556. lsmGyroScale_t getGyroScale(void);
  557. void setGyroSelfTest(lsmGyroSelfTest_t gyroselftest);
  558. lsmGyroSelfTest_t getGyroSelfTest(void);
  559. void setGyroSPIWire(lsmGyroSPIWire_t gyrospiwire);
  560. lsmGyroSPIWire_t getGyroSPIWire(void);
  561. void setAccelDataRate(lsmAccelDataRate_t acceldatarate);
  562. lsmAccelDataRate_t getAccelDataRate(void);
  563. void setAccelMagBlockData(lsmAccelMagBlockData_t accelmagblockdata);
  564. lsmAccelMagBlockData_t getAccelMagBlockData(void);
  565. void setAccelZen(lsmAccelZen_t accelzen);
  566. lsmAccelZen_t getAccelZen(void);
  567. void setAccelYen(lsmAccelYen_t accelyen);
  568. lsmAccelYen_t getAccelYen(void);
  569. void setAccelXen(lsmAccelXen_t accelxen);
  570. lsmAccelXen_t getAccelXen(void);
  571. void setAccelBandwidth(lsmAccelBandwidth_t accelbandwidth);
  572. lsmAccelBandwidth_t getAccelBandwidth(void);
  573. void setAccelRange(lsmAccelRange_t accelrange);
  574. lsmAccelRange_t getAccelRange(void);
  575. void setAccelSelfTest(lsmAccelSelfTest_t accelselftest);
  576. lsmAccelSelfTest_t getAccelSelfTest(void);
  577. void setAccelMagSPIWire(lsmAccelMagSPIWire_t accelmagspiwire);
  578. lsmAccelMagSPIWire_t getAccelMagSPIWire(void);
  579. void setTempSensor(lsmTempSensor_t tempsensor);
  580. lsmTempSensor_t getTempSensor(void);
  581. void setMagResolution(lsmMagResolution_t magresolution);
  582. lsmMagResolution_t getMagResolution(void);
  583. void setMagDataRate(lsmMagDataRate_t magdatarate);
  584. lsmMagDataRate_t getMagDataRate(void);
  585. void setMagIntr2Latch(lsmMagIntr2Latch_t magintr2latch);
  586. lsmMagIntr2Latch_t getMagIntr2Latch(void);
  587. void setMagIntr1Latch(lsmMagIntr1Latch_t magintr1latch);
  588. lsmMagIntr1Latch_t getMagIntr1Latch(void);
  589. void setMagGain(lsmMagGain_t maggain);
  590. lsmMagGain_t getMagGain(void);
  591. void setMagMode(lsmMagMode_t magmode);
  592. lsmMagMode_t getMagMode(void);
  593. private:
  594. };

Sensor read values
LSM9DS0 Sensor reads value of gyroscope, Magnetometer and accelerometer using these functions as you can see that a variable config1 is used to add all the x,y,z axis and enable configurations by using a bit-wise OR.

 

LSM9DS0 Arduino Code

In Arduino code our first step is to call addresses of every sensor Accelerometer, Gyroscope, and Magnetometer. Setting up their data rates and gain, then we read sensor data by calling the functions  like  setUpGyroscope, setUpAccelerometer, setUpMagnetometer. These functions read binary data and convert those values into decimal form.

  1. #include
  2. #include
  3.  
  4. LSM9DS0 lsm;
  5.  
  6. void setup(void)
  7. {
  8. Serial.begin(9600);
  9. // The address can be changed making the option of connecting multiple devices
  10. lsm.getAddrG_LSM9DS0(LSM9DS0_DEFAULT_ADDRESS_GYRO); // 0x6A
  11. // lsm.getAddrG_LSM9DS0(LSM9DS0_ADDRESS_GYRO_UPDATED); // 0x6B
  12.  
  13. lsm.getAddrXM_LSM9DS0(LSM9DS0_DEFAULT_ADDRESS_ACCELMAG); // 0x1E
  14. // lsm.getAddrXM_LSM9DS0(LSM9DS0_ADDRESS_ACCELMAG_UPDATED); // 0x1D
  15.  
  16. // The Gyroscope's Output Data Rate and Bandwidth Selection and Full-Scale Selection,
  17. // Acceleration Data Rate Selection and Acceleration Full-Scale Selection,
  18. // Magnetic Data Rate Selection and Magnetic Full-Scale Selection
  19. // can be changed via the following functions
  20.  
  21. /*
  22. // Also some more parameters can be changed using the following functions
  23. // Gyroscope:
  24. // Power-Down Mode Enable, Gyroscope X, Y, Z Axes Enable,
  25. // Block Data Update, Big/Little Endian Data Selection, Full-Scale Selection,
  26. // Self-Test Enable and SPI Serial Interface Mode Selection
  27. // Accelerometer and Magmetometer:
  28. // Block Data Update for Acceleration and Magnetic Data
  29. // Acceleration X, Y, Z Axes Enable
  30. // Acceleration Anti-Alias Filter Bandwidth
  31. // Self-Test Mode Configuration, SPI Serial Interface Mode Selection
  32. // Temperature Sensor Enable, Magnetic Resolution Selection
  33. // Latch Interrupt Request on INT2_SRC Register, Latch Interrupt Request on INT1_SRC Register
  34. // Magnetic Sensor Mode Selection
  35. // These functions can be modified and added here so that the parameters can be altered as per requirement
  36. */
  37.  
  38. lsm.setGyroDataRate(GYRO_DATARATE_95_12_5); // ODR (Hz): 95, Cutoff: 12.5
  39. // lsm.setGyroDataRate(GYRO_DATARATE_95_25); // ODR (Hz): 95, Cutoff: 25
  40. // lsm.setGyroDataRate(GYRO_DATARATE_190_12_5); // ODR (Hz): 190, Cutoff: 12.5
  41. // lsm.setGyroDataRate(GYRO_DATARATE_190_25); // ODR (Hz): 190, Cutoff: 25
  42. // lsm.setGyroDataRate(GYRO_DATARATE_190_50); // ODR (Hz): 190, Cutoff: 50
  43. // lsm.setGyroDataRate(GYRO_DATARATE_190_70); // ODR (Hz): 190, Cutoff: 70
  44. // lsm.setGyroDataRate(GYRO_DATARATE_380_20); // ODR (Hz): 380, Cutoff: 20
  45. // lsm.setGyroDataRate(GYRO_DATARATE_380_25); // ODR (Hz): 380, Cutoff: 25
  46. // lsm.setGyroDataRate(GYRO_DATARATE_380_50); // ODR (Hz): 380, Cutoff: 50
  47. // lsm.setGyroDataRate(GYRO_DATARATE_380_100); // ODR (Hz): 380, Cutoff: 100
  48. // lsm.setGyroDataRate(GYRO_DATARATE_760_30); // ODR (Hz): 760, Cutoff: 30
  49. // lsm.setGyroDataRate(GYRO_DATARATE_760_35); // ODR (Hz): 760, Cutoff: 35
  50. // lsm.setGyroDataRate(GYRO_DATARATE_760_50); // ODR (Hz): 760, Cutoff: 50
  51. // lsm.setGyroDataRate(GYRO_DATARATE_760_100); // ODR (Hz): 760, Cutoff: 100
  52.  
  53. lsm.setGyroScale(GYRO_SCALE_2000DPS); // 2000 dps
  54. // lsm.setGyroScale(GYRO_SCALE_245DPS); // 245 dps
  55. // lsm.setGyroScale(GYRO_SCALE_500DPS); // 500 dps
  56.  
  57. lsm.setAccelDataRate(ACCEL_DATARATE_3_125HZ); // AODR (Hz): 3.125
  58. // lsm.setAccelDataRate(ACCEL_DATARATE_POWERDOWN); // Power Down Mode
  59. // lsm.setAccelDataRate(ACCEL_DATARATE_6_25HZ); // AODR (Hz): 6.25
  60. // lsm.setAccelDataRate(ACCEL_DATARATE_12_5HZ); // AODR (Hz): 12.5
  61. // lsm.setAccelDataRate(ACCEL_DATARATE_25HZ); // AODR (Hz): 25
  62. // lsm.setAccelDataRate(ACCEL_DATARATE_50HZ); // AODR (Hz): 50
  63. // lsm.setAccelDataRate(ACCEL_DATARATE_100HZ); // AODR (Hz): 100
  64. // lsm.setAccelDataRate(ACCEL_DATARATE_200HZ); // AODR (Hz): 200
  65. // lsm.setAccelDataRate(ACCEL_DATARATE_400HZ); // AODR (Hz): 400
  66. // lsm.setAccelDataRate(ACCEL_DATARATE_800HZ); // AODR (Hz): 800
  67. // lsm.setAccelDataRate(ACCEL_DATARATE_1600HZ); // AODR (Hz): 1600
  68.  
  69. lsm.setAccelRange(ACCEL_RANGE_16G); // ±16 g
  70. // lsm.setAccelRange(ACCEL_RANGE_2G); // ±2 g
  71. // lsm.setAccelRange(ACCEL_RANGE_4G); // ±4 g
  72. // lsm.setAccelRange(ACCEL_RANGE_6G); // ±6 g
  73. // lsm.setAccelRange(ACCEL_RANGE_8G); // ±8 g
  74.  
  75. lsm.setMagDataRate(MAG_DATARATE_3_125HZ); // MODR (Hz): 3.125
  76. // lsm.setMagDataRate(MAG_DATARATE_6_25HZ); // MODR (Hz): 6.25
  77. // lsm.setMagDataRate(MAG_DATARATE_12_5HZ); // MODR (Hz): 12.5
  78. // lsm.setMagDataRate(MAG_DATARATE_25HZ); // MODR (Hz): 25
  79. // lsm.setMagDataRate(MAG_DATARATE_50HZ); // MODR (Hz): 50
  80. // lsm.setMagDataRate(MAG_DATARATE_100HZ); // MODR (Hz): 100
  81.  
  82. lsm.setMagGain(MAG_GAIN_12GAUSS); // ±12 guass
  83. // lsm.setMagGain(MAG_GAIN_2GAUSS); // ±2 guass
  84. // lsm.setMagGain(MAG_GAIN_4GAUSS); // ±4 guass
  85. // lsm.setMagGain(MAG_GAIN_8GAUSS); // ±8 guass
  86.  
  87. lsm.begin();
  88. delay(1000);
  89. }
  90.  
  91. void loop(void)
  92. {
  93. byte errorG, errorXM;
  94. int8_t addressG, addressXM;
  95.  
  96. // LSM9DS0 Gyroscope Address
  97. addressG = lsm.lsm_i2cAddressG;
  98. // LSM9DS0 Accelerometer/Magnetometer Address
  99. addressXM = lsm.lsm_i2cAddressXM;
  100.  
  101. // The i2c_scanner uses the return value of
  102. // the Write.endTransmisstion to see if
  103. // a device did acknowledge to the address.
  104. Wire.beginTransmission(addressG);
  105. errorG = Wire.endTransmission();
  106. Wire.beginTransmission(addressXM);
  107. errorXM = Wire.endTransmission();
  108. if ((errorG == 0) && (errorXM == 0))
  109. {
  110. Serial.println("Getting Angular Rate, Linear Acceleration, and Magnetic Field Data Readings from LSM9DS0");
  111. Serial.println(" ");
  112. // Set up the sensor for Gyroscope, Accelerometer, and Magnetometer
  113. lsm.setUpGyroscope();
  114. lsm.setUpAccelerometer();
  115. lsm.setUpMagnetometer();
  116. delay(500);
  117. // Display the results for Angular Rate, Acceleration, and Magnetic Field Values
  118. lsm.Measure_Sensor();
  119. lsm.Measure_Gyroscope();
  120. lsm.Measure_Accelerometer();
  121. lsm.Measure_Magnetometer();
  122.  
  123. // Output Data to Screen
  124. Serial.print("Rotation in X-Axis: ");
  125. Serial.println(lsm.lsm_gyroData.X);
  126. Serial.print("Rotation in Y-Axis: ");
  127. Serial.println(lsm.lsm_gyroData.Y);
  128. Serial.print("Rotation in Z-Axis: ");
  129. Serial.println(lsm.lsm_gyroData.Z);
  130. Serial.println(" ");
  131. Serial.println(" *********** ");
  132. Serial.println(" ");
  133. delay(500);
  134. Serial.print("Linear Acceleration in X-Axis: ");
  135. Serial.println(lsm.lsm_accelData.X);
  136. Serial.print("Linear Acceleration in Y-Axis: ");
  137. Serial.println(lsm.lsm_accelData.Y);
  138. Serial.print("Linear Acceleration in Z-Axis: ");
  139. Serial.println(lsm.lsm_accelData.Z);
  140. Serial.println(" ");
  141. Serial.println(" *********** ");
  142. Serial.println(" ");
  143. delay(500);
  144. Serial.print("Magnetic Field in X-Axis: ");
  145. Serial.println(lsm.lsm_magData.X);
  146. Serial.print("Magnetic Field in Y-Axis: ");
  147. Serial.println(lsm.lsm_magData.Y);
  148. Serial.print("Magnetic Field in Z-Axis: ");
  149. Serial.println(lsm.lsm_magData.Z);
  150. Serial.println(" ");
  151. Serial.println(" *********** ");
  152. Serial.println(" ");
  153. Serial.println("LSM9DS0 Temperature Readings");
  154. Serial.println(" ");
  155. Serial.print("Temperature Reading in Celsius: ");
  156. Serial.print(lsm.lsm_tempData.T);
  157. Serial.println(" °C");
  158. Serial.print("Temperature Reading in Fahrenheit: ");
  159. Serial.print(((lsm.lsm_tempData.T * 1.8) + 32));
  160. Serial.println(" °F");
  161. Serial.println(" ");
  162. Serial.println(" *************************** ");
  163. Serial.println(" ");
  164. delay(1000);
  165. }
  166. else
  167. {
  168. Serial.println("LSM9DS0 Disconnected!");
  169. Serial.println(" ");
  170. Serial.println(" ************ ");
  171. Serial.println(" ");
  172. }
  173.  
  174.  
  175. delay(1000);
  176. }

Testing of the sensor
Getting values for linear acceleration and rotational axis
first value

Getting remaining values of magnetic field axis and temperature in second image

second value

 

Reference:

Datasheet

Library

 

  1. void LSM9DS0::setUpGyroscope(void)
  2. {
  3. // Set Up the Configuration for the Gyroscope Control Register 1
  4. /*
  5. // Set the Output Data Rate
  6. uint8_t config1 = lsm_gyrodatarate;
  7. // Set the Power Down Mode Enable
  8. config1 |= lsm_gyromode;
  9. // Set the Gyroscpe Z-Axis Enable
  10. config1 |= lsm_gyrozen;
  11. // Set the Gyroscpe Y-Axis Enable
  12. config1 |= lsm_gyroyen;
  13. // Set the Gyroscpe X-Axis Enable
  14. config1 |= lsm_gyroxen;
  15. */
  16. uint8_t config1 = LSM9DS0_REG_GYRO_CTRL_REG1_PD_NORMAL | // Normal Mode
  17. LSM9DS0_REG_GYRO_CTRL_REG1_ZEN_ENABLE | // Gyroscope Z-Axis Enabled
  18. LSM9DS0_REG_GYRO_CTRL_REG1_YEN_ENABLE | // Gyroscope Y-Axis Enabled
  19. LSM9DS0_REG_GYRO_CTRL_REG1_XEN_ENABLE; // Gyroscope X-Axis Enabled
  20. config1 |= lsm_gyrodatarate; // Output Data Rate and Bandwidth Selection
  21. // Write the configuration to the Gyroscope Control Register 1
  22. writeRegister(lsm_i2cAddressG, LSM9DS0_REG_GYRO_CTRL_REG1, config1);
  23. // Wait for the configuration to complete
  24. delay(lsm_conversionDelay);
  25. // Set Up the Configuration for the Gyroscope Control Register 4
  26. /*
  27. // Set the Block Data Update
  28. uint8_t config4 = lsm_gyroblockdata;
  29. // Set the Big/Little Endian Data Selection
  30. config4 |= lsm_gyroendiandata;
  31. // Set the Full Scale Selection
  32. config4 |= lsm_gyroscale;
  33. // Set the Self-Test Enable
  34. config4 |= lsm_gyroselftest;
  35. // Set the SPI Serial Interface Mode Selection
  36. config4 |= lsm_gyrospiwire;
  37. */
  38. uint8_t config4 = LSM9DS0_REG_GYRO_CTRL_REG4_BDU_CONTINUOUS | // Continuous Update
  39. LSM9DS0_REG_GYRO_CTRL_REG4_BLE_LSB | // Data LSB @ Lower Address
  40. LSM9DS0_REG_GYRO_CTRL_REG4_ST_NORMAL | // Normal Mode
  41. LSM9DS0_REG_GYRO_CTRL_REG4_SIM_4WIRE; // 4-Wire Interface
  42. config4 |= lsm_gyroscale; // Full-Scale Selection
  43. // Write the configuration to the Gyroscope Control Register 4
  44. writeRegister(lsm_i2cAddressG, LSM9DS0_REG_GYRO_CTRL_REG4, config4);
  45. // Wait for the configuration to complete
  46. delay(lsm_conversionDelay);
  47. }
  48.  
  49. /**************************************************************************/
  50. /*
  51. Sets up the Accelerometer
  52. */
  53. /**************************************************************************/
  54. void LSM9DS0::setUpAccelerometer(void)
  55. {
  56. // Set Up the Configuration for the Accelerometer/Magnetometer Control Register 1
  57. /*
  58. // Set the Acceleration Output Data Rate
  59. uint8_t config1 = lsm_acceldatarate;
  60. // Set the Block Data Update for Acceleration and Magnetic Data
  61. config1 |= lsm_accelmagblockdata;
  62. // Set the Acceleration Z-Axis Enable
  63. config1 |= lsm_accelzen;
  64. // Set the Acceleration Y-Axis Enable
  65. config1 |= lsm_accelyen;
  66. // Set the Acceleration X-Axis Enable
  67. config1 |= lsm_accelxen;
  68. */
  69. uint8_t config1 = LSM9DS0_REG_ACCELMAG_CTRL_REG1_BDU_CONTINUOUS | // Continuous Update
  70. LSM9DS0_REG_ACCELMAG_CTRL_REG1_AZEN_ENABLE | // Acceleration Z-Axis Enabled
  71. LSM9DS0_REG_ACCELMAG_CTRL_REG1_AYEN_ENABLE | // Acceleration Y-Axis Enabled
  72. LSM9DS0_REG_ACCELMAG_CTRL_REG1_AXEN_ENABLE; // Acceleration X-Axis Enabled
  73. config1 |= lsm_acceldatarate; // Acceleration Data Rate Configuration
  74. // Write the configuration to the Accelerometer/Magnetometer Control Register 1
  75. writeRegister(lsm_i2cAddressXM, LSM9DS0_REG_ACCELMAG_CTRL_REG1, config1);
  76. // Wait for the configuration to complete
  77. delay(lsm_conversionDelay);
  78. // Set Up the Configuration for the Accelerometer/Magnetometer Control Register 2
  79. /*
  80. // Set the Accelerometer Anti-Alias Filter Bandwidth
  81. uint8_t config2 = lsm_accelbandwidth;
  82. // Set the Acceleration Full-Scale Selection
  83. config2 |= lsm_accelrange;
  84. // Set the Acceleration Self-Test Enable
  85. config2 |= lsm_sccelselftest;
  86. // Set the SPI Serial Interface Mode Selection
  87. config2 |= lsm_accelmagspiwire;
  88. */
  89. uint8_t config2 = LSM9DS0_REG_ACCELMAG_CTRL_REG2_ABW_773 | // 773 Hz, Accelerometer Anti-Alias Filter Bandwidth
  90. LSM9DS0_REG_ACCELMAG_CTRL_REG2_AST_NORMAL | // Normal Mode
  91. LSM9DS0_REG_ACCELMAG_CTRL_REG2_SIM_4WIRE; // 4-Wire Interface
  92. config2 |= lsm_accelrange; // Acceleration Full-Scale Selection
  93. // Write the configuration to the Accelerometer/Magnetometer Control Register 2
  94. writeRegister(lsm_i2cAddressXM, LSM9DS0_REG_ACCELMAG_CTRL_REG2, config2);
  95. // Wait for the configuration to complete
  96. delay(lsm_conversionDelay);
  97. }
  98.  
  99. /**************************************************************************/
  100. /*
  101. Sets up the Magnetometer
  102. */
  103. /**************************************************************************/
  104. void LSM9DS0::setUpMagnetometer(void)
  105. {
  106. // Set Up the Configuration for the Accelerometer/Magnetometer Control Register 5
  107. /*
  108. // Set the Temperature Sensor Enable
  109. uint8_t config5 = lsm_tempsensor;
  110. // Set the Magnetic Resolution Selection
  111. config5 |= lsm_magresolution;
  112. // Set the Magnetic Data Rate Selection
  113. config5 |= lsm_magdatarate;
  114. // Set the Latch Interrupt Request on INT2_SRC Register
  115. config5 |= lsm_magintr2latch;
  116. // Set the Latch Interrupt Request on INT1_SRC Register
  117. config5 |= lsm_magintr1latch;
  118. */
  119. uint8_t config5 = LSM9DS0_REG_ACCELMAG_CTRL_REG5_TEMP_ENABLED | // Temperature Sensor Enabled
  120. LSM9DS0_REG_ACCELMAG_CTRL_REG5_M_RES_HIGH; // Magnetic Resolution High
  121. config5 |= lsm_magdatarate; // Magnetic Data Rate Selection
  122. // Write the configuration to the Accelerometer/Magnetometer Control Register 5
  123. writeRegister(lsm_i2cAddressXM, LSM9DS0_REG_ACCELMAG_CTRL_REG5, config5);
  124. // Wait for the configuration to complete
  125. delay(lsm_conversionDelay);
  126. // Set Up the Configuration for the Accelerometer/Magnetometer Control Register 6
  127. // Set the Magnetic Full-Scale Selection
  128. uint8_t config6 = lsm_maggain;
  129. // Write the configuration to the Accelerometer/Magnetometer Control Register 6
  130. writeRegister(lsm_i2cAddressXM, LSM9DS0_REG_ACCELMAG_CTRL_REG6, config6);
  131. // Wait for the configuration to complete
  132. delay(lsm_conversionDelay);
  133. // Set Up the Configuration for the Accelerometer/Magnetometer Control Register 7
  134. uint8_t config7 = LSM9DS0_REG_ACCELMAG_CTRL_REG7_AHPM_NORMAL | // Normal Mode
  135. LSM9DS0_REG_ACCELMAG_CTRL_REG7_AFDS_BYPASS | // Internal Filter Bypassed
  136. LSM9DS0_REG_ACCELMAG_CTRL_REG7_MLP_MODR | // Magnetic Data Rate is Configured by MODR Bits
  137. LSM9DS0_REG_ACCELMAG_CTRL_REG7_MD_CONTINUOUS; // Continuous-Conversion Mode
  138. // Set the Magnetic Sensor Mode
  139. config7 |= lsm_magmode;
  140. // Write the configuration to the Accelerometer/Magnetometer Control Register 7
  141. writeRegister(lsm_i2cAddressXM, LSM9DS0_REG_ACCELMAG_CTRL_REG7, config7);
  142. // Wait for the configuration to complete
  143. delay(lsm_conversionDelay);
  144. }