Arduino、キーパッド、リニアアクチュエーターで作るパスワード式ドアロック
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| メンブレンキーパッド(4×4マトリックス) | 1 | |
| L293D デュアルHブリッジ モータードライバー | 1 | Texas Instruments製 |
| リニアアクチュエーター(12V) | 1 | ドアの施錠/解錠用 |
プロジェクト概要
キーパッド入力でパスワード認証し、正しければリニアアクチュエーターを駆動してドアを開けるシステム。ネット上に類似プロジェクトは多数あるが、動作原理をわかりやすく解説することを目的としています。
キーパッドの仕組み
4×4マトリックスキーパッドは内部で行(Row)と列(Column)に配線されています。キーを押すと対応する行と列が短絡。Arduino側では列をプルアップ入力、行を出力に設定し、行を順番にLowにして列の状態を読み取る「スキャン」方式でどのキーが押されたかを判定します。
スキャンの流れ
- 全行をHighに設定
- Row 0のみLowにし、Column 0-3を読み取り → Lowならキー'1','2','3','A'のいずれか
- Row 1をLowにし、同様に読み取り → '4','5','6','B'
- Row 2をLow → '7','8','9','C'
- Row 3をLow → '*','0','#','D'
- これを高速で繰り返すことで、短時間の押下も検出可能
コード1: キーパッドスキャンのみ(ライブラリ不使用)
STM32等でライブラリが使えない場合にも対応できるよう、スキャンロジックを自前で実装した版。シリアルモニターに押されたキーを表示します。
int rows = 4; int columns = 4;
#define c3 9 #define c2 8 #define c1 7 #define c0 6
#define r3 5 #define r2 4 #define r1 3 #define r0 2
void setup() {
Serial.begin(9600);
pinMode(c0, INPUT_PULLUP); pinMode(c1, INPUT_PULLUP);
pinMode(c2, INPUT_PULLUP); pinMode(c3, INPUT_PULLUP);
pinMode(r0, OUTPUT); pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT); pinMode(r3, OUTPUT);
pinMode(11, OUTPUT); pinMode(12, OUTPUT); // アクチュエーター制御用
}
char readkey(void) {
// Row 0 スキャン
digitalWrite(r0, LOW); digitalWrite(r1, HIGH); digitalWrite(r2, HIGH); digitalWrite(r3, HIGH);
if (digitalRead(c0) == LOW) { delay(500); return '1'; }
else if (digitalRead(c1) == LOW) { delay(500); return '2'; }
else if (digitalRead(c2) == LOW) { delay(500); return '3'; }
else if (digitalRead(c3) == LOW) { delay(500); return 'A'; }
// Row 1 スキャン
digitalWrite(r0, HIGH); digitalWrite(r1, LOW); digitalWrite(r2, HIGH); digitalWrite(r3, HIGH);
if (digitalRead(c0) == LOW) { delay(500); return '4'; }
else if (digitalRead(c1) == LOW) { delay(500); return '5'; }
else if (digitalRead(c2) == LOW) { delay(500); return '6'; }
else if (digitalRead(c3) == LOW) { delay(500); return 'B'; }
// Row 2 スキャン
digitalWrite(r0, HIGH); digitalWrite(r1, HIGH); digitalWrite(r2, LOW); digitalWrite(r3, HIGH);
if (digitalRead(c0) == LOW) { delay(500); return '7'; }
else if (digitalRead(c1) == LOW) { delay(500); return '8'; }
else if (digitalRead(c2) == LOW) { delay(500); return '9'; }
else if (digitalRead(c3) == LOW) { delay(500); return 'C'; }
// Row 3 スキャン
digitalWrite(r0, HIGH); digitalWrite(r1, HIGH); digitalWrite(r2, HIGH); digitalWrite(r3, LOW);
if (digitalRead(c0) == LOW) { delay(500); return '*'; }
else if (digitalRead(c1) == LOW) { delay(500); return '0'; }
else if (digitalRead(c2) == LOW) { delay(500); return '#'; }
else if (digitalRead(c3) == LOW) { delay(500); return 'D'; }
return 'o'; // 押下なし
}
char nfunc(void) {
char key = 'o';
while (key == 'o') key = readkey();
return key;
}
void loop() {
char key1 = nfunc();
if (key1) Serial.print(key1);
}
コード2: パスワード認証付き
入力された4桁を配列に蓄積し、設定パスワード「1234」と比較。一致ならD11 High / D12 Lowでアクチュエーターを引き込み(ドア開)、不一致なら「intruder」表示。
char password[5] = "1234";
char typed[5];
int count = 0;
void loop() {
char key1 = nfunc();
if (key1) {
typed[count] = key1;
count++;
Serial.print(key1);
}
if (count == 4) {
if (strcmp(typed, password) == 0) {
Serial.println(" correct");
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(250); // アクチュエーター駆動時間
digitalWrite(11, LOW); // 停止
} else {
Serial.println(" intruder");
}
count = 0;
}
}
リニアアクチュエーターの駆動
L293Dは12V電源で駆動し、Arduinoの5Vロジックで制御可能。入力ピン(D11, D12)のHigh/Low組み合わせで正転/逆転/停止を制御。パスワード正解時はD11=High, D12=Lowでアクチュエーターを引き込み(ドア開)。通常時は逆極性で突き出し状態(施錠)にしておきます。
回路図と動画
回路図ではアクチュエーターをモーター接続位置に、L293DのPin 8に12Vを接続。動画でキースキャン表示、パスワード正解時のLED点灯、アクチュエーター動作を確認できます。
発展のヒント
- パスワードをEEPROMに保存し、キーパッドから変更可能にする
- 複数ユーザー対応、入力回数制限、ブザーアラーム追加
- キーパッドライブラリ(
Keypad.h)を使えばコード簡略化可能
製造プロセス
- 銀行金庫の中身:歴史、設計、セキュリティの未来
- 回転ドア:設計、歴史、省エネ効果
- 運河と閘門:米国水上輸送のエンジニアリング、歴史、そして未来
- 現代ピンタンブラー錠の進化と製造
- ダイヤル式南京錠:設計、製造、歴史的進化
- Raspberry Pi搭載DIYソーラー駆動気象ステーション
- スマートフォンのBluetooth近接検知でスマートオートロックドアを構築
- Windows IoTとRaspberry Piで作るセキュアな顔認証ドアロック
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- ArduinoとESP8266で作るWi-Fi対応スマートドアロック — スマホで解錠
- エンジン配置・構成の総合ガイド:タイプと特徴