SSブログ

SPRESENSEでArduinoのスケッチでNMEAをシリアル出力してみた! [SPRESENSE]

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


DSC_0713.JPG


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


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の世界はまだまだ奥が深く難しいなぁ。
σ( ̄ε ̄ )







タグ:nmea GPS Spresense
nice!(28)  コメント(2) 
共通テーマ:趣味・カルチャー

nice! 28

コメント 2

まいく

中身には全くついていけませんが、興味深く拝読させて頂いています。
苦戦される分野もあるとのことで、何やら安心ですね。。^^;

by まいく (2019-11-12 10:09) 

ys_taro

まいくさん、コメントありがとうございます。
いえいえ、毎日苦戦ばかりです…。(泣
by ys_taro (2019-11-17 23:27) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。