GPS,LPC,xbee
Dependencies: mbed LPS25HB_I2C
main.cpp
- Committer:
- kosukesuzuki
- Date:
- 21 months ago
- Revision:
- 0:f20bcf1efbc2
File content as of revision 0:f20bcf1efbc2:
#include "mbed.h" //#include "" //SDcardで使用 #include "LPS.h" //気圧で使用 #include "math.h" //GPSで使用 Serial xbee(PA_9, PA_10); //xbee pin Serial gps(PA_9,PA_10); //GPS後で変える Serial pc(USBRX,USBTX); //衛星側のpin I2C i2c(D0,D1); //気圧 pin LPS ps(i2c); Timer t; //時間を定義 const float dt = 1; //wait_us(dt)で使用:データの間隔 int i; //回数カウント用 float data1[10]; //気圧の較正用データ float sum = 0; //合計値(初期化) float ave; //気圧の標高平均 //データ格納 //気圧センサ float dataPa[10]; //気圧 圧力 float dataAl[10]; //気圧 標高 float dataTe[10]; //気圧 温度 //GPSセンサ float dataLat[10]; //GSP 緯度 float dataLon[10]; //GPS 経度 float dataH[10]; //GPS ジオイド高さ //GPS Timer timer_open; Timer timer_log; Ticker tic_open; Ticker tic_log; float _DMS2DEG(float raw_data); int _imput(char cha); float Time; char gps_data[256]; int cnt_gps; int Cnt_GPS=0; int main() { //1 pc.printf("settig start\r\n"); xbee.printf("settig start\r\n"); /**************************************************************/ //ここに気圧の標高の較正とGPSの接続を行う。 //気圧(所要時間約20秒) if (!ps.init()){ //2 printf("Failed to autodetect pressure sensor!\r\n"); while (1); } //2 ps.enableDefault(); for(i=0;i<10;i++){ //2 float pressure = ps.readPressureMillibars(); float altitude = ps.pressureToAltitudeMeters(pressure); float temperature = ps.readTemperatureC(); wait(1); } //2 for(i=0;i<10;i++){ //2 float pressure = ps.readPressureMillibars(); float altitude = ps.pressureToAltitudeMeters(pressure); data1[i] = altitude; sum = sum + data1[i]; wait(1); } //2 ave = sum/10; xbee.printf("0 altitude = %f\r\n",ave); //GPS while(1){ //2 if(gps.readable()){ //3 gps_data[cnt_gps]=gps.getc(); if(gps_data[cnt_gps]=='$' || cnt_gps==256){ //4 cnt_gps=0; memset(gps_data,'\0',256); }else if (gps_data[cnt_gps]=='\r'){ //4 float world_time, lon_east, lat_north; int rlock, sat_num; char lat,lon; if(sscanf(gps_data,"GPGGA,%f,%f,%c,%f,%c,%d,%d",&world_time,&lat_north,&lat,&lon_east,&lon,&rlock,&sat_num)>=1){ //5 if(rlock==1){ //6 lat_north=_DMS2DEG(lat_north); lon_east=_DMS2DEG(lon_east); //printf("Lat:%f,Lon:%f\r\ntime:%f,sat_num:%d\r\n", //lat_north,lon_east,world_time,sat_num); /*******************************/ goto lav; /*******************************/ }else{//6 //printf("%s\r\n",gps_data); } //6 } //5 }else{ //4 cnt_gps++; } //4 }//3 if(timer_log.read()>=30.0*60.0) timer_log.reset(); }//2 lav: //goto lav;より /**************************************************************/ //準備完了 pc.printf("Ok\r\n"); xbee.printf("Ok\r\n"); for (;;) { //2 //if (pc.readable()) xbee.putc(pc.getc()); if (xbee.readable()) pc.putc(xbee.getc()); wait_us(1); char cmd1 = xbee.getc(); //↓↓↓継続してGPSをとるため if(gps.readable()){ //3 gps_data[cnt_gps]=gps.getc(); if(gps_data[cnt_gps]=='$' || cnt_gps==256){ //4 cnt_gps=0; memset(gps_data,'\0',256); }else if (gps_data[cnt_gps]=='\r'){ //4 float world_time, lon_east, lat_north; int rlock, sat_num; char lat,lon; if(sscanf(gps_data,"GPGGA,%f,%f,%c,%f,%c,%d,%d",&world_time,&lat_north,&lat,&lon_east,&lon,&rlock,&sat_num)>=1){ //5 if(rlock==1){ //6 lat_north=_DMS2DEG(lat_north); lon_east=_DMS2DEG(lon_east); //printf("Lat:%f,Lon:%f\r\ntime:%f,sat_num:%d\r\n",lat_north,lon_east,world_time,sat_num); }else{ //6 //printf("%s\r\n",gps_data); } //6 } //5 }else{ //4 cnt_gps++; } //3 if(timer_log.read()>=30.0*60.0) timer_log.reset(); } //2 //機体の放出後→データを取る if(cmd1 == 'm'){ //3 pc.printf("start\r\n"); t.start(); cmd1 = 0; while(1){ //4 //if (pc.readable()) xbee.putc(pc.getc()); if (xbee.readable()) pc.putc(xbee.getc()); wait_us(1); char cmd2 = xbee.getc(); /***********************************************************/ //データ(気圧,GPS,地磁気)を取る。 //データの保存を10回行い, 保存する。 for(i=0;i<10;i++){ //データ10回とる //5 if(gps.readable()){ //6 gps_data[cnt_gps]=gps.getc(); if(gps_data[cnt_gps]=='$' || cnt_gps==256){ //7 cnt_gps=0; memset(gps_data,'\0',256); }else if (gps_data[cnt_gps]=='\r'){ //7 float world_time, lon_east, lat_north, rate, sea_level, g_h; //rate 水平精度低下率 sea_level アンテナ海抜高さ g_h ジオイド高さ char lat,lon,sea,h; int rlock, sat_num; if(sscanf(gps_data,"GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f,%c",&world_time,&lat_north,&lat,&lon_east,&lon,&rlock,&sat_num, &rate,&sea_level,&sea,&g_h,&h)>=1){ //8 if(rlock==1){ //9 lat_north=_DMS2DEG(lat_north); lon_east=_DMS2DEG(lon_east); //printf("Lat:%f,Lon:%f\r\ntime:%f,sat_num:%d g_h%f\r\n",lat_north,lon_east,world_time,sat_num,g_h); dataLat[i] = lat_north; dataLon[i] = lon_east; dataH[i] = g_h; }else{ //9 //printf("%s\r\n",gps_data); dataLat[i] = 0; dataLon[i] = 0; dataH[i] = 0; } //9 } //8 }else{ //7 cnt_gps++; } //7 } //6 if(timer_log.read()>=30.0*60.0) timer_log.reset(); //GPS float pressure = ps.readPressureMillibars(); float altitude = ps.pressureToAltitudeMeters(pressure); float temperature = ps.readTemperatureC(); dataPa[i] = pressure; dataAl[i] = altitude; dataTe[i] = temperature; wait_us(dt); } //5 //ここで保存と表示する for(i=0;i<10;i++){ //5 xbee.printf("time = %f, Lat,Lon %f,%f gH = %f, Pa = %f, Al = %f, Te = %f\r\n",t.read(),dataLat[i],dataLon[i],dataH[i],dataPa[i],dataAl[i],dataTe[i]); } //5 /***********************************************************/ //機体の着陸後→プログラムを終わらす。 if(cmd2 == 'n'){ //5 pc.printf("end\r\n"); xbee.printf("ned\r\n"); pc.printf("time = %f",t.read()); xbee.printf("time = %f",t.read()); t.stop(); cmd2 = 0; return 0; } //5 } //4 } //3 } //2 } //1 float _DMS2DEG(float raw_data){//GPSで使用 //1 float bb = raw_data/100; int d=(int)bb; float m=(raw_data-(float)d*100); return (float)d+m/60; } //1