🙃

丸ドアノブ鍵自動開閉機構スマートロック

2022/07/09に公開

ドアの鍵をPCから開閉できるようにしたい

丸い取っ手のドアノブ
対象としたドアノブはこちらの丸いドアノブ。鍵穴と取っ手部分が同軸上に配置されている厄介な特長を持っているやつだ。この特徴のせいで鍵部分とドア板との距離が長く、市販されているスマートキーシステムが使用できない。でもドアノブを変えるのは面倒だ。だから3Dプリンタと簡単な電子工作でスマートロックを自作することにした。
本記事ではPCから解錠施錠できるようになるまでを雑に説明する。

作戦

サーボモータによりドアの鍵を開閉できるようにする

シンプルに、サーボモータを使って鍵のつまみ部分を回転させてやることで、鍵を開けたり閉めたりしたい。サーボモータはこちらのものを用いる。このサーボモータをArduinoにつないで制御することにする。

サーボモータの回転をつまみにどうやって伝えるか

そもそもモータのトルク(回す力)が足りるのかわからない。足りなかったらつまみは動かないので作る意味がない。でも難しい計算はしたくないし、必要トルクを求める実験もしたくない。ということでとりあえず歯車を使ってトルクを2倍にて作ることでリスクを低減する。必要トルクに個体差あったりしたら考えるの面倒だしね。これで動かなかったら、ドアノブ交換した方が早いかも。
トルクを2倍にするには伝達側と被伝達側の歯数比を1:2にしてやれば良かったはずだ。でも待って、ここで確認しておきたいのがサーボモータの回転可動域だ。

ギア比と可動域とトルク

ほとんど全ての鍵のつまみは解錠状態から90度の角度回転させることで施錠できる。逆もまた然り。つまり、サーボモータで直接つまみを回転させる場合、サーボモータに求められる可動域は90度ということになる。今回使用しているサーボモータは180度の可動域を有するため、全く問題はない。
ではギアを用いてギア比1:2で動力を伝達する場合はどうか。歯数が1:2となっているため、1側を1回転させても2側は半周しかしない。つまり、2側を90度回転させるには1側を180度回転させる必要がある。つまり、今回使用するサーボモータの可動域をフルに使うことになる。カタログ通りの可動域なのか、とても不安だ。でもギア比を変更すると計算が面倒なので妥協する。

物理鍵との兼ね合いを考える

作成するシステムが故障した場合、物理鍵により鍵を開けられる必要がある。が、サーボモータはその特性上、電源が入っている限りPWM信号により指定された角度を維持するように回転しようとする。これが物理鍵による解錠の妨げとなってしまっては困る。ではどうするか。電源が入っていなければいいんだから、電子的にスイッチングしちゃおう! ということで使用するのがこちらのMOSFET。
MOSFETは小さい電圧信号で電流のON/OFFを制御できる優れたスイッチだ。このMOSFETを使ってサーボモータの電源を管理することで、安全に物理鍵での解錠施錠ができるようになる。

制御側の作成

回路を作成

使用したもの

  • Arduino
  • ブレッドボード
  • ジャンパーピン
  • MOSFET
  • サーボモータ
  • ダイオード

ジャンパーピンとブレッドボードで回路を組んだ。
ArduinoのPWMピンを2箇所使用する。1つはサーボモータ用、もう一つはMOSFET用だ。
サーボモータにはコイルが含まれているため、強い逆起電力が発生しMOSFETにダメージが発生する可能性があるのでダイオードをモータに並列逆方向に接続する。
他に注意する点としては使用するMOSFETはNチャネル型であるため、負荷となるサーボモータはドレイン側に接続することくらい。

Arduinoスケッチを作成

シリアルモニタなどで0を送ると180度、1を送ると0度になるようにした。

#include <Servo.h>
#include <SoftwareSerial.h>
 
 Servo myservo;          // Servoオブジェクトの宣言
 const int SV_PIN = 3;   // サーボモーターをデジタルピン3に
 const int mosfet = 5;   // MOSFETをデジタルピン5に
 char data;
 
 void setup(){   
   Serial.begin(38400);
   myservo.attach(SV_PIN, 500, 2400);  // サーボの割当(パルス幅500~2400msに指定)
   Serial.println("Connect \n");
   myservo.write(90);
   analogWrite(mosfet, 255);
   delay(1000);
 }
 
 void loop(){
   analogWrite(mosfet, 0);
   if (Serial.available() > 0) { //解錠 
    data = (char) Serial.read();
    Serial.println(data);
     if (data == '1'){
      analogWrite(mosfet, 255);
      Serial.println("Open");
      delay(100);                                                           
      myservo.write(0);
      delay(1000);
      analogWrite(mosfet, 0);
     }
     else if (data == '0'){ //施錠
      analogWrite(mosfet, 255);
      Serial.println("Close");
      delay(100);
      myservo.write(180);
      delay(1000);
      analogWrite(mosfet, 0);
     }
   }
 }

ハードウェア側の作成

3DCADでモータケースや動力伝達用歯車を作る

使用したソフトはFusion 360。学生なら無料で使える。Macでも使える。
Spur Gearという標準アドインを使用して歯車を作成、後はドアノブの寸法とサーボモータの寸法に合わせてどうにかこうにかデザインを作成する。詳細は割愛するが、歯車の噛み合わせや軸受けは若干ゆとりを持った寸法にして、全く動かない事態を回避するように工夫した。


3Dプリンタで出力

Fusionで作成したデータを各コンポーネントごとにSTL形式で書き出して、スライサーソフト(私の場合はFlash Print)に読み込ませて、3Dプリンタにスライスデータを送信した。素材にはPLAを使用し、ラフトあり、サポートあり、プラットフォーム温度60度として印刷した。
精度は特に指定しなかったが、8時間かからないくらいで完成した。

組み合わせて完成

寸法はぴったり。ガムテープで雑に固定して動作を確認した。
シリアル通信でキーボードから0,1を入力するとつまみを回転させることができた。

発展

ここでは詳細を説明しないが、ローカルホストで立てたhttpサーバで解錠、施錠ボタンを用意して押されたらArduinoにシリアル通信するプログラムを書けば、家のネット環境につながったデバイスから鍵を操作できるスマートロックの完成。ウェブ言語は友人に任せることにする。

問題

ドアノブの回しにくさが倍増したので、ドアノブに棒状の取っ手を貼り付けることをお勧めする。

総括

面倒な計算を全て吹っ飛ばしてスマートロックを作成した。可動域については心配だったが、動作には安定感があり、ドアとの接着ガムテープをどうにかしたら普通に運用できそうだ。

Discussion