« ◇iPod-classicをWalkmanで置き換え | トップページ | ◇電波時計用NTPリピータ »

◆Raspi3でGPS-NTPサーバ

シリーズ「GPS-NTP」

ー - -

Raspi3をGPSを用いたntpサーバにします。

設定ファイル

 USB接続のGPSレシーバを接続

USB接続のGPSレシーバ「GLOBALSAT BU-353S4」を購入しました。

Windows用のドライバDVDなどが付いていますが今回はこれをRaspberryPi3に繋ぎます。

RaspberryPi3はNOOBS_v2_4_4のデフォルトOSで立ち上げました。

とりあえず、USBポートに挿しlsusbで確認します。

$ lsusb
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 005: ID 1c4f:0027 SiGma Micro
Bus 001 Device 004: ID 0557:8021 ATEN International Co., Ltd
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 10月 25 22:09 /dev/ttyUSB0

cuコマンドでアクセスするとNMEA-0183フォーマットのデータが得られます。
なおcuコマンドの終了は~.(チルダドット)です。

$ sudo chmod 0666 /dev/ttyUSB0
$ cu -s 4800 -l /dev/ttyUSB0
Connected.
,N,#経度データ#,E,0.77,202.78,291017,,,A*6E
$GPGGA,060352.000,#緯度データ#,N,#経度データ#,E,1,06,1.5,78.1,M,39.3,M,,0000*6B
$GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A
$GPRMC,060352.000,A,#緯度データ#,N,#経度データ#,E,0.71,202.78,291017,,,A*69
$GPGGA,060353.000,#緯度データ#,N,#経度データ#,E,1,06,1.5,78.2,M,39.3,M,,0000*69
$GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A
$GPRMC,060353.000,A,#緯度データ#,N,#経度データ#,E,0.94,202.78,291017,,,A*63
$GPGGA,060354.000,3542.1872,N,#経度データ#,E,1,06,1.5,78.3,M,39.3,M,,0000*60
$GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A
$GPRMC,060354.000,A,#緯度データ#,N,#経度データ#,E,1.15,202.78,291017,,,A*63
$GPGGA,060355.000,#緯度データ#2,N,#経度データ#,E,1,06,1.5,78.4,M,39.3,M,,0000*6

 GPSツールの導入

インストール

$ sudo apt-get update
$ sudo apt-get install gpsd gpsd-clients python-gps
$ sudo reboot


gpsd設定
dpkg-reconfigureはうまく動作しないため、設定ファイル(/etc/default/gpsd)を直接編集します。

$ sudo vi /etc/default/gpsd
---
# Default settings for the gpsd init script and the hotplug wrapper.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="false"

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyUSB0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n"
---


gpsdサービスの起動と確認

$ sudo systemctl enable gpsd
$ sudo systemctl start gpsd
$ sudo systemctl status gpsd
● gpsd.service - GPS (Global Positioning System) Daemon
   Loaded: loaded (/lib/systemd/system/gpsd.service; indirect; vendor preset: en
   Active: active (running) since Sun 2017-10-29 16:15:22 JST; 5min ago
 Main PID: 1393 (gpsd)
   CGroup: /system.slice/gpsd.service
           mq1393 /usr/sbin/gpsd -N

10月 29 16:15:22 raspi01 systemd[1]: Started GPS (Global Positioning System) Daem


gpsdデータ取得確認

$ cgps -s
+----------------------------------------++---------------------------------+
|  Time:       2017-10-29T07:26:19.587Z  ||PRN:   Elev:  Azim:  SNR:  Used: |
|  Latitude:    ##.###### N              ||   5    46    114    17      Y   |
|  Longitude:  ###.###### E              ||  24    39    206    17      Y   |
|  Altitude:   93.7 m                    ||  18    15    308    16      Y   |
|  Speed:      3.6 kph                   ||   2    02    167    05      N   |
|  Heading:    31.7 deg (true)           ||  21    33    297    06      N   |
|  Climb:      0.0 m/min                 ||  20    77    332    00      N   |
|  Status:     3D FIX (14 secs)          ||  15    63    315    00      N   |
|  Longitude Err:   n/a                  ||  13    57    030    00      N   |
|  Latitude Err:    n/a                  ||   4    44    045    00      N   |
|  Altitude Err:    +/- 73 m             ||  28    14    063    00      N   |
|  Course Err:      n/a                  ||  30    07    040    00      N   |
|  Speed Err:       n/a                  || 144    00    306    00      N   |
|  Time offset:     -2.525               ||                                 |
|  Grid Square:     PM95sq               ||                                 |
+----------------------------------------++---------------------------------+
(終了はq)
または
$ gpsmon
tcp://localhost:2947          NMEA0183>
+---------------------------------------------------------------------------+
|Time: 2017-10-29T07:28:09.587Z Lat: ## ##' ##.###" N Lon: ### ##' ##.###" E|
|--------------------------------- Cooked TPV ------------------------------|
+---------------------------------------------------------------------------+
| GPGSV GPRMC GPGGA GPGSA                                                   |
+--------------------------------- Sentences -------------------------------+
+------------------++----------------------------++-------------------------+
|Ch PRN  Az El S/N ||Time:      072814.587       ||Time:      072815.587    |
| 0   2 167  1   4 ||Latitude:     ####.#### N   ||Latitude:    ####.####   |
| 1   5 115 45  10 ||Longitude:   #####.#### E   ||Longitude:   #####.####  |
| 2  13  31 56   4 ||Speed:     0.004            ||Altitude:    101.0       |
| 3  15 318 64   5 ||Course:    338.43           ||Quality:   0   Sats: 00  |
| 4  24 207 40  25 ||Status:    V       FAA: N   ||HDOP:      1.6           |
| 5  20 333 78   0 ||MagVar:                     ||Geoid:     39.3          |
| 6   4  45 43   0 |+----------- RMC ------------++----------- GGA ---------+
| 7  21 296 34   0 |+----------------------------++-------------------------+
| 8  18 309 16   0 ||Mode: A1 Sats:              ||UTC:           RMS:      |
| 9  28  62 14   0 ||DOP: H=1.6   V=2.7   P=3.1  ||MAJ:           MIN:      |
|10  30  40  6   0 ||TOFF: -2.522070403          ||ORI:           LAT:      |
|11 144 306  0   0 ||PPS:                        ||LON:           ALT:      |
+------ GSV -------++-------- GSA + PPS ---------++----------- GST ---------+
(終了はq)
不思議なことに途中からNMEA0183ではなくSiRFとなった
$ gpsmon
/dev/ttyUSB0                  SiRF>
+----------- X ------ Y ------ Z --------- North ---- East --- Alt ---------+
|Pos: -#######  #######  ####### m      ##.##### ###.#####     234 m        |
|Vel:     -0.4     -0.1     -0.2 m/s        -0.3       0.3     0.0 climb m/s|
|Time: 2017-11-12T07:50:00.000Z Leap: ??    Heading: 133.6f    0.5 speed m/s|
|Fix:  5 = 24 15 18 21 10                            HDOP:2.6 M1: 84  M2: 02|
+----------------------- Packet type 2 (0x02) ------------------------------+
l Measured Tracker ----------++ Firmware Version ---------------------------+
|Ch PRN  Az El Stat  C/N ? SF||                                             |
| 0  20 157 62 00ad 16.8     |+------- Packet Type 6 (0x06) ----------------+
| 1  21 253 30 00bf 35.7 T   |l CPU Throughput -----------------------------+
| 2  24 244 77 00ad 23.3     ||Max: 0.000  Lat: 0.000  Time: 0.000   MS:  0 |
| 3  18 309 45 00ad 24.7     |+------- Packet type 9 (0x09) ----------------+
| 4   5 139 14 00ad 19.2     |l Clock Status -------------------------------+
| 5  15  45 62 00ad 17.2     ||SVs:    Drift:        Bias:                  |
| 6  13  67 31 0000  0.0     ||GPS Time:             PPS:                   |
| 7  10 315 15 00bf 27.4 T   |+------- Packet type 7 (0x07) ----------------+
| 8 193 307  7 002d 22.2     |+ Visible List -------------------------------+
| 9  12 162 19 0000  0.0     ||                                             |
|10  28  33  5 0000  0.0     |+------- Packet type 13 (0x0D) ---------------+
|11 128 249 18 00bf 37.8 T   |l DGPS Status --------------------------------+
+--- Packet Type 4 (0x04) ---+|                                             |
                              +------- Packet type 27 (0x1B) ---------------+
(終了はq)
良く見るとNMEA0183はtcp://localhost:2947となっており、
SiRFは/dev/ttyUSB0となっています。


gpsdサービスの自動起動

本来はsystemctlの設定でシステムboot時に自動起動されるか、ntpからのアクセス時に起動されるはずですが、起動されないので/etc/rc.localで強制起動させます。

$ sudo vi /etc/rc.local
---
...
systemctl start gpsd
exit 0
---
$ sudo reboot
..
$ ps -ea | grep gbs
  (確認)

なお、次の操作を行うと/etc/rc.localの設定なしで起動することは確認できましたが、動作が不安定となりました。

sudo ln -s /lib/systemd/system/gpsd.service \
           /etc/systemd/system/multi-user.target.wants/

 ntpd(クライアント&サーバ)の導入

ntpdはクライアントとサーバの両機能を持ちます。

クライアントとして他のサーバに問い合わせる設定は外し、 クライアントとしてGPSの情報で時刻を取得する設定と、サーバとして他からの問い合わせに答える設定を追加します。

インストール

$ sudo apt-get install ntp
$ sudo reboot


クライアント基本動作の確認

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 0.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.001
 1.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.001
 2.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.001
 3.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.001
 2404:1a8:1102:: .STEP.          16 u    -   64    0    0.000    0.000   0.000
 2404:1a8:1102:: .STEP.          16 u    -   64    0    0.000    0.000   0.000
+y.ns.gin.ntt.ne 249.224.99.213   2 u    1   64   77   16.458    6.536  12.531
*marisa.jp.futa. 103.1.106.69     2 u   66   64   37   27.350  -11.807   9.745
+chobi.paina.net 131.113.192.40   2 u    9   64   37    8.355   10.494  15.562
+marisa.jp.futa. 103.1.106.69     2 u   53   64   37   44.904  -15.457   8.640
$ date
2017年 10月 29日 日曜日 17:16:32 JST


ntpdでGPSのデータを参照する設定
/etc/ntp.confを編集します。デフォルトのserver指定は全て削除します。

$ sudo cp /etc/ntp.conf /etc/ntp.conf.org
$ sudo vi /etc/ntp.conf
--- 以下6行で全てです
driftfile /var/lib/ntp/ntp.drift
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 refid GPS stratum 3
restrict 127.0.0.1
restrict ::1
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
---
$ sudo reboot
127.127.28.0がGPSとやり取りをする共有メモリを表す表現らしいです。
fudge指定のstratum 3はGPSを信頼するレベルの指定です。
restrictはntpサーバとしての設定です。


ntpdがGPSデータを参照しているか確認

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*SHM(0)          .GPS.            3 l    3   16  201    0.000  253.731 253.731
 2404:1a8:1102:: .STEP.          16 u    -   64    0    0.000    0.000   0.000
 2404:1a8:1102:: .STEP.          16 u    -   64    0    0.000    0.000   0.000
SHM(0)の前に'*'が付いていれば正常に動作しています。
詳細なstatusはsystemctl status ntpで得られます。
$ sudo systemctl status ntp
● ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
   Active: active (running) since Sun 2017-10-29 18:11:47 JST; 2min 44s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 636 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
  Process: 648 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/ntp.service
           mq661 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -c /run/ntp.conf.dhcp -u

10月 29 18:11:47 raspi01 systemd[1]: Started LSB: Start NTP daemon.
10月 29 18:11:47 raspi01 ntpd[661]: proto: precision = 1.458 usec (-19)
10月 29 18:11:47 raspi01 ntpd[661]: Listen and drop on 0 v6wildcard [::]:123
10月 29 18:11:47 raspi01 ntpd[661]: Listen and drop on 1 v4wildcard 0.0.0.0:123
10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 2 lo 127.0.0.1:123
10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 3 lo [::1]:123
10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 4 eth0 [2001:240:2193:6300
10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 5 eth0 [fe80::c9d1:7089:42
10月 29 18:11:47 raspi01 ntpd[661]: Listening on routing socket on fd #22 for int
10月 29 18:11:52 raspi01 ntpd[661]: Listen normally on 6 eth0 192.168.1.40:123

 別raspiマシンから参照する

別マシンのntpdから参照するようにします。
なお、GPSntpdサーバマシンはホスト名:raspi01、ipアドレス:192.168.1.40となっています。

ntpd設定
/etc/ntp.confのserver指定を置き換えます。

$ sudo cp /etc/ntp.conf /etc/ntp.conf.org
$ sudo vi /etc/ntp.conf
--- 変更部のみ載せます
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
#pool ntp.nict.jp iburst
server raspi01.local iburst
---
$ sudo reboot

確認

$ 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
$ date
2017年 10月 29日 日曜日 20:15:09 JST

念のためntpdateで確認

$ sudo apt-get install ntpdate # インストール
$ sudo systemctl stop ntp      # このマシンのntpdを一旦止める
$ sudo ntpdate raspi01.local   # ntpdateで確認
29 Oct 19:34:39 ntpdate[1249]: adjust time server 192.168.1.40 offset 0.002053 sec

 別マシン(Windows)から参照する

Windowsの時刻管理でGPSntpdサーバマシンを参照する形にできます。

 田
  ギア
   時刻と言語
    日付と時刻
     日付、時刻、地域の追加設定
      日付と時刻の設定
       インターネット時刻
         設定の変更
     「サーバ指定」
            今すぐ更新(U)
なお、日本の標準ntpサーバに接続するにはntp.nict.jpを指定します。

 電波時計用NTPリピータから参照する

###2017/11/2
電波時計用NTPリピータからも参照できることを確認しました。

記事「◆電波時計用NTPリピータ」


 残項目:pts時刻を手動でGPSに合わせる

###
起動時に強制的に同期させることはできました。
記事:◇自動GPS-システム時計強制同期
###

Raspiはバッテリーバックアップされた時計を持ちませんのでshutdown後しばらくして起動すると、内蔵時刻がずれます。

サーバー(ここではGPS)から得られる時刻とのずれが大きい場合ntpはこのサーバーを信頼せず、時刻の修正を行いません。
時刻をdateで設定することにより時刻のずれが減ると、ntpがGPSを信頼するようになります。

$ date
2017年 10月 31日 火曜日 02:22:49 JST
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 SHM(0)          .GPS.            1 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のデータが採用されていないことが分かる
$ gpsmon
# GPSのデータを表示させ、時刻部をコピー

$ sudo date -s 2017-10-31T08:16:06.000Z
2017年 10月 31日 火曜日 17:16:06 JST
# dateコマンドでコピーした時刻をペーストしセット
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*SHM(0)          .GPS.            1 l   16   16   77    0.000    0.820   1.197
 2404:1a8:1102:: .STEP.          16 u    -  128    0    0.000    0.000   0.000
 2404:1a8:1102:: .STEP.          16 u    -  128    0    0.000    0.000   0.000
# 少し時間をおくとGPSが参照されている

$ date
2017年 10月 31日 火曜日 17:18:32 JST

自動的に行う方法はまだ見つけていません。
stratumを1にする、0にするなどをやってみましたがだめでした。

 PPSについて

今回はUSB接続を用いました。
情報は4600bpsのテキストベースのNMEAフォーマットで得るため、時間がかかります。
GPS装置ではこのNMEAとは別に秒の変わり目ごとにPPS(PulsePerSecond)と呼ぶパルスを出す機能があるものがあります。
PPS得ることができれば時刻管理をより精密にすることができます。
折角のRaspiなので、PPS端子を持つGPSモジュールを使った精密サーバも検討しています。

###
PPSを用いたNTPサーバも立ち上げてみました。 ◇GPS+PPSでNTPサーバを立てる参照

|

« ◇iPod-classicをWalkmanで置き換え | トップページ | ◇電波時計用NTPリピータ »

トラックバック


この記事へのトラックバック一覧です: ◆Raspi3でGPS-NTPサーバ:

« ◇iPod-classicをWalkmanで置き換え | トップページ | ◇電波時計用NTPリピータ »