1. Trang chủ
  2. » Luận Văn - Báo Cáo

tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển

44 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên Cứu Thiết Kế Thiết Bị Hệ Thống Điều Khiển Cửa Thông Minh Sử Dụng Họ Vi Điều Khiển
Tác giả Nguyễn Trung Hiếu, Vũ Nhật Long, Trần Mạnh Cường
Người hướng dẫn TS. Đoàn Thị Hương Giang
Trường học Trường Đại Học Điện Lực
Chuyên ngành Điều Khiển Và Tự Động Hóa
Thể loại Đồ Án
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 44
Dung lượng 5,12 MB

Cấu trúc

  • CHƯƠNG 1: ĐẶT VẤN ĐỀ VÀ NHIỆM VỤ THƯ (7)
    • 1.1 ĐẶT VẤN ĐỀ (7)
      • 1.1.1 Thực trạng (7)
      • 1.1.2 Vai trò của cửa tự động trong đời sống (7)
    • 1.2 ƯU ĐIỂM (7)
    • 1.3 NHIỆM VỤ THƯ (8)
  • CHƯƠNG 2: THIẾT KẾ PHẦN CỨNG CHO CỬA THÔNG MINH (9)
    • 2.1 SƠ ĐỒ KẾT NỐI HỆ THỐNG CỬA (9)
    • 2.2 LỰA CHỌN THIẾT BỊ (9)
      • 2.2.1 Cấu tạo chung của Arduino (Arduino Uno R3) (9)
      • 2.2.2 Thông số cơ bản của Arduino Uno R3 (10)
      • 2.2.3 Cấu tạo của Arduino Mega 2560 (11)
      • 2.2.4 LCD 16x2 và module I2C Arduino (13)
      • 2.2.5 Module I2C Arduino (0)
      • 2.2.6 Động cơ Servo MG96R (0)
      • 2.2.7 Bàn phím ma trận 4x4 (Matrix Keypad 4x4) (0)
      • 2.2.8 Ruoter Wifi (0)
      • 2.2.9 Module RFID RC522 (0)
      • 2.2.10 Ethernet Arduino (0)
      • 2.2.11 Module relay (0)
    • 2.3 SƠ ĐỒ THIẾT KẾ PHẦN CỨNG TỔNG THỂ CỦA HỆ THỐNG (0)
    • 2.4 KẾT LUẬN CHƯƠNG 2 (0)
  • CHƯƠNG 3: THIẾT KẾ PHẦN MỀM (0)
    • 3.1 HOẠT ĐỘNG CỦA HỆ THỐNG (0)
      • 3.1.1 Nguyên lý hoạt động của hệ thống (0)
    • 3.2 LƯU ĐỒ THUẬT TOÁN (30)
      • 3.2.1 Lưu đồ thuật toán hệ thống (30)
      • 3.2.2 Lưu đồ thuật toán dùng mật mã với phím ma trận 4x4 (31)
      • 3.2.3 Lưu đồ thuật toán với Ethernet (32)
      • 3.2.4 Lưu đồ thuật toán đóng mở cửa (33)
      • 3.3.1 Lập trình arduino (33)
      • 3.3.2 Lập trình python (40)
      • 3.3.3 Lập trình ethernet shield (48)
  • CHƯƠNG 4: MÔ HÌNH THỰC NGHIỆM VÀ KẾT LUẬN (56)
    • 4.1 YÊU CẦU MÔ HÌNH (56)
    • 4.2 MÔ HÌNH (56)
    • 4.3 KẾT LUẬN VÀ PHƯƠNG HƯỚNG PHÁT TRIỂN CỬA THÔNG MINH (58)
  • TÀI LIỆU THAM KHẢO (59)

Nội dung

Đặc biệt làmảng tự động hóa với các ứng dụng của vi xử lý đã có những khả năng to lớn về việc điềukhiển với tốc độ cao, độ chính xác cao, khả năng xử lý các tính toán và tính linh hoạt n

THIẾT KẾ PHẦN CỨNG CHO CỬA THÔNG MINH

SƠ ĐỒ KẾT NỐI HỆ THỐNG CỬA

Sơ đồ khối hệ thống mạch điều khiển cửa thông minh

Hình 2 1 Sơ đồ khối hệ thống điều khiển cửa thông minh

Arduino là bảng mạch điều khiển chính của toàn bộ hệ thống Arduino sẽ nhận tín hiệu từ phím, RIFD, mạng ethernet đưa về để xử lý sau đó sẽ xuất tín hiệu đến rơ le để điều khiển cửa và động cơ cửa đồng thời hiển thị cửa lên LCD Arduino nhận tín hiệu từ cảm biến để xác định cửa đang đóng hay đang mở.

LỰA CHỌN THIẾT BỊ

Phương thức mở khóa: mật mã, thẻ thông minh, mở khóa bằng nhận diện khuôn mặt, mở khóa bằng ethernet.

2.2.1 Cấu tạo chung của Arduino (Arduino Uno R3) a Cáp USB b Đầu cắm cổng USB mạch

Arduino c Đầu cắm cổng USB máy tính d IC Atmega 16U2 e Cổng nguồn ngoài f Cổng USB g Nút reset h ICSP của Atmega 16U2 i Chân xuất tín hiệu ra j IC Atmega 328 k Chân ICSP của Atmega 328 l Chân lấy tín hiệu analog m Chân cấp nguồn cho cảm biến

2.2.2 Thông số cơ bản của Arduino Uno R3

Hình 2 2 Sơ đồ chân Arduino Uno R3

Bảng 2-1 Bảng chi tiết các chân Arduino Uno R3

Chân Vin Đây là điện áp đầu vào được cung cấp cho board mạch

Arduino Khác với 5V được cung cấp qua cổng USB Chân này được sử dụng để cung cấp điện áp toàn mạch thông qua jack nguồn, thông thường khoảng 7VDC- 12VDC.

Chân 5V Chân 5V được sử dụng để cung cấp điện áp đầu ra

Arduino được cấp nguồn bằng ba cách đó là USB, chân Vin của board mạch hoặc giắc nguồn DC.

USB Hỗ trợ điện áp khoảng 5V trong khi Vin và Power Jack hỗ trợ dải điện áp trong khoảng từ 7V đến 20V.

Chân GND Chân nối đất chung cho toàn mạch Arduino.

Chân Reset Chân reset để thiết lập lại về ban đầu.

PWM PWM được cung cấp bởi các chân 3, 5, 6, 9, 10, 11 Các chân này được cấu hình để cung cấp PWM đầu ra 8 bit.

Chân SPI Chân này được gọi là giao diện ngoại vi nối tiếp Các chân

10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) cung cấp liên lạc SPI với sự trợ giúp của thư viện SPI.

Chân AREF Chân này được gọi là tham chiếu tương tự, được sử dụng để cung cấp điện áp tham chiếu cho các đầu vào tương tự.

Chân TWI Chân giao tiếp TWI được truy cập thông qua thư viện dây Chân A4 và A5 được sử dụng cho mục đích này.

Giao tiếp nối tiếp được thực hiện thông qua hai chân 0 (Rx) và 1 (Tx).

Chân Rx Chân này được sử dụng để nhận dữ liệu trong khi chân Tx được sử dụng để truyền dữ liệu.

Chân ngắt ngoài Chân 2 và 3 được sử dụng để cung cấp các ngắt ngoài.

2.2.3 Cấu tạo của Arduino Mega 2560

Sơ đồ chân và Thông số kỹ thuật của Arduino Mega2560:

- Điện Áp Hoạt Động: 5VDC

- Cường độ dòng điện chân 5V: 500mA

- Cường độ dòng điện trên mỗi 3.3V: 50mA

- Cường độ dòng điện trên mỗi chân I/O: 40mA

Hình 2 3 Sơ đồ chân Arduino Mega 2560 Bảng 2-2 Bảng chi tiết các chân của Arduino Mega 2560

Chân 5V và 3.3V Chân này được sử dụng để cung cấp điện áp đầu ra khoảng 5V

Chân GND Có năm chân nối mass có sẵn trên board Arduino Mega, giúp dễ dàng kết nối nếu thực hiện dự án với nhiều kết nối thiết bị ngoại vi.

Chân reset Được sử dụng để thiết lập lại board mạch về lại ban đầu Mức tích cực low được thiết lập sẽ reset lại board mạch.

Chân Vin Là chân điện áp đầu vào cung cấp cho mạch Arduino Mega, điện áp từ 7V đến 20V Mặt khác điện áp được cấp bởi jack nguồn DC có thể được lấy thông qua chân này Tuy nhiên, điện áp đầu ra thông qua chân này đến mạch Arduino sẽ được tự động thiết lập là 5V.

Chân truyền Chân truyền thông nối tiếp (Serial Communication): RXD và

7 thông nối tiếp TXD là các chân nối tiếp được sử dụng để truyền và nhận dữ liệu nối tiếp, chân Rx đại diện cho việc truyền dữ liệu còn Tx được sử dụng để nhận dữ liệu Có tất cả 4 kết hợp các chân nối tiếp này được sử dụng trong đó Serial 0 là chân RX (0) và TX (1), serial 1 là chân TX (18) và RX (19), serial 2 là chân TX (16) và RX (17), và serial 3 là chân TX (14) và RX (15).

Chân Ngắt ngoài Sáu chân được sử dụng để tạo các ngắt ngoài đó là ngắt 0 (chân

0), ngắt 1 (chân 3), ngắt 2 (chân 21), ngắt 3 (chân 20), ngắt 4 (chân 19), ngắt 5 (chân 18) Các chân này tạo ra các ngắt bằng một số cách tức là cung cấp giá trị low, tăng hoặc giảm hoặc thay đổi giá trị cho các chân ngắt. Đèn LED Arduino Mega 2560 tích hợp đèn led trên board mạch kết nối với chân mười ba Giá trị high đèn led được bật và low đèn led tắt Giúp người lập trình quan sát trực quan khi test, kiểm tra chương trình trên board Arduino.

Chân AREF Chân tạo điện áp tham chiếu cho đầu vào Analog

Có mười sáu chân Analog được tích hợp trên board Arduino có ký hiệu là A0 đến A15 Điều quan trọng cần lưu ý là tất cả các chân Analog này có thể được sử dụng làm chân I/O Digital Mỗi chân Analog đi kèm với độ phân giải 10 bit Các chân này có thể có điện áp thay đổi tử 0V đến 5V.

Giao tiếp I2C Hai chân 20 và 21 hỗ trợ giao tiếp I2C trong đó 20 đại diện cho

SDA (Dòng dữ liệu nối tiếp chủ yếu được sử dụng để giữ dữ liệu) và 21 đại diện cho SCL (Dòng đồng hồ nối tiếp chủ yếu được sử dụng để cung cấp đồng bộ hóa dữ liệu giữa các thiết bị).

Truyền thông SPI Được sử dụng để truyền dữ liệu giữa Arduino và các thiết bị ngoại vi khác Chân 50 (MISO), Chân51 (MOSI), Chân 52 (SCK), Chân 53 (SS) được sử dụng để liên lạc SPI.

Là một linh kiện điện tử được sử dụng rộng dãi trong các dự án điện tử và lập trình Được sử dụng để hiện thị các trạng thái hoặc thông số.

Thông số kĩ thuật của LCD 16x2:

- LCD 16x2 có mười sáu chân trong đó tám chân dữ liệu (D0 - D7) và ba chân điều khiển (RS, RW, EN).

- Năm chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16x2.

- Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu.

- Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi.

- Chức năng liên kết các chân LCD

Bảng 2-3 Bảng ký hiệu và chi tiết chân LCD

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ều khiển

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 chỉnh độ 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ẽ nối với thanh ghi dữ liệu

9 chuông bật và hệ thống vộ hiệu hóa trong hai phút sau hai phút tắt chuông người dùng phải thực hiện quy trình mở cửa lại từ đầu.

- Ngoài ra hệ thống cung có một chuông ở ngoài cửa dành cho khác khi bấm chuông thì hệ thống sẽ gửi thông báo và đồng thời chuông sẽ bật cho đến khi ngừng bấm chuông.

3.2.1 Lưu đồ thuật toán hệ thống

Hình 3 1 Lưu đồ thuật toán hệ thống

3.2.2 Lưu đồ thuật toán dùng mật mã với phím ma trận 4x4

Hình 3 2 Lưu đồ thuật toán với phím ma trận 4x4

3.2.3 Lưu đồ thuật toán với Ethernet

Hình 3 3 Lưu đồ thuật toán với ethernet

3.2.4 Lưu đồ thuật toán đóng mở cửa

Hình 3 4 Lưu đồ thuật toán đóng mở cửa với cảm biến

3.3 Phần lập trình các chương trình điều khiển cửa thông minh

#define SS_PIN 53 //định nghĩa chân

MFRC522 mfrc522(SS_PIN, RST_PIN);

Servo servo2; int pos = 18; int door_status = 0; int white_button = 0; int count_key = 0; int coi = 22; int count = 0; int dem = 0; int dem1 = 0; int update_web = 4; int RFID = 0; int x = 0; int lap = 0; char Data[Password_Length]; char Master[Password_Length] = "123456"; byte data_count = 0, master_count = 0; bool Pass_is_good;

LiquidCrystal_I2C lcd(0x27, 16, 2); const byte ROWS = 4; const byte COLS = 4; char hexaKeys[ROWS][COLS] = {

}; byte rowPins[ROWS] = {43, 41, 39, 37}; byte colPins[COLS] = {42, 40, 38, 36};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

SPI.begin(); // Kích hoạt cổng truyền thông giao tiếp SPI mfrc522.PCD_Init(); // Initiate MFRC522 pinMode(coi, OUTPUT); lcd.init(); lcd.backlight(); servo1.attach(7); servo1.write(pos); servo2.attach(32); servo2.write(145);

SPI.begin(); mfrc522.PCD_Init(); // Initiate MFRC522 pinMode(update_web, OUTPUT);

//************************************************************// void face() { if (!Serial.available())

//************************************************************// void the_tu() { if ( ! mfrc522.PICC_IsNewCardPresent()) return; if (mfrc522.PICC_ReadCardSerial()) { for (byte i = 0; i < mfrc522.uid.size; i++) { tag += mfrc522.uid.uidByte[i];

{ if ( tag == "1952541709" or tag == "8222710633") { open_door();

30 delay(3000); close_door(); tag.remove(0, 15);

{ lcd.clear(); lcd.setCursor(3, 0); lcd.print("Incorrect"); delay(3000); tag.remove(0, 15);

{ lcd.clear(); lcd.setCursor(4, 0); lcd.print("WELLCOME"); digitalWrite(update_web, HIGH); servo2.write(0); for (pos = 18; pos = 18; pos -= 1) { servo1.write(pos); delay(10); if (digitalRead(33) == 1)

{ delay(500); servo2.write(145); door_status = 0;

RFID = 0; white_button = 0; dem = 0; digitalWrite(update_web, LOW);

{ char customKey = customKeypad.getKey(); if (customKey) {

// if (count == 0) lcd.clear(); count += 1; lcd.setCursor(0, 0); lcd.print("NHAP MAT KHAU:");

Data[data_count] = customKey; lcd.setCursor(data_count, 1); lcd.print(Data[data_count]); data_count++;

} if (data_count == Password_Length - 1) { lcd.clear(); if (!strcmp(Data, Master)) { open_door(); delay(5000); close_door(); count_key = 0; count = 0;

{ lcd.setCursor(2, 0); lcd.print("SAI MAT KHAU"); lcd.setCursor(1, 1); lcd.print("CON 2 LAN THU");

{ lcd.setCursor(2, 0); lcd.print("SAI MAT KHAU"); lcd.setCursor(1, 1); lcd.print("CON 1 LAN THU");

{ lcd.setCursor(1, 0); lcd.print("PLESE TRY LATER"); for (int i = 0; i < 40; i++)

{ digitalWrite(coi, HIGH); delay(100); digitalWrite(coi, LOW); delay(100);

} void loop() { while (Serial.available())

// Serial.print(digitalRead(5)); if (count == 0)

{ lcd.setCursor(0, 0); lcd.print("PASSWORD OR CARD");

} if (door_status == 1 and white_button != 1 and digitalRead(5) >> 1 or RFID == 1) { delay(5000); close_door();

{ open_door(); delay(3000); close_door(); x = 0;

// // Red button // if (digitalRead(12) == 1 and white_button == 0)

{ open_door(); delay(5000); close_door();

{ white_button += 1; if (white_button == 1)

{ white_button = 1; open_door(); dem += 1; dem1 = 0;

// Check RFID card // the_tu();

3.3.2 Lập trình python a) Huấn luyện mô hình import warnings warnings.filterwarnings("ignore") import datetime import time from os import listdir from os.path import isdir from PIL import Image

35 from numpy import savez_compressed, asarray, load, expand_dims from mtcnn import MTCNN from keras.models import load_model from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import Normalizer from sklearn.svm import SVC import pickle class FaceTrainer: def init (self): self.dataset_train "C:/Users/Acer/Documents/D/DA_VXL/RealTimeFaceRecognition/faces_dataset/train/" self.dataset_val "C:/Users/Acer/Documents/D/DA_VXL/RealTimeFaceRecognition/faces_dataset/val/" return def load_dataset(self, directory):

"""Load a dataset that contains one subdir for each class that in turn contains images"""

# enumerate all folders named with class labels for subdir in listdir(directory): path = directory + subdir + '/'

# skip any files that might be in the dir if not isdir(path): continue

# load all faces in the subdirectory faces = self.load_faces(path)

# create labels labels = [subdir for _ in range(len(faces))] print("loaded {} examples for class: {}".format(len(faces), subdir))

X.extend(faces) y.extend(labels) return asarray(X), asarray(y) def load_faces(self, directory):

"""Load images and extract faces for all images in a directory""" faces = []

# enumerate files for filename in listdir(directory): path = directory + filename

# get face face = self.extract_face(path) faces.append(face) return faces def extract_face(self, filename, required_size=(160, 160)):

"""Extract a single face from a given photograph"""

# load image from file image = Image.open(filename)

# convert to RGB, if needed image = image.convert('RGB')

# convert to array pixels = asarray(image)

# create the detector, using default weights detector = MTCNN()

# detect faces in the image results = detector.detect_faces(pixels)

# extract the bounding box from the first face x1, y1, width, height = results[0]['box']

# bug fix x1, y1 = abs(x1), abs(y1) x2, y2 = x1 + width, y1 + height

# extract the face face = pixels[y1:y2, x1:x2]

# resize pixels to the model size image = Image.fromarray(face) image = image.resize(required_size) face_array = asarray(image) return face_array def create_faces_npz(self):

"""Method Creates npz file for all the faces in train_dir, val_dir"""

# Load the training data set trainX, trainy = self.load_dataset(self.dataset_train) print("Training data set loaded")

# load test dataset testX, testy = self.load_dataset(self.dataset_val) print("Testing data set loaded")

# save arrays to one file in compressed format savez_compressed('faces_dataset', trainX, trainy, testX, testy) return def create_faces_embedding_npz(self):

"""Create npz file for all the face embeddings in train_dir, val_dir"""

37 data = load('faces_dataset.npz') trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3'] print('Loaded: ', trainX.shape, trainy.shape, testX.shape, testy.shape)

# load the facenet model model = load_model('facenet_keras.h5') print('Keras Facenet Model Loaded')

THIẾT KẾ PHẦN MỀM

LƯU ĐỒ THUẬT TOÁN

3.2.1 Lưu đồ thuật toán hệ thống

Hình 3 1 Lưu đồ thuật toán hệ thống

3.2.2 Lưu đồ thuật toán dùng mật mã với phím ma trận 4x4

Hình 3 2 Lưu đồ thuật toán với phím ma trận 4x4

3.2.3 Lưu đồ thuật toán với Ethernet

Hình 3 3 Lưu đồ thuật toán với ethernet

3.2.4 Lưu đồ thuật toán đóng mở cửa

Hình 3 4 Lưu đồ thuật toán đóng mở cửa với cảm biến

3.3 Phần lập trình các chương trình điều khiển cửa thông minh

#define SS_PIN 53 //định nghĩa chân

MFRC522 mfrc522(SS_PIN, RST_PIN);

Servo servo2; int pos = 18; int door_status = 0; int white_button = 0; int count_key = 0; int coi = 22; int count = 0; int dem = 0; int dem1 = 0; int update_web = 4; int RFID = 0; int x = 0; int lap = 0; char Data[Password_Length]; char Master[Password_Length] = "123456"; byte data_count = 0, master_count = 0; bool Pass_is_good;

LiquidCrystal_I2C lcd(0x27, 16, 2); const byte ROWS = 4; const byte COLS = 4; char hexaKeys[ROWS][COLS] = {

}; byte rowPins[ROWS] = {43, 41, 39, 37}; byte colPins[COLS] = {42, 40, 38, 36};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

SPI.begin(); // Kích hoạt cổng truyền thông giao tiếp SPI mfrc522.PCD_Init(); // Initiate MFRC522 pinMode(coi, OUTPUT); lcd.init(); lcd.backlight(); servo1.attach(7); servo1.write(pos); servo2.attach(32); servo2.write(145);

SPI.begin(); mfrc522.PCD_Init(); // Initiate MFRC522 pinMode(update_web, OUTPUT);

//************************************************************// void face() { if (!Serial.available())

//************************************************************// void the_tu() { if ( ! mfrc522.PICC_IsNewCardPresent()) return; if (mfrc522.PICC_ReadCardSerial()) { for (byte i = 0; i < mfrc522.uid.size; i++) { tag += mfrc522.uid.uidByte[i];

{ if ( tag == "1952541709" or tag == "8222710633") { open_door();

30 delay(3000); close_door(); tag.remove(0, 15);

{ lcd.clear(); lcd.setCursor(3, 0); lcd.print("Incorrect"); delay(3000); tag.remove(0, 15);

{ lcd.clear(); lcd.setCursor(4, 0); lcd.print("WELLCOME"); digitalWrite(update_web, HIGH); servo2.write(0); for (pos = 18; pos = 18; pos -= 1) { servo1.write(pos); delay(10); if (digitalRead(33) == 1)

{ delay(500); servo2.write(145); door_status = 0;

RFID = 0; white_button = 0; dem = 0; digitalWrite(update_web, LOW);

{ char customKey = customKeypad.getKey(); if (customKey) {

// if (count == 0) lcd.clear(); count += 1; lcd.setCursor(0, 0); lcd.print("NHAP MAT KHAU:");

Data[data_count] = customKey; lcd.setCursor(data_count, 1); lcd.print(Data[data_count]); data_count++;

} if (data_count == Password_Length - 1) { lcd.clear(); if (!strcmp(Data, Master)) { open_door(); delay(5000); close_door(); count_key = 0; count = 0;

{ lcd.setCursor(2, 0); lcd.print("SAI MAT KHAU"); lcd.setCursor(1, 1); lcd.print("CON 2 LAN THU");

{ lcd.setCursor(2, 0); lcd.print("SAI MAT KHAU"); lcd.setCursor(1, 1); lcd.print("CON 1 LAN THU");

{ lcd.setCursor(1, 0); lcd.print("PLESE TRY LATER"); for (int i = 0; i < 40; i++)

{ digitalWrite(coi, HIGH); delay(100); digitalWrite(coi, LOW); delay(100);

} void loop() { while (Serial.available())

// Serial.print(digitalRead(5)); if (count == 0)

{ lcd.setCursor(0, 0); lcd.print("PASSWORD OR CARD");

} if (door_status == 1 and white_button != 1 and digitalRead(5) >> 1 or RFID == 1) { delay(5000); close_door();

{ open_door(); delay(3000); close_door(); x = 0;

// // Red button // if (digitalRead(12) == 1 and white_button == 0)

{ open_door(); delay(5000); close_door();

{ white_button += 1; if (white_button == 1)

{ white_button = 1; open_door(); dem += 1; dem1 = 0;

// Check RFID card // the_tu();

3.3.2 Lập trình python a) Huấn luyện mô hình import warnings warnings.filterwarnings("ignore") import datetime import time from os import listdir from os.path import isdir from PIL import Image

35 from numpy import savez_compressed, asarray, load, expand_dims from mtcnn import MTCNN from keras.models import load_model from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import Normalizer from sklearn.svm import SVC import pickle class FaceTrainer: def init (self): self.dataset_train "C:/Users/Acer/Documents/D/DA_VXL/RealTimeFaceRecognition/faces_dataset/train/" self.dataset_val "C:/Users/Acer/Documents/D/DA_VXL/RealTimeFaceRecognition/faces_dataset/val/" return def load_dataset(self, directory):

"""Load a dataset that contains one subdir for each class that in turn contains images"""

# enumerate all folders named with class labels for subdir in listdir(directory): path = directory + subdir + '/'

# skip any files that might be in the dir if not isdir(path): continue

# load all faces in the subdirectory faces = self.load_faces(path)

# create labels labels = [subdir for _ in range(len(faces))] print("loaded {} examples for class: {}".format(len(faces), subdir))

X.extend(faces) y.extend(labels) return asarray(X), asarray(y) def load_faces(self, directory):

"""Load images and extract faces for all images in a directory""" faces = []

# enumerate files for filename in listdir(directory): path = directory + filename

# get face face = self.extract_face(path) faces.append(face) return faces def extract_face(self, filename, required_size=(160, 160)):

"""Extract a single face from a given photograph"""

# load image from file image = Image.open(filename)

# convert to RGB, if needed image = image.convert('RGB')

# convert to array pixels = asarray(image)

# create the detector, using default weights detector = MTCNN()

# detect faces in the image results = detector.detect_faces(pixels)

# extract the bounding box from the first face x1, y1, width, height = results[0]['box']

# bug fix x1, y1 = abs(x1), abs(y1) x2, y2 = x1 + width, y1 + height

# extract the face face = pixels[y1:y2, x1:x2]

# resize pixels to the model size image = Image.fromarray(face) image = image.resize(required_size) face_array = asarray(image) return face_array def create_faces_npz(self):

"""Method Creates npz file for all the faces in train_dir, val_dir"""

# Load the training data set trainX, trainy = self.load_dataset(self.dataset_train) print("Training data set loaded")

# load test dataset testX, testy = self.load_dataset(self.dataset_val) print("Testing data set loaded")

# save arrays to one file in compressed format savez_compressed('faces_dataset', trainX, trainy, testX, testy) return def create_faces_embedding_npz(self):

"""Create npz file for all the face embeddings in train_dir, val_dir"""

37 data = load('faces_dataset.npz') trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3'] print('Loaded: ', trainX.shape, trainy.shape, testX.shape, testy.shape)

# load the facenet model model = load_model('facenet_keras.h5') print('Keras Facenet Model Loaded')

# convert each face in the train set to an embedding newTrainX = list() for face_pixels in trainX: embedding = self.get_embedding(model, face_pixels) newTrainX.append(embedding) newTrainX = asarray(newTrainX)

# convert each face in the test set to an embedding newTestX = list() for face_pixels in testX: embedding = self.get_embedding(model, face_pixels) newTestX.append(embedding) newTestX = asarray(newTestX)

# save arrays to one file in compressed format savez_compressed('faces_dataset_embeddings', newTrainX, trainy, newTestX, testy) return def get_embedding(self, model, face_pixels):

"""Calculate a face embedding for each face in the dataset using facenet

Get the face embedding for one face"""

# scale pixel values face_pixels = face_pixels.astype('float32')

# standardize pixel values across channels (global) mean, std = face_pixels.mean(), face_pixels.std() face_pixels = (face_pixels - mean) / std

# transform face into one sample samples = expand_dims(face_pixels, axis=0)

# make prediction to get embedding yhat = model.predict(samples) return yhat[0] def classifier(self):

"""Create a Classifier for the Faces Dataset"""

# load dataset data = load('faces_dataset_embeddings.npz') trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3'] print('Dataset: train=%d, test=%d' % (trainX.shape[0], testX.shape[0]))

# normalize input vectors in_encoder = Normalizer(norm='l2')

38 trainX = in_encoder.transform(trainX) testX = in_encoder.transform(testX)

# label encode targets out_encoder = LabelEncoder() out_encoder.fit(trainy) trainy = out_encoder.transform(trainy) testy = out_encoder.transform(testy)

# fit model model = SVC(kernel='linear', probability=True) model.fit(trainX, trainy)

# save the model to disk

# filename = self.svm_classifier pickle.dump(model, open('SVM_classifier.sav', 'wb'))

# predict yhat_train = model.predict(trainX) yhat_test = model.predict(testX)

# score score_train = accuracy_score(trainy, yhat_train) score_test = accuracy_score(testy, yhat_test)

# summarize print('Accuracy: train=%.3f, test=%.3f' % (score_train * 100, score_test * 100)) return def start(self):

"""Method begins the training process""" start_time = time.time() st = datetime.datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:

%S') print(" -") print("Face trainer Initiated at {}".format(st)) print(" -") # Get faces from the images self.create_faces_npz()

# Get embeddings for all the extracted faces self.create_faces_embedding_npz()

# Classify the faces self.classifier() end_time = time.time() et = datetime.datetime.fromtimestamp(end_time).strftime('%Y-%m-%d %H:%M:

39 print("Face trainer Completed at {}".format(et)) print("Total time Elapsed {} secs".format(round(end_time - start_time), 0)) print(" -") return if name == " main ": facetrainer = FaceTrainer() facetrainer.start() b) Nhận dạng khuôn mặt from base64 import encode import warnings warnings.filterwarnings("ignore") import os, sys sys.path.append(os.path.join(os.path.dirname( file ), ' ')) import cv2 from PIL import Image import numpy as np from mtcnn.mtcnn import MTCNN

# from mtcnn import MTCNN from keras.models import load_model from sklearn.preprocessing import Normalizer, LabelEncoder import pickle import serial import time arduino = serial.Serial(port='COM3', baudrate5200, timeout=.1) class FaceDetector: def write_read(self, x): arduino.write(bytes(x, 'utf-8')) time.sleep(0.05) data = arduino.readline() return data def init (self): self.facenet_model = load_model("facenet_keras.h5") self.svm_model = pickle.load(open("SVM_classifier.sav", 'rb')) self.data = np.load('faces_dataset_embeddings.npz')

# object to the MTCNN detector class self.detector = MTCNN() def face_mtcnn_extractor(self, frame):

"""Methods takes in frames from video, extracts and returns faces from them"""

# Use MTCNN to detect faces in each frame of the video result = self.detector.detect_faces(frame) return result def face_localizer(self, person):

"""Method takes the extracted faces and returns the coordinates"""

# 1 Get the coordinates of the face bounding_box = person['box'] x1, y1 = abs(bounding_box[0]), abs(bounding_box[1]) width, height = bounding_box[2], bounding_box[3] x2, y2 = x1 + width, y1 + height return x1, y1, x2, y2, width, height def face_preprocessor(self, frame, x1, y1, x2, y2, required_size=(160, 160)):

"""Method takes in frame, face coordinates and returns preprocessed image""" # 1 extract the face pixels face = frame[y1:y2, x1:x2]

# 2 resize pixels to the model size image = Image.fromarray(face) image = image.resize(required_size) face_array = np.asarray(image)

# 3 scale pixel values face_pixels = face_array.astype('float32')

# 4 standardize pixel values across channels (global) mean, std = face_pixels.mean(), face_pixels.std() face_pixels = (face_pixels - mean) / std

# 5 transform face into one sample samples = np.expand_dims(face_pixels, axis=0)

# 6 get face embedding yhat = self.facenet_model.predict(samples) face_embedded = yhat[0]

# 7 normalize input vectors in_encoder = Normalizer(norm='l2')

X = in_encoder.transform(face_embedded.reshape(1, -1)) return X def face_svm_classifier(self, X):

"""Methods takes in preprocessed images ,classifies and returns predicted Class label and probability"""

# predict yhat = self.svm_model.predict(X) label = yhat[0] yhat_prob = self.svm_model.predict_proba(X) probability = round(yhat_prob[0][label], 2)

# predicted label decoder out_encoder = LabelEncoder() out_encoder.fit(trainy) predicted_class_label = out_encoder.inverse_transform(yhat) label = predicted_class_label[0] return label, str(probability) def face_detector(self):

"""Method classifies faces on live cam feed

Class labels : sai_ram, donald_trump,narendra_modi, virat_koli"""

# open cv for live cam feed cap = cv2.VideoCapture(0) check_face = 0 while True:

# 1 Extract faces from frames result = self.face_mtcnn_extractor(frame) if result: for person in result:

# 2 Localize the face in the frame x1, y1, x2, y2, width, height = self.face_localizer(person)

# 3 Proprocess the images for prediction

X = self.face_preprocessor(frame, x1, y1, x2, y2, required_size=(160, 160)) # 4 Predict class label and its probability label, probability = self.face_svm_classifier(X) if float(probability) >= 0.9: print(" Person : {} , Probability : {}".format(label, probability)) check_face += 1 if(check_face >= 8): self.write_read(str(1))

# self.write_read(str(0)) print("1") check_face = 0 else: label = 'Unknow' check_face = 0

# 5 Draw a frame cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 155, 255), 2)

# 6 Add the detected class label to the frame cv2.putText(frame, label + probability, (x1, height), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), lineType=cv2.LINE_AA)

# display the frame with label cv2.imshow('frame', frame)

# break on keybord interuption with 'q' if cv2.waitKey(1) & 0xFF == ord('q'): break

# When everything's done, release capture cap.release() cv2.destroyAllWindows() if name == " main ": facedetector = FaceDetector() facedetector.face_detector()

Control Device Via Internet

strLED1 = ""; var LED1_state = 0; function GetArduinoIO() { nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { if (this.responseXML != null) { // XML file received - switch values and LED states

// LED 1 if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue =="on") { document.getElementById("LED1").innerHTML = "ĐÓNG";

LED1_state = 1; document.getElementById("State_LED1").innerHTML = "MỞ";

} else { document.getElementById("LED1").innerHTML = "MỞ";

LED1_state = 0; document.getElementById("State_LED1").innerHTML = "ĐÓNG";

} } } } // send HTTP GET request with LEDs to switch on/off if any request.open("GET", "ajax_inputs" + strLED1 + nocache, true); request.send(null); setTimeout('GetArduinoIO()', 500); strLED1 = "";

} function GetButton1() { if (LED1_state === 1) { LED1_state = 0; strLED1 = "&LED1=0";

} else { LED1_state = 1; strLED1 = "&LED1=1";

body { background-color:#27b0f0; background: linear-gradient(top, #CAE5E8 0%,

#27b0f0 100%); background:-o-linear-gradient(top, #CAE5E8

#27b0f0); background:-moz-linear-gradient(top, #CAE5E8,

#27b0f0); background:-webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#27b0f0)); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr ='#CAE5E8', endColorstr

='#27b0f0'); background: -ms-linear-gradient(top, #CAE5E8,

#27b0f0); background-attachment: fixed; border: 0px; margin: 0px; padding: 0px; color: #000000; font-family: Sans Serif, Arial Western, Verdana; font-size: small; text-align: left; align: left;

} table { border: 0px; width: 60%; align: center; text-align: center; padding: 0px; vertical-align: middle; border-spacing: 0px; box-shadow: 15px 15px 15px #666666;

-moz-box-shadow: 15px 15px 15px #666666; -webkit-box-shadow: 15px 15px 15px #666666; } tr { color: #ffffff; height: 40px;

45 th { background-color: #002147; height: 50px;

} h1 { margin: 25px; font-family: Arial Western, Verdana;

/* text-shadow: 5px 3px 3px #ffffff; */ font-size: 30pt; font-weight: bold; color: #ffffff; border: 0px;

{ margin: 35px; font-family: Arial Western, Verdana;

/* text-shadow: 5px 3px 3px #ffffff; */ font-size: 30pt; font-weight: bold; color: #030303; border: 0px;

} h6 { font-size: 10pt; font-weight: normal; text-shadow: 1px 1px 1px #999999; color: #fdfdfd; margin: 20px;

-webkit-border-radius: 10px; border-radius: 10px; box-shadow: 10px 10px 10px #666666;

-moz-box-shadow: 10px 10px 10px #666666; -webkit-box-shadow: 10px 10px 10px #666666; }

.shadow { border: 1px solid #00676B; box-shadow: 10px 10px 10px #666666;

-moz-box-shadow: 10px 10px 10px #666666; -webkit-box-shadow: 10px 10px 10px #666666; }

.button { background-color: #293F5E; color: #FFFFFF; padding: 4px 35px 4px 35px; text-align: center; margin: 0px; font-family: Arial Western, sans-serif; font-weight: bold; text-decoration: none;

-o-border-radius: 5px; border-radius: 5px; border-color:black; border-top:2px solid; border-bottom:2px solid; border-right:2px solid; border-left:2px solid;

.button:link { background-color: #293F5E; color: #FFFFFF;

.button:visited { background-color: #293F5E; color: #FFFFFF;

.button:hover { background-color: red; color: #FFFFFF;

} button:active { background-color: red; color: #FFFFFF;

} IO_box { background-color: #CAE5E8; float: left; margin: 50 20px 20px 0; border: 1px solid blue; padding: 50 20px 20 5px; width: 250px;

} IO_box:hover { background-color: #E6F1D8; float: left; margin: 50 20px 20px 0; border: 1px solid blue; padding: 50 20px 20 5px; width: 250px;

>

KHOA ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA

ĐỒ ÁN VI XỬ LÝ

Tên thiết bị

Trạng thái

Hành động

ĐÓNG

MỞ

Designed by Nguyen Trung Hieu | Điều khiển cửa tự động thông qua Internet

MÔ HÌNH THỰC NGHIỆM VÀ KẾT LUẬN

YÊU CẦU MÔ HÌNH

- Chế tạo mô hình cửa tự động.

- Thiết kế phần mềm điều khiển cửa bằng phím mật mã tại chỗ.

- Thiết kế phần mềm điều khiển cửa bằng thẻ thông minh.

- Thiết kế phần mềm điều khiển cửa từ xa thông qua ethernet.

- Thiết kế phần mềm điều khiển cửa sự dụng nhận diện khuôn mặt.

Chọn vật liệu làm mô hình

Hiện nay các vật liệu dùng để làm mô hình rất đa dạng và phong phú về chất liệu mẫu mã như ván gỗ, nhựa, xốp, bìa, … Với mô hình của nhóm chúng em sử dụng chất liệu cho mô hình là tấm formex.

MÔ HÌNH

Hình 4 1 Mặt trước phần cứng

- Cửa: mở được nhiều góc khác nhau tùy thuộc vào người dùng.

- Bàn phím: nhập mật mã để mở cửa.

- Module RFID RC522: đọc mã thẻ.

- Màn hình LCD: hiển thị các hoạt động của cửa.

Hình 4 2 Mặt sau mô hình

- Động cơ Servo SG90: chốt cửa.

- Động cơ Servo MG996: đóng mở cửa.

Hình 4 3 Phần cứng bên trong

- Arduino atmega2560: mạch điều khiển chính.

- Arduino Uno R3: truyền nhận tín hiệu cho Atmega 2560.

- Module ethernet: kết nối mạch ethernet với Atmega 2560.

Giao diện cửa điều khiển qua ethernet

KẾT LUẬN VÀ PHƯƠNG HƯỚNG PHÁT TRIỂN CỬA THÔNG MINH

Khi có kết nối dây mạng và module ethernet thì trang web sẽ có giao diện như trên. Khi nhấn mở cửa chốt cửa mở và cửa bắt đầu mở, cửa sẽ dừng mở khi nhấn dừng mở cửa hoặc có tín hiệu cảm biến Nhấn đóng cửa, cửa bắt đầu đóng

Qua quá trình nghiên cứu, tìm hiểu em đã hoàn thành đồ án “Nghiên cứu, xây dựng hệ thống cửa bảo mật và chống giả mạo sử dụng thông tin hình ảnh” với những kết quả thu được như sau:

Nghiên cứu, tìm hiểu các công nghệ của hệ thống cửa tự động đã và đang được sử dụng trên thị trường hiện nay, bao gồm: Nắm được cấu tạo, nguyên lý hoạt động và các thông số kỹ thuật của mỗi thành phần thiết bị cơ bản trong hệ thống cửa tự động loại mở cánh Ngoài ra, chúng em cũng tìm hiểu và triển khai việc sử dụng phương thức nhận dạng khuôn mặt sử dụng thông tin hình ảnh Đồ án đã triển khai chế tạo, lắp đặt mô hình cho hệ thống mở cửa tự động loại mở cánh sử dụng kỹ thuật cảm biến và điều khiển tự động hóa Tìm hiểu, xây dựng phần mềm nhận dạng khuôn mặt.

Tuy nhiên bên cạnh đó, do thời gian có hạn nên đồ án của chúng em còn nhiều hạn chế Việc sử dụng thông tin hình ảnh còn thô sơ, chưa áp dụng các kỹ thuật học sâu tiên tiến trong khâu nhận dạng.

Trong thời gian sắp tới chúng em sẽ cố gắng học hỏi và hoàn thiện đồ án để có thể ứng dụng, triển khai nội dung đề tài này trong các hệ thống thực tế.

Ngày đăng: 17/05/2024, 12:23

HÌNH ẢNH LIÊN QUAN

2.1  Sơ đồ kết nối hệ thống cửa - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
2.1 Sơ đồ kết nối hệ thống cửa (Trang 9)
Hình 2. 2 Sơ đồ chân Arduino Uno R3 - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 2. 2 Sơ đồ chân Arduino Uno R3 (Trang 10)
Sơ đồ chân và Thông số kỹ thuật của Arduino Mega2560: - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Sơ đồ ch ân và Thông số kỹ thuật của Arduino Mega2560: (Trang 11)
Hình 2. 3 Sơ đồ chân Arduino Mega 2560 Bảng 2-2 Bảng chi tiết các chân của Arduino Mega 2560 - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 2. 3 Sơ đồ chân Arduino Mega 2560 Bảng 2-2 Bảng chi tiết các chân của Arduino Mega 2560 (Trang 12)
Bảng 2-3 Bảng ký hiệu và chi tiết chân LCD - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Bảng 2 3 Bảng ký hiệu và chi tiết chân LCD (Trang 14)
Hình 2. 4 Màn hình LCD 16x2 - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 2. 4 Màn hình LCD 16x2 (Trang 14)
Hình 3. 1 Lưu đồ thuật toán hệ thống - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 3. 1 Lưu đồ thuật toán hệ thống (Trang 30)
Hình 3. 2 Lưu đồ thuật toán với phím ma trận 4x4 - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 3. 2 Lưu đồ thuật toán với phím ma trận 4x4 (Trang 31)
Hình 3. 3 Lưu đồ thuật toán với ethernet - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 3. 3 Lưu đồ thuật toán với ethernet (Trang 32)
Hình 3. 4 Lưu đồ thuật toán đóng mở cửa với cảm biến - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 3. 4 Lưu đồ thuật toán đóng mở cửa với cảm biến (Trang 33)
Hình 4. 1 Mặt trước phần cứng - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 4. 1 Mặt trước phần cứng (Trang 56)
Hình 4. 2 Mặt sau mô hình - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 4. 2 Mặt sau mô hình (Trang 57)
Hình 4. 3 Phần cứng bên trong - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 4. 3 Phần cứng bên trong (Trang 57)
Hình 4. 4 Giao diện webserver - tên đề tài nghiên cứu thiết kế thiết bị hệ thống điều khiển cửa thông minh sử dụng họ vi điều khiển
Hình 4. 4 Giao diện webserver (Trang 58)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w