Arduino提高篇17—MPU6050姿態解算

Photo by Mitch Nielsen on Unsplash

對於大多數MPU6050的應用來說,獲取到的原始數據並沒有多大用處,我們需要對原始數據進行姿態融合解算,最終得到姿態數據,也就是三個歐拉角:航向角(yaw)、橫滾角(roll)和俯仰角(pitch)。

MPU6050內部自帶數字運動處理器(DMP)硬件加速引擎,配合運動驅動庫直接輸出四元數,進而很方便的計算出歐拉角,大大降低了主控MCU的負擔。本篇使用MPU6050的驅動庫來獲取姿態數據。

1. MPU6050驅動庫安裝

MPU6050的驅動庫有很多,我們可以在IDE中單擊「項目」—「加載庫」—「管理庫」,在搜索欄輸入"6050",可以看到不同的驅動庫。

多種驅動庫

本篇我們使用的由國外大牛Jeff Rowberg開發的庫並沒有在列表中,需要下載後導入到Arduino。點擊跳轉到Github下載。

下載庫文件

下載到的庫文件其實是多種設備的IIC驅動庫,我們這裏只需要兩個文件夾下的文件。解壓後,進入"Arduino"文件夾,裏面的"I2Cdev"和"MPU6050"就是我們需要的文件。

選擇庫文件

找到Arduino的libraries文件路徑,Windows下路徑爲"C:\Users\Tony\Documents\Arduino\libraries",修改“Tony”爲你的電腦用戶名。我們拷貝這兩個文件夾到該路徑下,至此庫文件安裝完成。

拷貝庫文件

2. 實驗材料

  • Uno R3開發板
  • 配套USB數據線
  • 麪包板及配套連接線
  • MPU6050傳感器模塊

3. 實驗步驟

1. 根據原理圖搭建電路圖。

MPU6050傳感器模塊的VCC、GND分別連接開發板的3.3V、GND,傳感器的SDA、SCL引腳連接開發板A4、A5引腳。

實驗原理圖如下圖所示:

實驗原理圖

實物連接圖如下圖所示:

實物連接圖

2. 新建sketch,拷貝如下代碼替換自動生成的代碼並進行保存。

/*
   DMP
   MPU6050姿態解算
*/

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"

MPU6050 mpu;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];

void setup()
{
  Serial.begin(115200);
  mpu.initialize();
  mpu.dmpInitialize();
  mpu.CalibrateAccel(6);
  mpu.CalibrateGyro(6);
  mpu.PrintActiveOffsets();
  mpu.setDMPEnabled(true);
}

void loop()
{
  if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer))
  {
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    Serial.print("ypr\t");
    Serial.print(ypr[0] * 180 / M_PI);
    Serial.print("\t");
    Serial.print(ypr[1] * 180 / M_PI);
    Serial.print("\t");
    Serial.println(ypr[2] * 180 / M_PI);
  }
}

3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。

程序下載

4. 實驗現象

打開串口監視器,波特率設置成與程序中相一致的115200。監視器中輸出三個歐拉角數據,移動MPU6050,數據發生變化。

實驗現象


關注公衆號「TonyCode」,後臺回覆“提高”,獲取文中代碼。
TonyCode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章