Arduino RFID/NFC Động cơ Servo

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

Điều này có thể được áp dụng để khóa hoặc 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×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×động cơ servo
1×5V 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à động cơ servo

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

Arduino Arduino RFID động cơ servo thành phần

Cách hoạt động

  • Một số UID của thẻ RFID/NFC được thiết lập sẵn trong mã Arduino.
  • Người dùng chạm thẻ RFID/NFC lên đầu đọc RFID/NFC.
  • Đầu đọc đọc UID từ thẻ.
  • Arduino nhận được 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 điều khiển servo quay tới 90°.
  • Nếu thẻ được chạm lần nữa, Arduino điều khiển servo quay về 0°.
  • Quá trình này được lặp vô hạn.

Sơ đồ đấu dây

sơ đồ nối dây động cơ servo với Arduino RFID rc522

This image is created using Fritzing. Click to enlarge image

Trong sơ đồ mạch ở trên, một bộ nguồn 5V duy nhất cung cấp nguồn cho Arduino trực tiếp, cho động cơ servo trực tiếp, và cho mô-đun RC522 (gián tiếp thông qua chân 3.3V của Arduino).

Để đơn giản hóa quá trình, các chân của module 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 ngừng hoạt động đúng ở một số trường hợp khi các chân đầu ra của Arduino phát ra điện áp 5V, trong khi các chân của module RC522 hoạt động bình thường ở điện áp 3.3V. Do đó, 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 module RC522. Để biết thêm chi tiết, xin tham khảo tài liệu 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 cho thấy cách điều chỉnh từ 5V xuống 3.3V bằng cách sử dụng các điện trở:

sơ đồ đấu nối Arduino RFID rc522 với nguồn ổn áp

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Thứ tự các chân có thể thay đổi tùy theo nhà sản xuất. LUÔN SỬ DỤNG NHÃN 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.

Bảng nối dây của mô-đun RFID/NFC RC522

RFID/NFC RC522 Arduino
SS → 10
SCK → 13
MOSI → 11
MISO → 12
IRQ(not connected)
GNDGND
RST → 9
VCC → 3.3V

Bảng nối dây của động cơ servo

Servo Motor Arduino 5V DC Adapter
VCC (red) → positive
GND (brown) → negative
SIG (yellow) → A5

Bảng đấu dây cho Adapter 5V DC

5V DC Adapter Servo Motor Arduino
PositiveVCC
Positive -> Vin
NegativeGND
Negative GND

Mã Arduino - Một thẻ RFID/NFC

/* * 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-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 #define SERVO_PIN A5 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 } } }

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

  • Đi tới biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “MFRC522”, sau đó tìm thư viện do GithubCommunity
  • Nhấn nút Cài đặt để cài thư viện MFRC522.
thư viện mfrc522 dành cho Arduino

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 UID của thẻ. Điều này có thể được thực hiện bằng:

  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn vào 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/NFC lên mô-đun RFID-RC522
  • Hiển thị 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 mã ở trên. Ví dụ, đổi byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; thành byte authorizedUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Tải lại mã lên Arduino.
  • Chạm thẻ RFID/NFC lên module RFID-RC522.
  • Bạn sẽ thấy động cơ servo quay đến 90°.
  • Xem đầu ra 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 lại thẻ RFID/NFC giống nhau lên mô-đun RFID-RC522
  • Bạn sẽ thấy động cơ servo quay về vị trí 0°
  • Xem đầu ra 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êm một thẻ RFID/NFC khác lên mô-đun RFID-RC522
  • Xem đầu ra 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  

Mã Arduino - Nhiều thẻ RFID/NFC

Chúng ta có thể cho phép nhiều thẻ RFID/NFC điều khiển động cơ servo. Đ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-nfc-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 #define SERVO_PIN A5 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 đó lần lượt chạm 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/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 mã ở 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.