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へと変更しました。
アプリケーションと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が空の状態に遭遇するはずです。