コメントがあればこちらから
sorry. japanese only.

[YES!AVR!へ戻る]

AVRではありませんがH8Sを使って,NMEA/TSIP両対応のGPSモニタを作ってみました。 記事はこちらになります。

わりと正確な時計を作ってみたり

GPSを使用した標準時刻表示機(わりと正確な時計)を作ってみた。秋月でもGPS受信モ ジュールが扱われる様になったりしたので,前々から計画はしていたが,今時分になっ て,やっと実現できた。ただ当初は,秋月のモジュールを買うつもりだったが,間違っ て(?)ヤフオクに出てたGPSモジュールをゲットしたので,そちらで作成してみた。 モジュールはGT-74とFV-17の2種類。いずれも,わりと小型のモジュールに外付けGPSアン テナが別に要る奴(GT-74は古野のTS820のGPSエンジンと同じ奴かな,ちなみにGT-74も FV-17もコネクタのピンレイアウトが同一で,回路もAVRのプログラムも使いまわしている) さすがに単体のGPS時計では, あまりに勿体無いので,NTPサーバのリファレンスにも使 える様NMEA出力を複数出せるようにした上でPC内蔵もできるように作ってみた。 (実はNTPサーバのリファレンスの計画が先で,時計は後付けでつけたようなものである)
全体の概要図
時計の仕組みは非常に単純で, 最近のGPSモジュールでは,NMEA-0183というフォーマット でGPS測位情報がASCII文字列として出力されてくる。その中にhhmmss,DD,MM,YYYYのような 形式で時刻情報が含まれるのでキャプチャして,LCD表示するだけだ(ただし,そのままだ とUTCなので,ローカルタイムに変換する必要がある)。 通信速度は4800,8N1や9600,8N1が一般的で,今回使用したモジュールはデフォルトのまま 4800,8N1として接続している。 またNMEA-0183の出力をそのまま,RS-232Cレベルで出力すれば,PCで使用可能な秒単位で 正確なデートタイムリファレンスになる。さらに+αで1PPSout(立ち上がりが実際のUTCに ±1usの1Hzパルス)をRS-232CのDCD(キャリア検出)に併せて出力することで,xntpdなどで 使用可能な,u秒単位で正確なリファレンスにもなる。 ただしPPSをを利用する場合にLinuxの場合だと, PPSkitを別に入れてカーネルの再構築が 必要になるなど,少々面倒なのと確度は秒単位で十分なので,当方ではgpsdを経由しての 簡易リファレンス方式として使用している。 (ハードは,PPS対応可能なようにDCDにPPSを出力している)
回路図
toGPSのコネクタが9pinとなっているが,実際にGPSモジュールのコネクタは7pinである。 これはGPSモジュールに付属していたケーブルが2mmピッチコネクタを使用していたが, コネクタハウジングの都合で9pinのものを使用した。そのため9pinの両端は未使用である。 前述したように仕掛け的には何も特別なことはなく,AVRはGPSレシーバのTx(NMEAout)を キャプチャしつつ,1PPS信号で同期を取りながら,LCDに時刻表示をしているだけである。 変わったところは,NMEA出力とPPS出力を複数出すのにRS232Cレベルへの送信バッファの 多いコンバータ(MAX207:5out/3in)を使用して,シリアル信号分配形式にした位。 NTPリファレンスにも使用可能なようにGPSレシーバのTx(NMEAout)とRx(NMEAin)とPPS出力 をRS232Cレベルで出せるようになっている。 xntpは,PPSをDCD(pin1)で喰うらしいので,そこにPPSを出せるようにした。最初PPSが立 上がりか,立ち下がりか,わからんかったのでジャンパでTTL,RS232Cレベルとそれぞれの 正論理,負論理が選択できるようにしておいた。 (後からRS232CレベルコンバータへそのままPPS信号を入れればいいことが判明) ちなみにGPSレシーバの初回起動時は安定に測位ができるようになるまで(数時間位,GPS衛 星4機以上を補足して暫くしないと)PPS信号が出ない。一旦測位が完了すれば衛星は1機で も十分である。 NMEA出力を見た感じ12機まで捕捉できるようだが,実際問題として部屋の中からだとまと もに補足可能なのは4機が精一杯で,丸1日くらいかけないと同期しない。よって最初の内 は気長に待つか,起動直後はアンテナを窓の外に出しておいて同期をとってから,部屋の 中に取込むような工夫が必要ではある。 一旦同期さえ取れれば,GPSが見つからなくとも受信モジュール内蔵のRTCで時刻は刻み続 けるので, シビアな使い方をしないのであれば,たまにGPSアンテナを繋いで同期を取るだ けで時計としては十分使える。 実際的な時刻表示上の確度は,ZDAセンテンスの秒1桁が変わる時に表示の更新を開始する ため,NMEAセンテンスがPPSに同期して出力されている場合でも,ZDAセンテンス出力以前 に出力されてくるメッセージ(大体100バイト分)のために0.2秒ほど遅れることになる。 (ZDAセンテンスを最優先で出すように設定可能であればよいのだが方法が不明。代替案と しては先に出てくるGGAセンテンス中の時刻を使用すれば,多少の改善はできるが,GPS衛 星の捕捉が途切れると時刻が出力されない場合があるので妥協した) ●製作物 こんな感じで組み上げた。これは二号機でモジュールにFV-17という安いモジュールを使 用している(今もあるかどうかはわからないが, ヤフオクでも中古の2個セットが5k\未満 というリーズナブルさで出ていたりもした)。コスト重視のため基板も紙フェノールでw 基板には,1Fの電気二重層キャパシタを電源バックアップとして搭載し,受信モジュール の測位情報とRTCの時刻を失わないようにしている(測位情報が消えるとPPS信号の同期に 時間が掛かるため)。 また,シリアル出力は10pinヘッダで出しており,PCに内蔵する場合に10pinヘッダ同士を 接続すればよいようにしてある(PCに10pinのシリアルヘッダがある場合)。 表示状態(日時表示:ローカル JST-9)。 1行目は時刻とSA=有効なGPS衛星補足個数(左端の*はPPS信号) 2行目は正分ごとに日付とLVL=測位レベルを表示し,それ以外では各GPS衛星毎の受信SNR をバーグラフで表示する。 他に緯度,経度,高度も表示可能だが,アジトがばれそうなので表示しないことにしたw (まあ正直なところ,プログラムメモリが足りなさそうなので割愛したのだが...) これはGPS受信モジュールGT-74を搭載した一号機。元は非常に高価なモジュールの割に かなり旧い機種のせいかGPS衛星捕捉感度が若干悪い。 基板上の黒い直方体は,3.3Fのゴールドキャパシタである。PCに内蔵できるように,シリ アルDsub9pin x 2chとアンテナ接続用のBNCをバックパネルに取り付けて出せるようにし てある。 基板裏面にはレベルコンバータ(MAX207)とインバータ(74HC14)が見える。AVRはGT-74の 下に隠れている(GPS受信モジュールは10mmのスペーサーで基板に取り付けてある)。 実際に我が家の基本サーバであるブックタイプPCに組み入れて稼動しているところ。 時刻表示用のLCDを手持ちのもので賄ったため,固定することもせずに適当にぶら下げて 置いてある。 二号機を秋月のプラケースに入れてポータブルな感じにしてみた。 ●GPS時計のソース(WinAVR使用) ・コンパイルはWinAVRとAVRstudioを使用した(プログラムメモリ90%ちょい)。 ・書き込みには,ELMさんとこのavrspを使用してByteblasterMV経由のISP書込み。 ・Fuseは,tiny2313のLowFuseのみ変更で, 8MHz内蔵OSCのスロースタートとしている。 ・GSVセンテンスから捕捉衛星のS/N比を下図のようにバーグラフ表示するようにした。  最大12機分で捕捉していないスロットは x 表示にしている。正分毎に日付と位置測定  状態を表示する。 プロジェクトファイル一式を置いておきます。 (AVR studio4用のプロジェクトファイル & WinAVR-20071221を使用してコンパイルしました) -- core usage -- Program: 1834 bytes (89.6% Full) (.text + .data + .bootloader) Data: 62 bytes (48.4% Full) (.data + .bss + .noinit) EEPROM: 59 bytes (46.1% Full) (.eeprom) ●NMEAメッセージのチェックサム計算($以降*以前の部分を引数にする) 最初はTeratermとこのチェックサム計算を使用してNMEAフォーマットの制御をしていたが... #include main(int argc,char *argv[],char **envp){ char *p; unsigned char c; c=0; if(argc !=2)exit(1); p=argv[1]; while(*p){ c^=(*p); p++; }; printf("$%s*%02X\n",argv[1],c); } ●GPSモジュールからのNMEAメッセージを可視化する便利ツール(for Windows) ターミナルでNMEAメッセージの入出力が確認できたら,このツールでGPS衛星の捕捉状況 をチェック。 NMEA Monitor for windows わかりやすい形式でNMEAメッセージを表示化 ・今回使用したモジュールは,GM-38として使用可能である,NMEAフォーマットの制御もできる。 NMEA to KMZ file converter NMEA形式のファイルをGoogle Earth用のKML/KMZファイルに変換 ・google earthにKMLファイルを食わせることでランドマーク表示も可能。 ●NTPサーバ:Debian(etch)にgpsdをインストールしてリファレンスとす (1) gpsdをインストール(コンフィグレーションでGPSに接続したCOMポートを指定する) # apt-get install gpsd (2) ntp.confにリファレンスを追加する /etc/ntp.confに以下を追加 server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 time1 0.420 refid GPS server 127.127.28.1 minpoll 4 maxpoll 4 fudge 127.127.28.1 refid GPS1 (3) ntpdを再起動 # /etc/initd/ntpd restart (4) ntpqで確認 # ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 0 l 3 16 377 0.000 -73.261 8.948 SHM(1) .GPS1. 0 l - 16 0 0.000 0.000 0.004 (5) ハイ,これでstratum=1サーバの出来上がりw ●NTPサーバ:Debian(etch)にntp-serverパッケージ(w/PPSkit)を適用してみたり (0) GPSモジュールが接続されていれば,以下のようにして確認する(COM2に接続した場合) # cat /dev/ttyS1 $GPGGA,124925,3400.0000,N,13500.0000,E,0,01,00.00,000000.0,M,0000.0,M,, $GPZDA,124925,13,05,2008,-09,00 $GPVTG,,T,,M,,N,,K $GPRMC,124925,V,3400.0000,N,13500.0000,E,,,140508,000.0,W $GPGGA,124926,3400.0000,N,13500.0000,E,0,01,00.00,000000.0,M,0000.0,M,, $GPZDA,124926,13,05,2008,-09,00 ^C # (1) デバイスファイルのシンボリックリンクを作る。 # ln -s /dev/ttyS1 /dev/gps1 (2) カーネルにPPSkit(ftp://ftp.kernel.org/pub/linux/daemons/ntp/PPS/)を組み込む 通常のカーネル(Debianの配布カーネルも)はus単位での時刻管理を行っているがPPSkitを 組み込むことでus未満の時間についても管理が可能となる(当方に必要性はあまりないが) (3) PPSkitをサポートしたntpパッケージを構築する。 PPSkit に付属のヘッダファイルをコピーしてパッケージを再構築。 # cp -p /usr/src/kernel-headers`uname -r`/include/linux/timex.h /usr/include/sys/ # cp -p /usr/src/kernel-headers-`uname -r`/include/linux/timepps.h /usr/include/sys/ # apt-get source ntp # cd ntp-4.2.2 # debchange -i # dpkg-buildpackage -us -uc -rfakeroot (4) 再構築したらパッケージをインストール。 # dpkg install ntp-refclock (5) /etc/ntp.confを修正して(以下を追加する), ntpdを再起動する。 server 127.127.20.1 minpoll 4 maxpoll 4 fudge 127.127.20.1 flag3 1 time1 -1 (6) 正常にntpdが起動して,ntpq -pで確認して以下のようにGPS_NMEAで同期しているか 確認する(同期には少し時間がかかるはず) # ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *GPS_NMEA(1) .GPS. 0 l 11 64 377 0.001 51.901 4.131 (7) ハイ,これでstratum=1サーバ(us単位)の出来上がりw PCがあればGPSモジュールのほか,アンテナや部品材料込み\10k位のコスト(実質\5k以下) で実用確度を備えたStratum=1のNTPサーバが構築できるとは,いい時代になったものであ る。コストパフォーマンス的には,秋月の電波時計kitといい勝負じゃないかなw [ご注意] ・このページの記載事項については,一切無保証です。
    inserted by FC2 system