Advertisement
Guest User

KALMAN LSM6

a guest
Mar 18th, 2017
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. #include <Wire.h>
  2. #include "Kalman.h"
  3.  
  4. const float GYRO_SENS = 70.f / 1000.f;
  5. double roll, pitch, angle_roll, angle_pitch;
  6.  
  7. long gx, gy, gz, ax, ay, az, C[6] = {0,0,0,0,0,0};
  8.  
  9. unsigned long loop_timer;
  10. const byte PROB = 100;
  11.  
  12. Kalman kPitch, kRoll;
  13.  
  14. bool calib = false;
  15.  
  16. void setup()
  17. {
  18. Wire.begin();
  19. Wire.setClock(400000L);
  20.  
  21. Serial.begin(115200);
  22.  
  23. WriteReg(0x10, 0b01011100); // 208Hz refresh rate, +-8g anti-aliasing 200Hz
  24. WriteReg(0x11, 0b01011100); // 208Hz refresh rate, +- 2k dps, full-scale at 125dps off
  25. WriteReg(0x12, 0b00000100);
  26.  
  27. for(byte i = 0; i < PROB; i++)
  28. {
  29. Read();
  30. C[0] += gx;
  31. C[1] += gy;
  32. C[2] += gz;
  33. C[3] += ax;
  34. C[4] += ay;
  35. C[5] += az;
  36. delay(4);
  37. }
  38.  
  39. for(byte i = 0; i < 6; i++)
  40. C[i] /= PROB;
  41.  
  42. C[5] -= 256; // GRAVITY 1g
  43.  
  44. calib = true;
  45.  
  46. delay(1000);
  47.  
  48. loop_timer = micros();
  49. }
  50.  
  51. void WriteReg(uint8_t reg, uint8_t val)
  52. {
  53. Wire.beginTransmission(0b1101011);
  54. Wire.write(reg);
  55. Wire.write(val);
  56. Wire.endTransmission();
  57. }
  58.  
  59.  
  60. bool Read()
  61. {
  62. Wire.beginTransmission(0b1101011);
  63. Wire.write(0x28); // OUTX_L_XL
  64. Wire.endTransmission();
  65. Wire.requestFrom(0b1101011, (uint8_t) 6);
  66.  
  67. uint8_t axl = Wire.read(), axh = Wire.read(),
  68. ayl = Wire.read(), ayh = Wire.read(),
  69. azl = Wire.read(), azh = Wire.read();
  70.  
  71. ax = (long)(axh << 8 | axl); // mg
  72. ay = (long)(ayh << 8 | ayl); // mg
  73. az = (long)(azh << 8 | azl); // mg
  74.  
  75. if(calib)
  76. {
  77. ax -= C[3];
  78. ay -= C[4];
  79. az -= C[5];
  80. }
  81. // az -= 256;
  82.  
  83. Wire.beginTransmission(0b1101011);
  84. Wire.write(0x22); // OUTX_L_G
  85. Wire.endTransmission();
  86. Wire.requestFrom(0b1101011, (uint8_t) 6);
  87.  
  88. uint8_t gxl = Wire.read(), gxh = Wire.read(),
  89. gyl = Wire.read(), gyh = Wire.read(),
  90. gzl = Wire.read(), gzh = Wire.read();
  91.  
  92. gx = (long)(gxh << 8 | gxl);
  93. gy = (long)(gyh << 8 | gyl);
  94. gz = (long)(gzh << 8 | gzl);
  95.  
  96. if(calib)
  97. {
  98. gx -= C[0];
  99. gy -= C[1];
  100. gz -= C[2];
  101.  
  102. gx *= GYRO_SENS;
  103. gy *= GYRO_SENS;
  104. gz *= GYRO_SENS;
  105. }
  106. }
  107.  
  108. unsigned long print_loop = 0;
  109. void loop()
  110. {
  111. Read();
  112.  
  113. float dt = (float)(micros() - loop_timer) / 1000000.f;
  114. pitch = (atan2(ay, az) + PI) * RAD_TO_DEG;
  115. roll = (atan2(az, az) + PI) * RAD_TO_DEG;
  116.  
  117. angle_pitch = kPitch.getAngle(pitch, gy, dt);
  118. angle_roll = kRoll.getAngle(roll, gz, dt);
  119. loop_timer = micros();
  120.  
  121. if(millis() - print_loop >= 1000)
  122. {
  123. Serial.print("Pitch: "); Serial.print(angle_pitch); Serial.print(" Roll: "); Serial.println(angle_roll);
  124. print_loop = millis();
  125. }
  126.  
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement