Advertisement
Guest User

Untitled

a guest
Mar 14th, 2017
716
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <Wire.h>
  2.  
  3. long G[3], A[3], C[6];
  4. unsigned long loop_timer;
  5. // bool calibration_finished = false;
  6. bool init_angles = false;
  7.  
  8. const int PROBES = 500;
  9. float pitch = 0.0, roll = 0.0, accel_vector = 0.0;
  10. float pitch_cor = 0.0, roll_cor = 0.0;
  11. float pitch_comp = 0.0, roll_comp = 0.0;
  12.  
  13. #define GYRO_TO_DEGRESS (0.07) // mdps/LSB
  14. #define GYRO_RESOLUTION (1 / (250 / GYRO_TO_DEGRESS))
  15. #define RESOLUTION_TO_DEGRESS (GYRO_RESOLUTION * (PI / 180))
  16. #define INVERT_TO_DEGRESS (1 / (PI / 180))
  17.  
  18.  
  19. const float CORRECTION_RESOLUTION = 0.9996,
  20. COMPLIMENTARY_RESOLUTION = 0.9;
  21.  
  22. void WriteReg(uint8_t reg, uint8_t value)
  23. {
  24. // HIGH_ADDR
  25. Wire.beginTransmission(0b1101011);
  26. Wire.write(reg);
  27. Wire.write(value);
  28. Wire.endTransmission();
  29. }
  30.  
  31. void setup()
  32. {
  33. Serial.begin(9600);
  34.  
  35. Serial.println("IMU TEST");
  36.  
  37. Wire.begin();
  38. TWBR = 12;
  39.  
  40. for(int i = 0; i < 3; i++)
  41. G[i] = A[i] = C[i] = C[i + 3] = 0;
  42.  
  43. WriteReg(0x10, 0b10000000); // 52hz, 8g accel
  44. WriteReg(0x11, 0b10001100); // 1.66kHz, 2000 dps gyro
  45. WriteReg(0x12, 0b00000100); // increment registery addr
  46.  
  47. for(int i = 0; i < PROBES; i++)
  48. {
  49.  
  50. if(i % 100 == 0) Serial.print(".");
  51.  
  52. Read();
  53.  
  54. for(int l = 0; l < 3; l++)
  55. {
  56. C[l] += G[l];
  57. // C[l + 3] += A[l];
  58. }
  59.  
  60. delay(3);
  61. }
  62. for(int l = 0; l < 6; l++)
  63. C[l] /= PROBES;
  64.  
  65. Serial.println("Calibration finished!");
  66.  
  67. Serial.println("GYRO:");
  68. Serial.print("X - "); Serial.println(C[0]);
  69. Serial.print("Y - "); Serial.println(C[1]);
  70. Serial.print("Z - "); Serial.println(C[2]);
  71.  
  72. Serial.println("ACCEL:");
  73. Serial.print("X - "); Serial.println(C[3]);
  74. Serial.print("Y - "); Serial.println(C[4]);
  75. Serial.print("Z - "); Serial.println(C[5]);
  76.  
  77. // calibration_finished = true;
  78. loop_timer = micros();
  79. }
  80.  
  81. void Read()
  82. {
  83. Wire.beginTransmission(0b1101011);
  84. Wire.write(0x28);
  85. Wire.endTransmission();
  86. Wire.requestFrom((uint8_t)0b1101011, (uint8_t)6);
  87.  
  88. while(Wire.available() < 6); // wait for readings
  89.  
  90. for(int i = 0; i < 3; i++)
  91. {
  92. A[i] = (long)(Wire.read() << 8 | Wire.read());
  93.  
  94. // if(calibration_finished) A[i] -= C[i];
  95. }
  96.  
  97. accel_vector = sqrt(A[0] * A[0] + A[1] * A[1] + A[2] * A[2]);
  98.  
  99. Wire.beginTransmission(0b1101011);
  100. Wire.write(0x22);
  101. Wire.endTransmission();
  102. Wire.requestFrom((uint8_t)0b1101011, (uint8_t)6);
  103.  
  104. while(Wire.available() < 6); // wait for readings
  105.  
  106. for(int i = 0; i < 3; i++)
  107. {
  108. G[i] = (long)(Wire.read() << 8 | Wire.read());
  109.  
  110. // if(calibration_finished) G[i] -= C[i + 3];
  111. }
  112. }
  113.  
  114. void loop()
  115. {
  116. Read();
  117.  
  118. pitch += (G[0] - C[0]) * GYRO_RESOLUTION;
  119. roll += (G[1] - C[1]) * GYRO_RESOLUTION;
  120.  
  121. pitch -= roll * sin((G[2] - C[2]) * RESOLUTION_TO_DEGRESS);
  122. roll += pitch * sin((G[2] - C[2]) * RESOLUTION_TO_DEGRESS);
  123.  
  124. if(abs(A[1]) < accel_vector)
  125. pitch_cor = asin(A[1] / accel_vector) * INVERT_TO_DEGRESS;
  126.  
  127. if(abs(A[0]) < accel_vector)
  128. roll_cor = asin(A[0] / accel_vector) * -INVERT_TO_DEGRESS;
  129.  
  130. pitch_cor -= C[4]; // Calibration value for A[pitch]
  131. roll_cor -= C[3]; // Calibration value for A[roll]
  132.  
  133. if(init_angles)
  134. {
  135. pitch = pitch * CORRECTION_RESOLUTION + pitch_cor * (1.0 - CORRECTION_RESOLUTION);
  136. roll = roll * CORRECTION_RESOLUTION + roll_cor * (1.0 - CORRECTION_RESOLUTION);
  137. }
  138. else
  139. {
  140. pitch = pitch_cor;
  141. C[4] = pitch;
  142. roll = roll_cor;
  143. C[3] = roll;
  144. init_angles = true;
  145. }
  146.  
  147. pitch_comp = pitch_comp * COMPLIMENTARY_RESOLUTION + pitch * (1.0 - COMPLIMENTARY_RESOLUTION);
  148. roll_comp = roll_comp * COMPLIMENTARY_RESOLUTION + roll * (1.0 - COMPLIMENTARY_RESOLUTION);
  149.  
  150. Serial.println();
  151. Serial.print("Pitch: "); Serial.println(pitch_comp);
  152. Serial.print("Roll: "); Serial.println(roll_comp);
  153. Serial.println();
  154.  
  155. // 250 Hz
  156. while(micros() - loop_timer < 4000);
  157. loop_timer = micros();
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement