2021年3月伊豆大島共同打上実験の電装ミッションプログラム
Dependencies: mbed ADS1015 PQ_LPS22HB SPS30 SDFileSystem
Revision 0:976e8caa93f4, committed 2021-03-14
- Comitter:
- kazuncho
- Date:
- Sun Mar 14 16:00:18 2021 +0000
- Commit message:
- 2021/03/15;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADS1015.lib Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/arve0/code/ADS1015/#aa277517f0ad
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PQ_LPS22HB.lib Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/PQ_Hybrid_Electrical_Equipment_Team/code/PQ_LPS22HB/#9a7d5d7e63be
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/IZU2020/code/SDFileSystem/#7d0c7cd191a9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPS30.lib Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/IZU2020/code/SPS30/#258136183ba2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,331 @@ +#include "mbed.h" +#include <cmath> +#include "sps30.h" +#include "SDFileSystem.h" +#include "Adafruit_ADS1015.h" +#include "PQ_LPS22HB.h" + +#define ADS1115_ADDR 0b1001000 + +FILE *fp; + +I2C i2c(D4, D5); +Serial pc(USBTX, USBRX, 115200); +Sps30 sps(D4, D5, 100000); +SDFileSystem sd(D11, D12, D13, A3, "sd"); +Adafruit_ADS1115 ads1115(&i2c, ADS1115_ADDR); +LPS22HB lps33hw(i2c, LPS22HB::SA0_HIGH); +LPS22HB lps22hb(i2c, LPS22HB::SA0_LOW); + +DigitalOut switch_on(D0); +DigitalIn mission(D6); +DigitalIn relay(D3); + +Timer mission_timer; +Timer flight_timer; +Timer sd_timer; +Ticker log_ticker; +Ticker read_ticker; + +char file_name[64]; +char f_inside_lps; +char f_outside_lps; + +enum { + READY, + RISE, + FALL, + RECOVERY, +} phase; + +bool recovery = false; + +int mission_time; +int flight_time; +int sps_init; +int sps_poll; + +float pitot_speed; +float density = 1.3; + +float outside_press; +float outside_temp; +float inside_press; +float inside_temp; + +float mass1p0; +float mass2p5; +float mass4p0; +float mass10p0; +float num0p5; +float num1p0; +float num2p5; +float num4p0; +float num10p0; +float typ_pm; + +void init(); +void read(); +void pitot_tube(); +void lps33hw_mission(); +void lps22hb_mission(); +void record(); +void read_sps30(); + +int main() +{ + init(); + mission_timer.start(); + while(1) { + pitot_tube(); + lps33hw_mission(); + lps22hb_mission(); + read_sps30(); + //read(); + if(mission and !relay) { //リセット + phase = READY; + switch_on = 1; + recovery = false; + mission_timer.reset(); + mission_timer.start(); + flight_timer.reset(); + flight_timer.stop(); + } + switch(phase) { + case READY: //0 + if(mission and relay) { + phase = RISE; + flight_timer.reset(); + flight_timer.start(); + } + break; + case RISE: //1 + if(!mission and relay) { + phase = FALL; + } + break; + case FALL: //2 + if(!mission and !relay) { + phase = RECOVERY; + fclose(fp); + //flight_timer.stop(); + //mission_timer.stop(); + wait(1.0f); + } + break; + case RECOVERY: //3 + if(!recovery) { + switch_on = 0; //センサーへの電源供給停止 + recovery = true; + } + break; + } + wait(0.5f); + } +} + +void init() +{ + pc.printf("---PQ_Hybrid_Mission---\r\n"); + switch_on = 1; //センサーへ電源供給開始 + //recovery = false; + wait(1.0f); + lps22hb.begin(); + lps33hw.begin(); + + sd.mount(); + mkdir("/sd", 0777); + char file_name_format[] = "/sd/IZU2021_MISSION_%d.dat"; + int file_number = 1; + while(1) { + sprintf(file_name, file_name_format, file_number); + fp = fopen(file_name, "r"); + if(fp != NULL) { + fclose(fp); + file_number++; + } else { + sprintf(file_name, "/sd/IZU2021_MISSION_%d.dat", file_number); + break; + } + } + fp = fopen(file_name, "w"); + sd_timer.start(); + if(fp) { + fprintf(fp, "mission_time[s]\t"); + fprintf(fp, "flight_time[s]\t"); + fprintf(fp, "phase\t"); + fprintf(fp, "pitot_speed[m/s]\t"); + fprintf(fp, "pitot_speed[km/h]\t"); + fprintf(fp, "mass_1p0\t"); + fprintf(fp, "mass_2p5\t"); + fprintf(fp, "mass_4p0\t"); + fprintf(fp, "mass_10p0\t"); + fprintf(fp, "num_0p5\t"); + fprintf(fp, "num_1p0\t"); + fprintf(fp, "num_2p5\t"); + fprintf(fp, "num_4p0\t"); + fprintf(fp, "num_10p0\t"); + fprintf(fp, "typ_pm_size\t"); + fprintf(fp, "outside_press[Pa]\t"); + fprintf(fp, "outside_temp[degC]\t"); + fprintf(fp, "inside_press[Pa]\t"); + fprintf(fp, "inside_temp[degC]\t"); + fprintf(fp, "\r\n"); + } + + log_ticker.attach(record, 0.5f); + //read_ticker.attach(read, 0.5f); +} + +/********************************************* +/ MPXV5004DPの場合:(Differencial) = ((Vout / Vs) - 0.2) / 0.2 +/ MPX5010DPの場合:(Differencial) = ((Vout / Vs) - 0.04) / 0.09 +/ speed = root(2 * P / ρ) +/ pitot_paが負のときnanが返される +**********************************************/ +void pitot_tube() +{ + float sum = 0; + float voltage = 0; + float pitot_pa = 0; + float pitot_volt = 0; + for(int i = 0; i < 10; i++) { + int16_t val = ads1115.readADC_SingleEnded(0); + voltage = val / 32768.0 * 6.144; + sum += voltage; + } + float v_ave = sum / 10.0f; + pitot_volt = voltage - v_ave + 0.2f; + pitot_pa = (pitot_volt / 5.0f - 0.04f) / 0.09f; + pitot_speed = sqrt(2 * pitot_pa * 1000 / density); +} + +/********************************************* +/ 水密外配置。リレーの条件に使用する。 +**********************************************/ +void lps33hw_mission() +{ + f_outside_lps = lps33hw.test(); + if(f_outside_lps) { + outside_press = 0; + outside_temp = 0; + lps33hw.read_press(&outside_press); + lps33hw.read_temp(&outside_temp); + } +} + +/********************************************* +/ 水密内配置。水密になっているかの確認用。 +**********************************************/ +void lps22hb_mission() +{ + f_inside_lps = lps22hb.test(); + if(f_inside_lps) { + inside_press = 0; + inside_temp = 0; + lps22hb.read_press(&inside_press); + lps22hb.read_temp(&inside_temp); + } +} + +void read_sps30() +{ + sps_init = sps.InitSPS30(); + if(sps.PollSPS30() == 3) { + mass1p0 = sps.mass_1p0_f; + mass2p5 = sps.mass_2p5_f; + mass4p0 = sps.mass_4p0_f; + mass10p0 = sps.mass_10p0_f; + num0p5 = sps.num_0p5_f; + num1p0 = sps.num_1p0_f; + num2p5 = sps.num_2p5_f; + num4p0 = sps.num_4p0_f; + num10p0 = sps.num_10p0_f; + typ_pm = sps.typ_pm_size_f; + } +} + +void record() +{ + mission_time = mission_timer.read(); + flight_time = flight_timer.read(); + fprintf(fp, "%4d\t", mission_time); + fprintf(fp, "%4d\t", flight_time); + fprintf(fp, "%1d\t", phase); + fprintf(fp, "%f\t", pitot_speed); + fprintf(fp, "%f\t", pitot_speed * 3600 / 1000.0f); + fprintf(fp, "%f\t", sps.mass_1p0_f); + fprintf(fp, "%f\t", sps.mass_2p5_f); + fprintf(fp, "%f\t", sps.mass_4p0_f); + fprintf(fp, "%f\t", sps.mass_10p0_f); + fprintf(fp, "%f\t", sps.num_0p5_f); + fprintf(fp, "%f\t", sps.num_1p0_f); + fprintf(fp, "%f\t", sps.num_2p5_f); + fprintf(fp, "%f\t", sps.num_4p0_f); + fprintf(fp, "%f\t", sps.num_10p0_f); + fprintf(fp, "%f\t", sps.typ_pm_size_f); + fprintf(fp, "%f\t", outside_press); + fprintf(fp, "%f\t", outside_temp); + fprintf(fp, "%f\t", inside_press); + fprintf(fp, "%f\t", inside_temp); + fprintf(fp, "\r\n"); + + if(sd_timer.read_ms() >= 60*1000) { //1分ごとにリセット、開き直す。 + sd_timer.reset(); + sd_timer.start(); + if(fp) { + fclose(fp); + fp = fopen(file_name, "a"); //a:追加書き込みモード + } + } +} + + +void read() +{ + mission_time = mission_timer.read(); + flight_time = flight_timer.read(); + pc.printf("mission time:%d\t", mission_time); + pc.printf("flight time:%d\t", flight_time); + pc.printf("phase:%d\t", (int)phase); + pc.printf("relay:%d", (int)switch_on); + /* + pc.printf("SPEED[m/s]:\t"); + pc.printf("SPEED[km/h]:\t"); + pc.printf("MASS_1P0\t"); + pc.printf("MASS_2P5\t"); + pc.printf("MASS_4P0\t"); + pc.printf("MASS_10P0\t"); + pc.printf("NUM_0P5\t"); + pc.printf("NUM_1P0\t"); + pc.printf("NUM_2P5\t"); + pc.printf("NUM_4P0\t"); + pc.printf("NUM_10P0\t"); + pc.printf("PM_SIZE\t"); + pc.printf("OUT_PRESS\t"); + pc.printf("OUT_TEMP\t"); + pc.printf("IN_PRESS\t"); + pc.printf("IN_TEMP\t"); + */ + pc.printf("\r\n"); + /* + pc.printf("%f\t", pitot_speed); + pc.printf("%f\t", pitot_speed * 3600 / 1000.0f); + pc.printf("%.2f\t", mass1p0); + pc.printf("%.2f\t", mass2p5); + pc.printf("%.2f\t", mass4p0); + pc.printf("%.2f\t", mass10p0); + pc.printf("%.2f\t", num0p5); + pc.printf("%.2f\t", num1p0); + pc.printf("%.2f\t", num2p5); + pc.printf("%.2f\t", num4p0); + pc.printf("%.2f\t", num10p0); + pc.printf("%.2f\t", typ_pm); + pc.printf("%.2f\t", ground_press); + pc.printf("%.2f\t", outside_press); + pc.printf("%.1f\t", outside_temp); + pc.printf("%.2f\t", inside_press); + pc.printf("%.1f\t", inside_temp); + pc.printf("\r\n"); + */ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Mar 14 16:00:18 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file