超音波センサでハンズフリー解錠とオートロックを実装~Smartkey~

#はじめに
![IMG_3200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496939/757cf3c8-095a-812d-941e-3aec7ea15423.jpeg)

初めまして。WebAppや電子工作を勉強し始めて最初のプロダクトを記事にしました。そこで経験した様々な困難や気づきを共有したく思い、記事を投稿しました。

Djangoと超音波センサを搭載したArduinoを連携させて、得られたデータ(距離)をデータベースSQLiteに登録し、Web上に表示するというものを最初に作りました。それだけでもある程度の満足感はあったのですが、"IoTをやるならセキュリティやろ"と、ネットで見つけた[クールな作品](https://ppdr.softether.net/smartlock-1)を参考にして以下の作品を作りました。

プロダクトの内容は、超音波センサに手をかざすと自動で鍵が開き、その後自動で施錠までしくれるSmartkeyです。サムターンを回すタイプの鍵に取り付けることで実装できます。

#用意したもの
[Arduino Uno Rev3](https://store.arduino.cc/usa/arduino-uno-rev3) 
[超音波センサ　HC-SR04](http://akizukidenshi.com/catalog/g/gM-11009/)
[サーボモーター　SG92R](http://akizukidenshi.com/catalog/g/gM-08914/)
[3端子レギュレータ](http://akizukidenshi.com/catalog/g/gI-08678/)
[積層セラミックコンデンサ　0.1μF](http://akizukidenshi.com/catalog/g/gP-10147/)
[アルミ電解コンデンサ　47μF](http://akizukidenshi.com/catalog/g/gP-03120/)
[ブレッドボード　BB-801](http://akizukidenshi.com/catalog/g/gP-05294/)
[USBケーブル](https://www.amazon.co.jp/COMON-カモン-2AB-10-USB2-0-A-Bタイプ/dp/B0040YMGNG/ref=sr_1_1?keywords=4938591011050&qid=1568361774&s=computers&sr=1-1)
アルカリ乾電池(9V)
MP型電池スナップ
ドアノブ
割り箸
絶縁テープ
消しゴム
#手順
###ソフト
コードは以下のようにしました。

```cpp

#define TRG 10
#define ECH 11
#define HIGHTIME 10
#include <Servo.h>
 
Servo myservo;//Servoオブジェクトの宣言

void setup() {
Serial.begin(9600);//シリアルモニタが利用できるようになる
pinMode(TRG, OUTPUT);
pinMode(ECH, INPUT);
myservo.attach(9);//servo変数をピンに割り当てる、ここでは9番ピン
myservo.write(90);//角度を指定、ここでは90度
}

void loop() {
int diff;
float dis;
digitalWrite(TRG, HIGH);
delayMicroseconds(HIGHTIME);
digitalWrite(TRG, LOW);//10μ秒の超音波を発信
diff = pulseIn(ECH, HIGH);//ECHピンに入力される出力を検出
dis = (float)diff * 0.01715;//音速を343m/sとした時の距離算出の式
Serial.print(dis);
Serial.print("\n");//改行
if(dis<= 5.00){ //距離が5cm以下なら
  myservo.write(180);//鍵を開ける
  delay(10000);//部屋を出る時間は10秒間ある
  myservo.write(0);//鍵を閉める
  delay(1000);
  myservo.write(90);//元の位置に戻る
  }
delay(1000);//1秒ごとに距離を計測する
}
```

超音波センサは発信側と受信側の時間差を読み取ることができるので、その差を利用して距離を測定します。コードはこの[サイト](https://novicengineering.com/arduinoを用いて超音波センサで距離計を作る/)を参考にしました。

普段は距離が1m前後になるようにデバイスを設置します。手をかざすことで超音波を遮断して距離が5cm以下になると開錠します。10秒後には施錠するので、これがややストレスになるかもしれません。

今回使用したサーボモーターは、通常のモーターに回転角度を検出する機能がついており、回転角度を指定することで制御できます。複数人が時間差で部屋から出られるように、サーボモーターを毎回元の位置に戻すようなループ構造になっています。
###ハード
<img width="641" alt="スクリーンショット 2019-10-07 15.51.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496939/d6ec9f20-7625-f712-d53f-f85e58d2589a.png">

電子回路を組むのは初めてだったので、初めは全然わかりませんでした。ブレッドボード上でどことどこがつながっているか、入力→Arduino→出力という大まかな流れがあることなどの基礎知識を、ネット上の記事を読みまくることでインプットしました。

Arduino Uno Rev3には5Vピンが一つしかありませんが、超音波センサ、サーボモーターは共に動作電圧が5Vなので外部電源を用いて5Vを取り出す必要がありました。一度、9Vのアルカリ乾電池を超音波センサにつないでみましたが、センサが壊れてしまいました。

そこで(電子回路図では単三乾電池2個となっていますが)、9Vのアルカリ乾電池を外部電源とし、3端子レギュレータを用いて5Vを取り出すことにしました。一般的な3端子レギュレータを用いる場合、入力する電圧は出力する電圧よりも3V程度高い必要がありますが、市販されている乾電池は基本的に1.5Vなので(直列に6個つなげば9Vになります)今回は9Vの乾電池1個を用いることにしました。

3端子レギュレータの使い方はこの[サイト](https://radio1ban.com/bb_regu/)を参考にしました。3端子の出力側から取り出しただけではその出力電圧に波があり、不安定なので出力側の端子にコンデンサを接続して波成分を吸収させます。

電子回路図では見にくくなっていますがこんな感じです。
![IMG_3186.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496939/2874d077-fd25-4ab6-dad3-65acd0755956.jpeg)

サーボモーターに付属のプラスチックの部品とネジを用いて、ネジの先に消しゴムを固定します。これがサムターンを回す機構です。
![IMG_3873.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496939/bc7c2916-f9c7-0526-75a6-b9a9127507bf.jpeg)

また、サーボモーターに割り箸で取手をつけて、手動でも回せるようにしました。最後にArduino本体の電源としてPCにつなげば完成です。

デモ動画は[こちら](https://s33.aconvert.com/convert/p3r68-cdx67/r3k06-upecr.gif)

#感想
初めての開発だったので色々なところでハードルがありましたが、調べたり、人に聞いたりして何とか実装できました。調べればわりと何とかなるんですね。
###良かった点
かなり安価に、精度の高いSmartkeyを作ることができた。

作品提出の締め切りに追われて作ったので4日間ほどで完成させることができた。
###良くなかった点
外から自動で開けることはできないので、結局鍵を持ち歩く必要がある。この点に関しては、WiFiモジュールとWebAppを組み合わせれば外から操作することができるので、今後実装してみたい。

Arduino本体の電源としてPCを使っている。

見た目が悪い。