SPRESENSEでArduinoのスケッチでNMEAをシリアル出力してみた! [SPRESENSE]
SPRESENSEには、実はあまり使ってないのですけどGPSの機能があったります。しかも「みちびき」対応です。最近、Twitterで”みちびき”の災害危険情報を皆さんがデコードをするを見て、私も流行りに乗ってGPSを使ってみることにしました。
話は変わりますが、みちびき打上げ用ロゴって、エバンゲリオンの制作スタッフが作ったものなんですね。ブログに貼り付けたいなと思ったのですが、使用についてうるさいことが書いてあったのでやめておきました。
SPRESENSE の Arduino用のライブラリは、便利なAPIは用意しているのですが、GPSの解析アプリ等と連携しようとするとNMEA出力のほうが便利そうです。
そこで、SPRESENSEのGPSの出力を、Arduino を使ってNMEAで出力する方法を探してみました。参考にしたのは、Spresense公式サポートページと、SDKサンプルアプリの「gnss_atcmd」と、Arduino 用のGNSSライブラリの実装です。
いろいろ試行錯誤した結果、以下のスケッチでNMEAをコンソールに出力することができました!最初の情報取得でこけているのは謎ですが、出力ログもマスクを変更することで変更可能です。
出力はこんな感じです。詳しい緯度・経度は秘密です!( ー`дー´)
NMEAの出力の詳細は、次のページで確認できます。
GPSのNMEAフォーマット
https://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html
”みちびき”の情報はどうしたらええねん?と思っていたら、すでに”みちびき”の災危情報をデコードするためのライブラリを作られている猛者がいました。もちろんSPRESENSE用です。
みちびき災危通報をデコードしてみる
https://qiita.com/baggio/items/497b654cd4ec1bfd74fc
ただ私のコンソール出力に、$QZQSVって、みちびきっぽい出力は出ているけど、でもこれ災危情報の出力じゃないような。$QZQSMって出るときと出ないときがあるのか、そもそも設定出きていないのか?…悩む…。GPSの世界はまだまだ奥が深く難しいなぁ。
σ( ̄ε ̄ )
話は変わりますが、みちびき打上げ用ロゴって、エバンゲリオンの制作スタッフが作ったものなんですね。ブログに貼り付けたいなと思ったのですが、使用についてうるさいことが書いてあったのでやめておきました。
SPRESENSE の Arduino用のライブラリは、便利なAPIは用意しているのですが、GPSの解析アプリ等と連携しようとするとNMEA出力のほうが便利そうです。
そこで、SPRESENSEのGPSの出力を、Arduino を使ってNMEAで出力する方法を探してみました。参考にしたのは、Spresense公式サポートページと、SDKサンプルアプリの「gnss_atcmd」と、Arduino 用のGNSSライブラリの実装です。
いろいろ試行錯誤した結果、以下のスケッチでNMEAをコンソールに出力することができました!最初の情報取得でこけているのは謎ですが、出力ログもマスクを変更することで変更可能です。
#include <GNSS.h> #include <GNSSPositionData.h> #include <gpsutils/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*)&posdat); 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の世界はまだまだ奥が深く難しいなぁ。
σ( ̄ε ̄ )
中身には全くついていけませんが、興味深く拝読させて頂いています。
苦戦される分野もあるとのことで、何やら安心ですね。。^^;
by まいく (2019-11-12 10:09)
まいくさん、コメントありがとうございます。
いえいえ、毎日苦戦ばかりです…。(泣
by ys_taro (2019-11-17 23:27)