在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

零知開源——ESP8266+MPU6050 實現運動姿態檢測

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-02-20 17:54 ? 次閱讀

零知ESP8266I2C通信

在運動姿態檢測機器人平衡控制、VR頭戴設備等應用中,MPU6050(三軸加速度計+三軸陀螺儀)是一個常見的姿態傳感器。而ESP8266作為一款低功耗Wi-Fi模塊,可以實現數據無線傳輸,將姿態數據上傳至服務器或云端,便于實時監測。

然而,MPU6050沒有磁力計,直接使用陀螺儀的角速度積分計算yaw角(航向角)會導致累積漂移。本次實驗采用優化后的互補濾波,減少漂移,提高yaw角的計算精度。

一、硬件連接

MPU6050模塊采用I2C通信連接到零知ESP8266開發板

1.所需材料:

零知ESP8266

MPU6050姿態檢測傳感器

跳線

2.硬件連接示意圖:

零知ESP8266 MPU6050
3.3V VCC
GND GND
SCL SCL
SDA SDA

wKgZPGe2-82Ab_XGAALqhQI8gjQ094.png

二、代碼實現

1.頭文件及變量定義

通過MPU6050庫與傳感器交互

使用yaw_integral變量累積航向角
previousTime變量用于計算時間間隔dt

#include "MPU6050.h"

MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

float nax, nay, naz;
float ngx, ngy, ngz;

float roll, pitch, yaw;
float yaw_integral = 0.0f;  // 累積 yaw 角
unsigned long previousTime = 0;  // 記錄上一幀的時間

// 校準值
int16_t ax_offset = 0, ay_offset = 0, az_offset = 0;
int16_t gx_offset = 0, gy_offset = 0, gz_offset = 0;

#define LED_PIN LED_BUILTIN

2.初始化MPU6050

設置ESP8266I2C端口SDA、SCL
初始化MPU6050并進行連接測試
校準傳感器,減少偏差
設置50Hz采樣率和±2000°/s陀螺儀量程

void setup() {
    Serial.begin(9600);

    // MPU6050 初始化
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();

    // 檢測 MPU6050 是否連接成功
    Serial.println("Testing device connections...");
    if (accelgyro.testConnection()) {
        Serial.println("MPU6050 connection successful");
    } else {
        Serial.println("MPU6050 connection failed");
    }

    // 傳感器校準
    calibrateSensors();

    // 設置 MPU6050 的采樣率和陀螺儀的量程
    accelgyro.setRate(50);  // 采樣率 50Hz
    accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);  // 陀螺儀量程 ±2000°/s

    // LED 指示燈
    pinMode(LED_PIN, OUTPUT);

    // 記錄起始時間
    previousTime = millis();
}

3.獲取MPU6050數據

獲取加速度計&陀螺儀原始數據
減去偏移量,提高數據精度
歸一化數據,提高計算穩定性
調用complementaryFilter()計算姿態角
串口打印姿態角數據

void loop() {
    // 獲取原始數據
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    // 減去偏移量
    ax -= ax_offset;
    ay -= ay_offset;
    az -= az_offset;
    gx -= gx_offset;
    gy -= gy_offset;
    gz -= gz_offset;

    // 讀取歸一化數據
    accelgyro.readNormalizeAccel(&nax, &nay, &naz);
    accelgyro.readNormalizeGyro(&ngx, &ngy, &ngz);

    // 計算姿態角
    complementaryFilter();

    // 打印姿態角
    Serial.print("Roll: ");
    Serial.print(roll);
    Serial.print(" Pitch: ");
    Serial.print(pitch);
    Serial.print(" Yaw: ");
    Serial.println(yaw);

    delay(10);
}

4.傳感器校準

采集100組數據,計算平均值作為偏移量
過濾MPU6050啟動時的零偏誤差
減少環境噪聲對傳感器的影響

// 傳感器校準
void calibrateSensors() {
    int num_readings = 100;
    for (int i = 0; i < num_readings; i++) {
        accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
        ax_offset += ax;
        ay_offset += ay;
        az_offset += az;
        gx_offset += gx;
        gy_offset += gy;
        gz_offset += gz;
        delay(50);
    }
    ax_offset /= num_readings;
    ay_offset /= num_readings;
    az_offset /= num_readings;
    gx_offset /= num_readings;
    gy_offset /= num_readings;
    gz_offset /= num_readings;
}

5.互補濾波計算姿態角

計算dt(時間間隔),用于陀螺儀積分計算yaw


roll和pitch采用加速度計計算:
yaw采用陀螺儀積分計算并限制范圍[-180,180]
yaw=0.98*yaw_integral+0.02*yaw進行互補濾波,減少漂移

// 互補濾波計算姿態角
void complementaryFilter() {
    // 計算時間間隔 dt(單位:秒)
    unsigned long currentTime = millis();
    float dt = (currentTime - previousTime) / 1000.0;  // ms 轉換為 s
    previousTime = currentTime;

    // 計算 Roll 和 Pitch
    roll = atan2(nay, naz) * 180 / M_PI;
    pitch = atan2(-nax, sqrt(nay * nay + naz * naz)) * 180 / M_PI;

    // 陀螺儀角速度轉換
    float gyroYawRate = ngz;  // 直接使用歸一化后的 ngz(角速度 deg/s)

    // 計算 Yaw (積分計算)
    yaw_integral += gyroYawRate * dt;  // 積分計算 yaw
    yaw_integral = fmod(yaw_integral + 180, 360) - 180;  // 限制 yaw 在 [-180, 180] 之間

    // 互補濾波減少漂移影響
    yaw = 0.98 * yaw_integral + 0.02 * yaw;  // 0.98 和 0.02 為濾波系數
}

6.完整代碼

#include "MPU6050.h"

MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

float nax, nay, naz;
float ngx, ngy, ngz;

float roll, pitch, yaw;
float yaw_integral = 0.0f;  // 累積 yaw 角
unsigned long previousTime = 0;  // 記錄上一幀的時間

// 校準值
int16_t ax_offset = 0, ay_offset = 0, az_offset = 0;
int16_t gx_offset = 0, gy_offset = 0, gz_offset = 0;

#define LED_PIN LED_BUILTIN

void setup() {
    Serial.begin(9600);

    // MPU6050 初始化
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();

    // 檢測 MPU6050 是否連接成功
    Serial.println("Testing device connections...");
    if (accelgyro.testConnection()) {
        Serial.println("MPU6050 connection successful");
    } else {
        Serial.println("MPU6050 connection failed");
    }

    // 傳感器校準
    calibrateSensors();

    // 設置 MPU6050 的采樣率和陀螺儀的量程
    accelgyro.setRate(50);  // 采樣率 50Hz
    accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);  // 陀螺儀量程 ±2000°/s

    // LED 指示燈
    pinMode(LED_PIN, OUTPUT);

    // 記錄起始時間
    previousTime = millis();
}

void loop() {
    // 獲取原始數據
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    // 減去偏移量
    ax -= ax_offset;
    ay -= ay_offset;
    az -= az_offset;
    gx -= gx_offset;
    gy -= gy_offset;
    gz -= gz_offset;

    // 讀取歸一化數據
    accelgyro.readNormalizeAccel(&nax, &nay, &naz);
    accelgyro.readNormalizeGyro(&ngx, &ngy, &ngz);

    // 計算姿態角
    complementaryFilter();

    // 打印姿態角
    Serial.print("Roll: ");
    Serial.print(roll);
    Serial.print(" Pitch: ");
    Serial.print(pitch);
    Serial.print(" Yaw: ");
    Serial.println(yaw);

    delay(10);
}

// 傳感器校準
void calibrateSensors() {
    int num_readings = 100;
    for (int i = 0; i < num_readings; i++) {
        accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
        ax_offset += ax;
        ay_offset += ay;
        az_offset += az;
        gx_offset += gx;
        gy_offset += gy;
        gz_offset += gz;
        delay(50);
    }
    ax_offset /= num_readings;
    ay_offset /= num_readings;
    az_offset /= num_readings;
    gx_offset /= num_readings;
    gy_offset /= num_readings;
    gz_offset /= num_readings;
}

// 互補濾波計算姿態角
void complementaryFilter() {
    // 計算時間間隔 dt(單位:秒)
    unsigned long currentTime = millis();
    float dt = (currentTime - previousTime) / 1000.0;  // ms 轉換為 s
    previousTime = currentTime;

    // 計算 Roll 和 Pitch
    roll = atan2(nay, naz) * 180 / M_PI;
    pitch = atan2(-nax, sqrt(nay * nay + naz * naz)) * 180 / M_PI;

    // 陀螺儀角速度轉換
    float gyroYawRate = ngz;  // 直接使用歸一化后的 ngz(角速度 deg/s)

    // 計算 Yaw (積分計算)
    yaw_integral += gyroYawRate * dt;  // 積分計算 yaw
    yaw_integral = fmod(yaw_integral + 180, 360) - 180;  // 限制 yaw 在 [-180, 180] 之間

    // 互補濾波減少漂移影響
    yaw = 0.98 * yaw_integral + 0.02 * yaw;  // 0.98 和 0.02 為濾波系數
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

將上述代碼移植到零知開源平臺,選擇連接的端口編譯并上傳到零知ESP8266。

wKgZPGe2-86AQdq3AAO33xrlU1k131.png

三、實驗結果

點擊零知開源平臺調試按鈕,打開零知開源平臺的串口監視器,設置波特率為9600,觀察串口打印測量到的MPU6050姿態角。

wKgZO2e2-86AdwmZAAAe41JPHjY603.png

使用vofa+上位機效果:

wKgZO2e2-8-AeO8SAAMYQoyweKk95.jpeg

VOFA+上位機獲取MPU6050運動姿態

vofa+上位機獲取姿態解算數據視頻

https://www.bilibili.com/video/BV1HiAPe1Etj?share_source=copy_web

本人才疏學淺,有錯誤或遺漏的部分歡迎大家探討學習!

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 檢測
    +關注

    關注

    5

    文章

    4528

    瀏覽量

    91866
  • 開源
    +關注

    關注

    3

    文章

    3442

    瀏覽量

    42823
  • 姿態檢測
    +關注

    關注

    0

    文章

    6

    瀏覽量

    7185
  • MPU6050
    +關注

    關注

    39

    文章

    308

    瀏覽量

    71773
收藏 人收藏

    評論

    相關推薦

    開源——MPU6050六軸傳感器模塊實踐教程,輕松實現運動檢測

    觀,便于進行后續的處理和分析。 通過本教程,您已經學會了如何使用增強板和MPU6050模塊來讀取運動數據。這些數據可以用于各種應用,如姿態
    發表于 02-20 15:53

    開源——ESP8266+MPU6050 實現運動姿態檢測

    ?ESP8266學習教程 在運動姿態檢測、機器人平衡控制、VR頭戴設備等應用中,
    發表于 02-20 17:44

    使用esp8266實現STM32聯網(最簡單USART方法)

    到電腦上的java程序 這一篇 esp8266與STM32連接,電腦通過STM32配置esp8266實現聯網發送數據具體流程如下圖 2= esp8266怎么和STM32連接(引腳連
    發表于 11-22 11:51 ?1.3w次閱讀

    mpu6050姿態解算原理_mpu6050姿態解算程序

    mpu6050常用作提供飛控運行時的姿態測量和計算。本文首先介紹了MPU6050姿態解算的原理,其次詳細的介紹了mpu6050
    的頭像 發表于 03-09 09:15 ?4.4w次閱讀

    ESP8266入門博客---記錄

    暫時也沒弄清楚怎么玩,網上收錄一些自己看的,算是一個心路歷程。是什么玩意 :ESP8266使用入門教程_Q_xr-CSDN博客_esp8266教程開始測試一些AT指令:爛大街的ESP8266該怎么玩! -
    發表于 12-07 17:06 ?36次下載
    <b class='flag-5'>ESP8266</b>入門博客---記錄

    Esp8266單機開源分享

    電子發燒友網站提供《Esp8266單機開源分享.zip》資料免費下載
    發表于 07-04 14:55 ?2次下載
    <b class='flag-5'>Esp8266</b>單機<b class='flag-5'>開源</b>分享

    ESP8266迷你系統開源分享

    電子發燒友網站提供《ESP8266迷你系統開源分享.zip》資料免費下載
    發表于 08-08 10:07 ?7次下載
    <b class='flag-5'>ESP8266</b>迷你系統<b class='flag-5'>開源</b>分享

    開發板ESP8266開源分享

    電子發燒友網站提供《開發板ESP8266開源分享.zip》資料免費下載
    發表于 08-10 14:49 ?16次下載
    開發板<b class='flag-5'>ESP8266</b><b class='flag-5'>開源</b>分享

    BIM時鐘ESP8266開源項目

    電子發燒友網站提供《BIM時鐘ESP8266開源項目.zip》資料免費下載
    發表于 08-16 11:18 ?2次下載
    BIM時鐘<b class='flag-5'>ESP8266</b><b class='flag-5'>開源</b>項目

    使用MPU6050ESP8266和Qubitro進行ART分析

    電子發燒友網站提供《使用MPU6050ESP8266和Qubitro進行ART分析.zip》資料免費下載
    發表于 10-28 09:33 ?2次下載
    使用<b class='flag-5'>MPU6050</b>、<b class='flag-5'>ESP8266</b>和Qubitro進行ART分析

    ESP8266物聯網開源分享

    電子發燒友網站提供《ESP8266物聯網開源分享.zip》資料免費下載
    發表于 12-06 14:45 ?4次下載
    <b class='flag-5'>ESP8266</b>物聯網<b class='flag-5'>開源</b>分享

    ESP8266無人機原理圖+PCB合集

    現在作為廉價的配置就是ESP8266(樹莓派Pico)+MPU6050+MOSx4(Si2302 )+LDO。然后原理圖已經繪制完畢,接下來的問題就是PCB的布局,以及一些附件的添加。
    的頭像 發表于 01-06 14:37 ?6911次閱讀

    ESP8266編程盾開源

    電子發燒友網站提供《ESP8266編程盾開源.zip》資料免費下載
    發表于 02-02 14:25 ?1次下載
    <b class='flag-5'>ESP8266</b>編程盾<b class='flag-5'>開源</b>

    MPU6050運動跟蹤設備開源分享

    電子發燒友網站提供《MPU6050運動跟蹤設備開源分享.zip》資料免費下載
    發表于 06-29 14:57 ?7次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>運動</b>跟蹤設備<b class='flag-5'>開源</b>分享

    開源——MPU6050六軸傳感器模塊實踐教程,輕松實現運動檢測

    。 ? ? ? 通過本教程,您將學習如何讀取并處理這些數據,為您的項目添加運動檢測姿態控制功能。 一、硬件連接 ? ? ? ?在開始編程之前,首先需要正確連接MPU6050模塊到
    的頭像 發表于 02-20 16:17 ?90次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>MPU6050</b>六軸傳感器模塊實踐教程,輕松<b class='flag-5'>實現</b><b class='flag-5'>運動檢測</b>!
    主站蜘蛛池模板: 日韩欧美卡通动漫在线观看 | 四虎影院免费观看视频 | 人人干网 | 国产精品美乳在线观看 | 天堂在线最新资源 | 在线观看视频一区二区 | 好大好硬好长好爽a网站 | 中文在线最新版天堂bt | 亚洲一卡二卡三卡 | 在线看免费视频 | 福利视频99 | 高清国产美女在线观看 | 日日射天天射 | 国产网红主播精品福利大秀专区 | 美女视频黄的免费视频网页 | 玖玖爱这里只有精品 | 偷偷狠狠的日日日日 | 天天干天天操天天射 | 天天插天天插天天插 | 四虎www. | 日本动漫在线看 | 狠狠色丁香六月色 | 日本系列 1页 亚洲系列 | 欧美ol丝袜高跟秘书在线观看 | 91精品国产91久久久久青草 | 国产又粗又大又爽又免费 | 欧美午夜色视频国产精品 | 人人爱人人艹 | 色多多免费观看 | 拍拍拍无档又黄又爽视频 | 秋霞麻豆 | 日日操天天操夜夜操 | 超级香蕉97视频在线观看一区 | 精品国产自在现线看久久 | 久久国产综合 | 国产精品区在线12p 国产精品任我爽爆在线播放6080 | 伊人久久成人 | 天天操夜夜操狠狠操 | 1024国产欧美日韩精品 | 免费黄色网址网站 | sese久久|