树莓派做一个获取GPS时间的NTP服务器

由于单位用的是内部网络,机器时间无法与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

在这里插入图片描述
如果显示上面的数据,那就证明以上的工作正常了!

第四步:安装PPS-tools

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) 说明信号不好,试试放到室外。

第五步:安装GPSD

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.serviceBefore=chrony.service

保存退出后,运行以下命令,设为开机启动

sudo systemctl enable gpsd

再reboot重启以下树莓派

接下来通过运行

cgps -s

来查看gpsd的数据,你将会看到类似下面的输出
在这里插入图片描述

第六步:安装 chrony

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

版权声明:本文为CSDN博主「愤怒的码农╰_╯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alinathz/article/details/122689145

生成海报
点赞 0

愤怒的码农╰_╯

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

树莓派做一个获取GPS时间的NTP服务器

由于单位用的是内部网络,机器时间无法与internet同步,导致内网的所有设备各自为政,对工作和管理带来的麻烦说不清,为解决这个问题,决定用手里的树莓派做通过GPS获取时间&

Cortex-A7中断系统

一、中断向量表 中断向量表存放的是中断向量,中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。当某个中断被触发以后就会自动跳转到中断向量表中对应的中断

PySerial库的简单用法

import serial API:pySerial API — pySerial 3.4 documentation 这次尝试适用PySerial库是为了从树莓派小车连接的UWB定位模块的串口中,获取与解析出串