一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

零知開源——ESP8266+MPU6050 實(shí)現(xiàn)運(yùn)動姿態(tài)檢測

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

零知ESP8266I2C通信

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

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

一、硬件連接

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

1.所需材料:

零知ESP8266

MPU6050姿態(tài)檢測傳感器

跳線

2.硬件連接示意圖:

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

wKgZPGe2-82Ab_XGAALqhQI8gjQ094.png

二、代碼實(shí)現(xiàn)

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;  // 記錄上一幀的時間

// 校準(zhǔn)值
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

設(shè)置ESP8266I2C端口SDA、SCL
初始化MPU6050并進(jìn)行連接測試
校準(zhǔn)傳感器,減少偏差
設(shè)置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");
    }

    // 傳感器校準(zhǔn)
    calibrateSensors();

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

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

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

3.獲取MPU6050數(shù)據(jù)

獲取加速度計&陀螺儀原始數(shù)據(jù)
減去偏移量,提高數(shù)據(jù)精度
歸一化數(shù)據(jù),提高計算穩(wěn)定性
調(diào)用complementaryFilter()計算姿態(tài)角
串口打印姿態(tài)角數(shù)據(jù)

void loop() {
    // 獲取原始數(shù)據(jù)
    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;

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

    // 計算姿態(tài)角
    complementaryFilter();

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

    delay(10);
}

4.傳感器校準(zhǔn)

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

// 傳感器校準(zhǔn)
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.互補(bǔ)濾波計算姿態(tài)角

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


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

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

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

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

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

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

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;  // 記錄上一幀的時間

// 校準(zhǔn)值
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");
    }

    // 傳感器校準(zhǔn)
    calibrateSensors();

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

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

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

void loop() {
    // 獲取原始數(shù)據(jù)
    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;

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

    // 計算姿態(tài)角
    complementaryFilter();

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

    delay(10);
}

// 傳感器校準(zhǔn)
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;
}

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

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

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

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

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

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

wKgZPGe2-86AQdq3AAO33xrlU1k131.png

三、實(shí)驗(yàn)結(jié)果

點(diǎn)擊零知開源平臺調(diào)試按鈕,打開零知開源平臺的串口監(jiān)視器,設(shè)置波特率為9600,觀察串口打印測量到的MPU6050姿態(tài)角。

wKgZO2e2-86AdwmZAAAe41JPHjY603.png

使用vofa+上位機(jī)效果:

wKgZO2e2-8-AeO8SAAMYQoyweKk95.jpeg

VOFA+上位機(jī)獲取MPU6050運(yùn)動姿態(tài)

vofa+上位機(jī)獲取姿態(tài)解算數(shù)據(jù)視頻

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

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

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 檢測
    +關(guān)注

    關(guān)注

    5

    文章

    4577

    瀏覽量

    92406
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3533

    瀏覽量

    43293
  • 姿態(tài)檢測
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    7194
  • MPU6050
    +關(guān)注

    關(guān)注

    39

    文章

    309

    瀏覽量

    72501
收藏 人收藏

    評論

    相關(guān)推薦

    開源——MPU6050六軸傳感器模塊實(shí)踐教程,輕松實(shí)現(xiàn)運(yùn)動檢測

    觀,便于進(jìn)行后續(xù)的處理和分析。 通過本教程,您已經(jīng)學(xué)會了如何使用增強(qiáng)板和MPU6050模塊來讀取運(yùn)動數(shù)據(jù)。這些數(shù)據(jù)可以用于各種應(yīng)用,如姿態(tài)
    發(fā)表于 02-20 15:53

    開源——ESP8266+MPU6050 實(shí)現(xiàn)運(yùn)動姿態(tài)檢測

    ?ESP8266學(xué)習(xí)教程 在運(yùn)動姿態(tài)檢測、機(jī)器人平衡控制、VR頭戴設(shè)備等應(yīng)用中,
    發(fā)表于 02-20 17:44

    開源——ESP8266結(jié)合ICM20948實(shí)現(xiàn)高精度姿態(tài)解算

    實(shí)驗(yàn)室發(fā)布新版ICM20948模塊,可以非常方便的應(yīng)用在各個系列開發(fā)板或其他類似MCU,它可以作為已經(jīng)停產(chǎn)的MPU9250的替代品,
    發(fā)表于 03-07 15:46

    使用esp8266實(shí)現(xiàn)STM32聯(lián)網(wǎng)(最簡單USART方法)

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

    mpu6050姿態(tài)解算原理_mpu6050姿態(tài)解算程序

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

    Esp8266單機(jī)開源分享

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

    ESP8266迷你系統(tǒng)開源分享

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

    開發(fā)板ESP8266開源分享

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

    BIM時鐘ESP8266開源項目

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

    使用MPU6050ESP8266和Qubitro進(jìn)行ART分析

    電子發(fā)燒友網(wǎng)站提供《使用MPU6050、ESP8266和Qubitro進(jìn)行ART分析.zip》資料免費(fèi)下載
    發(fā)表于 10-28 09:33 ?2次下載
    使用<b class='flag-5'>MPU6050</b>、<b class='flag-5'>ESP8266</b>和Qubitro進(jìn)行ART分析

    ESP8266物聯(lián)網(wǎng)開源分享

    電子發(fā)燒友網(wǎng)站提供《ESP8266物聯(lián)網(wǎng)開源分享.zip》資料免費(fèi)下載
    發(fā)表于 12-06 14:45 ?4次下載
    <b class='flag-5'>ESP8266</b>物聯(lián)網(wǎng)<b class='flag-5'>開源</b>分享

    ESP8266無人機(jī)原理圖+PCB合集

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

    ESP8266編程盾開源

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

    MPU6050運(yùn)動跟蹤設(shè)備開源分享

    電子發(fā)燒友網(wǎng)站提供《MPU6050運(yùn)動跟蹤設(shè)備開源分享.zip》資料免費(fèi)下載
    發(fā)表于 06-29 14:57 ?7次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>運(yùn)動</b>跟蹤設(shè)備<b class='flag-5'>開源</b>分享

    開源——MPU6050六軸傳感器模塊實(shí)踐教程,輕松實(shí)現(xiàn)運(yùn)動檢測!

    。 ? ? ? 通過本教程,您將學(xué)習(xí)如何讀取并處理這些數(shù)據(jù),為您的項目添加運(yùn)動檢測姿態(tài)控制功能。 一、硬件連接 ? ? ? ?在開始編程之前,首先需要正確連接MPU6050模塊到
    的頭像 發(fā)表于 02-20 16:17 ?743次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>MPU6050</b>六軸傳感器模塊實(shí)踐教程,輕松<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>運(yùn)動檢測</b>!