Trang chủ —› Bài giảng chương trình giáo dục phổ thông —› Hướng dẫn lập trình thẻ từ RFID với arduino – Trần Huỳnh Anh

Hướng dẫn lập trình thẻ từ RFID với arduino – Trần Huỳnh Anh

3 Tháng Mười Hai,2018 Đăng bởi: admin

 

ĐỌC THẺ NFC (CÒN GỌI LÀ THẺ TỪ RFID) BẰNG MODULE RFID-RC522

Tác giả: Trần Huỳnh Anh

I. Giới thiệu thẻ từ RFID

NFC (Near-Field Communications) hay còn gọi nôm na là thẻ từ RFID là một công nghệ kết nối không dây với một phạm vi ngắn, nó sử dụng cảm ứng từ để thực hiện kết nối. Hiện nay có nhiều loại thẻ sử dụng công nghệ kết nối NFC và được ứng dụng rất nhiều trong cuộc sống như thẻ giữ xe, thẻ mở đóng cửa, thẻ thang máy….

Trong bài này mình sẽ hướng dẫn các bạn sử dụng module RFID – RC522 (Hình 1) để đọc dữ liệu trong thẻ NFC.

Hình 1: Module RFID – RC522

 

Video hướng dẫn

  1. Chuẩn bị

Arduino UNO r3               x 1

Module RFID                     x 1

Thẻ NFC                             x 2

Dây test board đực cái      x 7

Cáp Arduino                      x 1

Ngoài ra chúng ta còn cần một máy tính (computer) đã cài phần mềm Arduino để lập trình điều khiển Arduino và thư viện MFRC522. Trong bài viết này mình sử dụng phần mềm Arduino phiên bản 1.8.7. Cài đặt thư viện MFRC522 ta tham khảo ở phụ lục.

Bài viết liên quan

Bộ kit arduino robot

Khóa học lập trình điều khiển

 

II. Nối dây và cài đặt

  1. Cách nối dây:

Arduino UNO R3RFID – RC522
bán Arduino Uno R3
Bán Arduino Uno R3
10SDA
chan_cam_the_rfid
chan_cam_the_rfid

 

13SCK
11MOSI
12MISO
 IRQ
GNDGND
9RST
3.3V3.3V

 

Nối dây thẻ RFID
Nối dây thẻ RFID

Hình 2: Sơ đồ kết nối

  1. Cài đặt

2.1 Đọc toàn bộ thông tin của thẻ.

Để đọc toàn bộ thông tin của thẻ ta nhập vào dòng code như sau: Code mẫu chuẩn lấy ở đây

#include <SPI.h>

#include <MFRC522.h>

 

#define RST_PIN         9

#define SS_PIN          10

 

MFRC522 mfrc522(SS_PIN, RST_PIN);

 

void setup() {

Serial.begin(9600);

SPI.begin();

mfrc522.PCD_Init();

}

 

void loop() {

if ( ! mfrc522.PICC_IsNewCardPresent()) {

return;

}

if ( ! mfrc522.PICC_ReadCardSerial()) {

return;

}

mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

}

 

Sau khi nạp thành công, ta mở Serial monitor lên, đặt thẻ  NFC vào và đợi một chút để arduino đọc và hiển thị toàn thông tin của thẻ lên như hình 3. Các thông tin của thẻ sẽ được hiển thị ở dạng thập lục phân.

Kết quả đọc thẻ rfid
Kết quả đọc thẻ rfid

Hình 3: Thông tin toàn bộ thẻ

Lưu ý: Trong quá trình đọc thẻ, ta không nên rút thẻ ra, vì điều đó làm ảnh hưởng đến quá trình đọc thẻ của thiết bị.

2.2 Đọc UID của thẻ

Mở Arduino lên và nhập vào đoạn code bên dưới. Đây là đoạn code dùng để đọc uid của thẻ NFC và in ra dưới dạng hệ thập lục phân. Code mẫu chuẩn lấy tại đây

 

#include <SPI.h>

#include <MFRC522.h>

 

#define RST_PIN         9

#define SS_PIN          10

 

MFRC522 mfrc522(SS_PIN, RST_PIN);

 

void setup() {

Serial.begin(9600);

SPI.begin();

mfrc522.PCD_Init();

Serial.println(“Khởi tạo thành công, đang chờ đọc thẻ…”);

}

 

void loop() {

if ( ! mfrc522.PICC_IsNewCardPresent()) {

return;

}

if ( ! mfrc522.PICC_ReadCardSerial()) {

return;

}

Serial.println(“ID thẻ: “);

 

for (byte i = 0; i < mfrc522.uid.size; i++) {

Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “);

Serial.print(mfrc522.uid.uidByte[i], HEX);

}

Serial.println(“”);

mfrc522.PICC_HaltA();

mfrc522.PCD_StopCrypto1();

}

 

Khi in ra dữ liệu dạng thập lục phân, các giá trị có giá trị nhỏ hơn 0x10 thì sẽ in ra là các số có 1 chữ số. Dòng Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “); để kiểm tra nếu các giá trị nhỏ hơn 0x10 thì sẽ in thêm số 0 cho đẹp.

Sau khi nạp chương trình vào arduino, ta đưa thẻ vào module RFID-RC522 thì được các kết quả như hình 4.

Kết quả đọc thẻ rfid 2
Kết quả đọc thẻ rfid 2

Hình 4: Thông tin UID của các thẻ

2.3  Đọc nội dung bất kỳ trong thẻ NFC

Đoạn code sau đây dùng để đọc một thông tin bất kỳ của thẻ NFC. Tuy nhiên mỗi block khi đọc sẽ tương ứng với một trailer của nó. Chúng ta cần hiểu rõ cách bố trí dữ liệu của thẻ này để có thể đọc được dữ liệu từ nó.

Thẻ MIFARE (thuộc loại thẻ NFC chúng ta đang nói tới) chúng ta đang sử dụng có 16 sector (0-15), tương ứng với 64 block (0-63). Mỗi sector sẽ gồm 3 block để ghi thông tin và một block trailer (block cao nhất của sector đó). Mỗi block sẽ có 16 byte có thể ghi thông tin được (tương đương với việc chúng ta có thể ghi 16 ký tự vào đây). Các block trailer của 16 sector lần lượt là 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23, 19, 15, 11, 7, 3. Khi đọc một block, chúng ta sẽ xác định số blocktrailer của nó bằng hai bước sau:

Bước 1: Xem thử block đó có trùng với blocktrailer nào không, nếu trùng thì blocktrailer = block.

Bước 2: Nếu block không trùng với blocktrailer thì ta lần lượt cộng các giá trị 1, 2, 3 cho đến khi nó bằng một blocktrailer. Lúc này blocktrailer này sẽ là blocktrailer của block ta cần đọc.

VD:    – Đọc block 7 thì block trailer là 7 (bước 1, block = blocktrailer)

– Đọc block 52 thì block trailer là 55 (bước 2,  blocktrailejjjr = block + 3)

Code mẫu chuẩn ở đây nhé

#include <SPI.h>

#include <MFRC522.h>

 

#define RST_PIN         9

#define SS_PIN          10

 

MFRC522 mfrc522(SS_PIN, RST_PIN);

MFRC522::MIFARE_Key key;

 

void setup() {

Serial.begin(9600);

SPI.begin();

mfrc522.PCD_Init();

 

for (byte i = 0; i < 6; i++) {

key.keyByte[i] = 0xFF;

}

Serial.println(“Chờ nhận thẻ…”);

}

 

void loop() {

if ( ! mfrc522.PICC_IsNewCardPresent()) {

return;

}

if ( ! mfrc522.PICC_ReadCardSerial()) {

return;

}

byte block = 7;

byte trailerBlock = 7;

byte buffer1[18];

byte len = sizeof(buffer1);

mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,

trailerBlock, &key, &(mfrc522.uid));

mfrc522.MIFARE_Read(block, buffer1, &len);

 

Serial.print(“Địa chỉ block dòng thứ “);

Serial.print(block);

Serial.print(” là: “);

 

for (uint8_t i = 0; i < len; i++){

Serial.print(buffer1[i], HEX);

Serial.print(” “);

}

Serial.println(” “);

mfrc522.PICC_HaltA();

mfrc522.PCD_StopCrypto1();

}

Sau khi nạp chương trình vào Arduino, ta để thẻ NFC vào và nhận được thông tin như hình 5.

Thông tin toàn bộ thẻ rfid
Thông tin toàn bộ thẻ rfid

Hình 5: Đọc block thứ 7 trong thẻ

III. Bài tập

Xây dựng hệ thống đóng mở cửa bằng thẻ NFC.

Mô tả hệ thống: Hệ thống gồm một cánh cửa đóng mở tự động bằng động cơ. Bên cạnh cửa có đầu đọc thẻ NFC, người dùng sẽ dùng thẻ để quét vào đây. Nếu đúng thẻ (đúng uid quy ước có thể mở cửa) thì đèn xanh sáng và cửa sẽ mở ra trong một khoảng thời gian t (khoảng 3 – 5 giây), ngược lại đèn đỏ sáng lên và cửa không mở.

Hướng dẫn thực hiện: Đặt một biến kiểu byte có đủ độ lớn tương ứng với uid của một thẻ NFC, và gắn giá trị uid của thẻ đó vào biến này. Khi đọc được thẻ NFC, so sánh thẻ đó có giống với uid của biến này không. Nếu giống thì ghi chân có đèn xanh tín hiệu là HIGH và gọi hàm mở cửa (động cơ quay, kéo cửa mở, Delay một khoảng thời gian t thì động cơ quay ngược lại để đóng cửa), ngược lại thì ghi chân có đèn đỏ tín hiệu HIGH.

  1. Phụ lục

Cài đặt thư viện MFRC522 cho phần mềm arduino 1.8.7. Yêu cầu máy tính phải có kết nối mạng mới thực hiện được. Chúng ta mở phần mềm arduino và làm theo hướng dẫn như hình 6.

Thư viện RFID
Thư viện RFID

Hình 6: Chọn trình quản lý thư viện của arduino

Sau khi chọn Manage Libraries…Ta đợi một lát để chương trình cập nhật lại các tập tin. Sau khi chương trình cập nhật xong, ta gõ vào phần tìm kiếm “MFRC522” như hình 7.

Thư viện RFID
Thư viện RFID

Hình 7: Tìm kiếm thư viện MFRC522

Sau khi cài thành công module MFRC522. Chương trình sẽ hiển thị thông báo đã cài đặt (INSTALLED) như hình 8.

Thư viện RFID
Thư viện RFID

Hình 8: Sau khi cài đặt thành công phiên bản MFRC522 ver 1.4.3


Notice: Undefined variable: category_list in /home/lapt0260/public_html/wp-content/themes/lap-trinh/template-parts/posts/content-single.php on line 38
Thẻ: , .

Notice: WP_Query được gọi với một tham số đã bị loại bỏ kể từ phiên bản 3.1.0! Hãy sử dụng ignore_sticky_posts thay cho caller_get_posts (sẽ sớm bị loại bỏ) in /home/lapt0260/public_html/wp-includes/functions.php on line 4080

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *