电子说
本项目实现了通过 SSD1306 OLED 屏幕实时显示 MPU6050 加速度计的三轴(X、Y、Z)读数。程序运行时,FPB-RA6E2 主控芯片通过 I2C 总线从 MPU6050 获取加速度数据,并通过 SPI 接口将数据渲染到 SSD1306 屏幕上。整个流程以固定时间间隔刷新屏幕内容,确保数据显示的实时性与稳定性。
fpb_ra6e2.overlay)设备树文件中定义了 SSD1306 和 MPU6050 的硬件资源绑定:
128x64。CS(片选)、D/C(数据/命令切换)、RES(复位)。4MHz。100kHz。0x68,并配置采样率分频器(smplrt-div)和量程参数(gyro-fs 和 accel-fs)。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
#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;
}
DEVICE_DT_GET 宏分别获取 SSD1306 和 MPU6050 的设备实例。cfb_framebuffer_init 初始化帧缓冲区。249,对应输出频率为 4Hz。±2g,陀螺仪量程为 ±250°/s。主循环中实现以下操作:
sensor_sample_fetch 获取 MPU6050 的最新数据。sensor_channel_get 提取加速度计的三轴读数。200ms 执行一次屏幕更新,确保数据显示流畅且不占用过多 CPU 资源。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);
SSD1306 屏幕上应显示如下信息:
MPU6050_ACC
X: 0.12
Y: -0.05
Z: 9.78
MPU6050_ACC,表明当前显示的是加速度计数据。m/s²。9.8m/s²),X 和 Y 轴接近零。屏幕每 200ms 更新一次,保证了数据的实时性,同时避免了因频繁刷新导致的视觉闪烁问题。
本项目成功展示了如何利用 SSD1306 屏幕和 MPU6050 传感器在 Zephyr RTOS 下实现加速度计数据的实时显示。代码结构清晰,充分利用了 Zephyr 的设备驱动框架和传感器接口,适合嵌入式开发者学习和参考。通过本实验,用户可以直观地观察 MPU6050 的加速度数据变化,进一步验证了硬件连接的正确性和软件逻辑的可靠性。
全部0条评论
快来发表一下你的评论吧 !