Professional Documents
Culture Documents
Đồ án:
NGHIÊN CỨU, THIẾT KẾ CHẾ TẠO MÔ HÌNH
CHỐT KHÓA ĐIỆN TỬ TỰ ĐỘNG RFID – SOLENOID
ii
TÓM TẮT
Tên đồ án: Nghiên cứu, thiết kế mô hình chốt khóa điện tử tự động rfid – solenoid.
Trong thực tế đã có những ứng dụng về thẻ từ RFID cụ thể là các bãi giữa xe tự
động, gian hàng tự động, văn phòng, khách sạn... Để hiểu rõ hơn về cách thức hoạt động
của giao tiếp thẻ từ RFID – Solenoid. Bộ xử lý sử dụng vi điều khiển Arduino Nano,
thực hiện truyền tín hiệu đến bộ phận công tác và lưu dữ liệu trên bộ nớ EEPROM của
Arduino – Bộ nhớ không mất đi khi mất nguồn cấp. Từ lý thuyết về nhận tín hiệu từ nút
nhấn, cảm biến, xuất tín hiệu đến bộ phận công tác, ứng dụng điện tử công suất trong
tính toán thiết kế mạch nguồn, xuất thông tin trên LCD và gửi trả dữ liệu về Serial
Monitor trong quá trì phát triển (dev) và gỡ lỗi (debug). Từ đó học đưa kiến thức vào
thực tiễn, giúp sinh viên nắm bắt được kiến thức thực tế, vận dụng và phát triển trong
tương lai.
Tiến hành chế tạo thử nghiệm từ đó khảo nghiệm sơ bộ và đánh giá khả năng làm
việc của thiết bị.
Thời gian thực hiện: 1 tháng, từ tháng 01/12/2016 đến tháng 31/12/2016.
Lớp: DH14CD. Khoa /Bộ môn: Khoa Cơ khí – Công nghệ/Bộ môn Cơ điện tử
Họ và tên giáo viên hướng dẫn (học hàm, học vị): ThS. Nguyễn Võ Ngọc Thạch
Đơn vị chủ trì: Khoa Cơ khí – Công nghệ, Trường Đại học Nông Lâm Tp.HCM
Mục đích: Hiện nay trên thị trường có rất nhiều ứng dụng từ vi điều khiển, thiết kế mô
hình sẽ giúp sinh viên nắm bắt và vận dụng kiến thức đã có trong phát triển kĩ năng và
làm việc thực tế. Từ đó đưa ra các sản phẩm ngày càng hoàng thiện giá thành cho sản
xuất rẻ hơn, thiết bị trở nên nhỏ gọn, dễ lắm đặt.
iii
MỤC LỤC
TÓM TẮT ..................................................................................................................... ii
1. TỔNG QUAN .............................................................................................................1
1.1 Đặt vấn đề ..............................................................................................................1
1.2 Mạch vi điều khiển arduino ...................................................................................1
IC Mega328P AU 1632 ............................................................................................2
Arduino Nano ...........................................................................................................3
1.3 Giới thiê ̣u về Arduino IDE và ngôn ngữ lâ ̣p trình cho Arduino ............................4
1.4 RFID (Radio Frequency Identification) .................................................................5
Cấu trúc hệ thống RFID ............................................................................................5
1.5 Mạch RFID RC522 ................................................................................................ 7
1.6 LCD 16x2 (1602A) – Thư viện LyquidCrystal trong Arduino IDE ......................7
Giới thiê ̣u về LCD 1602A ........................................................................................7
Thư viện LyquidCrystal.h .........................................................................................9
Phương pháp điề u khiể n ma ̣ch hiể n thi ..................................................................
̣ 10
2. THIẾT KẾ VÀ CHẾ TẠO......................................................................................11
2.1 Thiết kế mạch nguồn. ...........................................................................................11
2.1.1 Một số tính năng chính của LM2576 ............................................................. 11
2.1.2 Sơ đồ cấu tạo của LM2576 ............................................................................11
2.1.3 Thông số chính của LM2576 .........................................................................12
2.1.4. Thiết kế layout .............................................................................................. 13
2.2 Thiết kế mạch điều khiển với Arduino, LCD, Relay ...........................................14
2.2.1 Thử nghiệm trên Proteus 8 ............................................................................14
2.2.2 Kết quả thử nghiệm........................................................................................16
2.3 Giải thuật điều khiển mô hình khóa điện sử dụng RFID – Solenoid ...................24
2.4 Bộ nhớ EEPROM .................................................................................................25
3. KẾT QUẢ VÀ KHẢO NGHIỆM ...........................................................................27
3.1 Chế tạp đế nâng mô hình, tránh nhiễu, chập chạp do kim loại rơi vào ................27
4. KẾT LUẬN VÀ KIẾN NGHỊ .................................................................................30
4.1 Kết luận ................................................................................................................30
4.2 Kiến nghị ..............................................................................................................31
Tài liệu tham khảo .......................................................................................................32
iv
DANH MỤC HÌNH
v
DANH MỤC BẢNG
vi
1. TỔNG QUAN
1
IC Mega328P AU 1632
Arduino Nano là board Arduino rất nhỏ, sử dụng IC Mega328 AU 1632, đây
là phầ n quan tro ̣ng nhất trong ma ̣ch Arduino Nano.
Hình 1: ATMEGA328P
+ VCC: cung cấ p điê ̣n áp
+ GND: nố i mass
+ Port B (PB7:0): là một 8-bit bi-directional cổng I / O với điện trở kéo
lên bên trong (được chọn cho mỗi bit)
+ Port C (PC5:0): là một 7-bit bi-directional cổng I / O với điện trở kéo
lên bên trong (được chọn cho mỗi bit).
+ PC6/RESET: Nếu RSTDISBL Fuse được lập trình, PC6 được sử dụng như một
I / O pin. Lưu ý rằng các đặc tính điện của PC6 khác với các chân khác của Port C. Nếu
RSTDISBL Fuse chưa đươ ̣c lâ ̣p triǹ h, PC6 được sử dụng như một đầu vào Reset.
+ Port D: là một 8-bit bi-directional cổng I / O với điện trở kéo lên bên trong
+ AREF: là cổ ng tương tự cho các chuyể n đổ i AD
+ AVCC: AVCC là điện áp cung cấp pin cho chuyể n đổ i AD.
IC Mega328P AU 1632 là chip Atmel 8-bit AVR RISC AVR là chip vi điều khiển
8 bits với cấu trúc tập lệnh đơn giản hóa-RISC(Reduced Instruction Set Computer), một
kiểu cấu trúc đang thể hiện ưu thế trong các bộ xử lí. AVR có nhiều đặc tính hơn hẳn,
hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về chức năng:
- Không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR, thậm chí
không cần nguồn tạo xung clock cho chip (thường là các khối thạch anh).
- Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch nạp chỉ cần
vài điện trở là có thể làm được. Một số AVR còn hỗ trợ lập trình on – chip bằng
bootloader không cần mạch nạp…
2
- Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích C.
Arduino Nano
Board Arduino Nano 5V 16MHz mặc định sử dụng nguồn 5V và IC ATmega328
chạy ở xung nhịp 16MHZ. Nhưng trên board có sẵn ngõ vào VIN (RAW) để cấp nguồn
thông qua mạch điều áp. Nguồn vào cho ngõ RAW có thể từ 3.3V - 12V (max 12V)
+ RAW: cấp nguồn thông qua mạch điều áp
+ Vcc: cấp nguồn 5V hoặc 3.3V
Thông số về bô ̣ nhớ
+ Flash: 32k Bytes
+ EEPROM: 1K Bytes
+ RAM: 2K Bytes
Vì sử dụng chung dòng chip ATmega328 nên việc lập trình và thiết kế ứng dụng
hoàn toàn tương tự board Arduino Uno R3. Ngoài ra có 1 sự khác biệt nhỏ là board
Arduino Nano có tới 8 cổng analog.
Khi cần nạp code cho board chỉ cần sử dụng dây nối USB Type B để kết nối với
máy tính vì trên board đã tính hợp sẵn mạch nạp và giao tiếp sang chuẩn Serial UART
để nạp cho board Arduino Nano và sau khi nạp xong, có thể rút dây cáp ra và cấp nguồn
cho board tự hoạt động độc lập. Cách kết nối board Arduino Nano:
Khi sử dụng nguồn ngoài, chúng ta sẽ cấp nguồn 6V – 9V vào chân “RAW” để
cấp nguồn nuôi cho board, chú ý là chân “RAW” chứ không phải là chân “VCC” vì chân
VCC chính là ngõ vào hoặc ra điện áp 5V của mạch, nếu chúng ta cấp nhầm nguồn >
5V vào chân VCC sẽ gây ra cháy Chip Atmega328-AU trên board.
Arduino Nano có 30 cổ ng với:
+ Cổ ng Digital: 2-13
+ Analog: AD0-AD7
+ Chân nguồ n: +9V, +5V, Ground
+ RX, TX
Cũng như board Arduino Pro Mini, board Arduino Nano cũng có thêm 2 chân
Analog là A6 và A7 giúp tăng số chân đọc Analog cho các ứng dụng cần đến nhiều chân
Analog.
Lưu ý: chân A6 và A7 chỉ có thể đọc không thể xuất.
3
Hình 2: Sơ đồ chân Arduino Nano
1.3 Giới thiêụ về Arduino IDE và ngôn ngữ lâ ̣p trin ̀ h cho Arduino
Thiết kế bo ma ̣ch nhỏ gọn, trang bi nhiề
̣ u tính năng thông du ̣ng mang la ̣i nhiề u lơ ̣i
thế cho Arduino, tuy nhiên sức ma ̣nh thực sự của Arduino chính là nằ m ở phầ n mề m.
Môi trường lập trình đơn giản dễ sử du ̣ng, ngôn ngữ lâ ̣p trin
̀ h Wiring dễ hiể u và dựa trên
nền tảng C/c++ rất quen thuộc với người làm kỹ thuâ ̣t. Và quan tro ̣ng là số lươ ̣ng thư
viê ̣n code đươ ̣c viế t sẵn và chia sẻ bởi cô ̣ng đồ ng mở là cực kỳ lớn.
Arduino IDE là phầ n mề m dủng để lâ ̣p triǹ h cho Arduino, môi trường lâ ̣p trình
4
Arduino IDE có thể cha ̣y trên ba nề n tảng phổ biế n nhấ t hiê ̣n nay là Window, Mac và
Linux. Do có tinh chấ t nguồ n mở nên môi trường lâ ̣p trin
̀ h này hoàn toàn miể n phí và
có thể mở rô ̣ng thêm bởi người dùng có kinh nghiê ̣m.
Ngôn ngữ lâ ̣p triǹ h có thể đươ ̣c mở rô ̣ng thông qua các thư viê ̣n C++. Và ngôn ngữ
lâ ̣p trình này dựa trên nề n tảng ngôn ngữ C của AVR nên người dùng hoàn toàn có thể
nhúng code viế t bẳ ng AVR vào chương triǹ h. Hiê ̣n ta ̣i, Arduino IDE có thể tải từ trang
chủ (http://arduino.cc/) bao gồ m nhiề u phiên bản khác nhau kèm theo những tin
́ h năng
bổ sung.
Hệ thống RFID gồm hai thành phần chính: thẻ RFID (RFID tag) và đầu đọc
(reader). Thẻ RFID có gắn chip silicon và ăng ten radio dùng để gắn vào đối tượng quản
5
lý như sản phẩm, hàng hóa, động vật hoặc ngay cả con người… Thẻ RFID có kích thước
rất nhỏ, cỡ vài cm. Bộ nhớ của con chip có thể chứa từ 96 đến 512 bit dữ liệu. Đầu đọc
reader cho phép giao tiếp với thẻ RFID qua sóng radio ở khoảng cách trung bình từ 0,5-
30 mét, từ đó truyền dữ liệu về hệ thống máy tính trung tâm.
Công nghệ RFID được ứng dụng rộng rãi trong nhiều lĩnh vực, nhất là trong quản
lý và tồn trữ hàng hóa. Ví dụ, dùng những thẻ RFID theo dõi nhiệt độ gắn lên hàng hóa
có thể giúp nhà sản xuất theo dõi nhiệt độ trong kho lạnh. Những thẻ này sẽ truyền dữ
liệu qua đầu đọc, đầu đọc liên tục truyền dữ liệu thu được từ các thẻ để truyền về máy
tính trung tâm và lưu lại dữ liệu thu được. Từ đó, nhà sản xuất có thể truy cập vào
internet từ bất cứ nơi nào cũng có thể theo dõi được dữ liệu bảo quản hàng hóa của mình
trong các kho lạnh.
Ngoài ra còn có thể sử dụng thẻ RFID cấy vào vật nuôi để nhận dạng nguồn gốc
và theo dõi vật nuôi tránh thất lạc và bị đánh cắp. Trong thư viện, các thẻ RFID được
gắn với các cuốn sách giúp giảm thời gian tìm kiếm và kiểm kê, chống được tình trạng
ăn trộm sách. Một số lĩnh vực có khả năng sử dụng một số lượng lớn các thẻ RFID như
thẻ thông minh, chứng minh nhân dân, hộ chiếu điện tử, hàng hóa trong siêu thị, quản
lý hành lý trong hàng không, hệ thống giao thông công cộng, các ngành may mặc, giày
dép...
6
1.5 Mạch RFID RC522
Module đọc thẻ RC522 có thể đọc được các loại thẻ có kết nối không dây như
NFC, thẻ từ... Module có các thông số chính như:
Điện áp nuôi: 3.3V;
Dòng điện nuôi :13-26mA
Tần số hoạt động: 13.56MHz
Khoảng cách hoạt động: 0 ~ 60 мм
Cổng giao tiếp: SPI, tốc độ tối đa 10Мbps
Kích thước: 40мм х 60мм
Có khả năng đọc và ghi.
Sử dụng giao tiếp ISP
1.6 LCD 16x2 (1602A) – Thư viện LyquidCrystal trong Arduino IDE
Giới thiêụ về LCD 1602A
7
Ngày nay, thiết bị hiển thị LCD (Liquid Crystal Display) được sử dụng trong rất
nhiều các ứng dụng của VĐK. LCD có rất nhiều ưu điểm so với các dạng hiển thị khác:
Nó có khả năng hiển thị kí tự đa dạng, trực quan (chữ, số và kí tự đồ họa), dễ dàng đưa
vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất ít tài nguyên hệ
thống và giá thành rẽ…
Có rất nhiều loại LCD với nhiều hình dáng và kích thước khác nhau, trên hình 7
là loại LCD thông dụng.
Khi sản xuất LCD, nhà sản xuất đã tích hợp chíp điều khiển bên trong lớp vỏ và
chỉ đưa các chân giao tiếp cần thiết. Các chân này được đánh số thứ tự và đặt tên như
Hình 6:
Ký
Chân Mô tả
hiệu
Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
1 Vss
GND của mạch điều khiển
Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với
2 VDD
VCC=5V của mạch điều khiển
3 VEE Điều chỉnh độ tương phản của LCD.
Chân chọn thanh ghi (Register select). Nối chân RS với logic “0”
(GND) hoặc logic “1” (VCC) để chọn thanh ghi.
4 RS + Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD
(ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở
chế độ “đọc” - read)
8
+ Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên
trong LCD.
Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với logic
5 R/W “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để
LCD ở chế độ đọc.
Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus
DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép
của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp
6 E nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low
transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát
hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ
ở bus đến khi nào chân E xuống mức thấp.
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU.
Có 2 chế độ sử dụng 8 đường bus này :
DB0 - + Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB
7 - 14
DB7 là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới
DB7, bit MSB là DB7
15 - Nguồn dương cho đèn nền
16 - GND cho đèn nền
*Ghi chú: Ở chế độ “đọc”, nghĩa là MPU sẽ đọc thông tin từ LCD thông qua các
chân DBx. Còn khi ở chế độ “ghi”, nghĩa là MPU xuất thông tin điều khiển cho LCD
thông qua các chân DBx.
Đối với Arduino với thư viện có sẵn ta chỉ cần tìm hiểu đến dây mà không cần
quan tâm đến chi tiết về cách thức hoạt động của các thanh ghi dịch trên LCD mà chỉ
cần quan tâm cách thực hiện thư viện LyquidCrystal.h trên Arduino IDE.
Thư viện LiquidCrystal là thư viện điều khiển LCD trên Arduino, nó được xây
dựng để cho các bạn có thể lập trình điều khiển các module LCD ô vuông một cách
nhanh chóng mà không cần phải lập trình nhiều. Thư viện này được viết để phù hợp với
con IC HD44780 (con điều khiển module LCD), tuy nhiên, trên thị trường mình toàn
thấy các con LCD của Trung Quốc và thư viện này vẫn hoạt động tốt. Nghĩa là, bạn chỉ
9
cần mua module LCD về và gắn vào Arduino, nạp code là chạy được, không cần quan
tâm đến IC điều khiển LCD.
Module LCD có thể được điều khiển ở chế độ: 4-bit điều khiển và 8-bit điều
khiển. Với cách dùng ở chế độ 4-bit, bạn cần 7 chân ở Arduino, và nếu muốn dùng hết
khả năng của LCD thì bạn cần 7 + 4 = 11 chân ở Arduino (không cần thiết sử dụng cách
này). Ngoài ra, hầu hết các hàm trong thư viện LiquidCrystal của Arudino ở chế độ 4-
bit thì mọi thứ đều hoạt động tốt. Vì vậy, chúng ta sẽ mắc mạch ở chế độ 4-bit điều khiển
và thực hiện theo phương án này.
10
2. THIẾT KẾ VÀ CHẾ TẠO
2.1 Thiết kế mạch nguồn.
Đầu tiên điện lưới quốc gia thông qua biến áp biến đổi về nguồn 24V sau đó
thông qua diode cầu nắn thành một chiều thông qua LM2576-5V để biến đổi dòng điện
thành 5V cấp cho mạch điều khiển, LCD và Relay 5V hoạt động, do cấp cho nhiều linh
kiện nên đòi hỏi dòng phải cao và điều đó khiến nhóm quyết định không sử dụng IC
7805 trong trường hợp này, dòng max của 7805 chỉ ở 1A và rất nóng, tổn hao trên điện
trở nhiều. Đó cũng là nhược điểm của IC nguồn tuyến tính. Thay vào đó sử dụng
LM2576-5V lắp mạch nguồn xung theo nguyên lý nguồn Buck, với dòng điện định mức
lên đến 3A ra tải.
Ở trên là sơ đồ cấu tạo bên trong của LM2576. Nguyên tắc dựa theo nguồn xung
11
(Nguồn Buck). Điện áp đầu ra được điều chỉnh liên tục để đảm bảo cho điện áp đầu ra
luôn giữa ở một giá trị cố định. Trong sơ đồ cấu tạo thì LM2576 gồm khối : So sánh,
tạo dao động, công suất, quá dòng...
Hình 10: Sơ đồ nguyên lý mạch nguồn 5V, 24V cấp cho mạch
12
Tụ lọc đầu vào các bạn có thể lắp theo datasheet tuy nhiên linh kiện ở Việt Nam
không tốt, thông thường ta dùng tụ 1000uF, còn điện áp thì theo giá trị đầu vào. Ở đây
sử dụng tụ 34V 1000uF. Sau đó lắp thêm 1 con 104 ở sau con 1000uF này.
Đối với diode sử dụng loại 1N5822, ngoài con này hiện nay còn có có thể thay
khác, chỉ cần diode xung và có tần số đáp ứng được là có thể thay thế
Cuộn cảm 100uH là theo tiêu chuẩn, tuy nhiên nên dùng từ 220uH đến 330uF.
Cặp tụ lọc đằng sau cũng vậy. Nên ghép 1 con tụ hóa và 1 tụ 104 để lọc nguồn phía sau.
Ở đây sử dụng tụ 2000uF và một tụ gốm 104.
14
“thẻ đúng” và “thẻ sai” để tiến hành chạy thử, khảo sát các khối trên đã hoạt động tốt
hay chưa.
Thực hiện viết code và nạp vào “SIMULINO NANO”
Bằng cách kích đúp vào phần tử “SIMULINO NANO” sau đó chọn đường dẫn
đến file .HEX xuất ra từ Arduino IDE tại mục Program File.
Code test trên Proteus
//Khai báo thư viện LCD
#include <LiquidCrystal.h>
//Gán biến lcd
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void granted(){
digitalWrite(A3, HIGH);
delay(3000);
digitalWrite(A3, LOW);
}//Chương trình con cho relay đóng trong 3s sau đó mở
void reset(){
lcd.clear();
lcd.print("Da xoa du lieu..");
delay(500);
setup();
loop();
}//Chương trình con khi thực hiên nhấn nút reset dữ liệu
void setup() {
//Khai báo các chân OUT/INPUT sẽ sử dụng
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
digitalWrite(A3,LOW);
digitalWrite(A4,HIGH);
digitalWrite(A5,LOW);
Serial.begin(9600);
lcd.begin(16,2);
//Cho viết lên Monitor và LCD
Serial.println(F("VDK HKI/16-17"));
lcd.print(F("VDK HKI/16-17"));
//Thực hiện cho còi kêu 3 tiếng beep khi khởi động
digitalWrite(A3, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
delay(100);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
delay(300);
digitalWrite(A0, HIGH);
delay(800);
digitalWrite(A0, LOW);
delay(1000);
Serial.println(F("ALL READY"));
lcd.setCursor(0,1);
15
lcd.print(F("All Ready..."));
delay(300);
}
void loop() {
if (digitalRead(A1)) reset(); //Kiểm tra xem có nhấn nút reset không
if (digitalRead(12)){ //Kiểm tra nếu nhấn nút thẻ đúng
Serial.println(F("The chap nhan! "));
lcd.clear();
lcd.print(F("The chap nhan! "));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(300);
digitalWrite(A0, LOW);
digitalWrite(A4, HIGH);
granted();
}
if (digitalRead(13)){ //Kiểm tra nếu nhấn nút thẻ sai
Serial.println(F("Khong dung the "));
lcd.clear();
lcd.print(F("Khong dung the! "));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(300);
digitalWrite(A0, LOW);
digitalWrite(A4, HIGH);
}
}
Hình 15: Quá trình nạp file chương trình vào Proteus 8
2.2.2 Kết quả thử nghiệm
Sau khi tiến hành chạy thử thì ta được kết quả như mong muốn; nhấn reset thì
LCD khởi động lại, nhấn đúng thẻ hiển thị trên LCD và Relay đã đóng, nhấn sai thì hiển
thị LCD và Relay không hiện tượng.
16
Hình 16: Kết quả chạy thử đèn Relay đã sáng sau khi nhấn nút thẻ chấp nhận
Từ đây ta có thể tiếp tục đến với bước tiếp theo là thiết kế layout cho mạch dựa
vào sơ đồ nguyên lý có sẵn và tạo thêm kết nối với mạch RFID RC522.
17
khiển bằng cách nối các chân tín hiệu vào áp +5V.
Hình 18: Quá trình đo đạc thử nghiệm lại kết quả làm mạch
18
Cuối cùng là kết nối vi điều khiển Arduino Nano và nạp chương trình, hoàn
thiện mạch điều khiển chính.
Hình 19: Mạch điều khiển chính sau khi đã gắn vi điều khiển và nạp code
Code Arduino hoàn thiện
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
19
void granted(){
digitalWrite(A3, HIGH);
delay(3000);
digitalWrite(A3, LOW);
}
int getID() {
if (digitalRead(A1)) reset();
if (!mfrc522.PICC_IsNewCardPresent()) {
return 0;
}
if (!mfrc522.PICC_ReadCardSerial()) {
return 0;
}
Serial.println(F("Tim kiem PICC's UID:"));
for (int i = 0; i < 4; i++){
readCard[i] = mfrc522.uid.uidByte[i];
Serial.print(readCard[i],HEX);
Serial.print("");
}
Serial.println("");
mfrc522.PICC_HaltA();
return 1;
}
bool ReadROM(byte idReadCard[4]){
for (int id = 2; id <= 126; id++){
int startid = (id-1)*4+1;
if (EEPROM.read(startid) == idReadCard[0] && EEPROM.read(startid+1) ==
idReadCard[1] && EEPROM.read(startid+2) == idReadCard[2] &&
EEPROM.read(startid+3) == idReadCard[3]) return true;
}
return false;
}
void WriteROM(byte idReadCard[4]){
for (int id = 1; id <= 126; id++){
int startid = (id-1)*4+1;
if (EEPROM.read(startid) == 0 && EEPROM.read(startid+1) == 0 &&
EEPROM.read(startid+2) == 0 && EEPROM.read(startid+3) == 0){
EEPROM.write(startid,idReadCard[0]);
EEPROM.write(startid+1,idReadCard[1]);
EEPROM.write(startid+2,idReadCard[2]);
EEPROM.write(startid+3,idReadCard[3]);
return true;
}
}
return false;
}
void checkMaster() {
lcd.clear();
if (EEPROM.read(1) != 0 || EEPROM.read(2) != 0 || EEPROM.read(3) != 0 ||
EEPROM.read(4) != 0){
Serial.print(F("UID The chu: "));
lcd.print(F("UID The chu:"));
lcd.setCursor(0,1);
for (int i = 1; i < 5; i++) {
Serial.print(EEPROM.read(i),HEX);
lcd.print(EEPROM.read(i),HEX);
}
Serial.println("");
}else{
Serial.println(F("Quet the de them"));
lcd.print(F("Chua co the chu"));
lcd.setCursor(0,1);
Serial.println(F("Quet the de them"));
20
lcd.print(F("Quet the de them"));
do{
successRead = getID();
}
while (!successRead);
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
lcd.clear();
Serial.println(F("Dang them..."));
lcd.print(F("Dang them..."));
WriteROM(readCard);
lcd.clear();
Serial.println(F("Da them The chu"));
lcd.print(F("Da them The chu"));
lcd.setCursor(0,1);
Serial.println(F("Thanh cong!"));
lcd.print(F("Thanh cong!"));
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
digitalWrite(A4, HIGH);
}
}
void ShowReaderDetails() {
byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
if (v == 0x91 || v == 0x92)
Serial.print(F("Dau doc the san sang"));
else
Serial.println(F(" (unknown)"));
if ((v == 0x00) || (v == 0xFF)) {
Serial.println(F("Kiem tra lai ket noi"));
while (true);
}
}
void reset(){
//Xóa toàn bộ biến nhớ hiện thời
for (int id = 0; id <= 1024; id++){
EEPROM.write(id,0);
}
lcd.clear();
lcd.print("Da xoa du lieu..");
setup();
loop();
}
void Fullcheck(){
if (programMode) {
if (isMaster(readCard)) {
Serial.println(F("Da thao the chu"));
Serial.println(F("-----------------------------"));
lcd.clear();
21
lcd.print(F("Da thao the chu!"));
digitalWrite(A4, HIGH);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
programMode = false;
return;
}else{
if (ReadROM(readCard)) {
lcd.setCursor(0,1);
Serial.println(F("Dang xoa the... "));
lcd.print(F("Dang xoa the... "));
digitalWrite(A4, HIGH);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
RemoveID(readCard);
Serial.println(F("-----------------------------"));
Serial.println(F("Da xoa the! "));
lcd.setCursor(0,1);
lcd.print(F("Da xoa the! "));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
}
else {
lcd.setCursor(0,1);
Serial.println(F("Dang them the..."));
lcd.print(F("Dang them the..."));
digitalWrite(A4, HIGH);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
WriteROM(readCard);
Serial.println(F("-----------------------------"));
Serial.println(F("Da them the! "));
lcd.setCursor(0,1);
lcd.print(F("Da them the! "));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
}
}
}else{
if (isMaster(readCard)) {
programMode = true;
Serial.println(F("The Master, moi them/xoa the"));
Serial.println(F("-----------------------------"));
lcd.clear();
lcd.print(F("Da gan The chu!"));
lcd.setCursor(0,1);
lcd.print(F("Quet de them/xoa"));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
}else {
if (ReadROM(readCard)) {
Serial.println(F("The chap nhan! "));
lcd.clear();
lcd.print(F("The chap nhan! "));
digitalWrite(A4, LOW);
22
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
digitalWrite(A4, HIGH);
granted();
}
else {
Serial.println(F("Khong chap nhan!"));
lcd.clear();
lcd.print(F("Khong chap nhan!"));
digitalWrite(A4, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
digitalWrite(A4, HIGH);
}
}
}
}
void setup() {
//Định nghĩa các chân được sử dụng INPUT OUTPUT
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, INPUT);
digitalWrite(A3,LOW);
digitalWrite(A4,HIGH);
digitalWrite(A5,LOW);
Serial.begin(9600); //Khởi động Monitor baud rate 9600bps
lcd.begin(16,2); //Khởi động LCD 16x2
Serial.println(F("VDK HKI/16-17")); //Hiển thị trên Serial Monitor
lcd.print(F("VDK HKI/16-17")); //Hiện thị trên LCD
SPI.begin(); //MFRC522 sử dụng giao tiếp SPI
mfrc522.PCD_Init(); //Cài đặt thông số cho phần cứng MFRC522
digitalWrite(A3, LOW);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
delay(100);
digitalWrite(A0, HIGH);
delay(100);
digitalWrite(A0, LOW);
delay(300);
digitalWrite(A0, HIGH);
delay(800);
digitalWrite(A0, LOW);
delay(1000);
ShowReaderDetails(); //Hiện thông số RFID Reader RC552 lên Serial Monitor
Serial.println(F("ALL READY"));
lcd.setCursor(0,1); //Chuyển vị trí con trỏ LCD đến dòng 2 cột 1
lcd.print(F("All Ready..."));
delay(300);
checkMaster(); //Kiểm tra thẻ chủ lưu chưa thông qua hàm checkMaster()
}
void loop() {
successRead = getID(); //Kiểm tra xem có đang quét thẻ
không
if (successRead) Fullcheck(); //Nếu có thẻ thì thực hiện hàm
kiểm tra Fullcheck()
}
23
2.3 Giải thuật điều khiển mô hình khóa điện sử dụng RFID – Solenoid
Hình 20: Sơ đồ giải thuật điều khiển mô hình khóa điện sử dụng RFID – Solenoid
Sự kiện nhấn nút Reset: Tín hiệu được lấy từ chân A1 vào, nếu có thì thực hiện
xóa bộ nhớ EEPROM. Nút này được khóa trong hộp điều khiển, trường hợp mất thẻ
master chủ thẻ có thể mở hộp điều khiển và thực hiện reset.
Sự kiện quẹt thẻ: Thẻ từ thông qua Reader RC522 sẽ truyền tín hiệu qua giao
thức ISP, chương trình chính sẽ thực hiện kiểm tra và thực hiện so sánh đối chiếu theo
sơ đồ thuật toán để đưa ra kết quả như mong muốn.
Cơ sở dữ liêu: Ở đây thực chất là lưu vô các biến nhớ EEPROM. Chi tiết ở phần
sau sẽ giải thích rõ hơn về các biến nhớ này.
Còi, đèn: Ở đây sử dụng còi (Buzzer) 5V nhỏ thông dụng trên thị trường, khi
cấp nguồn 5V sẽ tạo ra tiếng beep, đèn sử dụng loại Bi-LED với 2 màu 3 chân Anot
chung. Thông qua một điện trở R330Ω để hạn dòng, thực hiện chớp nháy thông qua 2
chân tín hiệu A4, A5.
Relay: Sử dụng chân tín hiệu A3 để xuất tín hiệu vào chân Bazơ của transistor
C1815 để thông mạch từ chân Colector xuống Emitor xuống Ground khi đó VCC từ
nguồn sẽ thông qua Relay, trở và led báo hiệu qua trans C1815 và xuống Ground. Đối
với Relay sử dụng trực tiếp nguồn 5V vì cuộn Solenoid đang dùng hoạt động ở hiệu điện
24
thế 24V, nếu chia nguồn sẽ làm mạch trở nên phức tạp, và dòng cấp cho Relay nào cũng
tương đối nhỏ không ảnh hưởng hay gây sụt áp cho mạch điều khiển. Chi tiết mạch kích
Relay như bên dưới.
* LƯU Ý: Mỗi ô nhớ trong EEPROM chỉ có thể được ghi hoặc xóa 100.000 lần. Vì vậy,
bạn hãy cẩn thận khi sử dụng nó và chỉ dùng nó khi cần thiết.
Dĩ nhiên không có gì là chỉ có ưu điểm mà không có khuyết điểm. Với giới hạn
trên ta cần cẩn trọng trong việc lưu hoặc xóa một UID, mỗi UID là 4 byte nhớ nó là con
số nhiều trong 1 kbyte hạn hẹp cho phép lưu trữ trên chip nhớ Atmega328. Tuy nhiên
việc lưu một UID người dùng vào người đó dùng sẽ giữ nó trong suốt quá trình làm việc,
hoạt động, hiếm khi mới mất thẻ. Và khi mất thẻ cũng sẽ có kinh phí đền bù nên việc
giới hạn ghi xóa trên là có thể chấp nhận được.
26
3. KẾT QUẢ VÀ KHẢO NGHIỆM
3.1 Chế tạp đế nâng mô hình, tránh nhiễu, chập chạp do kim loại rơi vào
Sau khi board lắp ráp hoàn thành, nhóm tiến hành thiết kế đế nâng mô hình,
tránh chập chạm, sự cố, nhiễu,v.v…
Tận dụng mặt gỗ thực hiện khoan và gắn board lên đế ta được sản phẩm hoàn
thiện đưa vào khảo nghiệm.
27
Hình 23: Sản phầm hoàn thiện nhìn từ mặt bên
Kích thước thực tế của mô hình có bán kính 280mm. Có thể nạp code nâng cấp
trực tiếp bằng cáp mà không cần tháo Arduino ra. Mạch nguồn, Mạch chính, Solenoid
đã hoạt động sau khi hoàn thiện sản phẩm cuối cùng.
Điện áp đầu vào cho toàn mạch sử dụng điện lưới 220V, biến áp hoạt động tốt.
không kêu, mạch nguồn (LM2576T-5V) không nóng. Relay đá tốt, không nhiễu.
Dưới đây là một số hình ảnh thực tế quá trình thử nghiệm của nhóm:
28
Hình 25: Ảnh thực tế khi thêm thẻ thành công
30
dạng sai thẻ, Relay không nhiễu hay đóng ngắn loạn.
Thời gian thực hiện thao tác nhanh chóng thời gian khoảng vài s là vi xử lý
đã xử lý xong.
4.2 Kiến nghị
Vì là mô hình chế tạo mẫu nên không có thể nâng cấp đáp ứng yêu cầu của thương
mại trên thị trường. Do vậy để triển thi kết quả nghiên cứu vào thực tế cần đầu tư vào
công việc thiết kế khuôn mẫu bao che bằng khuôn đúc vật liệu bằng nhựa, kim loại.
Board cần bố trí hợp lý lại, v.v…
31
Tài liệu tham khảo
Tiếng Việt
[1]. Nguyễn Ngọc Cẩn, Kỹ thuật điều khiển tự động, Nhà xuất bản Đại học Quốc
gia Thành Phố Hồ Chí Minh.
[2]. Dương Minh Trí, Linh kiện điện tử, Nhà xuất bản Khoa học và kỹ thuật 2004.
Tiếng nước ngoài
[3]. Theo Michael Margolis, Arduino Cookbook, 2011.
32