M5Stack Grayを振ってディスプレイ上の画像を切り替える

はじめに

M5Stack Grayには加速度、ジャイロ、磁気を計測可能な9軸センサ、MPU9250が搭載されています。

本記事ではジャイロセンサを用いて、M5Stack Gray本体を振ることでディスプレイ上の画像を切り替える方法をご紹介します。

完成品

開発環境

準備物

  • M5Stack Gray

M5Stack Gray(9軸IMU搭載)

M5Stack Gray(9軸IMU搭載)

※ M5Stack Basicではジャイロセンサを搭載していないため実現できません。

また、M5Stack FIREについてはMPU6050(三軸加速度センサ・三軸ジャイロセンサ)が搭載されているため、同様のことができるとは思います。

しかしながら、私がM5Stack FIREを所持しておらず動作確認が出来ないため、本記事の対象外とさせていただきます。

前提

Arduino IDEによるM5Stackの開発環境の構築が出来ており、M5Stackのスケッチ例にあるJpegDrawとMPU9250BasicAHRSの動作確認が済んでいる方を対象としています。

以下にスケッチ例がありますので確認してください。

  • JpegDraw

ファイル→スケッチ例→M5Stack→Advanced→Display→JpegDraw

  • MPU9250BasicAHRS

ファイル→スケッチ例→M5Stack→Modules→MPU9250→MPU9250BasicAHRS

1. 画像ファイルの準備

microSDカードにpicturesフォルダを作成し、その中に画像ファイルを何枚か入れます。また、画像ファイルのファイル名を連番となるようにします。

(本記事では画像枚数を3枚、ファイル名をp0.jpg、p1.jpg、p2.jpgとしています。)

2. スケッチ例

Arduino IDEから下記のスケッチを書き込みます。

ポイントとしては本体を振った際のジャイロセンサの値を閾値によって判定し、移動方向(左右)に対応したフラグを立てています。

今回は完成品でご紹介した左に振る→右に振る→画像が切り替わるのスケッチとなっていますが、右に振る→左に振る→何らかの処理も可能です。

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

MPU9250 IMU;

bool leftFlag = false; //左に動いたことを保持するフラグ
bool rightFlag = false; //右に動いたことを保持するフラグ

int maxPicSize = 3; //SDカード内に入れた画像の枚数
int th = 80;
int count = 1;

void setup()
{
  M5.begin();
  Wire.begin();
  M5.Lcd.setBrightness(100);
  M5.Lcd.drawJpgFile(SD, "/pictures/p0.jpg");
  byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
  IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias);
}

void loop()
{
  if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01){  
    IMU.readGyroData(IMU.gyroCount);  // Read the x/y/z adc values
    IMU.getGres();
    IMU.gz = (float)IMU.gyroCount[2]*IMU.gRes;
  } 
  IMU.delt_t = millis() - IMU.count;
  if (IMU.delt_t > 100){
    int accel = (int)(IMU.gz);
    if(accel < -th){
      if(leftFlag){
        //左に振る→右に振るの後の処理
         M5.Lcd.fillScreen(BLACK);
         int num = count++ % maxPicSize;
         String s = "/pictures/p"+String(num)+".jpg";
         M5.Lcd.drawJpgFile(SD, s.c_str());
      }else{
        rightFlag = true;
      }
    }else if(accel > th){
      if(rightFlag){
        //右に振る→左に振るの後の処理
        
      }else{
        leftFlag = true;
      }
    }else{
      leftFlag = false;
      rightFlag = false;
    }
    IMU.count = millis();
  } 
}

3. M5Stack Grayを振る

振りましょう。

おわりに

M5Stack Grayを振ってディスプレイ上の画像を切り替える方法をご紹介しました。

今回は画像の切り替えでしたが、画像の表示部分を別の処理に書き換えることで、振る→何らかの処理をするということも実現できると思います。