巷のスマートロックの話もちらほら聞くなかで、それにしてしまえば解決してしまう(?)ことなのだけども、たまに帰宅してからの玄関の鍵のかけ忘れなんかする。なんかいい方法でセンスできる方法ないか考えていた。鍵はサムターン形状のやつ。
測距センサーを使ってターンの角度具合の判別を試みるプロトタイプ作ってみた。センスするものは、施錠開錠の2値を判別できればいい。サムターンの形状が平たいつまみ*1で、開閉で90度動かすようになっている。サムターンと同じ高さの水平位置に取り付けて、開閉で不可視光が通過する/さえぎられることで測定距離が変化する原理で検出できるよう頑張った。
使ったもの
- 秋月電子通商さんのVL53L1Xデバイスを使った距離測定モジュール
- raspberry pi zero(WH)
この測距センサーはI2Cってので接続するデバイスで、今回のこれは、最大辺長それぞれ20mm,30mmでこのある程度の幅がうれしい。付属のコネクタ付きケーブルを使って、ras-piの物理ピン番号1,3,5,9に結線。*2モジュールからは6本線がでていてXSHUT,GPIO1という線は結線しなかった。*3キャリブレーションはしていない。*4
読み出しはpythonを使いライブラリはこれを使う。このパッケージはI2C通信のライブラリとしてsmbus2というのをimportしてる。今まで、smbus*5ってのを使った経験あったけども、smbus2のほうはpure pythonになっていて、個人的には中身がわかりやすく*6いいと思った。
結論的には、センサー設置位置のトライアンドエラーを経て、鍵の開閉を十分な確度で判別できそう、というところまで到達できた。
- 当初、デバイス設置位置とraspiの配置場所スペースとの関係から、センサーとサムターンを離した75cm/80cmの違いをセンスすることを試した。うまくサムターンで遮られる最適位置をみつけようと調整繰り返してみたけども、不可視光で出力しか手掛かりがなく、それと厳密な取り付け角度に安定して固定するのが現実的に難しいそうと考えてあきらめた。
- 水平方向だけでなく垂直方向に光を飛ばしての検出も考えてみたが実験はしていない。まず今回の自分の環境の制約で、扉の取っ手が障害物になるのでそもそも困難。デバイス設置位置とraspiの配置場所の距離の問題もある。I2C接続は結線長が上限1m程度らしい。仕様だと線のキャパシティ量の上限・これだけのキャパシティ量(=>これが結線長に依存)までは許容しようっていうようになってる。購入したモジュールには50cmのケーブルが付属していた。raspiから2mくらい引き回せたら上から下に向けても検討してもよかったのだろうけど、高い位置でセンサー調整するのも困難が予想され、試していない。下から上だと、要は踏まれても大丈夫なようにハウジングを凝る必要があってのっけから試していない。
- 測定距離値が乱れることがある。契機の一つとして照明をつけたとに起きてる傾向もありそうとか推測してみるが、毎回とか絶対ということでない。
最終的に、サムターンに近い側・ドアの縁部分にセンサーを貼り、5cm/80cmのセンスによってサムターンの状態を判別できるプロトタイプとなった。自分の玄関レイアウトの条件からだと、raspiの配置場所スペースがいい位置でなく(電源が遠い、スペースが限られる)けども、これが今回の最善。
こんな設置のイメージ。右に貼りつけたセンサーから(見えない)赤外線がでて左縁に反射して測定しているのだと思う。施錠するとサムターンに反射しているはずで、実際に50mmはあるところが測定値は0.0mmの値が戻ってくる。測距範囲最小が10cmと書いてあったので予想範囲内。
センサー自体が薄く通常は障害物にならない。ケーブルも人の動作・扉の開閉を邪魔しないようにできた。それでも日常の生活を考えると不意の強い接触に対しては無防備になっている。大きな荷物の運び込みとかのときは外す必要があるだろう。インテリアとしての見栄えも考慮してない。センサーを扉左側への配置が達成出来きるならこれらはもっと容易に解決できると思う。
raspiがコンパクトといっても、こういった環境の場合はできるだけ、障害物になるサイズ・形状を減らしたい。ras-piをさらに小さいボードコンピュータ・マイコンに置き換える案も考えるべきかもしれない。その場合には、I2Cの通信で単純な固定バイト読み出し以上のことをしているようなので、その処理をインプリメントできるものから探すことになる*7。
センサーの距離測定の精度自体は、やや癖があるようにみている。今回の環境の場合に8mを測定すると10cm程度のばらつきがでる。加えてなにかの契機でそのばらつく測定値の中心値が変動することがあるのを観察してる。(平均値790cm返していたのがたまに平均値810cmに変化するとか)センサー自体の特性かもしれない。センサーを厳密に固定していないので振動とか他にも光の具合とかなにかしら外的なかく乱要因隠れていそうな気もする。今回は2状態の判別ができればいいので(かつ測定位置で有利な方法を選んで)この精度で目的が達成できている。
検出ができるようになったら、あとはサーバに送って例えば好きな警告音だすとかできたりする。もし鳴ったら歩いて閉めにいくって感じ。玄関にras-piを置いて稼働させ続けることになり部屋の中と違ってどのくらい劣化しやすいだろうか、しばらくは動かしてみるつもり。デバイスのコア部品がむき出しになっているのが気になる。赤外線を透過する保護するなにかないか探してみたい。*8
*1:このタイプは若干物理セキュリティに弱点があるらしい。。。
*2:取り付け時の選択肢を広げる一つとしてコネクタの厚みを避けるために、基盤のコネクタ未実装バージョンがあるともっと嬉しいと後から思った
*3:デバイスの説明書の回路図によるとモジュール側で抵抗付でhighに固定してくれているらしいhttps://www.st.com/resource/en/datasheet/vl53l1x.pdf
*4:https://www.st.com/resource/en/user_manual/dm00474730-vl53l1x-api-user-manual-stmicroelectronics.pdf見ると機能があるみたい。今回のセンサーが対応しているか試せてないけども、正確な距離を測るのが目的でないので必要性を感じていない。
*5:i2c-devってライブラリを使う実質C言語記述になってた
*6:いじりやすい
*7:動作可能ならライブラリがすでにあるだろう
*8:なにかつけたらキャリブレーションが必要とUM2356ユーザーマニュアルに書いてあった。