明日は我が身の備忘録(あすびぼ)

自分向け備忘録です。頻繁に更新は難しいでしょうね

Raspberry pi Pico で9軸IMU(BMX055)の値を取得

 

f:id:kirikoshokunin:20210424010513p:plain:w350
 

秋月電子で販売しているBMX055使用9軸センサーモジュールをRasberryPi Picoで通信して9軸分の値を取得してみる。

 このBMX055使用9軸センサーモジュールはBoshの9軸IMU「BMX055」とI2Cレベル変換IC3.3Vレギュレータを一つの基板に実装したモジュールで、信号レベルも裏面のジャンパで設定できるのArduinoやRaspberryPi等で使用がしやすい。価格は1個¥1,280とセンサにしては少し高価だが、使いやすさと地磁気センサも入っていることを考えるとあまり気にならない。

 一つ問題なのは、通信はI2Cしか外部に出ていないので、最高400KHzのクロック周波数と低速なことだ。そのため、センサは2KHzでデータを出力できるが、加速度と角速度のデータだけでも500usで取得することは厳しい。

秋月電子通商 トップページ - 電子部品・半導体 【通販・販売】 通販コード K-13010

9軸センサ

 9軸センサとは3軸の加速度センサと3軸の角速度センサ(ジャイロセンサ)、3軸の磁気センサが一つのパッケージに入っているセンサのこと。スマホ等の姿勢推定やタップ検知、ドローンの姿勢制御、ロボットの自己位置推定など幅広い用途で使用されている。なぜ3種類のセンサをまとめているかというと、それぞれに長所と短所があるので短所を長所で補完し合うことでより高精度な姿勢推定等を行うためだ。

f:id:kirikoshokunin:20210424012237j:plain:w300
 
 加速度センサは重力加速度も検知することができるので、重力方向を調べることでセンサの姿勢を推定することができる。しかし、すべての加速度を検知するので移動の加速度や振動の加速度も検知してしまうため、姿勢が長時間変化しない状況でないと正確に姿勢を推定できないという問題がある。また、センサが向いている方向(重力方向の回転軸)は検知できないという問題もある。

 角速度センサは移動や回転方向以外の振動を検知しないため、純粋に姿勢が変化した際の角速度を検知することができる。しかし、角速度センサにも問題点がある。それは、姿勢を推定するためには角速度を時間積分する必要があるため、誤差が累積していくという点だ。つまり、単純に角速度を累積していくと静止状態でもゆっくり回転していると検知してしまう。

 磁気センサ地磁気を検知して磁北を検知することで絶対方位角を推定することができる。しかし、微弱な地磁気を検出する必要があるので、周りにモータ、トランス等磁気が漏れているものがあったり、透磁率が高い大きなもの(鉄の棚、机等)が近くにあると地磁気の磁力線が歪み正確な磁北が検出できない。そのため、鉄筋造の建物の中だと場所によって磁北の向きが異なってなってしまう。

実行結果

 今回のプログラムを実行してTeraTarmで出力を読み出すと下図のような結果になる。

f:id:kirikoshokunin:20210423233612p:plain:w350
9軸分の出力データ

ソースコード

今回はBMX055の設定はほとんど変更せずにI2Cで通信してセンサデータを読み込むことを目的とした。

CMakeLists.txt

bmx055.h

bmx055.c

メインソース