エントリー

2016年06月29日の記事は以下のとおりです。

GPSのステータス表示をしてみよう

  • 2016/06/29 16:11
  • カテゴリー:make:

 GPSDOを作ってみようという計画をちょっとずつ進めているのですが,先に手軽に出来る事として,GPSモジュールのステータスを表示するマイコンとLCDの準備をしてみました。

 なにも大げさな話ではなく,かつて作ったGPS時計そのものです。シリアルで流れてくるNMEAをデコードし,LCDに表示するだけのものなので,Tiny2313で十分でしょう。

 表示したいデータは,日付,時刻,捕捉した衛星数,ステータスですが,これに加えてステータスがInvalidになった回数と,停電を示すマークを表示させたいと思っています。

 ステータスも,単なる数字と言うよりは,ちゃんとInvalid,2D/3D,DGNSSくらいは表示させたいですし,日付も時刻もなかなか桁数が多いですから,16桁x2行くらいのキャラクタ液晶では厳しいです。

 うーん,仕方がないから,グラフィック液晶を試してみますか。

 グラフィック液晶は,かつて低消費電力目当てで入手したノキアの3310という液晶が手元にあります。その後このプロジェクトは頓挫したので,全く使わずじまいになっていますが,もったいないので使ってみましょう。

 このLCDは,84ドットx48ドットというものですが,コマンドも扱いやすく,消費電流も低いので,世界中のホビーストが遊んでいます。

 基本的にはSPIにコマンドとデータを示す端子があるだけのものですから,そんなに難しくはないはずです。aitendoの液晶LCD8812K-04で作ったプログラムの大部分が流用出来ます。

 そうやってさっさと作って,GPSモジュールに繋いでみました。


20160628145122.jpg

 グラフィック液晶は任意の図形を表示出来ますが,キャラクタジェネレータを内蔵していませんので,キャラクタのビットマップデータは当然マイコン側に用意しないといけません。

 しかし,2kBのtiny2313でキャラクタのデータはかなり負担が大きくて,まともなプログラムなんか組めないと思っていたのです。

 キャラクタは横6ドットx縦8ドットで,キャラクタ液晶のフォントを参考に作りました。1キャラクタあたり6バイトですので,仮に100文字用意したら600バイトです。大きいような,小さいような・・・

 これを定数として書き込みました。キャラクタコードと一致させれば処理が簡単なのですが,使わない文字も出てきますので,キャラクタコードが変わってしまうこともやむなし,使わないキャラクタは削除しプログラムを小さくします。

 表示をしてみると,同じ大きさの文字がずらずらと表示されて,見にくくて仕方がありません。そこで時刻表示は懐かしの倍角にしてみました。縦1列のデータを2回書くだけで倍角になるので,コードもほとんど増えません。

 しかし,やっぱり間延びした感じが不細工ですし,やっぱり見にくいままです。そこで倍角にする時には2行使い,上下に4ドットのスペースを入れてみることにしましょう。お,なかなか見やすくなりました。

 とまあ,LCD3310は簡単にできました。

 うーん,でも,表示がメインの危機ではなく,ちゃんと動作しているかどう見るためにモニターですから,こんなに大きい表示である必要はありません。

 それに,LCD3310は今や貴重です。消費電流がわずか0.3mAというのは,ちょっと他にはありませんから,今でも入手できるLCDを考えたいところです。

 ふと思い出したのは,先日秋月で,ichigoJamポケット用に,超小型のグラフィック液晶AQM1248Aを買ってあったのでした。データシートを見ていると,電気的にはLCD3310とほぼ同じです。

 LCD3310よりも小さい液晶ですが,128ドットx48ドットと画素数はずっと上です。この大きさでこの画素数ですから,結局大きな文字を表示するしかなくて,文字数は少ないままに終わるんじゃないかと不安もあります。

 VRAMの構造もLCD3310に似ていますが,表示位置の指定は上位4ビットと下位4ビットを2つのコマンドで指定するので,ちょっと面倒です。

 とかなんとかいいつつ,AQM1248A用にプログラムを修正しました。

 同じ内容を表示してみると・・・見にくくて苦痛です。横幅が広いことでバランスが崩れていることもありますし,小さいという事もあって,じっくり目をこらさないと読み取れないレベルです。これは厳しい。

 まあモニター用途ですのでこれでもいいんですが,時刻くらいはぱっと見ただけで読み取れるようにしたいです。

 そこで例によって倍角にしたのですが,文字が小さいせいでやっぱり見にくいです。こういう場合,ピクセルサイズも小さいので,横倍角ではなく縦倍角との併用で4倍角にするのが最適なんですが・・・

 読み出したデータを4ビットごとに分割し,これを8ビットに拡張して1行目に二度打ちします。改行して残った4ビットを8ビットに拡張して二度打ちして終わり,なんですが,この段階ですでにメモリがギリギリです。

 かけ算ではなくシフトを多用し,出来るだけループでまとめて,それでも足りない分は仕方がないので,キャラクタのビットマップデータを削りました。キャラクターコードも変わってしまうので手間ですが,仕方がありません。

 そんなこんなで,一応完成しました。 実機にはAQM1248Aを使う事にします。

20160628145121.jpg


 1行目は日付です。JSTに変換していますので,それも表示しています。右端にある*ですが,これは起動後リセットボタンを押すまで表示された状態になります。リセットボタンを押すと,このマークが消えて,後述するUnlockもゼロになります。

 なんの意味があるのか,と思われるでしょうが,停電したことを示す表示として使います。ご承知の通り,GPSDOはGPSからの信号が受信出来なかったり,電源が落ちてOCXOが止まってしまったら,精度が出ません。そしてもとの精度に戻るまで,数日かかります。

 停電したり,衛星をつかみ損ねたことを知らせてくれないと,今出ている周波数が信用出来るかどうかが分からないのです。

 そこで,起動してから衛星をつかまえたことを確認したら,リセットボタンを押して*を消します。このまま*が消えている間は,少なくとも停電は起きていないといえるわけですね。

 次の行は時計です。4倍角で表示しているので見やすいです。ただし,1PPSに同期していないので,1秒以内の誤差は存在します。

 次はつかまえている衛星の数です。GPSでは最低4つの衛星をつかまえると位置情報が得られるのですが,常に位置情報を得るには4つでは不足で,時間の経過によっても安定した時刻情報を得るには,10個程度の衛星をつかまえてくれると安心です。

 受信状態の目安にもなりますし,衛星の数の表示というのは非常に重要です。

 次の行はステータスです。その時の位置情報,つまり時間の情報が信用出来るのかどうかを示しています。Invalidが信用出来ない状態です。そして4つ以上をつかまえて位置情報が得られた場合には2D/3Dと表示します。

 さらに,NEO-6MはSBAS(MTSAT)を受信してDGNSSが可能になっているので,このモードになっているときにはDGNSSと表示します。これ,確かに測距精度が一桁上がるといわれていて,大変ありがたいものなのですが,今回私があてにしている1PPS(10kHz)の精度にどう影響するのか,はっきりわかりません。

 時刻情報の精度が上がるのはあきらかです。そしてその時刻情報の精度は,電離層などを通過する際の誤差などを相殺することで向上させているという事ですから,単純に考えれば1PPSも精度が上がりそうなものです。

 ですが,絶対時刻ではなく,1PPSはあくまで周期の話です。これをわざわざ長時間積分して誤差をなくして使うわけですから,DGNSSになってもあまり意味がないように思うのですが・・・

 10E-8で3mの誤差と言われています。これが一桁改善すると10E-9です。やっぱり長時間の積分では,収束時間が短くなるだけで,最終的な精度にはあまり差が出ないのかも知れません。

 Invalid,2D/3D,DGNSS以外のステータスになったときには---と表示されるのですが,そういうことはおそらくないでしょう。

 そして最後の行はUnlockです。これは,ステータスがInvalidになり,衛星の原子時計とOCXOがロックしない状態になったとき,カウントされます。

 なんでこんな物が必要かというと・・・ある瞬間に衛星がつかまえられずに時間情報が信用出来なくなり,数秒後に再度つかまえたとしましょう。現時点ではGPSモジュールからのデータは信用出来るのですが,あいにくOCXOがその周波数にロックするには数日かかりますから,実はこの段階で出力される基準周波数は,まだ信用出来ないものということになるのです。

 けど,過去にInvalidになったことを表示してくれないと,そんなことは分からないわけです。

 そこで,これまでにInvalidになった回数を数えておくことにしました,数が多い場合には設置場所が悪いか,アンテナに異常があるか等で,基準周波数の精度が低いという事になります。

 逆に,Unlockのカウンタがゼロのままなら,電源投入から一度も精度の低い状態に陥っていない事になりますから,前回リセットボタンを押してから経過した時間の間,ずっと衛星をつかまえてくれていて,OCXOがゆっくり時間をかけてその時間情報にロックしていることになります。

 ただし,電源投入時は当然衛星を全くつかまえていませんので,この状態でInvalidであることはカウントしません。一度2D/3DかDGNSSになってからInvalidになった回数を数えています。

 で,先程のリセットボタンですが,Unlockの状態をゼロにする方法がないと不便だからということで,停電表示マークのリセットと兼ねてみました。衛星をきちんとつかまえてからリセットし,その後カウントが増えなければ,そこから先は制度が崩れていないことが明確にになります。

 本当は,2D/3DもしくはDGNSSになった時刻を表示して,いつからGPSモジュールが信用出来る状態かを確かめることが出来るようにしようと思ったのですが,メモリ不足であきらめました。まあ,そこまではいいでしょう。

 ということで,GPSモジュールの状態を表示するソフトが先に出来てしまいました。

 自動車用のGPSアンテナは先に購入してあり,コネクタをSMAに交換して,すでにGPSモジュールに繋がって動作しています。さすがに屋外にアンテナを出すと安定して11個から12個の衛星を常に掴んでくれます。

 あとはPLLを作って,OCXOをロックさせればいいんですが,回路規模が小さいとはいえ,それでも時間はかかります。あいた時間でコツコツやろうと思います。

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

2016年06月

- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

新着エントリー

過去ログ

Feed