今回のテーマはGPS(Global Positioning System)です。日本語だと「衛星測位システム」でしょうか。表題は英語の直訳です。
今回購入したのは、u-blox社のNEO-6Mを搭載した、以下図の様なGPSモジュールです。
届いてみたら、思いのほか小さくてビックリしました。でも確かに、今時のコンパクトなスマホにだって搭載されているのだし、そりゃ小さいですよね。そう言う意味で改めて眺めてみると、スマホなどに搭載するには逆に、上写真のアンテナは大きすぎます。
スマホには、もっと小さいアンテナが載っているのでしょう。Amazonで、もっと小さいアンテナがセットになった商品も見かけましたし……。
ボード上には、降圧レギュレータやEEPROM、ボタン電池等が見えます。
NEO-6Mに関する情報を検索しておきましょう。
NEO-6Mデータシート検索(別ウインドウが開きます)
NEO-6Mのハードウェアとしてのデータシートと、NEO-6Mに書き込まれたファームウェアのデータシートが見つかるはずです。以下にハードウェアとしての特徴を記します。ただ、この先必要なのはファームウェアのデータシートなので、そちらを探してみてください。
NEO-6M特徴:
UARTでハンドリングできるのは、お手軽で歓迎です。
今の段階だと「多分」、なのですが、UARTを接続したら自動的かつ定期的に、測位データを送信してくるのではなかろうか?と考えています。と言うのもデータシートなど見る限り、こちらから送信するコマンドなどがほとんど見当たらないのです。
勿論、一部、パラメータの設定コマンドなどは存在します。ただ、何をどう設定すると何が変わるのか、理解不能な専門用語の羅列なので、デフォルト設定のままで使おうと思っています。それに、一度設定すれば不揮発メモリ(24C32)に書き込まれるため、毎回、設定変更するためのコマンドを送信する必要は、ありません。
今回実験してみて、もし、上に予想した通りなら、こちらからのUART送信信号は使わなくて良いはずです。データシートには、「UARTのNEO-6M側受信端子RXを使用しない場合、開放して構わない(Leave open if not used.)」と記載されていました。
u-blox社のHPへ行くと、NEO-6Mシリーズを制御するためのWindowsソフトウェアu-centerをダウンロードすることができます。
u-blox社公式HP(別ウインドウが開きます)
u-centerをダウンロードして、インストールしておきましょう。
肝心な位置情報や標高値などの表示の他、衛星探索状況やフィックス状態などをグラフィカルに表示してくれます。何か、NEO-6Mの動作設定を変更したくなった場合にも、役に立つはずです。
今回のお買い物は以下の通りです。
安っ(1^^;)。Amazon発送の中華ショップで、こちらのI2C EEPROMモジュールなどと一緒に購入しました。同時購入した商品の合計3,500円以上で配送料無料でした。
購入ページでは届くまでの日数が約2週間と表示されていたのですが、8日後に届きました。Amazon発送の商品だったので日本国内から発送してくるのだけど、この商品だけ、ちょっと納期が長めでした。理由は不明です。急いでいなかったので、問題なしです。
GPSモジュールとの通信インターフェイスはUARTですので、USB⇔UART変換モジュール(FTDI等)とGPSモジュールを以下接続表に従って接続してください。
USB⇔UART変換 モジュール(FTDI等) |
接続 | GPSモジュール |
VCC(※) | → | VCC |
GND | ⇔ | GND |
RXD | ← | TX |
TXD | → | RX |
※FTDIの電圧ジャンパは3.3V側に設定。
なお、GPSモジュールへコマンドを送信しない場合、「TXD → RX」を接続せず、GPSモジュールのRX端子を開放しておくことが可能です(以下の実験では、コマンド送信は使いませんでした)。
以下図に、実験中の様子を示します。
PCでTera Term等の通信ソフトウェアを起動して9,600baudに設定しましょう。FTDIと接続すると案の定、GPSモジュールから自動的にデータが送られてきました。送信間隔は1s程でした。
実験サンプル:GPSモジュールからの受信データ
$GPRMC,hhmmss.00,V,,,,,,,ddmmyy,,,N*70
$GPVTG,,,,,,,,,N*30
$GPGGA,hhmmss.00,,,,,0,00,99.99,,,,,,*61
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGLL,,,,,hhmmss.00,V,N*4D
:
: (繰り返し)
:
電源を供給して、UARTのデータを受信するだけなので、完全に受け身ですね。楽チンで良いです。
GPS用語で、衛星の探索が終わり、測位可能な状態になることをフィックスと言う様です。最初に電源を入れると衛星を探し始めるので、屋根の無い屋外か窓辺、ベランダなどにアンテナを設置して、フィックス(衛星情報確定)するまで暫し待ちます。
この時、衛星探索状況などをグラフィカルに表示してくれるため、Tera Termではなくu-centerでモニタしながら待機しました(以下、衛星探索中のサブウインドウ)。
筆者宅は集合住宅のため、南向きの窓から約80cmの室内にアンテナを設置して待機しました。インターネット上には、「使い始め最初のフィックスには30分くらいかかる」という情報を見かけました。当方の実験では2時間ほど放置した後で確認したらフィックスしていたため、実際のところ最初のフィックスまでに、どのくらいの時間がかかったのか不明です(重要な情報の欠落、ゴメンなさいorz)。
フィックスすると、GPSモジュール基板上のLEDが点滅します。電波の受信状態が悪いと何時間待ってもフィックスしないので、最初の一回は兎に角、上方に障害物の無い場所で待機する事を推奨します。
当方の実験でも、最初のフィックス後、ほんの50cm程離れた場所に移動させたところ、まったく受信しなくなりました。特に集合住宅で実験される方は、上層階の構造物で衛星からの電波が遮断されてしまうため、ベランダまでアンテナを出して実験した方が確実です。
最初に一回フィックスしてあると、次に使う時は30分待つ必要は無く、数分でフィックスします(電波状況に問題ない場合)。
前節で示したログは、フィックス前の衛星探索中ログなので、「未フィックス」を示すステータスが返り続けていました。フィックスすると、以下の様に測位データが埋め込まれて返って来ます。
実験サンプル:GPSモジュールからの受信データ
$GPRMC,hhmmss.00,A,ddmm.mmmmm,N,dddmm.mmmmm,E,4.846,326.68,ddmmyy,,,A*66
$GPVTG,326.68,T,,M,4.846,N,8.974,K,A*38
$GPGGA,hhmmss.00,ddmm.mmmmm,N,dddmm.mmmmm,E,1,03,16.65,115.7,M,38.9,M,,*6E
$GPGSA,A,2,17,09,22,,,,,,,,,,16.68,16.65,1.00*00
$GPGLL,ddmm.mmmmm,N,dddmm.mmmmm,E,hhmmss.00,A,A*6C
:
: (繰り返し)
:
えっと、ここで述べておきますが、今回の実験では当方の存在位置を特定可能な超個人情報が含まれるため、生の測位データは、ご覧に入れることができませんm(1__)m。上の通り秘匿させていただきました。u-centerのグラフィカルな表示画面などもご覧に入れたかったのですが、同じ理由でスクリーンショットも掲載できません。
興味ある方は同様なモジュールを入手の上、ご自身でご確認ください。
測位データを検証してみたいと思います。
位置情報(緯度・経度):
高度(Altitude MSL):
ジオイド高(Geoid Separation):
国土地理院のHPで、特定地点のジオイド高を調べることができます。
国土地理院HPを検索(別ウインドウが開きます)
調べたところ、測定地点のジオイド高は約40mだと判りました。対するGPSによる測定値は38.9mと、ほぼ一致しました。馴染みがあるのは、どちらかと言うとAltitude MSL(≒標高)の方ですね。
以上まとめると、集合住宅の屋内での実験と言う事で電波品質の低さもあり、少々誤差は大きいですが、概ねGPSとして機能していることが確認できました。また、GPSモジュールに対して特に指示を出す必要は無く、UARTでテキストデータを受信するだけで測位データを取得することができると判明しました。
GPSモジュールから返ってくるデータは、以下の様な内容を含んでいます。
※上述した応答データの詳細仕様は、NEO-6Mファームウェアデータシートを参照してください。
各応答で、参照可能な情報に重複がある一方、特定の応答にしか含まれない情報もあります。全ての情報へアクセスするには、複数の応答を参照しないと回収できない様です。ある程度割り切って、必要な情報を絞って回収すれば手間が省けるでしょう。
この形式のデータはNMEA形式と呼ばれる標準的な形式らしいです。GPSや測位関係を扱うソフトウェアの中には、NMEA形式ログファイルをインポート/エクスポートできるものもあります。
GPSモジュールが送信してくるデータの中で、緯度と経度は10進数dddmm.mmmmmの形式で表されます。dddは度(°)、mm.mmmmmは分(′)なので、秒(″)を算出したい場合は、分の小数点以下(0.mmmmm)に60を掛け算します(※)。
例)東京駅の緯度・経度
※度(°)は360°で地球一周ですが、西経180°〜東経180°の範囲です。緯度は0°(赤道)〜90°(極点、北緯・南緯)で示されます。分(′)と秒(″)は60進法です。
GPSモジュールから文字列として返った緯度・経度データを数値として扱う方法について考察しておきます。
緯度・経度データ(dddmm.mmmmm)の有効数字は10桁(小数点以下は5桁)です。データとしては小数値なのですが、浮動小数float型で取り扱うのは、お勧めしません。M5StickC Plusのfloat型は32ビット単精度なので、10進数換算の有効数字は7桁弱です。これでは有効数字不足で、折角の小数点以下5桁の情報を失ってしまいます。
double型(64ビット倍精度浮動小数)は、もっとお勧めしません。ESP32に搭載されたFPUが使えないので演算は遅いし、データは大きくて扱い難いです。
dddmm.mmmmmの最大値は経度179°59.99999′なので、これを×105倍して整数化します。1,795,999,999は約30.75ビットですからint32に収まります。なおも1ビット余っているので、西経(または北緯)をプラス(+)、東経(または南緯)をマイナス(−)等に符号化すると、緯度・経度データを2個のint32で表現できます。
しかも、float型の様な情報の欠落もありません。Good。これが一番お勧めです。
GPSモジュールの測位データを使い、Googleマップで位置を検索する場合には以下の如く指定する事ができます。
GPSモジュールが返すデータを使って検索する場合は、前者の方が扱い易いです。
GPSモジュールが返す「$」で始まる応答には、末尾にチェックサム「*<hex2>」が付いています。データシートによると、チェックサムの仕様は以下の通りです。
チェックサム仕様:
UARTからデータを読み込んだら、チェックサムによって整合性を確認した後にデータを解析した方が良いでしょう。
当方の実験では、デュポンケーブルとピンソケットとの接触が悪かったのか、FTDIとGPSモジュールの入出力レベルが合っていなかったのか、時々文字化けしたのを確認しています。
なお、こちらから送信するデータにも、チェックサムを付加しなくてはならないので、ちょっと面倒です。ただ、コマンドなどの送信が必要な処理にはu-centerを利用すると、こちらからデータを送信する機会は無いはずです。
今回は予備実験的なお試しでした。使い方は解ったので、M5StickC Plus等と組み合わせて応用してみたいと思います。