「LTE-M Shield for Arduino」でGNSS(GPS)を利用する
LTE-M Shield for Arduino - IoTデバイス通販 - SORACOM (ソラコム) IoTストア
まえおき
仕様を見ると、別途モジュールを用意しなくても、GNSS(いわゆるGPS)が使える便利そうなモジュールだったので、ついポチってしまいました。
LTE通信に関しては、SORACOMの方でスタートアップガイドがあるので、それ通りにすればOKです。問題はGNSSです。
ArduinoでCANのテレメトリ with LTE-M Shield + SORACOM - 工場長のブログ (hatenablog.com)
と、上のリンク先のように、別途GNSS用のモジュールをつなげれば、簡単です。ただ、個人的に気になるところとして、
さらに追加でGPSモジュール代2,000円はできれば遠慮したい
せっかくGNSS標準で使えるのにもったいない
GPSモジュール何気に5V駆動で電気食いそう
部品増えてスマートっぽくない
特に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公式ブログを見てたら、別のジュールになるのですが、
ということだったので、秋月電子で適当なパッシブタイプのアンテナ(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