M5Stackでできること 〜M5Stackで超音波測距ユニット(I2C)を使う

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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。