Advertisement
Guest User

Untitled

a guest
Feb 21st, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. #include <Wire.h>
  2. //#include <LSM303.h>
  3.  
  4. //LSM303 compass;
  5. int running_min[3], running_max[3], last_a[3];
  6.  
  7. // The previous 4 readings, used to find the current reading which is their average.
  8. // Use idx as an index.
  9. int sumX, sumY, sumZ, idx;
  10. int xSamples[4], ySamples[4], zSamples[4];
  11.  
  12. int samplingCounter, steps;
  13.  
  14. int badFlag;
  15.  
  16. int dynamicPrecision, dynamicThreshold;
  17.  
  18.  
  19. void Init(){
  20. running_min[0] = running_min[1] = running_min[2] = 32767;
  21. running_max[0] = running_max[1] = running_max[2] = -32768;
  22.  
  23. for(int i = 0; i < 3; ++i){
  24. compass.read();
  25.  
  26. xSamples[i] = compass.a.x;
  27. ySamples[i] = compass.a.y;
  28. zSamples[i] = compass.a.z;
  29.  
  30. sumX += xSamples[i];
  31. sumY += ySamples[i];
  32. sumZ += zSamples[i];
  33.  
  34. running_min[0] = min(running_min[0], xSamples[i]);
  35. running_min[1] = min(running_min[1], ySamples[i]);
  36. running_min[2] = min(running_min[2], zSamples[i]);
  37.  
  38. running_max[0] = max(running_max[0], xSamples[i]);
  39. running_max[1] = max(running_max[1], ySamples[i]);
  40. running_max[2] = max(running_max[2], zSamples[i]);
  41. }
  42.  
  43. idx = 3;
  44.  
  45. samplingCounter = 50;
  46. }
  47.  
  48. void reInit(){
  49. samplingCounter = 0;
  50.  
  51. int p2pX = running_max[0] - running_min[0];
  52. int p2pY = running_max[1] - running_min[1];
  53. int p2pZ = running_max[2] - running_min[2];
  54.  
  55.  
  56. badFlag = 0;
  57.  
  58. // Not sure about the following, we may need dynamic precision for each axis separately.
  59. // Assuming dynamicPrecision is the maximum of 10% of each peak to peak value of the axes.
  60. dynamicPrecision = max(p2pX, max(p2pY, p2pZ)) / 10;
  61.  
  62. int avgX = (running_max[0] + running_min[0])/2;
  63. int avgY = (running_max[1] + running_min[1])/2;
  64. int avgZ = (running_max[2] + running_min[2])/2;
  65.  
  66. dynamicThreshold = max(avgX,max(avgY,avgZ));
  67.  
  68.  
  69. running_min[0] = running_min[1] = running_min[2] = 32767;
  70. running_max[0] = running_max[1] = running_max[2] = -32768;
  71. }
  72.  
  73. // i think we can make dynamicPrecision and dynamicThreshold is vector
  74.  
  75. bool check_valid_step(int max_change) {
  76. if(abs(last_a[0]-(int)compass.a.x) == max_change && last_a[0] > dynamicThreshold && compass.a.x < dynamicThreshold)
  77. return true;
  78.  
  79. if(abs(last_a[0]-(int)compass.a.y) == max_change && last_a[1] > dynamicThreshold && compass.a.y < dynamicThreshold)
  80. return true;
  81.  
  82. if(abs(last_a[0]-(int)compass.a.z) == max_change && last_a[2] > dynamicThreshold && compass.a.z < dynamicThreshold)
  83. return true;
  84.  
  85. return false;
  86. }
  87. bool checkStep(){
  88. compass.read();
  89.  
  90.  
  91. int max_change = max( abs(last_a[0]-(int)compass.a.x) , max( abs(last_a[1]-(int)compass.a.y) , abs(last_a[2]-(int)compass.a.z) ));
  92. if(max_change < dynamicPrecision) return false;
  93.  
  94.  
  95. steps += check_valid_step();
  96.  
  97. last_a = compass.a;
  98.  
  99. running_min[0] = min(running_min[0], last_a[0]);
  100. running_min[1] = min(running_min[1], last_a[1]);
  101. running_min[2] = min(running_min[2], last_a[2]);
  102.  
  103. running_max[0] = max(running_max[0], last_a[0]);
  104. running_max[1] = max(running_max[1], last_a[1]);
  105. running_max[2] = max(running_max[2], last_a[2]);
  106. return true;
  107.  
  108. }
  109.  
  110. void setup(){
  111. Serial.begin(9600);
  112. Wire.begin();
  113. compass.init();
  114. compass.enableDefault();
  115.  
  116. Init();
  117. }
  118.  
  119. void loop(){
  120. if(samplingCounter == 50)
  121. reInit();
  122.  
  123. samplingCounter += checkStep();
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement