在线观看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

    文章

    4620

    瀏覽量

    92598
  • 開源
    +關注

    關注

    3

    文章

    3634

    瀏覽量

    43582
  • 姿態檢測
    +關注

    關注

    0

    文章

    6

    瀏覽量

    7221
  • MPU6050
    +關注

    關注

    39

    文章

    310

    瀏覽量

    72854
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

    開源——ESP8266結合ICM20948實現高精度姿態解算

    實驗室發布新版ICM20948模塊,可以非常方便的應用在各個系列開發板或其他類似MCU,它可以作為已經停產的MPU9250的替代品,
    發表于 03-07 15:46

    使用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單機開源分享.zip》資料免費下載
    發表于 07-04 14:55 ?3次下載
    <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分析

    電子發燒友網站提供《使用MPU6050、ESP8266和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 ?7890次閱讀

    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 ?1006次閱讀
    <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>!
    主站蜘蛛池模板: 四虎影库永久在线 | 日本理论片www视频 日本理论午夜中文字幕第一页 | 日本特级淫片免费看 | 天天爽天天狼久久久综合 | 国产亚洲欧美日本一二三本道 | 五月六月伊人狠狠丁香网 | 天堂网在线看 | 中文字幕一区二区三区永久 | 午夜啪啪免费视频 | 亚洲精品91大神在线观看 | 成人三级网址 | 韩国三级视频在线观看 | 成人免费一区二区三区 | 一个色综合网站 | h网站在线看 | 怡红院国产 | 天天干天天操天天操 | 九九精品久久久久久噜噜 | 亚洲va久久久噜噜噜久久男同 | 婷婷激情小说 | 国产精品天天干 | 国产成+人+综合+亚洲欧美丁香花 | 天天天操天天天干 | 男人和女人在床做黄的网站 | 日本一区二区三区在线观看视频 | 国产三级毛片视频 | 成人a毛片手机免费播放 | 全部在线播放免费毛片 | 圆胖肥女人性视频 | 久久国产伦三级理电影 | 香蕉网影院在线观看免费 | 开心丁香婷婷深爱五月 | 婷婷丁香五月中文字幕 | 久久97精品久久久久久久看片 | 国产精品黄页网站在线播放免费 | 欧美日韩a级a| 久久黄色网 | 激情婷婷六月 | 国产亚洲精品自在久久77 | 婷五月综合 | 午夜精品久久久久久久久 |