我们不需要完整的桌面分布 Linux,Raspbian Jessie 的“lite”变体绰绰有余。此内容将写入 Micro SD 卡 (121-3897):
$ sudo dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/mmcblk0 bs=4M
请注意:较新版本的 Raspbian Lite 镜象推出后,输入文件名称 (if) 参数将有所不同。同样,根据使用的 Linux 和 SD 卡硬件,输出文件 (of) 参数也可能不一样。当然,Windows 用户可以使用常用实用程序将 O/S 镜象写入 Micro SD 卡。
在屏幕并非绝对必要的情况下,我更喜欢通过 SSH 处理 Raspberry Pi 项目。虽然默认情况下 SSH 被禁用,但可通过在卡的启动分区创建名为“ssh”的空文件来将其重新启用。这可通过将卡插入另一台机器(如用于将其写出的机器)来完成,或者将其插入您正在使用的 Pi。常规启动时,连接键盘和显示器,然后在出现命令提示时键入以下内容:
sudo touch /boot/ssh
重启后,此时应该可以通过 SSH 登录,而 Pi 启动时,它将搜索 ssh 文件。如果找到此文件,则将启用 ssh。
安装 Raspberry Pi 3 时,硬件 UART(串行端口)默认情况下将由蓝牙和较低性能的软件串行端口使用,或者使“微型 UART”能够用于一般用途。因为我们不需要蓝牙,因此我们将换掉这些流程。但首先,我们要运行 raspi 配置并禁用串行。
$ sudo raspi-config
P5 接口选项 → P6 串行(禁用)。
这用于停止发送至串行端口的启动消息以及在此端口上启用的登录服务。
下一步,启用 UART 并通过编辑 /boot/config.txt 并添加线路来使蓝牙强制使用微型 UART:
enable_uart=1
dtoverlay=pi3-miniuart-bt
重启后,我们可以通过以下测试确认 /dev/serial0 指向硬件 UART (AMA0),serial1 指向软件 UART (S0):
pi@ntpi:~ $ ls -l /dev/ser*
初始测试
测试期间,我们遵循 Adafruit 指南,但请注意我们可以在不运行 stty 的情况下从串行端口获取调试输出,以对其进行配置,但是如果我们运行此选项,即可设置我们之前未指定的选项。因此简言之,要测试我们正从 GPS 模块获取数据,只需使用:
$ cat /dev/ttyAMA0
如果一切顺利,则输出将类似于上述截屏中所显示的内容。但空白字段之间存在的许多逗号将提示 GPS 修复缺失。
另请注意,写入 Adafruit 指南的同时指明 Ultimate GPS Hat 与 Raspberry Pi 3 不兼容,但这可通过上述 UART 配置详情纠正。
此时,应用程序可以直接使用 GPS 接收器输出的数据,其不仅仅是被格式化为标准“NMEA 句子”的文本。还提供使解释工作变得更加简单的库,如适用于 Python 的 pynmea。
gpsd
Gpsdsd 被描述为:“通过串行或 USB 端口监控连接至主机的一个或多个 GPS 或 AIS 接收器,使有关传感器位置/路径/速率的所有数据均可在主机上的 TCP 端口 2947 查询。
在安装 gpsd 的情况下,多个位置感知客户端应用程序可以在无数据争用或丢失的情况下共享对所支持传感器的访问。此外,相对由大多数 GPS 发出的 NMEA 0183,gpsd 能够以更容易解析的格式响应问题。”
Gpsd 可用于使 GPS 数据适用于联网的应用程序,并提供对底层硬件的简单提取。对此所提供的支持由众多应用程序实现,包括 GPS 导航和无线网络检测/映射软件。
我们可以通过以下方式安装 gpsd:
$ sudo apt-get update
$ sudo apt-get install gpsd gpsd-clients python-gps
要进行配置,请按照如下方式编辑 /etc/default/gpsd 并修改 USBAUTO、DEVICES 和 GPSD_OPTIONS 线路:
USBAUTO="false"
DEVICES="/dev/ttyAMA0"
GPSD_OPTIONS="-n"
要在启动时将其启用,需要利用 Raspbian Jessie 进行微小的修复:
$ sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/
然后,我们可以通过以下方式将其启动:
$ sudo service gpsd start
并通过以下方式进行测试:
$ gpsmon
这会导致基于端子的应用程序启动并显示类似于上述图片中所示的结果。
此时,我们可以使用 GPS 接收器以及 gpsd 支持的现有应用程序,此外,我们还可以开发一个新的应用程序,充分利用其简单界面。
pps
关于此 HAT,很棒的一点是它不仅提供 NMEA 数据,而且还是源自 GPS 的每秒脉冲 (PPS) 信号。当您可以从 NMEA 句子输出中提取时间时,为何其如此有用?ASCII 文本远非传达信息最有效的方式,在这种情况下,还将通过相对缓慢的串行端口发送它,并且操作系统也将产生一些延迟。
由 GPS 模块生成的 PPS 信号可以通过 Raspberry Pi GPIO 采样,Linux 内核甚至可以通过 /dev/pps0 设备提供访问支持。这意味着,考虑所用设备的成本,应用程序可结合使用 NMEA 数据和 PPS 信号获取非常高精度的时间。
要获取对 PPS 的访问权限,我们需要安装 ppt 工具软件以及:
$ sudo apt-get install pps-tools
向 /boot/config.txt 添加另一个线路,以适当地配置 Linux 内核:
dtoverlay=pps-gpio,gpiopin=4
重启后,我们可以测试:
$ sudo ppstest /dev/pps0
哪个选项应提供类似于上图所示的结果。
NTP server
NTP 由 Network Time Foundation 开发
最终,方面用于 GPS 启用的 Raspberry Pi 的选项可使用网络 时间协议 (NTP) 创建将时间分配至 LAN 客户端的服务器。用于该操作的 ntpd 软件非常灵活,如果网络连接可用,则可汇聚所联网“平级”NTP 服务器上的时间,但其也可通过 NMEA 和/或 PPS 从 GPS 获取时间,在其他资源中,使用智能可调的算法从这些现有资源中选择最佳时间来源。
NTP 本身就是另一个话题,其必须配置方式取决于具体使用案例。然而,可从 David Taylor 的网站获取许多真正有用的信息。
如果您选择此路径,则需牢记若干事项:
Raspbian 提供的 NTP 软件将需要源自来源的构建替换(非常简单)
Ntpd 可以直接从 GPS 模块获取时间信息(通过 /dev/ttyAMA0)或进行配置以通过 gpsd 获取数据
调整 NTP 配置可能需要花费一些时间,以获取最佳性能
总结
Ultimate GPS Hat 是针对基于 Raspberry Pi 的项目获取位置和高精度时间功能的快速简单的方法,而不存在将此信息暴露给应用程序及其他联网设备的缺陷。