mbed.2) mbed【NUCLEO-F303K8】 BMX055を使って加速度、角速度、地磁気を測定する。


【NUCLEO-F303K8】 BMX055を使って加速度、角速度、地磁気を測定します。
今後、GPSと組み合わせた自己位置推定を行いたいと考えています。

さて、本題へ。

必要なもの

  • NUCLEO-F303K8
  • 9軸センサーBMX055
    • 9軸とは加速度x3次元、角速度×3次元、地磁気x3次元のことです。
    • 今回はkitを使用秋月電子のページへ
    • レジストリへの書き込み・読み込みなど、様々な設定が出来るみたいです。(すべて読めてません)
  • ブレッドボード
  • ジャンパーWire
  • micro USB(F303K8への書き込み、電源用)

作業概要

  1. 9軸センサーのハードウェア作業
  2. 回路を組む
  3. プログラム作成作業

作業詳細

  • 作業1(9軸センサーのハードウェア作業) 9軸センサーは、裏面にあるジャンパーピン(JP)によって各センサー(加速度、ジャイロ、地磁気)のアドレスが設定されます。  秋月電子で買った場合は、説明書にあるように、以下の3つのJPをショートさせました。見ずらいですが、図の赤丸の箇所です。
    1. プルアップ抵抗を自分で設定しない場合は,JP4,5をショートさせる
    2. 電源洗濯のため、JP7をショートさせる

  - 作業1の参考図
   BMX055.jpg

  • 作業2(回路を組む)
     今回はF303K8を使用し、I2C通信を行うために、それぞれを結線します。

    1. PB_7:I2C-SDA, PB_6:I2C_SCLをセンサーと結線する。
    2. 5Vと3V3の電源に、センサーのVCCと3V3をそれぞれ結線する。
  • 作業3(プログラム作成)
     リンク先のライブラリが参考になりました。BMX055

    1. 新規のプログラムを作成します。
    2. リンク先のライブラリのBMX055.hのみをコピーし使用しました。
    3. ただし、内部のPIN設定は異なるので、PB_7とPB_6に修正する必要があります。   4. ヘッダーファイルに合わせて、main関数も作成しました。   5. "mbed.h"は、プロジェクトフォルダ内にあるmbedという設定フォルダが無いとエラーになるので、他のtemplateからコピーして取ってきました。
cpp BMX055.h
// Set up I2C, (SDA,SCL)
I2C i2c2(PB_11, PB_10);
cpp main.cpp
#include "mbed.h"
#include "BMX055.h"

BMX055 bmx;

int main() {
    bmx.init();
    while(1) {      
      float ax, ay, az, gx, gy, gz, mx, my, mz;
      bmx.getMotion9(&ax,&ay,&az,
                     &gx,&gy,&gz,
                     &mx,&my,&mz);
      printf("acc(%05.3f, %05.3f, %05.3f), gyro(%05.3f,%05.3f,%05.3f), mag(%05.3f,%05.3f,%05.3f)\r\n", ax, ay, az, gx, gy, gz, mx, my, mz);
      wait(1.0);
    }

} 

今後は、Madgwickフィルタとクオータニオンを学びながら実装していく予定です。(BMX055.hの中にもコードがあります。)

  • 今後の方針
    • 9軸センサーを使用した"sensor fusion"(自己姿勢、自己位置推定)を行う。
    • GPSセンサーを用いて、sensor fusionの精度を上げる。
    • SDカードへの保存を行う。
    • wifiを搭載しソケット通信を行い、クラウドとの連携を行う。