Nguyên lý hoạt động của hệ thống: Trong bài tập lớn này, nhóm chúng em sẽ xây dựng 1 mô hình mô phỏng lại cách thức bãi đỗ xe tự động hoạt động với các công việc cụ thể: - Khi có xe ở vị
GIỚI THIỆU CHUNG VỀ ĐỀ TÀI, ĐẶT VẤN ĐỀ
Đặt vấn đề
Năm 2022 đã chứng kiến số lượng ô tô lưu hành tại Việt Nam vượt mốc 5 triệu xe Sự gia tăng đáng kể phương tiện cá nhân này đã đặt ra cho không chỉ các cấp lãnh đạo mà cả các cá nhân những vấn đề nan giải chính là tắc nghẽn giao thông, ô nhiễm môi trường, … và đặc biệt trong số đó phải kể đến vấn đề về không gian gửi phương tiện
Thực trạng hiện nay cho thấy các bãi đỗ xe hiện nay luôn ở trong trạng thái chật kín, đặc biệt một vài nơi còn có hiện tượng giá gửi đỗ xe quá cao dẫn đến tình hình nhiều phương tiện dừng đỗ trái phép gây lấn chiếm không gian giao thông và gây ùn tắc Bãi đỗ xe truyền thống đã ngày càng trở nên lạc hậu bởi các lý do sau:
- Không đáp ứng đủ không gian gửi đỗ cho số lượng phương tiện ngày càng gia tăng hiện nay
- Thời gian mua vé/ soát vé tương đối cao
- Số lượng vị trí gửi xe còn trống khó kiểm soát
- Vé giấy khó xác thực được chính xác thông tin chủ phương tiện
Chính vì các lý do trên, bãi đỗ xe tự động đã và đang được nghiên cứu, phát triển và ứng dụng rộng rãi Bãi đỗ xe tự động hiện nay có nhiều ưu điểm vượt trội điển hình như:
- Thu thập và lưu trữ dữ liệu nhanh hơn
- Tự động lưu trữ được các thông tin cần thiết: thời gian vào ra của xe, biển số xe, …
- Tăng tính bảo mật của bãi đỗ xe nhờ khả năng đưa ra cảnh báo khi dữ liệu xe ra và dữ liệu của vé không tương ứng
- Kiểm soát tốt không gian gửi đỗ xe
- Tiết kiệm thời gian của người sử dụng bãi đỗ xe và cả quản lý bãi đỗ xe.
Nguyên lý hoạt động của hệ thống
Trong bài tập lớn này, nhóm chúng em sẽ xây dựng 1 mô hình mô phỏng lại cách thức bãi đỗ xe tự động hoạt động với các công việc cụ thể:
- Khi có xe ở vị trí vào, ấn nút In trên giao diện -> Camera thực hiện lưu lại hình ảnh chụp phía trước vào folder tên Original và lấy thời điểm xe vào để phục vụ cho việc tính toán tiền gửi xe -> Barier cổng vào được mở để xe vào và đóng lại tự động sau 5 giây
- Khi xe vào bãi và vào 1 vị trí gửi xe, ô tương ứng với vị trí xe đỗ sẽ thay đổi sang màu đỏ biểu thị ô đó đã có xe đỗ
- Khi xe ra khỏi bãi, ấn nút Out trên giao diện -> Camera thực hiện lưu lại hình ảnh phía trước xe vào folder tên Original và lấy thời điểm xa ra -> Barier cổng ra được mở để xe ra và đóng lại sau 5 giây
- Chức năng phụ: khi có cháy xảy ra, còi báo hiệu và đèn sẽ cảnh báo đồng thời 2 cửa In và Out sẽ mở ra phục vụ cho việc sơ tán.
Các thành phần của hệ thống
1 Bộ xử lý trung tâm:
- Phần cứng: Máy tính laptop cá nhân
- Ngôn ngữ lập trình hệ thống trên máy tính: Python 3
Python là một ngôn ngữ lập trình được sử dụng rộng rãi trong các ứng dụng web, phát triển phần mềm, khoa học dữ liệu và máy học (Machine learning) Ưu điểm lớn nhất của Python là dễ học, hiệu quả, tương thích với nhiều nên tảng khác còn cung cấp khả năng thiết kế giao diện, lập trình game và có khả năng lập trình hướng đối tượng
- Ngôn ngữ lập trình điều khiển Vi điều khiển: C (Arduino) trên môi trường Arduino IDE
Phần mềm chuyên dùng cho việc lập trình cho các loại vi xử lý/ vi điểu khiển như Arduino, ESP, … cung cấp chức năng soạn thảo chương trình và biên dịch, nạp chương trình vào board mạch
- Môi trường lập trình hệ thống trên máy tính: Sublime Text Đây là một trình soạn thảo và chỉnh sửa code miễn phí được sử dụng rộng rãi hiện nay nhờ cung cấp các plugin miễn phí, hỗ trợ trên nhiều nền tảng hệ điều hành khác nhau Các lập trình viên hoàn toàn có thể sử dụng phần mềm này để chỉnh sửa các local file hoặc 1 codebase nhờ Sublime Text
- Các thư viện sử dụng cho việc lập trình:
+ cv2: Thư viện OpenCV dành cho ngôn ngữ lập trình Python, được sử dụng cho việc ghi hình lại của xe
+ pygame: Thư viện sử dụng cho việc lập trình thiết kế đồ họa và giao diện cũng như tương tác trên giao diện
+ serial: Thư viện phục vụ cho giao tiếp giữa các cổng serial với chương trình, ở đây là giao tiếp với Arduino Uno R3
+ openpyxl: Thư viện cung cấp khả năng giao tiếp với file Excel (dạng file là ‘*.xlsx’) để lưu trữ dữ liệu
+ qrcode: Thư viện cho phép tạo QR code, lưu trữ thông tin vào QR code và đọc dữ liệu từ QR code
- Các thư viện hỗ trợ khác:
+ os: Thư viện cung cấp khả năng tương tác với hệ điều hành, ở đây là sử dụng để chuyển hướng đường dẫn tới folder mong muốn và loại bỏ các file trong 1 folder cụ thể
+ time: Trong chương trình này, sử dụng hàm clock trong thư viện để điều chỉnh số fps của giao diện
+ datetime: Thư viện sử dụng để lấy giá trị ngày, giờ, trong chương trình này thì sử dụng để lấy thời điểm xe vào và ra
Arduino Uno R3 là dòng Arduino thế hệ thứ 3, cung cấp cho người dùng khả năng tiếp cận vô cùng dễ dàng với lập trình để điều khiển các thành phần phần cứng có những tính năng mong muốn một cách nhanh chóng với giá cả phải chăng như mạch cảm biến ánh sáng bật tắt đèn, mạch điều khiển động cơ, …
Thông số kỹ thuật của board mạch Arduino Uno R3:
STT Tên thông số Đặc tính
6 Cường độ dòng điện ngõ ra 20 mA
SG90 là loại servo có kích thước vô cùng nhỏ gọn, được sử dụng rộng rãi trong các mô hình nhỏ hoặc các cơ cấu kéo không cần đến lực quá lớn, có tốc độ phản ứng nhanh, dễ dàng điều khiển góc quay bằng cách điều chỉnh độ rộng xung PWM
Nhiệm vụ chính của Camera là ghi lại hình ảnh phần phía trước của xe để người quản lý bãi xe có thể đối chiếu 2 hình ảnh khi xe vào và khi xe ra Trong bài tập lớn này, nhóm sử dụng camera USB 2.0 kết nối trực tiếp với máy tính:
- Cảm biết hình ảnh: CMOS
- Độ phân giải Video: 5 mega pixel
- Độ nét cao: 30mega pixel
+ Cân bằng trắng: Tự động
+ Tự động lấy nét: Không hỗ trợ
2.4 Cảm biến hồng ngoại IR:
Cảm biến IR (Infrared Obstacle Avoidance) nhận diện vật cản bằng ánh sáng hồng ngoại, làm nhiệm vụ xác định ô đỗ xe đã được sử dụng hay chưa:
- Điện áp sử dụng: 3.3 đến 5V DC
- Nhận biết vật cản bằng ánh sáng hồng ngoại
- Tích hợp cảm biến điều chỉnh khoảng cách nhận biết vật cản
- Cổng tín hiệu ra: Digital TTL
2.5 Cảm biến phát hiện lửa:
Cảm biến phát hiện lửa đóng vai trò phát hiện sự cố cháy nổ xảy ra trong bãi đỗ xe và gửi tín hiệu về Arduino để cảnh báo Các thông số kỹ thuật của cảm biến này là:
- Điện áp hoạt động: 3.3 ~ 5.3 VDC
- Bước sóng phát hiện được: 760 ~ 1100 nm
- Khoảng cách phát hiện: dưới 1 m
- Nhiệt độ hoạt động: -25 ~ 85 độ C
XÂY DỰNG GIAO DIỆN VÀ LẬP TRÌNH HỆ THỐNG
Lập trình xây dựng giao diện
Công việc xây dựng giao diện và các tương tác được thực hiện bằng các hàm trong thư viện Pygame trong ngôn ngữ lập trình Python thông qua các câu lệnh cụ thể sau:
1 Xây dựng giao diện chương trình:
Trước hết, để sử dụng được thư viện pygame xây dựng giao diện thì ta cần kích hoạt thư viện trong chương trình bằng lệnh:
Sau đó, thực hiện khai báo giao diện chính, tên của cửa sổ giao diện, biến lưu giá trị fps của giao diện, các màu sẽ sử dụng trên giao diện heo hệ màu RGB và một vài giá trị biến sẽ hiển thị trên màn hình:
Sau khi thực hiện các lệnh trên, ta sẽ thu được cửa sổ giao diện như sau:
2 Lập trình cho phần tương tác với giao diện:
Do bộ nhớ của máy tính có giới hạn nên trong bài tập lớn này, nhóm đã lập trình thực hiện xóa toàn bộ các ảnh chụp được khi ấn nút tắt chương trình nhằm giải phòng bộ nhớ, nhưng vẫn giữ lại thông tin lưu được trong file excel Để nhận diện ra có tương tác trên giao diện, ta nhận biết thông qua biến event nhận được từ hàm get() thuộc thuộc tính mouse của thư viện pygame Đồng thời, để nhận biết nút nào được bấm thì ta sẽ xét theo tọa độ của con trỏ chuột trên màn hình thông qua hàm get_pose() của thuộc tính mouse trong Pygame
Khi ấn nút In thì các dòng lệnh và câu lệnh sẽ được thực hiện bao gồm:
- Kiểm tra số lượng xe đã vào trong bãi (ở trong bài tập lớn này là 3), nếu số lượng xe của bãi khi ấn nút In đã đạt đủ thì sẽ báo bãi xe đầy và không gửi tín hiệu mở cửa xuống cho Arduino để mở Barier
- Nếu vẫn còn chỗ trống thì sẽ thực hiện các bước:
+ Cập nhật số lượng xe đã vào bãi
+ Xóa bỏ các cảnh báo trên ô cảnh báo và ô Time out nếu có + Khởi tạo 1 con số ngẫu nhiên trong khoảng từ 1 đến 10000 để làm
ID cho xe mới vào
+ Chụp ảnh phía trước của xe vào, thực hiện lưu vào folder
+ Đọc ảnh vừa lưu và hiển thị lên giao diện chính của chương trình + Lưu các dữ liệu bao gồm số thứ tự xe vào, ID của xe vào, thời gian vào (thời điểm chính xác, ngày, giờ)
+ Xuất mã QR định danh bao gồm các thông tin: số thự tự, ID của xe vào, thời điểm xe vào, giờ và ngày
+ Gửi tín hiệu xuống Arduino để điều khiển mở cửa
Khi ấn nút Out thì các dòng lệnh và câu lệnh sẽ thực hiện các công việc:
- Kiểm tra số lượng xe trong bãi, nếu không còn xe nào trong bãi thì sẽ báo bãi xe trống, hiển thị chữ “Clear” lên ô cảnh báo
- Nếu vẫn còn xe đang đỗ trong bãi thì sẽ thực hiện:
+ Cập nhật số ô đỗ xe đã sử dụng và số xe đã ra khỏi bãi
+ Xóa bỏ các cảnh báo và Time In nếu có
+ Xác định thời điểm xe ra, lưu và hiển thị lên màn hình
+ Chụp ảnh xe ra, lưu vào file Out//Original
+ Đọc ảnh vừa lưu và hiển thị lên màn hình chính
+ Gửi tín hiệu xuống Arduino để thực hiện mở cửa ra.
Kết nối và giao tiếp với các thiết bị ngoại vi
Để có thể thực hiện giao tiếp với Arduino thông qua cổng kết nối USB, nhóm sử dụng thư viện Serial của Python với các bước sau:
Khai báo cổng kết nối với Arduino để thực hiện truyền dữ liệu:
Trong hàm khai báo này ta cần khai báo các thông số bao gồm tên cổng kết nối giao tiếp với Arduino, mức baudrate, số lượng bit giao tiếp sử dụng (8 bit = 1 byte), timeout và stopbits
Trong phần giao diện, nút In và nút Out khi được ấn sẽ thực hiện truyền 1 byte dữ liệu xuống Arduino qua các lệnh:
- Nút Out: Thực hiện gửi các bit dữ liệu tương ứng chữ O xuống Arduino:
Ngoài ra, để hiển thị xem ô đỗ xe nào đã được sử dụng và cảnh báo cháy nổ, nhóm đã thực hiện đọc tín hiệu từ các cảm biển IR và cảm biến cháy tương ứng và quy đổi sang một mật mã, từ đó gửi từ Arduino lên hệ thống sau đó giải mã để tạo ra các thay đổi tương ứng hiển thị trên giao diện thông qua các dòng lệnh sau: Để có thể gửi đi các dòng mật mã như trên thì trong phần lập trình Arduino, nhóm đã viết chương trình như sau:
//Khai báo các thư viện sẽ sử dụng
//Khai báo các chân kết nối với cảm biến, servo và hệ thống báo cháy (buzzer +
//Khai báo 2 servo điều khiển barier tại cửa ra vào của bãi đỗ xe
//Khai báo các biến đọc giá trị int angleIN = 0; //Gia tri goc quay cua Servo In int angleOUT = 180; //Giá trị góc quay của Servo Out int angleEmergency = 90; //Giá trị góc quay của Servo khi có tình huống khẩn cấp xảy ra int SlotOne = 0; //Giá trị đọc từ IR tại ô đỗ xe số 1 int SlotTwo = 0; //Giá trị đọc từ IR tại ô đỗ xe số 2 int SlotThree = 0; //Giá trị đọc từ IR tại ô đỗ xe số 3 int Fire; //Giá trị đọc từ cảm biến cháy char COMPort = 0; //Giá trị đọc từ cổng giao tiếp với Arduino int code = 0; //Giá trị sẽ gửi lên cổng giao tiếp với giao diện int codeRed = 2; //Giá trị sẽ được gửi lên khi có cháy int codePark = 0; //Giá trị sẽ được gửi lên thông báo trạng thái bãi đỗ xe void setup() {
//Khởi tạo các chân kết nối với các thành phần phần cứng pinMode(Buzzer_PIN, OUTPUT ; ) pinMode(FireWarn_PIN, INPUT ; ) pinMode(First_Slot, INPUT ; ) pinMode(Second_Slot, INPUT ; ) pinMode(Third_Slot, INPUT ; )
//Khởi tạo các chân điều khiển Servo của cổng ra vào
//Khởi tạo giao tiếp giữa Arduino với PC thông qua cổng COM với mức baudrate
//Hàm thực hiện mở và đóng cửa khi có xe vào void barierIn() { for (angleIN = 0; angleIN < ; angleIN++ 90 ) {
} delay(2000); for (angleIN = 90; angleIN > ; angleIN 0 ) {
//Hàm thực hiện mở và đóng của khi có xe ra void barierOut() { for (angleOUT = 180 ; angleOUT > ; angleOUT 90 ) {
} delay(2000); for (angleOUT = ; angleOUT < 90 180 ; angleOUT++ ) {
//Hàm thực hiện khi có cháy xảy ra void accident() {
ServoOut write (angleEmergency); digitalWrite(Buzzer_PIN, HIGH ; ) delay( 500 ) ; digitalWrite(Buzzer_PIN, LOW ; )
//Đối với IR, khi chưa có vật trong vùng phát hiện thì tín hiệu Digital luôn đọc được là mức HIGH (1)
//Đối với Flame sensor, khi chưa có lửa thì tín hiệu Digital đọc được là mức LOW (0)
Fire = digitalRead(FireWarn_PIN); code = ; 0
//Chuyển đổi tín hiệu từ 3 IR sang 1 chuỗi mật mã để gửi lên hệ thống codePark = 1000 + SlotOne * 100 + SlotTwo * + SlotThree; 10 code = codePark;
Serial println (code); delay( 500 ) ; if (Serial available () > 0) {
//Đọc tín hiệu từ cổng giao tiếp
COMPort = Serial.read(); code = codePark; switch (COMPort) { case 'I': barierIn() ; break ; case 'O': barierOut(); break ; default: break ;
MÔ HÌNH THỰC TẾ VÀ KẾT QUẢ THU ĐƯỢC
Mô hình thực tế
Sau quá trình thiết kế và xây dựng, mô hình và giao diện nhóm đã hoàn thành như sau:
Vì trong xe chưa có ô đỗ xe nào được sử dụng nên 3 ô hiển thị 3 vị trí đỗ xe vẫn là màu xanh lá cây Khi có xe vào, ấn nút In thì giao diện sẽ thay đổi thành như sau: đầu tiên sẽ xuất hiện mã QR định danh cho xe, sau đó khi ấn nút Space trên bàn phím thì hệ thống sẽ tắt mã QR, sau đó hiển thị ảnh chụp phía trước của xe lên và sau đó hiện mã ID của xe gửi và gửi tín hiệu mở cửa xuống cho Arduino:
Khi có xe ra, ấn nút Out thì gia diện sẽ thay đổi thành: Đối với trường hợp trong bãi đỗ xe chưa có xe nào đỗ mà mình ấn nút ra thì sẽ có hiển thị Clear trong phần cảnh báo
Trường hợp trong bãi đỗ xe đã có xe, ở đây là 1 vật ở ô đỗ xe số 1 và 1 vật ở ô đỗ xe số 2 thì trên giao diện sẽ hiển thị như sau:
III Đánh giá kết quả thu được:
- Do kết nối dây chưa được chắc chẵn cũng như chương trình chưa được tối ưu hoàn toàn nên đôi lúc giao tiếp từ Arduino lên hệ thống bị mất, không gửi được tín hiệu lên hệ thống để cập nhật trạng thái của bãi đỗ xe hay cảnh báo cháy
- Các chức năng còn đơn giản, áp dụng vào thực tế thì tính bảo mật của bãi xe còn chưa cao, cần có cải thiện về hệ thống an ninh cũng như phương pháp đối chiếu, lưu trữ dữ liệu
IV Phương án cải thiện và phương hướng phát triển đề tài: Để có thể áp dụng vào thực tế, hệ thống cần phát triển thêm về khả năng bảo mật, an ninh và giao tiếp giữa PC – Arduino, đồng thời cần có phương pháp đối chiếu dữ liệu phù hợp như xử lý ảnh nhận diện biển số xe và xử lý nhận diện mã
QR để đọc thông tin rồi đối chiếu với cơ sở dữ liệu để xác định xe đã gửi bao lâu và đối chiếu ảnh khi vào và khi ra để đảm bảo an ninh
Ví dụ về đọc thông tin từ mã QR dành cho việc lưu trữ và đối chiếu:
Ngoài ra, phần giao diện vẫn còn đơn giản, cần được nâng cấp bằng các thư viện thiết kế giao diện GUI khác tốt hơn như PyQt5, TKinter, …
Đánh giá kết quả thu được
- Do kết nối dây chưa được chắc chẵn cũng như chương trình chưa được tối ưu hoàn toàn nên đôi lúc giao tiếp từ Arduino lên hệ thống bị mất, không gửi được tín hiệu lên hệ thống để cập nhật trạng thái của bãi đỗ xe hay cảnh báo cháy
- Các chức năng còn đơn giản, áp dụng vào thực tế thì tính bảo mật của bãi xe còn chưa cao, cần có cải thiện về hệ thống an ninh cũng như phương pháp đối chiếu, lưu trữ dữ liệu.
Phương án cải thiện và phương hướng phát triển đề tài
Để có thể áp dụng vào thực tế, hệ thống cần phát triển thêm về khả năng bảo mật, an ninh và giao tiếp giữa PC – Arduino, đồng thời cần có phương pháp đối chiếu dữ liệu phù hợp như xử lý ảnh nhận diện biển số xe và xử lý nhận diện mã
QR để đọc thông tin rồi đối chiếu với cơ sở dữ liệu để xác định xe đã gửi bao lâu và đối chiếu ảnh khi vào và khi ra để đảm bảo an ninh
Ví dụ về đọc thông tin từ mã QR dành cho việc lưu trữ và đối chiếu:
Ngoài ra, phần giao diện vẫn còn đơn giản, cần được nâng cấp bằng các thư viện thiết kế giao diện GUI khác tốt hơn như PyQt5, TKinter, …