Try   HackMD

MPU6050 使用 DMP(Digital Motion Processor)

什麼是 MPU6050

invensense 研發
一個內部含有 3軸加速度計 3軸陀螺儀 的姿態感測器

加速度感測範圍: ±2G ±4G ±8G ±16G
角速度感測範圍: ±250 ±500 ±1000 ±2000 (degree per second)

什麼是 DMP

全名為 Digital Motion Processor
是內嵌在 MPU6050 裡,可以幫助計算
計算完的資料會存在一個 FIFO 的 queue,並發出中斷告知計算完成

如何接到 Arduino

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

以上是接到 UNO 板子的範例

MPU6050 Arduino
VCC 5V
GND GND
SDA A4(SDA)
SCL A5(SCL)
INT 2

INT 為中斷觸發腳,當 DMP 計算完成就會送出訊號告知完成
SDA 跟 SCL 為 I2C 通訊所使用
SDA 負責送資料,SCL 負責送出共用的 clock

但其實只要了解原理,任何支援 中斷 跟 I2C 的板子都能夠使用

另外圖中的範例為模組 GY-521
是另外的廠商利用 MPU6050 搭配一些電路並把重要的接腳引出來
方便使用者使用

如何從 DMP 取得數據

先去下載函式庫 I2C-MPU6050
載下整個 MPU6050資料夾 變成 ZIP壓縮檔

開啟 Arduino IDE 點選 草稿碼 -> 匯入程式庫 -> 加入.ZIP程式庫

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

加入完成之後,點選 檔案 -> 範例 -> MPU6050 -> MPU6050_DMP6

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

如果上傳到 Arduino 執行並點開 序列埠 能夠看到數據

恭喜你! 你已經成功使用 DMP 了!

了解函式

這個函式庫有提供不少好用的函式
一一列舉如下

/* 
 * Packet 是指從 DMP FIFO取得的封包(共42Byte)
 * 存放著 四元數 角速度 加速度 
*/
/* 取得加速度值 */
uint8_t MPU6050::dmpGetAccel(int32_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetAccel(int16_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetAccel(VectorInt16 *v, const uint8_t* packet) {
    ...
}
/* 取得四元數 */
uint8_t MPU6050::dmpGetQuaternion(int32_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetQuaternion(int16_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetQuaternion(Quaternion *q, const uint8_t* packet) {
    ...
}

/* 取得角速度 */
uint8_t MPU6050::dmpGetGyro(int32_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetGyro(int16_t *data, const uint8_t* packet) {
    ...
}

uint8_t MPU6050::dmpGetGyro(VectorInt16 *v, const uint8_t* packet) {
    ...
}

/*
 * 直接傳入 dmp取得的四元數
 * 可以得到重力的向量
*/
uint8_t MPU6050::dmpGetGravity(VectorFloat *v, Quaternion *q) {
    ...
}

/*
 * 傳入 重力向量 跟 dmp取得的原始加速度資料
 * 可以得到抵銷重力後的加速度數值
*/
uint8_t MPU6050::dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity) {
    ...
}

/*
 * 傳入 dmpGetLinearAccel算完得到的加速度 跟 dmp取得的四元數
 * 可以得到無視旋轉的加速度數值
*/
uint8_t MPU6050::dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q) {
    ...
}

/*
 * 傳入 dmp取得的四元數
 * 可以得到歐拉角
*/
uint8_t MPU6050::dmpGetEuler(float *data, Quaternion *q) {
    ...
}

/*
 * 傳入 dmp取得的四元數 跟 重力向量
 * 可以得到飛機使用的 Yaw Pitch Roll
*/
uint8_t MPU6050::dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity) {
    ...
}