見出し画像

スマートロック作ってみた

こんにちは。ぽよです。

今回は勉強がてらIoTデバイスをつくってみることにしました。

 せっかくなのでイエナカで使えるオートメーションなデバイスのアイデアがないか探してみたところ、スマートロックを発見。センシングして終わりではなくてメカを作る楽しさもありそうなのでこれで行こうと思います。

■作りたいもの

 スマートロックとは物理的なキーを使わずともドアの錠を開閉・管理できる機器やシステムです。amazonで1万円以下で買える製品でてきたり一般的になってきました。
 既成品は既製品で高度な機能があるようですが、今回は自分で作れそうな機能に絞り、以下の仕様でつくることにしました。

・現在の自宅アパートの錠に両面テープで付けられること
・スマートフォンで解錠できる。(できるだけスマホ操作は不要にしたい)
・室内からの開錠はスマホ不要。
・タイマーによるオートロック。
・電池駆動

■できたもの

スマートロック 外観 全面
スマートロック 外観 背面

■レシピ

材料

DOIT ESP32 DevkitV1
 マイコンはWifiやBluetoothが使えて小型で安いのでESP32を初めて購入。
 しかしarduinoとは違い、ピンの読み替えや環境設定でいきなり躓く。ちなみに↓のリンクで購入したがNodeMCUではなくDOIT ESP32 DevkitV1が届いた。そもそも違いを分かってないので許す。

サーボモータ MG966R
 高トルクな模型用サーボモータ。我が家の錠のサムターンは重いようで、高トルクなモータを選定。

開錠スイッチ 押しボタン
 室内からスマホなしで開錠するためのスイッチ。

リードスイッチ
 ドアや蓋の開閉センサ用ににパッケージ化されたものを購入。

電池ボックス単3×4
 開発ボートもサーボモータも5V入力のため、アルカリ乾電池1.5V×4でいけるのではという安易な考え方で選定。

電解コンデンサ 1000μF×2
 モータに瞬間的に大電流が流れ、同じ電池ボックスから給電している開発ボードがリセットされるために追加。※コンデンサ追加でリセットは回避できたもののモータは回らず。

その他
ユニバーサル基板、スズメッキ線、コネクタ、NFCタグ、両面テープ

メカ

自宅の錠を採寸してポン付けできる筐体を設計。サーボモータを保持して、ボードが内部に収まるようにざっくりと設計。CADはFUSION360を使用。3Dプリンタで出力した。
 

スマートロック メカ

電気ハード

こんな感じで配線。

スマートロック 配線図

ソフト

#include <ESP32Servo.h>
#include <analogWrite.h>
#include <ESP32Tone.h>
#include <ESP32PWM.h>
#include <dummy.h>
#include<WiFi.h>
#include<WiFiClient.h>
#include<Blynk.h>
#include<BlynkSimpleEsp32.h>

//blynk用設定項目
char auth[] = "path";
char ssid[] = "SSID";
char pass[] = "PASSWORD";

int loc_pos = 10;     //サーボモータの施錠位置(deg)(実機テストで決める)
int unloc_pos = 110;  //サーボモータの開錠位置(deg)(実機テストで決める)
int timer_limit = 10000; //自動施錠待ち(msec)

//ピン割り当て
int servo_pin = 12;
int door_pin = 13;
int button_pin = 14; 

//各種状態用
int lock_state = 0;  
int door_state = 0;
int button_state = 0;
int timer = 0;

Servo myservo;



//施錠動作を関数化(開錠位置から施錠位置へ移動)
void lock(){         
  myservo.attach(servo_pin);
  for (int i = unloc_pos ; i > loc_pos ; i = i- 1){
  myservo.write(i);   
  delay(6);  
  }
  myservo.detach();}  //ピンの割り当て解除
  
//開錠動作を関数化(施錠位置から開錠位置へ移動)
void unlock(){       
  myservo.attach(servo_pin);
  for (int i=loc_pos ; i<unloc_pos ; i = i+1){
  myservo.write(i);   
  delay(6);  
  }
  myservo.detach();}  //ピンの割り当て解除

//リードスイッチとプッシュボタンはプルアップを有効に
void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  pinMode(button_pin, INPUT_PULLUP);
  pinMode(door_pin, INPUT_PULLUP);
}

//blynkからの入力に対する動作
BLYNK_WRITE(V0){
   if (lock_state == 0 and door_state == 0){
   unlock();
   lock_state = 1;
   delay(1000);
   timer = 0;
   }}
BLYNK_WRITE(V1){
   if (lock_state == 1 and door_state == 0){
   lock();
   lock_state = 0;
   delay(1000);
   }}


//ループ部
void loop() {
 button_state = digitalRead(button_pin);
 door_state = digitalRead(door_pin);

//blynkをラン
 Blynk.run();
 delay(100);

//オートロック部:ドア閉かつ開錠状態でタイマーカウントアップ→時間経過でロック
 if (lock_state == 1 and door_state == 0){
  timer  = timer +100;
  }
  else {
    timer = 0;  
  }
  
  if (timer >= timer_limit){
  lock();
  timer = 0;
  lock_state = 0;
  }

  if (button_state == LOW and lock_state == 0){
  unlock();
  lock_state = 1;
  }

//デバッグ用
  Serial.print("lock_state "); 
  Serial.print(lock_state); 
  Serial.print(" door_state "); 
  Serial.print(door_state); 
  Serial.print(" timer "); 
  Serial.print(timer); 
  Serial.print(" button_state "); 
  Serial.println(button_state); 
 
  }
 


 下記を参考にIFTTTでwebhook URLを作り、androidアプリblynkに設定する。一方でandroidの自動化アプリtriggerで用意したNFCタブを読み込んだ際に設定したURLにアクセスするように設定。仕組みはわかっていない。webhookってなんだ。

■課題点

  • 電源が切れた際にキーを差し込んで解錠しようとしても出力軸をむりやり回すのでかなり回転が重い。機構に改善の余地あり。既成品はどうしているのだろうか。

  • 電池駆動ならず。サーボ起動時にボードがリセットされてしまうため、電源ラインにコンデンサを追加。それでもモータは回せず。電圧降下だろうか、電気回路の知識が中学で止まっているのでよくわからん。USBで給電すると快調動作。

  • 消費電力が未知。電池駆動できても電池寿命で躓く可能性大。

  • 使っているアプリの仕様なのか、NFCタグを読み込むと一切設定をしていないスマホでも開錠できてしまう。スマホがリーダーでNFCタグがキーになってしまっている。(逆にしたかった)NFCタグを玄関先に貼って使おうと思っていたが、これでは玄関先にキーがぶら下がっているようなもんなので、だれでも開けられてしまう。代替案を考え中。


というわけで実用にはまだまだ遠いですが、何となく動くものはできたし、勉強にもなったのでヨシとする。
IoTの肝であるクラウドに関しては1ミリも理解していないので勉強してみようと思った次第です。


この記事が気に入ったらサポートをしてみませんか?