2017.11伊豆大島共同打ち上げ実験のデータ取得&保存&無線送信用プログラム

Dependencies:   BMP180 MPU6050 SDFileSystem mbed

Fork of 2017_11_1768 by kohei oikawa

Committer:
oichan
Date:
Fri Oct 20 03:53:03 2017 +0000
Revision:
2:0cf17bba70ec
Parent:
0:bdbd3d6fc5d5
Child:
3:71a45bae8a37
2017.11???????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:bdbd3d6fc5d5 1 #include "mbed.h"
oichan 2:0cf17bba70ec 2 #include "math.h"
oichan 2:0cf17bba70ec 3 #include "MPU6050.h"
oichan 2:0cf17bba70ec 4 #include "BMP180.h"
mbed_official 0:bdbd3d6fc5d5 5 #include "SDFileSystem.h"
oichan 2:0cf17bba70ec 6
oichan 2:0cf17bba70ec 7 #define RATE 20
oichan 2:0cf17bba70ec 8 #define MAX_JUDGE_TIME_s 3.0
oichan 2:0cf17bba70ec 9 #define p0 1013.25f
oichan 2:0cf17bba70ec 10
oichan 2:0cf17bba70ec 11 BMP180 bmp(p28,p27);
oichan 2:0cf17bba70ec 12 MPU6050 mpu(p28,p27);
oichan 2:0cf17bba70ec 13 Timer timer;
oichan 2:0cf17bba70ec 14 Timer alt_timer;
oichan 2:0cf17bba70ec 15 Ticker logtimer;
oichan 2:0cf17bba70ec 16 Serial pc(USBTX,USBRX);
oichan 2:0cf17bba70ec 17 Serial gps(p13,p14);
oichan 2:0cf17bba70ec 18 Serial twe(p9,p10);
oichan 2:0cf17bba70ec 19 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
oichan 2:0cf17bba70ec 20 LocalFileSystem local("local");
oichan 2:0cf17bba70ec 21 FILE *fp;
oichan 2:0cf17bba70ec 22
oichan 2:0cf17bba70ec 23 /* 自作関数 */
oichan 2:0cf17bba70ec 24 void _flight();
oichan 2:0cf17bba70ec 25 void _log();
oichan 2:0cf17bba70ec 26 float _getAlt(float press, float temp);
oichan 2:0cf17bba70ec 27 float _DMS2DEG(float raw_data);
oichan 2:0cf17bba70ec 28 float _median(float data[], int num);
oichan 2:0cf17bba70ec 29
oichan 2:0cf17bba70ec 30 /* グローバル変数 */
oichan 2:0cf17bba70ec 31 float a[3];
oichan 2:0cf17bba70ec 32 float Land_Alt;
oichan 2:0cf17bba70ec 33 float Max_Alt=0;
oichan 2:0cf17bba70ec 34 float Alt_buff[10];
oichan 2:0cf17bba70ec 35 float Pressure,Temperature,Altitude;
oichan 2:0cf17bba70ec 36 float Time;
oichan 2:0cf17bba70ec 37 char gps_data[256];
oichan 2:0cf17bba70ec 38 int cnt_gps;
oichan 2:0cf17bba70ec 39 int Log_cnt=0;
oichan 2:0cf17bba70ec 40
oichan 2:0cf17bba70ec 41
mbed_official 0:bdbd3d6fc5d5 42 int main() {
oichan 2:0cf17bba70ec 43 printf("Hello World!\n");
oichan 2:0cf17bba70ec 44 twe.baud(115200);
oichan 2:0cf17bba70ec 45 mpu.setAcceleroRange(0);
oichan 2:0cf17bba70ec 46 bmp.Initialize(64,BMP180_OSS_ULTRA_LOW_POWER);
mbed_official 0:bdbd3d6fc5d5 47 mkdir("/sd/mydir", 0777);
oichan 2:0cf17bba70ec 48
oichan 2:0cf17bba70ec 49 _flight();
oichan 2:0cf17bba70ec 50 }
oichan 2:0cf17bba70ec 51
oichan 2:0cf17bba70ec 52
oichan 2:0cf17bba70ec 53 /* フライトモード用関数 */
oichan 2:0cf17bba70ec 54 void _flight(){
oichan 2:0cf17bba70ec 55
oichan 2:0cf17bba70ec 56 /* 地上高度取得 */
oichan 2:0cf17bba70ec 57 for(int i=0;i<10;i++){
oichan 2:0cf17bba70ec 58 bmp.ReadData(&Temperature,&Pressure);
oichan 2:0cf17bba70ec 59 Alt_buff[i] = _getAlt(Pressure,Temperature);
oichan 2:0cf17bba70ec 60 }
oichan 2:0cf17bba70ec 61 Land_Alt = _median(Alt_buff,10);
oichan 2:0cf17bba70ec 62 FILE *lfp = fopen("/local/alt.txt","a");
oichan 2:0cf17bba70ec 63 fprintf(lfp,"地上高度:%f\r\n",Land_Alt);
oichan 2:0cf17bba70ec 64 fclose(lfp);
oichan 2:0cf17bba70ec 65 for(int i=0;i<10;i++)pc.printf("%f\n\r",Alt_buff[i]);
mbed_official 0:bdbd3d6fc5d5 66
oichan 2:0cf17bba70ec 67 /* データ取得開始 */
oichan 2:0cf17bba70ec 68 timer.start();
oichan 2:0cf17bba70ec 69 logtimer.attach(_log,1.0/RATE);
oichan 2:0cf17bba70ec 70 alt_timer.start();
oichan 2:0cf17bba70ec 71
oichan 2:0cf17bba70ec 72 /* GPS取得&送信 */
oichan 2:0cf17bba70ec 73 while(1){
oichan 2:0cf17bba70ec 74 gps_data[cnt_gps] = gps.getc();
oichan 2:0cf17bba70ec 75 if(gps_data[cnt_gps] == '$' || cnt_gps ==256){
oichan 2:0cf17bba70ec 76 cnt_gps = 0;
oichan 2:0cf17bba70ec 77 memset(gps_data,'\0',256);
oichan 2:0cf17bba70ec 78 }else if(gps_data[cnt_gps] == '\r'){
oichan 2:0cf17bba70ec 79 float world_time, lon_east, lat_north;
oichan 2:0cf17bba70ec 80 int rlock, sat_num;
oichan 2:0cf17bba70ec 81 char lat,lon;
oichan 2:0cf17bba70ec 82 if(sscanf(gps_data,"GPGGA,%f,%f,%c,%f,%c,%d,%d",&world_time,&lat_north,&lat,&lon_east,&lon,&rlock,&sat_num)>=1){
oichan 2:0cf17bba70ec 83 if(rlock==1){
oichan 2:0cf17bba70ec 84 lat_north = _DMS2DEG(lat_north);
oichan 2:0cf17bba70ec 85 lon_east = _DMS2DEG(lon_east);
oichan 2:0cf17bba70ec 86 twe.printf("max altitude:%f\r\n",Max_Alt);
oichan 2:0cf17bba70ec 87 twe.printf("%s\r\n",gps_data);
oichan 2:0cf17bba70ec 88 twe.printf("Lat:%f,Lon:%f\r\ntime:%f,sat_num:%d\r\n",lat_north,lon_east,world_time,sat_num);
oichan 2:0cf17bba70ec 89 }else{
oichan 2:0cf17bba70ec 90 twe.printf("max altitude:%f\r\n",Max_Alt);
oichan 2:0cf17bba70ec 91 twe.printf("%s\r\n",gps_data);
oichan 2:0cf17bba70ec 92 }
oichan 2:0cf17bba70ec 93 }
oichan 2:0cf17bba70ec 94 }else{
oichan 2:0cf17bba70ec 95 cnt_gps++;
oichan 2:0cf17bba70ec 96 }
oichan 2:0cf17bba70ec 97 }
oichan 2:0cf17bba70ec 98 }
oichan 2:0cf17bba70ec 99
oichan 2:0cf17bba70ec 100
oichan 2:0cf17bba70ec 101 /* データ取得&保存関数 */
oichan 2:0cf17bba70ec 102 void _log(){
oichan 2:0cf17bba70ec 103 Time = timer.read();
oichan 2:0cf17bba70ec 104 mpu.getAccelero(a);
oichan 2:0cf17bba70ec 105 bmp.ReadData(&Temperature,&Pressure);
oichan 2:0cf17bba70ec 106 Altitude = _getAlt(Pressure,Temperature);
oichan 2:0cf17bba70ec 107 if(Altitude > Max_Alt){
oichan 2:0cf17bba70ec 108 Max_Alt = Altitude;
oichan 2:0cf17bba70ec 109 alt_timer.reset();
mbed_official 0:bdbd3d6fc5d5 110 }
oichan 2:0cf17bba70ec 111 if(alt_timer.read() > MAX_JUDGE_TIME_s){
oichan 2:0cf17bba70ec 112 alt_timer.reset();
oichan 2:0cf17bba70ec 113 alt_timer.stop();
oichan 2:0cf17bba70ec 114 FILE *lfp = fopen("/local/alt.txt","a");
oichan 2:0cf17bba70ec 115 fprintf(lfp,"最高高度:%f\r\n",Max_Alt);
oichan 2:0cf17bba70ec 116 fclose(lfp);
oichan 2:0cf17bba70ec 117 }
oichan 2:0cf17bba70ec 118 if(Log_cnt==0) {
oichan 2:0cf17bba70ec 119 fp = fopen("/sd/mydir/sdtest.txt", "a");
oichan 2:0cf17bba70ec 120 }
oichan 2:0cf17bba70ec 121 fprintf(fp, "%f, %f, %f, %f, %f, %f, %f \r\n",Time, Temperature, Pressure, Altitude, a[0],a[1],a[2]);
oichan 2:0cf17bba70ec 122 Log_cnt++;
oichan 2:0cf17bba70ec 123 if(Log_cnt==RATE){
oichan 2:0cf17bba70ec 124 fclose(fp);
oichan 2:0cf17bba70ec 125 Log_cnt = 0;
oichan 2:0cf17bba70ec 126 }
oichan 2:0cf17bba70ec 127 pc.printf("%f, %f, %f, %f, %f, %f, %f \r\n",Time, Temperature, Pressure, Altitude, a[0],a[1],a[2]);
oichan 2:0cf17bba70ec 128 }
oichan 2:0cf17bba70ec 129
oichan 2:0cf17bba70ec 130
oichan 2:0cf17bba70ec 131 /* 高度計算関数 */
oichan 2:0cf17bba70ec 132 float _getAlt(float press, float temp){
oichan 2:0cf17bba70ec 133 return (pow((p0/press), (1.0f/5.257f))-1.0f)*(temp+273.15f)/0.0065f;
mbed_official 0:bdbd3d6fc5d5 134 }
oichan 2:0cf17bba70ec 135
oichan 2:0cf17bba70ec 136
oichan 2:0cf17bba70ec 137 float _DMS2DEG(float raw_data){
oichan 2:0cf17bba70ec 138 int d = (int)(raw_data/100);
oichan 2:0cf17bba70ec 139 float m = (raw_data - (float)d*100);
oichan 2:0cf17bba70ec 140 return (float)d + m/60;
oichan 2:0cf17bba70ec 141 }
oichan 2:0cf17bba70ec 142
oichan 2:0cf17bba70ec 143
oichan 2:0cf17bba70ec 144 /* 中央値計算関数 */
oichan 2:0cf17bba70ec 145 float _median(float data[], int num){//todo:処理時間計測
oichan 2:0cf17bba70ec 146 float *data_cpy, ans;
oichan 2:0cf17bba70ec 147 data_cpy = new float[num];
oichan 2:0cf17bba70ec 148 memcpy(data_cpy,data,sizeof(float)*num);
oichan 2:0cf17bba70ec 149
oichan 2:0cf17bba70ec 150 for(int i=0; i<num; i++){
oichan 2:0cf17bba70ec 151 for(int j=0; j<num-i-1; j++){
oichan 2:0cf17bba70ec 152 if(data_cpy[j]>data_cpy[j+1]){
oichan 2:0cf17bba70ec 153 float buff = data_cpy[j+1];
oichan 2:0cf17bba70ec 154 data_cpy[j+1] = data_cpy[j];
oichan 2:0cf17bba70ec 155 data_cpy[j] = buff;
oichan 2:0cf17bba70ec 156 }
oichan 2:0cf17bba70ec 157 }
oichan 2:0cf17bba70ec 158 }
oichan 2:0cf17bba70ec 159
oichan 2:0cf17bba70ec 160 if(num%2!=0) ans = data_cpy[num/2];
oichan 2:0cf17bba70ec 161 else ans = (data_cpy[num/2-1]+data_cpy[num/2])/2.0;
oichan 2:0cf17bba70ec 162 delete[] data_cpy;
oichan 2:0cf17bba70ec 163 return ans;
oichan 2:0cf17bba70ec 164 }