嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

添加GPS时间和位置至Raspberry Pi 项目

HATPi_fb6ac3dc4797e368705b9b03f9cac6db6590f0f6.jpg

向 Raspberry Pi 添加 GPS 接收器将为其提供定位和高精度时间功能。当您需要探知移动设备的位置并且系统需要精确的时间同步时,该功能非常适用。 

Adafruit Ultimate GPS HAT 使得向 Raspberry Pi 添加 GPS 功能变得轻松简单,同时还可将实时时钟与备用电池以及原型设计区集成。 

在此示例中,我们将 Raspberry Pi 3 型号 B (896-8660) 以及 Adafruit Ultimate GPS HAT (124-5481) 置于 Phoenix Contact (122-4298) 提供的 DIN 导轨外壳中(虽然可轻松将其封装在拥有充足空间的其他任一可容纳 Pi + HAT 的外壳之中)。

装配

HATPiAssembled_5c140f2f6021a517036d19d071a6d7f008c9d311.jpg

GPS Hat 本身的唯一装配即为焊接通孔管座。焊接之后,将 HAT 连接至 Pi 的 P1 管座。

EnclosureComponents_d49b12a2221a86a5ab5b7142b1e99e6a03665794.jpg

外壳组件可参见上述内容。

EnclosureSMA_bd198d5fb507ecd52fdac4f648cadf9c81d4dc21.jpg

之后,在左上角钻孔,使面板安装包容式 SMA 能够装入插入式 U.FL 电缆 (794-2897) 。GPS 模块的确具有集成天线,但视线封闭,或者可将接收器装入金属外壳之中,外部天线为必需之物。

PiCoax_3dec1c38638165a521067510a315c48a7a56f410.jpg

U.FL 连接至 HAT 及装配的外壳。

AssembledGPSPi_1d0a4eeda1c9b6138e4c1597bb1eb3b7c486a524.jpg

测试期间,RF Solutions (704-3464) 提供的 GPS 天线将被置于窗口。

GPSAntenna_ee2fa9e37469586228b543e7fe3d805d3f930315.jpg

O/S 配置

ntpi_devser_78742f41425466516099532d0dd50a33726983b9.jpg

我们不需要完整的桌面分布 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*

初始测试

ntpi_cat_ttyAMA0_c0d5b26b7d4a7ef7166ebeb72165debc9718774f.jpg

测试期间,我们遵循 Adafruit 指南,但请注意我们可以在不运行 stty 的情况下从串行端口获取调试输出,以对其进行配置,但是如果我们运行此选项,即可设置我们之前未指定的选项。因此简言之,要测试我们正从 GPS 模块获取数据,只需使用:

$ cat /dev/ttyAMA0

如果一切顺利,则输出将类似于上述截屏中所显示的内容。但空白字段之间存在的许多逗号将提示 GPS 修复缺失。

另请注意,写入 Adafruit 指南的同时指明 Ultimate GPS Hat 与 Raspberry Pi 3 不兼容,但这可通过上述 UART 配置详情纠正。

此时,应用程序可以直接使用 GPS 接收器输出的数据,其不仅仅是被格式化为标准“NMEA 句子”的文本。还提供使解释工作变得更加简单的库,如适用于 Python 的 pynmea

 

gpsd

ntpi_gpsmon_80e2f4e31b7ee9f7821844813a79c843dcb19d13.jpg

Gpsdsd 被描述为:通过串行或 USB 端口监控连接至主机的一个或多个 GPS 或 AIS 接收器,使有关传感器位置/路径/速率的所有数据均可在主机上的 TCP 端口 2947 查询。

在安装 gpsd 的情况下,多个位置感知客户端应用程序可以在无数据争用或丢失的情况下共享对所支持传感器的访问。此外,相对由大多数 GPS 发出的 NMEA 0183gpsd 能够以更容易解析的格式响应问题。”

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

ntpi_ppstest_115555b3d9fc08db4b8e97b50b766ab304b8ea9f.jpg

关于此 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

NTF_Logo_f3e1a0d939630d3af388d4d791b6b64ed4fa1786.jpg

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 的项目获取位置和高精度时间功能的快速简单的方法,而不存在将此信息暴露给应用程序及其他联网设备的缺陷。

Andrew Back

 

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin