micro:bitに実装されている磁気センサ(MAG3110)・加速度センサ (MMA8653)からセンサデータを取得します。

磁気センサ・加速度センサのライブラリのインストール

micro:bitでBLEアプリの開発環境の構築」で、Arduino IDE による開発環境を構築しました。このArduino IDEに磁気センサと加速度センサのライブラリを次の手順でインストールします。

  1. 磁気センサ(MAG3110)ライブラリは、「SparkFun MAG3110 Breakout Board Arduino Library」を使用します。GitHub からZIP形式のArduinoライブラリをダウンロードします。
  2. Arduino IDE を開いて、メニューバーの「スケッチ」→「ライブラリをインクルード」→「ZIP形式のライブラリをインストール」をクリックします。
    ダイアログが表示されるので、ダウンロードしたZIP形式の磁気センサ(MAG3110)ライブラリを選択します。
  3. メニューバーの「ファイル」→「スケッチ例」から次のように磁気センサ(MAG3110)ライブラリを使用したスケッチ例が登録されていることを確認します。

  4. 加速度センサ (MMA8653)ライブラリは、「MMA8653.zip (adafruit.com)」を使用します。ZIP形式のArduinoライブラリをダウンロードします。
  5. Arduino IDE を開いて、メニューバーの「スケッチ」→「ライブラリをインクルード」→「ZIP形式のライブラリをインストール」をクリックします。
    ダイアログが表示されるので、ダウンロードしたZIP形式の加速度センサ (MMA8653)ライブラリを選択します。
  6. メニューバーの「ファイル」→「スケッチ例」から次のように加速度センサ (MMA8653)ライブラリを使用したスケッチ例が登録されていることを確認します。

磁気センサの校正

次の図は地磁気センサを1周回した値をシリアルモニタからコピーして、XY軸の分布図にします。ほぼ円形になります。この図より中点(-70、-408)を求めます。

磁気/加速度センサのプログラム作成

磁気/加速度センサのプログラム作成を次に示します。

  • 30-32行目で磁気センサーからのデータがunsigned int型になっているので(??)、int型に変換します。
  • 33行目で、方位角$\Psi$ は、磁気センサからのデータと磁気センサの校正で先に取得した中点(-70、-408)を使って次の計算式で求めます。
  • \begin{eqnarray}
    \Psi = \tan^{-1} \left( \frac{y-Py}{x-Px} \right) * 57.29583 \\
    \end{eqnarray}
    $Px$:中点x(-70)
    $Py$:中点y(-408)
    $57.29583$:ラジアンを角度に変換する係数

  • 34-36行目で、計算した方位角$\Psi$ は、0°から±180°の値を取るので0°から360°に変換します。

bitsensor.ino

#include <SparkFun_MAG3110.h>
#include "MMA8653.h"

MAG3110 mag = MAG3110(); //Instantiate MAG3110
MMA8653 accel;

void setup() {

  Serial.begin(9600);

  Wire.begin();             //setup I2C bus
  Wire.setClock(400000);    // I2C fast mode, 400kHz

  mag.initialize(); //Initializes the mag sensor
  mag.start();      //Puts the sensor in active mode
  accel.begin(false, 2); // 8-bit mode, 2g range
}

void loop() {
  int x, y, z;
  double dir  = 0;
  int _px  = -70; //中点x
  int _py  = -408; //中点y

  //Only read data when it's ready
  if (mag.dataReady()) {

    //Read the data
    mag.readMag(&x, &y, &z);
    if (x >= 0x8000) x = -((0xffff - x) + 1);
    if (y >= 0x8000) y = -((0xffff - y) + 1);
    if (z >= 0x8000) z = -((0xffff - z) + 1);
    dir = (atan2((y - _py), (x - _px)) * 57.29583) ;
    if (dir < 0) {
      dir = 180 + (180 + dir);
    }

    Serial.print(x); Serial.print(",");
    Serial.print(y); Serial.print(",");
    Serial.print(z); Serial.print(",");
    Serial.println(dir);

    accel.update();
    Serial.print((float)accel.getX() * 0.0156); Serial.print(", ");
    Serial.print((float)accel.getY() * 0.0156); Serial.print(", ");
    Serial.println((float)accel.getZ() * 0.0156);
  }
  delay(300);
}

磁気/加速度センサのプログラム実行

micro:bitで作成した磁気/加速度センサのプログラムを実行すると、シリアルモニタにセンサーデータが次のように表示されます。