Adafruit_LSM6DSO32.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*!
  2. * @file Adafruit_LSM6DSO32.cpp
  3. * Adafruit LSM6DSO32 6-DoF Accelerometer and Gyroscope library
  4. *
  5. * Bryan Siepert for Adafruit Industries
  6. * BSD (see license.txt)
  7. */
  8. #include "Arduino.h"
  9. #include <Wire.h>
  10. #include "Adafruit_LSM6DSO32.h"
  11. #include "Adafruit_LSM6DSOX.h"
  12. /*!
  13. * @brief Instantiates a new LSM6DSO32 class
  14. */
  15. Adafruit_LSM6DSO32::Adafruit_LSM6DSO32(void) {}
  16. bool Adafruit_LSM6DSO32::_init(int32_t sensor_id) {
  17. Adafruit_BusIO_Register chip_id = Adafruit_BusIO_Register(
  18. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_WHOAMI);
  19. // make sure we're talking to the right chip
  20. if (chip_id.read() != LSM6DSO32_CHIP_ID) {
  21. return false;
  22. }
  23. _sensorid_accel = sensor_id;
  24. _sensorid_gyro = sensor_id + 1;
  25. _sensorid_temp = sensor_id + 2;
  26. reset();
  27. // set the Block Data Update bit
  28. // this prevents MSB/LSB data registers from being updated until both are read
  29. Adafruit_BusIO_Register ctrl3 = Adafruit_BusIO_Register(
  30. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DSOX_CTRL3_C);
  31. Adafruit_BusIO_RegisterBits bdu = Adafruit_BusIO_RegisterBits(&ctrl3, 1, 6);
  32. bdu.write(true);
  33. // Disable I3C
  34. Adafruit_BusIO_Register ctrl_9 = Adafruit_BusIO_Register(
  35. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DSOX_CTRL9_XL);
  36. Adafruit_BusIO_RegisterBits i3c_disable_bit =
  37. Adafruit_BusIO_RegisterBits(&ctrl_9, 1, 1);
  38. i3c_disable_bit.write(true);
  39. // call base class _init()
  40. Adafruit_LSM6DS::_init(sensor_id);
  41. return true;
  42. }
  43. /******************* Adafruit_Sensor functions *****************/
  44. /*!
  45. * @brief Updates the measurement data for all sensors simultaneously
  46. */
  47. /**************************************************************************/
  48. // works for now, should refactor
  49. void Adafruit_LSM6DSO32::_read(void) {
  50. // get raw readings
  51. Adafruit_BusIO_Register data_reg = Adafruit_BusIO_Register(
  52. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_OUT_TEMP_L, 14);
  53. uint8_t buffer[14];
  54. data_reg.read(buffer, 14);
  55. rawTemp = buffer[1] << 8 | buffer[0];
  56. temperature = (rawTemp / 256.0) + 25.0;
  57. rawGyroX = buffer[3] << 8 | buffer[2];
  58. rawGyroY = buffer[5] << 8 | buffer[4];
  59. rawGyroZ = buffer[7] << 8 | buffer[6];
  60. rawAccX = buffer[9] << 8 | buffer[8];
  61. rawAccY = buffer[11] << 8 | buffer[10];
  62. rawAccZ = buffer[13] << 8 | buffer[12];
  63. lsm6ds_gyro_range_t gyro_range = getGyroRange();
  64. float gyro_scale = 1; // range is in milli-dps per bit!
  65. if (gyro_range == ISM330DHCX_GYRO_RANGE_4000_DPS)
  66. gyro_scale = 140.0;
  67. if (gyro_range == LSM6DS_GYRO_RANGE_2000_DPS)
  68. gyro_scale = 70.0;
  69. if (gyro_range == LSM6DS_GYRO_RANGE_1000_DPS)
  70. gyro_scale = 35.0;
  71. if (gyro_range == LSM6DS_GYRO_RANGE_500_DPS)
  72. gyro_scale = 17.50;
  73. if (gyro_range == LSM6DS_GYRO_RANGE_250_DPS)
  74. gyro_scale = 8.75;
  75. if (gyro_range == LSM6DS_GYRO_RANGE_125_DPS)
  76. gyro_scale = 4.375;
  77. gyroX = rawGyroX * gyro_scale * SENSORS_DPS_TO_RADS / 1000.0;
  78. gyroY = rawGyroY * gyro_scale * SENSORS_DPS_TO_RADS / 1000.0;
  79. gyroZ = rawGyroZ * gyro_scale * SENSORS_DPS_TO_RADS / 1000.0;
  80. lsm6dso32_accel_range_t accel_range = getAccelRange();
  81. float accel_scale = 1; // range is in milli-g per bit!
  82. if (accel_range == LSM6DSO32_ACCEL_RANGE_32_G)
  83. accel_scale = 0.976;
  84. if (accel_range == LSM6DSO32_ACCEL_RANGE_16_G)
  85. accel_scale = 0.488;
  86. if (accel_range == LSM6DSO32_ACCEL_RANGE_8_G)
  87. accel_scale = 0.244;
  88. if (accel_range == LSM6DSO32_ACCEL_RANGE_4_G)
  89. accel_scale = 0.122;
  90. accX = rawAccX * accel_scale * SENSORS_GRAVITY_STANDARD / 1000;
  91. accY = rawAccY * accel_scale * SENSORS_GRAVITY_STANDARD / 1000;
  92. accZ = rawAccZ * accel_scale * SENSORS_GRAVITY_STANDARD / 1000;
  93. }
  94. /**************************************************************************/
  95. /*!
  96. @brief Gets the accelerometer measurement range.
  97. @returns The the accelerometer measurement range.
  98. */
  99. lsm6dso32_accel_range_t Adafruit_LSM6DSO32::getAccelRange(void) {
  100. Adafruit_BusIO_Register ctrl1 = Adafruit_BusIO_Register(
  101. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_CTRL1_XL);
  102. Adafruit_BusIO_RegisterBits accel_range =
  103. Adafruit_BusIO_RegisterBits(&ctrl1, 2, 2);
  104. return (lsm6dso32_accel_range_t)accel_range.read();
  105. }
  106. /**************************************************************************/
  107. /*!
  108. @brief Sets the accelerometer measurement range.
  109. @param new_range The `lsm6dso32_accel_range_t` range to set.
  110. */
  111. void Adafruit_LSM6DSO32::setAccelRange(lsm6dso32_accel_range_t new_range) {
  112. Adafruit_BusIO_Register ctrl1 = Adafruit_BusIO_Register(
  113. i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LSM6DS_CTRL1_XL);
  114. Adafruit_BusIO_RegisterBits accel_range =
  115. Adafruit_BusIO_RegisterBits(&ctrl1, 2, 2);
  116. accel_range.write(new_range);
  117. delay(20);
  118. }