Tải bản đầy đủ (.pdf) (31 trang)

đề tài hệ thống bãi đỗ xe tự động sử dụng camera cảm biến ir cảm biến chống cháy và mã qr định danh

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (8.56 MB, 31 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG CƠ KHÍ

BÀI TẬP LỚN MƠN HỌC KỸ THUẬT LẬP TRÌNH TRONG CƠ ĐIỆN TỬ

ĐỀ TÀI Hệ thống bãi đỗ xe tự động sử dụng : “camera, cảm biến IR, cảm biến chống cháy và mã

Nhóm sinh viên thực hiện:

Nguyễn Đức Hải 20184432 Cơ điện tử 01-K63 Lê Hoàng Anh 20205242 Cơ điện tử 05-K65 Hoàng Hải Đăng 20205266 Cơ điện tử 06-K65

<small> Hà Nội </small>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<small>2. Giới thiệu linh kiện: ... 9 </small>

<small>2.1 Board mạch Arduino Uno R3: ... 9 </small>

<small>2.2 Động cơ Servo SG90: ... 11 </small>

<small>2.3 Camera USB 2.0: ... 11 </small>

<small>2.4 Cảm biến hồng ngoại IR: ... 12 </small>

<small>2.5 Cảm biến phát hiện lửa: ... 13 </small>

<small>CHƯƠNG II: XÂY DỰNG GIAO DIỆN VÀ LẬP TRÌNH HỆ THỐNG ... 14 </small>

<small>I. Lập trình xây dựng giao diện: ... 14 </small>

<small>1. Xây dựng giao diện chương trình: ... 14 </small>

<small>2. Lập trình cho phần tương tác với giao diện: ... 16 </small>

<small>II. Kết nối và giao tiếp với các thiết bị ngoại vi: ... 19 </small>

<small>CHƯƠNG III: MƠ HÌNH THỰC TẾ VÀ KẾT QUẢ THU ĐƯỢC ... 25 </small>

<small>I. Mơ hình thực tế: ... 25 </small>

<small>II. Kết quả thực nghiệm: ... 26 </small>

<small>III. Đánh giá kết quả thu được: ... 28 </small>

<small>IV. Phương án cải thiện và phương hướng phát triển đề tài: ... 29 </small>

<small>CHƯƠNG IV: KẾT LUẬN ... 30 </small>

<small>TÀI LIỆU THAM KHẢO ... 31 </small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Bản nhận xét của giảng viên hướng dẫn

Giáo viên hướng dẫn ký tên

Sinh viên thực hiện:

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

CHƯƠNG I: GIỚI THIỆU CHUNG VỀ ĐỀ TÀI, ĐẶT VẤN ĐỀ

I. Đặ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 ln ở 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 số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 số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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

II. 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 tố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.

III. 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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

nhau, mã lệnh đơn giản hơn, số lượng thư viện hỗ trợ lớn. Khơng chỉ vậy, Python 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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

Đâ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 hồn tồ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.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

+ 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ể.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

+ 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.

2. Giới thiệu linh kiện:

2.1 Board mạch Arduino Uno R3:

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

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 1. Vi điều khiển ATMega 328P 2. Điện áp hoạt động 1.8 – 5.5V 3. Digital I/O pin 14 4. PWM Digital I/O Pin 6 5. Analog Input Pin 6 6. Cường độ dòng điện ngõ ra 20 mA

7. Flash Memory 32 KB (ATMega 328P) 8. SRAM 2 KB (ATMega 328P)

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

9. EEPROM 1 KB (ATMega 328P) 10. Tốc độ 16 MHz

2.2 Động cơ Servo SG90:

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 q 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.

Thông số kỹ thuật: - Momen xoắn: 1.8kg/cm - Tốc độ hoạt động: 60°/0.1s - Điện áp hoạt động: 4.8V (~5V) - Nhiệt độ hoạt động: 0°C – 55°C 2.3 Camera USB 2.0:

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:

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Thơng số kỹ thuật: - Cảm biết hình ảnh: CMOS - Độ phân giải Video: 5 mega pixel - Độ nét cao: 30mega pixel - Cổng kết nối: USB - Các chức năng khác:

+ Cân bằng trắng: Tự động + Bù màu: 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:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

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 - Dòng tiêu thụ: 15 mA

- Bước sóng phát hiện được: 760 ~ 1100 nm - Góc quét: 0 ~ 60 độ

- Khoảng cách phát hiện: dưới 1 m - Nhiệt độ hoạt động: -25 ~ 85 độ C

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

CHƯƠNG II: XÂY DỰNG GIAO DIỆN VÀ LẬP TRÌNH HỆ THỐNG

I. 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:

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

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 tồ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.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Đồ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.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

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.

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

+ Chụp ảnh phía trước của xe vào, thực hiện lưu vào folder In//Original.

+ Đọ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.

II. 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:

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

- Nút In: Thực hiện gửi các bit dữ liệu tương ứng với chữ I xuống Arduino:

- Nút Out: Thực hiện gửi các bit dữ liệu tương ứng chữ O xuống Arduino:

Ngồ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:

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Để 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:

<small>//Khai báo các thư viện sẽ sử dụng#include<Wire.h></small>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<small>//Khai báo các biến đọc giá trị</small>

<small>int angleIN = 0; //Gia tri goc quay cua Servo In</small>

<small>int angleOUT = 180; //Giá trị góc quay của Servo Out</small>

<small>int angleEmergency = 90; //Giá trị góc quay của Servo khi có tình huống khẩn cấp xảy ra</small>

<small>int SlotOne = 0; //Giá trị đọc từ IR tại ô đỗ xe số 1</small>

<small>int SlotTwo = 0; //Giá trị đọc từ IR tại ô đỗ xe số 2</small>

<small>int SlotThree = 0; //Giá trị đọc từ IR tại ô đỗ xe số 3</small>

<small>int Fire; //Giá trị đọc từ cảm biến cháy</small>

<small>char COMPort = 0; //Giá trị đọc từ cổng giao tiếp với Arduino</small>

<small>int code = 0; //Giá trị sẽ gửi lên cổng giao tiếp với giao diện</small>

<small>int codeRed = 2; //Giá trị sẽ được gửi lên khi có cháy</small>

<small>int codePark = 0; //Giá trị sẽ được gửi lên thông báo trạng thái bãi đỗ xe</small>

<small> //Khởi tạo các chân kết nối với các thành phần phần cứng</small>

<small> pinMode(Buzzer_PIN, OUTPUT ; )</small>

<small> pinMode(FireWarn_PIN, INPUT ; )</small>

<small> pinMode(First_Slot, INPUT ; )</small>

<small> pinMode(Second_Slot, INPUT ; )</small>

<small> pinMode(Third_Slot, INPUT ; )</small>

<small> //Khởi tạo các chân điều khiển Servo của cổng ra vào</small>

<small> ServoIn attach.(ServoIn_PIN); ServoIn write.(angleIN); ServoOut attach.(ServoOut_PIN); ServoOut write.(angleOUT ; )</small>

<small> //Khởi tạo giao tiếp giữa Arduino với PC thông qua cổng COM với mức baudrate 9600</small>

<small> Serial begin.(9600); </small>

<small>//Hàm thực hiện mở và đóng cửa khi có xe vào</small>

<small> for(angleIN = 0; angleIN < ; angleIN++ 90) {</small>

<small> ServoIn write.(angleIN); delay(15); </small>

<small> }</small>

<small> delay(2000); </small>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<small> ServoIn write.(angleIN); delay(15); </small>

<small> }}</small>

<small>//Hàm thực hiện mở và đóng của khi có xe ra</small>

<small> for(angleOUT = 180; angleOUT > ; angleOUT-- 90) {</small>

<small> ServoOut write.(angleOUT); delay(15); </small>

<small> }</small>

<small> delay(2000); </small>

<small> for(angleOUT = ; angleOUT < 90180; angleOUT++ ) {</small>

<small> ServoOut write.(angleOUT); delay(15); </small>

<small> }}</small>

<small>//Hàm thực hiện khi có cháy xảy ra</small>

<small> ServoIn write.(angleEmergency); ServoOut write.(angleEmergency); digitalWrite(Buzzer_PIN, HIGH ; )</small>

<small> Fire == if(1) {</small>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<small> }else {</small>

<small> //Chuyển đổi tín hiệu từ 3 IR sang 1 chuỗi mật mã để gửi lên hệ thống</small>

<small> codePark = 1000 + SlotOne * 100 + SlotTwo * + SlotThree; 10 code = codePark; </small>

<small> ServoIn write.(angleIN); ServoOut write.(angleOUT); }</small>

<small> Serial println.(code); delay(500); </small>

<small> if(Serial available.() > 0) { //Đọc tín hiệu từ cổng giao tiếp</small>

<small> COMPort = Serial.read(); code = codePark; </small>

<small> case 'I': barierIn(); break; case 'O': barierOut(); break; default: break; }</small>

<small> }}</small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

CHƯƠNG III: MƠ HÌNH THỰC TẾ VÀ KẾT QUẢ THU ĐƯỢC

I. Mơ hình thực tế:

Sau q trình thiết kế và xây dựng, mơ hình và giao diện nhóm đã hồn thành như sau:

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

II. Kết quả thực nghiệm:

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:

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

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:

</div>

×