スマートキーレスドアロック:ArduinoとAndroid Bluetoothでパスワード制御
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | メイン制御 |
| HC-05 Bluetoothモジュール | 1 | スマホと通信 |
| サーボモーター(Tower Pro MG996R) | 1 | デッドボルト駆動用、高トルク推奨 |
必要な工具
- 3Dプリンター(筐体パーツ出力用)
- はんだごて、ニッパー、ドライバー等
使用するソフトウェア
- Arduino IDE
- MIT App Inventor 2 - Androidアプリ開発(ノーコード)
プロジェクト概要
鍵を持ち歩く必要のない、Bluetooth経由でスマートフォンから施錠・解錠できるスマートドアロックを自作します。ロック本体はドア内側に設置するため、外部から物理的に破壊されにくい構造です。Androidアプリでパスワードを入力し「開錠/施錠」ボタンをすと、コマンド+パスワードがBluetoothで送信され、Arduino側でパスワード照合後、サーボモーターでデッドボルトを駆動します。結果(開錠/施錠/パスワード誤り)はアプリにフィードバック表示されます。
3Dプリント筐体
すべての構造パーツは3Dプリントで製作します。Thingiverseユーザーridercz氏の設計(Thing #2350856)をベースに、Rack_Holder.stl以外を使用。LT版(軽量版)でも強度十分です。Anet A8等で出力後、ネジ4本でしっかり固定して組み立てます。
Arduinoプログラムの仕組み
アプリから送信される文字列はOPEN=パスワードまたはCLOSE=パスワードの形式。=を区切り文字としてコマンドとパスワードを分離し、事前設定パスワード(デフォルトarduPi)と照合。一致すればコマンドに応じてサーボを駆動(開錠: 0度、施錠: 65度)し、結果をシリアル(Bluetooth経由でアプリへ)返信します。
回路図・配線
- HC-05 TX → Arduino RX (ピン0)
- HC-05 RX → Arduino TX (ピン1) ※分圧回路(1kΩ+2kΩ等)で3.3Vレベルに変換必須
- HC-05 VCC → 5V、GND → GND
- サーボ信号線 → デジタルピン9、VCC → 5V、GND → GND
- サーボ駆動電流が大きいため、別途5V電源(2A以上推奨)から給電すると安定
ドアへの取り付け
- 組み立て済みロックユニットをドア内側にネジ4本で固定
- HC-05をロック筐体の所定位置にホットグルーで固定
- Arduino基板をロック下部に配置し、配線接続
- 5V 1A以上のACアダプターで給電
Androidアプリ開発(MIT App Inventor 2)
基本版アプリ作成手順
- App InventorにGoogleアカウントでログイン
- 新規プロジェクト「BluetoothControlDoorLock」作成(スペース不可)
- デザイナーで以下を配置:
- ListPicker: 「Connect to Bluetooth Device」
- Label: 「Enter Password」
- TextBox (Passwordモード): パスワード入力
- Button: 「Open Door」
- Button: 「Close Door」
- BluetoothClient(非表示コンポーネント)
- ブロックエディターでロジック構築:
- ListPicker.BeforePicking → BluetoothClient.AddressesAndNames設定
- ListPicker.AfterPicking → BluetoothClient.Connect実行
- Open Doorボタン.Click →
"OPEN=" + TextBox.TextをBluetoothClient.SendTextで送信 - Close Doorボタン.Click →
"CLOSE=" + TextBox.Textを送信 - BluetoothClient.DataReceived → 受信テキストで「OPEN」「CLOSE」「WRONG」を判定し、Notifierでダイアログ表示
- メニュー「Build」→「App (save .apk to my computer)」でAPK生成・インストール
高機能版アプリ(BTcontrol)
基本版に以下の機能を追加した完成版アプリを提供しています:
- 起動時Bluetooth無効なら有効化ダイアログ表示
- ペアリング・接続状態の表示(MACアドレス・デバイス名)
- 開錠/施錠成功時のトースト通知
- パスワード不一致時のエラー表示
- 接続エラー時のリトライ・メッセージ表示
ダウンロード:
- ソース(.aia):
door-lock_android_source_PDi5PbxDwC.aia- インポートして改造可能 - APK:
door-lock_android_app_K05l3Csr61.apk- 直接インストール可能 - Google Play: BTcontrol
Arduinoスケッチ
#include <Servo.h>
Servo myservo;
String inputString = "";
String command = "";
String value = "";
String password = "arduPi"; // 任意のパスワードに変更可能
boolean stringComplete = false;
void setup() {
Serial.begin(9600);
inputString.reserve(50);
command.reserve(50);
value.reserve(50);
myservo.attach(9);
}
void loop() {
if (stringComplete) {
delay(100);
int pos = inputString.indexOf('=');
if (pos > -1) {
command = inputString.substring(0, pos);
value = inputString.substring(pos + 1, inputString.length() - 1);
if (!password.compareTo(value) && (command == "OPEN")) {
openDoor();
Serial.println(" OPEN");
delay(100);
} else if (!password.compareTo(value) && (command == "CLOSE")) {
closeDoor();
Serial.println(" CLOSE");
delay(100);
} else if (password.compareTo(value)) {
Serial.println(" WRONG");
delay(100);
}
}
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n' || inChar == '\r') {
stringComplete = true;
}
}
}
void openDoor() {
myservo.write(0);
delay(100);
}
void closeDoor() {
myservo.write(65);
delay(100);
}
セキュリティ考慮事項と改善案
- パスワード平文送信:Bluetooth SPPは暗号化されていないため、盗聴リスクあり。本格運用時はBLE+暗号化、またはチャレンジレスポンス認証の導入を推奨
- リプレイアタック対策:タイムスタンプやナンスを追加し、同一コマンドの再利用を防止
- 物理セキュリティ:非常用機械鍵併用、非常時手動解錠機構の追加
- 電源バックアップ:LiPoバッテリー+充電回路で停電対応
- ログ機能:開閉履歴をEEPROMやSDカードに記録
- 複数ユーザー対応:ユーザー別パスワード・権限管理
参考リンク
- Thingiverse設計ファイル: Servo Door Lock
- App Inventorチュートリアル: 公式
製造プロセス
- 銀行金庫の中身:歴史、設計、セキュリティの未来
- 運河と閘門:米国水上輸送のエンジニアリング、歴史、そして未来
- Arduinoで作るセキュアなRFIDロック – ステップバイステップガイド
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- ArduinoとAndroidでRoomba Create 2をリモコン操作 ─ Bluetooth経由のステップバイステップガイド
- Arduino、キーパッド、リニアアクチュエーターで作るパスワード式ドアロック
- Python 3からArduino UNOを制御 – シリアル通信でLED点滅デモ
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- Arduinoで高速・高精度RPM測定 – レーザーとIRセンサーによる新アルゴリズム
- ArduinoとESP8266で作るWi-Fi対応スマートドアロック — スマホで解錠