news 2026/6/1 7:09:08

香橙派5 Plus玩转外设:用UART连接GPS模块,用I2C驱动OLED屏的实战配置记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
香橙派5 Plus玩转外设:用UART连接GPS模块,用I2C驱动OLED屏的实战配置记录

香橙派5 Plus物联网开发实战:GPS与OLED屏的硬件交互指南

最近在折腾一个智能小车项目时,发现香橙派5 Plus作为主控板确实是个不错的选择。它丰富的接口让连接各种传感器变得异常方便,特别是UART和I2C这两个最常用的通信协议。本文将分享如何通过UART连接GPS模块获取定位数据,同时用I2C驱动OLED屏幕显示实时信息,打造一个简易的车载数据仪表盘。

1. 硬件准备与环境配置

在开始之前,我们需要确保手头有以下硬件组件:

  • 香橙派5 Plus开发板(运行Ubuntu系统)
  • GPS模块(支持UART通信,如NEO-6M)
  • 0.96寸OLED显示屏(SSD1306驱动,I2C接口)
  • 杜邦线若干
  • 5V电源适配器

系统环境检查

首先登录香橙派,打开终端执行以下命令检查系统信息:

uname -a cat /etc/os-release

确认系统版本为Ubuntu,内核版本支持Rockchip RK3588芯片组。如果系统版本不符,建议先更新到最新版本:

sudo apt update && sudo apt upgrade -y

2. 启用UART接口连接GPS模块

GPS模块通常使用UART进行数据传输,我们需要先启用香橙派5 Plus上的UART接口。

2.1 确定GPS模块的连接引脚

以NEO-6M GPS模块为例,它通常有四根线:

  • VCC(3.3V或5V)
  • GND
  • TX(发送)
  • RX(接收)

香橙派5 Plus的40针GPIO接口上,UART3的引脚定义如下:

功能物理引脚号GPIO编号
TX8GPIO1_B0
RX10GPIO1_B1
GND6-

注意:连接时GPS模块的TX应接香橙派的RX,RX接TX,不要接反。

2.2 配置系统启用UART3

编辑系统配置文件启用UART3接口:

sudo nano /boot/firmware/ubuntuEnv.txt

找到overlays=这一行,添加rk3588-uart3-m1(注意如果已有其他overlay,用空格分隔):

overlays=rk3588-uart3-m1

保存后重启系统:

sudo reboot

重启后检查UART设备是否成功启用:

ls /dev/ttyS*

应该能看到/dev/ttyS3设备文件。

2.3 测试GPS数据接收

安装Python串口库并编写测试脚本:

sudo apt install python3-pip pip3 install pyserial

创建gps_test.py文件:

import serial from time import sleep ser = serial.Serial('/dev/ttyS3', baudrate=9600, timeout=1) try: while True: data = ser.readline().decode('ascii', errors='replace').strip() if data.startswith('$GPRMC'): print(f"GPS数据: {data}") sleep(0.1) except KeyboardInterrupt: ser.close() print("程序结束")

运行脚本后,将GPS模块放置在开阔区域,应该能看到类似以下的NMEA格式数据:

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A

3. 配置I2C接口驱动OLED屏幕

OLED显示屏通常使用I2C协议通信,下面介绍如何启用I2C并驱动SSD1306屏幕。

3.1 硬件连接

SSD1306 OLED屏通常有四根线:

  • VCC(3.3V)
  • GND
  • SCL(时钟)
  • SDA(数据)

连接到香橙派5 Plus的GPIO:

OLED引脚香橙派引脚功能
VCC13.3V
GND9GND
SCL5GPIO3_A1 (I2C2_SCL)
SDA3GPIO3_A0 (I2C2_SDA)

3.2 启用I2C接口

编辑配置文件启用I2C2:

sudo nano /boot/firmware/ubuntuEnv.txt

修改overlays=行,添加rk3588-i2c2-m0

overlays=rk3588-uart3-m1 rk3588-i2c2-m0

保存后重启:

sudo reboot

检查I2C设备:

ls /dev/i2c*

应该能看到/dev/i2c-2设备。安装工具检测设备:

sudo apt install i2c-tools sudo i2cdetect -y 2

如果OLED连接正确,应该能看到类似以下输出,其中3C是SSD1306的默认地址:

0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

3.3 使用Python驱动OLED

安装必要的库:

pip3 install smbus2 pillow

对于SSD1306 OLED,我们可以使用luma.oled库:

pip3 install luma.oled

创建oled_test.py文件:

from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from luma.core.render import canvas from time import sleep # 初始化I2C和OLED设备 serial = i2c(port=2, address=0x3C) device = ssd1306(serial) # 显示测试内容 with canvas(device) as draw: draw.rectangle(device.bounding_box, outline="white", fill="black") draw.text((10, 10), "香橙派5 Plus", fill="white") draw.text((10, 30), "OLED测试", fill="white") sleep(5)

运行脚本后,OLED屏幕应该会显示测试文字。

4. 构建智能小车数据仪表盘

现在我们将GPS数据和OLED显示结合起来,创建一个实时显示位置信息的仪表盘。

4.1 解析GPS数据

修改之前的GPS测试脚本,增加NMEA数据解析功能:

import serial from time import time def parse_gprmc(gprmc_str): """解析GPRMC NMEA语句""" parts = gprmc_str.split(',') if len(parts) < 12 or parts[2] != 'A': return None # 解析纬度 lat_deg = float(parts[3][:2]) lat_min = float(parts[3][2:]) latitude = lat_deg + lat_min / 60 if parts[4] == 'S': latitude = -latitude # 解析经度 lon_deg = float(parts[5][:3]) lon_min = float(parts[5][3:]) longitude = lon_deg + lon_min / 60 if parts[6] == 'W': longitude = -longitude # 解析速度(节转换为km/h) speed = float(parts[7]) * 1.852 if parts[7] else 0.0 return { 'time': parts[1], 'latitude': latitude, 'longitude': longitude, 'speed': speed, 'date': parts[9] }

4.2 综合显示程序

创建完整的仪表盘程序dashboard.py

import serial from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from luma.core.render import canvas from time import sleep, strftime from datetime import datetime # 初始化OLED oled_serial = i2c(port=2, address=0x3C) oled = ssd1306(oled_serial) # 初始化GPS gps = serial.Serial('/dev/ttyS3', baudrate=9600, timeout=1) def format_coord(coord, is_lat): """格式化经纬度显示""" direction = 'N' if is_lat and coord >=0 else 'S' if is_lat else 'E' if coord >=0 else 'W' abs_coord = abs(coord) degrees = int(abs_coord) minutes = (abs_coord - degrees) * 60 return f"{degrees}°{minutes:.2f}'{direction}" last_update = 0 current_data = None try: while True: # 读取GPS数据 line = gps.readline().decode('ascii', errors='ignore').strip() if line.startswith('$GPRMC'): current_data = parse_gprmc(line) last_update = time() # 每0.5秒刷新一次显示 if time() - last_update < 0.5: with canvas(oled) as draw: # 显示标题 draw.text((5, 2), "智能小车仪表盘", fill="white") if current_data: # 显示GPS数据 draw.text((5, 15), f"���间: {current_data['time'][:2]}:{current_data['time'][2:4]}", fill="white") draw.text((5, 25), f"纬度: {format_coord(current_data['latitude'], True)}", fill="white") draw.text((5, 35), f"经度: {format_coord(current_data['longitude'], False)}", fill="white") draw.text((5, 45), f"速度: {current_data['speed']:.1f} km/h", fill="white") else: draw.text((15, 30), "等待GPS信号...", fill="white") # 显示系统时间 draw.text((70, 2), strftime("%H:%M"), fill="white") sleep(0.1) except KeyboardInterrupt: gps.close() print("仪表盘关闭")

4.3 常见问题排查

在实际项目中可能会遇到以下问题:

  1. GPS无数据输出

    • 检查接线是否正确(TX/RX不要接反)
    • 确保GPS模块有足够开阔的天空视野
    • 尝试降低波特率(有些模块默认是4800而不是9600)
  2. OLED不显示

    • 使用i2cdetect确认设备地址是否正确
    • 检查OLED是否需要外部供电(有些模块需要单独5V供电)
    • 确认I2C是否已正确启用
  3. 系统重启后配置丢失

    • 确保修改的是/boot/firmware/ubuntuEnv.txt而不是临时文件
    • 检查文件权限是否正确
# 检查文件权限 ls -l /boot/firmware/ubuntuEnv.txt # 应该显示类似:-rw-r--r-- 1 root root

5. 项目扩展与优化建议

基础功能实现后,可以考虑以下增强功能:

5.1 数据记录功能

添加SD卡模块,记录行驶轨迹:

import csv from datetime import datetime def init_log_file(): with open('/mnt/sdcard/gps_log.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow(['timestamp', 'latitude', 'longitude', 'speed']) def log_position(data): with open('/mnt/sdcard/gps_log.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow([ datetime.now().isoformat(), data['latitude'], data['longitude'], data['speed'] ])

5.2 添加更多传感器

通过I2C可以连接更多传感器丰富数据:

  • BME280:温湿度气压传感器
  • MPU6050:加速度计/陀螺仪
  • BH1750:光照传感器

多传感器连接时注意地址冲突,有些模块(如BME280)支持修改I2C地址。

5.3 优化显示效果

使用Pillow库创建更丰富的显示内容:

from PIL import ImageFont # 加载自定义字体 font_small = ImageFont.truetype("DejaVuSans.ttf", 10) font_large = ImageFont.truetype("DejaVuSans.ttf", 14) with canvas(oled) as draw: draw.text((5, 5), "智能小车", font=font_large, fill="white") draw.text((5, 25), f"速度: {speed:.1f} km/h", font=font_small, fill="white") # 绘制简单的速度条 draw.rectangle((5, 40, 5 + int(speed), 45), outline="white", fill="white")

5.4 低功耗优化

对于电池供电的小车项目,可以考虑:

  • 降低CPU频率
  • 关闭不必要的服务
  • 使用vcgencmd工具监控功耗
# 安装vcgencmd工具 sudo apt install libraspberrypi-bin # 查看当前功耗 vcgencmd get_throttled
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 7:08:59

GD32F103C8T6硬件设计避坑:8M和32.768K晶振外围电路到底差在哪?

GD32F103C8T6硬件设计实战&#xff1a;高频与低频晶振电路设计差异全解析在嵌入式硬件设计中&#xff0c;晶振电路看似简单却暗藏玄机。许多工程师在完成GD32F103C8T6最小系统设计时&#xff0c;常常困惑于为何8MHz主晶振需要额外1MΩ电阻而32.768kHz RTC晶振却不需要。这种差异…

作者头像 李华
网站建设 2026/6/1 7:08:25

基于RAG与GPT构建Playwright智能问答助手:从文档检索到精准生成

1. 项目缘起&#xff1a;当AI遇上测试框架学习作为一名在自动化测试领域摸爬滚打了十来年的老兵&#xff0c;我几乎见证了从Selenium到Cypress&#xff0c;再到如今Playwright的整个技术变迁。Playwright确实是个好东西&#xff0c;微软出品&#xff0c;跨浏览器、跨平台&#…

作者头像 李华
网站建设 2026/6/1 7:08:04

多宇宙决策树:从AI对齐到创意写作的透明化探索与实践

1. 多宇宙思维&#xff1a;从AI对齐到创意写作的决策树实践在AI模型&#xff0c;尤其是大语言模型&#xff08;LLM&#xff09;变得越来越强大的今天&#xff0c;我们面临一个核心挑战&#xff1a;如何理解它们在想什么&#xff1f;或者说&#xff0c;如何让它们的“思考”过程…

作者头像 李华
网站建设 2026/6/1 7:07:59

AI时代如何通过义务体系重塑人性价值与深度在场

1. 当AI开始写诗&#xff1a;我们何以自处&#xff1f; 最近&#xff0c;我身边不少从事创意工作的朋友都陷入了某种集体性的焦虑。一位编剧朋友告诉我&#xff0c;他用AI工具生成了一个剧本大纲&#xff0c;其结构的工整和桥段的“合理性”甚至让他感到一丝挫败。另一位设计师…

作者头像 李华