本章节介绍 Pico-G1 扩展板上的 MPU6050 六轴姿态传感器应用示例 —— mpu6050_display。该应用演示了如何使用 I2C 接口读取 MPU6050 传感器的加速度、角速度和温度数据,并实时显示在 TFT 屏幕上。这是学习 I2C 传感器通信和姿态数据处理的实用示例。
应用源码位于 SDK 目录 source/app/03_mpu6050_display/,提供了完整的 I2C 传感器读取和数据处理实现。
| 参数 | 值 |
|---|---|
I2C 接口 |
I2C3(/dev/i2c-3) |
从地址 |
0x68(AD0 接地) |
加速度量程 |
±2g(16384 LSB/g) |
角速度量程 |
±250°/s(131 LSB/°/s) |
温度精度 |
±1°C |
刷新频率 |
150ms(可配置) |
TFT 显示 |
ST7789 240×240 |
| index | 名称 | 测试指令 | 预期现象(成功) | 失败可能原因 |
|---|---|---|---|---|
| 1 | 基础采集 | ./mpu6050_display |
屏幕显示加速度、角速度、温度数据 | I2C 连接失败、传感器损坏 |
| 2 | 静止测试 | 模块静止放置 | Z 轴加速度约为 ±1g | 传感器方向错误 |
| 3 | 倾斜测试 | 模块倾斜 | 相应轴加速度变化 | 数据解析错误 |
| 4 | 温度测试 | 手摸传感器 | 温度数值上升 | 传感器故障 |
source/app/03_mpu6050_display/
├── Makefile # 构建脚本
├── main.c # 主程序
├── mpu6050.c # MPU6050 驱动实现
├── mpu6050.h # MPU6050 驱动头文件
├── i2c_hal.c # I2C HAL 层实现
├── i2c_hal.h # I2C HAL 层头文件
├── gpio_hal.c # GPIO HAL 层实现
├── gpio_hal.h # GPIO HAL 层头文件
├── spi_hal.c # SPI HAL 层实现
├── spi_hal.h # SPI HAL 层头文件
├── st7789.c # ST7789 驱动实现
├── st7789.h # ST7789 驱动头文件
├── font8x16.h # 8×16 ASCII 点阵字库
└── README.md # 说明文档
| 信号 | 板上 GPIO | 控制器 / 节点 | 说明 |
|---|---|---|---|
| SCL | GPIO4_1 | I2C3 → /dev/i2c-3 |
与 OLED(0x3C) 共享总线 |
| SDA | GPIO4_2 | I2C3 → /dev/i2c-3 |
与 OLED 共享总线 |
| INT | GPIO0_0 | /dev/gpiochip0 line0 |
数据就绪指示(可选) |
| AD0 | 接 GND | — | 从地址 = 0x68 |
| 显示 | SPI2 | /dev/spidev2.0 |
ST7789 240×240 |
标准 MPU6050 接线:
Pico-G1 MPU6050 Module
┌───────────┐ ┌──────────────┐
│ │ │ │
│ GPIO4_1 ──┼────── SCL ──┤ SCL │
│ │ │ │
│ GPIO4_2 ──┼────── SDA ──┤ SDA │
│ │ │ │
│ GPIO0_0 ──┼────── INT ──┤ INT(可选) │
│ │ │ │
│ 3.3V ──┼─────────────┤ VCC │
│ │ │ │
│ GND ──┼─────────────┤ GND │
│ │ │ AD0 ─── GND│
└───────────┘ └──────────────┘
地址选择
- AD0 接 GND:I2C 地址 = 0x68(默认)
- AD0 接 VCC:I2C 地址 = 0x69
- 大多数模块 AD0 已接地,无需额外连接
需要配置的引脚复用:
| pad | 物理地址 | 配置值 | 说明 |
|---|---|---|---|
| I2C3_SCL (GPIO4_1) | 0x100C0010 |
0x1002 |
func2 = I2C3_SCL |
| I2C3_SDA (GPIO4_2) | 0x100C0014 |
0x1002 |
func2 = I2C3_SDA |
| INT (GPIO0_0) | 0x112C0000 |
0x1000 |
func0(GPIO) + 输入使能 |
在编译本应用之前,请确保已完成以下准备工作:
# 设置工具链路径
export PATH=$PATH:<SDK>/tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin
# 进入示例目录
cd <SDK>/source/app/03_mpu6050_display
# 编译
make
# 清理
make clean
# 使用 SCP 传输到开发板
scp mpu6050_display root@<板端IP>:/usr/bin/
# 或通过 TFTP 下载
tftp -g -r mpu6050_display <板端IP>
# 添加执行权限
chmod +x /usr/bin/mpu6050_display
# 运行 MPU6050 显示示例
/usr/bin/mpu6050_display
/mnt # ./mpu6050_display
[mpu] pad 复用:I2C3(4_1/4_2)->func2,GPIO0_0->func0
[mpu] pad 0x100C0010 -> 0x00001002
[mpu] pad 0x100C0014 -> 0x00001002
[mpu] pad 0x112C0000 -> 0x00001000
[mpu] 初始化 SPI 屏(/dev/spidev2.0)...
[spi] pad 0x100C0028 -> 0x00001004
[spi] pad 0x100C002C -> 0x00001004
[spi] pad 0x100C0030 -> 0x00001000
[spi] pad 0x100C0020 -> 0x00001005
[spi] pad 0x100C001C -> 0x00001005
[spi] opening /dev/spidev2.0 ...
[spi] spidev opened, fd=3
[spi] spidev mode/bits/speed set (MODE3/8b/24MHz)
[spi] chardev request DC @ /dev/gpiochip4 line 5 ...
[spi] chardev request RES @ /dev/gpiochip4 line 4 ...
[spi] chardev request CS @ /dev/gpiochip5 line 1 ...
[spi] chardev-verify: DC=0(expect0) RES=1(expect1) CS=1(expect1) ==> OK(chardev 真驱动了引脚)
[spi] spi_hal_init done
[tft] init: SLPOUT
[tft] init: SLPOUT +120ms ok
[tft] init: config cmds ok
[tft] init: DISPON
[tft] init: DISPON ok
[tft] init: clear-flush start
[tft] flush #1 start
[tft] flush #1 done
[tft] init: clear-flush done
[mpu] SPI 屏就绪。
[mpu] 初始化 MPU6050(/dev/i2c-3 addr 0x68)...
[mpu] WHO_AM_I = 0x70
[mpu] 识别为 MPU6500
[mpu] 初始化成功 @ /dev/i2c-3 addr 0x68 (±2g / ±250dps, 100Hz)
[mpu] 采集显示中,每 150ms 刷新,Ctrl+C 退出。

| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 读 WHO_AM_I 失败 | I2C 连接失败、地址错误 | 检查接线、确认地址配置 |
| WHO_AM_I = 0xFF | I2C 无应答 | 检查 SCL/SDA 接线、确认供电 |
| WHO_AM_I 非 0x68 | MPU6500/MPU9250 芯片 | 驱动已兼容 0x70/0x71 |
| 数据不更新 | 传感器未唤醒 | 检查 PWR_MGMT_1 寄存器 |