Arduino RFID Khóa solenoid

Trong bài hướng dẫn này, chúng ta sẽ học cách chế tạo hệ thống khóa cửa dựa trên RFID bằng cách sử dụng Arduino, đầu đọc RFID RC522 và khóa solenoid.

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×Relay
1×12V Power Adapter
1×DC Power Jack
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 solenoid

Nếu bạn chưa biết về Mô-đun RFID/NFC RC522 và khóa solenoid (cấu hình chân, 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:

Sơ đồ đấu dây

sơ đồ đấu nối khóa điện từ Arduino RFID rc522

This image is created using Fritzing. Click to enlarge image

Để đơn giản hóa phần cài đặt, các chân của module RC522 được kết nối trực tiếp với các chân trên Arduino. Tuy nhiên, kết nối trực tiếp này có thể gây ra sự cố, vì các chân đầu ra của Arduino cấp 5V, trong khi các chân của module RC522 được thiết kế cho hoạt động ở mức 3.3V. Nên điều chỉnh điện áp giữa các chân Arduino và các chân của module RC522 để ngăn ngừa các vấn đề tiềm ẩn. Để có 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ơ đồ được cung cấp cho thấy cách sử dụng điện trở để điều chỉnh 5V xuống 3.3V:

mô-đun Arduino rc522 với sơ đồ đấu dây có nguồn ổn áp

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

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

Mã Arduino - Một thẻ RFID

/* * 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-solenoid-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // The Arduino pin that controls the solenoid lock via relay MFRC522 rfid(SS_PIN, RST_PIN); byte authorizedUID[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, LOW); // deactivate the solenoid lock => locked Serial.println("Tap RFID 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] == authorizedUID[0] && rfid.uid.uidByte[1] == authorizedUID[1] && rfid.uid.uidByte[2] == authorizedUID[2] && rfid.uid.uidByte[3] == authorizedUID[3] ) { Serial.println("Authorized Tag"); digitalWrite(RELAY_PIN, LOW); // deactivate the solenoid lock => unlocked delay(2000); digitalWrite(RELAY_PIN, HIGH); // activate the solenoid lock => locked } else { Serial.print("Unauthorized Tag:"); 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, bước đầu tiên chúng ta cần thực hiện là tìm 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ấp nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Mở Serial Monitor
  • Chạm một thẻ RFID lên mô-đun RFID-RC522
  • Lấy UID trên Serial Monitor
COM6
Send
Tap RFID Tag on reader Unauthorized Tag: 51 3D C1 AC
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Sau khi có UID:

  • Cập nhật UID ở dòng 18 của đoạn mã ở trên. Ví dụ, thay byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; bằng byte authorizedUID[4] = {0x51, 0x3D, 0xC1, 0xAC};
  • Tải lại mã lên Arduino
  • Chạm một thẻ RFID lên module RFID-RC522
  • Xem đầu ra trên Serial Monitor
COM6
Send
Tap RFID Tag on reader Authorized Tag
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Chạm thêm một thẻ RFID khác lên mô-đun RFID-RC522
  • Xem đầu ra trên Serial Monitor
COM6
Send
Tap RFID Tag on reader Authorized Tag Unauthorized Tag: 5D 11 1A D3
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Mã Arduino - Nhiều thẻ RFID

Chúng ta có thể cho phép nhiều thẻ RFID/NFC kích hoạt khóa solenoid. Đoạn mã dưới đây sử dụng hai thẻ làm ví dụ.

/* * 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-solenoid-lock */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // The Arduino pin that controls the solenoid lock via relay MFRC522 rfid(SS_PIN, RST_PIN); byte authorizedUID1[4] = {0x51, 0x3D, 0xC1, 0xAC}; byte authorizedUID2[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, LOW); // deactivate the solenoid lock => locked Serial.println("Tap RFID 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] == authorizedUID1[0] && rfid.uid.uidByte[1] == authorizedUID1[1] && rfid.uid.uidByte[2] == authorizedUID1[2] && rfid.uid.uidByte[3] == authorizedUID1[3] ) { Serial.println("Authorized Tag 1"); digitalWrite(RELAY_PIN, LOW); // deactivate the solenoid lock => unlocked delay(2000); digitalWrite(RELAY_PIN, HIGH); // activate the solenoid lock => locked } else if (rfid.uid.uidByte[0] == authorizedUID2[0] && rfid.uid.uidByte[1] == authorizedUID2[1] && rfid.uid.uidByte[2] == authorizedUID2[2] && rfid.uid.uidByte[3] == authorizedUID2[3] ) { Serial.println("Authorized Tag 2"); digitalWrite(RELAY_PIN, LOW); // deactivate the solenoid lock => unlocked delay(2000); digitalWrite(RELAY_PIN, HIGH); // activate the solenoid lock => locked } else { Serial.print("Unauthorized Tag:"); 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 đó chạm lần lượt từng thẻ lên module RFID-RC522. Kết quả trên Serial Monitor trông như dưới đây:

COM6
Send
Tap RFID Tag on reader Authorized Tag 2 Authorized Tag 1
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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.