高高度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

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);
 }