フライトモードのプログラム 発射判定,頂点判定,高度判定の順に行う
Dependencies: MPU6050 MS5607 SDFileSystem mbed
main.cpp@0:266e722e382f, 2017-02-19 (annotated)
- Committer:
- RyotaNakamura
- Date:
- Sun Feb 19 05:39:44 2017 +0000
- Revision:
- 0:266e722e382f
?????????????; TBD??????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RyotaNakamura | 0:266e722e382f | 1 | #include "mbed.h" |
RyotaNakamura | 0:266e722e382f | 2 | //#include "MS5607SPI.h" |
RyotaNakamura | 0:266e722e382f | 3 | #include "MS5607I2C.h" |
RyotaNakamura | 0:266e722e382f | 4 | #include "MPU6050.h" |
RyotaNakamura | 0:266e722e382f | 5 | #include "SDFileSystem.h" |
RyotaNakamura | 0:266e722e382f | 6 | #define ON 1 |
RyotaNakamura | 0:266e722e382f | 7 | #define OFF 0 |
RyotaNakamura | 0:266e722e382f | 8 | #define acc 16384 |
RyotaNakamura | 0:266e722e382f | 9 | #define TBD1 0.95 //TBDは適当に設定 |
RyotaNakamura | 0:266e722e382f | 10 | #define TBD2 10 |
RyotaNakamura | 0:266e722e382f | 11 | #define TBD3 0.98 |
RyotaNakamura | 0:266e722e382f | 12 | #define TBD4 15 |
RyotaNakamura | 0:266e722e382f | 13 | #define TBD5 5 |
RyotaNakamura | 0:266e722e382f | 14 | #define TBD6 20 |
RyotaNakamura | 0:266e722e382f | 15 | #define TBD7 8 |
RyotaNakamura | 0:266e722e382f | 16 | |
RyotaNakamura | 0:266e722e382f | 17 | //MS5607SPI ms5607(p11, p12, p13, p3); |
RyotaNakamura | 0:266e722e382f | 18 | MS5607I2C ms5607(p9,p10, false); |
RyotaNakamura | 0:266e722e382f | 19 | MPU6050 mpu(p9,p10); |
RyotaNakamura | 0:266e722e382f | 20 | SDFileSystem sd(p5,p6,p7,p8,"sd"); |
RyotaNakamura | 0:266e722e382f | 21 | PwmOut servo1(p21); //パラシュート開放用servo |
RyotaNakamura | 0:266e722e382f | 22 | PwmOut servo2(p22); |
RyotaNakamura | 0:266e722e382f | 23 | PwmOut servo3(p23); //CanSat開放用servo |
RyotaNakamura | 0:266e722e382f | 24 | PwmOut servo4(p24); |
RyotaNakamura | 0:266e722e382f | 25 | Serial pc(USBTX, USBRX); |
RyotaNakamura | 0:266e722e382f | 26 | FILE*fp; |
RyotaNakamura | 0:266e722e382f | 27 | Timer timer1,timer2,timer3; |
RyotaNakamura | 0:266e722e382f | 28 | Ticker ticker; |
RyotaNakamura | 0:266e722e382f | 29 | double decision1,decision2,decision3; |
RyotaNakamura | 0:266e722e382f | 30 | double time1,time2,time3; |
RyotaNakamura | 0:266e722e382f | 31 | |
RyotaNakamura | 0:266e722e382f | 32 | float a[3]; |
RyotaNakamura | 0:266e722e382f | 33 | float g[3]; |
RyotaNakamura | 0:266e722e382f | 34 | float Pre=ms5607.getPressure(); |
RyotaNakamura | 0:266e722e382f | 35 | float Tem=ms5607.getTemperature(); |
RyotaNakamura | 0:266e722e382f | 36 | float Alt = ms5607.getAltitude(); |
RyotaNakamura | 0:266e722e382f | 37 | |
RyotaNakamura | 0:266e722e382f | 38 | void dateWriting() |
RyotaNakamura | 0:266e722e382f | 39 | { |
RyotaNakamura | 0:266e722e382f | 40 | fp=fopen("Fright_date.txt","a"); |
RyotaNakamura | 0:266e722e382f | 41 | |
RyotaNakamura | 0:266e722e382f | 42 | mpu.getAccelero(a); |
RyotaNakamura | 0:266e722e382f | 43 | mpu.getGyro(g); |
RyotaNakamura | 0:266e722e382f | 44 | |
RyotaNakamura | 0:266e722e382f | 45 | fprintf(fp,"%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n",a[0],a[1],a[2],g[0],g[1],g[2],Pre,Tem,Alt); |
RyotaNakamura | 0:266e722e382f | 46 | |
RyotaNakamura | 0:266e722e382f | 47 | fclose(fp); |
RyotaNakamura | 0:266e722e382f | 48 | } |
RyotaNakamura | 0:266e722e382f | 49 | |
RyotaNakamura | 0:266e722e382f | 50 | int main() |
RyotaNakamura | 0:266e722e382f | 51 | { |
RyotaNakamura | 0:266e722e382f | 52 | fp=fopen("Fright_date.txt","a"); |
RyotaNakamura | 0:266e722e382f | 53 | |
RyotaNakamura | 0:266e722e382f | 54 | if(fp==NULL) { |
RyotaNakamura | 0:266e722e382f | 55 | pc.printf("Open Failed!\n"); |
RyotaNakamura | 0:266e722e382f | 56 | } else { |
RyotaNakamura | 0:266e722e382f | 57 | pc.printf("Open Success!\n"); |
RyotaNakamura | 0:266e722e382f | 58 | } |
RyotaNakamura | 0:266e722e382f | 59 | |
RyotaNakamura | 0:266e722e382f | 60 | pc.printf("Start!\n"); |
RyotaNakamura | 0:266e722e382f | 61 | |
RyotaNakamura | 0:266e722e382f | 62 | fprintf(fp,"加速度x,加速度y,加速度z,ジャイロx,ジャイロy,ジャイロz,気圧[Pa],温度[degC],高度[m]\r\n"); |
RyotaNakamura | 0:266e722e382f | 63 | |
RyotaNakamura | 0:266e722e382f | 64 | servo1.period_ms(20); |
RyotaNakamura | 0:266e722e382f | 65 | servo2.period_ms(20); //パルス周期=20ms |
RyotaNakamura | 0:266e722e382f | 66 | servo3.period_ms(20); |
RyotaNakamura | 0:266e722e382f | 67 | servo4.period_ms(20); |
RyotaNakamura | 0:266e722e382f | 68 | |
RyotaNakamura | 0:266e722e382f | 69 | //SG90の動作パルス幅は50µs~2400µs(0度~180度) |
RyotaNakamura | 0:266e722e382f | 70 | servo1.pulsewidth(0.0005); |
RyotaNakamura | 0:266e722e382f | 71 | servo2.pulsewidth(0.0005); |
RyotaNakamura | 0:266e722e382f | 72 | servo3.pulsewidth(0.0005); |
RyotaNakamura | 0:266e722e382f | 73 | servo4.pulsewidth(0.0005); |
RyotaNakamura | 0:266e722e382f | 74 | |
RyotaNakamura | 0:266e722e382f | 75 | while(decision1<0.9) { //取得加速度の9割がTBD3より大きければループを抜ける |
RyotaNakamura | 0:266e722e382f | 76 | mpu.setAcceleroRange(0); //変数初期化 |
RyotaNakamura | 0:266e722e382f | 77 | mpu.setGyroRange(0); |
RyotaNakamura | 0:266e722e382f | 78 | |
RyotaNakamura | 0:266e722e382f | 79 | while(a[2]<TBD1) { |
RyotaNakamura | 0:266e722e382f | 80 | ticker.attach(&dateWriting, 0.1); |
RyotaNakamura | 0:266e722e382f | 81 | } |
RyotaNakamura | 0:266e722e382f | 82 | |
RyotaNakamura | 0:266e722e382f | 83 | /*************************発射判定ループ開始*************************/ |
RyotaNakamura | 0:266e722e382f | 84 | |
RyotaNakamura | 0:266e722e382f | 85 | while(time1<TBD2) { |
RyotaNakamura | 0:266e722e382f | 86 | int i,counter1=0; |
RyotaNakamura | 0:266e722e382f | 87 | float az[i]; //取得加速度を格納する配列要素 |
RyotaNakamura | 0:266e722e382f | 88 | for(i=0; i<=20; i++) { //条件式はTBD2により決定 |
RyotaNakamura | 0:266e722e382f | 89 | timer1.start(); |
RyotaNakamura | 0:266e722e382f | 90 | ticker.attach(&dateWriting, 0.1); //タイマー割込み |
RyotaNakamura | 0:266e722e382f | 91 | az[i]=a[2]; |
RyotaNakamura | 0:266e722e382f | 92 | if(az[i]>TBD3) { |
RyotaNakamura | 0:266e722e382f | 93 | counter1++; //取得加速度がTBD3より大きければプラス1 |
RyotaNakamura | 0:266e722e382f | 94 | } |
RyotaNakamura | 0:266e722e382f | 95 | timer1.stop(); |
RyotaNakamura | 0:266e722e382f | 96 | time1=timer1.read(); |
RyotaNakamura | 0:266e722e382f | 97 | } |
RyotaNakamura | 0:266e722e382f | 98 | decision1=counter1/(i+1); //(TBD3より大きい取得加速度の数)÷(取得加速度の総数) |
RyotaNakamura | 0:266e722e382f | 99 | } |
RyotaNakamura | 0:266e722e382f | 100 | } |
RyotaNakamura | 0:266e722e382f | 101 | |
RyotaNakamura | 0:266e722e382f | 102 | while(decision2<0.9) { //取得高度の9割が下降を検知すればループを抜ける |
RyotaNakamura | 0:266e722e382f | 103 | int j=0; |
RyotaNakamura | 0:266e722e382f | 104 | float alt1[j]; //取得高度を各格納する配列要素 |
RyotaNakamura | 0:266e722e382f | 105 | |
RyotaNakamura | 0:266e722e382f | 106 | while(j>0&&alt1[j]>alt1[j-1]) { |
RyotaNakamura | 0:266e722e382f | 107 | ticker.attach(&dateWriting, 0.1); //タイマー割込み |
RyotaNakamura | 0:266e722e382f | 108 | alt1[j]=Alt; |
RyotaNakamura | 0:266e722e382f | 109 | j++; |
RyotaNakamura | 0:266e722e382f | 110 | } |
RyotaNakamura | 0:266e722e382f | 111 | |
RyotaNakamura | 0:266e722e382f | 112 | /*************************頂点判定ループ開始*************************/ |
RyotaNakamura | 0:266e722e382f | 113 | |
RyotaNakamura | 0:266e722e382f | 114 | while(time2<TBD4) { |
RyotaNakamura | 0:266e722e382f | 115 | int k,counter2=0; |
RyotaNakamura | 0:266e722e382f | 116 | float alt2[k]; //取得高度を格納する配列要素 |
RyotaNakamura | 0:266e722e382f | 117 | for(k=0; k<=20; k++) { //条件式はTBD4により決定 |
RyotaNakamura | 0:266e722e382f | 118 | timer2.start(); |
RyotaNakamura | 0:266e722e382f | 119 | ticker.attach(&dateWriting, 0.1); //タイマー割込み |
RyotaNakamura | 0:266e722e382f | 120 | alt2[k]=Alt; |
RyotaNakamura | 0:266e722e382f | 121 | if(k>0&&alt2[k]<alt2[k-1]) { |
RyotaNakamura | 0:266e722e382f | 122 | counter2++; //下降検知をすればプラス1 |
RyotaNakamura | 0:266e722e382f | 123 | } |
RyotaNakamura | 0:266e722e382f | 124 | timer2.stop(); |
RyotaNakamura | 0:266e722e382f | 125 | time2=timer2.read(); |
RyotaNakamura | 0:266e722e382f | 126 | } |
RyotaNakamura | 0:266e722e382f | 127 | decision2=counter2/(k+1); //(下降検知した回数)÷(取得高度の総数) |
RyotaNakamura | 0:266e722e382f | 128 | } |
RyotaNakamura | 0:266e722e382f | 129 | } |
RyotaNakamura | 0:266e722e382f | 130 | |
RyotaNakamura | 0:266e722e382f | 131 | wait(0.1); |
RyotaNakamura | 0:266e722e382f | 132 | servo1.pulsewidth(0.0015); //CanSat開放用servo |
RyotaNakamura | 0:266e722e382f | 133 | servo2.pulsewidth(0.0015); |
RyotaNakamura | 0:266e722e382f | 134 | |
RyotaNakamura | 0:266e722e382f | 135 | while(decision3<0.6) { //取得高度の6割が初期高度+TBD5以下ならばループを抜ける |
RyotaNakamura | 0:266e722e382f | 136 | int m=0; |
RyotaNakamura | 0:266e722e382f | 137 | float alt3[m]; //取得高度を格納する配列要素 |
RyotaNakamura | 0:266e722e382f | 138 | float datum1=alt3[m]+TBD5; |
RyotaNakamura | 0:266e722e382f | 139 | |
RyotaNakamura | 0:266e722e382f | 140 | while(alt3[0]>datum1) { |
RyotaNakamura | 0:266e722e382f | 141 | ticker.attach(&dateWriting, 0.1); //タイマー割込み |
RyotaNakamura | 0:266e722e382f | 142 | alt3[m]=Alt; |
RyotaNakamura | 0:266e722e382f | 143 | m++; |
RyotaNakamura | 0:266e722e382f | 144 | } |
RyotaNakamura | 0:266e722e382f | 145 | |
RyotaNakamura | 0:266e722e382f | 146 | /*************************高度判定ループ開始*************************/ |
RyotaNakamura | 0:266e722e382f | 147 | |
RyotaNakamura | 0:266e722e382f | 148 | while(time3<TBD6) { |
RyotaNakamura | 0:266e722e382f | 149 | int n,counter3=0; |
RyotaNakamura | 0:266e722e382f | 150 | float alt4[n],datum2=alt4[n]+TBD7; |
RyotaNakamura | 0:266e722e382f | 151 | for(n=0; n<=20; n++) { //条件式はTBD6により決定 |
RyotaNakamura | 0:266e722e382f | 152 | timer3.start(); |
RyotaNakamura | 0:266e722e382f | 153 | ticker.attach(&dateWriting, 0.1); //タイマー割込み |
RyotaNakamura | 0:266e722e382f | 154 | alt4[n]=Alt; |
RyotaNakamura | 0:266e722e382f | 155 | if(alt4[n]<=datum2) { |
RyotaNakamura | 0:266e722e382f | 156 | counter3++; //取得高度の6割が初期高度+TBD5以下ならばプラス1 |
RyotaNakamura | 0:266e722e382f | 157 | } |
RyotaNakamura | 0:266e722e382f | 158 | timer3.stop(); |
RyotaNakamura | 0:266e722e382f | 159 | time3=timer3.read(); |
RyotaNakamura | 0:266e722e382f | 160 | } |
RyotaNakamura | 0:266e722e382f | 161 | decision3=counter3/(n+1); //(取得高度のうち初期高度+TBD5以下の数)÷(取得高度の総数) |
RyotaNakamura | 0:266e722e382f | 162 | } |
RyotaNakamura | 0:266e722e382f | 163 | } |
RyotaNakamura | 0:266e722e382f | 164 | |
RyotaNakamura | 0:266e722e382f | 165 | wait(0.1); |
RyotaNakamura | 0:266e722e382f | 166 | servo3.pulsewidth(0.0015); //CanSat開放(servo角度を90度に設定) |
RyotaNakamura | 0:266e722e382f | 167 | servo4.pulsewidth(0.0015); |
RyotaNakamura | 0:266e722e382f | 168 | |
RyotaNakamura | 0:266e722e382f | 169 | pc.printf("Finish!\n"); |
RyotaNakamura | 0:266e722e382f | 170 | } |