MZ Platformアプリの個人的な作成事例

GPSレシーバ接続

一般に販売されているUSBでPCに接続するタイプのGPSレシーバから出される情報を読み込んで処理するアプリケーションを作成しました。当然のことながら、そのようなアプリケーションはすでに販売されていますし、製品に付属されることも多いので、わざわざ作成する必要はありませんが、ここでは勉強のため作成しました。

概要

作成したアプリケーションは、GPSレシーバからUSBでシリアルポートに出力されるNMEA-0183形式の文字列を取得して処理します。出力される文字列には、緯度・経度・時刻・対地速度・高度などの情報が含まれているので、それらをMZのテーブルに変換します。

ちなみに購入した製品は下記です。製品としてはGPSロガーで、レシーバとしても使用できるものとなっています。 レシーバとしては1秒に1回NMEA-0183形式の文字列が出力されます。 これしか所持していないので、他の製品でもアプリケーションが正常に動作するかどうかは未確認です。

USB接続GPSモジュール GT-730FL-S(CANMORE ELECTRONICS CO., LTD.) ※当時は秋月電子通商で販売

もし他の製品がGPSレシーバとして利用可能か確認するためには、製品付属のドライバやソフトウェアをPCにインストールして製品の接続確認をしたあと、 TeraTerm等のソフトでシリアルポートを開いて、NMEA-0183フォーマットの文字列が表示されればOKです。 この際、製品ごとにボーレートなどの設定が違うのでご注意ください。

シリアル通信と文字列取得

シリアルポートからの文字列取得には、シリアル通信コンポーネントを使います。 シリアル通信コンポーネントの主な使い方は、下図のアプリケーション画面で見て取れるように、 ポート一覧で得られる名前と通信速度(ボーレート)などを指定して接続し、 接続中にデータ生成イベントで得られる文字列に対する処理を実行して、最後に切断します。

このアプリでは、データ生成イベントをサブルーチンに渡し、間にイベント伝播制御などを介して、 最終的にファンクションで文字列からテーブルを作成します。

テーブルを作成する部分は以下のような処理になっています。 全体を文字列格納変数に設定して、その後NMEA形式の文字列を探して変換しながらテーブルを作成します。

しばらく動作させていると、時々所々におかしな文字列が表示されるようになることがあります。 これがノイズの影響なのか、MZ側の不具合なのかわかっていませんが、通信をリセットすると元に戻るので、 無視できないぐらいの状態になったらアプリケーション側で自動的に通信をリセットするようにしています。

対象形式と変換方法

文字列からテーブルへの変換では、対象となるNMEA-0183フォーマットに基づいて、 レシーバから取得された文字列に含まれる中で必要そうな部分だけ処理を定義しています。 一般的なルールは以下になります。

  • $はメッセージ開始文字
  • 続く5文字はトーカ識別(2文字)とメッセージ識別(3文字):GPはGPS機器
  • データはカンマ区切り
  • データがない場合は空文字
  • データの最後にアスタリスクと2桁のチェックサム
  • メッセージの最後は<CR><LF>
また、変換対象とした文字列の構成は以下になります。所々に理解できていない部分もありますが、 そういう部分は無視しています。
  • $GPGGA -> GGA: Global Positioning System Fix Data
  • 測位時刻(UTC),緯度,北/南,経度,東/西,品質(0:受信不能,1:単独,2:DGPS),衛星数,HDOP, アンテナ高度,メートル?,高度差,メートル?,DGPSデータのエイジ(秒),DGPSのID
  • $GPRMC -> RMC: Recommended Minimum Specific GNSS Data
  • 測位時刻(UTC),状態(A:有効,V:無効),緯度,北/南,経度,東/西,対地速度(ノット), 進行方向(度)(真北),日付(UTC),地磁気の偏角,向き?,モード(A:単独,D:DGPS,N:無効)

値を取得してそのまま利用するものと、変換処理が必要なものがあります。 変換が必要なものとしては以下になります。

  • 緯度経度の表記はdddmm.mmmm(度と分の小数表示)なので、度数の小数表示に変換
  • 対地速度がノット表示なので、時速に変換
  • 測位時刻がUTCなのでJSTに変換

テーブル作成のときではないですが、 テーブル上にある時系列の緯度と経度から距離を求めるためにヒュベニ(Hubeny)の公式を利用しています。

Google Mapでの地点表示

インターネットに接続した状態で、変換後のテーブルで行をダブルクリックするとGoogle Mapで該当地点を表示する機能をつけています。 Google Mapの機能が前提となりますが、ウェブブラウザで下記のようなURLを指定するとその地点が表示されます。

http://maps.google.co.jp/maps?q=(緯度),(経度)

これを実行するためには、下記のような処理を定義します。 テーブルのマウスボタンイベントでダブルクリックした場合だけフィルタを通過するようにして、 その際にテーブルの緯度と経度の情報を使ってURLを作成し、 外部プログラム通信コンポーネントでそのURLを引数として 「標準のブラウザでWEBページを開く」メソッドを呼び出します。

例として、下記のURLを指定した場合はこのように表示されます。

http://maps.google.co.jp/maps?q=36.068428,140.134357

作成日 2012-09-25

最終更新日 2012-09-25