由于单位用的是内部网络,机器时间无法与internet同步,导致内网的所有设备各自为政,对工作和管理带来的麻烦说不清,为解决这个问题,决定用手里的树莓派做通过GPS获取时间,然后提供NTP服务。在某宝逛了一圈,找到一个GPS模块L76X GPS Module,91包邮,就下手拿来做测试吧!。
下载烧录树莓派系统,到官网下载了一个Raspberry Pi Imager,烧录的最新的系统;本文用的是包含桌面版的的镜像(Raspberry Pi OS),烧录好以后拔出读卡器,再插回去,修改一下无线鼠标卡顿的问题。
打开 /boot/cmdline.txt,在最后面加上空格在输入 usbhid.mousepoll=0;然后把TF卡插入树莓派开启做初始化设置。
将模块上的接口依次连接到树莓派上GPIO:
树莓派 | GPS模块 |
---|---|
GPIO18 | PPS |
GPIO14(UART_TXD) | RX |
GPIO15(UART_RXD) | TX |
GND | GND |
5V | VCC |
1、关闭串口登录功能
关闭树莓派的串口登陆功能,使得树莓派可以使用GPIO 14和GPIO15作为串口通信。
进入系统后,进行配置:
sudo raspi-config
选择【Interface Options】找到【Serial Port】回车进入,第一个问使用串口登录(关闭),第二个问是否开启串口(开启)
2、关闭蓝牙功能
需要注意的是Raspberry-Pi 3相比于1和2在使用串口的时候会有问题
原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011
UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。
A、修改/boot/config.txt
sudo nano /boot/config.txt
把 enable_uart=0 改为 enable_uart=1;
在最后面添加
dtoverlay=pi3-miniuart-bt
force_turbo=1
B、修改/boot/cmdline.txt
sudo nano /boot/cmdline.txt
删除所有的console=xxx的语句,例如将
console=tty1 root=PARTUUID=06850cc7-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles usbhid.mousepoll=0
改为
root=PARTUUID=06850cc7-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles usbhid.mousepoll=0
C、修改蓝牙服务 /lib/systemd/system/hciuart.service
sudo nano /lib/systemd/system/hciuart.service
修改[Unit]中的After字段,由
After=dev-serial1.device
改至
After=dev-ttyS0.device
修改[Service]中的ExecStart字段,由
ExecStart=/usr/bin/btuart
改成
ExecStart=/usr/lib/hciattach /dev/ttyS0 bcm43xx 460800 noflow -
注:其中的bcm43xx真的是xx哦
保存退出后,直接reboot重启派,串口接下来可以用作通信了
D、测试串口
cat /dev/ttyAMA0
A、PPS-tools
sudo apt-get install pps-tools
sudo apt-get install libcap-dev
B、修改/boot/config.txt
sudo nano /boot/config.txt
在文件的最后加入如下内容保存退出
dtoverlay=pps-gpio,gpiopin=18
C、修改/etc/modules
sudo nano /etc/modules
在文件的最后加入如下内容保存退出
pps-gpio
到此PPS-tools的安装配置完成,reboot
重启派测试一下PPS是否正常
D、测试PPS是否正常
使用 lsmod | grep pps
验证模块是否正常加载
如输出下面信息,说明工作正常
使用 dmesg | grep pps
命令检查 PPS GPIO 是否被配置
若输出如下信息系正常
使用 sudo ppstest /dev/pps0
将会看到类似下面的输出
正常情况下每一秒输出一条,如果发现输出间隔不是一秒,可能是连线错误或者 GPS 模块未设置导致的,如果出现time_pps_fetch() error -1 (Connection timed out)
说明信号不好,试试放到室外。
sudo apt install gpsd gpsd-clients python3-gps
安装后修改 /etc/default/gpsd
文件
sudo nano /etc/default/gpsd
修改如下:
DEVICES="/dev/ttyAMA0"
GPSD_OPTIONS="-n -G"
配置开机启动服务,修改/lib/systemd/system/gpsd.service
文件
sudo nano /lib/systemd/system/gpsd.service
修改[Unit]
中的After=chrony.service
至Before=chrony.service
保存退出后,运行以下命令,设为开机启动
sudo systemctl enable gpsd
再reboot重启以下树莓派
接下来通过运行
cgps -s
sudo apt install chrony -y
安装后修改配置文件 /etc/chrony/chrony.conf
sudo nano /etc/chrony/chrony.conf
在最后加上:
refclock PPS /dev/pps0 lock GPSD prefer refid PPS
refclock SHM 0 offset 0.0 delay 0.2 refid GPSD
allow
并检查一下配置文件是否包含一下内容,如果没有,就添加进去
leapsectz right/UTC
makestep 1.0 -1
rtcsync
配置完成后重启服务
sudo service chrony restart
可以通过下面两个命令来查看连接状态
watch -n1 chronyc sources -v
watch -n1 chronyc sourcestats -v
好了,现在其他设备可以直接把时间同步服务器设为树莓派的IP即可同步了!!写了一个小时,做个记录,以后忘记了可以看看!!
参考资源:
https://www.txisfine.cn/archives/b3317436
https://blog.csdn.net/xiaohu50/article/details/78731534