東北大学学友会準加盟団体 From The Earth の高高度ロケットFTE-06(通称:海豚)にて使用したソフトウェアです.ご自由にお使いください.このプログラムによって生じた損害について当団体は一切責任を負いません.また,各モジュールのライブラリは当団体が作成したものではないので再配布は禁止します.
Dependencies: mbed FATFileSystem
Fork of FTE-06 by
Diff: main.cpp
- Revision:
- 2:3f81e5511138
- Parent:
- 1:6d05a3f76ac5
- Child:
- 3:983e03f4e146
--- a/main.cpp Tue May 23 13:09:31 2017 +0000 +++ b/main.cpp Tue May 23 13:56:38 2017 +0000 @@ -1,9 +1,7 @@ -//for FTE-06 - -//testtest #pragma O3 #include "mbed.h" +#include "SDFileSystem.h" @@ -13,7 +11,6 @@ #define launch_acc_threshold 5//発射時の加速度(G) -#define launch_pressure_threshold 990//発射したとみなす気圧(おおよそ地上気圧-80.4hpa) #define acc_axis 1//上方向の軸を決定x;0,y;1,z;2 #define pre_sd 0.037//気圧センサの測定誤差(事前に測定して計算) #define size_dif 3//気圧の変位を保存する数 @@ -26,13 +23,13 @@ DigitalOut myled4(LED4); Timer t; - +AnalogIn analog_rand(p20);//電圧読み取り用のピン -double pres_dif[size_dif]= {0}; //気圧の変化をsize_difの数だけ保存 +double pres_dif[]= {0}; //気圧の変化をsize_difの数だけ保存 uint32_t launch_detect_time=0;//発射検知の時間 uint32_t fall_detect_time=0;//頂点検知の時間 - +SDFileSystem sd(p5, p6, p7, p8, "sd");//SDカードのオブジェクト作成 class Rocket_Data_Get_And_Save//ロケットの測定データを管理するクラス { @@ -43,7 +40,10 @@ double latitude,longitude; double pres,temp; uint32_t eeprom_add; - + double val; + unsigned int seed; + char filename[100]; + int result_num; Rocket_Data_Get_And_Save() {//初期化子 for(uint32_t j=0; j<3; j++) { @@ -54,25 +54,43 @@ time_ms_now=0; latitude=0; longitude=0; + + /*analogpinの入力電圧を用いてrandomなfile作成*/ + val = analog_rand.read();//p20の電圧読み取り + seed = val * 10000; + do { seed %= 1000; } while (seed > 1000);//0~999のunsigned_int型に変換 + srand(seed); + result_num = rand(); + sprintf(filename, "result_%d.dat", result_num); } + void save_data() { //sdカードへのデータの保存 - /* - データのセーブについて - データを上書きされないように乱数を使って - データ名を毎回変更する - クラスの初期化子でファイル名を決めてしまうといいかも - 乱数のseedは起動するたびに変更する必要があるので - 何もつながっていないanalogpinの入力電圧とか使うといいかも - 乱数の幅は0~999までとかに制限すること - データはresult_(乱数).datに保存すること - データの書式は - "time,temperature,pressure,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,..." - という書式にすること - 下手に単位とかデータの名前をいれるとデータ分析で時間がかかるので、数値を","で区切るだけにすること - */ - + + /* + データのセーブについて + データを上書きされないように乱数を使って + データ名を毎回変更する + クラスの初期化子でファイル名を決めてしまうといいかも + 乱数のseedは起動するたびに変更する必要があるので + 何もつながっていないanalogpinの入力電圧とか使うといいかも + 乱数の幅は0~999までとかに制限すること + データはresult_(乱数).datに保存すること + データの書式は + "time,temperature,pressure,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,..." + という書式にすること + 下手に単位とかデータの名前をいれるとデータ分析で時間がかかるので、数値を","で区切るだけにすること + */ + + /*SDカードに書き込み*/ + mkdir("/sd/mydir", 0777); + FILE *fp = fopen("/sd/mydir/filename", "w"); + if (fp == NULL)error("Could not open SD Card for write\n"); + fprintf(fp, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", time, tempurature, pressure, acc[0], acc[1], acc[2], gyro[0], gyro[1], gyro[2], latitude, logitude); + fclose(fp); + } + void get_data() { time_ms_now=t.read_ms();//取得時の時間を保存 @@ -175,15 +193,13 @@ while(true) { rocket_data.get_data(); pres_dif[cycle%size_dif]=rocket_data.pres-pre_pres;//差分を計算 - - //加速度で検知 if(fabs(rocket_data.acc[acc_axis])>launch_acc_threshold) { launch_detect_time=t.read_ms(); msg=1; break; //気圧で検知 - } else if(rocket_data.pres<=launch_pressure_threshold) {//基準気圧を下回ったら発射を検知 + } else if(pressure_status_check()==1) { launch_detect_time=t.read_ms(); msg=0; break; @@ -216,7 +232,7 @@ //頂点検知にロックをかける if((t.read_ms()-launch_detect_time)>fall_detect_lock) { //気圧変動の判定を取得 - if(pressure_status_check()!=1) {//上昇しなくなったと検知したら頂点検知 + if(pressure_status_check()==2) { fall_detect_time=t.read_ms(); break; //やばいときのための時間制限 @@ -226,7 +242,7 @@ } } cycle++; - pre_pres=rocket_data.pres;//更新 + pre_pres=rocket_data.pres; } //気圧で発射検知したとき } else { @@ -235,12 +251,12 @@ while(true) { rocket_data.get_data(); pres_dif[cycle%size_dif]=rocket_data.pres-pre_pres; - if(pressure_status_check()!=1) {//上昇しなくなったら頂点検知 + if(pressure_status_check()==2) { fall_detect_time=t.read_ms(); break; } cycle++; - pre_pres=rocket_data.pres;//更新 + pre_pres=rocket_data.pres; } } @@ -280,5 +296,4 @@ bottle_close(); -} - +} \ No newline at end of file