7.6 KiB
读取 GPS 数据 - 树莓派
在本节课程中,您将为树莓派添加一个 GPS 传感器,并从中读取数据。
硬件
树莓派需要一个 GPS 传感器。
您将使用的传感器是 Grove GPS Air530 传感器。该传感器可以连接到多个 GPS 系统,以实现快速、准确的定位。传感器由两部分组成——传感器的核心电子部分,以及通过细线连接的外部天线,用于接收来自卫星的无线电波。
这是一个 UART 传感器,因此通过 UART 发送 GPS 数据。
连接 GPS 传感器
Grove GPS 传感器可以连接到树莓派。
任务 - 连接 GPS 传感器
连接 GPS 传感器。
-
将 Grove 电缆的一端插入 GPS 传感器上的插座。它只能以一种方式插入。
-
在树莓派断电的情况下,将 Grove 电缆的另一端连接到树莓派上 Grove Base Hat 的 UART 插座。该插座位于中间一排,靠近 SD 卡插槽的一侧,与 USB 端口和以太网插座相对。
-
将 GPS 传感器放置好,使连接的天线能够看到天空——理想情况下靠近窗户或在室外。天线周围没有障碍物时,信号会更清晰。
编程 GPS 传感器
现在可以为树莓派编程以使用连接的 GPS 传感器。
任务 - 编程 GPS 传感器
为设备编程。
-
启动树莓派并等待其启动完成。
-
GPS 传感器有两个 LED 指示灯——一个蓝色 LED,当数据传输时会闪烁;一个绿色 LED,当从卫星接收数据时每秒闪烁一次。启动树莓派时,确保蓝色 LED 闪烁。几分钟后,绿色 LED 会开始闪烁——如果没有,可能需要重新调整天线的位置。
-
启动 VS Code,可以直接在树莓派上运行,也可以通过 Remote SSH 扩展连接。
⚠️ 如果需要,可以参考第 1 课中设置和启动 VS Code 的说明。
-
对于支持蓝牙的新版本树莓派,蓝牙使用的串口与 Grove UART 端口使用的串口存在冲突。为了解决这个问题,请执行以下操作:
-
在 VS Code 的终端中,使用以下命令编辑
/boot/config.txt
文件。nano
是一个内置的终端文本编辑器:sudo nano /boot/config.txt
由于需要
sudo
权限(提升的权限)才能编辑此文件,因此无法通过 VS Code 编辑。 -
使用光标键导航到文件末尾,然后将以下代码复制并粘贴到文件末尾:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
您可以使用设备的常规键盘快捷键粘贴(Windows、Linux 或树莓派 OS 上为
Ctrl+v
,macOS 上为Cmd+v
)。 -
按
Ctrl+x
保存文件并退出 nano。当被询问是否保存修改的缓冲区时,按y
,然后按Enter
确认覆盖/boot/config.txt
。如果出错,可以不保存退出,然后重复这些步骤。
-
使用以下命令在 nano 中编辑
/boot/cmdline.txt
文件:sudo nano /boot/cmdline.txt
-
此文件包含多个用空格分隔的键值对。删除任何键为
console
的键值对。它们可能看起来像这样:console=serial0,115200 console=tty1
您可以使用光标键导航到这些条目,然后使用常规的
del
或backspace
键删除。例如,如果您的原始文件如下所示:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
新版本将如下所示:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
按上述步骤保存此文件并退出 nano。
-
重启树莓派,重启后重新连接到 VS Code。
-
-
在终端中,在
pi
用户的主目录中创建一个名为gps-sensor
的新文件夹。在此文件夹中创建一个名为app.py
的文件。 -
在 VS Code 中打开此文件夹。
-
GPS 模块通过串口发送 UART 数据。安装
pyserial
Pip 包,以便从 Python 代码与串口通信:pip3 install pyserial
-
将以下代码添加到您的
app.py
文件中:import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1)
这段代码从
pyserial
Pip 包中导入了serial
模块。然后它连接到/dev/ttyAMA0
串口——这是 Grove Pi Base Hat 用于其 UART 端口的串口地址。接着,它清除了此串口连接中的任何现有数据。接下来定义了一个名为
print_gps_data
的函数,用于将传递给它的行打印到控制台。然后代码进入一个无限循环,在每次循环中读取串口中的多行文本。它为每一行调用
print_gps_data
函数。读取完所有数据后,循环会休眠 1 秒,然后再次尝试。
-
运行此代码。您将看到来自 GPS 传感器的原始输出,类似如下内容:
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68
如果在停止和重新启动代码时遇到以下错误之一,请在 while 循环中添加一个
try - except
块。UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
while True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1)
💁 您可以在 code-gps/pi 文件夹中找到此代码。
😀 恭喜!您的 GPS 传感器程序运行成功!
免责声明:
本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。