Raspberry PiでGPS時計更正のNTPサーバーを検討
Posted: 2018年9月21日(金) 15:02
GPS時計とNTPサーバー運用にチャレンジ中!で(新)GPS世界時計キットとNTPサーバーキットを使用して検討していましたが少し動作に不具合?(開発もとのトライステート社に問い合わせ中)
- そこでGPSのPPSで高精度NTPサーバーを調査していたところ安価なRaspberry PiでnSecオーダーの高精度のNTPサーバーが実装できるとの記事を見つけました。
- 早速、昔に購入しパフォーマンス不足でお蔵入りしていたRaspberry Pi B+を引っ張り出してきてRaspberry PiからケーブルでGPSから電波の届く場所まで引き回すことと防滴構造のアンテナユニットのYIC製GPS/GLONASS受信機を接続してみました。
GPS受信ユニットとRaspberry Piとの接続はRaspberry Piに「みちびき」対応GPSモジュールを接続をGPSユニットは異なりますが信号線ケーブルと電源は同じなので参考にさせていただきました。
ところが上手く動作しません。
丸一日朝から晩までかかりましたがRaspberry Piを設置している我が家の2階と監視制御をSSH接続で行っていた一階のPCが離れていることもあって何度もソフトの設定を確認しましたが原因が解らず夜になって就寝前に最後にGPSの送受信信号やPPS信号をデジタルオシロで観測してみようとプローブを接続したところ信号が出ていません。
- 何の事は無い接続をコネクターとフラットケーブルで行っていましたが其のうちの+5Vラインのケーブルがコネクタ根元で切断しています。
早速コネクタ部分を半田で修復したところシリアル信号が確認可能となり電気的には無事接続が完了しました。
年寄りがネットの記事を参考に見よう見真似でチャレンジしてみます。 - 残念ながら、Raspberry Pi Linuxに付属のNTPのバージョンはPPSをサポートしていないと言うことなのでPPSサポートのNTPサーバーをインストールします。
しかし何か設定が悪いのか上手く動作してい無い様です。
参考にさせていただいたGPSのPPS信号を使った Stratum-1 NTPサーバの作り方- GPS無しでNTPサーバを動かす
まず、GPS無しでNTPサーバを動かしてみます。ntp.conf を編集します。コード: 全て選択
$ sudo nano /etc/ntp.conf
次の1行を加えるだけです。server ntp.nict.jp iburst
NTPサーバを再起動します。コード: 全て選択
$ sudo /etc/init.d/ntp restart
NTPサーバの動作をチェックします。コード: 全て選択
$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp-b2.nict.go. .NICT. 1 u 56 64 377 11.222 0.067 0.283
こんなような出力がでればOK.
PPSは1秒おきのパルスに過ぎないのでPPSだけでは時刻はわかりません。GPS+PPS(またはインターネットのNTPサーバ+PPS)という組合せによって、GPSで秒単位の時刻を取得し、それとの差分をPPSのパルスで知ることによって正確な時刻同期を行うことができます。
- まず、GPS関連のツールをインストールします。
コード: 全て選択
$ sudo apt-get install gpsd gpsd-clients python-gps
上述のように、私はGPSの出力をUARTに入力しているので、Raspberry PiではGPSの入力が /dev/ttyAMA0(serial0) になります。
gpsd を以下のように起動します。コード: 全て選択
$ sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
GPSが動いているか確認します。コード: 全て選択
$ cgps -s
ntp.conf の編集をします。コード: 全て選択
$ sudo nano /etc/ntp.conf
以下の2行を追加します。server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 refid GPS stratum 15
NTPを再起動して、確認します。コード: 全て選択
$ sudo /etc/init.d/ntp restart
$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
SHM(0) .GPS. 15 l - 16 0 0.000 0.000 0.000
*ntp-a2.nict.go. .NICT. 1 u 9 64 1 10.059 0.077 0.371
こんなような出力ならOK.
SHMはShared Memoryの略です。127.127.28.0 というのはNTPの参照クロックとしてPPSを使用するという意味です。他にどのような参照クロックがあるのかは以下のページでわかります。ちなみに後でPPSを使う時にType22を追加します。
http://www.eecis.udel.edu/~mills/ntp/html/refclock.html
ついでに gpsd の設定をしておきます。コード: 全て選択
$ sudo nano /etc/default/gpsd
以下のようにしますSTART_DAEMON="true"
USBAUTO="true"
DEVICES=""
GPSD_OPTIONS="/dev/ttyAMA0"
GPSD_SOCKET="/var/run/gpsd.sock" - PPSを使ったNTPサーバを動かす
/etc/modules に次の1行を追加します。
pps-gpio
/boot/config.txt に次の1行を加えます。dtoverlay=pps-gpio,gpiopin=18
Raspberry Pi を再起動します。
モジュールがロードされたことを確認します。コード: 全て選択
$ lsmod | grep pps
pps_gpio 3089 0
pps_core 8606 1 pps_gpio
PPSが有効になったかどうか確認します。コード: 全て選択
$ dmesg |grep pps
[ 4.419329] pps_core: LinuxPPS API ver. 1 registered
[ 4.419340] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 4.426522] pps pps0: new PPS source pps@12.-1
[ 4.426674] pps pps0: Registered IRQ 163 as PPS source
pps tools をインストールします。コード: 全て選択
$ sudo apt-get install pps-tools
PPS をテストします。コード: 全て選択
$ sudo ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1537507302.999916377, sequence: 582 - clear 0.000000000, sequence: 0
source 0 - assert 1537507303.999948873, sequence: 583 - clear 0.000000000, sequence: 0
source 0 - assert 1537507304.999944369, sequence: 584 - clear 0.000000000, sequence: 0
source 0 - assert 1537507305.999934866, sequence: 585 - clear 0.000000000, sequence: 0
source 0 - assert 1537507306.999927364, sequence: 586 - clear 0.000000000, sequence: 0
source 0 - assert 1537507307.999920863, sequence: 587 - clear 0.000000000, sequence: 0
......... - 次に PPSが使えるNTPサーバをビルドします。
コード: 全て選択
$ mkdir ntp
$ cd ntp
$ sudo apt-get install libcap-dev
$ wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2.8p7.tar.gz
$ tar xvfz ntp-4.2.8p7.tar.gzを実行したところ失敗してしまいました。
このファイルが移動されてしまっており現在は以下のURLに存在していました。
https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/
そこにあった一番新しい、ntp-4.2.8p12.tar.gz 2018-08-14 08:48 6.8M を指定して実行解凍しました。コード: 全て選択
$ cd ntp-4.2.8p12
$ ./configure --enable-linuxcaps
$ make
$ sudo make install
NTPサーバーを新しく作ったものに入れ替えます。コード: 全て選択
$ sudo /etc/init.d/ntp stop
$ sudo cp /usr/local/bin/ntp* /usr/bin/
$ sudo cp /usr/local/sbin/ntp* /usr/sbin/
$ sudo /etc/init.d/ntp start
/etc/ntp.conf に以下の2行を追加します。
server 127.127.22.0 minpoll 4 maxpoll 4
fudge 127.127.22.0 flag3 1 refid PPS
それから、PPSを使うためには他のサーバーに prefer 指定が必要とのことなので、NICTのサーバの後ろに prefer を付けます。
server ntp.nict.jp iburst preferNTPサーバを再起動して ntpq -p してみるとこんなふうになっているはずです。
remote refid st t when poll reach delay offset jitter
============================================
SHM(0) .GPS. 15 l 15 16 377 0.000 11.207 21.121
oPPS(0) .PPS. 0 l 14 16 377 0.000 -0.002 0.002
*ntp-a2.nict.go. .NICT. 1 u 21 64 377 6.501 0.258 0.914
さらに、ntpq -c rv の出力はこんな感じ。
associd=0 status=0115 leap_none, sync_pps, 1 event, clock_sync,
version="ntpd 4.2.8p3@1.3265 Mon Jul 13 11:28:54 UTC 2015 (3)",
processor="armv6l", system="Linux/3.18.11+", leap=00, stratum=1,
precision=-18, rootdelay=0.000, rootdisp=1.075, refid=PPS,
reftime=d94e2d5d.88677330 Mon, Jul 13 2015 21:28:13.532,
clock=d94e2d62.c11182ca Mon, Jul 13 2015 21:28:18.754, peer=19590, tc=4,
mintc=3, offset=0.008924, frequency=-19.734, sys_jitter=0.003815,
clk_jitter=0.319, clk_wander=0.017
この場合、オフセットは 約9µs です。PPSを参照しているので、stratum=1 になっています。
と説明されていましたが、実際には以下の様になり上手く
「SHM(0) .GPS. 15 l 15 16 377 0.000 11.207 21.121」のように出てきません。
remote refid st t when poll reach delay offset jitter
==============================================================================
0.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.004
1.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.004
2.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.004
3.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.004
PPS(0) .PPS. 0 l - 16 0 0.000 0.000 0.000
*ntp-b2.nict.go. .NICT. 1 u 2 64 1 10.730 0.146 0.493
....
pi@pintp:~ $ ntpq -c rv
associd=0 status=0115 leap_none, sync_pps, 1 event, clock_sync,
version="ntpd 4.2.8p12@1.3728 Thu Sep 20 23:40:33 UTC 2018 (1)",
processor="armv6l", system="Linux/4.14.70+", leap=00, stratum=1,
precision=-18, rootdelay=0.000, rootdisp=62.919, refid=PPS,
reftime=df4f03f9.c5751372 Fri, Sep 21 2018 14:45:29.771,
clock=df4f0405.4e398dc0 Fri, Sep 21 2018 14:45:41.305, peer=2204, tc=4,
mintc=3, offset=0.015981, frequency=-9.272, sys_jitter=0.008937,
clk_jitter=0.042, clk_wander=0.004
ボケ防止にはなるやも知れません。
お解りになる方アドバイス下さい。 - GPS無しでNTPサーバを動かす