「LTE-M Shield for Arduino」でGNSS(GPS)を利用する


LTE-M Shield for Arduino + GNSSアンテナ

LTE-M Shield for Arduino - IoTデバイス通販 - SORACOM (ソラコム) IoTストア

まえおき

仕様を見ると、別途モジュールを用意しなくても、GNSS(いわゆるGPS)が使える便利そうなモジュールだったので、ついポチってしまいました。

LTE通信に関しては、SORACOMの方でスタートアップガイドがあるので、それ通りにすればOKです。問題はGNSSです。

ArduinoでCANのテレメトリ with LTE-M Shield + SORACOM - 工場長のブログ (hatenablog.com)

と、上のリンク先のように、別途GNSS用のモジュールをつなげれば、簡単です。ただ、個人的に気になるところとして、

  1. さらに追加でGPSモジュール代2,000円はできれば遠慮したい

  2. せっかくGNSS標準で使えるのにもったいない

  3. GPSモジュール何気に5V駆動で電気食いそう

  4. 部品増えてスマートっぽくない

特に1と2は重要です。

GNSS情報取得するテスト

LTE通信はもちろんATコマンドで制御しますが、GNSSに関してもATコマンドで制御します。GNSS関連のコマンドはLTE通信関係とは別れてます
コマンドリファレンスはGoogle先生へ→「bg96 gnss pdf」

Quectel_BG96_GNSS_Application_Note_V1.2.pdf

ただ、1か月悩みました。
(数日に1回くらい思い出したように考える程度ですが…)
たどり着いた答えは「GNSSアンテナ付けて無いじゃん」です。
LTEアンテナつけて満足してました。

アンテナ

それで、SORACOM公式ブログを見てたら、別のジュールになるのですが、

GNSS 用アンテナは市販品の U.FL コネクタの GPS アンテナがご利用いただけます。ソラコムとしての推奨品はございませんが、パッシブ式 GPS アンテナでの受信は確認できています。用途や必要な感度に応じてご調達ください。

LTE Cat.1 対応モデム「EC21-J Mini PCIe」の GNSS 搭載モデルを販売開始

ということだったので、秋月電子で適当なパッシブタイプのアンテナ(Passive GPS Antenna uFL - 15mm x 15mm 1dBi gain)を購入。
変換ケーブルとコードが長いタイプをセットにしてもいいと思いましたが、「とりあえず」なのでシンプルなものに。

コードなど

(このあたりの、コピペして使えそうなサンプル無いですよね。。。)
「SORACOM Users スタートガイド」に掲載されている、このシールドのLTE通信のATコマンド実行部分を参考にしながら、GNSSのATコマンドサンプルを関数にうまくまとめてやります。
いろいろパラメータはありますが、マニュアルを見たところ、デフォルトでいい感じのパラメータが設定されてるので、ひとまず余計なことはしない方針で。

(ちなみに、コマンドのタイムアウトは300mですが、ちょっと長めに500mにしてます。)

~~~~~~
省略
~~~~~~
void gnssCommand() {
  String res;

  // 前回実行時に終了させてないかもしれないので念のため終了処理しておく
  res = executeAT(F("+QGPSEND"), 500);
  CONSOLE.println(res);
  delay(1000);

  // GNSS 開始
  res = executeAT(F("+QGPS=1"), 500);
  CONSOLE.println(res);
  delay(1000);

  // GNSS 受信のため適当に待機
  CONSOLE.println(F("( Wait 60sec... )"));
  for( int i=0; i<6; i++){ delay(1000*10); }

  // 10秒間隔で3分間GNSSデータ取得するテスト
  for( int i=0; i<18; i++){
    res = executeAT(F("+QGPSLOC?"), 500);
    CONSOLE.println(res); 
    delay(1000*10);
  }

  // GNSS 終了
  res = executeAT(F("+QGPSEND"), 500);
  CONSOLE.println(res);
  delay(1000);
}

void setup() {

~~~~~~
省略
~~~~~~

  CONSOLE.println();
  CONSOLE.println(F("--- Conntectivity test: Ping to pong.soracom.io..."));
  pingToSoracomNetwork();

  CONSOLE.println(F("--- Get GNSS data..."));
  gnssCommand();

  CONSOLE.println();
  CONSOLE.println(F("--- Execution completed, please write your own sketch and enjoy it."));
}
void loop() {

}

結果はこんな感じに。(QGPSLOCコマンド結果は編集してます)

いろいろ実験してみて感想

GNSSの設定をデフォルトで動かしてるので、明確に「AT+QGPS=1」で開始してやる必要があって、開始するまでGNSSの電波受信しにいかないようです。
ループの中に「AT+QGPS=1」(開始)と「AT+QGPSEND」(終了)を置いて、開始→終了→開始・・・みたいに繰り返すような処理にしてると、まともに受信しません。
と、個人的にハマったところはこのあたり。初めてなのでどうしても挙動がよくわからんかった。。。

おまけ

取得したGNSS座標の緯度経度をそのままコピペして、GoogleMapsに張り付けても、50~60㎞くらいずれた場所がポイントされます。
取得した値は60進数で、Google Mapsは10進数だからということらしいです。きちんと計算したら、誤差数mくらいでばっちりポイントされました。
緯度経度それぞれ、「度」はそのまま、「分」の値を60で除算して「度」との和をとるというのが正解のようです。

参考: https://www2.kaiyodai.ac.jp/~jtahar0/posts/activity9.html


いいなと思ったら応援しよう!