Arduino Hệ thống khóa cửa RFID/NFC

Trong hướng dẫn này, chúng ta sẽ học cách làm hệ thống khóa cửa RFID/NFC bằng Arduino, Bộ kit RFID/NFC RC522, và khóa điện từ hoặc khóa solenoid.

※ Lưu ý:

Chúng tôi cũng có thêm các bài hướng dẫn khác Arduino - Hệ thống khóa cửa sử dụng mật khẩu.

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×RFID/NFC RC522 Kit (reader + tags)
1×RFID Key Fob
1×RFID Card
1×Solenoid Lock
1×(Hoặc) Electromagnetic Lock
1×Relay
1×12V Power Adapter
1×DC Power Jack
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Mô-đun RFID/NFC RC522 và Khóa điện từ

Nếu bạn chưa biết về Mô-đun RFID/NFC RC522, Khóa điện từ và Khóa Solenoid (các chân kết nối, cách hoạt động, cách lập trình ...), hãy tìm hiểu về chúng trong các bài hướng dẫn sau:

Các thành phần của hệ thống

Hệ thống khóa cửa bao gồm hai phần chính:

  • Khóa cửa: Arduino + đầu đọc RFID/NFC + ổ khóa điện từ
  • Chìa khóa cửa: thẻ RFID/NFC
linh kiện khóa cửa RFID cho Arduino

Có một số loại đầu đọc RFID/NFC có thể làm việc với Arduino. Bài hướng dẫn này sử dụng RFID-RC522 làm đầu đọc RFID/NFC vì nó rẻ.

Cách hoạt động của khóa cửa RFID/NFC

  • Một số thẻ có UID được thiết lập trong mã Arduino đóng vai trò như các khóa được ủy quyền.
  • Người dùng chạm thẻ RFID/NFC lên đầu đọc RFID/NFC.
  • Đầu đọc đọc UID từ thẻ.
  • Arduino nhận UID từ đầu đọc.
  • Arduino so sánh UID đã đọc với các UID được định sẵn.
  • Nếu UID khớp với một trong các UID được định sẵn, Arduino vô hiệu hóa khóa từ để mở cửa.

Sơ đồ đấu dây

  • Khóa cửa RFID RC522 với khóa solenoid
sơ đồ nối dây cho hệ thống khóa cửa Arduino RFID rc522

This image is created using Fritzing. Click to enlarge image

  • Khóa cửa RFID RC522 với khóa điện từ
sơ đồ nối dây cho hệ thống khóa cửa Arduino RFID rc522

This image is created using Fritzing. Click to enlarge image

Để đơn giản nhất, các chân của mô-đun RC522 được kết nối trực tiếp với các chân của Arduino. Tuy nhiên, điều này có thể khiến Arduino không hoạt động đúng trong một số trường hợp vì các chân đầu ra của Arduino có thể phát ra 5V, trong khi các chân của mô-đun RC522 hoạt động bình thường ở 3.3V. Vì vậy, nên điều chỉnh điện áp giữa các chân của Arduino và các chân của mô-đun RC522. Để biết hướng dẫn chi tiết hơn, vui lòng tham khảo Arduino - RFID/NFC (nhận diện bằng tần số vô tuyến / giao tiếp trường gần). Sơ đồ dưới đây trình bày cách điều chỉnh từ 5V xuống 3.3V bằng điện trở:

Arduino RFID rc522 với sơ đồ đấu nối được điều chỉnh điện áp.

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Thứ tự các chân có thể khác nhau tùy theo nhà sản xuất. Luôn sử dụng nhãn được in trên mô-đun. Hình ở trên cho thấy sơ đồ chân của các mô-đun từ nhà sản xuất DIYables.

Mã Arduino - Phím đơn

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed 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); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } 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(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Hướng dẫn từng bước

Vì UID thường không được in trên thẻ RFID/NFC, bước đầu tiên chúng ta cần làm là tìm ra UID của thẻ. Điều này có thể được thực hiện bằng cách:

  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn Upload trên Arduino IDE để tải mã lên Arduino
  • Mở Serial Monitor
  • Chạm một thẻ RFID/NFC lên module RFID-RC522
  • Lấy UID trên Serial Monitor
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  

Sau khi có UID:

  • Cập nhật UID ở dòng 18 của mã ở trên. Ví dụ, thay đổi byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; thành byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Tải lại mã lên Arduino lần nữa
  • Chạm thẻ RFID/NFC lên mô-đun RFID-RC522
  • Xem đầu ra trên Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Kiểm tra khóa điện từ, nó nên được mở khóa
  • Chạm một thẻ RFID/NFC khác lên module RFID-RC522
  • Xem đầu ra trên Serial Monitor
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  

※ Lưu ý:

Mã Arduino - Nhiều phím

Hãy tưởng tượng một căn phòng chỉ cho phép người quản lý và thư ký mở khóa cửa.

Trong trường hợp này, chúng ta cần sử dụng hai thẻ RFID/NFC: một cho người quản lý và thẻ còn lại cho thư ký. Chúng ta phải chỉ định UID của hai thẻ trong mã nguồn.

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed 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); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } 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); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } 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(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Thực hiện các bước tương tự như ở trên, sau đó lần lượt chạm từng thẻ lên module RFID-RC522. Kết quả trên Serial Monitor trông như bên dưới:

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  

Bạn có thể mở rộng mã ở trên cho ba, bốn hoặc nhiều thẻ hơn.

※ Lưu ý:

Trong đoạn mã ở trên, các khóa được gán cứng. Trên thực tế, nó nên có thể thêm/xóa khóa một cách động thông qua một chế độ đặc biệt. Nếu vậy, các khóa nên được lưu vào bộ nhớ EEPROM. Số lượng khóa có thể được lưu tùy thuộc vào kích thước của EEPROM. Mã sẽ trở nên phức tạp. Nếu bạn muốn xây dựng một hệ thống như vậy, chúng tôi cung cấp một dịch vụ lập trình. Xin đừng ngần ngại liên hệ với chúng tôi.

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.