東北大学学友会準加盟団体 From The Earth の高高度ロケットFTE-06(通称:海豚)にて使用したソフトウェアです.ご自由にお使いください.このプログラムによって生じた損害について当団体は一切責任を負いません.また,各モジュールのライブラリは当団体が作成したものではないので再配布は禁止します.

Dependencies:   mbed FATFileSystem

Fork of FTE-06 by Tetsushi Amano

Committer:
mizuki_akaike
Date:
Sun Jun 11 11:37:11 2017 +0000
Revision:
10:ef6fb2d8e2c8
Parent:
9:bcc7dbc2d185
Child:
11:c43040ddcfb8
eeprom????????????; eeprom?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
moai26 0:9c3cc716cbb3 1 #pragma O3
moai26 0:9c3cc716cbb3 2
moai26 0:9c3cc716cbb3 3 #include "mbed.h"
kohei_yamamoto 2:3f81e5511138 4 #include "SDFileSystem.h"
mizuki_akaike 7:bc4710d2c7d8 5 #include "BMP085.h"
mizuki_akaike 8:4d2e785cb951 6 #include "L3GD20.h"
mizuki_akaike 9:bcc7dbc2d185 7 #include "LSM303DLHC.h"
mizuki_akaike 10:ef6fb2d8e2c8 8 #include "24LCXXX.h"
mizuki_akaike 10:ef6fb2d8e2c8 9 #include "string"
mizuki_akaike 10:ef6fb2d8e2c8 10 using namespace std;
moai26 0:9c3cc716cbb3 11 //発射検知でLED1の点灯、頂点通過検知でLED2の点灯、パラシュート展開でLED3の点灯、水密構造のLED4の点灯
mizuki_akaike 9:bcc7dbc2d185 12 //-----------------------------------------ロケットの制御にかかわる設定
mizuki_akaike 9:bcc7dbc2d185 13 #define launch_pressure_threshold 990.//発射したとみなす気圧(おおよそ地上気圧-80.4hpa)
mizuki_akaike 9:bcc7dbc2d185 14 #define launch_acc_threshold 5.//発射時の加速度(G)
moai26 0:9c3cc716cbb3 15 #define acc_axis 1//上方向の軸を決定x;0,y;1,z;2
mizuki_akaike 3:983e03f4e146 16 #define pre_sd 0.00037//気圧センサの測定誤差(事前に測定して計算)
moai26 0:9c3cc716cbb3 17 #define size_dif 3//気圧の変位を保存する数
moai26 0:9c3cc716cbb3 18 #define time_limit_launch_and_fall_ms 20000//発射から頂点に至るまでの予測時間(msec)
moai26 0:9c3cc716cbb3 19 #define fall_detect_lock 2000//加速度で発射検知したときに頂点検知にロックをかける時間(msec)
moai26 0:9c3cc716cbb3 20
mizuki_akaike 9:bcc7dbc2d185 21 //-----------------------------------------センサの測定レンジなどの設定
mizuki_akaike 9:bcc7dbc2d185 22 #define Acc_range 2.
mizuki_akaike 9:bcc7dbc2d185 23 #define conv2Gravity 1./(32768./Acc_range)
mizuki_akaike 10:ef6fb2d8e2c8 24 #define AT24C1024_address 0x50
mizuki_akaike 9:bcc7dbc2d185 25
moai26 0:9c3cc716cbb3 26 DigitalOut myled1(LED1);
moai26 0:9c3cc716cbb3 27 DigitalOut myled2(LED2);
moai26 0:9c3cc716cbb3 28 DigitalOut myled3(LED3);
moai26 0:9c3cc716cbb3 29 DigitalOut myled4(LED4);
moai26 0:9c3cc716cbb3 30 Timer t;
moai26 0:9c3cc716cbb3 31
kohei_yamamoto 2:3f81e5511138 32 AnalogIn analog_rand(p20);//電圧読み取り用のピン
moai26 0:9c3cc716cbb3 33
kohei_yamamoto 2:3f81e5511138 34 double pres_dif[]= {0}; //気圧の変化をsize_difの数だけ保存
moai26 0:9c3cc716cbb3 35 uint32_t launch_detect_time=0;//発射検知の時間
moai26 0:9c3cc716cbb3 36 uint32_t fall_detect_time=0;//頂点検知の時間
moai26 0:9c3cc716cbb3 37
kohei_yamamoto 2:3f81e5511138 38 SDFileSystem sd(p5, p6, p7, p8, "sd");//SDカードのオブジェクト作成
mizuki_akaike 9:bcc7dbc2d185 39 BMP085 BMP(p9,p10);//気圧、温度センサのクラス
mizuki_akaike 9:bcc7dbc2d185 40 L3GD20 L3GD(p9,p10);//ジャイロセンサのクラス
mizuki_akaike 9:bcc7dbc2d185 41 I2C L(p9,p10);
mizuki_akaike 9:bcc7dbc2d185 42 LSM303DLHC LSM(&L);//加速度センサのクラス
mizuki_akaike 10:ef6fb2d8e2c8 43 I2C E(p9,p10);
mizuki_akaike 10:ef6fb2d8e2c8 44 _24LCXXX eeprom(&E,AT24C1024_address);//eepromのクラス
moai26 0:9c3cc716cbb3 45
moai26 0:9c3cc716cbb3 46 class Rocket_Data_Get_And_Save//ロケットの測定データを管理するクラス
moai26 0:9c3cc716cbb3 47 {
mizuki_akaike 6:f4d022422ba6 48 private:
mizuki_akaike 10:ef6fb2d8e2c8 49 int check_eeprom;
mizuki_akaike 6:f4d022422ba6 50 uint32_t time_ms_now;
mizuki_akaike 10:ef6fb2d8e2c8 51 string write_data_string;
mizuki_akaike 9:bcc7dbc2d185 52 inline void LSM_updata() {
mizuki_akaike 9:bcc7dbc2d185 53 LSM.getAccel();
mizuki_akaike 9:bcc7dbc2d185 54 acc[0]=conv2Gravity*LSM.accelX();
mizuki_akaike 9:bcc7dbc2d185 55 acc[1]=conv2Gravity*LSM.accelY();
mizuki_akaike 9:bcc7dbc2d185 56 acc[2]=conv2Gravity*LSM.accelZ();
mizuki_akaike 9:bcc7dbc2d185 57
mizuki_akaike 9:bcc7dbc2d185 58 }
mizuki_akaike 9:bcc7dbc2d185 59
moai26 0:9c3cc716cbb3 60 public:
moai26 0:9c3cc716cbb3 61 double acc[3];//x,y,z
mizuki_akaike 9:bcc7dbc2d185 62 float gyro[3];
moai26 0:9c3cc716cbb3 63 double mag[3];
moai26 0:9c3cc716cbb3 64 double latitude,longitude;
moai26 0:9c3cc716cbb3 65 double pres,temp;
moai26 0:9c3cc716cbb3 66 uint32_t eeprom_add;
kohei_yamamoto 2:3f81e5511138 67 double val;
kohei_yamamoto 2:3f81e5511138 68 unsigned int seed;
kohei_yamamoto 2:3f81e5511138 69 char filename[100];
kohei_yamamoto 2:3f81e5511138 70 int result_num;
moai26 0:9c3cc716cbb3 71
moai26 0:9c3cc716cbb3 72 Rocket_Data_Get_And_Save() {//初期化子
mizuki_akaike 10:ef6fb2d8e2c8 73 //--------------変数の初期化
moai26 0:9c3cc716cbb3 74 for(uint32_t j=0; j<3; j++) {
moai26 0:9c3cc716cbb3 75 acc[j]=gyro[j]=mag[j]=0;
moai26 0:9c3cc716cbb3 76 }
mizuki_akaike 10:ef6fb2d8e2c8 77 pres=0;
mizuki_akaike 10:ef6fb2d8e2c8 78 temp=0;
moai26 0:9c3cc716cbb3 79 eeprom_add=0;
mizuki_akaike 10:ef6fb2d8e2c8 80 check_eeprom=true;
moai26 0:9c3cc716cbb3 81 time_ms_now=0;
moai26 0:9c3cc716cbb3 82 latitude=0;
moai26 0:9c3cc716cbb3 83 longitude=0;
mizuki_akaike 9:bcc7dbc2d185 84
mizuki_akaike 10:ef6fb2d8e2c8 85 //---------------------------
kohei_yamamoto 2:3f81e5511138 86 /*analogpinの入力電圧を用いてrandomなfile作成*/
kohei_yamamoto 2:3f81e5511138 87 val = analog_rand.read();//p20の電圧読み取り
kohei_yamamoto 2:3f81e5511138 88 seed = val * 10000;
mizuki_akaike 9:bcc7dbc2d185 89 do {
mizuki_akaike 9:bcc7dbc2d185 90 seed %= 1000;
mizuki_akaike 9:bcc7dbc2d185 91 } while (seed > 1000);//0~999のunsigned_int型に変換
kohei_yamamoto 2:3f81e5511138 92 srand(seed);
kohei_yamamoto 2:3f81e5511138 93 result_num = rand();
kohei_yamamoto 2:3f81e5511138 94 sprintf(filename, "result_%d.dat", result_num);
mizuki_akaike 5:80e841579008 95 mkdir("/sd/mydir", 0777);
moai26 0:9c3cc716cbb3 96 }
moai26 0:9c3cc716cbb3 97
kohei_yamamoto 2:3f81e5511138 98
moai26 0:9c3cc716cbb3 99 void save_data() { //sdカードへのデータの保存
mizuki_akaike 9:bcc7dbc2d185 100
mizuki_akaike 9:bcc7dbc2d185 101 /*
mizuki_akaike 9:bcc7dbc2d185 102 データのセーブについて
mizuki_akaike 9:bcc7dbc2d185 103 データを上書きされないように乱数を使って
mizuki_akaike 9:bcc7dbc2d185 104 データ名を毎回変更する
mizuki_akaike 9:bcc7dbc2d185 105 クラスの初期化子でファイル名を決めてしまうといいかも
mizuki_akaike 9:bcc7dbc2d185 106 乱数のseedは起動するたびに変更する必要があるので
mizuki_akaike 9:bcc7dbc2d185 107 何もつながっていないanalogpinの入力電圧とか使うといいかも
mizuki_akaike 9:bcc7dbc2d185 108 乱数の幅は0~999までとかに制限すること
mizuki_akaike 9:bcc7dbc2d185 109 データはresult_(乱数).datに保存すること
mizuki_akaike 9:bcc7dbc2d185 110 データの書式は
mizuki_akaike 9:bcc7dbc2d185 111 "time,temperature,pressure,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,..."
mizuki_akaike 9:bcc7dbc2d185 112 という書式にすること
mizuki_akaike 9:bcc7dbc2d185 113 下手に単位とかデータの名前をいれるとデータ分析で時間がかかるので、数値を","で区切るだけにすること
mizuki_akaike 9:bcc7dbc2d185 114 */
mizuki_akaike 9:bcc7dbc2d185 115
mizuki_akaike 9:bcc7dbc2d185 116 /*SDカードに書き込み*/
mizuki_akaike 9:bcc7dbc2d185 117
mizuki_akaike 9:bcc7dbc2d185 118 FILE *fp = fopen("/sd/mydir/filename", "w");
mizuki_akaike 9:bcc7dbc2d185 119 if (fp == NULL)error("Could not open SD Card for write\n");
mizuki_akaike 9:bcc7dbc2d185 120 fprintf(fp, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", time, temp, pres, acc[0], acc[1], acc[2], gyro[0], gyro[1], gyro[2], latitude, longitude);
mizuki_akaike 9:bcc7dbc2d185 121 fclose(fp);
mizuki_akaike 9:bcc7dbc2d185 122
moai26 0:9c3cc716cbb3 123 }
mizuki_akaike 9:bcc7dbc2d185 124
moai26 0:9c3cc716cbb3 125 void get_data() {
moai26 0:9c3cc716cbb3 126 time_ms_now=t.read_ms();//取得時の時間を保存
mizuki_akaike 7:bc4710d2c7d8 127 BMP.update();
mizuki_akaike 7:bc4710d2c7d8 128 pres=BMP.get_pressure();
mizuki_akaike 7:bc4710d2c7d8 129 temp=BMP.get_temperature();
mizuki_akaike 8:4d2e785cb951 130 L3GD.read(&gyro[0],&gyro[1],&gyro[2]);
mizuki_akaike 9:bcc7dbc2d185 131 LSM_updata();
moai26 0:9c3cc716cbb3 132 save_data();//データの保存
moai26 0:9c3cc716cbb3 133 }
moai26 0:9c3cc716cbb3 134
moai26 0:9c3cc716cbb3 135 void write_data2eeprom() {//eepromへの書き込み
mizuki_akaike 10:ef6fb2d8e2c8 136 //最低限のデータのみ保存
mizuki_akaike 10:ef6fb2d8e2c8 137 char buf[10];
mizuki_akaike 10:ef6fb2d8e2c8 138 sprintf(buf,"%d",time);
mizuki_akaike 10:ef6fb2d8e2c8 139 write_data_string=buf;
mizuki_akaike 10:ef6fb2d8e2c8 140 sprintf(buf,"%f",pres);
mizuki_akaike 10:ef6fb2d8e2c8 141 write_data_string+= buf;
mizuki_akaike 10:ef6fb2d8e2c8 142 check_eeprom=eeprom.nbyte_write(eeprom_add,(char*)write_data_string.c_str(),sizeof((char*)write_data_string.c_str()));
mizuki_akaike 10:ef6fb2d8e2c8 143 eeprom_add+=sizeof((char*)write_data_string.c_str());
mizuki_akaike 10:ef6fb2d8e2c8 144 }
mizuki_akaike 10:ef6fb2d8e2c8 145
mizuki_akaike 10:ef6fb2d8e2c8 146 void delete_eeprom() { //eepromの中身を全消去
moai26 0:9c3cc716cbb3 147
moai26 0:9c3cc716cbb3 148
moai26 0:9c3cc716cbb3 149 }
moai26 0:9c3cc716cbb3 150
moai26 0:9c3cc716cbb3 151 void get_GPS() {//GPSデータの取得
moai26 0:9c3cc716cbb3 152
moai26 0:9c3cc716cbb3 153
moai26 0:9c3cc716cbb3 154 }
moai26 0:9c3cc716cbb3 155
moai26 0:9c3cc716cbb3 156 void send_GPS() {//GPSデータの送信
moai26 0:9c3cc716cbb3 157
moai26 0:9c3cc716cbb3 158
moai26 0:9c3cc716cbb3 159 }
mizuki_akaike 6:f4d022422ba6 160
moai26 0:9c3cc716cbb3 161 };
moai26 0:9c3cc716cbb3 162
moai26 0:9c3cc716cbb3 163 Rocket_Data_Get_And_Save rocket_data;
moai26 0:9c3cc716cbb3 164
moai26 0:9c3cc716cbb3 165 uint32_t pressure_status_check()
moai26 0:9c3cc716cbb3 166 {
moai26 0:9c3cc716cbb3 167 //気圧が上昇なら2,減少なら1,変化していないなら0を返す
moai26 0:9c3cc716cbb3 168 //つまり、機体が上昇なら1、下降なら2を返す
moai26 0:9c3cc716cbb3 169 uint32_t pressure_status[size_dif]= {0};
moai26 0:9c3cc716cbb3 170 //pres_dif[]は気圧の変動を保存
moai26 0:9c3cc716cbb3 171 for(uint32_t num=0; num<size_dif; num++) {
moai26 0:9c3cc716cbb3 172 if(pres_dif[num]>3*pre_sd) {//pre_sdは気圧センサの測定誤差
moai26 0:9c3cc716cbb3 173 pressure_status[num]=2;
moai26 0:9c3cc716cbb3 174 } else if(pres_dif[num]<-3*pre_sd) {
moai26 0:9c3cc716cbb3 175 pressure_status[num]=1;
moai26 0:9c3cc716cbb3 176 } else {
moai26 0:9c3cc716cbb3 177 pressure_status[num]=0;
moai26 0:9c3cc716cbb3 178 }
moai26 0:9c3cc716cbb3 179 }
moai26 0:9c3cc716cbb3 180 uint32_t msg=0;
moai26 0:9c3cc716cbb3 181 for(uint32_t num=2; num<size_dif; num++) {
moai26 0:9c3cc716cbb3 182 if(pressure_status[num]==1&&pressure_status[num-1]==1&&pressure_status[num-2]==1) {//3回連続気圧減少なら、機体が上昇中
moai26 0:9c3cc716cbb3 183 msg=1;
moai26 0:9c3cc716cbb3 184 break;
moai26 0:9c3cc716cbb3 185 } else if(pressure_status[num]==2&&pressure_status[num-1]==2&&pressure_status[num-2]==2) {//3回連続気圧上昇なら、機体が下降中
moai26 0:9c3cc716cbb3 186 msg=2;
moai26 0:9c3cc716cbb3 187 break;
moai26 0:9c3cc716cbb3 188 } else { //それ以外は安定状態判定
moai26 0:9c3cc716cbb3 189 continue;
moai26 0:9c3cc716cbb3 190 }
moai26 0:9c3cc716cbb3 191
moai26 0:9c3cc716cbb3 192 }
moai26 0:9c3cc716cbb3 193
moai26 0:9c3cc716cbb3 194 return msg;
moai26 0:9c3cc716cbb3 195
moai26 0:9c3cc716cbb3 196 }
moai26 0:9c3cc716cbb3 197
moai26 0:9c3cc716cbb3 198 void SD_check() //SDカードの確認
moai26 0:9c3cc716cbb3 199 {
moai26 0:9c3cc716cbb3 200 /*
moai26 0:9c3cc716cbb3 201 起動時に4つのLEDを一旦全部点灯
moai26 0:9c3cc716cbb3 202 SDカードの接続とかセンサーがつながっていることが確認されたら、LEDをすべて消灯
moai26 0:9c3cc716cbb3 203 確認終了後break
moai26 0:9c3cc716cbb3 204 */
moai26 0:9c3cc716cbb3 205
moai26 0:9c3cc716cbb3 206
moai26 0:9c3cc716cbb3 207 myled1=myled2=myled3=myled4=1;
moai26 0:9c3cc716cbb3 208 wait_ms(1000);
moai26 0:9c3cc716cbb3 209 myled1=myled2=myled3=myled4=0;
moai26 0:9c3cc716cbb3 210 }
moai26 0:9c3cc716cbb3 211
moai26 0:9c3cc716cbb3 212 uint32_t Launch_detect() //発射検知
moai26 0:9c3cc716cbb3 213 {
moai26 0:9c3cc716cbb3 214 /*
moai26 0:9c3cc716cbb3 215 加速度センサーで検知するタイプと気圧センサで検知するタイプの二つを用意
moai26 0:9c3cc716cbb3 216
moai26 0:9c3cc716cbb3 217 加速度検知した場合は検知後、数秒間は頂点検知にロックをかける。
moai26 0:9c3cc716cbb3 218 検知したらbreak
moai26 0:9c3cc716cbb3 219 検知したらLED1を点灯
moai26 0:9c3cc716cbb3 220 加速度センサで検知したら1,気圧センサで検知したら0を返す
moai26 0:9c3cc716cbb3 221 */
moai26 0:9c3cc716cbb3 222
moai26 0:9c3cc716cbb3 223 //センサの初期データを取得
moai26 0:9c3cc716cbb3 224 double pre_pres=0;
moai26 0:9c3cc716cbb3 225 rocket_data.get_data();
moai26 0:9c3cc716cbb3 226 for(uint32_t j=0; j<size_dif; j++) {
moai26 0:9c3cc716cbb3 227 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 228 rocket_data.get_data();
moai26 0:9c3cc716cbb3 229 pres_dif[j]=rocket_data.pres-pre_pres;
moai26 0:9c3cc716cbb3 230 }
moai26 0:9c3cc716cbb3 231
moai26 0:9c3cc716cbb3 232
moai26 0:9c3cc716cbb3 233 uint32_t msg;
moai26 0:9c3cc716cbb3 234 uint32_t cycle=0;
moai26 0:9c3cc716cbb3 235 rocket_data.get_data();
moai26 0:9c3cc716cbb3 236 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 237 while(true) {
moai26 0:9c3cc716cbb3 238 rocket_data.get_data();
moai26 0:9c3cc716cbb3 239 pres_dif[cycle%size_dif]=rocket_data.pres-pre_pres;//差分を計算
moai26 0:9c3cc716cbb3 240 //加速度で検知
moai26 0:9c3cc716cbb3 241 if(fabs(rocket_data.acc[acc_axis])>launch_acc_threshold) {
moai26 0:9c3cc716cbb3 242 launch_detect_time=t.read_ms();
moai26 0:9c3cc716cbb3 243 msg=1;
moai26 0:9c3cc716cbb3 244 break;
moai26 0:9c3cc716cbb3 245 //気圧で検知
mizuki_akaike 5:80e841579008 246 } else if(rocket_data.pres<=launch_pressure_threshold) {//基準気圧を下回ったら発射を検知
moai26 0:9c3cc716cbb3 247 launch_detect_time=t.read_ms();
moai26 0:9c3cc716cbb3 248 msg=0;
moai26 0:9c3cc716cbb3 249 break;
moai26 0:9c3cc716cbb3 250 }
moai26 0:9c3cc716cbb3 251 cycle++;
moai26 0:9c3cc716cbb3 252 pre_pres=rocket_data.pres;//更新
moai26 0:9c3cc716cbb3 253 }
moai26 0:9c3cc716cbb3 254 myled1=1;
moai26 0:9c3cc716cbb3 255 return msg;
moai26 0:9c3cc716cbb3 256 }
moai26 0:9c3cc716cbb3 257
moai26 0:9c3cc716cbb3 258 void fall_detect(uint32_t launch_detect_msg) //頂点検知
moai26 0:9c3cc716cbb3 259 {
moai26 0:9c3cc716cbb3 260 /*
moai26 0:9c3cc716cbb3 261 加速度センサで発射検知された場合には、頂点検知ができなかったときのために時間の制限をかける。
moai26 0:9c3cc716cbb3 262 加速度検知のときは頂点検知に2,3秒ロックをかける
moai26 0:9c3cc716cbb3 263 気圧センサで発射検知された場合には、時間の制限はかけない。
moai26 0:9c3cc716cbb3 264 検知したらbreak
moai26 0:9c3cc716cbb3 265 検知したらLED2を点灯
moai26 0:9c3cc716cbb3 266 */
moai26 0:9c3cc716cbb3 267 double pre_pres=0;
moai26 0:9c3cc716cbb3 268 uint32_t cycle=0;
moai26 0:9c3cc716cbb3 269 //加速度検知で発射検知したとき
moai26 0:9c3cc716cbb3 270 if(launch_detect_msg==1) {
moai26 0:9c3cc716cbb3 271 rocket_data.get_data();
moai26 0:9c3cc716cbb3 272 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 273 while(true) {
moai26 0:9c3cc716cbb3 274 rocket_data.get_data();
moai26 0:9c3cc716cbb3 275 pres_dif[cycle%size_dif]=rocket_data.pres-pre_pres;
moai26 0:9c3cc716cbb3 276 //頂点検知にロックをかける
moai26 0:9c3cc716cbb3 277 if((t.read_ms()-launch_detect_time)>fall_detect_lock) {
moai26 0:9c3cc716cbb3 278 //気圧変動の判定を取得
kohei_yamamoto 2:3f81e5511138 279 if(pressure_status_check()==2) {
moai26 0:9c3cc716cbb3 280 fall_detect_time=t.read_ms();
moai26 0:9c3cc716cbb3 281 break;
moai26 0:9c3cc716cbb3 282 //やばいときのための時間制限
moai26 0:9c3cc716cbb3 283 } else if((t.read_ms()-launch_detect_time)>time_limit_launch_and_fall_ms) {
moai26 0:9c3cc716cbb3 284 fall_detect_time=t.read_ms();
moai26 0:9c3cc716cbb3 285 break;
moai26 0:9c3cc716cbb3 286 }
moai26 0:9c3cc716cbb3 287 }
moai26 0:9c3cc716cbb3 288 cycle++;
kohei_yamamoto 2:3f81e5511138 289 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 290 }
moai26 0:9c3cc716cbb3 291 //気圧で発射検知したとき
moai26 0:9c3cc716cbb3 292 } else {
moai26 0:9c3cc716cbb3 293 rocket_data.get_data();
moai26 0:9c3cc716cbb3 294 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 295 while(true) {
moai26 0:9c3cc716cbb3 296 rocket_data.get_data();
moai26 0:9c3cc716cbb3 297 pres_dif[cycle%size_dif]=rocket_data.pres-pre_pres;
kohei_yamamoto 2:3f81e5511138 298 if(pressure_status_check()==2) {
moai26 0:9c3cc716cbb3 299 fall_detect_time=t.read_ms();
moai26 0:9c3cc716cbb3 300 break;
moai26 0:9c3cc716cbb3 301 }
moai26 0:9c3cc716cbb3 302 cycle++;
kohei_yamamoto 2:3f81e5511138 303 pre_pres=rocket_data.pres;
moai26 0:9c3cc716cbb3 304 }
moai26 0:9c3cc716cbb3 305 }
moai26 0:9c3cc716cbb3 306
moai26 0:9c3cc716cbb3 307 myled2=1;
moai26 0:9c3cc716cbb3 308 }
moai26 0:9c3cc716cbb3 309
moai26 0:9c3cc716cbb3 310
moai26 0:9c3cc716cbb3 311
moai26 0:9c3cc716cbb3 312 void para_open() //パラシュート展開
moai26 0:9c3cc716cbb3 313 {
moai26 0:9c3cc716cbb3 314 /*
moai26 0:9c3cc716cbb3 315 fall_detectを抜けたら、パラシュート展開
moai26 0:9c3cc716cbb3 316 展開高度の制限が必要になったら、waitを挟む
moai26 0:9c3cc716cbb3 317 展開命令後LED3点灯
moai26 0:9c3cc716cbb3 318 */
moai26 0:9c3cc716cbb3 319 wait_ms(1000);
moai26 0:9c3cc716cbb3 320 myled3=1;
moai26 0:9c3cc716cbb3 321 }
moai26 0:9c3cc716cbb3 322
moai26 0:9c3cc716cbb3 323 void bottle_close() //水密構造稼働
moai26 0:9c3cc716cbb3 324 {
moai26 0:9c3cc716cbb3 325 /*
moai26 0:9c3cc716cbb3 326 パラシュート展開完了後、水密構造を起動
moai26 0:9c3cc716cbb3 327 水密構造稼働ごLED4点灯
moai26 0:9c3cc716cbb3 328 */
moai26 0:9c3cc716cbb3 329 wait_ms(1000);
moai26 0:9c3cc716cbb3 330 myled4=1;
moai26 0:9c3cc716cbb3 331 }
moai26 0:9c3cc716cbb3 332
moai26 0:9c3cc716cbb3 333 int main()
moai26 0:9c3cc716cbb3 334 {
moai26 0:9c3cc716cbb3 335 t.start();
moai26 0:9c3cc716cbb3 336 SD_check();
moai26 0:9c3cc716cbb3 337 uint32_t msg=Launch_detect();
moai26 0:9c3cc716cbb3 338 fall_detect(msg);
moai26 0:9c3cc716cbb3 339 para_open();
moai26 0:9c3cc716cbb3 340 bottle_close();
moai26 0:9c3cc716cbb3 341
moai26 0:9c3cc716cbb3 342
kohei_yamamoto 2:3f81e5511138 343 }