スマートロックの停電問題を考える!

8月 24, 2021

スマートロックは便利ですが, 物理的なカギとは違って停電, モーターやRaspberryPiの故障等のリスクがあります. 鍵を閉めた状態で, 運悪くそういった故障があると, 部屋から閉め出されてしまいます. 今回はそれらの問題に対して, その対策を考えてみたいと思います.

準備したもの

セットアップ

2つのRaspberryPiのセットアップをします.

UPS用のライブラリをインストールします.

# installation    
sudo apt-get install pijuice-base

モーター用のライブラリをインストールします.

# installation
sudo apt install pigpio
pip3 install pigpio

スマートフォンから信号を送る際に必要となるライブラリをインストールします.

# installation
sudo apt install blynklib

設計

故障要因

これまで自作のスマートロックを使用していて, 実際に起こった故障をリスト化してみました.

電源未供給

  • 停電
  • ACアダプターの断線

モーターの故障

  • 経年劣化

RaspberryPiの故障

  • 経年劣化

要求図

上記の故障リスクをもとに, スマートロックに対する要求を整理しました.

停電やACアダプターの断線に対してはUPSという電池+電力低下検出をしてくれるデバイスを使用して, 電力供給がなくなっても電池によってRaspberryPiを動作できるように対策します. 停電しても自動で電池駆動に切り替わり, 電池にたまった電力が低下してきたら鍵を開けてくれるようにしています.

モーター故障にはもう1つモーターを備えておくことで対処します. 同一軸上にモーターを並べてどちらのモーターによっても鍵を回せるようにしておきます.

RaspberryPiの故障にも, もう1つRaspberryPiを備えておくことで対処します.

RaspberryPiへの電源供給がなくなったときの対策

停電等でRaspberryPiへ電源供給が出来なくなったときの対策として, UPSを使用します. UPSは予期せぬ停電や, 入力電源異常が発生した際に, 一定時間電力を供給し続けてくれます.

UPSにはPiJuiceを使用しました. PiJuiceは2015年にKickStarterで資金調達してできた製品で, 今は色々な代理店で購入することができます. 今回はUPSを電池+電池残量モニターと捉えて使用し, 電池残量の減少で停電状態を捉え, 電池残量が一定値より小さくなったら鍵を開けるようにしました. 簡単に使い方を書きました.

#!/usr/bin/python3
from pijuice import PiJuice # Import pijuice module
pijuice = PiJuice(1, 0x14) # Instantiate PiJuice interface object
print(pijuice.status.GetChargeLevel())

#results
# {'data': 57, 'error': 'NO_ERROR'}

dataに電池残量を0 – 100%で返してくれます.

冗長設計のためのモーター配置

2つのモーターを用いて, どちらか一方が故障しても鍵を開けることができるように下図のようにモーターを配置しました. 同一軸にモーターを配置することで, それぞれのモーターのトルクを独立してサムターンに伝えることができます.

2つのモーターを縦に繋げると結構幅を取ってしまいますが(モーター部分だけで8cm), 小型のモーターを使用するとトルクが足りなくてサムターンが回せなくてなってしまいました.

下のGIFのように動作します.

2つのRaspberryPiの連携

モーターにはOpenとCloseの状態を持たせており, 下図のようにOpen時にスマートフォンから信号を受け付けると鍵を閉める, Close時には鍵を開けるように動作します. 2つのモーターの動作に齟齬が生じないように, RaspberryPi間で今OpenかCloseかどちら状態かを共有できるようにしています.

使い方

RaspberryPi2つ共にSmartLock用のソースを取得します.

# installation
git clone https://github.com/tech-life-hacking/SmartLock.git

testRaspberryPi.pyの####### setting #######内の設定をします.
RaspberryPi0IPAddressにはそのRaspberryPiのIPアドレスを, RaspberryPi1IPAddressには通信するもう一方のRaspberryPiのIPアドレスを設定します.

設定後, RaspberryPi2つ共, testRaspberryPi.pyを実行させます.

# execute testRaspberryPi.py
python3 testRaspberryPi.py

testRaspberryPi.pyの内容としては, OpenとCloseの状態にしたがって, 鍵を開けたり閉めたりしてます.
drive_thumbturn():状態がOpenになったとき, 鍵を開ける. 状態がCloseになったとき, 鍵を閉める.

鍵を開け閉めするBlynk信号はThreadBlynk, 停電時に鍵を開ける信号はThreadBatteryが検出してくれます. またいつでも信号を受け付けられるようにThread化しています.

検証

電力供給が絶たれたとき

ACアダプターを抜いて停電時のシチュエーションにしてみました.
ACアダプターを抜いても, 電池の電力によってしばらく動作し続けます.
電池に貯まっている電力が尽きてしまうとモーターを動かすことができなくなるので,
その前に電池の電力が一定値を切ると解錠(サムターンが下向き)するようになっていることがテストできています.

モーター故障のとき

モーターとRaspberryPi間のジャンパー線を抜いて, モーター故障のシチュエーションにしてみました.
ジャンパー線を抜いてしまうと, 動いていたモーターが反応しなくなってしまいます.
しかしもう一つのモーターが生きているので, そちらのモーターによってサムターンを回すことができています.

おわりに

家に帰ってきたとき, ACアダプターが抜けてしまっていて, 自作したスマートロックが動作しないことがありました. スマートロックが安定していた頃に起きてしまったために, 物理鍵も持ってきていない状態で, 大家さんに連絡がつくまでネットカフェで夜を明かしたことが今回の記事のきっかけです. みなさんもリスクのあるIoTを作るときは気を付けてくださいね!