Arduinoキーパッドドアロック:ユーザー設定可能な暗証番号
必要なパーツと用品
| Arduino UNO | ×1 |
| 4x4 キーパッドマトリックス | ×1 |
| 汎用プッシュボタン | ×1 |
| LCD I²C | ×1 |
| リニアソレノイドロック | ×1 |
| IRF510N MOSFET | ×1 |
| 1チャネルリレーモジュール | ×1 |
必要な工具と機械
| ブレッドボード(170ピン) |
| ジャンパーワイヤーキット(5cm、10本) |
このプロジェクトについて
こんにちは、このチュートリアルへようこそ(古いけど定番です)。今日は、Arduinoボード、キーパッド、LCD I²Cディスプレイをベースにしたドアロックプロジェクトを作ります。ロックにはソレノイドとリレーを使用します。指紋認証ドアロックのチュートリアルではDCモーター式のロックを使いましたが、お使いのロックシステムに合わせて配線、コードを適応させてください。
注: 実用プロジェクトでは、ソレノイドの使用はまったくお勧めしません。むしろ、電子錠と機械錠の両方で開けられる錠前をハックし、それに合わせてプロジェクトを適応させることを推奨します。
パーツ
このプロジェクトには以下のコンポーネントが必要です。ジャンパーワイヤーと12V電源も必要ですが、ここでは省略しています。
(部品写真は元記事を参照)
プッシュボタンは室内からロックを開けるためのものです。不要なら外せます。抵抗はチャタリング防止用です。
4×4キーパッドを使用していますが、3×4でも可能です。その場合、コードの一部を修正する必要があります(確認キーに'A'を使用していますが、'*'や'#'に変更可能)。
ソレノイドは12V外部電源で駆動し、IRF510N MOSFETトランジスタで制御します。
トランジスタはスイッチとして動作し、Nチャネル型が適しています。IRF510NはArduinoとの組み合わせで人気があります。ゲートとソース間に5Vを印加すると、ドレインとソース間が導通(スイッチON)し、バイポーラトランジスタのようなベース抵抗は不要です。電圧を印加しなければ開放(スイッチOFF)となり、これでソレノイドを制御します。
もう一方の例では1チャネルリレーモジュールを使用します。これは3.3Vで動作し、入力制御はトランジスタと同様ですが、ロジックが反転します(コードで確認)。
アルゴリズム フローチャート
理解しやすくするためにフローチャートを作成しました。完全ではありませんが、コードの概要を示しています。
(フローチャート画像は元記事を参照)
注: リレーを使えば250VACまでの電気錠を制御可能です。ソレノイド制御にも使用できます。
コードはまったく同じで、ロックを開くときのLOW/HIGHを切り替えるだけです。
重要: 初回はコードをアップロードし、パスコードを変更してから、いくつかの行をアンコメント(setup内の該当行を探してください)して再アップロードする必要があります。これでEEPROMからパスコードを読み取れるようになります。この操作は初回のみ必要です。
また、コード長も変更可能です。最初は4桁にしていますが、デフォルトコードから変更できます。コードでは「sizeof(code)」を使用しているため「4」という数値はハードコードされていません。ただし、4桁のコードを6桁に変更する場合は、まずソースコードの初期パスコードを変更してください。
テスト
テストの様子は以下の写真をご覧ください。
(テスト写真多数は元記事を参照)
以上がプロジェクトのテスト結果です。ソレノイドでもリレーでも同じ動作です。プッシュボタンで室内から開錠できます(不要なら外せます)。
お役に立てれば幸いです。問題や質問があればコメントしてください。
ソースコード
ソレノイド版 (Keypad_doorlock_solenoid.ino)
/* 4x4キーパッドマトリックス、LCD I2C、IRF510Nトランジスタ、プッシュボタンで動作
* 正しいコードまたは室内のプッシュボタンで解錠可能
* キーパッドで直接コード変更可能、コード再アップロード不要
* コードはEEPROMに保存
* 詳細は www.surtrtech.com 参照 */
#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define Solenoid 11 // 実際はソレノイドを制御するトランジスタのゲート
#define O_Button 10 // プッシュボタン
#define I2C_ADDR 0x27 // I2Cアドレス、最初にスキャナースケッチで確認を
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
const byte numRows = 4;
const byte numCols = 4;
char keymap[numRows][numCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char keypressed;
char code[] = {'6','6','0','1'}; // デフォルトコード、変更可、桁数も可変
char code_buff1[sizeof(code)];
char code_buff2[sizeof(code)];
short a=0, i=0, s=0, j=0;
byte rowPins[numRows] = {9,8,7,6};
byte colPins[numCols] = {5,4,3,2};
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
void setup() {
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home();
lcd.print("Standby");
pinMode(Solenoid, OUTPUT);
pinMode(O_Button, INPUT);
// 初回アップロード時は以下をコメントアウトしたままにする
// for(i=0; i
リレー版 (Keypad_doorlock_relay.ino)
/* 4x4キーパッドマトリックス、LCD I2C、リレーモジュール、プッシュボタンで動作
* 正しいコードまたは室内のプッシュボタンで解錠可能
* キーパッドで直接コード変更可能、コード再アップロード不要
* コードはEEPROMに保存
* 詳細は www.surtrtech.com 参照 */
#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define Relay 11 // リレー制御
#define O_Button 10 // プッシュボタン
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
const byte numRows = 4;
const byte numCols = 4;
char keymap[numRows][numCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char keypressed;
char code[] = {'6','6','0','1'};
char code_buff1[sizeof(code)];
char code_buff2[sizeof(code)];
short a=0, i=0, s=0, j=0;
byte rowPins[numRows] = {9,8,7,6};
byte colPins[numCols] = {5,4,3,2};
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
void setup() {
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home(); lcd.print("Standby");
pinMode(Relay, OUTPUT);
pinMode(O_Button, INPUT);
// 初回のみEEPROM書き込みのためのループをアンコメントして再アップロード
}
void loop() {
keypressed = myKeypad.getKey();
if(keypressed == '*') {
lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter code");
GetCode();
if(a == sizeof(code)) OpenDoor();
else { lcd.clear(); lcd.print("Wrong"); }
delay(2000); lcd.clear(); lcd.print("Standby");
}
if(keypressed == '#') { ChangeCode(); lcd.clear(); lcd.print("Standby"); }
if(digitalRead(O_Button) == HIGH) {
digitalWrite(Relay, LOW); // リレーはロジック反転
delay(3000);
digitalWrite(Relay, HIGH);
}
}
// GetCode, ChangeCode, GetNewCode1, GetNewCode2, OpenDoor 関数はソレノイド版と同一
// OpenDoorのみリレー制御に合わせて修正:
// void OpenDoor() { lcd.clear(); lcd.print("Welcome"); digitalWrite(Relay, LOW); delay(3000); digitalWrite(Relay, HIGH); }
回路図
(回路図画像2枚は元記事を参照)
製造プロセス
- 銀行金庫の中身:歴史、設計、セキュリティの未来
- スマートフォンのBluetooth近接検知でスマートオートロックドアを構築
- スマートホーム連携向けマルチポジション温度センサーシステム
- MotionSense: ArduinoとESP8266で作るスマート侵入検知システム
- 3Dプリンター火災予防:スマートセンサーセーフティシステム
- Arduino、キーパッド、リニアアクチュエーターで作るパスワード式ドアロック
- Arduino、Yaler、IFTTTでWeb対応IoTゲージを構築する
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- 高度なリモートコントロールグリッパーロボット: 精密ハンドリング向け
- 高度なマイクロコントローラー実験:ESP32、Arduino、PIC、センサーモジュール
- CoroFenceサーマルディテクター:Grid-EYE & PIRセンサー搭載IoT体温監視