Học Arduino_Dự án 69:Thiết kế một hệ thống khóa đơn giản dùng RFID

No Comments

I.Giới thiệu về RFID

Trước hết,ta cần phải hiểu về công nghệ RFID,đây  là viết tắt của thuật ngữ tiếng Anh là Radio Frequency Identification có nghĩa là một hệ thống Nhận dạng qua tần số vô tuyến,có thể hiểu,đây là công nghệ dùng kết nối sóng vô tuyến để tự động xác định và theo dõi các thẻ nhận dạng.  Công nghệ này có thể được sử dụng vào các hệ thống quản lý nhân sự,chuỗi cung ứng,quản lý thư viện ,hệ thống thu phí,..

Một hệ thống RFID gồm hai thành phần chính là một bộ phận thu,hay còn gọi là đầu đọc thẻ và một bộ phận truyền nằm trên thẻ có mạch thu thập năng lượng từ các sóng vô tuyến của máy đọc RFID phát ra khi truy vấn. Đầu đọc RFID bao gồm một mô-đun tần số vô tuyến, một bộ điều khiển và một cuộn dây ăng ten tạo ra trường điện từ tần số cao. Thẻ thường là một thành phần thụ động, chỉ bao gồm một ăng-ten và một vi mạch điện tử vì vậy khi đặt gần thẻ với bộ thu nó sẽ tương tác với trường điện từ của bộ thu phát. Cùng với đó, điện áp đặt trong thẻ tạo ra do hiện tượng cảm ứng điện từ khi tương tác giữa thẻ và bộ thu nhận để tạo ra nguồn năng lượng cho vi mạch trên thẻ.

Khi sử dụng thẻ để tương tác với đầu đọc trong điều kiện thẻ đã có nguồn điện tự cung của nó. Thẻ sẽ sử dụng một nguyên lý truyền tải thông điện vô cùng đơn giản,bằng cách bật và tắt ang-ten dưới tác động của sóng điện từ ,phát ra từ thẻ,như một cách tạo ra thông tin dưới dạng bit là 0 và 1. Ngoài ra còn một cách mã hóa và truyền tải khác là tạo ra một trường điện từ để cho ang-ten có thể thu thập tín hiệu và đọc.

II.Giới thiệu về hệ thống khóa cửa dùng RFIDDựa trên nguyên tắc làm việc cơ bản ,kết hợp RFID với một board vi điều khiển thông dụng là Arduino và servo ta có thể thiết kế một hệ thống khóa cửa đơn giản,sử dụng các thẻ dựa trên giao thức MIFARE và đầu đọc RFID MFRC522. Cụ thể là modul đọc thẻ RFID MFRC522 RFID.

Thẻ có bộ nhớ 1Kb và có một vi mạch dùng để mã hóa thông tin dựa trên các phép toán số học, Tần số hoạt động là 13,56MHz và khoảng cách hoạt động lên đến 10 cm tùy thuộc vào ang-ten. Nếu dùng đèn,soi vào thẻ,ta có thể nhìn thấy vi mạch phía bên trong nó.

Đầu đọc thẻ sử dụng giao thức SPI để liên lạc với bảng Arduino và đây là cách chúng ta cần kết nối chúng.Cần lưu ý rằng,khi bạn sử dụng đầu đọc này thì nguồn VCC cấp điện áp phải là chân 3,3V. Khi kết nối module, chúng ta cần tải về thư viện MFRC522 từ GitHub. Thư viện đi kèm với một số ví dụ tốt mà từ đó chúng ta có thể học cách sử dụng mô-đun.Trước tiên, chúng ta có thể tải lên ví dụ “DumpInfo” và kiểm tra xem hệ thống của chúng tôi có hoạt động đúng hay không,bây giờ,khi upload code vào chương trình sau khi đã kết nối modul nhận RC522 ta mở cổng serial monitor lên ,khi đó,ta đưa thẻ vào đầu đọc sẽ nhận được thông tin và hiển thị lên monitor.

Ở đây chúng ta có thể nhận thấy số UID của thẻ cũng như 1 KB bộ nhớ thực sự được chia thành 16 sector, mỗi sector thành 4 khối và mỗi khối có thể lưu trữ 2 byte dữ liệu. Trong hướng dẫn này ta chỉ sử dụng số UID của thẻ.

III.Phần cứng và kết nối mạchTất cả các thành phần trong dự án điều có thể tìm thấy một cách dễ dàng trên thị trường với mức giá có thể nói là phù hợp với các bạn học sinh,sinh viên.Tất cả các thành phần bao gồm.

Số tt Tên sản phẩm Số lượng(cái) Giá tiền(đồng) Tổng tiền(đồng)
1 Cảm biến màu TCS3200 1 90000    311000
2 Động cơ servo 2 35000
3 Board Arduino Nano 1 75000
4 Công tắc 1 5000
5 Jack cắm nguồn 1 1000
6 Modul RFID RC522 1 75000
7 LCD 16X2 1 30000

Tất cả những thành phần thiết bị đó ta sẽ kết nối theo sơ đồ sau.

Trong hệ thống này,cảm biến tiệm cận CNY70 đóng vai trò như cảm biến phát hiện cửa đã được đóng hay chưa,servo như một cơ cấu khóa,màn hình LCD hiển thị các thông số về vị trí của cánh cửa cũng như trạng thái của hệ thống,bộ RC522 đóng vai trò như ổ khóa và chìa khóa của cánh cửa.Nguyên lý làm việc khá đơn giản,đầu tiên,ta thiết lập một mã khóa cho hệ thống qua thẻ quét và đầu đọc thẻ,nếu ta quét một thẻ không đúng thì coi như truy cập sai và hệ thống không phản hồi,ngược lại,khi ta quét đúng thẻ mã hóa thì hệ thống sẽ có phản hồi và thông tin được board Arduino xử lý làm servo hoạt động để mở cơ cấu khóa,khi đó cảm biến tiệm cận sẽ xác định xem cửa còn khóa ay không khi servo hoạt động. Sauk hi đã quét thẻ và đóng cửa một lần nữa,cảm biến tiệm cận sẽ xác định thông tin cửa đã được đóng hay chưa,nếu cửa đã đóng lại thì nó sẽ phát ra tín hiệu làm cho cơ cấu khóa của servo khóa cánh cửa lại.

IV.Chương trình

/*

* Arduino Door Lock Access Control Project

*

* by Dejan Nedelkovski, www.HowToMechatronics.com

*

* Library: MFRC522, https://github.com/miguelbalboa/rfid

*/

 

#include <SPI.h>

#include <MFRC522.h>

#include <LiquidCrystal.h>

#include <Servo.h>

 

#define RST_PIN   9

#define SS_PIN    10

 

byte readCard[4];

char* myTags[100] = {};

int tagsCount = 0;

String tagID = “”;

boolean successRead = false;

boolean correctTag = false;

int proximitySensor;

boolean doorOpened = false;

 

// Create instances

MFRC522 mfrc522(SS_PIN, RST_PIN);

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)

Servo myServo; // Servo motor

 

void setup() {

// Initiating

SPI.begin();        // SPI bus

mfrc522.PCD_Init(); //  MFRC522

lcd.begin(16, 2);   // LCD screen

myServo.attach(8);  // Servo motor

 

myServo.write(10); // Initial lock position of the servo motor

// Prints the initial message

lcd.print(“-No Master Tag!-“);

lcd.setCursor(0, 1);

lcd.print(”    SCAN NOW”);

// Waits until a master card is scanned

while (!successRead) {

successRead = getID();

if ( successRead == true) {

myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Master Tag Set!”);

tagsCount++;

}

}

successRead = false;

printNormalModeMessage();

}

 

void loop() {

int proximitySensor = analogRead(A0);

// If door is closed…

if (proximitySensor > 200) {

if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue

return;

}

if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue

return;

}

tagID = “”;

// The MIFARE PICCs that we use have 4 byte UID

for ( uint8_t i = 0; i < 4; i++) {  //

readCard[i] = mfrc522.uid.uidByte[i];

tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable

}

tagID.toUpperCase();

mfrc522.PICC_HaltA(); // Stop reading

 

correctTag = false;

// Checks whether the scanned tag is the master tag

if (tagID == myTags[0]) {

lcd.clear();

lcd.print(“Program mode:”);

lcd.setCursor(0, 1);

lcd.print(“Add/Remove Tag”);

while (!successRead) {

successRead = getID();

if ( successRead == true) {

for (int i = 0; i < 100; i++) {

if (tagID == myTags[i]) {

myTags[i] = “”;

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(”  Tag Removed!”);

printNormalModeMessage();

return;

}

}

myTags[tagsCount] = strdup(tagID.c_str());

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(”   Tag Added!”);

printNormalModeMessage();

tagsCount++;

return;

}

}

}

successRead = false;

// Checks whether the scanned tag is authorized

for (int i = 0; i < 100; i++) {

if (tagID == myTags[i]) {

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(” Access Granted!”);

myServo.write(170); // Unlocks the door

printNormalModeMessage();

correctTag = true;

}

}

if (correctTag == false) {

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(” Access Denied!”);

printNormalModeMessage();

}

}

// If door is open…

else {

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(” Door Opened!”);

while (!doorOpened) {

proximitySensor = analogRead(A0);

if (proximitySensor > 200) {

doorOpened = true;

}

}

doorOpened = false;

delay(500);

myServo.write(10); // Locks the door

printNormalModeMessage();

}

}

 

uint8_t getID() {

// Getting ready for Reading PICCs

if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue

return 0;

}

if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue

return 0;

}

tagID = “”;

for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID

readCard[i] = mfrc522.uid.uidByte[i];

tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable

}

tagID.toUpperCase();

mfrc522.PICC_HaltA(); // Stop reading

return 1;

}

 

void printNormalModeMessage() {

delay(1500);

lcd.clear();

lcd.print(“-Access Control-“);

lcd.setCursor(0, 1);

lcd.print(” Scan Your Tag!”);

}

 

Sản phẩm được quan tâm

Nhận bài viết mới

Các bài viết chia sẻ đến cộng đồng rất chât lượng, mang lại rất nhiều kiến thức mới. Đừng bỏ lỡ bất kỳ bài viết nào của chung tối, hãy đăng ký để nhận bài viết mới qua Mail của bạn

Đăng ký để không bỏ lỡ bài viết nào!

Fields marked with an * are required

Danh mục




More from our blog

See all posts
No Comments
 

Leave a Comment