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