Raspberry PiでGPS時計更正のNTPサーバーを検討

電子工作に関連したフォーラムです
アバター
tankimono
記事: 419
登録日時: 2015年4月06日(月) 18:30
お住まい: 神戸市北区山田町上谷上

Raspberry PiでGPS時計更正のNTPサーバーを検討

投稿記事by tankimono » 2018年9月21日(金) 15:02

GPS時計とNTPサーバー運用にチャレンジ中!(新)GPS世界時計キットNTPサーバーキットを使用して検討していましたが少し動作に不具合?(開発もとのトライステート社に問い合わせ中)

  1. そこでGPSのPPSで高精度NTPサーバーを調査していたところ安価なRaspberry PiでnSecオーダーの高精度のNTPサーバーが実装できるとの記事を見つけました。
  2. 早速、昔に購入しパフォーマンス不足でお蔵入りしていたRaspberry Pi B+を引っ張り出してきてRaspberry PiからケーブルでGPSから電波の届く場所まで引き回すことと防滴構造のアンテナユニットのYIC製GPS/GLONASS受信機を接続してみました。
    画像
    GPS受信ユニットとRaspberry Piとの接続はRaspberry Piに「みちびき」対応GPSモジュールを接続をGPSユニットは異なりますが信号線ケーブルと電源は同じなので参考にさせていただきました。
    画像
    ところが上手く動作しません。
    丸一日朝から晩までかかりましたがRaspberry Piを設置している我が家の2階と監視制御をSSH接続で行っていた一階のPCが離れていることもあって何度もソフトの設定を確認しましたが原因が解らず夜になって就寝前に最後にGPSの送受信信号やPPS信号をデジタルオシロで観測してみようとプローブを接続したところ信号が出ていません。
  3. 何の事は無い接続をコネクターとフラットケーブルで行っていましたが其のうちの+5Vラインのケーブルがコネクタ根元で切断しています。
    早速コネクタ部分を半田で修復したところシリアル信号が確認可能となり電気的には無事接続が完了しました。
    年寄りがネットの記事を参考に見よう見真似でチャレンジしてみます。
  4. 残念ながら、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 prefer

      NTPサーバを再起動して 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
    何処かの起動パラメータ等が間違っているのでしょうがしばらくの間これで悩みそうです!
    ボケ防止にはなるやも知れません。
    お解りになる方アドバイス下さい。

アバター
tankimono
記事: 419
登録日時: 2015年4月06日(月) 18:30
お住まい: 神戸市北区山田町上谷上

負パルスGPS受信機で時計更正のNTPサーバーでの問題

投稿記事by tankimono » 2018年9月23日(日) 22:08

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

アバター
tankimono
記事: 419
登録日時: 2015年4月06日(月) 18:30
お住まい: 神戸市北区山田町上谷上

NTPのログ記録のためにNASをマウント

投稿記事by tankimono » 2018年9月28日(金) 07:13

Raspberry PiのSDカードは書換回数が数百回?と制限されるためにNTPの記録を分析するために分析データを書き出すファイル記録用にNASをマウントすることにしました。
これは私の防備録です。
  1. マウント用ディレクトリの作成

    コード: 全て選択

    sudo mkdir /mnt/nas
    sudo chmod 777 /mnt/nas
  2. マウント

    コード: 全て選択

    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
     
  3. 起動時に自動でマウント
    最終的な/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*は不要な気もするが、良く解らないのと動作しているので放っておく。
     
  4. /etc/rc.localのexit 0の前に、mount起動を記載する。

    コード: 全て選択

    sleep 20
    sudo mount -a

    を追加。
    20秒は長すぎる気がするが、5秒だとNGだったとの記述があったので、とりあえず長めに設定した。
     
  5. サーバーの記録をNASに書き出してみました。
    NTPS自身にLogを保存する機能があるようですが良く解らないので、スクリプトでクエリーの内容を定期的にCSVファイルとして書き出す機能をスクリプトで実装してみました。

    ところが、NAS内に保存されたCSVファイルをWindowsマシーンからスプレッドシート(LibreOfficeのCalc)で開くと漢字コードがこの動画のように文字化けしてしまっています。
    Rspberry Pi側での文字コードのエンコードとWindowsマシーンのアプリの読み込み時の文字コードのデコートに問題があるようです。
    • エンコードの問題は解決しました。
      LibreOfficeのCalcで読み込み時にUnicode(UTF-8)を選択してデコードすると文字化け無しに読み込めました。
  6. 「/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観測グラフ
      1. RspberryPi&GPS観測グラフ(Offset&Jitter)Jitter 安定後<10μS 2~3μS typ
        画像 画像 画像
      2. GPS時計+NTPKit観測グラフ(Offset&Jitter)Jitter 安定後<450μS
        画像 画像
      3. NICT NTPサーバー観測グラフ(Offset&Jitter)
        画像 画像

アバター
tankimono
記事: 419
登録日時: 2015年4月06日(月) 18:30
お住まい: 神戸市北区山田町上谷上

Raspberry Pi3 B+GPS時計更正のNTPサーバーを追加してみました

投稿記事by tankimono » 2018年11月12日(月) 10:37

NTPサーバーの監視データ検証のためRaspberryPiのNTPサーバーを追加して傾向を調査しています。
  1. 追加した能力的に余裕のあるRaspberry Pi 3B+ NTPサーバー
    画像 画像
    今回のRaspberry Pi 3B+は発熱が大きいとの前評判から放熱効果に優れた写真の様にアルミ・ダイキャストのケースを使用してFanレスで構築しました。
  2. 今回から監視NTPサーバーのCPU温度を同時にプロット監視しています。
    画像
    CPU温度はコマンドで取得しNTPのデータと同時にNASにCSVファイルとして書き出しています。
  3. 温度推移とNTPサーバーのオフセットをプロットしました。
    1. Raspberry Pi 3B+ NTPサーバー
      画像
      監視サーバー自身のオフセットデータで、30μS以内です。
    2. Raspberry Pi 1B+ NTPサーバー(宅内LAN内)
      画像
      オフセットは80μS以内です。
    3. 現在不具合修正中のGPS時計+NTPサーバーキットのオフセットです。
      画像
      1秒進んでおり、数日に一瞬、正常なデーターを送ってきますが殆ど1秒進んだままです。
      開発元では修正を行うべく検討中との事です。
    4. インターネットのNICT(情報通信研究機構) オフセットです
      画像
      オフセットは1mSec以内に収まっています。
    a,b,cは同じクラスCセグメントの宅内LANに配置しています。
    今回監視NTPサーバーのCPU温度を記録しましたがCPU温度とNTPサーバーのクロック・オフセットはGPS衛星からのPPSで補正されるためグラフのように影響されていません


電子工作へ戻る

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]