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-19
- Revision:
- 1:cd11c1c592c7
- Parent:
- 0:6ac6b2d2bf1a
- Child:
- 2:9d0f979369cf
File content as of revision 1:cd11c1c592c7:
#include "mbed.h" #include "Barometer.h" #include "Ultrasonic.h" #include "LocalFileSystem.h" #include "math.h" Serial pc(USBTX, USBRX); int data[14]; int stat=1; //////////////////////////////////// // GPS 5V p27(RX) // // Bluetooth 3.3V p28(TX) // //////////////////////////////////// Serial Blue_GPS(p28, p27); char msg[150], ns, ew; int i = 0, j=0, gps_ok=0, 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 (flag == 1){flag = 0;gps_ok = 1;j=0;} } if ((i==5)&(GPS_buffer[0] == 'G')){flag=1;} if (flag==1){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(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; } } /////////////////////////////////////// // AHRS 5V p14(RX) // /////////////////////////////////////// Serial AHRS(p13, p14); float roll,pitch,yaw,accx,accy,accz; float t, alt; void get_AHRS(float*roll, float*pitch, float*yaw, float*accx, float*accy, float*accz) { while(AHRS.getc() != '\n'); AHRS.scanf("*%f,%f,%f,%f,%f,%f \n", roll, pitch, yaw, accx, accy, accz); } //////////////////////////////////////////// // Barometer 3.3V p9(SDA) p10(SCL) // //////////////////////////////////////////// Barometer barometer(p9, p10); float alt_sum=0.0f, alt_zero=0.0f, alt_avg=0.0f; // for zero-calibration float alt_buffer[5]; int count = 0; void get_Baro(float*t, float*alt) { barometer.update(); *t = barometer.get_temperature(); *alt = barometer.get_altitude_m(); } void Baro_zero(){ if (count<=4){ alt_sum = alt_sum + alt; count++; } else { pc.printf("calibration\r\n"); alt_zero = alt_sum / (float)count ; } } /* void Baro_check(){ alt_buffer[0] = alt; for(i=0;i<=3;i++) {alt_buffer[i+1] = alt_buffer[i]; } //Save in 5 buffers del_alt = alt_min - alt_max; } */ /////////////////////////////////// // Servo 5V PWM // /////////////////////////////////// PwmOut Linear(p21); PwmOut Micro_gf(p22); PwmOut Micro_unf(p23); /////////////////////////////////// // 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); } void packet_data(){ data[0] = stat; data[1] = Kor_time; data[2] = (int)(alt*100); data[3] = (int)(alt_GPS*100); data[4] = (int)(roll*100); data[5] = (int)(pitch*100); data[6] = (int)(yaw*100); data[7] = (int)(accz*100); data[8] = (int)(latitude*100); data[9] = (int)(longitude*100); data[10] = Micro_unf*100; data[11] = Micro_gf*100; data[12] = Linear*100; data[13] = chksum; } /////////////////////////////// // Datalogger Mbed // /////////////////////////////// LocalFileSystem local("local"); int num=0; FILE *fp; void Log_data(){ FILE *fp = fopen("/local/data.txt", "w"); for (num=0;num<=13;num++) {fprintf(fp, "%i ",data[num]);} num=0; fprintf(fp, "\r\n"); } int main(void) { wait(10); AHRS.baud(9600); Blue_GPS.baud(9600); Blue_GPS.attach(&GPS_isr, Serial::RxIrq); Linear.period(0.01); Micro_gf.period(0.01); Micro_unf.period(0.01); Linear=0.19; Micro_unf=0.2; Micro_gf=0.2;//Initial setting of servo //Linear=0.1;wait(1);Take back 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); Baro_zero(); packet_data(); //Log_data(); pc.printf("%i %f %f %f\r\n",count, alt, alt_sum, alt_zero); //if (Kor_time!=0 && abs(accx)<0.1 && abs(accy)<0.1 && abs(accz)<0.1 && 101<=count){stat=2;} if (5<=count){Baro_zero(); pc.printf("%i %f %f %f\r\n",count, alt, alt_sum, alt_zero); stat=2;} break; case 2 : //Waiting launch get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); alt = alt - alt_zero; get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); packet_data(); pc.printf("%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i\r\n",data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13]); if (100.0<alt_GPS && accz<0){stat=3;} break; case 3 : //Grid fin and landing leg spreading and control get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); alt = alt - alt_zero; get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); packet_data(); if (alt<3){stat=4;} break; case 4 : //Reverse thrust for soft landing get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); alt = alt - alt_zero; get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); packet_data(); if (accx<0.1 && accy<0.1 && accz<0.1) {stat=5;} break; case 5 : //Landing get_AHRS(&roll,&pitch,&yaw,&accx,&accy,&accz); get_Baro(&t, &alt); alt = alt - alt_zero; get_GPS(&Kor_time,&latitude,&ns,&longitude,&ew,&fix,&sat,&x,&alt_GPS,&lock); packet_data(); break; } } }