読者です 読者をやめる 読者になる 読者になる

gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

MPU6500のDMPの使い方

最近Invensense社のMPU6500という6軸加速度・ジャイロセンサを使いました。MPU6500には、DMP(Digital Motion Processor)というプロセッサがあり、クォータニオンオイラー角を出力してくれます。今回はその時にハマった点などを記載します。

 

今回の開発環境は下記の通りです。

<環境>

・ボード:Beagle Bone Black(BBB)

・OS:Ubuntu(ボードが手元から無くなったので、ちょっとわかりません。。)

 

<SPIの設定>

MPU6500は、I/FとしてI2CとSPIを持っています。今回はSPIを使ってBBBからMPU6500を操作することにします。

 

デフォルトでは、BBBのSPIは無効になっています。そのため、BBBのslotsにドライバをセットする必要があります。ドライバの生成方法とセット方法については、下記リンクを参照ください。

BeagleBone Black Enable SPIDEV - eLinux.org

BeagleBoneBlack [6] – SPI – | MyToolBox

Mobile Maniac: Linux - Accessing SPI Bus from User Space - Part II

 

<DMPの使い方>

DMPを使うには、MPU6500へF/Wを焼きこむ必要があります。しかし、MPU6050に関する記述はあるが、MPU6500は全くない見つかりませんでした(泣)。。。そのため、MPU6050のF/Wを無理やり焼いてみることにしました。

 

その結果、MPU6050の初期化~DMPの設定に関する部分をコピペすることで、無事にMPU6500のDMPを動かすことが出来ました!使用したF/WはInvensenseが提供するMotionDriver5.1.2で、MPU6500との通信部分以外は改変しませんでした。通信部分に関しては、I2CからSPIへと変更しました。

Login | Developers

 

アプリケーションとSPIドライバとのI/Fは、jrowbergさんのI2Cdevを流用しました。I2Cdev内のRead/Write部分をSPI用に書き換え、SPIdevを作りました。これで設計・実装の手間がだいぶ省けました。なお、SPIの通信モードは、3としてください。

i2cdevlib/Arduino/I2Cdev at master · jrowberg/i2cdevlib · GitHub

 

DMPの動作を確認したところ、静止状態では、DMPの出力値は特に発振することはなかったです。ただし、加速度・ジャイロの出力値はノイズが乗るものなので、完全に値が静止するということはないので、フィルタリングは必要だと思います(今回は実装しませんでしたので、お手数ですが他の記事を御覧ください)。

  

加えて、DMPの更新周期には注意が必要です。200Hz以上の周期で更新すると、ノイズが半端ないです。そのため、僕は100Hzにしました。これに伴い、MPU6500のFIFOからのデータ取得も、100Hz以下に設定する必要があることに注意です。100Hz以上でも構わないのですが、FIFOが空の状態に遭遇するはずです。

MPU 6050 and it's DMP over time | JP