obnizとNode-REDで自作スマートロックを作ってみた

スマートロック、便利ですよね。

最近では家で簡単に取り付けれるものが増えてきて価格もお手頃になりました。

ただ、こういうシステムっていざ買ったら全然サイズ合わなくて使えなかったって話をよく聞きますよね(僕も何度かそんな経験してます…)

それだったら最初から自分で作ったほうがいいじゃないって思ったわけです。

というわけで今回は家のスマートロックを作ってみました。

実は数年前から構想はあったのですが、やれずじまいでした。

ですが、今回は舞台が整ったので実行にうつします。

用意するもの

obnizが6000円ほどしますが、他を揃えても大体1万円前後で作れると思います。

僕はobnizを人からもらったのでobnizがタダになって、綿棒ケースとかサーボモータやモバイルバッテリーは家にあるものを使ったので、実際はつまみ回す器具を3Dプリンターで出力するのにお金を出費した程度なのでかなり安く作れたと思います。(3Dプリンターの出力はだいぶ前で覚えてないので実質タダで構築したようなものw)

配線

配線は以下の図のとおりです。

f:id:KMiura:20210519221613p:plain

プログラム

ソフトはNode-REDを使いました。

obnizのAPIを叩くノードも使えますし、UIもダッシュボードを使って簡単にできるのでNode-REDだけでシステム構築ができるわけです。

何よりエッジ側に何もプログラムを書かなくてもいいのはいいですね。

そして実際用意したフローはめちゃくちゃシンプルです!

f:id:KMiura:20210519214410p:plain

予めダッシュボードノードとobnizノードを用意しておきます。

obnizノードについてはこちらのブログで紹介しています。

supernove.hatenadiary.jp

obniz functionノードには以下のコードを使用します。

// サーボモータを動かす
var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
servo.angle(msg.payload);

// ディスプレイに状態を表示
var status = msg.payload == 85 ? 'Close' : 'Open'; 
obniz.display.clear();
obniz.display.print(status);

組み立てと取り付け

サーボモーターに付属しているパーツとツマミ回す器具をホットグルーでくっつけて後は綿棒ケースの底にサーボモータを差し込む穴を用意してネジで固定すれば組み立ては終わります。

後はドアに諸々を取り付ければ完成です。

見た目が凄くダサいw。

f:id:KMiura:20210519223135p:plain

動作チェック

実際に動かしてみました。

サーボのトルクが心配でしたが、歯車がギシギシ言わずかなりスムーズに回ってくれました!

課題

実際に一日動かしてみて課題に感じたことをピックアップします。

綿棒ケースが外れる

これはサーボモーターとケースそのもの重みで下に落ちてしまうんですね。

なのでここは4箇所テープを貼って更にその周りを囲むように厳重に固定して落ちないようにしました。

つまみを回す器具が外れている

何度か使っていると気づいたらつまみが外れているせいで鍵が開かないことがありました。

これも上のように綿棒ケースが外れることでサーボモーターが回るのと同時に器具が外れてしまっていました。

なので綿棒ケースを厳重に固定したら外れることはなくなりました。

サーボモータが回らなくなる

綿棒ケースがしっかり固定されているのにも関わらずサーボモータが回らなくなるんですね。

これはError: No More pwm Available.と表示されてサーボモータが制御不能になるっぽいです。

これはESP32に切り替えたほうがいいのかな…なんて思っていましたが、ドキュメントを見ているとPWMを切るメソッドがあるようです。

obniz.com

これを入れればいいと思ったのですが、obniz Functionで書いたコードは非同期で動くのでサーボモータが動く前にPWMが切れてしまいます。

そこで、obnizのwait関数を使ってサーボモータの動作が終わるまで処理を待つようにしてみました。

obniz.com

これらを踏まえて先程のfunctionノードのコードを修正したものがこちらです。

// サーボモータを動かす
var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
servo.angle(msg.payload);

// PWMを切る(New)
await obniz.wait(500);
servo.off();

// ディスプレイに状態を表示
var status = msg.payload == 90 ? 'Close' : 'Open'; 
obniz.display.clear();
obniz.display.print(status);

これで一連のフローが終わるとPWMがリセットされるので、サーボモーターの動作が安定するわけです。

まとめ

今までずっとやろうとしていたスマートロックをついに完成させました。

実際使ってみたからわかる課題があってそれを解決して今の所動作が安定するようになりました。

改めて作って動かしてみないとどこが行けないのかがわかるのはとてもいいなと思いました。

あとは家族が不安がっているので安心できるように安定動作できるようにしていきたいですね。