« ◇俳句は8/8拍;俳句の拍パターン | トップページ | ◇顔がかゆい »

◇GPS+PPSでNTPサーバを立てる

シリーズ「GPS-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ツールは自動的に

  1. usbに繋いだgpsモジュールを認識し
  2. /dev/ttyACM0にマウントし
  3. /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にアクセス可能とするには

  1. ツールをインストール
  2. /etc/modulesにppsモジュールを定義
  3. /boot/config.txtにppsモジュールとピンアサインを定義
  4. 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.016
PPSで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)を試みたのですが、うまく行きませんでした。
その内再挑戦してみようと考えています。

|

« ◇俳句は8/8拍;俳句の拍パターン | トップページ | ◇顔がかゆい »

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/489055/72163273

この記事へのトラックバック一覧です: ◇GPS+PPSでNTPサーバを立てる:

« ◇俳句は8/8拍;俳句の拍パターン | トップページ | ◇顔がかゆい »