SSD1306 显示 MPU6050 加速度计读数功能评测
硬件环境
- 主控芯片 : Renesas FPB-RA6E2
- 外设模块 :
- 连接方式 :
- SSD1306 : SCK=P111, MOSI=P109, D/C=P110, CS=P301, RES=P208(SPI 通信)
- MPU6050 : SDA=P411, SCL=P410(通过 SCI0 实现 I2C 通信)
1. 功能描述
本项目实现了通过 SSD1306 OLED 屏幕实时显示 MPU6050 加速度计的三轴(X、Y、Z)读数。程序运行时,FPB-RA6E2 主控芯片通过 I2C 总线从 MPU6050 获取加速度数据,并通过 SPI 接口将数据渲染到 SSD1306 屏幕上。整个流程以固定时间间隔刷新屏幕内容,确保数据显示的实时性与稳定性。
2. 软件配置
2.1 Device Tree Overlay (fpb_ra6e2.overlay)
设备树文件中定义了 SSD1306 和 MPU6050 的硬件资源绑定:
- SSD1306 配置 :
- 使用 SPI0 接口,设置屏幕分辨率为
128x64。 - 定义了关键引脚:
CS(片选)、D/C(数据/命令切换)、RES(复位)。 - 开启 SPI 外设并指定最大频率为
4MHz。
- 使用 SPI0 接口,设置屏幕分辨率为
- MPU6050 配置 :
2.2 Kconfig 配置 (prj.conf)
启用必要的驱动支持:
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_MPU6050_TRIGGER_NONE=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_HEAP_MEM_POOL_SIZE=16384
CONFIG_DISPLAY=y
CONFIG_LOG=y
CONFIG_CFB_LOG_LEVEL_DBG=y
CONFIG_CHARACTER_FRAMEBUFFER=y
CONFIG_GPIO=y
CONFIG_SPI=y
CONFIG_DISPLAY=y
CONFIG_SSD1306=y
CONFIG_SSD1306_DEFAULT_CONTRAST=128
3. 核心逻辑分析
3.1 主程序(main.c)
#include < zephyr/kernel.h >
#include < zephyr/device.h >
#include < zephyr/drivers/display.h >
#include < zephyr/display/cfb.h >
#include < zephyr/drivers/sensor.h >
#include < stdio.h >
#include < zephyr/logging/log.h >
LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
int main(void)
{
/* 1. 获取显示设备 (自动根据 chosen 节点找到 ssd1306_spi) */
const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
const struct device *mpu6050 = DEVICE_DT_GET_ONE(invensense_mpu6050);
if (!device_is_ready(display)) {
LOG_ERR("Display not ready! Check SPI wiring.");
return 0;
}
if (!device_is_ready(mpu6050)) {
LOG_ERR("MPU6050 device not ready");
return 0;
}
/* 2. 初始化显示 */
display_blanking_off(display);
cfb_framebuffer_init(display);
cfb_framebuffer_set_font(display, 0);
cfb_framebuffer_invert(display);
struct sensor_value accel[3];
char buf[64];
while (1) {
// 获取加速度数据
if (sensor_sample_fetch(mpu6050) == 0) {
if (sensor_channel_get(mpu6050, SENSOR_CHAN_ACCEL_XYZ, accel) == 0) {
// 清屏并显示数据
cfb_framebuffer_clear(display, false);
cfb_print(display, "MPU6050_ACC", 0, 0);
// 格式化并显示X轴加速度
snprintf(buf, sizeof(buf), "X: %.2f", sensor_value_to_double(&accel[0]));
cfb_print(display, buf, 0, 16);
// 格式化并显示Y轴加速度
snprintf(buf, sizeof(buf), "Y: %.2f", sensor_value_to_double(&accel[1]));
cfb_print(display, buf, 0, 32);
// 格式化并显示Z轴加速度
snprintf(buf, sizeof(buf), "Z: %.2f", sensor_value_to_double(&accel[2]));
cfb_print(display, buf, 0, 48);
cfb_framebuffer_finalize(display);
}
}
k_sleep(K_MSEC(200)); // 每0.2秒刷新一次
}
return 0;
}
3.2 初始化阶段
- 获取设备句柄 :
- 使用
DEVICE_DT_GET宏分别获取 SSD1306 和 MPU6050 的设备实例。 - 检查设备是否就绪,若失败则记录错误日志并退出。
- 使用
- 初始化显示模块 :
- 调用
cfb_framebuffer_init初始化帧缓冲区。 - 设置字体样式并启用反色模式以提升显示效果。
- 调用
- 传感器配置 :
- 设置 MPU6050 的采样率分频器为
249,对应输出频率为4Hz。 - 配置加速度计量程为
±2g,陀螺仪量程为±250°/s。
- 设置 MPU6050 的采样率分频器为
3.3 运行时逻辑
主循环中实现以下操作:
- 数据采集 :
- 调用
sensor_sample_fetch获取 MPU6050 的最新数据。 - 使用
sensor_channel_get提取加速度计的三轴读数。
- 调用
- 屏幕更新 :
- 清除帧缓冲区内容。
- 格式化加速度数据并逐行渲染到屏幕,包括标题和 X/Y/Z 轴的具体数值。
- 定时刷新 :
- 每隔
200ms执行一次屏幕更新,确保数据显示流畅且不占用过多 CPU 资源。
- 每隔
3.4 关键 API 使用
- 设备初始化与状态检查 :
const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display)) {
LOG_ERR("Display not ready!");
return;
}
- 传感器数据读取 :
sensor_sample_fetch(mpu6050);
sensor_channel_get(mpu6050, SENSOR_CHAN_ACCEL_XYZ, accel);
- 屏幕内容渲染 :
cfb_framebuffer_clear(display, false);
cfb_print(display, "MPU6050_ACC", 0, 0);
snprintf(buf, sizeof(buf), "X: %.2f", sensor_value_to_double(&accel[0]));
cfb_print(display, buf, 0, 16);
4. 实验现象与数据分析
4.1 屏幕显示内容
SSD1306 屏幕上应显示如下信息:
MPU6050_ACC
X: 0.12
Y: -0.05
Z: 9.78
- 标题 : 固定显示
MPU6050_ACC,表明当前显示的是加速度计数据。 - 数值 : 动态更新 X、Y、Z 轴的加速度值,单位为
m/s²。
4.2 数据变化规律
- 静止状态 : Z 轴接近重力加速度(约
9.8m/s²),X 和 Y 轴接近零。 - 动态测试 : 移动开发板时,各轴数值会随方向和加速度变化而波动,验证了 MPU6050 的正常工作。
4.3 刷新频率
屏幕每 200ms 更新一次,保证了数据的实时性,同时避免了因频繁刷新导致的视觉闪烁问题。
5. 测评总结
本项目成功展示了如何利用 SSD1306 屏幕和 MPU6050 传感器在 Zephyr RTOS 下实现加速度计数据的实时显示。代码结构清晰,充分利用了 Zephyr 的设备驱动框架和传感器接口,适合嵌入式开发者学习和参考。通过本实验,用户可以直观地观察 MPU6050 的加速度数据变化,进一步验证了硬件连接的正确性和软件逻辑的可靠性。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6078文章
45629浏览量
675400 -
加速度计
+关注
关注
6文章
827浏览量
48382 -
Zephyr
+关注
关注
1文章
63浏览量
6643
发布评论请先 登录
相关推荐
热点推荐
如何通过I2C将加速度计MPU6050型连接到ESP8266?
有没有人通过 I2C 将加速度计MPU6050型连接到ESP8266?
我想读取寄存器who_am_i,但我无法从从机获取 ACK 信号
发表于 07-22 06:18
关于陀螺仪和加速度计的选择问题
最近突发奇想,想做一个双轮的平衡车,打算捣鼓一个加强版的城市版类型的。关于车体倾斜角度的测量,大部分的方案都是采用加速度计+陀螺仪+卡尔曼滤波,对于这方面的硬件不太了解,有的人用MPU6050
发表于 11-27 16:38
加速度计测量3轴的位移?
能用mpu6050 加速度计测量3轴的位移么?漂移大么?求做过的大侠知道一二?或给推荐一种测试位移的办法。应用场合为:实时测试人的手的运动轨迹。
发表于 01-11 08:51
加速度计读数问题
你好, 我正在使用带有STM(stm32l432kb)控制器的STM加速度计(LIS2DE12)。从加速度计获取读数时,它会持续提供随机值。即使它在稳定的位置显示虚假价值。在某些方面
发表于 04-03 13:15
读取MPU6050的加速度计和角速度计方向经常发生变化
最近读取MPU6050的加速度计和角速度计,但是这俩的方向经常发生变化,是角速度计脉冲方向变化!!!请大神帮忙看看为啥?跪求!!!unsigned char rs;uint8_t
发表于 04-11 06:36
1527J-010加速度计
。 每个单元均随附文档显示残差,热传感器模型,加速模型,偏差,比例因子,线性,操作电流和频率响应。2466-200加速度计2466-400加速度计2470-002
发表于 05-28 15:04
1521L-200加速度计
`1521型是一款低成本通用集成MEMS加速度计,适用于零至中频需要极低噪声和可靠长期稳定性的工业应用。每个微型密封密封封装结合了MEMS电容式感应元件和包含感应器的定制集成电路放大器和差分输出级
发表于 05-28 15:08
STM32 MPU6050平衡车的相关资料推荐
目录GY-521MPU6050 介绍陀螺仪加速度计陀螺仪和加速度计的关系,姿态解算融合的原理硬件从机地址部分参考STM32—驱动六轴MPU6050输出欧拉角GY-521
发表于 02-10 07:45
使用陀螺加速度计MPU6050的六轴模块的资料说明免费下载
此六轴模块采用高精度的陀螺加速度计 MPU6050,通过处理器读取 MPU650 的测量数据然后通过串口输出,免去了用户自己去开发MPU6050 复杂的 I2C 协议,同时精心的 PC
发表于 11-27 08:00
•28次下载
MEMS加速度计的概念,MEMS加速度计的原理
MEMS加速度计的概念 加速度计是一种惯性传感器,能够测量物体的加速力。加速力就是当物体在加速过程受到的力,就比如地球引力。
发表于 06-01 11:28
•5265次阅读
灵动微MPU6050应用源代码
MPU6050是一种常见的六轴加速度计陀螺仪传感器,可以用于测量物体的加速度和角速度。该传感器内置了三轴加速度计和三轴陀螺仪,可以通过I
发表于 10-20 16:31
•1次下载
mpu6050和mpu6500哪个性能好
MPU6050和MPU6500都是InvenSense公司生产的高性能六轴陀螺仪和加速度计传感器。它们被广泛应用于各种领域,如移动设备、虚拟现实、机器人、汽车等。虽然它们之间有一些区别,但是无法简单
【瑞萨RA × Zephyr评测】SSD1306显示MPU6050加速度计读数
评论