아두이노 나노 - RFID 도어락 | Arduino Nano - RFID Door Lock

이 튜토리얼은 Arduino Nano, RFID/NFC RC522 모듈, 릴레이, 솔레노이드 잠금 장치 또는 전자기 잠금 장치, 그리고 선택적으로 LCD를 사용하여 도어 잠금 시스템을 구축하는 방법을 안내합니다. 여러분이 쉽게 따라 할 수 있도록, 이 튜토리얼에서는 RFID 도어 잠금 장치를 간단한 단계부터 복잡한 단계까지 만드는 방법을 안내합니다. 자세히 설명하자면, 우리는 다음을 수행할 것입니다:

비밀번호를 사용하여 도어락 시스템을 구축하려면, 아두이노 나노 - 키패드 도어락을 참고하세요.

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×RFID/NFC RC522 Kit (reader + tags) 쿠팡 | Amazon
1×RFID Key Fob 쿠팡 | Amazon
1×Solenoid Lock Amazon
1×(Alternative) Electromagnetic Lock Amazon
1×Relay Amazon
1×12V Power Adapter Amazon
1×DC Power Jack 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Adapter for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

RFID/NFC RC522 모듈, 솔레노이드 잠금장치 및 전자기 잠금장치에 대하여

RFID/NFC RC522 모듈, 솔레노이드 잠금장치, 전자기 잠금장치(핀아웃, 작동 원리, 프로그래밍 방법 포함)에 익숙하지 않다면, 다음 튜토리얼이 더 많은 정보를 제공할 수 있습니다:

도어 록 시스템 구성 요소

간단한 문 잠금 시스템은 두 가지 구성 요소로 이루어져 있습니다:

  • Door Lock: 아두이노 나노, RFID/NFC 리더기, 릴레이, 솔레노이드 잠금장치 또는 전자기 잠금장치
  • Door Key: RFID/NFC 태그
Arduino Nano arduino rfid door lock component

RFID/NFC 도어록 작동 원리

  • 사용자가 RFID/NFC 태그를 RFID/NFC 리더에 탭하면 리더가 태그에서 UID를 읽습니다.
  • 이후 Arduino Nano가 리더로부터 이 UID를 얻고 Arduino Nano 코드에 설정된 UID와 비교합니다.
  • 이 UID는 인증된 키로 동작합니다.
  • 만약 UID가 사전에 정의된 UID 중 하나와 일치하면, Arduino Nano는 솔레노이드 잠금장치를 비활성화하여 문을 엽니다.
  • 타임아웃 후 Arduino Nano는 릴레이를 활성화하여 문을 잠급니다.

선연결

RFID RC522 도어록과 솔레노이드 잠금장치

Arduino Nano RFID RC522 door solenoid lock system wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

RFID RC522 도어락과 전자석 잠금장치

Arduino Nano RFID RC522 door electromagnetic lock system wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

연결 과정을 단순화하기 위해, RC522 모듈의 핀은 아두이노 핀에 직접 연결됩니다. 그러나 아두이노의 출력 핀이 5V를 생성하는 반면, RC522 모듈의 핀은 3.3V에서 작동하기 때문에 이로 인해 아두이노가 일부 경우에 오작동할 수 있습니다. 결과적으로, 아두이노와 RC522 모듈의 핀 사이의 전압을 조절하는 것이 권장됩니다. 아래 다이어그램은 저항기를 사용하여 5V를 3.3V로 조절하는 방법을 보여줍니다.

Arduino Nano RFID RC522 with voltage regulated wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

※ NOTE THAT:

제조업체마다 핀의 배열을 다르게 할 수 있으므로, 모듈에 인쇄된 라벨에 의존하는 것이 중요합니다. 위에 표시된 핀배열도는 제조업체 DIYables이 생산한 모듈의 핀 배치를 보여줍니다.

아두이노 나노 코드 - 단일 키

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // 아두이노 나노의 RC522 SS 핀에 연결된 핀 #define RC522_RST_PIN 5 // 아두이노 나노의 RC522 RST 핀에 연결된 핀 #define RELAY_PIN A5 // 릴레이에 연결된 아두이노 나노 핀 MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // SPI 버스 초기화 rfid.PCD_Init(); // MFRC522 초기화 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화. digitalWrite(RELAY_PIN, HIGH); // 문 잠그기 Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // 새 태그가 있음 if (rfid.PICC_ReadCardSerial()) { // NUID가 읽혔음 MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // 문을 2초간 열어둠 delay(2000); digitalWrite(RELAY_PIN, HIGH); // 문 잠그기 } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // PICC 중지 rfid.PCD_StopCrypto1(); // PCD의 암호화 중지 } } }

사용 방법

RFID/NFC 태그의 UID를 찾으려면:

  • 위의 코드를 Arduino IDE를 사용하여 Arduino Nano에 업로드하세요.
  • 시리얼 모니터를 열고 RFID-RC522 모듈에 태그를 탭하세요. UID가 시리얼 모니터에 표시될 것입니다.
COM6
Send
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

UID를 받은 후에:

  • 코드의 18번째 줄을 UID를 반영하도록 수정하세요. 예를 들어, byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF};byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};로 변경하세요.
  • 수정된 코드를 Arduino Nano에 업로드하세요.
  • RFID/NFC 태그를 RFID-RC522 모듈 위에 놓으세요.
  • 시리얼 모니터에서 출력을 확인하세요.
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 솔레노이드 잠금장치가 비활성화되지 않았는지 확인하십시오.
  • 다른 RFID/NFC 태그를 RFID-RC522 모듈에 탭하십시오.
  • 시리얼 모니터에서 출력을 확인하십시오.
COM6
Send
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 00
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

  • 테스트를 용이하게 하기 위해 잠금 해제 시간이 2초로 설정되었습니다. 그러나 실제 사용이나 시연을 위해 시간을 늘려야 합니다.
  • MFRC522 라이브러리의 설치가 필요합니다. 자세한 정보는 아두이노 나노 - RFID/NFC RC522 튜토리얼을 참조해 주세요.

아두이노 나노 코드 - 다중 키

우리는 관리자와 비서만이 문을 열 수 있는 방을 상상해 봅시다.

이 경우에는 관리자용 태그와 비서용 태그, 두 개의 RFID/NFC 태그가 필요합니다. 두 태그의 UID를 코드에 명시해야 합니다.

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // 아두이노 나노 핀이 RC522의 SS 핀에 연결됨 #define RC522_RST_PIN 5 // 아두이노 나노 핀이 RC522의 RST 핀에 연결됨 #define RELAY_PIN A5 // 아두이노 나노 핀이 릴레이에 연결됨 MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // SPI 버스 초기화 rfid.PCD_Init(); // MFRC522 초기화 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화. digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // 새 태그가 사용 가능 if (rfid.PICC_ReadCardSerial()) { // NUID가 읽힘 MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // 2초 동안 문을 열어줌 delay(2000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // 2초 동안 문을 열어줌 delay(2000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // PICC 정지 rfid.PCD_StopCrypto1(); // PCD의 암호화 중지 } } }

이전과 동일한 단계를 반복한 다음, RFID-RC522 모듈의 각 태그를 개별적으로 선택하세요. 시리얼 모니터에는 다음과 같은 출력이 나타나야 합니다:

COM6
Send
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

위에 언급된 코드를 세 개, 네 개 혹은 그 이상의 태그를 포함하도록 확장할 수 있습니다.

RFID 도어 잠금장치에 LCD 디스플레이 추가

우리는 사용자에게 접근 상태(예: 허용/거부)를 표시하기 위해 선택적으로 LCD 디스플레이를 추가할 수 있습니다. LCD에 대해 자세히 알아보려면 Arduino Nano - LCD 튜토리얼을 참조하세요.

배선도 - RFID, 솔레노이드 잠금 또는 전자기 잠금 및 LCD 디스플레이를 사용한 도어록 시스템

Arduino Nano RFID RC522 door lock LCD wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

위의 배선도에서 볼 수 있듯이, 아두이노의 5V 핀이 릴레이와 LCD를 동시에 충분히 공급할 수 없기 때문에 5V 전원이 추가되었습니다.

아두이노 나노 코드 - RFID RC522 모듈, 솔레노이드 잠금장치 또는 전자기 잠금장치 및 LCD 디스플레이를 사용한 비밀번호 도어락 시스템

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #define RC522_SS_PIN 10 // Arduino Nano의 RC522 SS 핀에 연결된 핀 #define RC522_RST_PIN 5 // Arduino Nano의 RC522 RST 핀에 연결된 핀 #define RELAY_PIN A5 // 릴레이에 연결된 Arduino Nano 핀 MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C 주소는 0x27(자작 LCD에서), 16열과 2행 byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // SPI 버스 초기화 rfid.PCD_Init(); // MFRC522 초기화 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화 digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 lcd.init(); // LCD I2C 디스플레이 초기화 lcd.backlight(); Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // 새 태그가 감지되었음 if (rfid.PICC_ReadCardSerial()) { // NUID가 읽혔음 MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // 2초 동안 문을 열음 lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 lcd.clear(); } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // 2초 동안 문을 열음 lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠금 lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // PICC 정지 rfid.PCD_StopCrypto1(); // PCD의 암호화 정지 } } }

※ NOTE THAT:

LCD의 주소는 제조업체에 따라 다를 수 있습니다. 우리는 DIYables에서 명시한 대로 우리 코드에서 0x27을 사용했습니다.

RFID 도어 잠금장치에 도어 센서 추가하기

이전 코드에서는 Arduino Nano에 의해 잠금이 해제된 후 일정 시간이 지나면 문이 자동으로 잠겼습니다. 하지만 실제 상황에서는 종종 문 센서가 시스템에 통합됩니다. 문이 닫혀 있는 경우, Arduino Nano는 타임아웃 기간이 만료되기를 기다리지 않고 즉시 문을 잠급니다.

당신을 과부하시키지 않기 위하여, 우리는 문 센서를 배선도와 코드에 추가하지 않습니다. 이 부분은 여러분의 창의력을 위해 남겨둡니다. Arduino Nano - Door SensorArduino Nano - Door Sensor control Relay 튜토리얼을 참조하실 수 있습니다.

EEPROM에 유효한 RFID 키 관리 및 저장

이전 예시에서 유효한 RFID 키(UID)들은 아두이노 나노 코드에 하드코딩되었습니다. 이는 RFID 키를 추가하거나 삭제하고 싶다면 코드를 수정하고 다시 아두이노 나노에 업로드해야 한다는 것을 의미하는데, 이는 불편할 수 있습니다.

실용적으로 만들기 위해, 아두이노 나노에 코드를 수정하고 업로드하는 것 없이 RFID 키를 관리하는 방법이 필요합니다. 하나의 해결책은 RFID 키를 하드코딩하는 대신 EEPROM에 저장하는 것입니다. 따라서, 코드를 변경할 필요 없이 EEPROM에서 RFID 키를 추가하거나 삭제할 수 있는 방법이 필요합니다.

EEPROM에서 RFID 키를 관리하는 두 가지 방법이 있습니다:

RFID 키를 마스터 키로 사용

  • 새 키를 추가하는 ADD 마스터 키로 RFID 키를 사용합니다. 아두이노가 ADD 마스터 키를 감지하면 ADD 모드와 OPERATION 모드 사이를 전환합니다.
  • ADD 모드에서 아두이노가 새 키를 감지하면, 그 키를 EEPROM에 추가합니다.
  • DELETE 마스터 키와 DELETE 모드 또한 비슷합니다.
  • 시리얼/블루투스/IR을 통해 ADD/DELETE 명령어 작성
    • 명령어는 시리얼 모니터, 블루투스 앱, IR 컨트롤러 등을 사용하여 시리얼/블루투스/IR을 통해 전송됩니다...
    • 명령어에는 지시어(ADD/DELETE), RFID 키의 UID가 포함됩니다.
    • 보안을 강화하기 위해 명령어에는 비밀번호도 포함되어야 합니다. 아두이노는 비밀번호를 확인하여 명령어가 유효한지를 결정합니다.

    두 방법 모두 많은 아두이노 코드를 추가해야 합니다. 그것은 초보자에게 쉬운 일이 아닙니다. 따라서, 이 튜토리얼은 초보자를 복잡한 코드로 과부하시키지 않으면서도 초보자가 도어락 시스템에 대해 더 많이 알 수 있도록 지식만을 제공합니다. 실제 사용을 위해 이를 구현하고 싶다면, 유료 프로그래밍 서비스를 통해 저희에게 연락해 주세요.

    SD 카드에 접근 기록 저장하기

    다음 정보를 포함하여 접근 기록을 저장하고 싶을 수 있습니다: RFID 키의 UID, 접근 상태(허용/거부), 그리고 날짜 시간. EEPROM은 기록을 저장하기에 충분히 크지 않기 때문에, SD 카드를 사용하여 기록을 보관할 수 있습니다. 이 Arduino Nano - Log Data with Timestamp to SD Card 튜토리얼을 참조하실 수 있습니다.

    동영상

    비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

    ※ OUR MESSAGES

    • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!