◇GPS+PPSでNTPサーバを立てる
シリーズ「GPS-NTP」
- ◆Raspi3でGPS-NTPサーバ
- ◇電波時計用NTPリピータ
- ◇GPS+PPSでNTPサーバを立てる〇
- ◇自動GPS-システム時計強制同期
- ◇GPS,PPSとインターネット上のNTPサーバの比較
- ◇GPS,GPS+PPSを使うNTPサーバの調整
ー - -
PPS出力のあるGPSモジュールをRaspi3に繋ぎlocal環境で動くNTPサーバを立ち上げました。
使用したRaspiのバージョンは NOOBS_v2_4_4 + 2017/11/07upgrade です。
$ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 9.1 (stretch) Release: 9.1 Codename: stretch
PPS出力のないGPSレシーバを使う例を ◆Raspi3でGPS-NTPサーバに載せてあります。
GPSモジュール
Raspi3にPPS出力のあるGPSモジュール 「WINGONEER GPSモジュール アンテナ、Uart TTL、EEPROM、1PPS、LNA、USBを備えたU-blox NEO-7N」というセットを導入しました。
基盤はアンテナコネクタのみ半田付けが必要でした。
基盤とRaspiのGPIO接続はVCC=>5V(赤),GND=>GND(黒),PPS=>GPIO18(青)となっています。
基盤とRaspiのUSBを接続しました(シリアル:NMEA)。
TXD,RXD(UART)は繋いでいません。
USBを接続するなら電源(VCC,GND)の接続は不要だとわかりました。当たり前だと言えば当たり前ですが。
接続しアンテナを繋いでしばらくするとPPSランプが1秒間隔で点滅し始めました。
GPSツール
gpsツールは自動的に
- usbに繋いだgpsモジュールを認識し
- /dev/ttyACM0にマウントし
- /dev/gps0にリンク
次のようにインストール,リブートします。
$ ls /dev/g* /dev/gpiochip0 /dev/gpiochip1 /dev/gpiochip2 /dev/gpiomem
$ sudo apt-get install gpsd gpsd-clients python-gps $ sudo reboot
$ ls /dev/g*
/dev/gpiochip0 /dev/gpiochip1 /dev/gpiochip2 /dev/gpiomem /dev/gps0@
$ ls -l /dev/gps0
lrwxrwxrwx 1 root root 7 11月 6 15:12 /dev/gps0 -> ttyACM0
リブート前にはなかったdev/gps0が追加されていることが分かります。
cgps -sまたはgpsmonでGPS情報の表示ができます。 (◆Raspi3でGPS-NTPサーバ#gpsdデータ取得確認参照)
$ cgps -s ... qで終了 $ gpsmon ... qで終了
PPSツール
GPIOに繋いだPPSにアクセス可能とするには
- ツールをインストール
- /etc/modulesにppsモジュールを定義
- /boot/config.txtにppsモジュールとピンアサインを定義
- reboot
$ sudo apt-get install pps-tools $ sudo vi /etc/modules --- 最後に追加 ... ## ADD for PPS pps-gpio --- $ sudo vi /boot/config.txt --- 最後に追加 ... ## ADD for PPS dtoverlay=pps-gpio,gpiopin=18 --- $ sudo reboot
ppstest /dev/pps0でpps信号を確認します。
$ sudo ppstest /dev/pps0 source 0 - assert 1509949465.000804265, sequence: 139 - clear 0.000000000, sequence: 0 source 0 - assert 1509949466.000793628, sequence: 140 - clear 0.000000000, sequence: 0 source 0 - assert 1509949467.000779507, sequence: 141 - clear 0.000000000, sequence: 0 source 0 - assert 1509949468.000773862, sequence: 142 - clear 0.000000000, sequence: 0 source 0 - assert 1509949469.000762984, sequence: 143 - clear 0.000000000, sequence: 0 source 0 - assert 1509949470.000755501, sequence: 144 - clear 0.000000000, sequence: 0 source 0 - assert 1509949471.000746867, sequence: 145 - clear 0.000000000, sequence: 0 ^C (コントロールCでおわります) $ ls /dev/pps* /dev/pps0 /dev/pps1
GPSをNTPサーバに反映する
設定ファイル 2つの
- /etc/default/gpsd
- /etc/ntp.conf
$ sudo vi /etc/default/gpsd --- 一行変更 ... # Other options you want to pass to gpsd GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n" --- $ sudo vi /etc/ntp.conf --- 完全置き換え driftfile /var/lib/ntp/ntp.drift restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery restrict 127.0.0.1 mask 255.255.255.0 restrict 192.168.1.0 mask 255.255.255.0 restrict -6 ::1 server 127.127.28.0 prefer minpoll 4 maxpoll 4 fudge 127.127.28.0 time1 0.002 refid GPS stratum 14 server 127.127.22.0 fudge 127.127.22.0 time1 -0.060 refid PPS stratum 0 --- $sudo reboot
ristrictはサーバーとしての設定です。
127.127は内部機構を表し、28.0はgpsd(NMEA)、22.0は/dev/pps0(PPS)を表します。
ppsが参照するgpsの設定にはpreferを書いておく必要があります。
gpsのstratumは4~14の間であれば何でも構いません。
PPSのstratumは0にします。
time1はntpq -pで出るoffsetの1/1000の値を符号を反転し少数表示で設定しました。
調整の仕方に関しては
◇GPS,GPS+PPSを使うNTPサーバの調整
を参考にしてください。
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 0 l 24 64 17 0.000 -2.075 0.813 PPS(0) .PPS. 0 l 23 64 7 0.000 58.075 0.940 $ ntpq -p
ntp動作確認
ntpがGPS/PPSの情報で制御されているかを確認します。
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 10 l 4 16 377 0.000 -2.955 3.005 oPPS(0) .PPS. 0 l 48 64 377 0.000 -0.045 0.024 2404:1a8:1102:: .STEP. 16 u - 512 0 0.000 0.000 0.000 2404:1a8:1102:: .STEP. 16 u - 512 0 0.000 0.000 0.000 $ ntpq -c rv associd=0 status=0115 leap_none, sync_pps, 1 event, clock_sync, version="ntpd 4.2.8p10@1.3728-o Sat Oct 7 14:29:08 UTC 2017 (1)", processor="armv7l", system="Linux/4.9.59-v7+", leap=00, stratum=1, precision=-19, rootdelay=0.000, rootdisp=14.649, refid=PPS, reftime=ddaac169.d00430bf Mon, Nov 6 2017 20:09:29.812, clock=ddaac179.074ec681 Mon, Nov 6 2017 20:09:45.028, peer=32132, tc=6, mintc=3, offset=-4.596133, frequency=17.870, sys_jitter=8.880281, clk_jitter=8.019, clk_wander=0.127
ntpq -p出力でSHM(0)GPSに'*'が付き、PPS(0)PPSに'o'が付けば正常に動作しています。この状態になるまでに少し時間がかかります。
ntpq -c rvで確認するとstratumeは(1=0+1)、refid=PPSとなっており、PPSを認識していることが分かります。
他マシンのntpで参照
他マシンから参照すると次のようになっていました。
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.1.14 .PPS. 1 u 4 64 1 0.539 0.049 0.016PPSでstratumが1となっています。
PPSを使っていないサーバの場合は
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.1.40 SHM(0) 4 u 43 64 377 0.581 -4.549 3.296となっていました。PPSを用いた方がjitterが小さいことが分かります。
他マシンでの参照設定は ◆Raspi3でGPS-NTPサーバ#別raspiマシンから参照するを参照してください。
falseticker検査
途中でGPS/PPSともに
'x' : falseticker検査で, 参照リストから外れたサーバ(falsetick)
になってしまいました。
ただ、しばらくすると復帰します。
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== xSHM(0) .GPS. 14 l 8 16 377 0.000 6.255 1.900 xPPS(0) .PPS. 0 l 6 16 377 0.000 0.057 0.052 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000 # しかし少ししてチェックすると $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 14 l 5 16 377 0.000 1.222 2.468 oPPS(0) .PPS. 0 l 3 16 377 0.000 0.052 0.009 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000
詳細は不明ですが、GPSのoffsetが大きすぎると"信頼しない"ということかもしれません。
stratum設定との兼ね合い(大きい方が大きい誤差も許される)もありそうですが不明です。
衛星補足数が少ない状態があると"信頼しない"ということもありそうです。
残項目:pts時刻を手動でGPSに合わせる
###
起動時に強制的に同期させることはできました。
記事:◇自動GPS-システム時計強制同期
###
Raspiはバッテリーバックアップされた時計を持ちませんのでshutdown後しばらくして起動すると、内蔵時刻がずれます。
サーバー(ここではGPS)から得られる時刻とのずれが大きい場合ntpはこのサーバーを信頼せず、時刻の修正を行いません。
時刻をdateで設定することにより時刻のずれが減ると、ntpがGPSを信頼するようになります。
date 2017年 11月 7日 火曜日 23:30:54 JST hiura@raspi02:~ $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== SHM(0) .GPS. 14 l - 16 0 0.000 0.000 0.000 PPS(0) .PPS. 0 l - 16 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 1024 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 1024 0 0.000 0.000 0.000 # SHM(0)に'*'が付いておらず、GPSのデータが採用されていないことが分かる
# GPSのデータを表示させ、時刻部をコピー
$ gpsmon
# dateコマンドでコピーした時刻をペーストしセット
$ sudo date -s 2017-11-07T16:22:47.000Z
2017年 11月 8日 水曜日 01:22:47 JST
$ sudo reboot
# 確認 $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 14 l 14 16 7 0.000 3.390 1.622 oPPS(0) .PPS. 0 l 13 16 3 0.000 -3.091 0.126 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 64 0 0.000 0.000 0.000
自動的に行う方法はまだ見つけていません。
stratumを1にする、0にするなどをやってみましたがだめでした。
UART接続
当初UART接続(TXD,RXD)を試みたのですが、うまく行きませんでした。
その内再挑戦してみようと考えています。
| 固定リンク