ACC_JUDGE
Dependencies: mbed BME280 MPU9250
main.cpp
- Committer:
- takuto003
- Date:
- 2020-02-25
- Revision:
- 0:c9fc0e7ab1e3
File content as of revision 0:c9fc0e7ab1e3:
/* *加速度センサとBMP280による離床判定と頂点判定のテストプログラム *LPC1768 *GY-91 * //////新車書に記載した離床判定////// A) フライトピンが抜けた B) 加速度センサの3軸の合成値(5つおきに中央値をとったもの)が3[G]を超えた状態が連続で5回続いた 以上の条件のどちらか片方が満たされた時 フライトピンが抜けたかどうか判断するbool値。 FRIGHT_PIN 加速度センサが離床を検出したかを判断するbool値。 FLIGHT_ACC /////////////////////////////// ↓↓↓↓↓ //////審査書に記載した頂点判定////// A) 気圧センサから得られる高度の値気圧の値(5つおきに中央値をとったもの)が連続して5回以上減少上昇した時 B) SIMによって得られた頂点到達時間(15秒)経過した時 C) 燃焼実験の計測で得られた燃焼完了時間(5秒)経過した時。 Cの条件が満たされ,かつAとBのいずれかが満たされた時 気圧センサによって頂点検知をしたbool値 TOP /////////////////////////////// 今回は実験のため、時間による離床判定および、頂点判定は行わない。 */ #include "mbed.h" #include "MPU9250.h" #include "BME280.h" DigitalOut myled(LED1); Serial pc(USBTX,USBRX, 115200); MPU9250 mpu = MPU9250(p9,p10); BME280 sensor(p28,p27); uint8_t whoami; int16_t acc[3]; float ax, ay, az; bool FLIGHT_ACC=false; bool TOP=false; void median(int LC,int RC,float BC[1][5]); int main(){ int pcount=0; int acount=0; float pres[5][5]={0}; float zacc[5][5]={0}; int proopc=0; int aroopc=0; int plastc=-1; int alastc=-1; wait(0.3); whoami = mpu.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); pc.printf("I AM 0x%x\n\r", whoami); //0x71 if (whoami == 0x71) { pc.printf("MPU9250 is detected.\n\r"); wait(0.3); mpu.resetMPU9250(); mpu.initMPU9250(); wait(0.3); myled = 1; pc.printf("Start.\n\r"); mpu.getAres(); wait(0.3); } else { pc.printf("Could not detect MPU9250.\n\r"); while(1); } //離床判定 pc.printf("Start JUDGE.\n\r"); while(FLIGHT_ACC!=true) { alastc++; if(aroopc==5)aroopc=0; pc.printf("Acc: %f, %f, %f\n\r", ax, ay, az); mpu.readAccelData(acc); zacc[aroopc][alastc]=acc[2]+acc[1]+acc[0] * 16.0 / 32768.0;//3軸の合成値 if(alastc==4) { alastc=0; void median(int alastc,int aroopc,float zacc); if(aroopc!=0&&zacc[aroopc-1][2]>3.0) { acount++; } else { acount=0; } aroopc++; } if(acount==5) { FLIGHT_ACC=true; pc.printf("FLIFHT_ACC success!!\n"); } } //頂点判定 while(TOP!=true) { plastc++; if(proopc==5)proopc=0; pc.printf("%04.2f hPa, count %d \r\n", sensor.getPressure(),pcount); pres[proopc][plastc]=sensor.getPressure(); if(plastc==4) { plastc=0; void median(int plastc,int proopc,float pres); if(proopc!=0&&pres[proopc-1][2]>pres[proopc][2]) { pcount++; } else { pcount=0; } proopc++; } if(pcount==5) { TOP=true; pc.printf("TOP_JUDGE success!!\n"); } } } //バブルソート void median(int LC, int RC, float BC[1][5]) { int k; int m; float temp; for(k=0; k<5; k++) { for(m=5-1; m>LC; m--) { if(BC[RC][m] < BC[RC][m-1]) { temp = BC[RC][m]; BC[RC][m] = BC[RC][m-1]; BC[RC][m-1] = temp; } } } }