sako_DIYのアイコン画像

ESP32(M5atom)でカーテンIoT

sako_DIY 2021年02月28日に作成  (2021年02月28日に更新)

概要

IoT機器を販売しているメーカーでSwitchBot社があるが、その中の一つに、Switchbotカーテンというものがある。

ここに動画が表示されます

面白いアイデアだが1つ1万円近くする。カーテンを操作するだけで1万というのは少し手が出にくい。
よって、劣化版を安く自作してみて、購入検討することとする。

使用部品

要は、カーテンレールを移動するラジコンを作ればいいわけである、
マイコンは、家に転がっていたM5atom Matrix
M5atom Matrix
キャプションを入力できます
モータードライバーは、TA7291Pはもう手に入らないそうなので、TB67H450FNGを使用する。
TB67H450FNG搭載モータドライバ ピッチ変換基板
キャプションを入力できます
赤外線モジュールに、IRM-3638N3
リモコン赤外線受光素子[RoHS]
キャプションを入力できます
距離センサーとして、HC-SR04互換超音波距離センサ
HC-SR04互換超音波距離センサ
キャプションを入力できます
モーターは、タミヤ製トルクチューン2モーター
トルクチューン2モーター
キャプションを入力できます
ギヤボックスは、ユニバーサルギヤーボックス
ユニバーサルギヤーボックス
キャプションを入力できます
タイヤは、スリムタイヤセット(36・55mm径))
スリムタイヤセット(36・55mm径)
キャプションを入力できます

回路図

回路は以下のように作成する
キャプションを入力できます

筐体

筐体は3Dプリンターで作成した。
キャプションを入力できます

組立

以上を組み上げ本体は完成した。
フックは、一応サスペンション構造をしている。
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます

プログラム

プログラムの流れとしては、
赤外線の識別(赤外線モジュール)

現在位置の確認(超音波距離センサー)

移動(モーター)
の3ステップです。

赤外線の認識には、IRremoteESP8266ライブラリを使用させていただいた。
IRremoteESP8266(github)
このライブラリは、ESP8266用に開発されたようだがESP32でも問題なく使用できた。

以下ブログラムの全体です。

Curtain.ino

#include <M5Atom.h> #include <IRremoteESP8266.h> #include <IRrecv.h> #include <IRutils.h> #define Trigger_Pin 19 //超音波センサートリガーピン #define Echo_Pin 22  //超音波センサーエコーピン #define Moter_IN1 25 //モータードライバーIN1 #define Moter_IN2 21 //モータードライバーIN2 #define IR_Pin 33 //赤外線モジュール #define open_distance 120 //カーテン空き距離 #define close_distance 3 //カーテン閉じ距離 IRrecv irrecv(IR_Pin); decode_results results; const int right_Arrow[25]={0,0,1,0,0, 0,0,0,1,0, 1,1,1,1,1, 0,0,0,1,0, 0,0,1,0,0,};//みぎ矢印 const int left_Arrow[25]={0,0,1,0,0, 0,1,0,0,0, 1,1,1,1,1, 0,1,0,0,0, 0,0,1,0,0,};//ひだり矢印 void setup() { M5.begin(true, false, true); pinMode(Trigger_Pin, OUTPUT); pinMode(Echo_Pin, INPUT); pinMode(Moter_IN1, OUTPUT); pinMode(Moter_IN2, OUTPUT); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { int distance=sendTrigger(); if(results.value==0x40BF20DF&&distance<10){ //リモコン右信号&&カーテン閉まってる open_Curtain(); }else if(results.value==0x40BFE21D&&distance>3){ //リモコン左信号&&カーテン開いてる close_Curtain(); } irrecv.resume(); // Receive the next value } } int sendTrigger(){ //距離測定関数 digitalWrite(Trigger_Pin,HIGH); delayMicroseconds(10); digitalWrite(Trigger_Pin, LOW); while(!digitalRead(Echo_Pin)){ } unsigned long t1 = micros(); while(digitalRead(Echo_Pin)){ } unsigned long t2 = micros(); unsigned long t = t2 - t1; return 340 * t /20000; } void open_Curtain(){ //カーテンオープン関数 for(int i=0;i<25;i++){ //左矢印表示 if(left_Arrow[i]){ M5.dis.drawpix(i, 0x0000ff); }else{ M5.dis.drawpix(i, 0x000000); } } int distance=sendTrigger(); while(distance<open_distance){ //指定した距離まで digitalWrite(Moter_IN1, HIGH); //移動 digitalWrite(Moter_IN2, LOW); delay(500); digitalWrite(Moter_IN1, LOW);//一回OFF digitalWrite(Moter_IN2, LOW); delay(100); distance=sendTrigger(); //距離測定 } for(int i=0;i<25;i++){ //消す M5.dis.drawpix(i, 0x000000); } } void close_Curtain(){ //カーテンクローズ関数 for(int i=0;i<25;i++){ //右矢印表示 if(right_Arrow[i]){ M5.dis.drawpix(i, 0x0000ff); }else{ M5.dis.drawpix(i, 0x000000); } } int distance=sendTrigger(); while(distance>close_distance){//指定した距離まで digitalWrite(Moter_IN1, LOW);//移動 digitalWrite(Moter_IN2, HIGH); delay(500); digitalWrite(Moter_IN1, LOW);//一回OFF digitalWrite(Moter_IN2, LOW); delay(100); distance=sendTrigger();//距離測定 } for(int i=0;i<25;i++){ M5.dis.drawpix(i, 0x000000);//消す } }

完成

以上で完成して、問題なくカーテンレール上を走行できた。
また、我が家では、スマートリモコンを導入しているため、赤外線機器をネットワークから操作できる。
なので今回の機器自体にはネットワーク接続機能を持たせていないが、Alexaからの操作、IFTTTからの操作も可能なので、問題なくIoTできている。
またこれらを使用して、朝目覚ましとともに、カーテンを開ける等の動作を確認できた。
キャプションを入力できます
キャプションを入力できます

感想

いざ作成してみて製品版よりは遥かに安く完成したが、劣化版が故の問題点がいくつか見えた。
まず、ギヤボックスの騒音問題、朝目覚ましとともにカーテンを開ける事はできたが目覚ましよりこの機器のほうがうるさい、
また、モーターノイズで、超音波距離センサーの値が安定せずに、途中で止まる等の問題がたまに発生する。
電源供給はケーブルで行っているため、邪魔である。

それに比べ、SwitchBotの製品は、これらの問題がすべて解決されていると思われる。
やはり値段にはそれなりの、理由があることが今回の制作で実感した。
購入を前向きに検討したいと思う。

以上、お読みいただきありがとうございました。

sako_DIY さんが 2021/02/28 に 編集 をしました。 (メッセージ: 初版)
sako_DIY さんが 2021/02/28 に 編集 をしました。
ログインしてコメントを投稿する