高高度CanSat Space SWANの投下時に使用したプログラム.(IZU2019)
Dependencies: Nichrome_lib mbed ads1115_test BNO055_lib ADXL375_i2c ES920LR CCS811_lib SDFileSystem BME280_lib INA226_lib EEPROM_lib GPS_interrupt
Diff: main.cpp
- Revision:
- 3:4571111a5996
- Parent:
- 2:a443df6115bc
- Child:
- 4:b878dce9c247
--- a/main.cpp Wed Feb 20 13:33:16 2019 +0000 +++ b/main.cpp Wed Feb 20 17:31:45 2019 +0000 @@ -46,11 +46,11 @@ Adafruit_ADS1115 ADS1115(&i2c_bus, ADS1015_ADDRESS); -DigitalOut Valve1(p23); -DigitalOut Valve2(p24); -DigitalOut Valve3(p24); -DigitalOut Valve4(p25); -DigitalOut Buzzer(p22); +Nichrome_lib Valve1(p23); +Nichrome_lib Valve2(p24); +Nichrome_lib Valve3(p24); +Nichrome_lib Valve4(p25); +Nichrome_lib Buzzer(p22); DigitalIn FlightPin(p15); @@ -63,6 +63,7 @@ Ticker tick_gps; Ticker tick_print; +Ticker tick_save; Ticker tick_header_data; @@ -100,9 +101,6 @@ bool do_first = false; bool controll_yn = false; -bool valve1 = false, valve2 = false, valve3 = false, valve4 = false; -bool buzzer = false; - bool es920_using = false; char es920_uplink_command = '-'; @@ -219,9 +217,11 @@ CanSat_phase = CANSAT_SAFETY; while(1) { readSensor(); - recData(); modeChange(); //状態遷移の判断 controllAttitude(); + if(save_fast){ + recData(); + } } } @@ -425,8 +425,8 @@ pc.printf("Controll : %d\r\n", controll_yn); pc.printf("Flight Pin : %d\r\n", flight_pin); - pc.printf("Valve: %d, %d, %d, %d\r\n", valve1, valve2, valve3, valve4); - pc.printf("Buzzer : %d\r\n", buzzer); + pc.printf("Valve: %d, %d, %d, %d\r\n", Valve1.status, Valve2.status, Valve3.status, Valve4.status); + pc.printf("Buzzer : %d\r\n", Buzzer.status); pc.printf("GPS : %3.7f, %3.7f, %.2f\r\n", gps_lat, gps_lon, gps_alt); pc.printf("Move : %.2f[knot], %.2f[deg]\r\n", gps_knot, gps_deg); @@ -558,13 +558,13 @@ if(save_fast) status |= (char)0x02; if(controll_yn) status |= (char)0x04; if(flight_pin) status |= (char)0x08; - if(Buzzer) status |= (char)0x10; + if(Buzzer.status) status |= (char)0x10; es920 << status; - if(valve1) status |= (char)0x01; - if(valve2) status |= (char)0x02; - if(valve3) status |= (char)0x04; - if(valve4) status |= (char)0x08; + if(Valve1.status) status |= (char)0x01; + if(Valve2.status) status |= (char)0x02; + if(Valve3.status) status |= (char)0x04; + if(Valve4.status) status |= (char)0x08; es920 << status; es920 << (float)gps_lat; @@ -597,11 +597,69 @@ /******************************************************************************* -アップリンク受信 -無線あり:HEADER_COMMAND +アップリンク解析 +無線あり:HEADER_COMMAND(受信) *******************************************************************************/ void readUpLink(){ + es920_uplink_command = es920.data[0]; + pc.printf("GND Command = %c\r\n", es920_uplink_command); + switch(es920_uplink_command){ + case 'W': //投下待機モードへ移行 + if(CanSat_phase == CANSAT_SAFETY){ + CanSat_phase = CANSAT_WAIT; + do_first = false; + } + break; + + case 'S': //安全モードへ移行 + if(CanSat_phase == CANSAT_WAIT || CanSat_phase == CANSAT_FLIGHT){ + CanSat_phase = CANSAT_SAFETY; + do_first = false; + } + break; + + case 'F': //フライトモードへ移行 + if(CanSat_phase == CANSAT_WAIT){ + CanSat_phase = CANSAT_FLIGHT; + do_first = false; + } + break; + + case 'C': //記録停止 + if((CanSat_phase == CANSAT_RECOVERY || CanSat_phase == CANSAT_SAFETY) && (save_slow || save_fast)){ + stopRec(); + } + break; + + case 'o': //低速記録開始 + if(CanSat_phase == CANSAT_RECOVERY || CanSat_phase == CANSAT_SAFETY && (!save_slow && !save_fast)){ + startRecSlow(); + } + break; + + case 'O': //高速記録開始 + if(CanSat_phase == CANSAT_RECOVERY || CanSat_phase == CANSAT_SAFETY && (!save_slow && !save_fast)){ + startRecFast(); + } + break; + + case 'B': //ブザー切り替え + buzzerChange(); + break; + + case '1': //姿勢制御再開 + if(CanSat_phase == CANSAT_FLIGHT && !controll_yn){ + controll_yn = true; + } + break; + + case '0': //姿勢制御停止 + if(CanSat_phase == CANSAT_FLIGHT && controll_yn){ + controll_yn = false; + } + break; + } } @@ -609,7 +667,21 @@ データを1秒ごとに書き込み開始 *******************************************************************************/ void startRecSlow(){ - + if(!save_slow && !save_fast){ + fp = fopen(file_name, "a"); + fprintf(fp, "Time,Flight Time,Phase,Controll,Flight Pin,"); + fprintf(fp, "Valve1,Valve2,Valve3,Valve4,Buzzer,"); + fprintf(fp, "GPS Y/N,GPS Time,Latitude,Longitude,GPS Alt,Knot,Deg,Sattelite,"); + fprintf(fp, "ADXL_x[G],ADXL_y[G],ADXL_z[G],Battery_V[V],Battery_I[A],"); + fprintf(fp, "Pres[hPa],Temp[degC],Hum[%%],Alt[m],Alt_ave[m],Speed[m/s],Speed_ave[m/s],"); + fprintf(fp, "Acc_x[m/s^2],Acc_y[m/s^2],Acc_z[m/s^2],Mag_x[uT],Mag_y[uT],Mag_z[uT],Gyro_x[deg/s],Gyro_y[deg/s],Gyro_z[deg/s],"); + fprintf(fp, "Q_w,Q_x,Q_y,Q_z,Yaw[deg],Roll[deg],Pitch[deg],"); + fprintf(fp, "CO2[ppm],TVOCs[ppm],"); + fprintf(fp, "Bottle Pres[MPa]\r\n"); + tick_save.detach(); + tick_save.attach(&recData, 1.0f); + save_slow = true; + } } @@ -617,7 +689,20 @@ データを最速で書き込み開始 *******************************************************************************/ void startRecFast(){ - + if(!save_slow && !save_fast){ + fp = fopen(file_name, "a"); + fprintf(fp, "Time,Flight Time,Phase,Controll,Flight Pin,"); + fprintf(fp, "Valve1,Valve2,Valve3,Valve4,Buzzer,"); + fprintf(fp, "GPS Y/N,GPS Time,Latitude,Longitude,GPS Alt,Knot,Deg,Sattelite,"); + fprintf(fp, "ADXL_x[G],ADXL_y[G],ADXL_z[G],Battery_V[V],Battery_I[A],"); + fprintf(fp, "Pres[hPa],Temp[degC],Hum[%%],Alt[m],Alt_ave[m],Speed[m/s],Speed_ave[m/s],"); + fprintf(fp, "Acc_x[m/s^2],Acc_y[m/s^2],Acc_z[m/s^2],Mag_x[uT],Mag_y[uT],Mag_z[uT],Gyro_x[deg/s],Gyro_y[deg/s],Gyro_z[deg/s],"); + fprintf(fp, "Q_w,Q_x,Q_y,Q_z,Yaw[deg],Roll[deg],Pitch[deg],"); + fprintf(fp, "CO2[ppm],TVOCs[ppm],"); + fprintf(fp, "Bottle Pres[MPa]\r\n"); + tick_save.detach(); + save_fast = true; + } } @@ -625,15 +710,71 @@ データ記録停止 *******************************************************************************/ void stopRec(){ - + if(save_slow){ + save_slow = false; + tick_save.detach(); + fprintf(fp, "\r\n\n"); + fclose(fp); + } + else if(save_fast){ + save_fast = false; + fprintf(fp, "\r\n\n"); + fclose(fp); + } } /******************************************************************************* -データの記録 +データの書き込み *******************************************************************************/ void recData(){ + fprintf(fp, "%d:%02d.%03d,", time_min, time_sec, time_ms); + fprintf(fp, "%d:%02d.%03d,", flight_time_min, flight_time_sec, flight_time_ms); + switch(CanSat_phase){ + case CANSAT_SETUP: + fprintf(fp, "SETUP,"); + break; + + case CANSAT_SAFETY: + fprintf(fp, "SAFETY,"); + break; + + case CANSAT_WAIT: + fprintf(fp, "WAIT,"); + break; + + case CANSAT_FLIGHT: + fprintf(fp, "FLIGHT,"); + break; + + case CANSAT_RECOVERY: + fprintf(fp, "RECOVERY,"); + break; + } + + fprintf(fp, "%d,", controll_yn); + fprintf(fp, "%d,", flight_pin); + fprintf(fp, "%d,%d,%d,%d,%d,", Valve1.status, Valve2.status, Valve3.status, Valve4.status, Buzzer.status); + fprintf(fp, "%c,", es920_uplink_command); + es920_uplink_command = '-'; + + fprintf(fp, "%d,", gps_yn); + fprintf(fp, "%d/%d/%d ", (int)gps_utc[0], (int)gps_utc[1], (int)gps_utc[2]); //日付 + fprintf(fp, "%d:%02d:%02.2f,", (int)gps_utc[3], (int)gps_utc[4], gps_utc[5]); //時間 + fprintf(fp, "%3.7f,%3.7f,%.2f,", gps_lat, gps_lon, gps_alt); //GPS座標 + fprintf(fp, "%.2f,%.2f,", gps_knot, gps_deg); //GPS速度 + fprintf(fp, "%d,", gps_sat); //GPS衛星数 + + fprintf(fp, "%.2f,%.2f,%.2f,%f,%f,", adxl_acc[0], adxl_acc[1], adxl_acc[2], ina_v, ina_i); + fprintf(fp, "%f,%f,%f,%f,%f,%f,%f,", pres, temp, hum, alt, alt_ave, speed, speed_ave); + fprintf(fp, "%f,%f,%f,%f,%f,%f,%f,%f,%f,", amg[0], amg[1], amg[2], amg[3], amg[4], amg[5], amg[6], amg[7], amg[8]); + fprintf(fp, "%f,%f,%f,%f,", quart[0], quart[1], quart[2], quart[3]); + fprintf(fp, "%.2f,%.2f,%.2f,", euler[0], euler[1], euler[2]); + fprintf(fp, "%d,%d,", CO2, TVOCs); + fprintf(fp, "%f\r\n", bottle_pres); + + //EEPROM } @@ -641,7 +782,12 @@ ブザーのオンオフ切り替え *******************************************************************************/ void buzzerChange(){ - + if(Buzzer.status){ + Buzzer.fire_off(); + } + else{ + Buzzer.fire_off(); + } } @@ -799,6 +945,8 @@ fclose(fp); setup_string[0] = NULL; + EEPROM.setWriteAddr(1, 0, 0x00, 0x00); + printHelp(); wait(1.0f); }