HCL:树莓派3 GPS

跳转到:导航搜索

这是一个将树莓派3配置为本地时间服务器的指南,使用具有pps输出的GPS模块,并配置gpsd和chrony服务。它还会禁用板载蓝牙以使用/dev/ttyAMA0作为gps数据源。

注意:您完全可以使用USB GPS,只需要设备具有指向所选gpio引脚的pps输出,并修改dt overlay即可。

GPS模块

只要GPS模块具有pps输出,就应该可以正常工作。例如,NEO-6M(Arduino GPS,无人机微控制器GPS接收器)兼容51微控制器STM32 Arduino UNO R3,带有IPEX天线,高灵敏度,用于导航卫星定位,用于创建此HCL条目。

设备树 (DT) overlay

需要使用设备树 (DT) overlay激活GPS模块的PPS输出。此配置位于/boot/efi/extraconfig.txt。GPIO引脚18是由于其位于gps的tx和rx引脚旁边而选择的。

dtparam=spi=on
dtoverlay=disable-bt
dtoverlay=pps-gpio,gpiopin=18
core_freq=250
force_turbo=1

YaST引导加载程序更改

启动YaST引导加载程序,并将默认值修改为;

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 splash=silent plymouth.enable=0 console=ttyS0,115200n8"

修改为;

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 splash=silent plymouth.enable=0 console=tty1"

现在重新启动系统,并检查pps和AMA0设备是否存在,例如;

dmesg |egrep "ttyAMA0|pps0"
[    4.939465] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 66, base_baud = 0) is a PL011 rev2
[   20.034296] pps pps0: new PPS source pps@12.-1
[   20.034388] pps pps0: Registered IRQ 79 as PPS source

如果设备存在,您可以继续安装额外的gpsd和pps-tools软件包,检查pps输出并配置gpsd和chrony。如果您需要,可以安装gpsd-clients软件包,但它会引入大量的X客户端软件包。

zypper in gpsd pps-tools

测试pps输出是否正常工作;

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 1616795192.000002666, sequence: 19800 - clear  0.000000000, sequence: 0
source 0 - assert 1616795193.000001291, sequence: 19801 - clear  0.000000000, sequence: 0
source 0 - assert 1616795194.000000385, sequence: 19802 - clear  0.000000000, sequence: 0
source 0 - assert 1616795195.000001398, sequence: 19803 - clear  0.000000000, sequence: 0

如果看到数据,则一切正常,可以继续进行进一步的配置。

GPSD配置

如果仅使用ipv4,则需要将gpsd.service和gpsd.socket复制到/etc/systemd/system,并编辑掉ipv6 ListenStream行;

[Unit]
Description=GPS (Global Positioning System) Daemon Sockets

[Socket]
ListenStream=/var/run/gpsd.sock
#ListenStream=[::1]:2947
ListenStream=127.0.0.1:2947
SocketMode=0600

[Install]
WantedBy=sockets.target

不要忘记在编辑后运行systemctl daemon-reload
编辑/etc/sysconfig/gpsd并添加以下选项;

GPSD_OPTIONS="-G -n -b /dev/ttyAMA0 /dev/pps0"

现在测试gpsd服务是否启动,并且没有错误;

systemctl start gpsd

systemctl status gpsd

● gpsd.service - GPS (Global Positioning System) Daemon
     Loaded: loaded (/etc/systemd/system/gpsd.service; disabled; vendor preset: disabled)
     Active: active (running) since ...
TriggeredBy: ● gpsd.socket
   Main PID: 697 (gpsd)
      Tasks: 3
     CGroup: /system.slice/gpsd.service
             └─697 /usr/sbin/gpsd -G -n -b /dev/ttyAMA0 /dev/pps0

Feb 08 06:00:19 host systemd[1]: Starting GPS (Global Positioning System) Daemon...
Feb 08 06:00:19 host systemd[1]: Started GPS (Global Positioning System) Daemon.


如果没有报告错误,请启用该服务以在启动时启动。

systemctl enable gpsd

Chronyd配置

/etc/chrony.d/中创建一个名为例如gps_time.conf的新文件,至少您需要两个gps refclock源,允许本地访问并允许本地同步。

# Add gps and pps as reference clock
refclock SHM 0  delay 0.5 refid NMEA
refclock PPS /dev/pps0 refid PPS

# Allow NTP client access from local network.
allow xxx.xxx.xxx.xxx/xx

# Serve time even if not synchronized to a time source.
local stratum 10

测试

现在重新启动chronyd,只要没有错误,就可以继续进行测试。

检查NMEA (a -) 和 PPS (a *) 源是否已同步,方法是使用以下命令;

chronyc sources -v

210 Number of sources = 6

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#- NMEA                          0   4     3    13   +142ms[ +149ms] +/-  250ms
#* PPS                           0   4   203    12   +502ns[+7004us] +/-  155us
^- 097-091-222-080.res.spec>     1   6    37    60  -4234us[+2769us] +/-   34ms
^- autoforward.com               3   6    37    60    -10ms[-3351us] +/-   91ms
^- ntp3.junkemailfilter.com      2   6    37    60    -11ms[-4557us] +/-   85ms
^- clock.trit.net                2   6    37    60  -3607us[+3321us] +/-   64ms

现在作为最后的检查,使用tracking和serverstats选项;

chronyc tracking

Reference ID    : NNNNNNNN (PPS)
Stratum         : 1
Ref time (UTC)  : Tue Mar 30 22:16:28 2021
System time     : 0.000000199 seconds slow of NTP time
Last offset     : -0.000000152 seconds
RMS offset      : 0.000510382 seconds
Frequency       : 4.773 ppm fast
Residual freq   : -0.000 ppm
Skew            : 0.012 ppm
Root delay      : 0.000000001 seconds
Root dispersion : 0.000011117 seconds
Update interval : 16.0 seconds
Leap status     : Normal

chronyc serverstats

NTP packets received       : 37
NTP packets dropped        : 0
Command packets received   : 38
Command packets dropped    : 0
Client log records dropped : 0

现在再次重新启动并检查服务启动和chronyc输出是否正确。根据使用的模块,可能需要几分钟。

客户端配置

要将新的时间服务器添加到本地机器,可以在openSUSE系统中使用YaST ntp-client或添加到/etc/chrony.d/pool.conf;

pool <server fqdn or ip address> iburst

可以在客户端执行相同的chronyc测试,以验证它是否与树莓派3时间服务器同步;

chronyc tracking

Reference ID    : NNNNNNNN (<hostname>)
....

chronyc sources

210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* hostname                      1   9   377   377    +31us[  +24us] +/-  198us
^- time-a-g.nist.gov             1   9   377    53  -5135us[-5135us] +/-   34ms
^- time-b-g.nist.gov             1   9   377   241  -4242us[-4242us] +/-   33ms