Next Step社製の 「Sony Spresense 用 6軸 加速度計・ジャイロスコープセンサ (BMI270) Addon ボード」 をVisual Studio CodeベースのSPRESENSE開発環境「SPRESENSE SDK」から制御してみました。X軸方向(SPRESENSE横方向)の傾きに合わせてSPRESENSE Main Board上のLEDが左右に揺れます。6軸IMUなので、XYZ軸方向の加速度値と、XYZ軸を中心とした回転角速度を計測できます。
今回購入したデバイス
関連するコミット
ビルド方法
SDKコンフィグを開き「Examples」にある「bmi270_no_scu」を選択してください。SCU機能が有効の場合は正しく機能しないため、同居させるアプリケーションにご注意ください。
プログラムの構造
SPRESENSE SDKでは、NuttXというRTOS(リアルタイムOS)が、ハードウェアを制御してくれます。SPRESENSE Main Board上のI2Cポートは「/dev/i2c0」というファイルで表現されます。このファイルをopenしてioctlコマンドを使ってI2C通信を行い、BMI270を制御します。
初期化方法&計測開始方法
BMI270の初期化方法&計測開始方法はデータシートに記載されています。 まず、CHIPIDレジスタにアクセスし、対象のデバイスがBMI270であるかを確認します。BMI270であることが確認できた後、初期状態が不明であるため、CMDレジスタに0xB6を書き込んで、SoftResetします。このSoftResetに対してはNAKが返るため、エラーチェックは不要です。
SoftReset後、PWR_CONFレジスタに0x00を書き込みます。次に、INIT_CTRLレジスタに0x00を書き込みconfig file書き込みモードにします。config fileとはBMI270を提供するBosch社が定めた8KBのテーブルです。このテーブルデータをINIT_DATAレジスタにBurst Writeしてください。テーブルデータを書き込んだ後に、INIT_CTRLレジスタに0x01を書き込むと、テーブルデータを使ってデバイスの初期化が行われます。初期化に成功するとINTERNAL_STATUSレジスタが0x01を返します。
続いて、PWR_CTRLレジスタ、ACC_CONFレジスタ、GYR_CONFレジスタ、PWR_CONFレジスタに適切な値を代入し(データシート記載)、計測を開始します。最後に、FIFO_CONFIG_1レジスタとFIFO_CONFIG_0レジスタを使って、計測値がFIFOに蓄えられるようにすれば、計測開始です。
計測データの収集
BMI270のFIFOには「加速度値」と「回転角速度値」の他に「制御データ」が保存されます。また、「加速度値」と「回転角速度値」を生成するデータレート(ODR:Output-Data-Rate)を不一致にすることができるため、ある時は加速度値のみがEnqueueされ、またある時は回転角速度値がEnqueueされ、その両方が同時にEnqueueされることもある、という仕様になっています。そのため、FIFOからデータを読み出す場合は、制御データや計測データのフラグを確認しながらデータを分解する必要があります。
本プログラムでは、FIFOから取得したデータを分析した後、「加速度値」「回転角速度値」それぞれを格納する独立したテーブルに代入しています。最新の値が欲しい場合は、テーブル終端の値が対象の値となります。
動作の様子
水平を示すSPRESENSE Main Board上のLED(中央が点灯)。シリアルターミナルには加速度値と回転角速度値が表示されます。512回計測の後にプログラムが停止します。
是非、お試しください!