M5Stackでできること 〜マイクロ波ドップラ・センサ「RCWL-0516」を使う

スポンサーリンク
センサとの接続

しばらく前から、「畑」にソーラー発電システムとM5Cameraを設置しています(記事は こちら)。
M5Cameraで一定時間ごとに畑の風景写真を撮影し、その画像をモバイルWi-Fiルータ経由でWebサーバに送信しています。これにより、畑の現在の状況を「いつでもどこでも」確認することができます。
また、M5CameraとモバイルWi-Fiルータは、ソーラーパネルで発電した電気で動かしています。

今のところ、撮影しているのは単なる風景写真ですが、最終的にはこれを獣害対策に役立てたいと思っています。
動物の侵入を検知したら、その動物を撮影してWebサーバに送信、それと同時にメールで通知するようなシステムに仕上げたいと考えています。

動物を検知するためには、PIRセンサを使うのが一般的です。
ただ、PIRセンサは、直射日光や温風などにより誤動作してしまう可能性があります。
今回のシステムでも、何度かPIRセンサを取り付けて現地で実験してみましたが、動物がいなくても頻繁に写真を撮影してしまうような状況になってしまい、いろいろと調整してもなかなか改善できません。

また、PIRセンサは、アクリルケースなどに入れてしまうと検知できなくなってしまいます。
屋外に設置するためにはセンサにも防水対策が必須ですが、そのためのケースの加工などが困難です。

と、いろいろと悩んでいたところ、ひょんなところで「マイクロ波ドップラ・センサ」というものを知りました。
センサから送信した信号と移動物体から反射してきた信号の位相差を見ることで、物体の動きを検知するものです。動いている物体を検知できるため、PIRセンサの代替になるようです。
温風などでは誤動作しません。また、マイクロ波を用いるため開口部をつくる必要もなく、ケースの防水対策も簡単です。

PIRセンサとは全く異なる検知方式のため、今のところはなかなかうまくいっていない畑での動物検知もできるようになるかもしれません。

そんな訳で、早速「マイクロ波ドップラ・センサ」を試してみることにしました。
購入したのはこちらの商品「RCWL-0516」です。


検出範囲は7メートル以内、検出角度は120度未満で、移動物体を検知すると「OUT」端子が2秒間HIGHになります。
電源電圧は4〜28Vとのことで、PIRセンサと同じように使うことができそうです。

このセンサをM5Stackにつないで、動作確認してみました。
接続内容は以下のとおりです。

RCWL-0516M5Stack
VIN5V
OUT35
GNDG

以下のような簡単なスケッチをつくって、M5Stackに書き込みます。

#include <M5Stack.h>

void setup() {
  M5.begin();
  pinMode(35,INPUT);
}

void loop() {
  if(digitalRead(35)) {
    M5.Lcd.fillScreen(RED);
  } else {
    M5.Lcd.fillScreen(BLACK);
  }
}

移動物体を検知すると、LCD画面を赤く光らせるだけのものです。

早速これで確認してみたところ、センサの前で手を振ったりすると確かに検知はするのですが、なんだか挙動が不安定です。

室内では反射の影響できちんと動作確認できないとの情報があったため、実際に設置を予定している畑に持っていって再確認しました。
その結果、センサのすぐ手前(数センチ)で手を振るときちんと検知できますが、少し離れる(数十センチ程度)と、体を大きく動かしても全く反応しませんでした。
センサの個体ごとの感度の差かと考えましたが、今回購入した5個とも同じような状況でした。
電源電圧を5Vで動作させていたため、電源電圧が低いのが原因かとも思いましたが、電源電圧を12Vに変更しても状況は変わりませんでした。

このセンサは、Amazonではいろいろな店舗で販売されています。
今回購入した店舗で扱っていたロット固有の問題かもしれませんが、いずれにしろこれでは使い物になりません。

諦めきれないので、ネットで色々と情報収集していたところ、検知したアナログ信号を直接取り出している記事(こちら)を見つけました。
この方法で、アナログ信号を観測してみようと思います。

記事と同じように、ICの「2OUT」ピンの信号を直接取り出します。

この信号をM5Stackの「35」ピンにつなぎます。

スケッチは以下のとおりです。

#include <M5Stack.h>

void setup() {
  M5.begin();
  dacWrite(25, 0);
  pinMode(35,INPUT);
}

boolean flag = false;
File file;

void loop() {
  M5.update();
  int now = millis();
  int val = analogRead(35);

  if(flag) file.println((String)now + "," + (String)val);

  if(M5.BtnA.wasPressed()) {
    flag = !flag;
    if(flag) {
      file = SD.open("/test_rcwl0516.csv", FILE_WRITE);
      M5.Lcd.fillScreen(RED);
    } else {
      file.close();
      M5.Lcd.fillScreen(BLACK);
    }
  }
  delay(10);
}

10msec毎に、観測したアナログ値をCSV形式でSDカードに書き込むものです。

採取したデータをExcelでグラフ表示した結果は以下のとおりです。
センサから数メートル離れた場所で手を振ったときのノイズです。

アナログ波形を見ると、離れた場所での動きもきちんと検知できていることが分かります。
これをうまく使えば、なんとか数メートル離れた場所にいる小動物の検知もできるようになるかもしれません。

 

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


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