【瑞萨RA × Zephyr评测】SSD1306显示MPU6050加速度计读数

电子说

1.4w人已加入

描述

SSD1306 显示 MPU6050 加速度计读数功能评测


硬件环境

  • 主控芯片 : Renesas FPB-RA6E2
  • 外设模块 :
    • SSD1306 OLED 屏幕 (SPI 接口)
    • MPU6050 六轴传感器 (I2C 接口)
  • 连接方式 :
    • 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
  • MPU6050 配置 :
    • 使用 SCI0 模块作为 I2C 控制器,设置通信速率为 100kHz
    • 定义了传感器地址 0x68,并配置采样率分频器(smplrt-div)和量程参数(gyro-fsaccel-fs)。

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 初始化阶段

  1. 获取设备句柄 :
    • 使用 DEVICE_DT_GET 宏分别获取 SSD1306 和 MPU6050 的设备实例。
    • 检查设备是否就绪,若失败则记录错误日志并退出。
  2. 初始化显示模块 :
    • 调用 cfb_framebuffer_init 初始化帧缓冲区。
    • 设置字体样式并启用反色模式以提升显示效果。
  3. 传感器配置 :
    • 设置 MPU6050 的采样率分频器为 249,对应输出频率为 4Hz
    • 配置加速度计量程为 ±2g,陀螺仪量程为 ±250°/s

3.3 运行时逻辑

主循环中实现以下操作:

  1. 数据采集 :
    • 调用 sensor_sample_fetch 获取 MPU6050 的最新数据。
    • 使用 sensor_channel_get 提取加速度计的三轴读数。
  2. 屏幕更新 :
    • 清除帧缓冲区内容。
    • 格式化加速度数据并逐行渲染到屏幕,包括标题和 X/Y/Z 轴的具体数值。
  3. 定时刷新 :
    • 每隔 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 的加速度数据变化,进一步验证了硬件连接的正确性和软件逻辑的可靠性。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分