GPSセンサモジュールの動作確認プログラム

Dependents:   sample_GPS_GYSFDMAXB nucleo_sample_GPS_GYSFDMAXB sample_GPS_GYSFDMAXB_for_nucleo CanSat-C

Committer:
CanSat_C
Date:
Mon Jul 09 08:27:37 2018 +0000
Revision:
1:2046f20df896
Parent:
0:030ffb18f36d
latitude_md, longitude_md?double???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CanSat_C 0:030ffb18f36d 1 #include "mbed.h"
CanSat_C 0:030ffb18f36d 2 #include "getGPS.h"
CanSat_C 0:030ffb18f36d 3
CanSat_C 0:030ffb18f36d 4 GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
CanSat_C 0:030ffb18f36d 5 {
CanSat_C 0:030ffb18f36d 6 latitude = 0;
CanSat_C 0:030ffb18f36d 7 longitude = 0;
CanSat_C 0:030ffb18f36d 8 _gps.baud(GPSBAUD);
CanSat_C 0:030ffb18f36d 9 _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
CanSat_C 0:030ffb18f36d 10 }
CanSat_C 0:030ffb18f36d 11
CanSat_C 0:030ffb18f36d 12 bool GPS::getgps()
CanSat_C 0:030ffb18f36d 13 {
CanSat_C 0:030ffb18f36d 14 char gps_data[256];
CanSat_C 0:030ffb18f36d 15 int i;
CanSat_C 0:030ffb18f36d 16
CanSat_C 0:030ffb18f36d 17 do {
CanSat_C 0:030ffb18f36d 18 while(_gps.getc() != '$'); //$マークまで読み飛ばし
CanSat_C 0:030ffb18f36d 19 i = 0;
CanSat_C 0:030ffb18f36d 20
CanSat_C 0:030ffb18f36d 21 /* gpa_data初期化 */
CanSat_C 0:030ffb18f36d 22 for(int j = 0; j < 256; j++)
CanSat_C 0:030ffb18f36d 23 gps_data[j] = '\0';
CanSat_C 0:030ffb18f36d 24
CanSat_C 0:030ffb18f36d 25 /* NMEAから一行読み込み */
CanSat_C 0:030ffb18f36d 26 while((gps_data[i] = _gps.getc()) != '\r') {
CanSat_C 0:030ffb18f36d 27 i++;
CanSat_C 0:030ffb18f36d 28 if(i == 256) {
CanSat_C 0:030ffb18f36d 29 i = 255;
CanSat_C 0:030ffb18f36d 30 break;
CanSat_C 0:030ffb18f36d 31 }
CanSat_C 0:030ffb18f36d 32 }
CanSat_C 0:030ffb18f36d 33 } while(strstr(gps_data, "GPGGA") == NULL); //GGAセンテンスまで一行ずつ読み込み続ける
CanSat_C 0:030ffb18f36d 34
CanSat_C 0:030ffb18f36d 35 int rlock;
CanSat_C 0:030ffb18f36d 36 char ns,ew;
CanSat_C 0:030ffb18f36d 37 double w_time, raw_longitude, raw_latitude;
CanSat_C 0:030ffb18f36d 38 int satnum;
CanSat_C 0:030ffb18f36d 39 double hdop;
CanSat_C 0:030ffb18f36d 40
CanSat_C 0:030ffb18f36d 41 if(sscanf(gps_data, "GPGGA, %lf, %lf, %c, %lf, %c, %d, %d, %lf", &w_time, &raw_latitude, &ns, &raw_longitude, &ew, &rlock, &satnum, &hdop) > 1) {
CanSat_C 0:030ffb18f36d 42 /* 座標1(度部分) */
CanSat_C 0:030ffb18f36d 43 int latitude_dd = (int)(raw_latitude / 100);
CanSat_C 0:030ffb18f36d 44 int longitude_dd = (int)(raw_longitude / 100);
CanSat_C 0:030ffb18f36d 45
CanSat_C 0:030ffb18f36d 46 /* 座標2(分部分 → 度) */
CanSat_C 1:2046f20df896 47 double latitude_md = (raw_latitude - latitude_dd * 100) / 60;
CanSat_C 1:2046f20df896 48 double longitude_md = (raw_longitude - longitude_dd * 100) / 60;
CanSat_C 0:030ffb18f36d 49
CanSat_C 0:030ffb18f36d 50 /* 座標1 + 2 */
CanSat_C 0:030ffb18f36d 51 latitude = latitude_dd + latitude_md;
CanSat_C 0:030ffb18f36d 52 longitude = longitude_dd + longitude_md;
CanSat_C 0:030ffb18f36d 53
CanSat_C 0:030ffb18f36d 54 return true;
CanSat_C 0:030ffb18f36d 55 } else
CanSat_C 0:030ffb18f36d 56 return false; //GGAセンテンスの情報が欠けている時
CanSat_C 0:030ffb18f36d 57 }