Advertisement
Guest User

lsm6ds3h.h (Darkwolf ver.)

a guest
Mar 24th, 2021
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. #ifndef MOTION_LSM6DS3H_H
  2. #define MOTION_LSM6DS3H_H
  3.  
  4. class LSM6DS3H : public I2CDevice, Looper, StateMachine {
  5. public:
  6. const char* name() override { return "LSM6DS3H"; }
  7. enum Registers {
  8. FUNC_CFG_ACCESS = 0x1,
  9. SENSOR_SYNC_TIME_FRAME = 0x4,
  10. FIFO_CONTROL1 = 0x6,
  11. FIFO_CONTROL2 = 0x7,
  12. FIFO_CONTROL3 = 0x8,
  13. FIFO_CONTROL4 = 0x9,
  14. FIFO_CONTROL5 = 0xA,
  15. ORIENT_CFG_G = 0xB,
  16. INT1_CTRL = 0xD,
  17. INT2_CTRL = 0xE,
  18. WHO_AM_I = 0xF,
  19. CTRL1_XL = 0x10,
  20. CTRL2_G = 0x11,
  21. CTRL3_C = 0x12,
  22. CTRL4_C = 0x13,
  23. CTRL5_C = 0x14,
  24. CTRL6_C = 0x15,
  25. CTRL7_G = 0x16,
  26. CTRL8_XL = 0x17,
  27. CTRL9_XL = 0x18,
  28. CTRL10_C = 0x19,
  29. MASTER_CONFIG = 0x1A,
  30. WAKE_UP_SRC = 0x1B,
  31. TAP_SRC = 0x1C,
  32. D6D_SRC = 0x1D,
  33. STATUS_REG = 0x1E,
  34. STATUS_SPIAux = 0x1E,
  35. OUT_TEMP_L = 0x20,
  36. OUT_TEMP_H = 0x21,
  37. OUTX_L_G = 0x22,
  38. OUTX_H_G = 0x23,
  39. OUTY_L_G = 0x24,
  40. OUTY_H_G = 0x25,
  41. OUTZ_L_G = 0x26,
  42. OUTZ_H_G = 0x27,
  43. OUTX_L_XL = 0x28,
  44. OUTX_H_XL = 0x29,
  45. OUTY_L_XL = 0x2A,
  46. OUTY_H_XL = 0x2B,
  47. OUTZ_L_XL = 0x2C,
  48. OUTZ_H_XL = 0x2D,
  49. SENSORHUB1_REG = 0x2E,
  50. SENSORHUB2_REG = 0x2F,
  51. SENSORHUB3_REG = 0x30,
  52. SENSORHUB4_REG = 0x31,
  53. SENSORHUB5_REG = 0x32,
  54. SENSORHUB6_REG = 0x33,
  55. SENSORHUB7_REG = 0x34,
  56. SENSORHUB8_REG = 0x35,
  57. SENSORHUB9_REG = 0x36,
  58. SENSORHUB10_REG = 0x37,
  59. SENSORHUB11_REG = 0x38,
  60. SENSORHUB12_REG = 0x39,
  61. FIFO_STATUS1 = 0x3A,
  62. FIFO_STATUS2 = 0x3B,
  63. FIFO_STATUS3 = 0x3C,
  64. FIFO_STATUS4 = 0x3D,
  65. FIFO_DATA_OUT_L = 0x3E,
  66. FIFO_DATA_OUT_H = 0x3F,
  67. TIMESTAMP0_REG = 0x40,
  68. TIMESTAMP1_REG = 0x40,
  69. TIMESTAMP2_REG = 0x41,
  70. STEP_TIMESTAMP_L = 0x49,
  71. STEP_TIMESTAMP_H = 0x4A,
  72. STEP_COUNTER_L = 0x4B,
  73. STEP_COUNTER_H = 0x4C,
  74. SENSORHUB13_REG = 0x4D,
  75. SENSORHUB14_REG = 0x4E,
  76. SENSORHUB15_REG = 0x4F,
  77. SENSORHUB16_REG = 0x50,
  78. SENSORHUB17_REG = 0x51,
  79. SENSORHUB18_REG = 0x52,
  80. FUNC_SRC = 0x53,
  81. TAP_CFG = 0x58,
  82. TAP_THS_6D = 0x59,
  83. INT_DUR2 = 0x5A,
  84. WAKE_UP_THS = 0x5B,
  85. WAKE_UP_DUR = 0x5C,
  86. FREE_FALL = 0x5D,
  87. MD1_CFG = 0x5E,
  88. MD2_CFG = 0x5F,
  89. OUT_MAG_RAW_X_L = 0x66,
  90. OUT_MAG_RAW_X_H = 0x67,
  91. OUT_MAG_RAW_Y_L = 0x68,
  92. OUT_MAG_RAW_Y_H = 0x69,
  93. OUT_MAG_RAW_Z_L = 0x6A,
  94. OUT_MAG_RAW_Z_H = 0x6B,
  95. CTRL_SPIAux = 0x70
  96. };
  97.  
  98. LSM6DS3H() : I2CDevice(106), Looper(HFLINK) {}
  99.  
  100. void Loop() override {
  101. STATE_MACHINE_BEGIN();
  102.  
  103. while (!i2cbus.inited()) YIELD();
  104.  
  105. while (1) {
  106. first_motion_ = true;
  107. first_accel_ = true;
  108.  
  109. STDOUT.print("Motion setup ... ");
  110. while (!I2CLock()) YIELD();
  111.  
  112. I2C_WRITE_BYTE_ASYNC(CTRL1_XL, 0x88); // 1.66kHz accel, 4G range
  113. I2C_WRITE_BYTE_ASYNC(CTRL2_G, 0x8C); // 1.66kHz gyro, 2000 dps
  114. I2C_WRITE_BYTE_ASYNC(CTRL3_C, 0x44); // ?
  115. I2C_WRITE_BYTE_ASYNC(CTRL4_C, 0x00);
  116. I2C_WRITE_BYTE_ASYNC(CTRL5_C, 0x00);
  117. I2C_WRITE_BYTE_ASYNC(CTRL6_C, 0x00);
  118. I2C_WRITE_BYTE_ASYNC(CTRL7_G, 0x00);
  119. I2C_WRITE_BYTE_ASYNC(CTRL8_XL, 0x00);
  120. I2C_WRITE_BYTE_ASYNC(CTRL9_XL, 0x38); // accel xyz enable
  121. I2C_WRITE_BYTE_ASYNC(CTRL10_C, 0x38); // gyro xyz enable
  122. I2C_WRITE_BYTE_ASYNC(INT1_CTRL, 0x3); // Activate INT on data ready
  123. pinMode(motionSensorInterruptPin, INPUT);
  124. I2C_READ_BYTES_ASYNC(WHO_AM_I, databuffer, 1);
  125. if (databuffer[0] == 105 || databuffer[0] == 106) {
  126. STDOUT.println("done.");
  127. } else {
  128. STDOUT.println("failed.");
  129. goto i2c_timeout;
  130. }
  131. I2CUnlock();
  132.  
  133. last_event_ = millis();
  134. while (true) {
  135. YIELD();
  136. if (!SaberBase::MotionRequested()) break;
  137. if (!digitalRead(motionSensorInterruptPin)) {
  138. if (millis() - last_event_ > I2C_TIMEOUT_MILLIS * 2) {
  139. goto i2c_timeout;
  140. }
  141. continue;
  142. } else {
  143. last_event_ = millis();
  144. }
  145. while (!I2CLock()) YIELD();
  146.  
  147. I2C_READ_BYTES_ASYNC(OUTX_L_G, databuffer, 12);
  148. // accel data available
  149. prop.DoAccel(
  150. MotionUtil::FromData(databuffer + 6, 4.0 / 32768.0, // 4 g range
  151. Vec3::BYTEORDER_LSB, Vec3::ORIENTATION),
  152. first_accel_);
  153. first_accel_ = false;
  154. // gyroscope data available
  155. prop.DoMotion(
  156. MotionUtil::FromData(databuffer, 2000.0 / 32768.0, // 2000 dps
  157. Vec3::BYTEORDER_LSB, Vec3::ORIENTATION),
  158. first_motion_);
  159. first_motion_ = false;
  160.  
  161. if (millis() - last_temp_ < 100) {
  162. last_temp_ = millis();
  163. int16_t temp_data;
  164. I2C_READ_BYTES_ASYNC(OUT_TEMP_L, (uint8_t*)&temp_data, 2);
  165. float temp = 25.0f + temp_data * (1.0f / 16.0f);
  166. if (monitor.ShouldPrint(Monitoring::MonitorTemp)) {
  167. STDOUT.print("TEMP: ");
  168. STDOUT.println(temp);
  169. }
  170. }
  171. I2CUnlock();
  172. }
  173.  
  174. STDOUT.println("Motion disable.");
  175.  
  176. while (!I2CLock()) YIELD();
  177. I2C_WRITE_BYTE_ASYNC(CTRL2_G, 0x0); // accel disable
  178. I2C_WRITE_BYTE_ASYNC(CTRL1_XL, 0x0); // gyro disable
  179. I2CUnlock();
  180.  
  181. while (!SaberBase::MotionRequested()) YIELD();
  182. continue;
  183.  
  184. i2c_timeout:
  185. STDOUT.println("Motion chip timeout, reboot motion chip!");
  186. Reset();
  187. SLEEP(20);
  188. I2C_WRITE_BYTE_ASYNC(CTRL3_C, 1);
  189. I2CUnlock();
  190. SLEEP(20);
  191. }
  192.  
  193. STATE_MACHINE_END();
  194. }
  195.  
  196. uint8_t databuffer[12];
  197. uint32_t last_temp_;
  198. uint32_t last_event_;
  199. bool first_motion_;
  200. bool first_accel_;
  201. };
  202.  
  203. #endif
  204.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement