ESP32 RFID Servo Motor

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng thẻ RFID/NFC để điều khiển servo motor bằng ESP32. Hoạt động như sau:

Điều này có thể được áp dụng để khóa/mở khóa tủ, ngăn kéo, cửa, hoặc mở/đóng máy cho ăn thú cưng...

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

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×Cáp USB Type-C
1×Bộ Kit RFID/NFC RC522 (đầu đọc + thẻ)
1×Móc Khóa RFID
1×Thẻ RFID
1×động cơ servo
1×Adapter Nguồn 5V
1×Jack Nguồn DC
1×Dây Jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Module RFID/NFC RC522 và Servo Motor

Nếu bạn chưa biết về Module RFID/NFC RC522 và Servo Motor (sơ đồ 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 hướng dẫn sau:

Cách Hoạt Động

  • UID của một số thẻ RFID/NFC được cài đặt trước trong code ESP32
  • Người dùng chạm thẻ RFID/NFC lên đầu đọc RFID/NFC
  • Đầu đọc đọc UID từ thẻ
  • ESP32 nhận UID từ đầu đọc
  • ESP32 so sánh UID đã đọc với các UID được định nghĩa trước
  • Nếu UID khớp với một trong các UID được định nghĩa trước, ESP32 điều khiển servo motor đến 90°
  • Nếu thẻ được chạm lại, ESP32 điều khiển servo motor trở về 0°
  • Quá trình này lặp lại vô hạn

Sơ Đồ Kết Nối

ESP32 RFID rc522 động cơ servo sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.

※ 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 các nhãn được in trên module. Hình ảnh trên hiển thị sơ đồ chân của các module từ nhà sản xuất DIYables.

Code ESP32 - Thẻ RFID/NFC Đơn Lẻ

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 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/esp32/esp32-rfid-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <ESP32Servo.h> #define SS_PIN 5 // ESP32 pin GPIO5 #define RST_PIN 27 // ESP32 pin GPIO27 #define SERVO_PIN 32 // ESP32 pin GPIO32 connects to servo motor MFRC522 rfid(SS_PIN, RST_PIN); Servo servo; byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; int angle = 0; // the current angle of servo motor void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 servo.attach(SERVO_PIN); servo.write(angle); // rotate servo motor to 0° 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] == authorizedUID[0] && rfid.uid.uidByte[1] == authorizedUID[1] && rfid.uid.uidByte[2] == authorizedUID[2] && rfid.uid.uidByte[3] == authorizedUID[3] ) { Serial.println("Authorized Tag"); // change angle of servo motor if (angle == 0) angle = 90; else //if(angle == 90) angle = 0; // control servo motor arccoding to the angle servo.write(angle); Serial.print("Rotate Servo Motor to "); Serial.print(angle); Serial.println("°"); } else { Serial.print("Unauthorized Tag 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 } } }

Các Bước Nhanh

  • Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy xem ESP32 - Cài Đặt Phần Mềm.
  • Thực hiện kết nối theo hình ảnh trên.
  • Kết nối board ESP32 với PC qua cáp micro USB
  • Mở Arduino IDE trên PC của bạn.
  • Chọn đúng board ESP32 (ví dụ: ESP32 Dev Module) và cổng COM.
  • Click vào biểu tượng Libraries ở thanh bên trái của Arduino IDE.
  • Tìm kiếm "MFRC522", sau đó tìm thư viện của GithubCommunity
  • Click nút Install để cài đặt thư viện MFRC522.
ESP32 mfrc522 thư viện
  • Nhập ESP32Servo vào ô tìm kiếm, sau đó tìm thư viện servo của Kevin Harrington, John K. Bennett.
  • Click nút Install để cài đặt thư viện servo motor cho ESP32.
ESP32 động cơ servo thư viện

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:

  • Copy code trên và mở với Arduino IDE
  • Click nút Upload trên Arduino IDE để tải code lên ESP32
  • Mở Serial Monitor
  • Chạm thẻ RFID/NFC lên module RFID-RC522
  • Lấy UID trên Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Unauthorized Tag 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 20 của code trên. Ví dụ, thay đổi byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; THÀNH byte authorizedUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Tải code lên ESP32 một lần nữa
  • Chạm thẻ RFID/NFC lên module RFID-RC522
  • Bạn sẽ thấy servo motor xoay đến 90°
  • Xem kết quả trên Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Chạm cùng thẻ RFID/NFC lên module RFID-RC522 một lần nữa
  • Bạn sẽ thấy servo motor xoay về 0°
  • Xem kết quả trên Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90° Authorized Tag Rotate Servo Motor to 0°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Chạm thẻ RFID/NFC khác lên module RFID-RC522
  • Xem kết quả trên Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90° Authorized Tag Rotate Servo Motor to 0° Unauthorized Tag with UID: BD 1E 1D 00
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code ESP32 - Nhiều Thẻ RFID/NFC

Chúng ta có thể cho phép nhiều thẻ RFID/NFC điều khiển servo motor. Code dưới đây sử dụng hai thẻ làm ví dụ.

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 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/esp32/esp32-rfid-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <ESP32Servo.h> #define SS_PIN 5 // ESP32 pin GPIO5 #define RST_PIN 27 // ESP32 pin GPIO27 #define SERVO_PIN 32 // ESP32 pin GPIO32 connects to servo motor MFRC522 rfid(SS_PIN, RST_PIN); Servo servo; byte authorizedUID1[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte authorizedUID2[4] = {0x30, 0x01, 0x8B, 0x15}; int angle = 0; // the current angle of servo motor void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 servo.attach(SERVO_PIN); servo.write(angle); // rotate servo motor to 0° 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] == 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"); changeServo(); } 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"); changeServo(); } else { Serial.print("Unauthorized Tag 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 } } } void changeServo() { // change angle of servo motor if (angle == 0) angle = 90; else //if(angle == 90) angle = 0; // control servo motor arccoding to the angle servo.write(angle); Serial.print("Rotate Servo Motor to "); Serial.print(angle); Serial.println("°"); }

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

COM6
Send
Tap RFID/NFC tag on reader Authorized Tag 2 Rotate Servo Motor to 90° Authorized Tag 1 Rotate Servo Motor to 0°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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

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.