Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1.  // MPU-6050 Short Example Sketch
  2. // By Arduino User JohnChi
  3. // August 17, 2014
  4. // Public Domain
  5. #include<Wire.h>
  6.  
  7. const int MPU_addr=0x68;  // I2C address of the MPU-6050
  8. int16_t AcX,AcY,AcZ;
  9. int16_t samplingRate = 20 ;
  10. int16_t invalid_variance = 2000;
  11.  
  12. void setup(){
  13.   Wire.begin();
  14.   Wire.beginTransmission(MPU_addr);
  15.   Wire.write(0x6B);  // PWR_MGMT_1 register
  16.   Wire.write(0);     // set to zero (wakes up the MPU-6050)
  17.   Wire.endTransmission(true);
  18.   Serial.begin(2400);
  19. }
  20.  
  21. int16_t smoothX[2]={0,0},smoothY[2]={0,0},smoothZ[2]={0,0} ;
  22.  
  23. int16_t smooth(int16_t nVal , int16_t* arr){
  24.   int16_t res = ( arr[0] + arr[1] +  nVal ) / 3 ;
  25.   arr[0] = arr[1] ;
  26.   arr[1] = nVal ;
  27.   return res ;
  28. }
  29.  
  30. const int16_t siz = 50 ;
  31.  
  32. int16_t x[siz],y[siz],z[siz] ;
  33. int16_t pointer = 0 , steps = 0 ;
  34.  
  35. int16_t variance(int16_t* arr){
  36.   int16_t maxi = arr[0] , mini = arr[0] ;
  37.   for(int i=0;i<siz ;i++){
  38.     maxi = max (maxi , arr[i]);
  39.     mini = min (mini , arr[i]);
  40.   }
  41.   return abs(maxi - mini) ;
  42. }
  43.  
  44.  
  45. int16_t threshold(int16_t* arr){
  46.   int16_t maxi = arr[0] , mini = arr[0] ;
  47.   for(int i=0;i<siz ;i++){
  48.     maxi = max (maxi , arr[i]);
  49.     mini = min (mini , arr[i]);
  50.   }
  51.   return (maxi + mini) / 2 ;
  52. }
  53.  
  54.  
  55. int16_t cal_steps(int16_t* arr){
  56.   int16_t thres = threshold(arr) , counter = 0 ;
  57.   for(int i=1 ; i<siz ; i++){
  58.     if(arr[i-1] - arr[i] > 0 && arr[i-1] > thres && arr[i] < thres){
  59.        counter++ ;
  60.     }
  61.   }
  62.   return counter ;
  63. }
  64.  
  65. int16_t getSteps(){
  66.   int varx , vary , varz ;
  67.   varx = variance(x) ;
  68.   vary = variance(y) ;
  69.   varz = variance(z) ;
  70.  
  71.   int step_x = cal_steps(x);
  72.   int step_y = cal_steps(y);
  73.   int step_z = cal_steps(z);
  74.  
  75.   if(varx < invalid_variance && vary < invalid_variance && varz < invalid_variance){
  76.     return 0;
  77.    }
  78.  
  79.   return min(min(step_x, step_y), step_z);
  80.  
  81.  
  82.  
  83.   /*if(varx >= vary && varx >= varz){
  84.    
  85.     if(abs(varx)<invalid_variance){return (int16_t)0;}
  86.     Serial.println("direction x");
  87.     return cal_steps(x) ;
  88.   }else if(vary >= varz && vary >= varx){
  89.    
  90.     if(abs(vary)<invalid_variance){return (int16_t)0;}
  91.     Serial.println("direction y");
  92.     return cal_steps(y) ;
  93.   }else if(varz >= varx && varz >= vary){
  94.    
  95.     if(abs(varz)<invalid_variance){return (int16_t)0;}
  96.     Serial.println("direction z");
  97.     return cal_steps(z) ;
  98.   }
  99.   return 0;*/
  100. }
  101.  
  102.  
  103.  
  104. void loop(){
  105.  
  106.   Wire.beginTransmission(MPU_addr);
  107.   Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  108.   Wire.endTransmission(false);
  109.   Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  110.   AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  111.   AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  112.   AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  113.  
  114.   int16_t smoothValX = smooth(AcX,smoothX) ;
  115.   int16_t smoothValY = smooth(AcY,smoothY) ;
  116.   int16_t smoothValZ = smooth(AcZ,smoothZ) ;
  117.  
  118.   x[pointer] = smoothValX ;
  119.   y[pointer] = smoothValY ;
  120.   z[pointer++] = smoothValZ ;
  121.  
  122.   if(pointer >= siz){
  123.     pointer = 0 ;
  124.     int16_t tmp = getSteps() ;
  125.     //Serial.println(tmp);
  126.     steps+=tmp;
  127.     Serial.println(steps) ;    
  128.   }
  129.  
  130.   /*Serial.print(smoothValX);
  131.   Serial.print("\t");
  132.   Serial.print(smoothValY);
  133.   Serial.print("\t");
  134.   Serial.println(smoothValZ);*/
  135.  
  136.  delay(samplingRate);
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement