My Project
2024年3月1日掲載
ケースに収めたモジュールと汎用LCD
前回はGPSモジュールを基板に実装して、出力データをそのまま汎用LCDに表示してみました。モジュールの設定を変えたり、シリアルデータをPCで確認したりする方法に触れました。
今回は、実際に屋外に出して衛星からのデータを受信し、緯度と経度、時刻を取得してみます。モジュールから出力されるデータから必要な情報を取り出してLCDに表示させる方法を紹介します。
・欲しいセンテンスを取り出す
GPSモジュールからは複数のNMEAセンテンス(衛星から取得した情報)が出力されます。位置情報だけでなく、UTC(時刻: 協定世界時)、信号を受信している衛星の数、その信号強度、高度、(進行)方向、速度など、様々なデータが含まれています。今回使用したモジュール『GPS-54』は6種類のセンテンス(GPGGA、GPGSA、GPGSV、GPRMC、GPVTG、GPZDA)を出力します。これらは『NMEA 0183』という規格に基づいたフォーマット(プロトコル)で記述されています。センテンスに含まれる各データはコンマ(,)で区切られています。今回はRMCとGGAセンテンスを参照します。
・最小限の情報を含んでいる『RMCセンテンス』
RMCセンテンスは「Recommended Minimum Navigation Information」という正式名称で、位置情報やUTC、方位角などの最小限の情報を含んでいます。このセンテンスからは、緯度、経度、時刻(UTC)を取り出します。
『RMC』センテンスのフォーマット。(GPS-54Dの取説より引用)
・衛星に関する情報を含んでいる『GGAセンテンス』
GGAセンテンスは「Global Positioning System Fix Data, Time, Position and fix related data for a GPS receiver」という正式名称で、位置情報とともに受信衛星の情報も含んでいます。このセンテンスからは受信できている衛星の個数を取り出します。
『GGA』センテンスのフォーマット。(GPS-54Dの取説より引用)
・データの流れから欲しい部分を取り出すには
GPSモジュールからは1バイト単位で次々とセンテンスデータが出力されます。この中からLCDに表示させたい情報のみを取り出すプログラムを作る必要があります。1つのセンテンスは“$”マークで始まり、改行コード“<CR><LF>”で終わります。さらにそのセンテンスに含まれる各データは“,”(コンマ)で区切られています。これらのデータが1バイト、つまり1文字ずつ流れてくるわけです。
その流れの中からデータを拾う方法としては、「欲しいセンテンスの名前が出てきたら、そこから数えてN番目からN+センテンスの文字数分の文字を取り出す」という方法が考えられます。
1バイト単位で流れてくるデータ(右端がASCIIコードとして読み取られた文字)。
この中から欲しい部分(複数バイト)を取得する。(自宅の特定を防ぐため一部を隠しています)
・プログラムの仕組み
C言語では文字列を配列として扱うため、データを構成する文字1つ1つを配列に格納することになります。GPSモジュールから1文字(=1バイト)ずつ送られて来るデータを監視して、「欲しいセンテンスの名前」が表れたらその中から1文字ずつ配列の要素に取り込むプログラムです。
例: RMCセンテンスの中からUTCフィールドを取得するプログラムの流れ
1バイト単位で流れてくるデータ(右端がASCIIコードとして読み取られた文字)。
この中から欲しい部分(複数バイト)を取得する。(自宅の特定を防ぐため一部を隠しています)
書き込みファイル(.hex)はこちらからダウンロードできます。
<参考: PICマイコンの書き込みの効率化>
マイコンの開発は、プログラムが完成する(仕様通りに動くようになる)まで何度も書き換えることになります。その都度ライター(書き込み機)とマイコンを接続することになりますが、基板をケースに収めた状態ではPICマイコンにアクセスできません。そこで、基板上にピンを立て、ケース越しにライターを素早く抜き差しできるようにしました。書き換える度に分解する必要がありません。
汎用LCDの裏側(電池カバーを開けた所)にPICライターとの通信用コネクタを付けた。
GPSモジュールを実装した基板をケースに収めます。今回は釣具屋で見つけた『ジグヘッドケース』を使いました。パッキンが入っていて、2つのバックルでしっかり固定できるので気密性が高いです。
釣具屋で見つけた丈夫そうなケース(¥1200)。本来は仕掛け(ジグヘッド)を入れる物。
えらく気に入ったのでたくさん買った。
ケースにはD-sub 9ピンコネクターを取り付け、そこからGPSモジュールの(外部からも電源供給できるように)電源とデータ配線を繋げます。GPSはケースの端に固定しました(ケースを垂直に立てた状態で使用)。独立電源はモバイルバッテリーの5Vを基板上の3.3Vレギュレーターを通して給電します。
ケースの中の様子。
このGPSユニットを窓際に置いても位置情報が取得できませんでした。ベランダに置くとUTC(時刻)データこそ取れるものの、やはり測位できません。『衛星情報センテンス(GGA)』の補足衛星数が「ゼロ」で測定状態も“V”(測定不能)となっていたので、測位に必要な4つの衛星を捕捉できていない状態です。うちの上の階のベランダが外に張り出しているので影になりますし、そもそもうちの周りはマンションに囲まれていてあまり空を仰げません。ただでさえ無線のロケーションが最悪なのに、空からの1.5GHzが良く入るはずがありません。そこで、GPSユニットを塩ビパイプの先に取り付けてベランダ(1階)から外に突き出しました。
検証のためベランダ(1階)から張り出すように仮設置したGPSユニット。
作業台からベランダのGPSユニットまで配線を延ばし、途中のサッシにはフラットケーブルを通しました。前回、モジュールとの通信ボーレートを4800bpsに下げたのも、このように通信ラインが長くなることを見越していたためです。(ボーレートが高いほどデータ化けが起こりやすい)
配線をサッシの隙間に通した様子。昔買った平行フラットケーブルが初めて役に立った。
GPSユニットを外に張り出させると補足衛星数が“4”(時折“5”)となり、測定状態も“A”(測定可能)となりました。
4つの衛星から信号を受信できている状態。UTC(時刻)もピッタリ合っている。
『汎用LCD』のプログラムを書き換えて表示させたところ。
(自宅の特定を防ぐため一部をぼかしています。)
<参考: GPSと雨>
ある晩、捕捉衛星数が減っているのに気が付きました。電界強度が不安定のようで、位置情報(緯度・経度)がピタリと定まりません。「もしや」と思い外を見ると大雨が降っていました。1.5GHzは衛星通信波としては周波数が低い方ですが、やはり激しい雨では減衰が増えるようです。
出来合いのモジュールを使うため、前編・後編を通してほとんど回路製作要素がありませんでした。筐体加工を除けばプログラミング要素だけです。GPSモジュールから任意のデータを取り出すのも、取り出したデータをLCDに表示させるのも、プログラミングによるものです。電子工作自体を楽しむにもプログラミングが欠かせなくなってきています。モジュールやICと通信するためにはシリアル通信に関する知識も必要で、これはCI-Vでも同じです。
今回GPSに取り組んだことでGPSについて詳しく知り、実際に位置情報を取得してLCDに表示させることができました。また、GPS電波(1.5GHz帯)の割とシビアな特性もなんとなく感じることができました。
知識や経験は多ければ多いほど作れる物が増え、その分作る楽しみも増えると思います。今ではありふれた身近なものに目を向けて敢えて製作してみるのもお勧めです。
My Project バックナンバー
アマチュア無線関連機関/団体
各総合通信局/総合通信事務所
アマチュア無線機器メーカー(JAIA会員)
©2024 月刊FBニュース編集部 All Rights Reserved.