試用したGPSモジュールは以前秋月で購入していたCanMore製のGT-723Fというアンテナつきで2cm角厚さ8mm程度の小型モジュールです。
コネクタつきケーブルは付属していますが、aitendoでも探すと同様のものが見つかります |
使用したPICは16F1847というメモリ搭載量の多い(プログラムメモリ14KB, RAM 1024B)モデルですが、これは現在秋月に取り扱いがありません。しかし16F1827をターゲットにXC8Freeモードでコンパイルしてもプログラムメモリ34%、RAMも28.1%消費にとどまるので1827でも問題ありません。
UARTはPIC内蔵モジュールを使用しました(そのほうが楽)。表示部は秋月のI2C OLEDで、I2Cはソフトウエアで制御しています。
動作としては、UART受信割り込みを使用し64byteのバッファに順次受信データを格納します。リングバッファを使う方法も考えましたが、せいぜい50byteまで一時的に保持できればよいので64byteを超える場合は以後の受信データを捨てています。GPSから送られてくる1秒ごとのテキストデータは膨大ですが、各NMEA0813センテンスが"$"から始まるため"$"を拾って各センテンスが順次バッファに入れ替わるようにして、メインループで必要なセンテンスを拾って(GGAセンテンス)その後に続く情報をバッファから得て加工表示します。
必要な情報は時刻と緯度経度、GPSが測定可能状態くらいなので、GGAセンテンスのみ抽出できればOKです。
NMEAフォーマットについて詳細は解説しませんが、GGAセンテンスの一部先頭から44byte目までが必要な情報です。
GGA $GPGGA,hhmmss.sss,ddmm.mmmm,N,dddmm.mmmm,E,1,....
↑ ↑ ↑ ↑ ↑ ↑ ↑
0 7 18 28 30 41 43
0:NMEAセンテンスの種類(GGA、RMC、GSAなどなど $GP~)
7:時刻(UTC)
18:緯度(度、分フォーマット)
28:N⇒北緯、S⇒南緯
30:経度(度、分フォーマット)
41:E⇒東経、W⇒西経
43:GPS衛星捕獲状態 1or2⇒衛星捕獲
数字はGGAセンテンスが流れた瞬間に収められたバッファ中の各情報のインデックスです。得られた情報ごとに加工表示していくわけです。
GL(グリッドロケータ)計算についてはJARLのこのページを参考にプログラムしました。ややこしいのは西経、南緯の場合でそのことについてはページでは触れていません(日本に居る限りはあまり必要ないといえばそうかもしれませんが)。経度で180度、緯度で90度のオフセットを与えているので南緯、西経の場合は計算方法が違うのです。
あと、経度緯度ともに小数点4桁まで表示されますが計算では2桁目までが有効なので3桁目4桁目は捨てています。
というわけで、時刻とグリッドロケータ、GPS衛星捕獲状態の表示が出来ました。
SDカードインターフェースつけるとGPSロガーもできそう |
いよいよJUMAに組み込みを |
0 件のコメント:
コメントを投稿