VL53L1Xとは...?
VL53L1Xがなんぞやという方は、先にVL53L1Xの使い方解説をご覧ください。
これ以降は、使い方解説で解説した内容を前提に書いていきます。
装置の概要
警報装置ってどんな装置を作るのかを説明します。
今回使用するVL53L1Xは最大4mまでしか距測ができないので、せいぜい廊下に設置する物しか作れません。
つまり、装置を設置した廊下を誰かが通過したら、音が鳴る装置を作っていきたいと思います。
自分の部屋の前とかに設置してみても面白いかもしれません。
使用物品・動作環境
使用物品
名称 | 個数 | サイトURL |
Pololu VL53L1X TOF 距測センサ | 1 | スイッチサイエンス |
ジャンパー線(メス-オス) | 若干 | Amazon |
ジャンパー線(オス-オス) | 若干 | Amazon |
Arduino Uno 等 | 1 | Amazon |
ブレットボード | 1 | Amazon |
圧電スピーカ | 1 | スイッチサイエンス |
モバイルバッテリ-(あれば) | 1 | - |
動作環境
これ以下で行われている各種プログラミング及びその実行は、Windows10下におけるArduinoIDE(1.8.2)で実行されています。また、ArduinoUnoを用いています。
作り方
回路接続
前回、VL53L1XをArduinoに接続し、距離を測定したところまで終わったので、次は、Arduinoに圧電センサを接続します。
回路図と接続対応表は以下の通りです。
圧電スピーカ側 | Arduino側 |
赤 | 12番ピン |
黒 | GND |
プログラム
次にプログラムを入力します。以下のプログラムをArduinoIDEの画面に入力して下さい。
前回入力したプログラムをベースにtone関数を組み込んでいます。
int x = 1000;
//xの値以下になると警報が作動します。単位は"mm"。
//xの値は設置する場所に合わせて設定してください。
//xの初期値は1000になっています。
//変数varと変数tの値は初期値を推奨。
int var = 0;
int t = 2000;
#include <Wire.h>
#include <VL53L1X.h>
VL53L1X sensor;
#define PIN 12
void setup(){
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000); // use 400 kHz I2C
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Failed to detect and initialize sensor!");
while (1);
}
sensor.setDistanceMode(VL53L1X::Long);
sensor.setMeasurementTimingBudget(50000);
sensor.startContinuous(50);
}
void loop(){
t = sensor.read();
if(t>x){
Serial.print("人はいません");
}else{
Serial.print("人がいます警報装置発動");
while(var<2){
tone(PIN, 392, 300);
delay(300);
tone(PIN, 247, 300);
delay(300);
var++;
}
var = 0;
}
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
}
(※)tone関数の値は、こちらのサイトから引用しています。一部改編。
プログラムの利用法
プログラムについて少し解説します。
このプログラムは、VL53L1Xセンサの測定値が、規定値以下になった場合に音が鳴るようになっています。
つまり、VL53L1Xセンサを廊下にこんな感じに設置したときに、
廊下のセンサー部(レーザー部)に人がいなければ、VL53L1Xセンサは、廊下の距離を測定値とします。
しかし、人がいるときには、測定値がセンサと人との距離になります。
つまり、センサーの前に人がいるときには測定結果が、短くなるということです。
その性質を利用した装置が今回の警報装置です。
センサーの前に人がいれば音が鳴り、いなければ鳴らない警報装置です。
プログラムの値設定
プログラムの変数x(1行目)は、設置する廊下に合わせて値を変更してください。
おおよその目安として、設定する値は、廊下の幅から100mmを引いた数字をxの値とするとよいです。例に挙げると、幅が1m(=1000mm)の廊下があるとしたら、xの値は900にするといいです。
それ以外の変数は特にいじる必要はありません。
プログラムの書き込み
前回同様、プログラムの書き込みを行ってください。
書き込みが終了した後は、ArduinoとPCのUSB接続を離してモバイルバッテリーなどの電源供給のできる物に接続しても大丈夫です。
完成
完成するとこんな感じになります。(圧電センサが同化してて見にくくて申し訳ないです。)
上から見るとこんな感じです。
センサーは、人の腰の高さあたりに設置すると、しっかり動作します。
装置を箱とかを使って隠すとより警報装置感が出ると思います。
ぜひ、アレンジしてみてください。
センサーのこの部分(赤枠)は廊下から遮らないようにしてください。
まとめ
警報装置を作ってみました!いかがだったでしょうか。
Arduinoの解説系の記事は初めて書くので、読みにくいところとかが多々あったと思います。よくわからないところはコメントで聞いていただければ、お答えします。
皆さんもぜひ作ってみてください!
(※)文中の社名、商品名などは各社の商標または登録商標である場合があります
コメント
はじめまして、arduino+VL53L1X をオープンスペースで使いたいのですが、4000mm以内に何もない時には1000mmあたりの不安定な小さい距離で表示されてしまい、閾値の設定の仕方がわからず、もしやり方が分かりましたアドバイスをいただきたいです。
コメントありがとうございます。
もっち様もおそらくいろいろと調べられていると思うので、ご存じのことを言っているかもしれませんがご容赦ください。
VL53L1Xのデータシート上(※1)では、各環境において、最大360cm(̟±20cm)の計測を保証しています。
この値以上にセンサー値を設置した場合、仮に10mmという測定結果が出たところで文句は言えません。
しかし、その測定結果の傾きを求めたらもしかしたら少しは変わるかもしれません。
測定対象物が3000mm→4000mm→5000mmと変化したら、測定結果は3000mm→4000mm→(1000mm)と変化するわけで、測定結果の傾きを求めたら明らかに最後の4000→1000の傾きはおかしい値になることが分かるので、取り除けることができると思います。
つまり、時間に対して、(もっち様の測定対象物が人と仮定すると)人の動きに適した速度をしている値のみを有効な値として扱うことができれば、少しは変わるかもしれません。
もちろん、これはセンサーの前に極端に多い人数の人がいたり、人も車も電車も通るようなところに設置した場合には使えない理論ですし、この理論をarduino上でやろうとすると、結構大変だと思います。
なんの役にも立っていないかもしれませんが、以上をコメントへの返信とさせていただきます。
//無理にArduino+VL53L1Xでやるのではなく、カメラモジュール+RaspberryPiで画像を認識させた方が、正確にできるとは思います。
(※1)https://www.pololu.com/file/0J1506/VL53L1X.pdf
すごく為になりました。グラフ化して値の傾きで要らない値を省く方法で粘ってみようかと思います。検出したい物はまさに人ですので、ラズパイも試してみようと思います。
近くに詳しい人が居ないので、質問に答えて頂けてうれしいです!ありがとうございました!