Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: PQMPU9250 PQINA226 mbed PQAEGPS PQEEPROM PQADXL375 SDFileSystem PQLPS22HB PQES920LR
Diff: main.cpp
- Revision:
- 0:106e97338223
- Child:
- 1:5c46289e3bd1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jan 07 10:50:29 2020 +0000 @@ -0,0 +1,363 @@ +#include "mbed.h" +#include "SDFileSystem.h" + +#include "PQADXL375.h" +#include "PQAEGPS.h" +#include "PQEEPROM.h" +#include "PQES920LR.h" +#include "PQINA226.h" +#include "PQLPS22HB.h" +#include "PQMPU9250.h" + +#define DEBUG 1 + +#define TIME_SEP1 7.0f +#define TIME_SEP2 5.0f +#define TIME_RECOVERY 30.0f +#define ALT_SEP1 500.0f + +Serial pc(USBTX, USBRX, 115200); +Serial gps_serial(p9, p10, 115200); +Serial es_serial(p13, p14, 115200); + +I2C i2c(p28, p27); + +SDFileSystem sd(p5, p6, p7, p8, "sd"); + +AEGPS gps(gps_serial); +ES920LR es(es_serial); + +ADXL375 adxl(i2c, ADXL375::ALT_ADDRESS_HIGH); +INA226 ina_in(i2c, INA226::A0_VS, INA226::A1_VS); +INA226 ina_ex(i2c, INA226::A0_GND, INA226::A1_GND); +LPS22HB lps(i2c, LPS22HB::SA0_HIGH); +MPU9250 mpu(i2c, MPU9250::AD0_HIGH); + +EEPROM eeprom(i2c); + +Timer mission_timer; +Timer flight_timer; +Timer sd_timer; + +Timeout sep1_timeout; +Timeout sep2_timeout; +Timeout recovery_timeout; + +Ticker log_ticker; +Ticker read_ticker; + +DigitalIn flight_pin(p24); + +DigitalOut sep1(p21); +DigitalOut sep2(p22); +DigitalOut buzzer(p23); + +AnalogIn pitot(p20); + +void init(); +void read(); +void log(); +void separate1(); +void separate2(); +void recovery(); +void downlink(); +void command_handler(char *command); + +int addr; + +FILE *fp; + +typedef enum { + INIT, + SAFETY, + WAIT, + FLIGHT, + SEP1, + SEP2, + RECOVERY +} Phase_t; + +struct { + int mission_timer_reset; + int mission_time; + int flight_timer_reset; + int flight_time; + Phase_t phase; + char f_sd; + char f_adxl; + char f_ina_in; + char f_ina_ex; + char f_lps; + char f_mpu; + char f_mpu_ak; + int hour; + int min; + float sec; + float lat; + float lon; + int sat; + int fix; + float hdop; + float alt; + float geoid; + float high_accel[3]; + float ina_in_v; + float ina_in_i; + float ina_ex_v; + float ina_ex_i; + float press; + float temp; + float accel[3]; + float gyro[3]; + float mag[3]; +} rocket; + +int main() +{ + flight_pin.mode(PullUp); + mission_timer.start(); + sd_timer.start(); + log_ticker.attach(&log, 1.0f); + + es.attach(command_handler); + + while(1) { + read(); + if(rocket.phase == INIT) { + init(); + rocket.phase = SAFETY; + } else if(rocket.phase == SAFETY) { + + } else if(rocket.phase == WAIT) { + if(flight_pin) { + sep1_timeout.attach(&separate1, TIME_SEP1); + recovery_timeout.attach(&recovery, TIME_RECOVERY); + rocket.phase = FLIGHT; + } + } else if(rocket.phase == FLIGHT) { + flight_timer.start(); + if(rocket.alt > SEP1) { + sep2_timeout.attach(&separate2, TIME_SEP2); + rocket.phase = SEP1; + } + } else if(rocket.phase == SEP1) { + if(false/*rocket.alt < ALT_SEP1*/) { + rocket.phase = RECOVERY; + } + } else if(rocket.phase == SEP2) { + } else if(rocket.phase == RECOVERY) { + } + if(mission_timer.read_ms() >= 30*60*1000) { + mission_timer.reset(); + rocket.mission_timer_reset++; + } + } +} + +void separate1() +{ + rocket.phase = SEP1; + sep1_timeout.detach(); +} + +void separate2() +{ + rocket.phase = SEP2; + sep2_timeout.detach(); +} + +void recovery() +{ + rocket.phase = RECOVERY; + recovery_timeout.detach(); +} + +void init() +{ + fp = fopen("/sd/IZU2020_AVIONICS.txt", "a"); + + adxl.begin(); + ina_in.begin(); + ina_ex.begin(); + lps.begin(); + mpu.begin(); +} + +void read() +{ + rocket.f_sd = (char)(bool)fp; + rocket.f_adxl = (char)adxl.test(); + rocket.f_ina_in = (char)ina_in.test(); + rocket.f_ina_ex = (char)ina_ex.test(); + rocket.f_lps = (char)lps.test(); + rocket.f_mpu = (char)mpu.test(); + rocket.f_mpu_ak = (char)mpu.test_AK8963(); + + rocket.mission_time = mission_timer.read_ms(); + rocket.flight_time = flight_timer.read_ms(); + + rocket.hour = gps.get_hour(); + rocket.min = gps.get_min(); + rocket.sec = gps.get_sec(); + rocket.lat = gps.get_lat(); + rocket.lon = gps.get_lon(); + rocket.sat = gps.get_sat(); + rocket.fix = gps.get_fix(); + rocket.hdop = gps.get_hdop(); + rocket.alt = gps.get_alt(); + rocket.geoid = gps.get_geoid(); + + adxl.read(rocket.high_accel); + + ina_in.read_voltage(&rocket.ina_in_v); + ina_in.read_current(&rocket.ina_in_i); + ina_ex.read_voltage(&rocket.ina_ex_v); + ina_ex.read_current(&rocket.ina_ex_i); + + lps.read_press(&rocket.press); + lps.read_temp(&rocket.temp); + + mpu.read_accel(rocket.accel); + mpu.read_gyro(rocket.gyro); + mpu.read_mag(rocket.mag); +} + +void command_handler(char *command) +{ + pc.printf("received:%x\r\n", command[0]); + switch(command[0]) { + case 0x01: + if(rocket.phase == WAIT) { + rocket.phase = SAFETY; + } + break; + + case 0x02: + if(rocket.phase == SAFETY) { + rocket.phase = WAIT; + } + break; + + case 0x03: + if(rocket.phase == WAIT) { + rocket.phase = FLIGHT; + } + break; + + case 0x04: + if(rocket.phase == FLIGHT) { + rocket.phase = SEP1; + } + break; + + case 0x05: + if(rocket.phase == SEP1) { + rocket.phase = SEP2; + } + break; + + case 0x06: + if(rocket.phase == SEP2) { + rocket.phase = RECOVERY; + } + break; + + default: + break; + } +} + +void downlink() +{ + //es.send(avio.byte, 128); +} + +void log() +{ + char data[128]; + memset(data, 0x00, 128); + memcpy(&data[0], &rocket.phase, 1); + memcpy(&data[1], (char*)&rocket.mission_timer_reset, 2); + memcpy(&data[3], (char*)&rocket.mission_time, 4); + memcpy(&data[7], (char*)&rocket.flight_timer_reset, 2); + memcpy(&data[9], (char*)&rocket.flight_time, 4); + memcpy(&data[13], (char*)&rocket.lat, 4); + memcpy(&data[17], (char*)&rocket.lon, 4); + memcpy(&data[21], (char*)&rocket.sat, 4); + memcpy(&data[25], (char*)&rocket.fix, 4); + memcpy(&data[29], (char*)&rocket.hdop, 4); + memcpy(&data[33], (char*)&rocket.alt, 4); + memcpy(&data[37], (char*)&rocket.geoid, 4); + memcpy(&data[41], (char*)&rocket.high_accel[0], 4); + memcpy(&data[45], (char*)&rocket.high_accel[1], 4); + memcpy(&data[49], (char*)&rocket.high_accel[2], 4); + memcpy(&data[53], (char*)&rocket.ina_in_v, 4); + memcpy(&data[57], (char*)&rocket.ina_in_i, 4); + memcpy(&data[61], (char*)&rocket.ina_ex_v, 4); + memcpy(&data[65], (char*)&rocket.ina_ex_i, 4); + memcpy(&data[69], (char*)&rocket.press, 4); + memcpy(&data[73], (char*)&rocket.temp, 4); + memcpy(&data[77], (char*)&rocket.accel[0], 4); + memcpy(&data[81], (char*)&rocket.accel[1], 4); + memcpy(&data[85], (char*)&rocket.accel[2], 4); + memcpy(&data[89], (char*)&rocket.gyro[0], 4); + memcpy(&data[93], (char*)&rocket.gyro[1], 4); + memcpy(&data[97], (char*)&rocket.gyro[2], 4); + memcpy(&data[101], (char*)&rocket.mag[0], 4); + memcpy(&data[105], (char*)&rocket.mag[1], 4); + memcpy(&data[109], (char*)&rocket.mag[2], 4); + + eeprom.write(addr, data, 128); + char test[] = {'A', 'V', 'I', 'O', '\r', '\n'}; + es.send(test, 7); + addr += 0x80; + /*for(int i = 0; i < 128 ; i++) { + pc.printf("%x ", data[i]); + }*/ + /*for(int i = 0; i < 128 ; i++) { + fprintf(fp, "%02x ", (int)data[i]); + }*/ + + fprintf(fp, "%d,%d,%d,", rocket.mission_time, rocket.flight_time, rocket.phase); + fprintf(fp, "%d,%d,%d,%d,%d,%d,%d,", rocket.f_sd, rocket.f_adxl, rocket.f_ina_in, rocket.f_ina_ex, rocket.f_lps, rocket.f_mpu, rocket.f_mpu_ak); + fprintf(fp, "%d,", flight_pin.read()); + fprintf(fp, "%d,%d,%.1f,%.6f,%.6f,%d,%d,%.2f,%.1f,%.1f,", rocket.hour, rocket.min, rocket.sec, rocket.lat, rocket.lon, rocket.sat, rocket.fix, rocket.hdop, rocket.alt, rocket.geoid); + fprintf(fp, "%.2f,%.2f,%.2f,", rocket.high_accel[0], rocket.high_accel[1], rocket.high_accel[2]); + fprintf(fp, "%.1f,%.1f,", rocket.press, rocket.temp); + fprintf(fp, "%.2f,%.2f,%.2f,%.2f,", rocket.ina_in_v, rocket.ina_in_i, rocket.ina_ex_v, rocket.ina_ex_i); + fprintf(fp, "%.1f,%.1f,%.1f,", rocket.accel[0], rocket.accel[1], rocket.accel[2]); + fprintf(fp, "%.1f,%.1f,%.1f,", rocket.gyro[0], rocket.gyro[1], rocket.gyro[2]); + fprintf(fp, "%.1f,%.1f,%.1f,", rocket.mag[0], rocket.mag[1], rocket.mag[2]); + fprintf(fp, "\r\n"); + + if(sd_timer.read_ms() >= 30 * 1000) { + sd_timer.reset(); + sd_timer.start(); + if(fp) { + fclose(fp); + fp = fopen("/sd/IZU2020_AVIONICS.txt", "a"); + } + } + //fwrite(data, sizeof(char), 128, fp); + +#if DEBUG + pc.printf("mission time: %d[sec]\r\n", rocket.mission_time); + pc.printf("flight time: %d[sec]\r\n", rocket.flight_time); + pc.printf("phase: %d\r\n", rocket.phase); + pc.printf("sd: %d\t\tadxl: %d\t\tina_in: %d\t\tina_ex: %d\r\n", rocket.f_sd, rocket.f_adxl, rocket.f_ina_in, rocket.f_ina_ex); + pc.printf("lps: %d\t\tmpu: %d\t\tmpu_ak: %d\r\n", rocket.f_lps, rocket.f_mpu, rocket.f_mpu_ak); + pc.printf("flight pin: %d\r\n\n", flight_pin.read()); + pc.printf("gps\tutc: %d:%d:%.1f\r\n", rocket.hour, rocket.min, rocket.sec); + pc.printf("\tlat:%.6f, lon:%.6f\r\n", rocket.lat, rocket.lon); + pc.printf("\tsat:%d, fix:%d\r\n", rocket.sat, rocket.fix); + pc.printf("\thdop:%.2f, alt:%.1f, geoid:%.1f\r\n\n", rocket.hdop, rocket.alt, rocket.geoid); + pc.printf("high_accel\tx:\t%.2f[G]\ty:\t%.2f[G]\tz:\t%.2f[G]\r\n\n", rocket.high_accel[0], rocket.high_accel[1], rocket.high_accel[2]); + pc.printf("press:\t%.1f[hPa]\ttemp:\t%.1f[C]\r\n\n", rocket.press, rocket.temp); + pc.printf("internal:\t%.2f[mV]\t%.2f[mA]\r\n", rocket.ina_in_v, rocket.ina_in_i); + pc.printf("external:\t%.2f[mV]\t%.2f[mA]\r\n\n", rocket.ina_ex_v, rocket.ina_ex_i); + pc.printf("accel\tx:\t%.1f[G]\t\ty:\t%.1f[G]\t\tz:\t%.1f[G]\r\n", rocket.accel[0], rocket.accel[1], rocket.accel[2]); + pc.printf("gyro\tx:\t%.1f[rad/s]\ty:\t%.1f[rad/s]\tz:\t%.1f[rad/s]\r\n", rocket.gyro[0], rocket.gyro[1], rocket.gyro[2]); + pc.printf("mag\tx:\t%.1f[H]\t\ty:\t%.1f[H]\t\tz:\t%.1f[H]\r\n\n", rocket.mag[0], rocket.mag[1], rocket.mag[2]); +#endif + +} \ No newline at end of file