SSD1306 顯示 MPU6050 加速度計讀數(shù)功能評測
硬件環(huán)境
- 主控芯片 : Renesas FPB-RA6E2
- 外設(shè)模塊 :
- 連接方式 :
- SSD1306 : SCK=P111, MOSI=P109, D/C=P110, CS=P301, RES=P208(SPI 通信)
- MPU6050 : SDA=P411, SCL=P410(通過 SCI0 實現(xiàn) I2C 通信)
1. 功能描述
本項目實現(xiàn)了通過 SSD1306 OLED 屏幕實時顯示 MPU6050 加速度計的三軸(X、Y、Z)讀數(shù)。程序運行時,F(xiàn)PB-RA6E2 主控芯片通過 I2C 總線從 MPU6050 獲取加速度數(shù)據(jù),并通過 SPI 接口將數(shù)據(jù)渲染到 SSD1306 屏幕上。整個流程以固定時間間隔刷新屏幕內(nèi)容,確保數(shù)據(jù)顯示的實時性與穩(wěn)定性。
2. 軟件配置
2.1 Device Tree Overlay (fpb_ra6e2.overlay)
設(shè)備樹文件中定義了 SSD1306 和 MPU6050 的硬件資源綁定:
- SSD1306 配置 :
- 使用 SPI0 接口,設(shè)置屏幕分辨率為
128x64。 - 定義了關(guān)鍵引腳:
CS(片選)、D/C(數(shù)據(jù)/命令切換)、RES(復(fù)位)。 - 開啟 SPI 外設(shè)并指定最大頻率為
4MHz。
- 使用 SPI0 接口,設(shè)置屏幕分辨率為
- MPU6050 配置 :
2.2 Kconfig 配置 (prj.conf)
啟用必要的驅(qū)動支持:
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. 獲取顯示設(shè)備 (自動根據(jù) chosen 節(jié)點找到 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) {
// 獲取加速度數(shù)據(jù)
if (sensor_sample_fetch(mpu6050) == 0) {
if (sensor_channel_get(mpu6050, SENSOR_CHAN_ACCEL_XYZ, accel) == 0) {
// 清屏并顯示數(shù)據(jù)
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 初始化階段
- 獲取設(shè)備句柄 :
- 使用
DEVICE_DT_GET宏分別獲取 SSD1306 和 MPU6050 的設(shè)備實例。 - 檢查設(shè)備是否就緒,若失敗則記錄錯誤日志并退出。
- 使用
- 初始化顯示模塊 :
- 調(diào)用
cfb_framebuffer_init初始化幀緩沖區(qū)。 - 設(shè)置字體樣式并啟用反色模式以提升顯示效果。
- 調(diào)用
- 傳感器配置 :
- 設(shè)置 MPU6050 的采樣率分頻器為
249,對應(yīng)輸出頻率為4Hz。 - 配置加速度計量程為
±2g,陀螺儀量程為±250°/s。
- 設(shè)置 MPU6050 的采樣率分頻器為
3.3 運行時邏輯
主循環(huán)中實現(xiàn)以下操作:
- 數(shù)據(jù)采集 :
- 調(diào)用
sensor_sample_fetch獲取 MPU6050 的最新數(shù)據(jù)。 - 使用
sensor_channel_get提取加速度計的三軸讀數(shù)。
- 調(diào)用
- 屏幕更新 :
- 清除幀緩沖區(qū)內(nèi)容。
- 格式化加速度數(shù)據(jù)并逐行渲染到屏幕,包括標題和 X/Y/Z 軸的具體數(shù)值。
- 定時刷新 :
- 每隔
200ms執(zhí)行一次屏幕更新,確保數(shù)據(jù)顯示流暢且不占用過多 CPU 資源。
- 每隔
3.4 關(guān)鍵 API 使用
- 設(shè)備初始化與狀態(tài)檢查 :
const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display)) {
LOG_ERR("Display not ready!");
return;
}
- 傳感器數(shù)據(jù)讀取 :
sensor_sample_fetch(mpu6050);
sensor_channel_get(mpu6050, SENSOR_CHAN_ACCEL_XYZ, accel);
- 屏幕內(nèi)容渲染 :
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. 實驗現(xiàn)象與數(shù)據(jù)分析
4.1 屏幕顯示內(nèi)容
SSD1306 屏幕上應(yīng)顯示如下信息:
MPU6050_ACC
X: 0.12
Y: -0.05
Z: 9.78
- 標題 : 固定顯示
MPU6050_ACC,表明當前顯示的是加速度計數(shù)據(jù)。 - 數(shù)值 : 動態(tài)更新 X、Y、Z 軸的加速度值,單位為
m/s2。
4.2 數(shù)據(jù)變化規(guī)律
- 靜止狀態(tài) : Z 軸接近重力加速度(約
9.8m/s2),X 和 Y 軸接近零。 - 動態(tài)測試 : 移動開發(fā)板時,各軸數(shù)值會隨方向和加速度變化而波動,驗證了 MPU6050 的正常工作。
4.3 刷新頻率
屏幕每 200ms 更新一次,保證了數(shù)據(jù)的實時性,同時避免了因頻繁刷新導致的視覺閃爍問題。
5. 測評總結(jié)
本項目成功展示了如何利用 SSD1306 屏幕和 MPU6050 傳感器在 Zephyr RTOS 下實現(xiàn)加速度計數(shù)據(jù)的實時顯示。代碼結(jié)構(gòu)清晰,充分利用了 Zephyr 的設(shè)備驅(qū)動框架和傳感器接口,適合嵌入式開發(fā)者學習和參考。通過本實驗,用戶可以直觀地觀察 MPU6050 的加速度數(shù)據(jù)變化,進一步驗證了硬件連接的正確性和軟件邏輯的可靠性。
-
單片機
+關(guān)注
關(guān)注
6076文章
45492瀏覽量
670174 -
加速度計
+關(guān)注
關(guān)注
6文章
812瀏覽量
48152 -
Zephyr
+關(guān)注
關(guān)注
0文章
58瀏覽量
6579
發(fā)布評論請先 登錄
如何通過I2C將加速度計MPU6050型連接到ESP8266?
關(guān)于陀螺儀和加速度計的選擇問題
加速度計測量3軸的位移?
加速度計讀數(shù)問題
讀取MPU6050的加速度計和角速度計方向經(jīng)常發(fā)生變化
1527J-010加速度計
1521L-200加速度計
如何去讀取MPU6050的加速度計和陀螺儀的原始數(shù)據(jù)呢
STM32 MPU6050平衡車的相關(guān)資料推薦
使用陀螺加速度計MPU6050的六軸模塊的資料說明免費下載
MEMS加速度計的概念,MEMS加速度計的原理
靈動微MPU6050應(yīng)用源代碼
【瑞薩RA × Zephyr評測】SSD1306顯示MPU6050加速度計讀數(shù)
評論