はじめに
ホテルとかオフィスのドアみたいに閉まると自動で施錠してくれるやつ、あれすごく便利ですよね。家を出るときにわざわざポケットから鍵を出して閉める動作が不要になるので、意外にも快適です。今回はこのオートロックを自作して自宅の玄関に取り付けた話です。
作りたいもの
まず、作りたいオートロックに必要な機能を決めます。
- ドアが閉まったら自動で施錠
- 暗証番号で解錠
- ICカードで解錠
- スマホを持って近づくだけで解錠
1→4になるほど難易度が高いと思います。この記事では最初の「ドアが閉まったら自動で施錠」をご紹介します。 まだ作ってる途中ですので、随時更新していきます。
必要なもの
- ArduinoまたはESP8266 400円~2000円くらい
- サーボモータSG92R 830円くらい
- 100均の下駄箱ライト 108円
ArduinoまたはESP8266
Arduinoの種類は何でも大丈夫ですが、後々解錠にFelica(ICカード)を使う予定ならシリアル通信で152000bpsが使えるボードが必要です。一番良く使われているArduinoUnoは対応していません。下記の安いArduinoNano互換品とかでいいと思います。また今後スマホを使って解錠するなど、WiFiを使って何かすることを考えるならESP8266をおすすめします。ちなみに僕はESP8266で作ってます。
サーボモータ
サーボモータとは、指定した角度まで回転してくれるモーターです。室内側のサムターンを回すので、それなりにパワーのあるものが必要です。僕の家のサムターンはちょっと固めだったのか、持っていたSG90では回せませんでした。
不安な方はよりトルクの大きいSG92Rをおすすめします。こちらはSG90よりも動きが遅いらしいですが、楽々回してくれてかっこ良いです。
100均の開閉センサ付きライト
100均の下駄箱ライトは写真を撮るの忘れましたが、扉に磁石とセンサーを取り付けて双方が離れるとスイッチON、近づくとスイッチOFFするライトです。今回はこれの磁石とセンサー部分を切り取って使っています。100円で開閉センサが手に入るので便利です。
(ここで紹介されているようなやつです。)
サムターン回し装置
まずモーターでサムターンを回す装置を作っていきます。3Dプリンターで部品を作っている人も見かけますが、CAD書いて出力するのも面倒なので割り箸とかで作っていきます。
どんな機構にするか
まずサムターンを回すための機構ですが、こんな感じになるように作ります。

木のブロックは余ってる木材の端材とかで全然OKです。それをサーボモーターに付属しているプラスチックのパーツに取り付けます。

こうすることによって、ニュートラルにしておけば鍵を使って開けたり手で開けたりできます。モータで開閉するときは左右に90度回転させて、またニュートラルに戻すことで、手動とモータの動作を両立させることができます。
ドアノブに取り付け
割り箸とマスキングテープを使ってモータをドアノブに固定します。ここはドアノブの形状によって色々やり方があると思うので、ご自宅のドアにあったやり方で固定してください。


開閉センサ
ドアが開いているか閉まっているかを検知するセンサを作ります。100均の下駄箱ライトを使えば簡単に作れます。100均のライトは片方が磁石、もう片方が金属板になっていて、磁石が近づくことで金属板が接触して電気が流れる仕組みになっています。今回はこの部分だけを切ってセンサ代わりに使います。

2つの箱が近づくと導通、離れると絶縁です。
配線
サーボモータと開閉センサが用意できたら配線してみます。サーボモータは接続を間違えないようにESP8266のGND、Vin、D4(PWMピン)につなぎます。サーボモータから出ている線は茶色がGND、赤が5V、オレンジがPWM信号です。
開閉センサはGND、D0につなぎます。2本ありますがどちらの線をどちらにつないでもOKです。

プログラム
ESP8266にこちらのプログラムを書き込みます。動作としてはすごく簡単で、開閉センサが「開」から「閉」になったタイミングでサムターンを回すだけです。せっかくWiFiが使えるESP8266を使ったので、WiFi経由で開け締めする機能も付けました!
#include <Servo.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> // ルータ設定 IPAddress ip(192,168,1,102); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); // ESP8266のピン番号 const int servo_pin = 2; const int door_pin = 12; Servo myservo; // サーボオブジェクトを生成 int door_sensor = LOW; int door_sensor_last = LOW; ESP8266WebServer server(80); //サーバーオブジェクト void door_open(){ myservo.write(170); delay(1000); myservo.write(90); } void door_close(){ myservo.write(10); delay(1000); myservo.write(90); } void handle_open(){ door_open(); server.send(200, "text/html", "opened"); } void handle_close(){ door_close(); server.send(200, "text/html", "closed"); } void setup() { Serial.begin(115200); delay(200); //固定IPで運用するときの設定 WiFi.config(ip, gateway, subnet); WiFi.begin("WIFIのSSID", "WIFIのパスワード"); // WiFiに接続するまで待つ Serial.println(""); while(WiFi.status() != WL_CONNECTED){ delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Connected!"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // Webサーバを設定 server.on("/open", handle_open); server.on("/close", handle_close); server.begin(); // 開閉センサの入力を内部プルアップにする pinMode(door_pin, INPUT_PULLUP); // サーボ変数をピンに割り当て myservo.attach(servo_pin); door_close(); } void loop() { // サーバとして待ち受ける server.handleClient(); // 現在のドアの開閉を検知 // LOW=閉 // HIGH=開 door_sensor = digitalRead(door_pin); // 「開」→「閉」になったタイミングでサーボモータを回す if(door_sensor == LOW && door_sensor_last == HIGH){ delay(1000); door_close(); } door_sensor_last = door_sensor; }
ルータ設定やWiFiパスワードの部分はご自身の環境に合わせて変えてください。
Arduinoを使う人はヘッダーファイルとか適宜変更して、それ以外はほとんどそのままで行けると思います。
完成!
プログラムができたら開閉センサを近づけたり離したりしてみてください。近づけたときにサーボモータが回るはずです。
ESP8266を使っている人はスマホやパソコンのURLのところに192.168.xxx.xxx/closeと入力しても動きます。
確認ができたらドアに取り付けてみます。
※注意 オートロックなので閉め出されないように鍵を持っておくこと!動作テスト中に閉め出されたら恥ずかしいです。

最大の問題はUSBケーブルが玄関まで届くかですね。僕は延長コードを3個経由しています。あと家から出るときに室内側からサムターンを回すのが少し大変です。慣れれば簡単に開けられますがちょっとモータが邪魔なので、今度は家の中からスイッチとかで開けられるようにしておきます。
今回は以上です。次回は帰ってきたときに暗証番号的なもので解錠する方法をご紹介します。
ipアドレスの設定と、回路の説明が欲しいです。
プログラム中で定義しているip,gateway,subnetはお使いのルータの設定によります。
gatewayとsubnetはルータの管理画面などで確認できると思います。
ipはルータと同じネットワークになるように好きに決めてOKです。例えばルータのアドレスが192.168.0.1なら192.168.0.xxx(xxxは2~254)が使えると思います。
回路というほど大したものでもなく説明できないので、
配線イメージを載せておきました。
参考にしてください。
ありがとうございました。
愛知県の学校でこのサイトを参考に作成しています。なかなかコンパイルがうまくできません。iphoneのテザリングで試しています。固定Wi-fiでないとできませんか?度々すみません。返信お願いします。
コンパイル出来るかはテザリングとは関係有りませんので、コンパイルエラーを確認してください。
テザリングで出来るかは微妙です。スマホと同一ネットワーク内にある機器のipアドレスを調べるスマホアプリ(Fingとか)がありますので、使ってみてください。
その他細かい質問がありましたら、Twitterの方にDMくれたら返しやすいかもしれません。
ありがとうございます!
配線図はあるのですが、配線のやり方がわからないです。是非教えてほしいです!
プログラミングの50列目がどうしてもエラーが起きてしまうのですが、どうしたらいいでしょうか?返信お願いします!
すみません、私のプログラムでは変数WIFI_SSID、WIFI_PWDを文字列として定義していたのですが、投稿の際に宣言部分を消していました。
正しくはWiFi.begin(“WIFIのSSID”, “WIFIのパスワード”); のように文字列で指定します。
本文も修正しました。ご指摘ありがとうございます。
ESP8266で行う理由が知りたいです。
すみません。ド素人なんですけどプログラムを基板に書き込むやりかたをかいつまんでコメントいただけるとさらに参考になるかと思います。よろしくおねがいします