Vậy đề tài “Thiết kế mạch khóa số điện tử” mà nhóm tiến hành nghiên cứu đóng vai trò quan trọng trong việc giải quyết những vấn đề bảo mật khóa cửa gây ra, tránh việc kẻ gian xâm nhập là
CƠ SỞ LÝ THUYẾT VỀ HỆ THỐNG NHÚNG
Ngoại vi và giao diện
Đề tài sử dụng những linh kiện chính như sau:
- Board Arduino UNO - Khối điều khiển
- Button - Nhấn mở cửa trực tiếp
- Keypad 4x4 – Bàn phím, chức năng
- Động cơ Servo - Điều khiển chốt cửa
- Còi chip 5V - Phát tiếng báo động
2.1.1 Board Arduino UNO - Khối điều khiển
Bảng 2.1: Thông số kĩ thuật Board Arduino UNO
Chip điều khiển ATmega328P Điện áp hoạt động 5V Điện áp đầu vào (khuyên dùng) 7 – 12V Điện áp đầu vào (giới hạn) 6 – 20V
Dòng điện DC trên mỗi chân I/O 20 mA
Dòng điện DC trên chân 3.3V 50 mA
Tốc độ thạch anh 16 MHz
Cách sử dụng các chân của LCD 16x2
Bảng 2.2: Các chân trong LCD 16x2
Chân Ký hiệu Mô tả
1 VSS Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
GND của mạch điện tử
2 VDD Chân cấp nguồn cho LCD, khi thiết kế mạch ta nói chân này với
VCC=5V của mạch điều khiển
3 VEE Điều khiển độ tương phản của LCD
4 RS 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+ 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)
+ Logic “1”: Bus DB0 – DB7 sẽ được nối với thanh ghi dữ liệu bên trong LCD
Chân chọn chế độ đọc/ghi (Read/Write) Nối chân R/W với logic
“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 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 thấp
Tám đường của bus dữ liệu dùng để trao đổi thông tin MPU Có
2 chế độ sử dụng 8 đường bus này:
+ Chế độ 8 bit: Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7
+ Chế có 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
2.1.3 Keypad 4x4 – Bàn phím chức năng
Số nút nhấn 16 Điện áp hoạt động 3.3V – 5V
2.1.4 Nút nhấn đơn - Nhấn mở cửa trực tiếp
- Các tiếp điểm cố định
Bộ truyền động đi qua toàn bộ công tắc và vào một xy lanh mỏng ở phía dưới. Bên trong là một tiếp điểm và lo xo Khi nhấn nút, nó chạm vào các tiếp điểm tĩnh làm thay đổi trạng thái của tiếp điểm Trong một số trường hợp, người dùng cần giữ nút hoặc nhấn liên tục để thiết bị hoạt động Với các nút nhấn khác, chốt sẽ giữ nút bật cho đến khi người dùng nhấn nút lần nữa.
2.1.5 Động cơ Servo - Điều khiển chốt cửa
Hình 2.5: Động cơ Servo Servo Motor (động cơ servo) được sử dụng phổ biến nhất cho các thiết bị công nghệ cao trong các ứng dụng công nghiệp như công nghệ như công nghệ tự động hóa Là một bộ truyền động quay hoặc tuyến tính cung cấp khả năng điều khiển vị trí chính xác nhanh chóng cho các ứng dụng điều khiển vị trí vòng kín Được thiết kế với đường kính nhỏ và chiều dài rôt dài, tốc độ đáp ứng cao do quan tính thấp Hoạt động trên cơ chế sử dụng phản hồi vị trí roto để điều khiển tốc độ và vị trí của động cơ Động cơ servo sẽ bao gồm động cơ, mạch phản hồi, bộ điều khiển và mạch điện tử khác
Về cơ bản, servo motor được phân loại thành động cơ servo AC và DC tùy thuộc vào nguồn cung cấp.
- Khối ngõ ra: Sử dụng động cơ Servo để điều khiển đóng mở cửa và chuông để cảnh báo b) Xây dựng mạch mô phỏng
*) Khối điều khiển trung tâm
- Sử dụng Boad Arduino UNO R3
- Sử dụng: Chuẩn giao tiếp I2C và LCD 16x2
Kết nối với I2C: Thông thường, để sử dụng màn hình LCD, phải mất rất nhiều chân trên Arduino để điều khiển Do vậy, để đơn giản hóa công việc, người ta đã tạo ra một loại mạch điều khiển màn hình LCD sử dụng giao tiếp I2C Nói một cách đơn giản, chỉ tốn 2 dây để điều khiển màn hình, thay vì 8 dây như cách thông thường.
Kết nối với Arduino UNO:
Bảng 3.3: Kết nối module với màn hình Arduino
Module màn hình LCD (16x2) Arduino
- Sử dụng ma trận phím 4x4
Bảng 3.4: Kết nối ma trận phím với Arduino
- Sử dụng: động cơ RC Servo 9G và còi Buzzer
- Sử dụng: mức điện áp 5VDC.
Dựa vào thiết kế, xây dựng mạch mô phỏng dựa trên phần mềm mô phỏng Proteus như hình vẽ:
Hình 3.10: Mô phỏng hệ thống trên Proteus 3.2.2 Thiết kế phần mềm cho hệ thống a) Giải thuật
Yêu cầu giải thuật: Ban đầu khi cấp nguồn, hiển thị LCD Nhấn phím A để bắt đầu nhập mật khẩu Nhấn các số từ 0 – 9 của Keypad để tiến hành nhập mật khẩu, các số nhập vào hiển thị trên LCD rồi chuyển thành “ * ” ngay sau đó Mạch sẽ so sánh mật khẩu nhập vào và hoạt động theo hai hướng:
- Mật khẩu nhập vào đúng: Servo hoạt động để điều khiển mở chốt cửa và thông báo lên LCD
- Mật khẩu nhập vào sai: thông báo lên LCD và tiến hành nhập lại mật khẩu Nếu nhập sai mật khẩu 4 lần liên tiếp, mạch sẽ khóa chức năng nhập mật khẩu và bật còi để phát cảnh báo.
Hình 3.11: Lưu đồ thuật toán chính của chương trình b) Chương trình
#include // Khai báo thư viện sử dụng cho động cơ
#include // Khai báo thư viện LCD sử dụng I2C LiquidCrystal_I2C lcd(0x3f, 16, 2); // 0x3f địa chỉ LCD, 16 cột và 2 hàng
#include // Khai báo thư viện Keypad
Khai báo các thư viện sử dụng, sau dòng khai báo thư viện I2C phải khai báo loại LCD sử dụng với địa chỉ của LCD và số cột số hàng, ở đây là LCD 16 cột 2 hàng. const byte ROWS = 4; // Bốn hàng const byte COLS = 4; // bốn cột char keys[ROWS][COLS] = {
{'1', '2', '3','A'}, {'4', '5', '6','B'}, {'7', '8', '9','C'}, {'*', '0', '#','D'}}; byte rowPins[ROWS] = {2, 3, 4, 5}; //chân kết nối byte colPins[COLS] = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Khai báo loại Keypad sử dụng số hàng với số cột là 4, chuỗi ma trận mã ký tự cho Keypad lúc đó ứng với vị mã phím sẽ lấy ra ký tự trong chuỗi Khai báo các chân kết nối cho Keypad theo hàng và cột Dòng cuối là khai báo tên cho động cơ Servo sử dụng. char STR[4] = {'2', '0', '2', '2'}; // Cài đặt mật khẩu tùy ý char str[4] = {' ', ' ', ' ', ' '}; int i, count = 0, cb = 0;
Tạo mảng để lưu mật khẩu chính và mật khẩu nhập vào từ Keypad, có thể tùy ý đặt mật khẩu chính Khai báo các biến sử dụng trong chương trình Kiểu int là kiểu số nguyên chính được dùng trong chương trình Arduino, kiểu int chiếm 2byte bộ nhớ và với Arduino Uno nó có giá trị 16bit. void setup() { myServo.attach(10); // Khai báo chân điều khiển động cơ pinMode(11,OUTPUT); // Chân kết nối với còi chíp là Output pinMode(BUTTON,INPUT); // Chân kết nối với button là Input lcd.init(); // Khai báo sử dụng LCD lcd.begin(16, 2); // Cấu hình 16 cột 2 hàng lcd.backlight(); /// Sáng màn hình lcd.clear(); // Xóa màn hình lcd.print(" Enter Password"); //Hiển thị: Hãy nhập mật khẩu i=1; //Biến đánh dấu đc phép nhập mật khẩu hay không: 0 - không được, >0 - được myServo.write(0); // Đưa động cơ quay về góc 0
Chương trình điều khiểu Ở đây ta khai báo chân điều khiển cho Servo là chân số 10, ngõ ra chân 11 để điều khiển còi Buzzer Khai báo sử dụng LCD, màu nền, xóa màn hình và hiển thị dòng chữ “Enter Password” lên LCD. int ktBUTTON(){ return digitalRead(BUTTON); //Trả ra trạng thái nút nhấn: 0 - nhấn, 1 - nhả
Hàm trả về trạng thái nút nhấn Trạng thái = 0: Nút đang được nhấn Trạng thái = 1: Nút đang được nhả. void Open(char key){
// Điều kiện và các giá trị không tính khi nhập mật khẩu if (key && i>0 && key != '*' && key != 'C' && key != 'D' && key != 'B') {
//Lần lượt nhập từng chữ số if (i == 1)
{ str[0] = key; // Giá trị lấy từ nút mà mình nhấn lcd.setCursor(6, 1); //Đưa con trỏ vào vị trị cột 6 dòng 2 lcd.print(str[0]); //In giá trị vừa nhấ delay(200); // Ký tự hiển thị trên màn hình LCD trong 0.2s lcd.setCursor(6, 1);// Sau đó thay thế lại bằng kí tự * lcd.print("*"); // Ký tự được che bởi dấu *
//Tương tự với những chữ số còn lại Độ dài tối đa là 4 chữ số if (i == 2)
{ str[1] = key; lcd.setCursor(7, 1); lcd.print(str[1]); delay(200); lcd.setCursor(7, 1); lcd.print("*");
{ str[2] = key; lcd.setCursor(8, 1); lcd.print(str[2]); delay(200); lcd.setCursor(8, 1); lcd.print("*");
{ str[3] = key; lcd.setCursor(9, 1); lcd.print(str[3]); delay(200); lcd.setCursor(9, 1); lcd.print("*"); count = 1; //Đến chữ số cuối thì đánh dấu count = 1
} if(key == '#'){ //Nếu nhấn nút XÓA trên bàn phím thì xóa 1 kí tự vừa nhập lcd.setCursor(i + 5, 1); lcd.print(" "); if(i >= 0){ i = i - 2;
} if(i < 0){ //Vì i ko đc < 0 (Đảm bảo số đầu tiên của mật khẩu ở ví trí cột 6 i ++;
Hàm nhập mật khẩu để mở cửa Ta dùng lệnh If để kiểm tra điều kiện, khi có phím nhấn với biến i>0 hay thì cho phép nhập mật khẩu Mật khẩu có 4 số tương ứng với i=1,2,3,4 Với mỗi i có một cấu trúc If thực hiện nhập mật khẩu, ví dụ i=1, mã phím Keypad sẽ được lưu vào vị trí “0” của mảng str[ ], và in giá trị mã phím ra lên LCD ở vị trí cột thứ 7 hàng thứ 2,sau khoảng thời gian một giây chuyển thành
“*” để bảo vệ tính bảo mật cho mật khẩu Sau mỗi lần nhấn phím biến i sẽ tăng lên một đơn vị (i++) để chuyển qua lệnh If tiếp theo, tại cấu trúc If với i=4 sau khi nhập xong mật khẩu biến count sẽ bằng 1 để cho phép thực hiện chương trình kiểm tra mật khẩu. if(key == 'D'){ //Nếu nhấn nút HỦY trên bàn phím thì xóa đi toàn bộ mật khẩu vừa nhập i = 1; //Reset lại về nhập số đầu tiên lcd.clear(); lcd.print(" Enter Password");
} if (count == 1 && key == 'A') //Khi count = 1 tức nhập đủ 4 chữ số và nhấn nút
//So sánh chuỗi nhập vào với chuỗi mặc định
//Nếu đúng thì mở cửa, sai thì cảnh báo if (str[0] == STR[0] && str[1] == STR[1] && str[2] == STR[2] && str[3]
== STR[3]) { lcd.clear(); lcd.print(" Correct!"); //Thông báo lên màn hình mật khẩu đúng delay(500); myServo.write(180); // Mở cửa lcd.clear(); lcd.print(" Opened!"); //Hiển thị trạng thái cửa đang mở i = 0; //Không cho phép nhập mật khẩu nữa vì cửa mở rồi count = 0; // Count về 0 để chuẩn bị cho lần nhập mật khẩu sau cb = 0; //Reset biến tính số lần nhập sai cp = 1; //Biến cho phép đổi mật khẩu = 1 (Tức là cửa đc mở rồi mới có thể đổi mật khẩu)
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
Thiết kế hệ thống
4.1 Xây dựng và tích hợp hệ thống
- Sử dụng phần mềm lập trình Arduino IDE để xây dựng chương trình.
- Sử dụng phần mềm Proteus để mô phỏng phần cứng.
4.2 Kiểm thử và đánh giá hệ thống
Hệ thống chạy ổn định, đáp ứng được các yêu cầu đề ra trên mục thiết kế. Tương đối giống với cách thức hoạt động của các loại khóa số điện tử trên thị trường Hệ thống có tính ứng dụng cao.
4.2.1 Test chức năng nhập mật khẩu
Hình 4.12: Test chức năng nhập mật khẩu
- Kí tự nhập vào được tự động ẩn thành dấu ‘*’.
4.2.2 Test chức năng xóa 1 ký tự trong mật khẩu nhập vào
Hình 4.13: Test chức năng xóa 1 ký tự trong mật khẩu nhập vào
TÍCH HỢP VÀ ĐÁNH GIÁ HỆ THỐNG
Xây dựng và tích hợp hệ thống
- Sử dụng phần mềm lập trình Arduino IDE để xây dựng chương trình.
- Sử dụng phần mềm Proteus để mô phỏng phần cứng.
Kiểm thử và đánh giá hệ thống
Hệ thống chạy ổn định, đáp ứng được các yêu cầu đề ra trên mục thiết kế. Tương đối giống với cách thức hoạt động của các loại khóa số điện tử trên thị trường Hệ thống có tính ứng dụng cao.
4.2.1 Test chức năng nhập mật khẩu
Hình 4.12: Test chức năng nhập mật khẩu
- Kí tự nhập vào được tự động ẩn thành dấu ‘*’.
4.2.2 Test chức năng xóa 1 ký tự trong mật khẩu nhập vào
Hình 4.13: Test chức năng xóa 1 ký tự trong mật khẩu nhập vào
- Chuỗi nhập vào sau khi xóa 1 ký tự
4.2.3 Test chức năng xóa toàn bộ ký tự trong mật khẩu nhập vào
Hình 4.14: Test chức năng xóa toàn bộ ký tự trong mật khẩu nhập vào
- Sau khi nhấn xóa toàn bộ Màn hình trở về trạng thái ban đầu.
4.2.4 Test chức năng mở cửa trực tiếp bằng nút nhấn
Hình 4.15: Test chức năng mở cửa trực tiếp bằng nút nhấn
- Khi nút nhấn mở cửa trực tiếp được nhấn thì hệ thống lập tức hiển thị trạng thái
Hướng dẫn vận hành hệ thống
Phần mềm lập trình Arduino IDE
Hình 4.16: Biểu tượng của phần mềm Cài đặt Arduino IDE
Bước 1: Truy cập địa chỉ http://arduino.cc/en/Main/Software/ Đây là nơi lưu trữ cũng như cập nhật các bản IDE của Arduino Bấm vào mục Windows Zip file for non admin install như hình minh họa.
Hình 4.17: Nhấn vào Windows ZipSau đó nó được chuyển đến một trang mời quyền góp tiền để phát triển phần mềm cho Arduino, tiếp tục bấm JUST DOWNLOAD để bắt đầu tải.
Hình 4.18: Nhấn vào Just Download để tải phần mềm
Bước 2: Sau khi download xong, ta bấm chuột phải vào file arduino-1.8.5 windows.zip vừa Download và chọn “Extract here” để giải nén.
Hình 4.19: Giải nén file vừa tải
Bước 3: Copy thư mục arduino-1.8.5 vừa giải nén đến nơi lưu trữ
Bước 4: Chạy file arduino.exe trong thư mục arduino-1.8.5 để khởi động Arduino
Hình 4.20: Giao diện lập trình của Arduino IDE
Giao diện gồm các nút lệnh menu (File, Edit, Sketch, Tools, Help) Phía dưới là các icon cho phép sử dụng nhanh các chức năng thường dùng của IDE được miêu tả như sau:
Biên dịch chương trình đang soạn thảo để kiểm tra các lỗi lập trình.
Biên dịch và upload chương trình đang soạn thảo
Mở một trang soạn thảo mới.
Mở các chương trình đã lưu.
Lưu các chương trình đang soạn.
Mở cửa sổ Serial Monitor để gửi dữ liệu giữa máy tính và board Arduino.