前言:
最近跟随大佬们撸电子垃圾,撸到了一台网络设备。这个设备有白色铁皮壳子,外面两根天线。打开外壳,内部有一块没有焊接USB口的树莓派 B+,通过一块扩展板连接了一枚RT5372无线网卡,并将一个USB口引出。里面有一枚16G存储卡,不知道里面啥系统,也懒得研究了。直接格式化并写入Raspbian系统。扩展板上还有一套基于DS3231 的RTC电路,测了一下,纽扣电池电量还很足,不利用起来岂不可惜?于是就有了本文。
读懂实践本文,你可能需要在技能树中点亮以下技能:
1:基本的Windows系统操作;
2:至少会使用一种工具连接到树莓派的Shell;(比如SSH工具或TTL线)
3:会为树莓派安装系统并进行初始配置;
4:基本电路知识以确保DS3231正确连接
准备:
1:安装好系统的树莓派;
2:可与树莓派连接的带电池DS3231模块;
3:与树莓派可靠的Shell连接
安装时钟模块:
本人的这台网络设备,它的DS3231时钟模块是连接在I2C1上面的,据了解市面上大多数可直插树莓派的时钟模块也是如此,因为I2C1附近易于获取电源为I2C模块供电。
1,使用gpio readall
命令可以获取树莓派各IO口的状态,在此我们看到,SDA.1在40P接插件的3脚,SCL.1在5脚,3V3和GND分别在1、9脚。
+-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 0 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | ALT0 | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | ALT0 | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | OUT | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+
2:确保上面提到的四个插针可靠的与DS3231模块连接即可。
系统配置:
1:使用以下命令安装I2C工具。
sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools
2:打开I2C功能。在Shell中输入sudo raspi-config
打开树莓派配置工具,移动光标选择Interfacing Options
,Enter键进入;移动光标选择I2C,将其设置为Enable后退出配置工具并使用sudo reboot
命令重启树莓派。
3:测试时钟模块是否正常。使用sudo i2cdetect -y 1
命令探测I2C通道1上的设备地址。若能检测到地址为0x68的设备,这表明树莓派可以正常与DS3231模块通信。
4:将DS3231添加到Device Tree中。使用sudo nano /boot/config.txt
命令打开配置文件,在文件末尾添加以下一行代码,按Ctrl+X,输入Y,保存并退出。
dtoverlay=i2c-rtc,ds3231
5:使用sudo reboot
命令重启树莓派,然后再次使用sudo i2cdetect -y 1
命令,会发现原来的0x68地址处变成了UU,此信息表示该地址设备使用中。这表明,实时时钟已经正确配置了。
此时,我们可以使用以下命令与RTC通信了:
sudo hwclock -r 显示RTC时间
sudo hwclock -s 通过RTC时间设置系统时间
sudo hwclock -w 把系统时间写入RTC
sudo hwclock --set --date="2020-04-09 14:01:08" 修改RTC时间为任意值
sudo hwclock -h 获取帮助
通过Systemd配置同步:
上文中已经配置了DS3231 RTC模块,接下来我们需要让系统开机时自动从RTC中获取时间。据说以前的Linux系统启动采用init进程,此方案启动时间长,启动脚本复杂。后来有了Systemd,事情就变得简单了。笔者接触Linux较晚,当然要用新技术。本文通过创建两个Systemd配置文件分别实现开机读取RTC时间,关机时保存时间到RTC。
1:使用以下命令打开nano并准备创建/lib/systemd/system/hwclock-sync.service
文件。
sudo nano /lib/systemd/system/hwclock-sync.service
2:在出现的nano窗口中输入以下内容:
[Unit]
Description=Sync time from RTC when startup
After=fake-hwclock.service
#After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/hwclock -s
TimeoutSec=0
[Install]
WantedBy=multi-user.target
注:笔者系统中有fake-hwclock,所以配置为在fake-hwclock.service后面启动,若您的系统中没有这个软件包,请删除After=fake-hwclock.service
行,并删除下一行的#
号注释
3:按Ctrl+X,Y,Enter保存/lib/systemd/system/hwclock-sync.servic
文件并退出。
4:使用以下命令打开nano并准备创建/lib/systemd/system/hwclock-save.service
文件。
sudo nano /lib/systemd/system/hwclock-save.service
5:在出现的nano窗口中输入以下内容:
[Unit]
Description=Sync HardWare RTC to System Clock when Shutdown
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/sbin/hwclock -w
[Install]
WantedBy=reboot.target halt.target poweroff.target
6:按Ctrl+X,Y,Enter保存/lib/systemd/system/hwclock-save.service
文件并退出。
7:使用以下命令使以上两个配置文件开机启动:
systemctl enable hwclock-sync.servic hwclock-save.service
8:这样,我们就完成了时间同步的配置。
如何验证是否正常工作?或许首先应该排除网络时间同步(systemd-timesyncd.service)的干扰,然后大家自行研究,本文就不在此赘述了。
参考:
1:树莓派下 DS3231 时钟模块的配置(I2C接口)-树莓派实验室
2:Raspbian内建硬件驱动-Cocoonshu
3:树莓派模块:使用DS3231时钟模块
4:树莓派使用实时时钟DS3231-nick_zm
5:Linux systemd启动守护进程,service启动顺序分析及调整service启动顺序-MrWang_tju
6:Systemd 入门教程:命令篇-阮一峰
7:Systemd 入门教程:实战篇-阮一峰
8:计算机系统的时间-osoft
9:systemd关机流程 以及 自定义systemd关机脚本和服务-zhangatong