Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "MPU6050.h" 00003 00004 InterruptIn button(USER_BUTTON); 00005 DigitalOut led(LED1); 00006 00007 Serial pc(USBTX, USBRX); // tx, rx 00008 00009 MPU6050 mpu6050; 00010 00011 Timer t; 00012 Timer step_timer; 00013 00014 #define AVERAGE_BUFF_SIZE 20 00015 00016 float ax_fl; 00017 float ay_fl; 00018 float az_fl; 00019 00020 int ax_int; 00021 int ay_int; 00022 int az_int; 00023 00024 int ax_avg_buff[AVERAGE_BUFF_SIZE]; 00025 int ax_avg_buff_count = 0; 00026 int ax_avg; 00027 int ay_avg_buff[AVERAGE_BUFF_SIZE]; 00028 int ay_avg_buff_count = 0; 00029 int ay_avg; 00030 int az_avg_buff[AVERAGE_BUFF_SIZE]; 00031 int az_avg_buff_count = 0; 00032 int az_avg; 00033 00034 int now; 00035 int step_timer_now; 00036 int min_reg_ax; 00037 int min_current_ax; 00038 int min_reg_ay; 00039 int min_current_ay; 00040 int min_reg_az; 00041 int min_current_az; 00042 int max_reg_ax; 00043 int max_current_ax; 00044 int max_reg_ay; 00045 int max_current_ay; 00046 int max_reg_az; 00047 int max_current_az; 00048 int dy_thres_ax; 00049 int dy_thres_ay; 00050 int dy_thres_az; 00051 int dy_chan_ax; 00052 int dy_chan_ay; 00053 int dy_chan_az; 00054 00055 int active_axis; 00056 00057 int sample_new; 00058 int sample_old; 00059 int sample_result; 00060 00061 int step_size = 200; 00062 00063 int step_count = 0; 00064 00065 //sampling variables 00066 #define SAMPLE_SIZE 2000 00067 00068 int test_ax[SAMPLE_SIZE]; 00069 int test_ay[SAMPLE_SIZE]; 00070 int test_az[SAMPLE_SIZE]; 00071 int time_ms[SAMPLE_SIZE]; 00072 int count_a = 0; 00073 int step_times[SAMPLE_SIZE]; 00074 int step_sample_count = 0; 00075 00076 int return_samples = 0; 00077 // 00078 00079 void pressed(){ 00080 if(count_a == SAMPLE_SIZE){ 00081 return_samples = 1; 00082 } 00083 else{ 00084 step_times[step_sample_count] = us_ticker_read() / 1000;; 00085 step_sample_count++; 00086 } 00087 } 00088 00089 int main() { 00090 00091 //----------Setup----------// 00092 00093 pc.baud(115200); 00094 00095 //Set up I2C 00096 i2c.frequency(400000); // use fast (400 kHz) I2C 00097 00098 t.start(); 00099 00100 // Read the WHO_AM_I register, this is a good test of communication 00101 uint8_t whoami = mpu6050.readByte(MPU6050_ADDRESS, WHO_AM_I_MPU6050); 00102 00103 if (whoami == 0x68){ 00104 pc.printf("MPU6050 is online...\n\r"); 00105 wait(1); 00106 } 00107 00108 else{ 00109 pc.printf("MPU6050 is offline...\n\r"); 00110 pc.printf("Value is %d\n\r",whoami); 00111 pc.printf("Should be %d\n\r",0x68); 00112 while(1){ 00113 wait(1); 00114 } 00115 } 00116 00117 mpu6050.MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values 00118 pc.printf("x-axis self test: acceleration trim within : "); pc.printf("%f", SelfTest[0]); pc.printf(" percent of factory value \n\r"); 00119 pc.printf("y-axis self test: acceleration trim within : "); pc.printf("%f", SelfTest[1]); pc.printf(" percent of factory value \n\r"); 00120 pc.printf("z-axis self test: acceleration trim within : "); pc.printf("%f", SelfTest[2]); pc.printf(" percent of factory value \n\r"); 00121 pc.printf("x-axis self test: gyration trim within : "); pc.printf("%f", SelfTest[3]); pc.printf(" percent of factory value \n\r"); 00122 pc.printf("y-axis self test: gyration trim within : "); pc.printf("%f", SelfTest[4]); pc.printf(" percent of factory value \n\r"); 00123 pc.printf("z-axis self test: gyration trim within : "); pc.printf("%f", SelfTest[5]); pc.printf(" percent of factory value \n\r"); 00124 wait(1); 00125 00126 if(SelfTest[0] < 1.0f && SelfTest[1] < 1.0f && SelfTest[2] < 1.0f && SelfTest[3] < 1.0f && SelfTest[4] < 1.0f && SelfTest[5] < 1.0f) 00127 { 00128 mpu6050.resetMPU6050(); // Reset registers to default in preparation for device calibration 00129 mpu6050.calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers 00130 mpu6050.initMPU6050(); pc.printf("MPU6050 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature 00131 } 00132 00133 else 00134 { 00135 pc.printf("Device did not the pass self-test!\n\r"); 00136 } 00137 wait(1); 00138 00139 //----------Loop----------// 00140 00141 while(1){ 00142 // If data ready bit set, all data registers have new data 00143 if(mpu6050.readByte(MPU6050_ADDRESS, INT_STATUS) & 0x01) { // check if data ready interrupt 00144 mpu6050.readAccelData(accelCount); // Read the x/y/z adc values 00145 mpu6050.getAres(); 00146 00147 // Now we'll calculate the accleration value into actual g's 00148 ax = (float)accelCount[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set 00149 ay = (float)accelCount[1]*aRes - accelBias[1]; 00150 az = (float)accelCount[2]*aRes - accelBias[2]; 00151 00152 if(ax<0){ 00153 ax = ax*-1; 00154 } 00155 if(ay<0){ 00156 ay = ay*-1; 00157 } 00158 if(az<0){ 00159 az = az*-1; 00160 } 00161 00162 mpu6050.readGyroData(gyroCount); // Read the x/y/z adc values 00163 mpu6050.getGres(); 00164 00165 // Calculate the gyro value into actual degrees per second 00166 gx = (float)gyroCount[0]*gRes; // - gyroBias[0]; // get actual gyro value, this depends on scale being set 00167 gy = (float)gyroCount[1]*gRes; // - gyroBias[1]; 00168 gz = (float)gyroCount[2]*gRes; // - gyroBias[2]; 00169 00170 tempCount = mpu6050.readTempData(); // Read the x/y/z adc values 00171 temperature = (tempCount) / 340. + 36.53; // Temperature in degrees Centigrade 00172 00173 // Pass gyro rate as rad/s 00174 mpu6050.MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f); 00175 00176 //accelerometer readings 00177 ax_fl = 1000 * ax; 00178 ay_fl = 1000 * ay; 00179 az_fl = 1000 * az; 00180 00181 ax_int = ax_fl; 00182 ay_int = ay_fl; 00183 az_int = az_fl; 00184 //end 00185 00186 //average values 00187 //ax 00188 ax_avg_buff[ax_avg_buff_count] = ax_int; 00189 ax_avg_buff_count++; 00190 ax_avg_buff_count = ax_avg_buff_count % AVERAGE_BUFF_SIZE; 00191 00192 ax_avg = 0; 00193 00194 int i; 00195 for(i = 0; i < AVERAGE_BUFF_SIZE;i++){ 00196 ax_avg = ax_avg + ax_avg_buff[i]; 00197 } 00198 00199 ax_avg = ax_avg/AVERAGE_BUFF_SIZE; 00200 00201 //ay 00202 ay_avg_buff[ay_avg_buff_count] = ay_int; 00203 ay_avg_buff_count++; 00204 ay_avg_buff_count = ay_avg_buff_count % AVERAGE_BUFF_SIZE; 00205 00206 ay_avg = 0; 00207 00208 for(i = 0; i < AVERAGE_BUFF_SIZE;i++){ 00209 ay_avg = ay_avg + ay_avg_buff[i]; 00210 } 00211 00212 ay_avg = ay_avg/AVERAGE_BUFF_SIZE; 00213 00214 //az 00215 az_avg_buff[az_avg_buff_count] = az_int; 00216 az_avg_buff_count++; 00217 az_avg_buff_count = az_avg_buff_count % AVERAGE_BUFF_SIZE; 00218 00219 az_avg = 0; 00220 00221 for(i = 0; i < AVERAGE_BUFF_SIZE;i++){ 00222 az_avg = az_avg + az_avg_buff[i]; 00223 } 00224 00225 az_avg = az_avg/AVERAGE_BUFF_SIZE; 00226 //end 00227 00228 //algorithum readings 00229 now = t.read_ms(); 00230 if(now>=500){ 00231 t.stop(); 00232 t.reset(); 00233 min_current_ax = min_reg_ax; 00234 max_current_ax = max_reg_ax; 00235 dy_thres_ax = (min_current_ax+max_current_ax)/2; 00236 dy_chan_ax = (max_current_ax-min_current_ax); 00237 min_reg_ax = ax_avg; 00238 max_reg_ax = ax_avg; 00239 min_current_ay = min_reg_ay; 00240 max_current_ay = max_reg_ay; 00241 dy_thres_ay = (min_current_ay+max_current_ay)/2; 00242 dy_chan_ay = (max_current_ay-min_current_ay); 00243 min_reg_ay = ay_avg; 00244 max_reg_ay = ay_avg; 00245 min_current_az = min_reg_az; 00246 max_current_az = max_reg_az; 00247 dy_thres_az = (min_current_az+max_current_az)/2; 00248 dy_chan_az = (max_current_az-min_current_az); 00249 min_reg_az = az_avg; 00250 max_reg_az = az_avg; 00251 00252 //active axis switching 00253 if(dy_chan_ax>=dy_chan_ay && dy_chan_ax>= dy_chan_az){ 00254 if(active_axis!=0){ 00255 sample_old = 0; 00256 sample_new = ax_avg; 00257 } 00258 active_axis = 0; 00259 } 00260 else if(dy_chan_ay>=dy_chan_ax && dy_chan_ay>=dy_chan_az){ 00261 if(active_axis!=1){ 00262 sample_old = 0; 00263 sample_new = ay_avg; 00264 } 00265 active_axis = 1; 00266 } 00267 else{ 00268 if(active_axis!=2){ 00269 sample_old = 0; 00270 sample_new = az_avg; 00271 } 00272 active_axis = 2; 00273 } 00274 //end 00275 00276 t.start(); 00277 } 00278 else if(now<500){ 00279 if(min_reg_ax>ax_avg){ 00280 min_reg_ax = ax_avg; 00281 } 00282 if(max_reg_ax<ax_avg){ 00283 max_reg_ax = ax_avg; 00284 } 00285 if(min_reg_ay>ay_avg){ 00286 min_reg_ay = ay_avg; 00287 } 00288 if(max_reg_ay<ay_avg){ 00289 max_reg_ay = ay_avg; 00290 } 00291 if(min_reg_az>az_avg){ 00292 min_reg_az = az_avg; 00293 } 00294 if(max_reg_az<az_avg){ 00295 max_reg_az = az_avg; 00296 } 00297 } 00298 //end 00299 00300 //sample 00301 sample_old = sample_new; 00302 switch(active_axis){ 00303 case(0): 00304 if(ax_avg-sample_old>step_size || ax_avg-sample_old<-step_size){ 00305 sample_new = ax_avg; 00306 if(sample_old>dy_thres_ax && sample_new<dy_thres_ax){ 00307 step_count++; 00308 } 00309 } 00310 break; 00311 case(1): 00312 if(ay_avg-sample_old>step_size || ay_avg-sample_old<-step_size){ 00313 sample_new = ay_avg; 00314 if(sample_old>dy_thres_ay && sample_new<dy_thres_ay){ 00315 step_count++; 00316 } 00317 } 00318 break; 00319 case(2): 00320 if(az_avg-sample_old>step_size || az_avg-sample_old<-step_size){ 00321 sample_new = az_avg; 00322 if(sample_old>dy_thres_az && sample_new<dy_thres_az){ 00323 step_count++; 00324 } 00325 } 00326 break; 00327 } 00328 00329 //sampling data 00330 if(count_a < SAMPLE_SIZE){ 00331 test_ax[count_a] = ax_int; 00332 test_ay[count_a] = ay_int; 00333 test_az[count_a] = az_int; 00334 time_ms[count_a] = us_ticker_read() / 1000; 00335 count_a++; 00336 } 00337 else if(count_a == SAMPLE_SIZE && return_samples == 1){ 00338 /* 00339 int i; 00340 00341 //ax samples 00342 pc.printf("ax = ["); 00343 for(i = 0; i<SAMPLE_SIZE; i++){ 00344 pc.printf(" %d ",test_ax[i]); 00345 } 00346 pc.printf("]\r\n"); 00347 00348 //ay samples 00349 pc.printf("ay = ["); 00350 for(i = 0; i<SAMPLE_SIZE; i++){ 00351 pc.printf(" %d ",test_ay[i]); 00352 } 00353 pc.printf("]\r\n"); 00354 00355 //az samples 00356 pc.printf("az = ["); 00357 for(i = 0; i<SAMPLE_SIZE; i++){ 00358 pc.printf(" %d ",test_az[i]); 00359 } 00360 pc.printf("]\r\n"); 00361 00362 //timer samples 00363 pc.printf("t = ["); 00364 for(i = 0; i<SAMPLE_SIZE; i++){ 00365 pc.printf(" %d ",time_ms[i]); 00366 } 00367 pc.printf("]\r\n"); 00368 00369 //step samples 00370 pc.printf("s = ["); 00371 for(i = 0; i<SAMPLE_SIZE; i++){ 00372 pc.printf(" %d ",step_times[i]); 00373 } 00374 pc.printf("]\r\n"); 00375 */ 00376 count_a++; 00377 } 00378 00379 button.fall(&pressed); 00380 //end 00381 00382 //printing rtd 00383 pc.printf("$%d %d %d;", ax_avg, ay_avg, step_count*100); 00384 //end 00385 00386 //wait 00387 wait_ms(10); 00388 } 00389 } 00390 }
Generated on Sun Aug 28 2022 11:53:57 by
1.7.2