M5Stack Grayを振ってディスプレイ上の画像を切り替える
はじめに
M5Stack Grayには加速度、ジャイロ、磁気を計測可能な9軸センサ、MPU9250が搭載されています。
本記事ではジャイロセンサを用いて、M5Stack Gray本体を振ることでディスプレイ上の画像を切り替える方法をご紹介します。
完成品
M5Stackを振るとディスプレイに表示されている画像が切り替わるようにしました。 pic.twitter.com/HFKQrfQ64g
— クラクス (@kuracux) 2018年9月25日
準備物
- M5Stack Gray
- 出版社/メーカー: スイッチサイエンス
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
※ M5Stack Basicではジャイロセンサを搭載していないため実現できません。
また、M5Stack FIREについてはMPU6050(三軸加速度センサ・三軸ジャイロセンサ)が搭載されているため、同様のことができるとは思います。
しかしながら、私がM5Stack FIREを所持しておらず動作確認が出来ないため、本記事の対象外とさせていただきます。
- microSDカード
- 出版社/メーカー: トランセンド・ジャパン
- 発売日: 2015/10/02
- メディア: Personal Computers
- この商品を含むブログ (1件) を見る
前提
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. スケッチ例
ポイントとしては本体を振った際のジャイロセンサの値を閾値によって判定し、移動方向(左右)に対応したフラグを立てています。
今回は完成品でご紹介した左に振る→右に振る→画像が切り替わるのスケッチとなっていますが、右に振る→左に振る→何らかの処理も可能です。
#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を振ってディスプレイ上の画像を切り替える方法をご紹介しました。
今回は画像の切り替えでしたが、画像の表示部分を別の処理に書き換えることで、振る→何らかの処理をするということも実現できると思います。