IZU2019 Hybrid main program

Dependencies:   Nichrome_lib mbed mpu9250_i2c MadgwickFilter SHT35_lib ADXL375_i2c ES920LR SDFileSystem pqLPS22HB_lib INA226_lib GPS_interrupt TSL_2561_lib

Committer:
Okamoto009
Date:
Tue Feb 26 12:11:36 2019 +0000
Revision:
0:ca455457108f
IZU2019 main program;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Okamoto009 0:ca455457108f 1 #include "mbed.h"
Okamoto009 0:ca455457108f 2 #include "math.h"
Okamoto009 0:ca455457108f 3
Okamoto009 0:ca455457108f 4 #include "ES920LR.hpp"
Okamoto009 0:ca455457108f 5 #include "Nichrome_lib.h"
Okamoto009 0:ca455457108f 6 #include "SDFileSystem.h"
Okamoto009 0:ca455457108f 7
Okamoto009 0:ca455457108f 8 #include "ADXL375_i2c.h"
Okamoto009 0:ca455457108f 9 #include "INA226.h"
Okamoto009 0:ca455457108f 10 #include "MadgwickFilter.hpp"
Okamoto009 0:ca455457108f 11 #include "mpu9250_i2c.h"
Okamoto009 0:ca455457108f 12 #include "pqLPS22HB_lib.h"
Okamoto009 0:ca455457108f 13 #include "SHT35.h"
Okamoto009 0:ca455457108f 14 #include "TSL2561.h"
Okamoto009 0:ca455457108f 15 #include "GPS_interrupt.h"
Okamoto009 0:ca455457108f 16
Okamoto009 0:ca455457108f 17
Okamoto009 0:ca455457108f 18 /*******************************************************************************
Okamoto009 0:ca455457108f 19 設定値
Okamoto009 0:ca455457108f 20 打ち上げ前に必ず確認!!
Okamoto009 0:ca455457108f 21 *******************************************************************************/
Okamoto009 0:ca455457108f 22 const float TIME_SEP1 = 16.0f; //1段目分離までの時間
Okamoto009 0:ca455457108f 23 const float TIME_SEP2 = 75.0f; //2段目分離までの時間
Okamoto009 0:ca455457108f 24
Okamoto009 0:ca455457108f 25 const float TIME_RECOVERY = 120.0f; //回収モード移行までの時間
Okamoto009 0:ca455457108f 26
Okamoto009 0:ca455457108f 27 const float SEP1_ALT_UNDER = 500.0f;//1段目分離条件(高度)
Okamoto009 0:ca455457108f 28 const float SEP1_SPEED = 5.0f; //1段目分離条件(速度)
Okamoto009 0:ca455457108f 29
Okamoto009 0:ca455457108f 30 const float SEP2_ALT_UP = 300.0f; //2段目分離条件(高度)
Okamoto009 0:ca455457108f 31
Okamoto009 0:ca455457108f 32 const float OK_UP_ALT = 500.0f;
Okamoto009 0:ca455457108f 33 const float OK_DOWN_ALT = 30.0f;
Okamoto009 0:ca455457108f 34 const float STOP_SPEED_UP = 2.0f;
Okamoto009 0:ca455457108f 35 const float STOP_SPEED_UNDER = -2.0f;
Okamoto009 0:ca455457108f 36
Okamoto009 0:ca455457108f 37 bool wait_GPS = true; //GPS受信待ちするか
Okamoto009 0:ca455457108f 38 bool ok_PC = false; //PCを使用するか
Okamoto009 0:ca455457108f 39
Okamoto009 0:ca455457108f 40
Okamoto009 0:ca455457108f 41 /*******************************************************************************
Okamoto009 0:ca455457108f 42 コンストラクタ
Okamoto009 0:ca455457108f 43 *******************************************************************************/
Okamoto009 0:ca455457108f 44 RawSerial pc(USBTX, USBRX, 115200);
Okamoto009 0:ca455457108f 45
Okamoto009 0:ca455457108f 46 RawSerial serial_es920(p9, p10);
Okamoto009 0:ca455457108f 47 ES920LR es920(serial_es920, pc, 115200);
Okamoto009 0:ca455457108f 48
Okamoto009 0:ca455457108f 49 Serial GPS_serial(p13, p14, 38400);
Okamoto009 0:ca455457108f 50 GPS_interrupt GPS(&GPS_serial);
Okamoto009 0:ca455457108f 51 float GPS_freq = 4;
Okamoto009 0:ca455457108f 52
Okamoto009 0:ca455457108f 53 SDFileSystem sd(p5, p6, p7, p8, "sd");
Okamoto009 0:ca455457108f 54 const char file_name[64] = "/sd/Felix_Luminous_LOG.csv";
Okamoto009 0:ca455457108f 55
Okamoto009 0:ca455457108f 56 I2C i2c_bus(p28, p27);
Okamoto009 0:ca455457108f 57 ADXL375_i2c ADXL375(i2c_bus, ADXL375_i2c::ALT_ADDRESS_HIGH);
Okamoto009 0:ca455457108f 58 myINA226 INA226_in(i2c_bus, myINA226::A1_GND, myINA226::A0_GND);
Okamoto009 0:ca455457108f 59 myINA226 INA226_ex(i2c_bus, myINA226::A1_VDD, myINA226::A0_GND);
Okamoto009 0:ca455457108f 60 mpu9250 nine(i2c_bus, AD0_HIGH);
Okamoto009 0:ca455457108f 61 pqLPS22HB_lib LPS22HB(pqLPS22HB_lib::AD0_HIGH, i2c_bus);
Okamoto009 0:ca455457108f 62 pqLPS22HB_lib LPS33HW(pqLPS22HB_lib::AD0_LOW, i2c_bus);
Okamoto009 0:ca455457108f 63 mySHT35 SHT35(i2c_bus, mySHT35::AD0_LOW);
Okamoto009 0:ca455457108f 64 myTSL2561 TSL2561(i2c_bus, myTSL2561::AD0_OPEN);
Okamoto009 0:ca455457108f 65
Okamoto009 0:ca455457108f 66 //InterruptIn FlightPin(p26);
Okamoto009 0:ca455457108f 67 DigitalIn FlightPin(p26);
Okamoto009 0:ca455457108f 68
Okamoto009 0:ca455457108f 69 Nichrome_lib Separate1(p24);
Okamoto009 0:ca455457108f 70 Nichrome_lib Separate2(p25);
Okamoto009 0:ca455457108f 71
Okamoto009 0:ca455457108f 72 DigitalOut Buzzer(p22);
Okamoto009 0:ca455457108f 73 //PwmOut Buzzer_music(p21);
Okamoto009 0:ca455457108f 74
Okamoto009 0:ca455457108f 75 //AnalogIn Pitot(p20);
Okamoto009 0:ca455457108f 76
Okamoto009 0:ca455457108f 77 Timeout timeout_stop;
Okamoto009 0:ca455457108f 78 Timeout timeout_sep;
Okamoto009 0:ca455457108f 79 Timeout timeout_recovery;
Okamoto009 0:ca455457108f 80
Okamoto009 0:ca455457108f 81 Timer time_main;
Okamoto009 0:ca455457108f 82 Timer time_flight;
Okamoto009 0:ca455457108f 83
Okamoto009 0:ca455457108f 84 Ticker tick_gps;
Okamoto009 0:ca455457108f 85 Ticker tick_print;
Okamoto009 0:ca455457108f 86 Ticker tick_header_data;
Okamoto009 0:ca455457108f 87
Okamoto009 0:ca455457108f 88
Okamoto009 0:ca455457108f 89 /*******************************************************************************
Okamoto009 0:ca455457108f 90 関数のプロトタイプ宣言
Okamoto009 0:ca455457108f 91 *******************************************************************************/
Okamoto009 0:ca455457108f 92 void setup(); //無線あり
Okamoto009 0:ca455457108f 93
Okamoto009 0:ca455457108f 94 void readSensor();
Okamoto009 0:ca455457108f 95 void readGPS();
Okamoto009 0:ca455457108f 96
Okamoto009 0:ca455457108f 97 void printData();
Okamoto009 0:ca455457108f 98 void readPC();
Okamoto009 0:ca455457108f 99 void printHelp();
Okamoto009 0:ca455457108f 100
Okamoto009 0:ca455457108f 101 void sendDownLink();//無線あり
Okamoto009 0:ca455457108f 102 void readUpLink(); //無線あり
Okamoto009 0:ca455457108f 103
Okamoto009 0:ca455457108f 104 void startRec();
Okamoto009 0:ca455457108f 105 void stopRec();
Okamoto009 0:ca455457108f 106 void recData();
Okamoto009 0:ca455457108f 107
Okamoto009 0:ca455457108f 108 void modeChange(); //無線あり
Okamoto009 0:ca455457108f 109 void changePhase_SEP1();
Okamoto009 0:ca455457108f 110 void changePhase_SEP2();
Okamoto009 0:ca455457108f 111 void changePhase_RECOVERY();
Okamoto009 0:ca455457108f 112 void buzzerChange();
Okamoto009 0:ca455457108f 113
Okamoto009 0:ca455457108f 114 void separate1();
Okamoto009 0:ca455457108f 115 void separate2();
Okamoto009 0:ca455457108f 116
Okamoto009 0:ca455457108f 117
Okamoto009 0:ca455457108f 118 /*******************************************************************************
Okamoto009 0:ca455457108f 119 変数の宣言
Okamoto009 0:ca455457108f 120 *******************************************************************************/
Okamoto009 0:ca455457108f 121 char rocket_phase;
Okamoto009 0:ca455457108f 122 bool do_first = false;
Okamoto009 0:ca455457108f 123
Okamoto009 0:ca455457108f 124 bool es920_using = false;
Okamoto009 0:ca455457108f 125 char es920_uplink_command = '-';
Okamoto009 0:ca455457108f 126
Okamoto009 0:ca455457108f 127 float adxl_acc[3];
Okamoto009 0:ca455457108f 128
Okamoto009 0:ca455457108f 129 float ina_in_v, ina_in_i, ina_ex_v, ina_ex_i;
Okamoto009 0:ca455457108f 130 bool ex_power;
Okamoto009 0:ca455457108f 131
Okamoto009 0:ca455457108f 132 MadgwickFilter attitude(1.0);
Okamoto009 0:ca455457108f 133 float euler[3];
Okamoto009 0:ca455457108f 134 Quaternion quart(1.0, 0.0, 0.0, 0.0);
Okamoto009 0:ca455457108f 135
Okamoto009 0:ca455457108f 136 float gyro[3], gyro_rad[3], acc[3], mag[3];
Okamoto009 0:ca455457108f 137
Okamoto009 0:ca455457108f 138 float pres22, temp22, alt22, pres22_0, temp22_0;
Okamoto009 0:ca455457108f 139
Okamoto009 0:ca455457108f 140 float pres33, temp33, alt33, pres33_0, temp33_0;
Okamoto009 0:ca455457108f 141 float alt33_buf[10], alt33_ave, alt33_ave_old, speed33, speed33_buf[10], speed33_ave;
Okamoto009 0:ca455457108f 142 int alt33_count = 0, speed33_count = 0;
Okamoto009 0:ca455457108f 143
Okamoto009 0:ca455457108f 144 bool ok_up = false;
Okamoto009 0:ca455457108f 145 bool ok_down = false;
Okamoto009 0:ca455457108f 146 bool ok_top = false;
Okamoto009 0:ca455457108f 147
Okamoto009 0:ca455457108f 148 float temp35, hum35;
Okamoto009 0:ca455457108f 149
Okamoto009 0:ca455457108f 150 int lux;
Okamoto009 0:ca455457108f 151
Okamoto009 0:ca455457108f 152 float pitot_raw, pitot_err, pitot;
Okamoto009 0:ca455457108f 153 float pitot_buf[100];
Okamoto009 0:ca455457108f 154 int pitot_count = 0;
Okamoto009 0:ca455457108f 155 float pitot_speed;
Okamoto009 0:ca455457108f 156
Okamoto009 0:ca455457108f 157 float gps_lat, gps_lon, gps_alt, gps_utc[6], gps_knot, gps_deg;
Okamoto009 0:ca455457108f 158 int gps_sat;
Okamoto009 0:ca455457108f 159 bool gps_yn;
Okamoto009 0:ca455457108f 160
Okamoto009 0:ca455457108f 161 bool flight_pin;
Okamoto009 0:ca455457108f 162
Okamoto009 0:ca455457108f 163 FILE *fp;
Okamoto009 0:ca455457108f 164 bool save = false;
Okamoto009 0:ca455457108f 165 int save_c = 0;
Okamoto009 0:ca455457108f 166
Okamoto009 0:ca455457108f 167 int time_read, time_reset = 0;
Okamoto009 0:ca455457108f 168 int time_min, time_sec, time_ms;
Okamoto009 0:ca455457108f 169
Okamoto009 0:ca455457108f 170 int flight_time_read, flight_time_read_old, flight_time_reset = 0;
Okamoto009 0:ca455457108f 171 int flight_time_min, flight_time_sec, flight_time_ms;
Okamoto009 0:ca455457108f 172
Okamoto009 0:ca455457108f 173
Okamoto009 0:ca455457108f 174 /*******************************************************************************
Okamoto009 0:ca455457108f 175 定数
Okamoto009 0:ca455457108f 176 *******************************************************************************/
Okamoto009 0:ca455457108f 177 const float ES920_MAX_20 = 0.000305176;
Okamoto009 0:ca455457108f 178 const float ES920_MAX_100 = 0.001525879;
Okamoto009 0:ca455457108f 179 const float ES920_MAX_200 = 0.003051758;
Okamoto009 0:ca455457108f 180 const float ES920_MAX_500 = 0.007629395;
Okamoto009 0:ca455457108f 181 const float ES920_MAX_1500 = 0.022888184;
Okamoto009 0:ca455457108f 182 const float ES920_MAX_3000 = 0.045776367;
Okamoto009 0:ca455457108f 183
Okamoto009 0:ca455457108f 184
Okamoto009 0:ca455457108f 185 /*******************************************************************************
Okamoto009 0:ca455457108f 186 無線のヘッダまとめ(ROCKET -> GND)
Okamoto009 0:ca455457108f 187 *******************************************************************************/
Okamoto009 0:ca455457108f 188 const char HEADER_SENSOR_SETUP = 0x01;
Okamoto009 0:ca455457108f 189 // 0x01, ADXL, INA_in, INA_ex, MPU, MPU_m, 22HB, 33HW, SHT, TSL, SD
Okamoto009 0:ca455457108f 190 // 0 1 1 1 1 1 1 1 1 1 1
Okamoto009 0:ca455457108f 191 // 0 1 2 3 4 5 6 7 8 9
Okamoto009 0:ca455457108f 192
Okamoto009 0:ca455457108f 193 const char HEADER_GPS_SETUP = 0x02;
Okamoto009 0:ca455457108f 194 // 0x02, readable, wait_count
Okamoto009 0:ca455457108f 195 // 0 1 4
Okamoto009 0:ca455457108f 196 // 0 1
Okamoto009 0:ca455457108f 197 // 0x00 : NG
Okamoto009 0:ca455457108f 198 // 0x01 : OK
Okamoto009 0:ca455457108f 199 // 0xAA : Finish
Okamoto009 0:ca455457108f 200 // 0xFF : Ignore
Okamoto009 0:ca455457108f 201
Okamoto009 0:ca455457108f 202 const char HEADER_DATA = 0x10;
Okamoto009 0:ca455457108f 203 //起動時間, フライト時間, フェーズ, ex_pow&Sep1&Sep2&ok_up&ok_down&ok_top&gps_yn, lat, lon, alt, knot, deg, sat, in_v, in_i, ex_v, ex_i, pres33, alt33, speed33, temp35, hum35, pitot_speed
Okamoto009 0:ca455457108f 204 //4(2,2) 4(2,2) 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Okamoto009 0:ca455457108f 205 //0 2 4 6 8 10 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41
Okamoto009 0:ca455457108f 206 // 0x01 : ex_pow
Okamoto009 0:ca455457108f 207 // 0x02 : Sep1
Okamoto009 0:ca455457108f 208 // 0x04 : Sep2
Okamoto009 0:ca455457108f 209 // 0x08 : ok_up
Okamoto009 0:ca455457108f 210 // 0x10 : ok_down
Okamoto009 0:ca455457108f 211 // 0x20 : ok_top
Okamoto009 0:ca455457108f 212 // 0x40 : save
Okamoto009 0:ca455457108f 213 // 0x80 : flight_pin
Okamoto009 0:ca455457108f 214
Okamoto009 0:ca455457108f 215 const char HEADER_START = 0x11;
Okamoto009 0:ca455457108f 216 // 0x11, What
Okamoto009 0:ca455457108f 217 // 0 1
Okamoto009 0:ca455457108f 218 // 0
Okamoto009 0:ca455457108f 219 // 'W' : 安全モード->離床検知モード
Okamoto009 0:ca455457108f 220 // 'S' : 離床検知モード->安全モード
Okamoto009 0:ca455457108f 221 // 'F' : 離床検知モード->フライトモード
Okamoto009 0:ca455457108f 222 // '1' : 1段目分離
Okamoto009 0:ca455457108f 223 // '2' : 2段目分離
Okamoto009 0:ca455457108f 224
Okamoto009 0:ca455457108f 225
Okamoto009 0:ca455457108f 226 /*******************************************************************************
Okamoto009 0:ca455457108f 227 無線のヘッダまとめ(GND -> ROCKET)
Okamoto009 0:ca455457108f 228 *******************************************************************************/
Okamoto009 0:ca455457108f 229 const char HEADER_COMMAND = 0xcd;
Okamoto009 0:ca455457108f 230 // 0xcd,コマンド
Okamoto009 0:ca455457108f 231 // 0 1
Okamoto009 0:ca455457108f 232 // 0 1
Okamoto009 0:ca455457108f 233
Okamoto009 0:ca455457108f 234
Okamoto009 0:ca455457108f 235 /*******************************************************************************
Okamoto009 0:ca455457108f 236 ロケットのフェーズ
Okamoto009 0:ca455457108f 237 *******************************************************************************/
Okamoto009 0:ca455457108f 238 const char ROCKET_SETUP = 0x00; //セットアップ中
Okamoto009 0:ca455457108f 239 const char ROCKET_SAFETY = 0x01; //安全モード
Okamoto009 0:ca455457108f 240 const char ROCKET_WAIT = 0x02; //待機モード
Okamoto009 0:ca455457108f 241 const char ROCKET_FLIGHT = 0x03; //フライトモード
Okamoto009 0:ca455457108f 242 const char ROCKET_SEP1 = 0x04; //分離1モード
Okamoto009 0:ca455457108f 243 const char ROCKET_SEP2 = 0x05; //分離2モード
Okamoto009 0:ca455457108f 244 const char ROCKET_RECOVERY = 0x06; //回収モード
Okamoto009 0:ca455457108f 245
Okamoto009 0:ca455457108f 246
Okamoto009 0:ca455457108f 247 /*******************************************************************************
Okamoto009 0:ca455457108f 248 メイン関数
Okamoto009 0:ca455457108f 249 *******************************************************************************/
Okamoto009 0:ca455457108f 250 int main() {
Okamoto009 0:ca455457108f 251 rocket_phase = ROCKET_SETUP;
Okamoto009 0:ca455457108f 252 setup();
Okamoto009 0:ca455457108f 253
Okamoto009 0:ca455457108f 254 pc.attach(&readPC, Serial::RxIrq);
Okamoto009 0:ca455457108f 255
Okamoto009 0:ca455457108f 256 tick_gps.attach(&readGPS, 1/GPS_freq);
Okamoto009 0:ca455457108f 257 tick_print.attach(&printData, 1.0f);
Okamoto009 0:ca455457108f 258 tick_header_data.attach(&sendDownLink, 1.0f);
Okamoto009 0:ca455457108f 259
Okamoto009 0:ca455457108f 260 es920.attach(&readUpLink, HEADER_COMMAND);
Okamoto009 0:ca455457108f 261
Okamoto009 0:ca455457108f 262 FlightPin.mode(PullUp);
Okamoto009 0:ca455457108f 263
Okamoto009 0:ca455457108f 264 time_main.reset();
Okamoto009 0:ca455457108f 265 time_main.start();
Okamoto009 0:ca455457108f 266 startRec();
Okamoto009 0:ca455457108f 267
Okamoto009 0:ca455457108f 268 rocket_phase = ROCKET_SAFETY;
Okamoto009 0:ca455457108f 269 while(1) {
Okamoto009 0:ca455457108f 270 readSensor();
Okamoto009 0:ca455457108f 271 recData();
Okamoto009 0:ca455457108f 272 modeChange(); //状態遷移の判断
Okamoto009 0:ca455457108f 273 }
Okamoto009 0:ca455457108f 274 }
Okamoto009 0:ca455457108f 275
Okamoto009 0:ca455457108f 276
Okamoto009 0:ca455457108f 277 /*******************************************************************************
Okamoto009 0:ca455457108f 278 センサ読み取り
Okamoto009 0:ca455457108f 279 *******************************************************************************/
Okamoto009 0:ca455457108f 280 void readSensor(){
Okamoto009 0:ca455457108f 281 time_read = time_main.read_ms();
Okamoto009 0:ca455457108f 282 if(time_read >= 30*60*1000){
Okamoto009 0:ca455457108f 283 time_main.reset();
Okamoto009 0:ca455457108f 284 time_reset ++;
Okamoto009 0:ca455457108f 285 }
Okamoto009 0:ca455457108f 286 time_min = time_reset * 30 + floor((double)time_read / (60 * 1000));
Okamoto009 0:ca455457108f 287 time_sec = time_read % (60 * 1000);
Okamoto009 0:ca455457108f 288 time_sec = floor((double)time_sec / 1000);
Okamoto009 0:ca455457108f 289 time_ms = time_read % 1000;
Okamoto009 0:ca455457108f 290
Okamoto009 0:ca455457108f 291 if(rocket_phase >= ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 292 flight_time_read_old = flight_time_read;
Okamoto009 0:ca455457108f 293 flight_time_read = time_flight.read_ms();
Okamoto009 0:ca455457108f 294 }
Okamoto009 0:ca455457108f 295 else{
Okamoto009 0:ca455457108f 296 flight_time_read = 0;
Okamoto009 0:ca455457108f 297 }
Okamoto009 0:ca455457108f 298 if(flight_time_read >= 30*60*1000){
Okamoto009 0:ca455457108f 299 time_flight.reset();
Okamoto009 0:ca455457108f 300 flight_time_reset ++;
Okamoto009 0:ca455457108f 301 }
Okamoto009 0:ca455457108f 302 flight_time_min = flight_time_reset * 30 + floor((double)flight_time_read / (60 * 1000));
Okamoto009 0:ca455457108f 303 flight_time_sec = flight_time_read % (60 * 1000);
Okamoto009 0:ca455457108f 304 flight_time_sec = floor((double)flight_time_sec / 1000);
Okamoto009 0:ca455457108f 305 flight_time_ms = flight_time_read % 1000;
Okamoto009 0:ca455457108f 306
Okamoto009 0:ca455457108f 307 ADXL375.getOutput(adxl_acc);
Okamoto009 0:ca455457108f 308
Okamoto009 0:ca455457108f 309 INA226_in.get_Voltage_current(&ina_in_v, &ina_in_i);
Okamoto009 0:ca455457108f 310 ina_in_v = ina_in_v / 1000;
Okamoto009 0:ca455457108f 311 ina_in_i = ina_in_i / 1000;
Okamoto009 0:ca455457108f 312 if(ina_in_i > 64){
Okamoto009 0:ca455457108f 313 ina_in_i = 0.0f;
Okamoto009 0:ca455457108f 314 }
Okamoto009 0:ca455457108f 315 INA226_ex.get_Voltage_current(&ina_ex_v, &ina_ex_i);
Okamoto009 0:ca455457108f 316 ina_ex_v = ina_ex_v / 1000;
Okamoto009 0:ca455457108f 317 ina_ex_i = ina_ex_i / 1000;
Okamoto009 0:ca455457108f 318 if(ina_ex_i > 64){
Okamoto009 0:ca455457108f 319 ina_ex_i = 0.0f;
Okamoto009 0:ca455457108f 320 }
Okamoto009 0:ca455457108f 321 if(ina_ex_i > 0.1f){
Okamoto009 0:ca455457108f 322 ex_power = true;
Okamoto009 0:ca455457108f 323 }
Okamoto009 0:ca455457108f 324 else{
Okamoto009 0:ca455457108f 325 ex_power = false;
Okamoto009 0:ca455457108f 326 }
Okamoto009 0:ca455457108f 327
Okamoto009 0:ca455457108f 328 nine.getGyro(gyro);
Okamoto009 0:ca455457108f 329 nine.getAcc(acc);
Okamoto009 0:ca455457108f 330 nine.getMag(mag);
Okamoto009 0:ca455457108f 331 for(int i = 0; i < 3; i ++){
Okamoto009 0:ca455457108f 332 gyro_rad[i] = gyro[i] * 3.1415926535 / 180;
Okamoto009 0:ca455457108f 333 }
Okamoto009 0:ca455457108f 334 attitude.MadgwickAHRSupdate(gyro_rad, acc, mag);
Okamoto009 0:ca455457108f 335 attitude.getAttitude(&quart);
Okamoto009 0:ca455457108f 336 attitude.getEulerAngle(euler);
Okamoto009 0:ca455457108f 337 for(int i = 0; i < 3; i ++){
Okamoto009 0:ca455457108f 338 euler[i] = euler[i] * 180 / 3.145926535;
Okamoto009 0:ca455457108f 339 }
Okamoto009 0:ca455457108f 340
Okamoto009 0:ca455457108f 341 pres22 = LPS22HB.getPres();
Okamoto009 0:ca455457108f 342 temp22 = LPS22HB.getTemp();
Okamoto009 0:ca455457108f 343 alt22 = LPS22HB.getAlt(pres22_0, temp22_0);
Okamoto009 0:ca455457108f 344
Okamoto009 0:ca455457108f 345 pres33 = LPS33HW.getPres();
Okamoto009 0:ca455457108f 346 temp33 = LPS33HW.getTemp();
Okamoto009 0:ca455457108f 347 alt33 = LPS33HW.getAlt(pres33_0, temp33_0);
Okamoto009 0:ca455457108f 348
Okamoto009 0:ca455457108f 349 alt33_buf[alt33_count] = alt33;
Okamoto009 0:ca455457108f 350 alt33_count ++;
Okamoto009 0:ca455457108f 351 if(alt33_count > 10){
Okamoto009 0:ca455457108f 352 alt33_count = 0;
Okamoto009 0:ca455457108f 353 }
Okamoto009 0:ca455457108f 354 float alt33_sum = 0;
Okamoto009 0:ca455457108f 355 for(int i = 0; i < 10; i ++){
Okamoto009 0:ca455457108f 356 alt33_sum += alt33_buf[i];
Okamoto009 0:ca455457108f 357 }
Okamoto009 0:ca455457108f 358 alt33_ave_old = alt33_ave;
Okamoto009 0:ca455457108f 359 alt33_ave = alt33_sum / 10;
Okamoto009 0:ca455457108f 360
Okamoto009 0:ca455457108f 361 if(alt33_ave - alt33_ave_old > 0.01 || alt33_ave - alt33_ave_old < -0.01){
Okamoto009 0:ca455457108f 362 speed33 = (alt33_ave - alt33_ave_old) / (((float)flight_time_read - (float)flight_time_read_old) / 1000);
Okamoto009 0:ca455457108f 363 }
Okamoto009 0:ca455457108f 364 if(rocket_phase <= ROCKET_WAIT){
Okamoto009 0:ca455457108f 365 speed33 = 0.0f;
Okamoto009 0:ca455457108f 366 }
Okamoto009 0:ca455457108f 367
Okamoto009 0:ca455457108f 368 speed33_buf[speed33_count] = speed33;
Okamoto009 0:ca455457108f 369 speed33_count ++;
Okamoto009 0:ca455457108f 370 if(speed33_count > 10){
Okamoto009 0:ca455457108f 371 speed33_count = 0;
Okamoto009 0:ca455457108f 372 }
Okamoto009 0:ca455457108f 373 float speed33_sum = 0;
Okamoto009 0:ca455457108f 374 for(int i = 0; i < 10; i ++){
Okamoto009 0:ca455457108f 375 speed33_sum += speed33_buf[i];
Okamoto009 0:ca455457108f 376 }
Okamoto009 0:ca455457108f 377 speed33_ave = speed33_sum / 10;
Okamoto009 0:ca455457108f 378
Okamoto009 0:ca455457108f 379
Okamoto009 0:ca455457108f 380 if(rocket_phase <= ROCKET_WAIT){
Okamoto009 0:ca455457108f 381 pres22_0 = pres22;
Okamoto009 0:ca455457108f 382 temp22_0 = temp22;
Okamoto009 0:ca455457108f 383 pres33_0 = pres33;
Okamoto009 0:ca455457108f 384 temp33_0 = temp33;
Okamoto009 0:ca455457108f 385 }
Okamoto009 0:ca455457108f 386
Okamoto009 0:ca455457108f 387 SHT35.getTempHum(&temp35, &hum35);
Okamoto009 0:ca455457108f 388
Okamoto009 0:ca455457108f 389 lux = TSL2561.getLuminous();
Okamoto009 0:ca455457108f 390
Okamoto009 0:ca455457108f 391 /*pitot_raw = Pitot.read() * 3.3;
Okamoto009 0:ca455457108f 392 pitot = (pitot_raw - pitot_err - 0.2) / (5 * 0.0012858);
Okamoto009 0:ca455457108f 393 if(pitot < 0.0f){
Okamoto009 0:ca455457108f 394 pitot = 0.0f;
Okamoto009 0:ca455457108f 395 }
Okamoto009 0:ca455457108f 396 pitot_speed = sqrt(2 * pitot * 1000 / 1.3);
Okamoto009 0:ca455457108f 397 if(rocket_phase <= ROCKET_WAIT){
Okamoto009 0:ca455457108f 398 pitot_buf[pitot_count] = pitot;
Okamoto009 0:ca455457108f 399 pitot_count ++;
Okamoto009 0:ca455457108f 400 if(pitot_count > 100){
Okamoto009 0:ca455457108f 401 pitot_err = 0;
Okamoto009 0:ca455457108f 402 for(int i = 0; i < 100; i ++){
Okamoto009 0:ca455457108f 403 pitot_err += pitot_buf[pitot_count];
Okamoto009 0:ca455457108f 404 }
Okamoto009 0:ca455457108f 405 pitot_err = pitot_err / 100;
Okamoto009 0:ca455457108f 406 pitot_count = 0;
Okamoto009 0:ca455457108f 407 }
Okamoto009 0:ca455457108f 408 }*/
Okamoto009 0:ca455457108f 409
Okamoto009 0:ca455457108f 410 flight_pin = FlightPin;
Okamoto009 0:ca455457108f 411 }
Okamoto009 0:ca455457108f 412
Okamoto009 0:ca455457108f 413
Okamoto009 0:ca455457108f 414 /*******************************************************************************
Okamoto009 0:ca455457108f 415 GPS読み取り
Okamoto009 0:ca455457108f 416 *******************************************************************************/
Okamoto009 0:ca455457108f 417 void readGPS(){
Okamoto009 0:ca455457108f 418 gps_yn = GPS.gps_readable;
Okamoto009 0:ca455457108f 419 if(gps_yn){
Okamoto009 0:ca455457108f 420 gps_lat = GPS.Latitude();
Okamoto009 0:ca455457108f 421 gps_lon = GPS.Longitude();
Okamoto009 0:ca455457108f 422 gps_alt = GPS.Height();
Okamoto009 0:ca455457108f 423 GPS.getUTC(gps_utc);
Okamoto009 0:ca455457108f 424 gps_utc[3] += 9;
Okamoto009 0:ca455457108f 425 if(gps_utc[3] >= 24){
Okamoto009 0:ca455457108f 426 gps_utc[3] -= 24;
Okamoto009 0:ca455457108f 427 gps_utc[2] += 1;
Okamoto009 0:ca455457108f 428 }
Okamoto009 0:ca455457108f 429 gps_knot = GPS.Knot();
Okamoto009 0:ca455457108f 430 gps_deg = GPS.Degree();
Okamoto009 0:ca455457108f 431 gps_sat = GPS.Number();
Okamoto009 0:ca455457108f 432 }
Okamoto009 0:ca455457108f 433 }
Okamoto009 0:ca455457108f 434
Okamoto009 0:ca455457108f 435
Okamoto009 0:ca455457108f 436 /*******************************************************************************
Okamoto009 0:ca455457108f 437 PCでデータ表示
Okamoto009 0:ca455457108f 438 *******************************************************************************/
Okamoto009 0:ca455457108f 439 void printData(){
Okamoto009 0:ca455457108f 440 if(ok_PC){
Okamoto009 0:ca455457108f 441 pc.printf("Time : %d:%02d\r\n", time_min, time_sec);
Okamoto009 0:ca455457108f 442 pc.printf("FlightTime : %d:%02d\r\n", flight_time_min, flight_time_sec);
Okamoto009 0:ca455457108f 443
Okamoto009 0:ca455457108f 444 pc.printf("Phase : ");
Okamoto009 0:ca455457108f 445 switch(rocket_phase){
Okamoto009 0:ca455457108f 446 case ROCKET_SETUP:
Okamoto009 0:ca455457108f 447 pc.printf("SETUP\r\n");
Okamoto009 0:ca455457108f 448 break;
Okamoto009 0:ca455457108f 449 case ROCKET_SAFETY:
Okamoto009 0:ca455457108f 450 pc.printf("SAFETY\r\n");
Okamoto009 0:ca455457108f 451 break;
Okamoto009 0:ca455457108f 452 case ROCKET_WAIT:
Okamoto009 0:ca455457108f 453 pc.printf("WAIT\r\n");
Okamoto009 0:ca455457108f 454 break;
Okamoto009 0:ca455457108f 455 case ROCKET_FLIGHT:
Okamoto009 0:ca455457108f 456 pc.printf("FLIGHT\r\n");
Okamoto009 0:ca455457108f 457 break;
Okamoto009 0:ca455457108f 458 case ROCKET_SEP1:
Okamoto009 0:ca455457108f 459 pc.printf("SEPARATE 1\r\n");
Okamoto009 0:ca455457108f 460 break;
Okamoto009 0:ca455457108f 461 case ROCKET_SEP2:
Okamoto009 0:ca455457108f 462 pc.printf("SEPARATE 2\r\n");
Okamoto009 0:ca455457108f 463 break;
Okamoto009 0:ca455457108f 464 case ROCKET_RECOVERY:
Okamoto009 0:ca455457108f 465 pc.printf("RECOVERY\r\n");
Okamoto009 0:ca455457108f 466 break;
Okamoto009 0:ca455457108f 467 }
Okamoto009 0:ca455457108f 468
Okamoto009 0:ca455457108f 469 pc.printf("Power : ");
Okamoto009 0:ca455457108f 470 if(ex_power){
Okamoto009 0:ca455457108f 471 pc.printf("External\r\n");
Okamoto009 0:ca455457108f 472 }
Okamoto009 0:ca455457108f 473 else{
Okamoto009 0:ca455457108f 474 pc.printf("Battery\r\n");
Okamoto009 0:ca455457108f 475 }
Okamoto009 0:ca455457108f 476
Okamoto009 0:ca455457108f 477 pc.printf("Separate : %d, %d\r\n", Separate1.status, Separate2.status);
Okamoto009 0:ca455457108f 478 pc.printf("UP DOWN TOP : %d, %d, %d\r\n", ok_up, ok_down, ok_top);
Okamoto009 0:ca455457108f 479 pc.printf("SAVE : %d\r\n", save);
Okamoto009 0:ca455457108f 480 pc.printf("Flight Pin : %d\r\n", flight_pin);
Okamoto009 0:ca455457108f 481
Okamoto009 0:ca455457108f 482 pc.printf("GPS : %3.7f, %3.7f, %.2f\r\n", gps_lat, gps_lon, gps_alt);
Okamoto009 0:ca455457108f 483 pc.printf("Move : %.2f[knot], %.2f[deg]\r\n", gps_knot, gps_deg);
Okamoto009 0:ca455457108f 484 pc.printf("Sats : %d\r\n", gps_sat);
Okamoto009 0:ca455457108f 485
Okamoto009 0:ca455457108f 486 pc.printf("INA_in : %.2f[V], %.2f[A]\r\n", ina_in_v, ina_in_i);
Okamoto009 0:ca455457108f 487 pc.printf("INA_ex : %.2f[V], %.2f[A]\r\n", ina_ex_v, ina_ex_i);
Okamoto009 0:ca455457108f 488
Okamoto009 0:ca455457108f 489 pc.printf("LPS33HW : %.4f[hPa], %.2f[m], %.2f[m/s]\r\n", pres33, alt33, speed33);
Okamoto009 0:ca455457108f 490 pc.printf("SHT35 : %.2f[degC], %.2f[%%]\r\n", temp35, hum35);
Okamoto009 0:ca455457108f 491 // pc.printf("Pitot : %.2f[m/s]\r\n", pitot_speed);
Okamoto009 0:ca455457108f 492
Okamoto009 0:ca455457108f 493 pc.printf("\n\n\n");
Okamoto009 0:ca455457108f 494 }
Okamoto009 0:ca455457108f 495 }
Okamoto009 0:ca455457108f 496
Okamoto009 0:ca455457108f 497
Okamoto009 0:ca455457108f 498 /*******************************************************************************
Okamoto009 0:ca455457108f 499 PCからコマンド読み取り
Okamoto009 0:ca455457108f 500 *******************************************************************************/
Okamoto009 0:ca455457108f 501 void readPC(){
Okamoto009 0:ca455457108f 502 if(ok_PC){
Okamoto009 0:ca455457108f 503 char command = pc.getc();
Okamoto009 0:ca455457108f 504 pc.printf("PC Command = %c\r\n", command);
Okamoto009 0:ca455457108f 505
Okamoto009 0:ca455457108f 506 switch(command){
Okamoto009 0:ca455457108f 507 case '?':
Okamoto009 0:ca455457108f 508 printHelp();
Okamoto009 0:ca455457108f 509 break;
Okamoto009 0:ca455457108f 510
Okamoto009 0:ca455457108f 511 case 'W': //離床検知モードへ移行
Okamoto009 0:ca455457108f 512 if(rocket_phase == ROCKET_SAFETY){
Okamoto009 0:ca455457108f 513 rocket_phase = ROCKET_WAIT;
Okamoto009 0:ca455457108f 514 do_first = false;
Okamoto009 0:ca455457108f 515 }
Okamoto009 0:ca455457108f 516 break;
Okamoto009 0:ca455457108f 517
Okamoto009 0:ca455457108f 518 case 'S': //安全モードへ移行
Okamoto009 0:ca455457108f 519 if(rocket_phase == ROCKET_WAIT){
Okamoto009 0:ca455457108f 520 rocket_phase = ROCKET_SAFETY;
Okamoto009 0:ca455457108f 521 do_first = false;
Okamoto009 0:ca455457108f 522 }
Okamoto009 0:ca455457108f 523 if(rocket_phase == ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 524 rocket_phase = ROCKET_SAFETY;
Okamoto009 0:ca455457108f 525 do_first = false;
Okamoto009 0:ca455457108f 526 timeout_sep.detach();
Okamoto009 0:ca455457108f 527 }
Okamoto009 0:ca455457108f 528 break;
Okamoto009 0:ca455457108f 529
Okamoto009 0:ca455457108f 530 case 'F': //フライトモードへ移行(手動)
Okamoto009 0:ca455457108f 531 if(rocket_phase == ROCKET_WAIT){
Okamoto009 0:ca455457108f 532 rocket_phase = ROCKET_FLIGHT;
Okamoto009 0:ca455457108f 533 do_first = false;
Okamoto009 0:ca455457108f 534 }
Okamoto009 0:ca455457108f 535 break;
Okamoto009 0:ca455457108f 536
Okamoto009 0:ca455457108f 537 case '1': //1段目強制分離
Okamoto009 0:ca455457108f 538 if(rocket_phase == ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 539 rocket_phase = ROCKET_SEP1;
Okamoto009 0:ca455457108f 540 do_first = false;
Okamoto009 0:ca455457108f 541 }
Okamoto009 0:ca455457108f 542 else if(rocket_phase >= ROCKET_SEP1){
Okamoto009 0:ca455457108f 543 separate1();
Okamoto009 0:ca455457108f 544 }
Okamoto009 0:ca455457108f 545 break;
Okamoto009 0:ca455457108f 546
Okamoto009 0:ca455457108f 547 case '2': //2段目強制分離
Okamoto009 0:ca455457108f 548 if(rocket_phase == ROCKET_SEP1){
Okamoto009 0:ca455457108f 549 rocket_phase = ROCKET_SEP2;
Okamoto009 0:ca455457108f 550 do_first = false;
Okamoto009 0:ca455457108f 551 }
Okamoto009 0:ca455457108f 552 else if(rocket_phase >= ROCKET_SEP2){
Okamoto009 0:ca455457108f 553 separate2();
Okamoto009 0:ca455457108f 554 }
Okamoto009 0:ca455457108f 555 break;
Okamoto009 0:ca455457108f 556
Okamoto009 0:ca455457108f 557 case 'C':
Okamoto009 0:ca455457108f 558 if(rocket_phase == ROCKET_RECOVERY || rocket_phase == ROCKET_SAFETY && save){
Okamoto009 0:ca455457108f 559 stopRec();
Okamoto009 0:ca455457108f 560 }
Okamoto009 0:ca455457108f 561 break;
Okamoto009 0:ca455457108f 562
Okamoto009 0:ca455457108f 563 case 'O':
Okamoto009 0:ca455457108f 564 if(rocket_phase == ROCKET_RECOVERY || rocket_phase == ROCKET_SAFETY && !save){
Okamoto009 0:ca455457108f 565 startRec();
Okamoto009 0:ca455457108f 566 }
Okamoto009 0:ca455457108f 567 break;
Okamoto009 0:ca455457108f 568
Okamoto009 0:ca455457108f 569 case 'B':
Okamoto009 0:ca455457108f 570 buzzerChange();
Okamoto009 0:ca455457108f 571 break;
Okamoto009 0:ca455457108f 572 }
Okamoto009 0:ca455457108f 573 }
Okamoto009 0:ca455457108f 574 }
Okamoto009 0:ca455457108f 575
Okamoto009 0:ca455457108f 576
Okamoto009 0:ca455457108f 577 /*******************************************************************************
Okamoto009 0:ca455457108f 578 コマンド情報を表示
Okamoto009 0:ca455457108f 579 *******************************************************************************/
Okamoto009 0:ca455457108f 580 void printHelp(){
Okamoto009 0:ca455457108f 581 for(int i = 0; i < 20; i ++){
Okamoto009 0:ca455457108f 582 pc.printf("*");
Okamoto009 0:ca455457108f 583 }
Okamoto009 0:ca455457108f 584
Okamoto009 0:ca455457108f 585 pc.printf("\r\nCommands\r\n");
Okamoto009 0:ca455457108f 586 pc.printf("W : Safety -> Wait\r\n");
Okamoto009 0:ca455457108f 587 pc.printf("S : Wait -> Safety\r\n");
Okamoto009 0:ca455457108f 588 pc.printf("F : Wait -> Flight\r\n");
Okamoto009 0:ca455457108f 589 pc.printf("1(one) : 1st Separate 5[s]\r\n");
Okamoto009 0:ca455457108f 590 pc.printf("2(two) : 2nd Separate 5[s]\r\n");
Okamoto009 0:ca455457108f 591 pc.printf("C : Stop Recording\r\n");
Okamoto009 0:ca455457108f 592 pc.printf("? : HELP\r\n");
Okamoto009 0:ca455457108f 593
Okamoto009 0:ca455457108f 594 for(int i = 0; i < 20; i ++){
Okamoto009 0:ca455457108f 595 pc.printf("*");
Okamoto009 0:ca455457108f 596 }
Okamoto009 0:ca455457108f 597 pc.printf("\r\n");
Okamoto009 0:ca455457108f 598 wait(1.0f);
Okamoto009 0:ca455457108f 599 }
Okamoto009 0:ca455457108f 600
Okamoto009 0:ca455457108f 601
Okamoto009 0:ca455457108f 602 /*******************************************************************************
Okamoto009 0:ca455457108f 603 ダウンリンクを表示
Okamoto009 0:ca455457108f 604 *******************************************************************************/
Okamoto009 0:ca455457108f 605 void sendDownLink(){
Okamoto009 0:ca455457108f 606 //無線あり
Okamoto009 0:ca455457108f 607 if(!es920_using){
Okamoto009 0:ca455457108f 608 es920 << HEADER_DATA;
Okamoto009 0:ca455457108f 609
Okamoto009 0:ca455457108f 610 es920 << (short)time_reset;
Okamoto009 0:ca455457108f 611 es920 << (short)(time_read / 1000);
Okamoto009 0:ca455457108f 612
Okamoto009 0:ca455457108f 613 es920 << (short)flight_time_reset;
Okamoto009 0:ca455457108f 614 es920 << (short)(flight_time_read / 1000);
Okamoto009 0:ca455457108f 615
Okamoto009 0:ca455457108f 616 es920 << rocket_phase;
Okamoto009 0:ca455457108f 617
Okamoto009 0:ca455457108f 618 char status = 0x00;
Okamoto009 0:ca455457108f 619 if(ex_power) status |= (char)0x01;
Okamoto009 0:ca455457108f 620 if(Separate1.status)status |= (char)0x02;
Okamoto009 0:ca455457108f 621 if(Separate2.status)status |= (char)0x04;
Okamoto009 0:ca455457108f 622 if(ok_up) status |= (char)0x08;
Okamoto009 0:ca455457108f 623 if(ok_down) status |= (char)0x10;
Okamoto009 0:ca455457108f 624 if(ok_top) status |= (char)0x20;
Okamoto009 0:ca455457108f 625 if(save) status |= (char)0x40;
Okamoto009 0:ca455457108f 626 if(flight_pin) status |= (char)0x80;
Okamoto009 0:ca455457108f 627 es920 << status;
Okamoto009 0:ca455457108f 628
Okamoto009 0:ca455457108f 629 es920 << (short)(gps_lat / ES920_MAX_100);
Okamoto009 0:ca455457108f 630 es920 << (short)(gps_lon / ES920_MAX_500);
Okamoto009 0:ca455457108f 631 es920 << (short)(gps_alt / ES920_MAX_500);
Okamoto009 0:ca455457108f 632 es920 << (short)(gps_knot / ES920_MAX_200);
Okamoto009 0:ca455457108f 633 es920 << (short)(gps_deg / ES920_MAX_1500);
Okamoto009 0:ca455457108f 634 es920 << (short)gps_sat;
Okamoto009 0:ca455457108f 635
Okamoto009 0:ca455457108f 636 es920 << (short)(ina_in_v / ES920_MAX_20);
Okamoto009 0:ca455457108f 637 es920 << (short)(ina_in_i / ES920_MAX_20);
Okamoto009 0:ca455457108f 638 es920 << (short)(ina_ex_v / ES920_MAX_20);
Okamoto009 0:ca455457108f 639 es920 << (short)(ina_ex_i / ES920_MAX_20);
Okamoto009 0:ca455457108f 640
Okamoto009 0:ca455457108f 641 es920 << (short)(pres33 / ES920_MAX_3000);
Okamoto009 0:ca455457108f 642 es920 << (short)(alt33_ave / ES920_MAX_500);
Okamoto009 0:ca455457108f 643 es920 << (short)(speed33_ave / ES920_MAX_200);
Okamoto009 0:ca455457108f 644 es920 << (short)(temp35 / ES920_MAX_100);
Okamoto009 0:ca455457108f 645 es920 << (short)(hum35 / ES920_MAX_200);
Okamoto009 0:ca455457108f 646
Okamoto009 0:ca455457108f 647 es920 << (short)(pitot_speed / ES920_MAX_200);
Okamoto009 0:ca455457108f 648
Okamoto009 0:ca455457108f 649 es920.send();
Okamoto009 0:ca455457108f 650 }
Okamoto009 0:ca455457108f 651 else{
Okamoto009 0:ca455457108f 652 es920_using = false;
Okamoto009 0:ca455457108f 653 }
Okamoto009 0:ca455457108f 654 }
Okamoto009 0:ca455457108f 655
Okamoto009 0:ca455457108f 656
Okamoto009 0:ca455457108f 657 /*******************************************************************************
Okamoto009 0:ca455457108f 658 アップリンクを解析
Okamoto009 0:ca455457108f 659 *******************************************************************************/
Okamoto009 0:ca455457108f 660 void readUpLink(){
Okamoto009 0:ca455457108f 661 //無線あり
Okamoto009 0:ca455457108f 662 es920_uplink_command = es920.data[0];
Okamoto009 0:ca455457108f 663 pc.printf("GND Command = %c\r\n", es920_uplink_command);
Okamoto009 0:ca455457108f 664
Okamoto009 0:ca455457108f 665 switch(es920_uplink_command){
Okamoto009 0:ca455457108f 666 case 'W': //離床検知モードへ移行
Okamoto009 0:ca455457108f 667 if(rocket_phase == ROCKET_SAFETY){
Okamoto009 0:ca455457108f 668 rocket_phase = ROCKET_WAIT;
Okamoto009 0:ca455457108f 669 do_first = false;
Okamoto009 0:ca455457108f 670 }
Okamoto009 0:ca455457108f 671 break;
Okamoto009 0:ca455457108f 672
Okamoto009 0:ca455457108f 673 case 'S': //安全モードへ移行
Okamoto009 0:ca455457108f 674 if(rocket_phase == ROCKET_WAIT){
Okamoto009 0:ca455457108f 675 rocket_phase = ROCKET_SAFETY;
Okamoto009 0:ca455457108f 676 do_first = false;
Okamoto009 0:ca455457108f 677 }
Okamoto009 0:ca455457108f 678 if(rocket_phase == ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 679 rocket_phase = ROCKET_SAFETY;
Okamoto009 0:ca455457108f 680 do_first = false;
Okamoto009 0:ca455457108f 681 timeout_sep.detach();
Okamoto009 0:ca455457108f 682 }
Okamoto009 0:ca455457108f 683
Okamoto009 0:ca455457108f 684 break;
Okamoto009 0:ca455457108f 685
Okamoto009 0:ca455457108f 686 case 'F': //フライトモードへ移行(手動)
Okamoto009 0:ca455457108f 687 if(rocket_phase == ROCKET_WAIT){
Okamoto009 0:ca455457108f 688 rocket_phase = ROCKET_FLIGHT;
Okamoto009 0:ca455457108f 689 do_first = false;
Okamoto009 0:ca455457108f 690 }
Okamoto009 0:ca455457108f 691 break;
Okamoto009 0:ca455457108f 692
Okamoto009 0:ca455457108f 693 case '1': //1段目強制分離
Okamoto009 0:ca455457108f 694 if(rocket_phase == ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 695 rocket_phase = ROCKET_SEP1;
Okamoto009 0:ca455457108f 696 do_first = false;
Okamoto009 0:ca455457108f 697 }
Okamoto009 0:ca455457108f 698 else if(rocket_phase >= ROCKET_SEP1){
Okamoto009 0:ca455457108f 699 es920_using = true;
Okamoto009 0:ca455457108f 700 es920 << HEADER_START;
Okamoto009 0:ca455457108f 701 es920 << '1';
Okamoto009 0:ca455457108f 702 es920.send();
Okamoto009 0:ca455457108f 703
Okamoto009 0:ca455457108f 704 separate1();
Okamoto009 0:ca455457108f 705 }
Okamoto009 0:ca455457108f 706 break;
Okamoto009 0:ca455457108f 707
Okamoto009 0:ca455457108f 708 case '2': //2段目強制分離
Okamoto009 0:ca455457108f 709 if(rocket_phase == ROCKET_SEP1){
Okamoto009 0:ca455457108f 710 rocket_phase = ROCKET_SEP2;
Okamoto009 0:ca455457108f 711 do_first = false;
Okamoto009 0:ca455457108f 712 }
Okamoto009 0:ca455457108f 713 else if(rocket_phase >= ROCKET_SEP2){
Okamoto009 0:ca455457108f 714 es920_using = true;
Okamoto009 0:ca455457108f 715 es920 << HEADER_START;
Okamoto009 0:ca455457108f 716 es920 << '2';
Okamoto009 0:ca455457108f 717 es920.send();
Okamoto009 0:ca455457108f 718
Okamoto009 0:ca455457108f 719 separate2();
Okamoto009 0:ca455457108f 720 }
Okamoto009 0:ca455457108f 721 break;
Okamoto009 0:ca455457108f 722
Okamoto009 0:ca455457108f 723 case 'C':
Okamoto009 0:ca455457108f 724 if(rocket_phase == ROCKET_RECOVERY || rocket_phase == ROCKET_SAFETY && save){
Okamoto009 0:ca455457108f 725 stopRec();
Okamoto009 0:ca455457108f 726 }
Okamoto009 0:ca455457108f 727 break;
Okamoto009 0:ca455457108f 728
Okamoto009 0:ca455457108f 729 case 'O':
Okamoto009 0:ca455457108f 730 if(rocket_phase == ROCKET_RECOVERY || rocket_phase == ROCKET_SAFETY && !save){
Okamoto009 0:ca455457108f 731 startRec();
Okamoto009 0:ca455457108f 732 }
Okamoto009 0:ca455457108f 733 break;
Okamoto009 0:ca455457108f 734
Okamoto009 0:ca455457108f 735 case 'B':
Okamoto009 0:ca455457108f 736 buzzerChange();
Okamoto009 0:ca455457108f 737 break;
Okamoto009 0:ca455457108f 738 }
Okamoto009 0:ca455457108f 739 }
Okamoto009 0:ca455457108f 740
Okamoto009 0:ca455457108f 741
Okamoto009 0:ca455457108f 742 /*******************************************************************************
Okamoto009 0:ca455457108f 743 ログ記録開始
Okamoto009 0:ca455457108f 744 *******************************************************************************/
Okamoto009 0:ca455457108f 745 void startRec(){
Okamoto009 0:ca455457108f 746 fp = fopen(file_name, "a");
Okamoto009 0:ca455457108f 747 fprintf(fp, "Time,Flight Time,Phase,Flight Pin,Power,Separate1,Separate2,");
Okamoto009 0:ca455457108f 748 fprintf(fp, "upper100,under30,top,uplink,");
Okamoto009 0:ca455457108f 749 fprintf(fp, "GPS Y/N,GPS Time,Latitude,Longitude,GPS Alt,Knot,Deg,Sattelite,");
Okamoto009 0:ca455457108f 750 fprintf(fp, "ADXL_x[G],ADXL_y[G],ADXL_z[G],In_V[V],In_I[A],Ex_V[V],Ex_I[A],");
Okamoto009 0:ca455457108f 751 fprintf(fp, "Gyro_x[deg],Gyro_y[deg],Gyro_z[deg],Acc_x[G],Acc_y[G],Acc_z[G],Mag_x[deg],Mag_y[deg],Mag_z[deg],");
Okamoto009 0:ca455457108f 752 fprintf(fp, "Q_w,Q_x,Q_y,Q_z,Roll[deg],Pitch[deg],Yaw[deg],");
Okamoto009 0:ca455457108f 753 fprintf(fp, "Pres_22[hPa],Temp_22[degC],Alt_22[m],Pres_33[hPa],Temp_33[degC],Alt_33[m],Alt_33_ave[m],Speed_33[m/s],Speed_33_ave[m/s],");
Okamoto009 0:ca455457108f 754 fprintf(fp, "Temp_35[degC],Humid_35[%],Lux[lux],Pitot_raw[V]\r\n");
Okamoto009 0:ca455457108f 755 save = true;
Okamoto009 0:ca455457108f 756 }
Okamoto009 0:ca455457108f 757
Okamoto009 0:ca455457108f 758
Okamoto009 0:ca455457108f 759 /*******************************************************************************
Okamoto009 0:ca455457108f 760 ログ記録終了
Okamoto009 0:ca455457108f 761 *******************************************************************************/
Okamoto009 0:ca455457108f 762 void stopRec(){
Okamoto009 0:ca455457108f 763 save = false;
Okamoto009 0:ca455457108f 764 fprintf(fp, "\r\n\n");
Okamoto009 0:ca455457108f 765 fclose(fp);
Okamoto009 0:ca455457108f 766 }
Okamoto009 0:ca455457108f 767
Okamoto009 0:ca455457108f 768
Okamoto009 0:ca455457108f 769 /*******************************************************************************
Okamoto009 0:ca455457108f 770 データ書き込み
Okamoto009 0:ca455457108f 771 *******************************************************************************/
Okamoto009 0:ca455457108f 772 void recData(){
Okamoto009 0:ca455457108f 773 if(save){
Okamoto009 0:ca455457108f 774 fprintf(fp, "%d:%02d.%03d,", time_min, time_sec, time_ms);
Okamoto009 0:ca455457108f 775 fprintf(fp, "%d:%02d.%03d,", flight_time_min, flight_time_sec, flight_time_ms);
Okamoto009 0:ca455457108f 776
Okamoto009 0:ca455457108f 777 switch(rocket_phase){
Okamoto009 0:ca455457108f 778 case ROCKET_SETUP:
Okamoto009 0:ca455457108f 779 fprintf(fp, "SETUP,");
Okamoto009 0:ca455457108f 780 break;
Okamoto009 0:ca455457108f 781 case ROCKET_SAFETY:
Okamoto009 0:ca455457108f 782 fprintf(fp, "SAFETY,");
Okamoto009 0:ca455457108f 783 break;
Okamoto009 0:ca455457108f 784 case ROCKET_WAIT:
Okamoto009 0:ca455457108f 785 fprintf(fp, "WAIT,");
Okamoto009 0:ca455457108f 786 break;
Okamoto009 0:ca455457108f 787 case ROCKET_FLIGHT:
Okamoto009 0:ca455457108f 788 fprintf(fp, "FLIGHT,");
Okamoto009 0:ca455457108f 789 break;
Okamoto009 0:ca455457108f 790 case ROCKET_SEP1:
Okamoto009 0:ca455457108f 791 fprintf(fp, "SEPARATE1,");
Okamoto009 0:ca455457108f 792 break;
Okamoto009 0:ca455457108f 793 case ROCKET_SEP2:
Okamoto009 0:ca455457108f 794 fprintf(fp, "SEPARATE2,");
Okamoto009 0:ca455457108f 795 break;
Okamoto009 0:ca455457108f 796 case ROCKET_RECOVERY:
Okamoto009 0:ca455457108f 797 fprintf(fp, "RECOVERY,");
Okamoto009 0:ca455457108f 798 break;
Okamoto009 0:ca455457108f 799 }
Okamoto009 0:ca455457108f 800
Okamoto009 0:ca455457108f 801 fprintf(fp, "%d,", flight_pin);
Okamoto009 0:ca455457108f 802
Okamoto009 0:ca455457108f 803 if(ex_power){
Okamoto009 0:ca455457108f 804 fprintf(fp, "External,");
Okamoto009 0:ca455457108f 805 }
Okamoto009 0:ca455457108f 806 else{
Okamoto009 0:ca455457108f 807 fprintf(fp, "Battery,");
Okamoto009 0:ca455457108f 808 }
Okamoto009 0:ca455457108f 809
Okamoto009 0:ca455457108f 810 fprintf(fp, "%d,%d,", Separate1.status, Separate2.status);
Okamoto009 0:ca455457108f 811 fprintf(fp, "%d,%d,%d,", ok_up, ok_down, ok_top);
Okamoto009 0:ca455457108f 812
Okamoto009 0:ca455457108f 813 fprintf(fp, "%c,", es920_uplink_command);
Okamoto009 0:ca455457108f 814 es920_uplink_command = '-';
Okamoto009 0:ca455457108f 815
Okamoto009 0:ca455457108f 816 fprintf(fp, "%d,", gps_yn);
Okamoto009 0:ca455457108f 817 fprintf(fp, "%d/%d/%d ", (int)gps_utc[0], (int)gps_utc[1], (int)gps_utc[2]); //日付
Okamoto009 0:ca455457108f 818 fprintf(fp, "%d:%02d:%02.2f,", (int)gps_utc[3], (int)gps_utc[4], gps_utc[5]); //時間
Okamoto009 0:ca455457108f 819 fprintf(fp, "%3.7f,%3.7f,%.2f,", gps_lat, gps_lon, gps_alt); //GPS座標
Okamoto009 0:ca455457108f 820 fprintf(fp, "%.2f,%.2f,", gps_knot, gps_deg); //GPS速度
Okamoto009 0:ca455457108f 821 fprintf(fp, "%d,", gps_sat); //GPS衛星数
Okamoto009 0:ca455457108f 822
Okamoto009 0:ca455457108f 823 fprintf(fp, "%.2f,%.2f,%.2f,", adxl_acc[0], adxl_acc[1], adxl_acc[2]);
Okamoto009 0:ca455457108f 824 fprintf(fp, "%.4f,%.4f,%.4f,%.4f,", ina_in_v, ina_in_i, ina_ex_v, ina_ex_i);
Okamoto009 0:ca455457108f 825 fprintf(fp, "%f,%f,%f,", gyro[0], gyro[1], gyro[2]);
Okamoto009 0:ca455457108f 826 fprintf(fp, "%f,%f,%f,", acc[0], acc[1], acc[2]);
Okamoto009 0:ca455457108f 827 fprintf(fp, "%.2f,%.2f,%.2f,", mag[0], mag[1], mag[2]);
Okamoto009 0:ca455457108f 828 fprintf(fp, "%f,%f,%f,%f,", quart.w, quart.x, quart.y, quart.z);
Okamoto009 0:ca455457108f 829 fprintf(fp, "%f,%f,%f,", euler[0], euler[1], euler[2]);
Okamoto009 0:ca455457108f 830 fprintf(fp, "%f,%.2f,%.2f,", pres22, temp22, alt22);
Okamoto009 0:ca455457108f 831 fprintf(fp, "%f,%.2f,%.2f,%.2f,%.2f,%2f,", pres33, temp33, alt33, alt33_ave, speed33, speed33_ave);
Okamoto009 0:ca455457108f 832 fprintf(fp, "%.2f,%.2f,", temp35, hum35);
Okamoto009 0:ca455457108f 833 fprintf(fp, "%d,", lux);
Okamoto009 0:ca455457108f 834 //fprintf(fp, "%f,%f,%f\r\n", pitot_raw, pitot, pitot_speed);
Okamoto009 0:ca455457108f 835
Okamoto009 0:ca455457108f 836 save_c ++;
Okamoto009 0:ca455457108f 837 if(save_c > 10000){
Okamoto009 0:ca455457108f 838 fclose(fp);
Okamoto009 0:ca455457108f 839 fp = fopen(file_name, "a");
Okamoto009 0:ca455457108f 840 save_c = 0;
Okamoto009 0:ca455457108f 841 }
Okamoto009 0:ca455457108f 842 }
Okamoto009 0:ca455457108f 843 }
Okamoto009 0:ca455457108f 844
Okamoto009 0:ca455457108f 845
Okamoto009 0:ca455457108f 846 /*******************************************************************************
Okamoto009 0:ca455457108f 847 状態遷移の判断
Okamoto009 0:ca455457108f 848 *******************************************************************************/
Okamoto009 0:ca455457108f 849 void modeChange(){
Okamoto009 0:ca455457108f 850 //無線あり
Okamoto009 0:ca455457108f 851 switch(rocket_phase){
Okamoto009 0:ca455457108f 852 case ROCKET_SAFETY://///////////////安全モード
Okamoto009 0:ca455457108f 853 if(!do_first){
Okamoto009 0:ca455457108f 854 es920_using = true;
Okamoto009 0:ca455457108f 855 es920 << HEADER_START;
Okamoto009 0:ca455457108f 856 es920 << 'S';
Okamoto009 0:ca455457108f 857 es920.send();
Okamoto009 0:ca455457108f 858
Okamoto009 0:ca455457108f 859 do_first = true;
Okamoto009 0:ca455457108f 860 }
Okamoto009 0:ca455457108f 861 break;
Okamoto009 0:ca455457108f 862
Okamoto009 0:ca455457108f 863 case ROCKET_WAIT://////////////////離床検知モード
Okamoto009 0:ca455457108f 864 if(!do_first){
Okamoto009 0:ca455457108f 865 es920_using = true;
Okamoto009 0:ca455457108f 866 es920 << HEADER_START;
Okamoto009 0:ca455457108f 867 es920 << 'W';
Okamoto009 0:ca455457108f 868 es920.send();
Okamoto009 0:ca455457108f 869
Okamoto009 0:ca455457108f 870
Okamoto009 0:ca455457108f 871 if(!save){
Okamoto009 0:ca455457108f 872 startRec();
Okamoto009 0:ca455457108f 873 }
Okamoto009 0:ca455457108f 874
Okamoto009 0:ca455457108f 875 do_first = true;
Okamoto009 0:ca455457108f 876 }
Okamoto009 0:ca455457108f 877 if(flight_pin){
Okamoto009 0:ca455457108f 878 rocket_phase = ROCKET_FLIGHT;
Okamoto009 0:ca455457108f 879 do_first = false;
Okamoto009 0:ca455457108f 880 }
Okamoto009 0:ca455457108f 881 break;
Okamoto009 0:ca455457108f 882
Okamoto009 0:ca455457108f 883 case ROCKET_FLIGHT:///////////////フライトモード
Okamoto009 0:ca455457108f 884 if(!do_first){
Okamoto009 0:ca455457108f 885 es920_using = true;
Okamoto009 0:ca455457108f 886 es920 << HEADER_START;
Okamoto009 0:ca455457108f 887 es920 << 'F';
Okamoto009 0:ca455457108f 888 es920.send();
Okamoto009 0:ca455457108f 889
Okamoto009 0:ca455457108f 890 if(!save){
Okamoto009 0:ca455457108f 891 startRec();
Okamoto009 0:ca455457108f 892 }
Okamoto009 0:ca455457108f 893
Okamoto009 0:ca455457108f 894 time_flight.reset();
Okamoto009 0:ca455457108f 895 time_flight.start();
Okamoto009 0:ca455457108f 896
Okamoto009 0:ca455457108f 897 timeout_sep.attach(&changePhase_SEP1, TIME_SEP1);
Okamoto009 0:ca455457108f 898 timeout_recovery.attach(&changePhase_RECOVERY, TIME_RECOVERY);
Okamoto009 0:ca455457108f 899
Okamoto009 0:ca455457108f 900 do_first = true;
Okamoto009 0:ca455457108f 901 }
Okamoto009 0:ca455457108f 902 if(alt33_ave > SEP1_ALT_UNDER && speed33_ave < SEP1_SPEED){
Okamoto009 0:ca455457108f 903 ok_top = true;
Okamoto009 0:ca455457108f 904
Okamoto009 0:ca455457108f 905 rocket_phase = ROCKET_SEP1;
Okamoto009 0:ca455457108f 906 do_first = false;
Okamoto009 0:ca455457108f 907 }
Okamoto009 0:ca455457108f 908 break;
Okamoto009 0:ca455457108f 909
Okamoto009 0:ca455457108f 910 case ROCKET_SEP1:////////////////分離1モード
Okamoto009 0:ca455457108f 911 if(!do_first){
Okamoto009 0:ca455457108f 912 es920_using = true;
Okamoto009 0:ca455457108f 913 es920 << HEADER_START;
Okamoto009 0:ca455457108f 914 es920 << '1';
Okamoto009 0:ca455457108f 915 es920.send();
Okamoto009 0:ca455457108f 916
Okamoto009 0:ca455457108f 917 timeout_sep.detach();
Okamoto009 0:ca455457108f 918
Okamoto009 0:ca455457108f 919 stopRec();
Okamoto009 0:ca455457108f 920
Okamoto009 0:ca455457108f 921 startRec();
Okamoto009 0:ca455457108f 922
Okamoto009 0:ca455457108f 923 separate1();
Okamoto009 0:ca455457108f 924
Okamoto009 0:ca455457108f 925 timeout_sep.attach(&changePhase_SEP2, TIME_SEP2 - TIME_SEP1);
Okamoto009 0:ca455457108f 926
Okamoto009 0:ca455457108f 927 do_first = true;
Okamoto009 0:ca455457108f 928 }
Okamoto009 0:ca455457108f 929 if(alt33_ave < SEP2_ALT_UP && speed33_ave < 0.0f && ok_up){
Okamoto009 0:ca455457108f 930 rocket_phase = ROCKET_SEP2;
Okamoto009 0:ca455457108f 931 do_first = false;
Okamoto009 0:ca455457108f 932 }
Okamoto009 0:ca455457108f 933 break;
Okamoto009 0:ca455457108f 934
Okamoto009 0:ca455457108f 935 case ROCKET_SEP2:////////////////分離2モード
Okamoto009 0:ca455457108f 936 if(!do_first){
Okamoto009 0:ca455457108f 937 es920_using = true;
Okamoto009 0:ca455457108f 938 es920 << HEADER_START;
Okamoto009 0:ca455457108f 939 es920 << '2';
Okamoto009 0:ca455457108f 940 es920.send();
Okamoto009 0:ca455457108f 941
Okamoto009 0:ca455457108f 942 timeout_sep.detach();
Okamoto009 0:ca455457108f 943
Okamoto009 0:ca455457108f 944 separate2();
Okamoto009 0:ca455457108f 945
Okamoto009 0:ca455457108f 946 do_first = true;
Okamoto009 0:ca455457108f 947 }
Okamoto009 0:ca455457108f 948 break;
Okamoto009 0:ca455457108f 949
Okamoto009 0:ca455457108f 950 case ROCKET_RECOVERY:////////////回収モード
Okamoto009 0:ca455457108f 951 if(!do_first){
Okamoto009 0:ca455457108f 952 stopRec();
Okamoto009 0:ca455457108f 953 startRec();
Okamoto009 0:ca455457108f 954
Okamoto009 0:ca455457108f 955 Buzzer = 1;
Okamoto009 0:ca455457108f 956
Okamoto009 0:ca455457108f 957 do_first = true;
Okamoto009 0:ca455457108f 958 }
Okamoto009 0:ca455457108f 959 break;
Okamoto009 0:ca455457108f 960 }
Okamoto009 0:ca455457108f 961
Okamoto009 0:ca455457108f 962 if(rocket_phase >= ROCKET_FLIGHT){//////////////////フライトモード以降共通
Okamoto009 0:ca455457108f 963 if(alt33_ave > SEP1_ALT_UNDER && speed33_ave < SEP1_SPEED){
Okamoto009 0:ca455457108f 964 ok_top = true;
Okamoto009 0:ca455457108f 965 }
Okamoto009 0:ca455457108f 966
Okamoto009 0:ca455457108f 967 if(!ok_up && alt33_ave > OK_UP_ALT){
Okamoto009 0:ca455457108f 968 ok_up = true;
Okamoto009 0:ca455457108f 969 }
Okamoto009 0:ca455457108f 970 if(ok_up && !ok_down && alt33_ave < OK_DOWN_ALT){
Okamoto009 0:ca455457108f 971 ok_down = true;
Okamoto009 0:ca455457108f 972 }
Okamoto009 0:ca455457108f 973 if(ok_up && ok_down && speed33_ave > STOP_SPEED_UNDER && speed33_ave < STOP_SPEED_UP){
Okamoto009 0:ca455457108f 974 changePhase_RECOVERY();
Okamoto009 0:ca455457108f 975 }
Okamoto009 0:ca455457108f 976 }
Okamoto009 0:ca455457108f 977 }
Okamoto009 0:ca455457108f 978
Okamoto009 0:ca455457108f 979 void changePhase_SEP1(){/////////////分離1モードへ
Okamoto009 0:ca455457108f 980 rocket_phase = ROCKET_SEP1;
Okamoto009 0:ca455457108f 981 do_first = false;
Okamoto009 0:ca455457108f 982 }
Okamoto009 0:ca455457108f 983
Okamoto009 0:ca455457108f 984 void changePhase_SEP2(){/////////////分離2モードへ
Okamoto009 0:ca455457108f 985 rocket_phase = ROCKET_SEP2;
Okamoto009 0:ca455457108f 986 do_first = false;
Okamoto009 0:ca455457108f 987 }
Okamoto009 0:ca455457108f 988
Okamoto009 0:ca455457108f 989 void changePhase_RECOVERY(){/////////回収モードへ
Okamoto009 0:ca455457108f 990 rocket_phase = ROCKET_RECOVERY;
Okamoto009 0:ca455457108f 991 do_first = false;
Okamoto009 0:ca455457108f 992 }
Okamoto009 0:ca455457108f 993
Okamoto009 0:ca455457108f 994
Okamoto009 0:ca455457108f 995 /*******************************************************************************
Okamoto009 0:ca455457108f 996 ブザーのON/OFF
Okamoto009 0:ca455457108f 997 *******************************************************************************/
Okamoto009 0:ca455457108f 998 void buzzerChange(){
Okamoto009 0:ca455457108f 999 if(Buzzer){
Okamoto009 0:ca455457108f 1000 Buzzer = 0;
Okamoto009 0:ca455457108f 1001 }
Okamoto009 0:ca455457108f 1002 else{
Okamoto009 0:ca455457108f 1003 Buzzer = 1;
Okamoto009 0:ca455457108f 1004 }
Okamoto009 0:ca455457108f 1005 }
Okamoto009 0:ca455457108f 1006
Okamoto009 0:ca455457108f 1007
Okamoto009 0:ca455457108f 1008 /*******************************************************************************
Okamoto009 0:ca455457108f 1009 分離機構1段目作動
Okamoto009 0:ca455457108f 1010 *******************************************************************************/
Okamoto009 0:ca455457108f 1011 void separate1(){
Okamoto009 0:ca455457108f 1012 if(!Separate1.status && rocket_phase >= ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 1013 Separate1.fire(6.0f);
Okamoto009 0:ca455457108f 1014 pc.printf("1st Separation\r\n");
Okamoto009 0:ca455457108f 1015 }
Okamoto009 0:ca455457108f 1016 }
Okamoto009 0:ca455457108f 1017
Okamoto009 0:ca455457108f 1018
Okamoto009 0:ca455457108f 1019 /*******************************************************************************
Okamoto009 0:ca455457108f 1020 分離機構2段目作動
Okamoto009 0:ca455457108f 1021 *******************************************************************************/
Okamoto009 0:ca455457108f 1022 void separate2(){
Okamoto009 0:ca455457108f 1023 if(!Separate2.status && rocket_phase >= ROCKET_FLIGHT){
Okamoto009 0:ca455457108f 1024 Separate2.fire(5.0f);
Okamoto009 0:ca455457108f 1025 pc.printf("2nd Separation\r\n");
Okamoto009 0:ca455457108f 1026 }
Okamoto009 0:ca455457108f 1027 }
Okamoto009 0:ca455457108f 1028
Okamoto009 0:ca455457108f 1029
Okamoto009 0:ca455457108f 1030 /*******************************************************************************
Okamoto009 0:ca455457108f 1031 セットアップ(最初に1回実行)
Okamoto009 0:ca455457108f 1032 *******************************************************************************/
Okamoto009 0:ca455457108f 1033 //無線あり(HEADER_SETUP)
Okamoto009 0:ca455457108f 1034 void setup(){
Okamoto009 0:ca455457108f 1035 wait(1.0f);
Okamoto009 0:ca455457108f 1036 char setup_string[1024];
Okamoto009 0:ca455457108f 1037
Okamoto009 0:ca455457108f 1038 pc.printf("\r\n**************************************************\r\n");
Okamoto009 0:ca455457108f 1039 pc.printf("Sensor Setting Start!!\r\n");
Okamoto009 0:ca455457108f 1040 strcat(setup_string, "Sensor Setting Start!!\r\n");
Okamoto009 0:ca455457108f 1041 es920 << HEADER_SENSOR_SETUP;
Okamoto009 0:ca455457108f 1042
Okamoto009 0:ca455457108f 1043 ///////////////////////////////////////////ADXL375
Okamoto009 0:ca455457108f 1044 ADXL375.setDataRate(ADXL375_100HZ);
Okamoto009 0:ca455457108f 1045 if(ADXL375.whoAmI() == 1){
Okamoto009 0:ca455457108f 1046 pc.printf("ADXL375 : OK\r\n");
Okamoto009 0:ca455457108f 1047 strcat(setup_string, "ADXL375 : OK!!\r\n");
Okamoto009 0:ca455457108f 1048 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1049 }
Okamoto009 0:ca455457108f 1050 else{
Okamoto009 0:ca455457108f 1051 pc.printf("ADXL375 : NG...\r\n");
Okamoto009 0:ca455457108f 1052 strcat(setup_string, "ADXL375 : NG...\r\n");
Okamoto009 0:ca455457108f 1053 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1054 }
Okamoto009 0:ca455457108f 1055 ADXL375.offset(0.0f, 0.0f, 0.0f);
Okamoto009 0:ca455457108f 1056
Okamoto009 0:ca455457108f 1057 ///////////////////////////////////////////INA226_in
Okamoto009 0:ca455457108f 1058 INA226_in.set_callibretion();
Okamoto009 0:ca455457108f 1059 if(INA226_in.Connection_check() == 0){
Okamoto009 0:ca455457108f 1060 pc.printf("INA226_in : OK!!\r\n");
Okamoto009 0:ca455457108f 1061 strcat(setup_string, "INA_in : OK!!\r\n");
Okamoto009 0:ca455457108f 1062 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1063 }
Okamoto009 0:ca455457108f 1064 else{
Okamoto009 0:ca455457108f 1065 pc.printf("INA226_in : NG...\r\n");
Okamoto009 0:ca455457108f 1066 strcat(setup_string, "INA_in : NG...\r\n");
Okamoto009 0:ca455457108f 1067 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1068 }
Okamoto009 0:ca455457108f 1069
Okamoto009 0:ca455457108f 1070 ///////////////////////////////////////////INA226_ex
Okamoto009 0:ca455457108f 1071 INA226_ex.set_callibretion();
Okamoto009 0:ca455457108f 1072 if(INA226_ex.Connection_check() == 0){
Okamoto009 0:ca455457108f 1073 pc.printf("INA226_ex OK!!\r\n");
Okamoto009 0:ca455457108f 1074 strcat(setup_string, "INA_ex : OK!!\r\n");
Okamoto009 0:ca455457108f 1075 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1076 }
Okamoto009 0:ca455457108f 1077 else{
Okamoto009 0:ca455457108f 1078 pc.printf("INA226_ex NG...\r\n");
Okamoto009 0:ca455457108f 1079 strcat(setup_string, "INA_ex : NG...\r\n");
Okamoto009 0:ca455457108f 1080 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1081 }
Okamoto009 0:ca455457108f 1082
Okamoto009 0:ca455457108f 1083 ///////////////////////////////////////////MPU9250
Okamoto009 0:ca455457108f 1084 nine.setAcc(_16G);
Okamoto009 0:ca455457108f 1085 nine.setGyro(_2000DPS);
Okamoto009 0:ca455457108f 1086 nine.setOffset(0.58424, 0.622428, 0.063746,
Okamoto009 0:ca455457108f 1087 0.008125, -0.00106, 0.0024145,
Okamoto009 0:ca455457108f 1088 -2.25, 3.825, -24.75);
Okamoto009 0:ca455457108f 1089
Okamoto009 0:ca455457108f 1090 if(nine.senserTest()){
Okamoto009 0:ca455457108f 1091 pc.printf("MPU9250 : OK!!\r\n");
Okamoto009 0:ca455457108f 1092 strcat(setup_string, "MPU9250 : OK!!\r\n");
Okamoto009 0:ca455457108f 1093 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1094 }
Okamoto009 0:ca455457108f 1095 else{
Okamoto009 0:ca455457108f 1096 pc.printf("MPU9250 : NG...\r\n");
Okamoto009 0:ca455457108f 1097 strcat(setup_string, "MPU9250 : NG...\r\n");
Okamoto009 0:ca455457108f 1098 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1099 }
Okamoto009 0:ca455457108f 1100 if(nine.mag_senserTest()){
Okamoto009 0:ca455457108f 1101 pc.printf("MPU9250 MAG : OK!!\r\n");
Okamoto009 0:ca455457108f 1102 strcat(setup_string, "MPU9250 MAG : OK!!\r\n");
Okamoto009 0:ca455457108f 1103 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1104 }
Okamoto009 0:ca455457108f 1105 else{
Okamoto009 0:ca455457108f 1106 pc.printf("MPU9250 MAG : NG...\r\n");
Okamoto009 0:ca455457108f 1107 strcat(setup_string, "MPU9250 MAG : NG...\r\n");
Okamoto009 0:ca455457108f 1108 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1109 }
Okamoto009 0:ca455457108f 1110
Okamoto009 0:ca455457108f 1111 ///////////////////////////////////////////LPS22HB
Okamoto009 0:ca455457108f 1112 LPS22HB.begin(50);
Okamoto009 0:ca455457108f 1113 if(LPS22HB.whoAmI() == 0){
Okamoto009 0:ca455457108f 1114 pc.printf("LPS22HB : OK!!\r\n");
Okamoto009 0:ca455457108f 1115 strcat(setup_string, "LPS22HB : OK!!\r\n");
Okamoto009 0:ca455457108f 1116 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1117 }
Okamoto009 0:ca455457108f 1118 else{
Okamoto009 0:ca455457108f 1119 pc.printf("LPS22HB : NG...\r\n");
Okamoto009 0:ca455457108f 1120 strcat(setup_string, "LPS22HB : NG...\r\n");
Okamoto009 0:ca455457108f 1121 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1122 }
Okamoto009 0:ca455457108f 1123
Okamoto009 0:ca455457108f 1124 ///////////////////////////////////////////LPS33HW
Okamoto009 0:ca455457108f 1125 LPS33HW.begin(50);
Okamoto009 0:ca455457108f 1126 if(LPS33HW.whoAmI() == 0){
Okamoto009 0:ca455457108f 1127 pc.printf("LPS33HW : OK!!\r\n");
Okamoto009 0:ca455457108f 1128 strcat(setup_string, "LPS33HW : OK!!\r\n");
Okamoto009 0:ca455457108f 1129 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1130 }
Okamoto009 0:ca455457108f 1131 else{
Okamoto009 0:ca455457108f 1132 pc.printf("LPS33HW : NG...\r\n");
Okamoto009 0:ca455457108f 1133 strcat(setup_string, "LPS33HW : NG...\r\n");
Okamoto009 0:ca455457108f 1134 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1135 }
Okamoto009 0:ca455457108f 1136
Okamoto009 0:ca455457108f 1137 ///////////////////////////////////////////SHT35
Okamoto009 0:ca455457108f 1138 int sht_state = SHT35.getState();
Okamoto009 0:ca455457108f 1139 if(sht_state == 32784 || sht_state == 32848){
Okamoto009 0:ca455457108f 1140 pc.printf("SHT35 : OK!!\r\n");
Okamoto009 0:ca455457108f 1141 strcat(setup_string, "SHT35 : OK!!\r\n");
Okamoto009 0:ca455457108f 1142 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1143 }
Okamoto009 0:ca455457108f 1144 else{
Okamoto009 0:ca455457108f 1145 pc.printf("SHT35 : NG...\r\n");
Okamoto009 0:ca455457108f 1146 strcat(setup_string, "SHT35 : NG...\r\n");
Okamoto009 0:ca455457108f 1147 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1148 }
Okamoto009 0:ca455457108f 1149
Okamoto009 0:ca455457108f 1150 ///////////////////////////////////////////TSL2561
Okamoto009 0:ca455457108f 1151 TSL2561.begin();
Okamoto009 0:ca455457108f 1152 //lux_time = TSL2561.setRate(1);
Okamoto009 0:ca455457108f 1153 if(TSL2561.connectCheck() == 1){
Okamoto009 0:ca455457108f 1154 pc.printf("TSL2561 : OK!!\r\n");
Okamoto009 0:ca455457108f 1155 strcat(setup_string, "TSL2561 : OK!!\r\n");
Okamoto009 0:ca455457108f 1156 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1157 }
Okamoto009 0:ca455457108f 1158 else{
Okamoto009 0:ca455457108f 1159 pc.printf("SL2561 : NG...\r\n");
Okamoto009 0:ca455457108f 1160 strcat(setup_string, "TSL2561 : NG...\r\n");
Okamoto009 0:ca455457108f 1161 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1162 }
Okamoto009 0:ca455457108f 1163
Okamoto009 0:ca455457108f 1164 ///////////////////////////////////////////SD
Okamoto009 0:ca455457108f 1165 fp = fopen("/sd/Felix_Luminous_setup.txt", "r");
Okamoto009 0:ca455457108f 1166 if(fp != NULL){
Okamoto009 0:ca455457108f 1167 pc.printf("SD : OK!!\r\n");
Okamoto009 0:ca455457108f 1168 strcat(setup_string, "SD : OK!!\r\n");
Okamoto009 0:ca455457108f 1169 es920 << (char)0x01;
Okamoto009 0:ca455457108f 1170 fclose(fp);
Okamoto009 0:ca455457108f 1171 }
Okamoto009 0:ca455457108f 1172 else{
Okamoto009 0:ca455457108f 1173 pc.printf("SD : NG...\r\n");
Okamoto009 0:ca455457108f 1174 strcat(setup_string, "SD : NG...\r\n");
Okamoto009 0:ca455457108f 1175 es920 << (char)0x00;
Okamoto009 0:ca455457108f 1176 }
Okamoto009 0:ca455457108f 1177
Okamoto009 0:ca455457108f 1178 pc.printf("Sensor Setting Finished!!\r\n");
Okamoto009 0:ca455457108f 1179 pc.printf("**************************************************\r\n");
Okamoto009 0:ca455457108f 1180 strcat(setup_string, "Sensor Setting Finished!!\r\n");
Okamoto009 0:ca455457108f 1181 es920.send();
Okamoto009 0:ca455457108f 1182 wait(1.0f);
Okamoto009 0:ca455457108f 1183
Okamoto009 0:ca455457108f 1184 pc.printf("\r\n**************************************************\r\n");
Okamoto009 0:ca455457108f 1185 if(wait_GPS){
Okamoto009 0:ca455457108f 1186 pc.printf("GPS Setting Start!!\r\n");
Okamoto009 0:ca455457108f 1187 strcat(setup_string, "GPS Setting Start!!\r\n");
Okamoto009 0:ca455457108f 1188
Okamoto009 0:ca455457108f 1189 pc.printf("Waiting : 0");
Okamoto009 0:ca455457108f 1190 strcat(setup_string, "Wait : ");
Okamoto009 0:ca455457108f 1191 int gps_wait_count = 0;
Okamoto009 0:ca455457108f 1192 while(!GPS.gps_readable){
Okamoto009 0:ca455457108f 1193 pc.printf("\rWaiting : %d", gps_wait_count);//
Okamoto009 0:ca455457108f 1194 es920 << HEADER_GPS_SETUP;
Okamoto009 0:ca455457108f 1195 es920 << (char)GPS.gps_readable;
Okamoto009 0:ca455457108f 1196 es920 << (int)gps_wait_count;
Okamoto009 0:ca455457108f 1197 es920.send();
Okamoto009 0:ca455457108f 1198 wait(1.0f);
Okamoto009 0:ca455457108f 1199 gps_wait_count ++;
Okamoto009 0:ca455457108f 1200 }
Okamoto009 0:ca455457108f 1201 char ss[8];
Okamoto009 0:ca455457108f 1202 sscanf(ss, "%d", &gps_wait_count);
Okamoto009 0:ca455457108f 1203 strcat(setup_string, ss);
Okamoto009 0:ca455457108f 1204 pc.printf(" OK!!\r\n");
Okamoto009 0:ca455457108f 1205 strcat(setup_string, " OK!!\r\n");
Okamoto009 0:ca455457108f 1206 pc.printf("GPS Setting Finished!!\r\n");
Okamoto009 0:ca455457108f 1207 strcat(setup_string, "GPS Setting Finished!!\r\n");
Okamoto009 0:ca455457108f 1208 es920 << HEADER_GPS_SETUP;
Okamoto009 0:ca455457108f 1209 es920 << (char)0xAA;
Okamoto009 0:ca455457108f 1210 es920 << (int)0;
Okamoto009 0:ca455457108f 1211 es920.send();
Okamoto009 0:ca455457108f 1212 }
Okamoto009 0:ca455457108f 1213 else{
Okamoto009 0:ca455457108f 1214 pc.printf("GPS Setting Ignore...\r\n");
Okamoto009 0:ca455457108f 1215 strcat(setup_string, "GPS Setting Ignore...\r\n");
Okamoto009 0:ca455457108f 1216 es920 << HEADER_GPS_SETUP;
Okamoto009 0:ca455457108f 1217 es920 << (char)0xFF;
Okamoto009 0:ca455457108f 1218 es920 << (int)0;
Okamoto009 0:ca455457108f 1219 es920.send();
Okamoto009 0:ca455457108f 1220 }
Okamoto009 0:ca455457108f 1221 pc.printf("\r\n**************************************************\r\n");
Okamoto009 0:ca455457108f 1222 fp = fopen(file_name, "a");
Okamoto009 0:ca455457108f 1223 fprintf(fp, setup_string);
Okamoto009 0:ca455457108f 1224 fclose(fp);
Okamoto009 0:ca455457108f 1225 setup_string[0] = NULL;
Okamoto009 0:ca455457108f 1226
Okamoto009 0:ca455457108f 1227 printHelp();
Okamoto009 0:ca455457108f 1228 wait(1.0f);
Okamoto009 0:ca455457108f 1229 }