M5Stackで、モノが動いているかどうかを検知したい機会がありました。
動きを検知する方法はいろいろありますが、今回は「M5Stack用超音波測距ユニット(RCWL-9620)」というセンサを試してみることにしました。
センサからの距離を常時測定し、測定距離に変化が生じたときに「動きがあった」と判断することにします。
「M5Stack用超音波測距ユニット(RCWL-9620)」には、インターフェースが「I2C」と「I/O」の2種類の製品がありますが、今回は「I2C」タイプを使用します(使用するデバイスが「M5Stack Basic V2.6」で、M5Stack BasicのGROVEポートがI2Cのため)。
M5Stack BasicのGROVEポートに「M5Stack用超音波測距ユニット(RCWL-9620)」をつないでおきます。
最初に、Arduino IDEに「M5Unit-Sonic by M5Stack」というライブラリをインストールします。
スケッチは以下のとおりです。
距離を測定し、シリアル通信で書き出すだけのものです。
#include <M5Stack.h>
#include <Unit_Sonic.h>
SONIC_I2C sensor;
void setup() {
M5.begin();
sensor.begin();
}
void loop() {
float dist = sensor.getDistance();
Serial.println(dist);
}
Arduino IDEでシリアルプロッタを開くと、以下のようにモノとの距離がグラフ表示されます。
モノの動きを検知するためのスケッチは以下のとおりです。
#include <M5Stack.h>
#include <Unit_Sonic.h>
SONIC_I2C sensor;
void setup() {
M5.begin();
sensor.begin();
}
int currentDist; // 現在の検出距離
int prevDist = 0; // 直近の検出距離
unsigned long currentMove = 0; // 現在の動作回数
unsigned long prevMove = 0; // 直近の動作回数
unsigned long diffMove = 0; // 直近からの動作回数の増加分
unsigned long currentTime; // 現在時刻
unsigned long prevTime = 0; // 直近の時刻
boolean currentFlag = false; // 動作しているかどうかのフラグ
void loop() {
currentTime = millis();
currentDist = sensor.getDistance()/10; // 検出距離(単位:cm単位, 1cm単位で切り捨て)
if(abs(currentDist - prevDist) >= 10) { // 検出距離の変化が10cm以上のとき
currentMove++; // 動作回数を+1する
prevDist = currentDist;
}
if(currentTime - prevTime >= 5000) {
diffMove = currentMove - prevMove; // 直近からの動作回数の増加分
if(diffMove >= 5) currentFlag = true; // 5秒間での動作回数の変化が5回以上なら、currentFlagをtrueにする
if(diffMove == 0) currentFlag = false; // 5秒間での動作回数の変化が0回なら、currentFlagをfalseにする
if(currentFlag) M5.Lcd.fillScreen(GREEN);
else M5.Lcd.fillScreen(RED);
prevMove = currentMove;
prevTime = currentTime;
}
}
センサからの距離を常時測定し、直近の測定結果からの変化が10cm以上のとき、動きがあったと判断し、動作回数をプラス1します。
誤検知や、対象物以外の動きにより検出距離が変化する場合もありますので、
- 5秒間に動きが5回以上あったら、モノが「動作中」と判断します。
- 5秒間に動きが全くなければ、モノが「停止中」と判断します。
- それ以外のときは、直近の判断結果を維持します。
これで、センサの前でモノが動いているかどうかを検知できました。
なお、今回つかった「M5Stack用超音波測距ユニット」は、インターフェースが「I2C」なので、GROVEケーブルを長くすると正常に動かなくなる可能性があります。しかし今回は、測定場所の都合で「M5Stack Basic」と「M5Stack用超音波測距ユニット」をすぐ近くに設置することができません。
このため、長いGROVEケーブルを使っても正常動作するかどうか試してみました。
その結果、今回つかったデバイスについては、GROVEケーブルを2メートルのものに変更しても問題なく動作しました。
また、「M5Stack用超音波測距ユニット」で距離を測定できる角度についても大雑把に調べてみました。
「M5Stack用超音波測距ユニット」から20cm程度の距離で調べたところ、直径10〜15cmの中にモノがあると距離を測定できました。
角度になおすと大体27〜37度となります。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。