03 - MPU6050 陀螺仪应用
本章节介绍 Pico-G1 扩展板上的 MPU6050 六轴姿态传感器应用示例 —— mpu6050_display。该应用演示了如何使用 I2C 接口读取 MPU6050 传感器的加速度、角速度和温度数据,并实时显示在 TFT 屏幕上。这是学习 I2C 传感器通信和姿态数据处理的实用示例。
应用源码位于 SDK 目录 source/app/03_mpu6050_display/,提供了完整的 I2C 传感器读取和数据处理实现。
1 应用概述
1.1 功能特性
- I2C 传感器通信:演示 I2C 接口读取 MPU6050 传感器数据
- 六轴数据采集:同时读取三轴加速度和三轴角速度
- 温度监测:读取传感器内部温度数据
- 实时显示:在 TFT 屏幕上显示姿态数据
- INT 引脚监测:支持 MPU6050 数据就绪中断检测
- 多芯片兼容:支持 MPU6050/MPU6500/MPU9250 等芯片
1.2 技术参数
| 参数 | 值 |
|---|---|
I2C 接口 | I2C3(/dev/i2c-3) |
从地址 | 0x68(AD0 接地) |
加速度量程 | ±2g(16384 LSB/g) |
角速度量程 | ±250°/s(131 LSB/°/s) |
温度精度 | ±1°C |
刷新频率 | 150ms(可配置) |
TFT 显示 | ST7789 240×240 |
1.3 测试用例列表
| index | 名称 | 测试指令 | 预期现象(成功) | 失败可能原因 |
|---|---|---|---|---|
| 1 | 基础采集 | ./mpu6050_display | 屏幕显示加速度、角速度、温度数据 | I2C 连接失败、传感器损坏 |
| 2 | 静止测试 | 模块静止放置 | Z 轴加速度约为 ±1g | 传感器方向错误 |
| 3 | 倾斜测试 | 模块倾斜 | 相应轴加速度变化 | 数据解析错误 |
| 4 | 温度测试 | 手摸传感器 | 温度数值上升 | 传感器故障 |
1.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 # 说明文档2 硬件连接说明
2.1 引脚定义
| 信号 | 板上 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 |
2.2 硬件电路
标准 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 已接地,无需额外连接
2.3 引脚复用说明
需要配置的引脚复用:
| 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) + 输入使能 |
3 编译与部署
3.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 开发环境搭建 完成交叉编译工具链和 SDK 配置
- MPU6050 模块已连接:正确连接 MPU6050 到 I2C3 接口
3.2 编译应用
# 设置工具链路径
export PATH=$PATH:<SDK>/tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin
# 进入示例目录
cd <SDK>/source/app/03_mpu6050_display
# 编译
make
# 清理
make clean3.3 部署到板端
# 使用 SCP 传输到开发板
scp mpu6050_display root@<板端IP>:/usr/bin/
# 或通过 TFTP 下载
tftp -g -r mpu6050_display <板端IP>3.4 运行应用
# 添加执行权限
chmod +x /usr/bin/mpu6050_display
# 运行 MPU6050 显示示例
/usr/bin/mpu6050_display3.5 预期输出
控制台输出
/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 退出。TFT 屏幕显示

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