2017年8月6日

樹莓派 NTP SERVER 設定,含 PPS 訊號源

在某些情況下,程式運作時需要得知極為精確的時間,例如GPS定位、地震波的測量等等。在設置這些研究用的軟硬體時,我們可以透過"網路時間協定"(Network Time Protocol,簡稱NTP )來協助作業系統進行精確的時間比較。NTP會透過其他的NTP server對本機做校時,誤差可以小到 0.01個微秒左右。

網路上已有很多的 NTP 校時資訊,而以下的內容是建立自己的校時伺服器(NTP server),供給其他儀器使用。

為什麼要有自己的 NTP server?因為網路上的 NTP server 距離你需要校時的儀器可能很遙遠,會產生較大的延遲與誤差,被校時的儀器距離 NTP server 越近越好,最好在同一個區域網路底下。而如果有諸多儀器需要校時,使用同一個 NTP server 當然是最好的。因此我們可能會有需要自己建立 NTP server 的時候。


NTP server 的建立很簡單,在 linux 底下執行
sudo apt-get install ntp #安裝
sudo service ntp start #執行ntp服務
ntpq -p # 查看ntp server的狀況

其他設定
sudo vim /etc/ntp.conf #裡面可以更改其他校時伺服器的選擇

----------------------------------------------------------------------------
以上是網路上最常見最簡單的 NTP server 資料,但在某些情況下我們會沒有網路進行校時。那就要依靠 PPS 訊號或是 GPS 訊號協助校時。在有網路的情況下,有這兩項技術也可以幫助校時。

GPS 校時需要有一塊 GPS 晶片透過 UART 或是 I2C 等通訊方法,把資訊傳進樹莓派,然後使用gpsd 等服務配合NTP進行校時,確切設定也在 /etc/ntp.conf 中。

----------------------------------------------------------------------------
PPS 是 Pulse-per-second 每秒一次訊號的意思。比方手錶內的石英晶片,會傳出固定的振動頻率,有了這個頻率我們就可以精確的執行校時。其實原子鐘也是類似的原理,人類的校時技術目前大概就只能透過精確的測量頻率。

PPS 功能通常附加在 RTC 晶片或 GPS 晶片底下,而樹莓派這兩個都沒有,我買了一個DS3231 RTC 原本要用來做樹莓派的時鐘,但後來發現中國製的晶片會有問題,只能拿來做 PPS 訊號源。

------------------------------------------------------------------------
DS2321是 I2C 界面的晶片,插入樹莓派的 GPIO 後,如要正常使用 RTC
#config i2c device
sudo apt-get install i2c-tools
sudo bash
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device #寫入註冊
exit
i2cdetect -y 1 #偵測位置是否正確
sudo i2cdump -f -y 1 0x68 #查看裝置內容
sudo i2cset -f -y 1 0x68 0x0e 0x00 #更改裝置內容成00,才能啟用PPS腳位
sudo reboot

#hwclock
sudo heclock -r #讀取實時時鐘
sudo heclock -w #把現在時間寫入實時時鐘
timdatectl #查看時間資訊

------------------------------------------------------------------------
若要有PPS的功能還需以下
#install
sudo apt-get install vim pps-tools i2c-tools #安裝套件

#config pps gpio pin 設定 gpio 4為pps訊號源
sudo vim /boot/config.txt #修改並加入下一行
dtoverlay=pps-gpio,gpiopin=4

#config pps modules #開機啟用pps模組
sudo vim /etc/modules #修改並加入下一行
pps-gpio

sudo reboot

#see mod exist?
lsmod

#pps test
sudo ppstest /dev/pps0 #若有穩定訊號產生就代表成功了

------------------------------------------------------------------------
結合NTP與PPS功能
通常NTP沒有PPS的功能,需要重新下載並編譯
#re-built ntp for pps
mkdir ntp
cd ntp  
sudo apt-get install libcap-dev
sudo apt-get install libssl-dev
wget http://archive.ntp.org/ntp4/ntp-dev/ntp-dev-4.3.93.tar.gz # development
(May redirect to:  https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-dev/)
tar xvfz ntp-dev-4.3.93.tar.gz 
cd ntp-dev-4.3.93
./configure --enable-linuxcaps # takes 11-15 minutes
make -j5 
sudo apt-get remove ntp #請務必移除舊的
sudo make install   

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
ntpq -crv -pn # optional step to check for version and basic function

安裝完後進入設定
#ntp server config
sudo vim /etc/ntp.conf

server 127.127.22.0 minpoll 4 maxpoll 4 #加入pps訊號源,他是使用保留ip作為來源
fudge 127.127.22.0 refid PPS #重新命名成PPS

sudo service ntp restart
ntpq -p #理論上就可以看到PPS了

------------------------------------------------------------------------
~$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
=========================================================
*ntp.ntu.edu.tw  .GPS.            1 u   18   32  377    9.243    0.224   0.387
+ntp2.ntu.edu.tw .GPS.            1 u   25   32  377    9.183    0.107   0.579
+118-163-81-61.H 192.168.0.3      2 u   34   64  377    9.691    0.438   0.791
-211-22-103-158. 192.168.0.2      2 u   35   64  377   10.192    1.762   0.274
-118-163-81-63.H 192.168.0.3      2 u   47   64  377   10.081    1.215   0.514

ntpq -p前段看到的服到代表目前對這個NTP來源的使用狀態(http://doc.ntp.org/4.1.0/ntpq.htm)
space reject 無法使用,無法聯繫上
x  falsetick 拒絕,因為某些原因被演算法拒用
.  excess 在第十名之外的候選者
-  outlyer 演算法認為此訊號是偏移值
+  candidat 此訊號源存活並被列入演算法使用的候選之中
#  selected 此訊號源存活但未在前六名之中
*  sys.peer 系統時間的優先比對者
o  pps.peer PPS訊號專用的符號

1 則留言:

  1. 執行 make -j5後,出現錯誤如下
    error: storage size of ‘ctx’ isn’t known
    warning: unused variable ‘ctx’ [-Wunused-variable]
    [Makefile:597: all] Error 2

    請問要修改哪裡的CTX 變數?

    回覆刪除