感染症対策のためのIoT技術について書いています。今回は障害物回避センサーを利用した非接触操作です。つまり、手を触れないで何かのスイッチのオン、オフを切り替える仕組みについてです。内容的にはIoT技術というほどのことでもなく、電子工作的な内容ですが、非接触で操作が出来るというところがポイントです。
今回利用するセンサー
今回利用するセンサーは以下の赤外線障害物検出モジュール(OSOYOO製)です。

以下で購入しました。今現在で10個入り999円と安いです。(10個も必要ないということであれば同様のセンサーがもう少し安くて少ない個数でも販売されているようです。)
マニュアル的なページが以下にありました。
Arduinoレッスン:障害物センサーを制御する方法
障害物検知の原理をはじめ詳細が必要な場合は上記のページを見て頂ければと思いますが、主な仕様は以下です。
・距離2〜30cm、検出角度35°の範囲で障害物を検出
(検出距離は半固定抵抗(センサーの写真の青い部品)で調節)
・3-5VのDC電源が使用可
・電源がONで赤色LEDが点灯して障害物検知で緑色のLEDが点灯する
・モジュールのサイズは、3.1cm * 1.5cm
今回の最終的な動作と手順概要
以下のような構成で100Vのライトを手を触れずにオン、オフを切り替えます。

これを以下の順番で書きます。
センサー単独での動作確認
Arduinoでのセンサー動作確認
M5StickCでのセンサー動作確認
M5StickCでのリレー動作確認
非接触操作とリレーの連携
ライトを接続しての非接触操作確認
センサー単独での動作確認
3Vから動作するということなので以下のようにブレッドボードを使って単3電池2本をVCCとGNDに接続してみます。赤のLEDが点灯しました。

この状態で上から手を近づけます。(少し陰になっています。)これで以下のように緑色のLEDが点灯しました。

これで障害物検知が確認出来たのでoutのピンの出力が変化するはずです。
Arduinoでのセンサー動作確認
始めの方でも書きましたが、以下にマニュアル的なページがあり、Arduinoとの接続とスケッチがあります。これをそのままですが実際に動作確認します。
Arduinoレッスン:障害物センサーを制御する方法
以下のように接続しました。
Arduino <--> センサー
ピン2(青) <--> out
GND(黒) <--> GND
5V(赤) <--> VCC

プログラム(Arduino的にはスケッチ)は以下です。このプログラムで障害物を検知すると(手を近づけたりすると)センサー単独での動作確認で確認したようにセンサーの緑色のLEDが点灯して、今度はさらにArduinoのボードのLEDが点灯します。
処理としては基本的なデジタル入出力ですが、outピンは障害物がない場合がHIGHで障害物を検知するとLOWになるという点を間違えないようにします。
int LED = 13; //ボード内臓のLEDを使用
int isObstaclePin = 2; // 入力ピンです
int isObstacle = HIGH; // 障害物が無い場合
void setup() {
pinMode(LED, OUTPUT);
pinMode(isObstaclePin, INPUT);
Serial.begin(9600);
}
void loop() {
isObstacle = digitalRead(isObstaclePin);
if (isObstacle == LOW)
{
Serial.println("OBSTACLE!!, OBSTACLE!!");
digitalWrite(LED, HIGH);
}
else
{
Serial.println("clear");
digitalWrite(LED, LOW);
}
delay(200);
}
動作させるとArduinoボード内蔵のLEDが確かに反応しました。また、シリアルモニタは例えば以下のように出力されました。OBSTACLE!!, OBSTACLE!!と表示されているのが障害物を検知している状態です。

ここまで確認出来たら、後はここでは内蔵のLEDに連動させたようにoutの状態を何にどのように連携させるかです。今回はリレーを連携させようとしているのですが、その前にM5StickCに移行してM5StickCで進めます。
M5StickCでのセンサー動作確認
まずM5StickCのピン番号は本体の裏を見れば分かります。障害物センサーのoutピンをM5StickCの26番に接続しました。あと電源(GNDと5V)を接続します。

接続して起動した状態が以下です。障害物の検知で画面の SW ON と SW OFFを切り替えます。手での動作で考えると手を近づけると SW ON になり、一度離して再度近づけると SW OFF になります。これで最終的にはライトのスイッチを制御したいと考えました。
但しこの段階では画面の表示を切り替えているだけでまだ何の操作(制御)もしていません。

プログラムが以下です。
#include <M5StickC.h>
//現在の障害物(接触)の状態
int currentStatus = HIGH;
//障害物があるかないかの検知用
int isObstacle = HIGH;
//スイッチの状態
int switchFlag = LOW;
void setup() {
M5.begin();
//画面の初期設定
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
//文字領域の設定
M5.Lcd.fillRect(3,10,150,150,BLACK);
M5.Lcd.setCursor(3,10);
//タイトル
M5.Lcd.println(("Obst Example"));
//G26を入力で使用(センサーのoutを読み込む)
pinMode(26, INPUT);
}
void loop(void) {
//G26からセンサーのoutを読み込む
isObstacle = digitalRead(26);
//表示領域再設定
M5.Lcd.fillRect(3,35,150,150,BLACK);
M5.Lcd.setCursor(3,35);
//センサーでの障害物検知の状態が変化した場合
if (isObstacle != currentStatus)
{
//障害物を検知した場合
if (isObstacle == LOW)
{
//スイッチの状態を切り替える
//(排他的論理和で反転していますがif文の判定でも出来ます。)
switchFlag ^= HIGH;
}
//障害物検知の状態を保存
currentStatus = isObstacle;
}
//スイッチの状態表示(表示だけでまだ特に制御はなし)
if (switchFlag == HIGH)
{
M5.Lcd.print("SW ON");
}
else
{
M5.Lcd.print("SW OFF");
}
delay(200);
}
M5StickCでのリレー単体動作確認
ここまででM5StickCで障害物センサーとスイッチオン、オフの状態の切り替えが出来たのであとは実際にリレーを接続すればいいですが、まずリレー単体で動作確認しました。
使ったリレーは以下のM5Stack関連の製品です。最大3A(24VDCあるいは120VAC)までの仕様です。
M5Stack用ミニリレーユニット
M5StickCと接続します。GroveコネクタなのでそのままM5StickCと接続します。

動作確認のプログラムは以下です。Groveコネクタからの出力ピンが32番でこれを出力に設定してリレーを制御します。0.5秒ごとにカチッと音がします。
#include <M5StickC.h>
void setup() {
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
M5.Lcd.fillRect(3,10,150,100,BLACK);
M5.Lcd.setCursor(3,10);
M5.Lcd.println(("Relay Example"));
pinMode(32, OUTPUT);
}
void loop(void) {
digitalWrite(32, HIGH);
delay(500);
digitalWrite(32, LOW);
delay(500);
}
これでリレー単体の動作確認が出来たので前項までの障害物センサーのオン、オフとこのリレーと連携させます。
非接触操作とリレーの連携
以下のようにセンサーとM5StickCとリレーを接続します。

プログラムは以下です。
#include <M5StickC.h>
//障害物の状態
int currentStatus = HIGH;
//障害物があるかないか
int isObstacle = HIGH;
//スイッチの状態
int switchFlag = LOW;
void setup() {
M5.begin();
//画面の初期設定
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
//文字領域の設定
M5.Lcd.fillRect(3,10,150,150,BLACK);
M5.Lcd.setCursor(3,10);
//タイトル
M5.Lcd.println(("Obst Example"));
//G26を入力で使用(センサーのoutを読み込む)
pinMode(26, INPUT);
//G36を出力でリレーを制御する
pinMode(32, OUTPUT);
}
void loop(void) {
//G26からセンサーのoutを読み込む
isObstacle = digitalRead(26);
//表示領域再設定
M5.Lcd.fillRect(3,35,150,150,BLACK);
M5.Lcd.setCursor(3,35);
//センサーでの障害物検知の状態が変化した場合
if (isObstacle != currentStatus)
{
//障害物を検知した場合
if (isObstacle == LOW)
{
//スイッチの状態を切り替える
//(排他的論理和で反転していますがif文の判定でも出来ます。)
switchFlag ^= HIGH;
}
//障害物検知の状態を保存
currentStatus = isObstacle;
}
if (switchFlag == HIGH)
{
//スイッチの状態表示 ON
M5.Lcd.print("SW ON");
//リレー ON
digitalWrite(32,HIGH);
}
else
{
//スイッチの状態表示 OFF
M5.Lcd.print("SW OFF");
//リレー OFF
digitalWrite(32,LOW);
}
delay(300);
}
これで手を近づけると画面のONとOFFが切り替わってリレーが動作しているのが確認出来ました。
ライトを接続しての非接触操作確認
最終段階です。前項の接続の状態でAC100Vの延長線を切断してリレーに接続します。
以下、リレーとAC100Vの延長線です。ごちゃごちゃしていますが、線を2本に割いて切断してリレーに接続しています。安全を考えればさらに間にヒューズを入れればとは思いますが、LEDライトぐらいなら大丈夫ということにします。
リレーの端子部分が以下です。リレーがONでライトの点灯を考えているので、COMとNO(ノーマリーオープン)、つまり、リレーコイルに電源が入っていない時にCOM(コモン)との間が開いている端子に接続します。
動画での動作の様子です。動画の音量を上げるとリレーの動作音も聞こえます。
以上で障害物回避センサーを利用した非接触スイッチ操作でライトのオン、オフが出来ました。
今回はIoT技術という程でもなく電子工作的な内容でしたが、非接触での操作が出来ました。ここではライトのオン、オフでしたが最近見かける消毒液のスプレーをはじめいろいろな機器が操作出来ると思います。
今回は以上です。



