Tên linh kiện Số lượng Điện áp định mức (VDC) Dòng điện định mức (mA) Arduino mega 2560 1 5 30 Led đơn 6 5 10
Led 7 đoạn 2 digit 2 5 10
Từ bảng trên, ta có khối nguồn như sau:
- Điện áp: 5V.
- Dòng điện: 500mA.
Do yêu cầu của đề tài không cần nguồn di chuyển nên sẽ lựa chọn dùng nguồn thông qua cổng USB của máy tính.
3.2.3 Thiết kế mô hình đèn giao thông.
Mô hình thực nghiệm đèn giao thông có kích thước 25cm x 25cm, mô hình thiết kế nhằm mô phỏng một ngã tư gồm 2 tuyến đường một chiều giao nhau. Mỗi trụ đèn gồm có:
1 đèn led 7 đoạn 2 digit.
3 đèn led xanh, đỏ, vàng.
Yêu cầu thiết kế mô hình: - Nhỏ gọn, chắc chắn, dễ di chuyển.
- Mô hình sẽ có 2 mặt và 4 cạnh bên: Mặt trên sẽ trang trí sao cho giống ngã tư và xác định vị trí đặt 2 led 7 đoạn 2 digit và 6 led đơn sao cho phù hợp. Mặt dưới sẽ để arduino mega. Hai mặt sẽ được cố định song song thông qua 4 cạnh bên sẽ được dán chặt vào mỗi mặt.
Hình 3.10 Mặt dưới của mô hình sau khi thiết kế.
3.2.4 Sơ đồ nguyên lý của toàn mạch.
Nguyên lý hoạt động của toàn bộ hệ thống: Có 2 camera được lắp đặt tại 2 trục đường trước mỗi ngã tư. Camera này có nhiệm vụ thu nhận hình ảnh các phương tiện tham gia giao thông trên mỗi tuyến đương mà nó được lắp đặt. Do điều kiện thực tế phải lắp đặt camera ở trên cao để quay làn đường. Điều này gây khó khăn cho nhóm thực hiện. Nên ở đây nhóm thực hiện sẽ đi khảo sát thực tế và quay video 2 làn đường bằng smartphone. Sau đó video sẽ được nhúng vào matlab để mô phỏng camera đang quay trực tiếp 2 làn đường. Hình ảnh thu được từ các camera sẽ được truyền về máy tính đặt tại ngã tư. Máy tính sẽ thu nhận hình ảnh từ camera làm dữ liệu đầu vào cho bộ xử lý ảnh (Matlab). Bộ xử lý ảnh sẽ có nhiệm vụ phân tích và xử lý hình ảnh để đưa ra kết quả số lượng phương tiện tham gia giao thông ở mỗi tuyến đường. Sau khi so sánh số lượng phương tiện ở mỗi tuyến đường bộ xử lý ảnh sẽ tính toán thời gian các đèn xanh ở làn 1 trước, khi làn 1 kết thúc số giây đèn vàng camera của làn 2 sẽ bắt đầu chụp số lượng phương tiện tham gia trên làn 2 và truyền về bộ xử lý ảnh để đưa ra số giây đèn xanh cho làn 2. Khi làn 2 kết thúc số giây đèn vàng thì camera của làn 1 sẽ chụp số lượng phương tiện tham gia trên làn 1 để xử lý và đưa ra số giây đèn xanh cho làn 1. Quy trình sẽ được lặp đi lặp lại như vậy. Khi tính toán được số giây đèn xanh, đỏ, vàng bộ xử lý ảnh sẽ gửi dữ liệu xuống arduino. Arduino sẽ có nhiệm vụ hiển thị số
Arduino mega 2560 Dây kết nối PC &
giây, đèn xanh, đỏ, vàng lên led 7 đoạn và led đơn để người tham gia giao thông quan sát
Chương 4. THI CÔNG HỆ THỐNG.
4.1 GIỚI THIỆU.
Chương này nhóm giới thiệu về hệ thống nhóm đã thực hiện, lưu đồ tổng quát của hệ thống, lưu đồ cho chương trình xử lý ảnh đầu vào, lưu đồ chương trình đếm ảnh, lưu đồ cho chương trình nhận và gửi dữ liệu từ matlab sang arduino trên phần mềm matlab và lưu đồ cho chương trình nhận và gửi dữ liệu từ arduino sang matlab trên kit điều khiển Arduio.
4.2 THI CÔNG HỆ THỐNG. 4.2.1 Thi công bo mạch.
Các bước thi công sản phẩm:
- Vẽ mạch nguyên lý trong Proteus
- Vẽ mạch in ra chân cho các linh kiện để kết nối.
- Làm mạch và hàn linh kiện.
- Kiểm tra hoạt động của mạch thi công
- Kết quả sau khi làm mạch bao gồm khối xử lý trung tâm và khối hiển
thị.
Hình 4.1. Sơ đồ mạch in ra chân từ arduino.
Sơ đồ mạch in ra chân từ arduino được vẽ bằng phần mềm Proteus là phần mềm chuyên về mô phỏng và vẽ mạch in. Mạch có kích thước là 3 x 3cm.
STT Tên linh kiện Giá trị Chú thích Số lượng
1 Arduino Mega 5V; 30mA Module 1
2 Led 7 đoạn 2 digit 2.2V; 10mA 2
3 Led đỏ 1,8V; 10mA 2
4 Led xanh 1,8V; 10mA 2
5 Led vàng 1,8V; 10mA 2
6 Điện trở 330Ω 22
4.2.2 Lắp ráp và kiểm tra.
Ta tiến hành hàn các linh kiện trong khối theo kích thước từ nhỏ đến lớn. Tiếp đó ta lấy dây bus kết nối giữa các khối lại với nhau.
Hình 4.2. Hình ảnh thực tế sau khi thi công.
Sau khi lắp ráp và hàn linh kiện hoàn tất ta tiến hành cấp nguồn từ cổng USB của máy tính vào để kiểm tra mạch xem đèn led trên arduino mega có sáng
đoạn.
4.2.3 Thiết kế giao diện cho người điều khiển.
Hình 4.3. Giao diện điều khiển chính trên PC.
Mô hình bao gồm 2 làn đường 1 chiều. Ở mỗi làn sẽ có 1 led 7 đoạn quét loại 2 digit hiển thị số giây và 3 led đơn biểu hiện tín hiệu đèn giao thông. Sẽ có 2 chế độ điều khiển là AUTO và MANUAL.
- Chế độ AUTO: camera sẽ tự động chụp hình ảnh ở mỗi làn, đếm số lượng phương tiện và hiển thị số giây đèn xanh, đỏ, vàng cho phù hợp.
- Chế độ MANUAL: Cho phép người điều khiển nhập số giây đèn xanh ở mỗi làn. Phòng trường hợp sự cố xảy ra.
4.3 ĐÓNG GÓI VÀ THI CÔNG MÔ HÌNH.
Để mạch hoạt động ổn định, không bị va đập và hỏng hóc ta sẽ thiết kế thêm phần vỏ mica bao bên ngoài mỗi khối. Mỗi vỏ mica sẽ bao gồm 6 mặt tạo thành một hình hộp và ta sẽ cố định mạch vào mặt dưới cùng của vỏ bằng keo 502. Ta sẽ dùng phần mềm CorelDraw để thiết kế
cho cổng kết nối đưa ra kết nối với máy tính.
Về phần mặt trên của mô hình người thiết kế dùng phần mềm CorelDraw để vẽ một ngã tư sau đó in ra và được dán lên mặt trên của mô hình
Hình 4.4.Mô hình sau khi thi công.
4.4 LẬP TRÌNH HỆ THỐNG
4.4.1 Lập trình trên phần mềm Matlab. 4.4.1.1 Sơ đồ khối tổng quát trên matlab. 4.4.1.1 Sơ đồ khối tổng quát trên matlab.
Hình 4.5. Sơ đồ khối tổng quát chính của hệ thống đếm đối tượng trên matlab.Đầu tiên hệ thống sẽ lấy video đầu vào được quay từ camera (do mô hình Đầu tiên hệ thống sẽ lấy video đầu vào được quay từ camera (do mô hình là mô phỏng nếu áp dụng vào thực thế hệ thống sẽ lấy ảnh video được quay trực tiếp thực tế từ smartphone). Video sau khi lấy được sẽ được nâng cao độ tương phản, khử nhiễu, khử bóng, khử độ lệch loại bỏ các đối tượng không quan tâm để giảm sai số cho quá trình đếm đối tương. Sau quá trình xử lý ảnh đầu vào chương trình đếm đối tượng sẽ đếm tất cả các đối tượng còn lại trên ảnh. Kết quả cuối cùng sẽ là số lượng phương tiện có trên hình sẽ được gửi đến vi điều khiển để điểu khiển mô hình.
4.4.1.2 Chi tiết về hệ thống. Đếm số Đếm số đối tượng Chuyển đổi không gian màu Ngõ vào Xác định nền (background) Xác định đối tượng trong ảnh
đưa vào chương trình xử lý ảnh đầu vào. Sau đó chương trình xử lý ảnh đầu vào được tiến hành theo các bước sau:
Bắt đầu
B=Lấy ảnh nền
A=Lấy ảnh có đối tượng
Tìm kích thước ảnh (chiều rộng & chiều dài)
Đặt giá trị ngưỡng = 33 fg=abs(A - B) Chuyển đổi ảnh qua ảnh xám j < chiều dài i < chiều rộng i, j =1 fg(i, j)>33
fg(i, j)=0 fg(i, j)=A(i, j)
1 i=1; j=j+1 2 i=i+1 Đ Đ Đ S S
Hình 4.6. Lưu đồ xử lý ảnh đầu vào.
Bước đầu hệ thống sẽ lấy hai ảnh đầu vào một ảnh nền chụp làn đường khi không có xe và một ảnh khi làn có xe. Hai ảnh này sẽ được chuyển thành ảnh xám để dễ xử lý. Sau đó hệ thống sẽ so sánh hai ảnh trên để tìm ra những đối tượng khác biệt ở đây là các phương tiện đang dừng trước đèn đỏ. Kết quả sau khi so sánh sẽ được khử bóng và tăng độ chi tiết. Sau đó ảnh sẽ được nhị phân hóa, kế tiếp là sử dụng các phương pháp hình thái học như co giãn ảnh, xói mòn, đóng mở đối tượng trong ảnh để thu được các đối tượng trong ảnh cũng loại bỏ các đối tượng không mong muốn.
Dán nhãn đối tượng bằng hàm bwlable()
2
Tăng độ tương phản của ảnh
Chuyển đổi sang ảnh nhị phân
Lấp đầy lỗ trống
Xóa các đối tượng nhỏ Lọc nhiễu
Đếm các đối tượng bằng hàm regionprops()
Gửi dữ liệu sang arduino
MV = imread(anh_dau_vao.jpg'); % đọc ảnh cần xử lý đầu vào
imshow(MV);
Hình 4.7. Ảnh đầu vào.
MV1 = imread(‘anh_nen.jpg’); % đọc ảnh nền đầu vào
imshow(MV1);
Hình 4.8. Ảnh nền.
A = double(rgb2gray(MV));%chuyển đổi sang ảnh xám
B= double(rgb2gray(MV1));
[height, width] = size(A); %Lấy kích thước của ảnh
thresh=33; %lấy ngưỡng
fr_diff = abs(A-B); %so sánh ảnh
%nếu điểm ảnh nhỏ hơn ngưỡng đã chọn gán giá trị điểm ảnh bằng 0 ngược lại giữ nguyên giá trị.
for j = 1:width
else
fg(k,j) = 0; end
end end
sd=imadjust(fg);% tăng độ tương phản của ảnh
level=graythresh(sd);%Lấy ngưỡng tự đông bw=imbinarize(sd,level);%nhị phân ảnh imshow(bw);
Hình 4.9. Ảnh được nhị phân. SE1 = strel('square',2); SE1 = strel('square',2);
anh_mo_rong = imdilate(bw,SE1); %giản nở điểm ảnh imshow(anh_mo_rong);
Hình 4.10. Ảnh sau khi giản nở điểm ảnh.
anh_lap_lo=imfill(anh_mo_rong,'holes');%lấp lỗ trống đối tượng imshow(anh_lap_lo);
Hình 4.11. Ảnh sau khi lấp lỗ trống.
se = strel('square',8);
anh_xoi_mon= imerode(anh_lap_lo,se);%sói mòn đối tượng imshow(anh_xoi_mon);
Hình 4.12. Ảnh sau khi sói mòn.
bw3 = bwareaopen(anh_xoi_mon,250); %xóa các đối tượng nhỏ
imshow(bw3);
Hình 4.13. Ảnh sau xóa các đối tượng nhỏ.
Lable = bwlable(bw3,8);
Hình 4.14. Kết quả sau khi xử lý.
Đếm đối tượng trong ảnh, mỗi đối tượng sẽ được hiển thị bằng một màu sắc khác nhau.
Sau khi dán nhãn được đối tượng. Sử dụng hàm
blobMeasurements = regionprops(labeled,'all');
%trả về các phép đo tập hợp các thuộc tính của mỗi đối tượng. numberofcars = size(blobMeasurements, 1);
%trả về số lượng đối tượng có trong ảnh
Tuy nhiên với phương pháp này có hạn chế nếu các đối tượng quá sát nhau thì sẽ đếm thành 1 đối tượng. Không thể phân loại được phương tiện hoặc người đi bộ.
4.4.2 Lập trình trên kit arduino mega 2560. 4.4.2.1 Sơ đồ khối tổng quát trên Arduino. 4.4.2.1 Sơ đồ khối tổng quát trên Arduino.
Quá trình gửi kết quả xuống Arduino được thực hiện như sau:
Hình 4.15. Sơ đồ khối chương trình nhận dữ liệu từ Matlab sang Aruduino. Aruduino.
Điều khiển ứng dụng trên Arduino: Sau khi nhận được kết quả từ matlab. Arduino sẽ dựa trên kết quả nhận được để quy định số giây đen xanh và trạng thái của các đèn tín hiệu của làn 1. Tiến hành đếm ngược khi hoàn tất chu kì đầu tiên (kết thúc đèn vàng). Arduino sẽ gửi trả dữ liệu về matlab để tiếp tục quá
Dữ liệu từ matlab
Arduino điều khiển
Hiển thị (Led 7 đoạn, led đơn)
4.4.2.2 Chương trình điều khiển trên arduino.
Hình 4.16. Lưu đồ chương trình điều khiển ứng dụng trên Arduino. Code điều khiển ứng dụng trên arduino. Code điều khiển ứng dụng trên arduino.
//=========khai bao thư viện led 7 đoạn============ #include "C:\Users\Dell\Desktop\do_an_2\LEDDisplay.h" LEDDisplay *led;
//khai báo biến
Bắt đầu Biến làn = 0 Kết thúc Hiển thị điều khiển làn 1 Hiển thị điều khiển làn 2 Biến làn = 1 Đúng Sai Sai Sai Đúng While (true) Đúng Biến làn = 3 Biến làn =1
Gửi dữ liệu lên matlab Sai
Biến làn +1 Đúng
int chuc1,donvi1,chuc2,donvi2,num1,num2; unsigned long lastUpdate;
int do2 = 14; int vang2 = 15; int xanh2 = 16; int do1 = 17; int vang1 =18; int xanh1 = 19; int test = 24; int txanh,t; int tx2,tx1,td1,td2; int dem=0; int data =0; void setup() {
//=========khởi tạo Serial========= Serial.begin(9600);
//khởi tạo led 7 đoạn
int digitFlagPins[] = {10,11,12,13}; int segmentPins[] = {2, 3, 4, 5 ,6 ,7 ,8, 9}; int decimalPointPin = 9;
led = new LEDDisplay(4, digitFlagPins, segmentPins, decimalPointPin); //định nghĩa chân pinMode(do1, OUTPUT); pinMode(vang1, OUTPUT); pinMode(xanh1, OUTPUT); pinMode(do2, OUTPUT); pinMode(vang2, OUTPUT);
pinMode(test, OUTPUT); }
//=========chương trình con hiển hiện led 7đoạn quét========= void ht1(void) { int c; for(c=0;c<100;c++) { chuc1=num1/10; donvi1=num1%10; led->displayNumber(chuc1, 1);//den1=m[chuc1]; delay(2); led->displayNumber(donvi1, 0); delay(2); chuc2=num2/10; donvi2=num2%10; led->displayNumber(chuc2, 3);//den1=m[chuc1]; delay(2); led->displayNumber(donvi2, 2); delay(2); } } //=========ham chinh========= void loop() { if(Serial.available()>0) { txanh = Serial.read();
//=======mỗi lần đọc được dữu liệu từ matlab sẽ xữ lý điều khiển làn tiếp theo luân phiên xử lý 2 làn.
lý làn 2 dem=dem+1; if (dem ==3) { dem=1; }
// ========xử lý điều khiển làn 1 gián tiếp điều khiển làn 2=============
if (dem==1) {
tx1= txanh;// thời gian đèn xanh làn 1 được gán bằng dữ liệu nhận về từ matlab
td2= tx1+3;//thời gian đèn đỏ làn 2 sẽ dựa vào đèn xanh làn một công thêm 3 giây đèn vàng. num1=td2; num2=tx1; do { digitalWrite(xanh1, HIGH);//x1=bat; digitalWrite(do2, HIGH);//d2=bat; digitalWrite(vang2, LOW);//v2=tat; digitalWrite(do1, LOW);//d1=bat
ht1(); //gọi hàm con để hiển hiện led 7 đoạn num1--;
num2--; }
//======code xư lý chu kì đèn vàng======= while(num2!=0);
{ digitalWrite(xanh1, LOW);//x1=tat; digitalWrite(vang1, HIGH);//v1=bat; digitalWrite(do2, HIGH);//d2=bat; ht1(); num1--; num2--; if (num1==1) { data=data+1; Serial.write(data); } } while(num1!=0); }
// ========xử lý điều khiển làn 2 gián tiếp điều khiển làn 1=============
else {
tx2= txanh;// thời gian đèn xanh làn 2 được gán bằng dữ liệu nhận về từ matlab
td1= tx2+3;//thời gian đèn đỏ làn 2 sẽ dựa vào đèn xanh làn một công thêm 3 giây đèn vàng. num2=td1; num1=tx2; do { digitalWrite(xanh2, HIGH);//x1=bat;
digitalWrite(vang1, LOW);//v2=tat; digitalWrite(do2, LOW);//d1=bat ht1(); num1--; num2--; } //======code xử lý đèn vàng===== while(num1!=0); num1=num2=3; do { digitalWrite(xanh2, LOW);//x1=tat; digitalWrite(vang2, HIGH);//v1=bat; digitalWrite(do1, HIGH);//d2=bat; ht1(); num1--; num2--; if (num1==1) { data=data+1; Serial.write(data); } } while(num1!=0); } } }
4.5 VIẾT TÀI LIỆU HƯỚNG DẪN SỬ DỤNG, THAO TÁC. 4.5.1 Viết tài liệu hướng dẫn sử dụng.
Bước 1: Kết nối với kit Arduino với máy tính. Bước 2: Chạy video.
Bước 3: Tiến hành chạy chương trình đếm phương tiên giao thông. Bước 4 Quan sát kết quả.
Hình 4.17.Quy trình thao tác với thuật toán đếm số lượng phương tiện.
4.5.2 Quy trình thao tác trên giao diện.
Bước 1: Kết nối kít Arduino với máy tính. Bước 2: Tiến hành chạy video.
Bước 3 Tiến hành chạy chương trình giao diện lựa chọn chế độ auto, hoặc manual.
Bước 5: Quan sát kết quả. Kết quả đếm sẽ hiển thị ở khung số lượng và số giây đèn xanh quy đổi tương ứng.
Chuẩn bị Kết nối với
Arduino Chạy chương trình Quan sát kết quả Chạy video
Chương 5. KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ.
5.1 KẾT QUẢ.
Hình 5.1. Giao diện điều khiển chính.
Sẽ có 2 chế độ điều khiển phòng ngừa trường hợp có sự cố xảy ra.
Chế độ AUTO:
Sau khi lựa chọn chế độ Auto chương trình sẽ dẫn đến một giao diện để người dùng quan sát hệ thống hoạt động ở 2 chế độ khi mật đọ phương tiện tham gia giao thông ít, vừa và đông.
Khi nhấn vào nút nhấn ít. Chương trình sẽ chạy một giao diện mới có tên là guiit_xe. Hoặc khi nhấn vào nút “Đông” chương trình sẽ chạy một giao diện tên là guidong_xe. Để người sừ dụng có thế quan sát quá trình đếm theo lưu lượng khi ít và đông xe.
Kết quả đếm làn ít xe trên giao diện.
Hình 5.3. Kết quả quan sát trên giao diện làn 1 khi ít xe.
Hình ảnh thu về từ camera sẽ được thu lại trước khi chuyển đổi trạng thái từ đèn vàng sang đèn xanh của làn 1. Hình ảnh thu về xử được hệ thống xử lý kết quả