M5Stack 加速度センサーを使ってみる。

日曜電子工作の続き。今回は M5Stack Gray に内蔵されている加速度センサーを使ってみる。

入門書「みんなのM5Stack入門」に簡単なサンプルが掲載されているので写経してみるが、ちょっと問題がある。書籍では9軸のセンサーにMPU9250というチップが使用されていることが前提になっているが、最近の出荷分はMPU6886という別のチップが搭載されており、そのままでは動作しない。そこで、サンプルのMPU9250を使用しているコードをMPU6886用のコードに書き換える必要がある。

作業は基本逐次的な置き換えで済むので難しくはない。というか、MPU6886の方がキャリブレーションが必要なかったりX,Y,Z 3軸の値を一度の関数呼び出しで取得できたりとむしろ簡易になっている。

書籍の水準器のサンプル level0.ino をMPU6886用に修正したものが次のソース。

#include <M5Stack.h>
#include "utility/MPU6886.h"

MPU6886 IMU;  // Create MPU6886 Object

void drawGrid() {
  M5.Lcd.drawLine(41, 120, 279, 120, CYAN);
  M5.Lcd.drawLine(160, 1, 160, 239, CYAN);
  M5.Lcd.drawCircle(160, 120, 119, CYAN);
  M5.Lcd.drawCircle(160, 120, 60, CYAN);
}

void drawSpot(int ax, int ay) {
  int x, y;
  x = map(constrain(ax, -300, 300), -300, 300, 40, 280);
  y = map(constrain(ay, -300, 300), -300, 300, 240, 0);
  M5.Lcd.fillScreen(BLACK);
  drawGrid();
  M5.Lcd.fillCircle(x, y, 7, WHITE);
}

void setup() {
  M5.begin();     // INIT M5Stack
  Wire.begin();   // INIT I2C
  IMU.Init();     // Init MPU6886
  
}

void loop() {
  float ax, ay, az;
  IMU.getAccelData(&ax, &ay, &az);
  drawSpot((int)(ax * 1000), (int)(ay * 1000));
  delay(100);
}

修正箇所は、

  1. 9軸センサーのライブラリ用ヘッダファイルを MPU6886.h に変更。
  2. それにともない、ライブラリのクラスもMPU6886に変更。
  3. 初期化は Init() メソッドを呼ぶだけに。キャリブレーションは不要。
  4. 加速度の取得は getAccelData() メソッドを呼ぶだけに。スケールを取得しての補正は不要。

という感じ。