- そこで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サーバを動かす
Raspberry PiでGPS時計更正のNTPサーバーを検討
Raspberry PiでGPS時計更正のNTPサーバーを検討
GPS時計とNTPサーバー運用にチャレンジ中!で(新)GPS世界時計キットとNTPサーバーキットを使用して検討していましたが少し動作に不具合?(開発もとのトライステート社に問い合わせ中)
負パルスGPS受信機で時計更正のNTPサーバーでの問題
私の所有している負極正のPPSパルス出力のGPPS受信機でRaspberry PiでGPSのPPSパルスで時計更正のNTPサーバーの運用できるか検討しています。
PPSパルスドライバーやNTSサーバーでパルスエッジの立ち上がりや立下りの選択があるなら問題は解消されますが今のところ確認は出来ておらずデフォルトの正極性パルスの立ち上がりエッジでの動作しか行えていません。
私の観測では以下の解析データの通りです。

この様に負パルスのGPS受信機を接続すると75~100mSec程度遅延オフセットしており、
又数十mSecのジッタが発生しているようです。
このジッタの主原因はPPSパルスの負パルス幅がGPS精度を有しておらずパルス幅がCR定数?で変動しているように思われます。
PPSパルスドライバーやNTSサーバーでパルスエッジの立ち上がりや立下りの選択があるなら問題は解消されますが今のところ確認は出来ておらずデフォルトの正極性パルスの立ち上がりエッジでの動作しか行えていません。
私の観測では以下の解析データの通りです。

この様に負パルスのGPS受信機を接続すると75~100mSec程度遅延オフセットしており、
又数十mSecのジッタが発生しているようです。
このジッタの主原因はPPSパルスの負パルス幅がGPS精度を有しておらずパルス幅がCR定数?で変動しているように思われます。
NTPのログ記録のためにNASをマウント
Raspberry PiのSDカードは書換回数が数百回?と制限されるためにNTPの記録を分析するために分析データを書き出すファイル記録用にNASをマウントすることにしました。
これは私の防備録です。
これは私の防備録です。
- マウント用ディレクトリの作成
コード: 全て選択
sudo mkdir /mnt/nas
sudo chmod 777 /mnt/nas - マウント
コード: 全て選択
sudo mount -t cifs //192.168.0.xxx/xxxx/xxxx /mnt/nas -o username=xxxx,password=xxxx,file_mode=0777,dir_mode=0777,iocharset=utf8
//192.168.0.xxx/xxxx/xxxxはNASのIPアドレスとソース・ディレクトリー
マウント先のディレクトリ /mnt/nas
usernameはNASにアクセス出来るID
- 起動時に自動でマウント
最終的な/etc/fstabの記述コード: 全て選択
//192.168.0.xxx/xxxxx/xxxx /mnt/nas cifs username=xxxx,password=xxxxx,file_mode=0777,dir_mode=0777,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,defaults 0 0
uid,gid,force*は不要な気もするが、良く解らないのと動作しているので放っておく。
- /etc/rc.localのexit 0の前に、mount起動を記載する。
コード: 全て選択
sleep 20
sudo mount -a
を追加。
20秒は長すぎる気がするが、5秒だとNGだったとの記述があったので、とりあえず長めに設定した。
- サーバーの記録をNASに書き出してみました。
NTPS自身にLogを保存する機能があるようですが良く解らないので、スクリプトでクエリーの内容を定期的にCSVファイルとして書き出す機能をスクリプトで実装してみました。
ところが、NAS内に保存されたCSVファイルをWindowsマシーンからスプレッドシート(LibreOfficeのCalc)で開くと漢字コードがこの動画のように文字化けしてしまっています。
Rspberry Pi側での文字コードのエンコードとWindowsマシーンのアプリの読み込み時の文字コードのデコートに問題があるようです。- エンコードの問題は解決しました。
LibreOfficeのCalcで読み込み時にUnicode(UTF-8)を選択してデコードすると文字化け無しに読み込めました。
- エンコードの問題は解決しました。
- 「/boot/cmdline.txtの最後に "nohz = off"という指示文を追加すると、ジッタが最大50%減少します」
との記載を見つけました。コード: 全て選択
sudo nano /boot/cmdline.txt
で"nohz = off"を以下の様に追加しました。
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline rootwait nohz=off
確かにjitterがテスト中ですが半減しているような気がします- ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
oPPS(0) .PPS. 0 l - 8 377 0.000 -0.006 0.003
remote refid st t when poll reach delay offset jitter
==============================================================================
oPPS(0) .PPS. 0 l 15 16 377 0.000 -0.002 0.002
remote refid st t when poll reach delay offset jitter
==============================================================================
oPPS(0) .PPS. 0 l 4 16 377 0.000 -0.001 0.002 - Offset & jitter観測グラフ
- ntpq -p
Raspberry Pi3 B+GPS時計更正のNTPサーバーを追加してみました
NTPサーバーの監視データ検証のためRaspberryPiのNTPサーバーを追加して傾向を調査しています。
- 追加した能力的に余裕のあるRaspberry Pi 3B+ NTPサーバー
今回のRaspberry Pi 3B+は発熱が大きいとの前評判から放熱効果に優れた写真の様にアルミ・ダイキャストのケースを使用してFanレスで構築しました。 - 今回から監視NTPサーバーのCPU温度を同時にプロット監視しています。
CPU温度はコマンドで取得しNTPのデータと同時にNASにCSVファイルとして書き出しています。 - 温度推移とNTPサーバーのオフセットをプロットしました。
- Raspberry Pi 3B+ NTPサーバー
監視サーバー自身のオフセットデータで、30μS以内です。 - Raspberry Pi 1B+ NTPサーバー(宅内LAN内)
オフセットは80μS以内です。 - 現在不具合修正中のGPS時計+NTPサーバーキットのオフセットです。
1秒進んでおり、数日に一瞬、正常なデーターを送ってきますが殆ど1秒進んだままです。
開発元では修正を行うべく検討中との事です。 - インターネットのNICT(情報通信研究機構) オフセットです
オフセットは1mSec以内に収まっています。
今回監視NTPサーバーのCPU温度を記録しましたがCPU温度とNTPサーバーのクロック・オフセットはGPS衛星からのPPSで補正されるためグラフのように影響されていません。 - Raspberry Pi 3B+ NTPサーバー
オンラインデータ
このフォーラムを閲覧中のユーザー: なし & ゲスト[2人]