
step3
Fork of mbed_main by
main.cpp
- Committer:
- Soyoon
- Date:
- 2016-07-27
- Revision:
- 2:9d0f979369cf
- Parent:
- 1:cd11c1c592c7
- Child:
- 3:e3e965924dde
File content as of revision 2:9d0f979369cf:
#include "mbed.h" #include "Barometer.h" #include "LocalFileSystem.h" #include "math.h" #include "Servo.h" Serial pc(USBTX, USBRX); Timer end; int stat=1; //////////////////////////////////// // GPS 5V p27(RX) // // Bluetooth 3.3V p28(TX) // //////////////////////////////////// Serial Blue_GPS(p28, p27); char GPS_msg[150], ns, ew; int i = 0, j=0, k=0, gps_ok=0, GPS_flag; volatile unsigned char GPS_buffer[2]; float fix,sat,x,longitude=0.0f,latitude=0.0f, alt_GPS=0,lock, Kor_time; void GPS_isr(){ i++; GPS_buffer[1] = GPS_buffer[0]; GPS_buffer[0] = Blue_GPS.getc(); if ((GPS_buffer[1]==13)&(GPS_buffer[0]==10)){ i=0; if (GPS_flag == 1){GPS_flag = 0;gps_ok = 1;j=0;} } if ((i==5)&(GPS_buffer[0] == 'G')){GPS_flag=1;} if (GPS_flag==1){GPS_msg[j]=GPS_buffer[0]; j++;} } float trunc(float v) { if(v < 0.0) { v*= -1.0; v = floor(v); v*=-1.0; } else {v = floor(v);} return v; } void get_GPS(float *Kor_time, float *latitude, char *ns, float *longitude, char *ew, float *fix, float *sat, float *x, float *alt_GPS, float *lock) { if (gps_ok == 1){ gps_ok = 0; sscanf(GPS_msg, "GA,%f,%f,%c,%f,%c,%f,%f,%f,%f,%f", Kor_time,latitude,ns,longitude,ew,fix,sat,x,alt_GPS,lock); if(*ns == 'S') {*latitude *= -1.0; } if(*ew == 'W') {*longitude *= -1.0; } float degrees = trunc(*latitude / 100.0f); float minutes = (*latitude - (degrees * 100.0f)); *latitude = degrees + minutes / 60.0f; degrees = trunc(*longitude / 100.0f); minutes = *longitude - (degrees * 100.0f); *longitude = degrees + minutes / 60.0f; *Kor_time = *Kor_time + 90000; } } //Bluetooth code is placed under the Log_data //////////////////////////////////////////// // Barometer 3.3V p9(SDA) p10(SCL) // //////////////////////////////////////////// Barometer barometer(p9, p10); float t, alt, del_alt; float alt_sum=0.0f, alt_zero=0.0f; int count = 0, baro_ok = 0; // for zero-calibration float alt_buffer[4], w_alt=0.4; // weight for LPF void get_Baro(float*t, float*alt) { if (baro_ok==1){ barometer.update(); *t = barometer.get_temperature(); *alt = barometer.get_altitude_m(); baro_ok = 0; } } void calb_alt(){ if (alt==0){} else { if (count<=99){alt_sum = alt_sum + alt; count++;} else { Blue_GPS.printf("calibration\r\n"); alt_zero = alt_sum / (float)count; count++; } } } void lpf_alt(){ alt_buffer[1] = alt_buffer[0]; alt_buffer[0] = alt; alt = w_alt*alt_buffer[1]+(1-w_alt)*alt_buffer[0]; // Low Pass Filter alt_buffer[3] = alt_buffer[2]; alt_buffer[2] = alt; del_alt = alt_buffer[3]-alt_buffer[2]; // for calculation of drop speed } /////////////////////////////////////// // AHRS 5V p14(RX) // 20Hz /////////////////////////////////////// Serial AHRS(p13, p14); float roll,pitch,yaw,accx,accy,accz; char AHRS_msg[150]; int m=0, ahrs_ok=0, AHRS_flag; volatile unsigned char AHRS_buffer[2]; float roll_buffer[2], pitch_buffer[2], yaw_buffer[2], w_attitude=0.8; void AHRS_isr(){ //inturupt while(AHRS.readable()){ AHRS_buffer[1] = AHRS_buffer[0]; AHRS_buffer[0] = AHRS.getc(); if (AHRS_buffer[0] == '\n' && AHRS_flag == 1){AHRS_flag = 0; ahrs_ok = 1; m=0;} if (AHRS_buffer[0] == '*'){AHRS_flag=1;} if (AHRS_flag==1){AHRS_msg[m] = AHRS_buffer[0]; m++;} } } void get_AHRS(float*roll, float*pitch, float*yaw, float*accx, float*accy, float*accz) { if (ahrs_ok == 1){ ahrs_ok = 0; sscanf(AHRS_msg, "*%f,%f,%f,%f,%f,%f\n", roll, pitch, yaw, accx, accy, accz); baro_ok = 1; } } void lpf_attitude(){ roll_buffer[1] = roll_buffer[0]; roll_buffer[0] = roll; roll = w_attitude*roll_buffer[1]+(1-w_attitude)*roll_buffer[0]; // Low Pass Filter pitch_buffer[1] = pitch_buffer[0]; pitch_buffer[0] = pitch; pitch = w_attitude*pitch_buffer[1]+(1-w_attitude)*pitch_buffer[0]; // Low Pass Filter yaw_buffer[1] = yaw_buffer[0]; yaw_buffer[0] = yaw; yaw = w_attitude*yaw_buffer[1]+(1-w_attitude)*yaw_buffer[0]; // Low Pass Filter } /////////////////////////////////// // Servo 5V PWM // /////////////////////////////////// Servo Micro_unf(p21); Servo Micro_gf(p22); Servo Linear(p23); float unf_value = 1.0, gf_value = 0.35, linear_value = 0.5; float tg_yaw = 0.0, err_yaw = 0.0, p=1.5; void ctl_gf(){ err_yaw = yaw - tg_yaw; gf_value = 0.35*exp(0.0039*p*err_yaw); if (err_yaw<0){gf_value = 0.7-0.35*exp(0.0039*p*(-err_yaw));} if (gf_value<=0.0){gf_value=0.0;} else if (gf_value>=0.7) {gf_value=0.7;} Micro_gf = gf_value; } /////////////////////////////////// // Checksum // /////////////////////////////////// long chksum; unsigned int checksum (int data, short message_length) { unsigned int sum = 10; /*for (i=0;i<=message_length; i++){ sum += data[i]; } sum = (sum & 0xff);*/ return (unsigned int)(~sum); } /* float data[15]; void packet_data(){ data[0] = stat; data[1] = Kor_time; data[2] = alt; data[3] = alt_GPS; data[4] = roll; data[5] = pitch; data[6] = yaw; data[7] = accz; data[8] = latitude; data[9] = longitude; data[10] = unf_value; data[11] = gf_value; data[12] = linear_value; data[13] = chksum; } */ /////////////////////////////// // Datalogger Mbed // /////////////////////////////// LocalFileSystem local("local"); int file_no=1; char filename[256]; FILE *fp; void Log_file(){ sprintf(filename, "/local/Data%d.txt", file_no); //save file name for writing fp = fopen(filename, "r"); // if file can be loaded, return is 1 while(fp){ fclose(fp); file_no ++; sprintf(filename, "/local/Data%d.txt", file_no); // Open "tem%d.txt" on the local file system for writing fp = fopen(filename, "r"); } fp = fopen(filename, "w"); } void Log_data(){ fprintf(fp, "%i,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n",stat,Kor_time,latitude,longitude,alt,alt_GPS,roll,pitch,yaw,accx,accy,accz,unf_value,gf_value,linear_value); } void send_Blue(){ Blue_GPS.printf("%i,%.2f,%.2f,%.2f,%.2f,%.2f,%.2,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n",stat,Kor_time,latitude,longitude,alt,alt_GPS,del_alt,roll,pitch,yaw,accx,accy,accz,unf_value,gf_value,linear_value); } ///////////////////////////////// // Main loop // ///////////////////////////////// int main(void) { AHRS.baud(9600); Blue_GPS.baud(9600); Blue_GPS.attach(&GPS_isr, Serial::RxIrq); AHRS.attach(&AHRS_isr, Serial::RxIrq); Micro_unf = unf_value; //Initial setting of servo pc.printf("Start\r\n"); while(1) { switch(stat){ case 1 : //Bluetooth connection and calibration get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); calb_alt(); lpf_attitude(); send_Blue(); Blue_GPS.printf("%i %f %f %f\r\n",count, alt, alt_sum, alt_zero); if (Kor_time!=0.0 && abs(accx)<0.1 && abs(accy)<0.1 && abs(accz)<0.1 && 101<=count){stat=2;} break; case 2 : //Waiting launch get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); lpf_attitude(); get_Baro(&t, &alt); alt = alt - alt_zero; send_Blue(); if (100.0<alt_GPS && del_alt>1){ stat=3; Log_file(); unf_value=0.0; Micro_unf = unf_value; wait(0.5); Micro_gf = gf_value; } break; case 3 : //Grid fin and landing leg spreading and control get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); Log_data(); lpf_alt(); alt = alt - alt_zero; lpf_attitude(); send_Blue(); if (alt<10){stat=4; Linear = linear_value;} // need to modify trigger break; case 4 : //Reverse thrust for soft landing get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); Log_data(); lpf_alt(); alt = alt - alt_zero; lpf_attitude(); send_Blue(); if (accx<0.1 && accy<0.1 && alt<3) {end.start(); stat=5;} break; case 5 : //Landing get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); Log_data(); lpf_alt(); alt = alt - alt_zero; lpf_attitude(); send_Blue(); end.read(); if (end.read()>=10) {fclose(fp); stat=6;} break; case 6 : //Shut down break; } } }