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) { ... } ```