SPRESENSEには、実はあまり使ってないのですけどGPSの機能があったります。しかも「みちびき」対応です。最近、Twitterで”みちびき”の災害危険情報を皆さんがデコードをするを見て、私も流行りに乗ってGPSを使ってみることにしました。





話は変わりますが、みちびき打上げ用ロゴって、エバンゲリオンの制作スタッフが作ったものなんですね。ブログに貼り付けたいなと思ったのですが、使用についてうるさいことが書いてあったのでやめておきました。


SPRESENSE の Arduino用のライブラリは、便利なAPIは用意しているのですが、GPSの解析アプリ等と連携しようとするとNMEA出力のほうが便利そうです。

そこで、SPRESENSEのGPSの出力を、Arduino を使ってNMEAで出力する方法を探してみました。参考にしたのは、Spresense公式サポートページと、SDKサンプルアプリの「gnss_atcmd」と、Arduino 用のGNSSライブラリの実装です。

いろいろ試行錯誤した結果、以下のスケッチでNMEAをコンソールに出力することができました!最初の情報取得でこけているのは謎ですが、出力ログもマスクを変更することで変更可能です。



#include &ltGNSS.h>
#include &ltGNSSPositionData.h>
#include &ltgpsutils/cxd56_gnss_nmea.h>

static SpGnss Gnss;
static GnssPositionData posdat;
static char nmea_buf[NMEA_SENTENCE_MAX_LEN];

/* output NMEA */
FAR static char *reqbuf(uint16_t size) {
return size > sizeof(nmea_buf) ? NULL : nmea_buf;
}

static void freebuf(FAR char *buf) {
// do nothing...
}

static int outnmea(FAR char *buf){
return Serial.println(buf);
}

static int outbin(FAR char *buf, uint32_t len) {
return len; // do nothing...
}


void setup() {

Serial.begin(115200);

Gnss.begin();
Gnss.select(GPS); Gnss.select(QZ_L1CA); Gnss.select(QZ_L1S);

/**
* Set NMEA sentence 32bit mask
* - Default value 0x000000ef.
* |bit |sentence|
* |:----:|:---:|
* |bit0|GGA|
* |bit1|GLL|
* |bit2|GSA|
* |bit3|GSV|
* |bit4|GNS|
* |bit5|RMC|
* |bit6|VTG|
* |bit7|ZDA|
* |bit14|QZQSM|
*/
uint32_t mask = 0x000040ff; // set the full mask
NMEA_OUTPUT_CB funcs;

NMEA_InitMask();
NMEA_SetMask(mask);
funcs.bufReq = reqbuf;
funcs.out = outnmea;
funcs.outBin = outbin;
funcs.bufFree = freebuf;
NMEA_RegistOutputFunc(&funcs);

Serial.println("NMEA initialized");

int ret = Gnss.start(COLD_START);
if (ret != 0) {
Serial.println("Gnss start error!");
while(1);
}
}

void loop() {
memset(&posdat, 0, sizeof(posdat));
Gnss.getPositionData((char*)&ampposdat);
NMEA_Output((struct cxd56_gnss_positiondata_s*)&(posdat.Data));
sleep(1);
}



出力はこんな感じです。詳しい緯度・経度は秘密です!( ー`дー´)


$GPGGA,143132.00,35xx.xxxx,N,139xx.xxxx,E,1,09,1.1,70.6,M,39.1,M,,*53

$GNGLL,35xx.xxxx,N,139xx.xxxx,E,143132.00,A,A*7B

$GNGSA,A,3,08,09,16,21,23,26,27,31,194,,,,1.8,1.1,1.5*1A

$GPGSV,3,1,11,04,15,305,,07,01,318,,08,34,239,31,09,18,293,25*7B

$GPGSV,3,2,11,16,62,015,26,21,32,058,26,23,25,263,28,26,51,067,28*70

$GPGSV,3,3,11,27,70,260,32,31,26,145,32,194,88,077,30,,,,*76

$QZGSV,1,1,01,02,88,077,30,,,,,,,,,,,,*55

$GNGNS,143132.00,35xx.xxxx,N,139xx.xxxx,E,AN,09,1.1,70.6,M,39.1,M,,*68

$GNRMC,143132.00,A,35xx.xxxx,N,139xx.xxxx,E,0.0,14.4,101119,,,A*74

$GNVTG,14.4,T,,M,0.0,N,0.0,K,A*22

$GNZDA,143132.00,10,11,2019,,*75





NMEAの出力の詳細は、次のページで確認できます。

GPSのNMEAフォーマット
https://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html


”みちびき”の情報はどうしたらええねん?と思っていたら、すでに”みちびき”の災危情報をデコードするためのライブラリを作られている猛者がいました。もちろんSPRESENSE用です。

みちびき災危通報をデコードしてみる
https://qiita.com/baggio/items/497b654cd4ec1bfd74fc


ただ私のコンソール出力に、$QZQSVって、みちびきっぽい出力は出ているけど、でもこれ災危情報の出力じゃないような。$QZQSMって出るときと出ないときがあるのか、そもそも設定出きていないのか?…悩む…。GPSの世界はまだまだ奥が深く難しいなぁ。
σ( ̄ε ̄ )