GPS NMEA 0183メッセージングプロトコル入門

GPS NMEA 0183メッセージングプロトコルの基礎と、Arduino®ハードウェアがこの形式のメッセージングプロトコルをどのように扱うのかを学びます。


AUTHOR: José Bagur、LAST REVISION: 2022/11/11 17:56


スマートフォンのおかげで、数メートルの範囲で地球上のどこにいるのかがわかります。スマートフォンは、Global Navigation Satellite System(GNSS)と呼ばれる、上空の人工衛星群と通信するチップにより、位置を知ることができます。GNSSは24個以上の人工衛星のグループで、位置情報と時刻情報をどんな天候下でも世界中に提供します。

Global Positioning System(GPS)はアメリカ製で、世界で最も広く使われているGNSSですが、他のGNSSも利用可能で、以下のようなものがあります。

  • BeiDou Navigation Satellite System(BDS): 中国
  • Navigation Indian Constellation(NavIC): インド
  • European Global Navigation System(Galileo): ヨーロッパ
  • Quasi-Zenith Satellite System(QZSS): 日本
  • Globalnaya Navigazionnaya Sputnikovaya Sistema(GLONASS): ロシア

3次元での位置と受信機の時計の時間差を計算するには、GNSSの最低4つの衛星が必要です。衛星の数が増えるに従い、位置・速度・時間データの正確性や精度は向上します。

i
"GPS"は、GNSSで位置を推定する機器や過程を全て含めた一般的な用語として使われています。

GPS受信機は、いくつかの「言語」あるいはプロトコルを使って通信します。これらには、標準化されたものや非標準の(すなわちプロプライエタリ)メッセージフォーマットが含まれます。これらのメッセージングプロトコルでは、情報はバイナリデータ(すなわち1と0)や、ASCII文字エンコーディングを使って送信されます。GPS受信機で使われる全てのメッセージ標準のうち、NMEA 0183が最も広く使われているメッセージング標準です。

NMEAは、National Marine Electronics Associationの頭字語です。この協会は1957年に電子機器販売業者により設立され、導入者の訓練やインターフェイスの標準化を通じ、船舶用電子機器の技術や安全性を向上させることを目的としています。NMEA 0183メッセージングプロトコルは、当初、船舶用電子機器向けに1983年に採用されましたが、地上用電子機器にも利用が拡大されました[3]。

NMEA 0183は、単純なメッセージングプロトコルで、データは、一人の発信者(talker)から複数の受信者(listeners)に、ASCC文字列もしくはセンテンスとして送信されます。NMEA 0183メッセージングプロトコルのもう一つの特徴は、RS-422電気規格を使っていることですが、RS-232電気規格とも互換性があることです[3]。NMEA 0183メッセージングプロトコルのシリアル通信設定は以下の通りです。

  • ボーレート: 4800 bauds.
  • データビット: 8.
  • パリティ: none.
  • ストップビット: none.

NMEA 0183の送信者は、例えば、衛星や水深計、方位磁針などで、受信者は、チャートプロッタやレーダー、Arduino MKR GPSシールドで使われているようなGPS受信機などです。

NMEA 0183メッセージングプロトコルは、一つのセンテンスだけではなく、異なる能力や目的を持つ異なるNMEA 0183センテンスがあり、センテンス内で変わるのは提供できる情報なので、時折混乱を引き起こします。これらのセンテンスの異なる能力や目的、提供さエル情報を理解するために、最初にその構造を理解しましょう。

GPS NMEA 0183センテンスの構造

全てのNMEA 0183センテンスは、$記号で始まり、キャリッジリターンとラインフィードで終わります。センテンス内の各データフィールドはコンマで区切られます。

1
$aaaaa,df1,df2,df3*hh<CR><LF>

5文字のアドレスフィールドは、常に$の後に来ます。また、hhは16進数2桁のチェックサムです。NMEA 0183センテンスは最大80文字プラスキャリッジリターンとラインフィードです。GPS NMEA 0183センテンスの例を見てみましょう。

1
$GPGGA,181908.00,3404.7041778,N,07044.3966270,W,4,13,1.00,495.144,M,29.200,M,0.10,0000,*40

このNMEA 0183センテンスでは、以下の情報を読み取ることができます。

  • GPは、GPSの位置を定義します(GLは、GLONASSを示します)。
  • 181908.00は、タイムスタンプです(UTCの時間、分、秒)。
  • 3404.7041778は、DDMM.MMMMM形式の緯度です。
  • Nは、北緯を示します。
  • 07044.3966270は、DDDMM.MMMMM形式の経度です。
  • Wは、西経を示します。
  • 4は、品質指標(精度)です。
  • 13は、座標を定義するのに使われた衛星数です。
  • 1.00は、水平精度低下率(HDOP: Horizontal Dilution of Precision)です。
  • 495.144は、GPSアンテナの高度です。
  • Mは、高度の単位です(メートルかフィート)。
  • 29.200は、ジオイド高です。
  • Mは、ジオイド高の単位です(メートルかフィート)。
  • 1.0は、補正情報を受信してからの時間(age of th correction)です(あれば)。
  • 0000は、差動基準地点IDです(あれば)。
  • *40は、チェックサムです。

$GPGGAは、基本的な共通のNMEA 0183センテンスです。NMEA 0183センテンスの代替もしくは関連のセンテンスは、類似の情報や追加の情報を提供します。

NMEA 0183センテンスの基本構造

NMEA 0183センテンスの基本構造

共通のGPS NMEA 0183センテンス

GPSに関連する、いくつかの共通のNMEA 0183メッセージングプロトコルのセンテンスを以下の表に示します。

センテンス 説明
$GPGGA 時刻、位置、補正データ(fix type data)
$GPGLL 緯度、経度、位置補正と状態のUTC時刻
$GPGSA GPS受信機の動作モード、位置解析に使われた衛星、精度低下率
$GPGSV 観測できる衛星数、衛星ID、仰角、方位角、SN比
$GPRMC 時刻、日付、位置、方向、速度
$GPVTG 方向、対地速度

$GPRMCセンテンスは、GNSS受信機によって提供される、推奨される最小限のナビゲーションデータを提供するので、必要不可欠であるということに注意してください。

i
位置に関する情報を抽出するには、最低限、以下のNMEA 0183センテンスの一つを記録してください: $GPGGA、$GPGLL、$GPRMC

Arduino®とGPS NMEA 0183メッセージングプロトコル

ArduinoのMKRファミリーボードは、Arduino MKR GPSシールドとArduino GPSライブラリを使って、NMEA 0183メッセージングプロトコルを処理することができます。

MKR GPSシールド

MKR GPSシールド

MKR GPSシールドは、u-blox SAM-M8Q GNSSモジュールを基にしています。このモジュールは、3基のGNSS(GPSとGalileo、GLONASS)の同時受信ができ、SBASとQZSSをサポートしています。このモジュールは、複数の衛星群を同時に認識でき、都市部の谷や微弱な電波が混在する状況でも、優れた測位精度を実現します。

MKR GPSシールドは、MKRファミリーボード上に装着して利用する想定です。しかし、SAM DベースのArduinoボードでも、UARTかI2Cピンを使って利用することもできます。Arduino MKR GPSライブラリは双方のプロトコルに対応しています。

詳細な情報は、ここの公式ドキュメントを参照してください。

MKR GPSシールドチュートリアル

MKR GPSシールドの使い方を学びたければ、以下のチュートリアルを参照してください。

参考文献

オリジナルのページ

https://docs.arduino.cc/learn/communication/gps-nmea-data-101

最終更新日

November 12, 2022

inserted by FC2 system