MPU6050 使用 DMP(Digital Motion Processor)
===
## 什麼是 MPU6050
由 [invensense](https://invensense.tdk.com/) 研發
一個內部含有 **3軸加速度計** **3軸陀螺儀** 的姿態感測器
:::info
加速度感測範圍: +-2G +-4G +-8G +-16G
角速度感測範圍: +-250 +-500 +-1000 +-2000 (degree per second)
:::
## 什麼是 DMP
全名為 **Digital Motion Processor**
是內嵌在 MPU6050 裡,可以幫助計算
計算完的資料會存在一個 FIFO 的 queue,並發出中斷告知計算完成
## 如何接到 Arduino
![](https://i.imgur.com/1VAnJFy.jpg)
以上是接到 UNO 板子的範例
:::info
|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](https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050)
載下整個 MPU6050資料夾 變成 ZIP壓縮檔
開啟 Arduino IDE 點選 草稿碼 -> 匯入程式庫 -> 加入.ZIP程式庫
![](https://i.imgur.com/WGj8NeS.png)
加入完成之後,點選 檔案 -> 範例 -> MPU6050 -> MPU6050_DMP6
![](https://i.imgur.com/1ZuPZcv.png)
如果上傳到 Arduino 執行並點開 序列埠 能夠看到數據
:::success
恭喜你! 你已經成功使用 DMP 了!
:::
## 了解函式
這個函式庫有提供不少好用的函式
一一列舉如下
```clike
/*
* 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) {
...
}
```