Điều khiển bằng vi điều khiển Arduino Mega2560

Một phần của tài liệu Nghiên cứu hệ thống quan sát cho xe trong việc xác định tình trạng giao thông đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 54)

4.5.1 Giao tiếp với máy tính bằng cổng COM (serial port).

Để truyền tín hiệu điều khiển( lệch làn đường trái, phải, hay đúng làn đường) từ Matlab xuống Arduino và từ Arduino truyền tín hiệu khoảng cách từ cảm biến siêu âm SRF-05 lên để hiển thị trên màn hình vi tính ta dùng lệnh serial (port).

Cú pháp : obj = serial('port','PropertyName',PropertyValue,...) lệnh tạo ra một đối tượng cổng nối tiếp với tên xác định và giá trị đặc tính của nó.

Ví dụ:

S = serial ('com4', 'BaudRate',115200,'Terminator','LF','Timeout',10);

Thiết lập giao tiếp với cổng ‘Com4”, với các thông số: BaudRate, Terminator, Timeout. Dùng lệnh fopen (s) để bắt đầu truyền và nhận tín hiệu từ vi điều khiển gửi lên hay từ trên Matlab gửi xuống.

50 Truyền tín hiệu xuống vi điều khiển ta dùng lệnh Fprintf(s,value). Trong đó s là biến thiết lập giao tiếp, value là giá trị ta muốn truyền thông qua cổng Com.

Để đọc tín hiệu từ vi điều khiển gửi lên ta dùng lệnh A= Fread(s). Đọc dữ liệu nhị phân từ các thiết bị (vi điều khiển) được kết nối với cổng Com và trả về dữ liệu trong biến A.

Nhận tín hiệu từ vi điều khiển gửi lên và in chúng ra màn hình ta dùng lệnh Fcanf(s). Ví dụ: truyền giá trị khoảng cách đo được từ arduino lên Matlab.:

delete(instrfind); clear all

close all

S = serial ('com3', 'BaudRate',115200,'Terminator','LF','Timeout',10); fopen(S); c = fscanf(S) fclose(S); Kết Quả:

51

4.5.2 Dùng vi điều khiển Arduino Mega 2560 để điều khiển.

Sau khi ta truyền tín hiệu từ Matlab xuống vi điều khiển thông qua serial port. Ta tiến hành viết code điều khiển với các tín hiệu được truyền xuống từ Matlab.Ta dùng lệnh arduino() để kết nối vi điều khiển arduino với Matlab. Sau khi kết nối arduino với matlab ta có thể dùng Matlab để điều khiển motor quay góc lái.

Code chương trình phụ lục A..

Hình 4. 7 Sơ đồ nối dây của hệ thống điều khiển

52

Chương 5 THỰC NGHIỆM

5.1 Địa điểm thực nghiệm

Thí nghiệm được thực nghiệm trên xe mô hình với các kích thước:

Hình 5. 1 Xe mô hình

Địa điểm thực nghiệm: Trường Đại học Sư Phạm Kỹ Thuật Thành phố Hồ Chí Minh.

53 Với tốc độ xử lý của máy vi tính có cấu hình như sau:

 Bộ vi xử lý: Intel® Core(TM )i5-4210U CPU @ 1.7GHz

 RAM : 4 GB

 HDD : 500 GB

 Hệ điều hành : Windows 10 Pro (64 bit)

Ngôn ngữ lập trình được sử dụng là Matlab 2014b với các bộ công cụ chính là Computer Vision System, Image Acquistion System và Image Processing System.

Độ phân giải của camera ghi hình là 640x480, tốc độ ghi là 30fps.

5.2 Các hình ảnh khi thực nghiệm

- Khi xe đi đúng làn đường, chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đứng yên đồng thời làm đèn led báo hiệu xe đi đúng làn đường sáng lên.

54

Hình 5. 4 Xe đi đúng làn đường ngoài đường nhựa

- Khi xe lệch phải , chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đánh lái sang trái sau đó dừng một thời gian rồi đánh lái sang phải để giúp xe đi đúng làn đường, đồng thời làm đèn led báo hiệu xe lệch phải sáng lên.

55

Hình 5. 6 Xe đi lệch phải ngoài đường nhựa

- Khi xe lệch trái, chương trình sẽ gửi tín hiệu kiểu số xuống arduino. Từ tín hiệu đó arduino sẽ thực hiện điều khiển motor DC đánh lái sang phải sau đó dừng một thời gian rồi đánh lái sang trái để giúp xe đi đúng làn đường, đồng thời làm đèn led báo hiệu xe lệch phải sáng lên.

56

Hình 5. 8 Xe đi lệch trái ngoài đường nhựa

57

Hình 5. 10 Xe không nhận được làn đường do mờ

Khi có vật cản phía trước: Matlab sẽ lấy tín hiệu từ cảm biến siêu âm tính khoảng

cách thông qua giao tiếp serial port và hiện thị khoảng cách đó lên màn hình Laptop. Nếu khoảng cách bé hơn 40 cm thì đèn led báo hiệu khoảng cách đến vật cản sẽ sáng lên và ngược lại

Hình 5. 11 Nhận dạng vật cản và hiển thị khoảng cách lên màn hình

Khi có người đi bộ: matlab sẽ xử lý ảnh và vẽ một hình hộp chữ nhật xung quanh

58

Hình 5. 12 Nhận dạng người đi bộ

Khi có người và vật cản: thì matlab sẽ xử lý giúp ta nhận dạng được vật cản và vẽ

hộp xung quanh nó bằng màu xanh lá và hiển thị khoảng cách đo được từ cảm biến siêu âm đồng thời nó giúp ta vẽ vẽ một hình hộp chữ nhật xung quanh người để giúp ta nhận biết dễ dàng hơn.

59

Hình 5. 14 Nhận dạng vật cản là chiếc xe thông qua một ảnh từ điện thoại

60

Hình 5. 16 Nhận biết được xe thực tế

61

Hình 5. 18 Nhận dạng được xe và người chuyển động

62

63

Chương 6 KẾT LUẬN

Qua khoảng thời gian qui định thực hiện đề tài, tuy gặp nhiều khó khăn khách quan nhưng người thực hiện đề tài đã cố gắng rất nhiều, mặt dù đề tài đáp ứng yêu cầu đặt ra ban đầu nhưng kết quả đạt được vẫn chưa như kỳ vọng. Sau khi hoàn thành, đề tài thể hiện những kết quả đạt được và chưa được như sau:

Những điều đạt được:

 Ứng dụng được phần mềm Matlab để thu thập, nhận diện và xử lý ảnh ở mức cơ bản dựa vào hình ảnh thu thập được thông qua webcam.

 Xuất được tín hiệu điều khiển và cảnh bào cho người lái biết vị trí của xe so với vị trí mục tiêu.

 Nhận dạng được người đi bộ và vật cản màu đỏ.

 Tính được khoảng cách từ cảm biến siêu âm nhờ lập trình arduino.  Hiển thị khoảng cách đo được từ cảm biến siêu âm lên màn hình.  Điều khiển motor DC đánh lái khi xe đi lệch làn đường .

 Làm cơ sở để thực hiện các đề tài tiếp theo có liên quan đến xử lý ảnh và nhận dạng làn đường, điều khiển xe tự động.

 Người thực hiện đề tài đã lĩnh hội được một lượng lớn kiến thức hoàn toàn mới và bổ ích.

Những điều chưa đạt được:

 Đề tài chỉ thực hiện ở mức độ cơ bản nên chưa thể ứng dụng vào thực tiễn.  Hiển thị khoảng cách và vấn đề nhận dạng làn đường ở những đoạn đường

cong, có chướng ngại vật.

 Nhận dạng và xử lý làn đường có nhiều tín hiệu giao thông cảnh báo.  Nhận dạng và xử lý trên những làn đường không có vạch kẻ đường.

 Điều khiển xe mô hình chạy đúng làn và hiển thị khoảng cách vật cản còn nhiều hạn chế do dùng cảm biến siêu âm SRF-05 có khoảng nhận dạng nhỏ hơn 3m là quá ngắn. Đồng thời do nhiễu nên việc hiển thị khoảng cách đến vật cản đôi khi không chính xác.

64  Nhận dạng làn đường và điều khiển còn chậm không đáp ứng được thời gian

thực.

Hướng phát triển đề tài:

Đề tài hệ thống quan sát cho xe trong việc phát hiện tình trạng giao thông là một đề tài tạo cơ sở cho việc phát triển xe tự động. Do đề tài được thực hiện trên xe mô hình với kích thước lớn nên có thể phát triển để có thể giúp xe mô hình này thành xe tự hành từ đó tạo tiền đề cho phát triển ô tô tự hành mai sau.

Để có thể phát triển thành xe mô hình tự hành thì cần thêm một số yếu tố sau: - Điều khiển cơ cấu lái tối ưu hơn để giúp xe vận hành dễ dàng.

- Kết hợp với xử lý ảnh để nhận biết các tín hiệu giao thông như biển báo, đèn tín hiệu …

- Kết hợp xử lý ảnh và các cảm biến va chạm, radar để quét vật thể 3D nhận dạng chính xác các vật cản, và thêm cảm biến giúp tính toán khoảng cách một cách chính xác để giúp chúng ta có thể xác định chính xác được tọa độ khoảng cách để từ đó đưa ra tính hiệu điều khiển lái chính xác hơn làm tiền đề cho phát triển xe tự động lái.

- Kết hợp hệ thống cảnh báo va chạm, phanh khẩn cấp nếu có vật cản bất ngờ, hệ thống tự đổ xe..

- Phát triển hệ thống giao tiếp giữa các hệ thống kể trên với nhau để đưa ra tín hiệu điều khiển hệ thống lái được chính xác.

65

TÀI LIỆU THAM KHẢO

[1] Trần Quang Khánh, Matlab ứng dụng, Nxb Khoa học kỹ thuật, 2010.

[2] TS.Hồ Văn Sung, Xử lý ảnh số - Lý thuyết và thực hành với Matlab, Nxb Khoa học kỹ thuật, 2013.

[3] The mathWork Inc, Image Processing Toolbox, 2013.

[4] http://www.mathworks.com [5] http://autocarvietnam.vn [6]https://suryatejacheedella.wordpress.com [7] https://stackoverflow.com [8] http://www.mathworks.com/help/images/functionlist.html [9]https://www.arduino.cc/ [10]http://arduino.vn/ [11]https://www.youtube.com/watch?v=UYWeKpke6a8

66 PHỤ LỤC A. Chương trình chính : clear all close all delete(instrfind);

DrawPoly = 1; % Set 0 de ve duong line.

NumRows = 120; % So hang trong vung anh xu ly. MaxLaneNum = 20; % So lan duong toi da de tich luy.

ExpLaneNum = 2; % So lan duong duoc tim trong khung hinh. Rep_ref = zeros(ExpLaneNum, MaxLaneNum); % Line luu tru. Count_ref = zeros(1, MaxLaneNum); % Dem mang luu tru.

TrackThreshold = 75; % Su thay doi toi da cho phep trong khoang cach giua

% hai lan duong.

LaneColors = single([0 0 0;1 1 0; 1 1 0; 1 1 1;1 1 1]); % So khung anh toi thieu de nhan dang.

frameFound = 5;

% So khung anh toi da trong nhan dang. frameLost = 20;

% Cho gia tri Rho 35:45 startIdxRho_R = 415; NumRhos_R = 51;

% Cho gia tri Theta -90:-70deg startIdxTheta_R = 1;

NumThetas_R = 21;

% Cho gia tri Rho 379:415 startIdxRho_L = 380; NumRhos_L = 36;

% Cho gia tri Theta 55:85deg startIdxTheta_L = 146;

67 NumThetas_L = 21;

% Hien thi duong line offset.

offset = int32([0, NumRows, 0, NumRows]);

%%

% Tao doi tuong |VideoFileReader| de doc video tu file.

hVideoSrc = imaq.VideoDevice('winvideo',1,'YUY2_640x480', ... 'ROI', [140 1 360 240], ... 'ReturnedColorSpace', 'rgb'); %imaq.VideoDevice('winvideo',2,'RGB24_640x480', ... %vision.VideoFileReader('viplanedeparture.avi'); %%

% Tao doi tuong |ColorSpaceConverter| de chuyen anh RGB sang anh cuong do.

hColorConv1 = vision.ColorSpaceConverter( ...

'Conversion', 'RGB to intensity');

%%

% Tao doi tuong giup nhan dang nguoi

peopleDetector = vision.PeopleDetector('ClassificationThreshold',... 0,'MergeDetections',false);

%%

% Tao |ImageFilter| de thuc hien loc 2-D FIR de xac dinh bien trong video.

hFilter2D = vision.ImageFilter( ...

'Coefficients', [-1 0 1], ...

'OutputSize', 'Same as first input', ... 'PaddingMethod', 'Replicate', ...

'Method', 'Correlation');

%%

% Tao |Autothresholder| de chuyen doi anh cuong do sang anh nhi phan. hAutothreshold = vision.Autothresholder;

68 %%

% Tao |HoughTransform| de tao duong thang duoc dinh nghia trong bd Hough. hHough = vision.HoughTransform( ... 'ThetaRhoOutputPort', true, ... 'OutputDataType', 'single'); %%

% Tao |LocalMaximaFinder| de tim dinh trong matran bien doi Hough. hLocalMaxFind1 = vision.LocalMaximaFinder( ... 'MaximumNumLocalMaxima', ExpLaneNum, ... 'NeighborhoodSize', [301 81], ... 'Threshold', 1, ... 'HoughMatrixInput', true, ... 'IndexDataType', 'uint16');

% Tao doi tuong |HoughLines| de tim toa do Decac cua duong thang duoc xac

% dinh trong dau duong.

hHoughLines1 = vision.HoughLines('SineComputation', 'Trigonometric function');

%% thiet lap giao tiep voi arduino thong qua serial port a=arduino('com3');

s= serial ('com4', 'BaudRate',115200,'Terminator','LF','Timeout',10); fopen (s); %%

% Dinh nghia tham so de chen text vao trong canh bao lan duong. warnText = {sprintf('Ben phai'), '', sprintf('Ben trai')}; warnTextLoc = [120 170;-1 -1; 2 170];

hVideoOut = vision.VideoPlayer;

69

%%

% Khoi tao bien trong vong lap. Frame = 0; NumNormalDriving = 0; OutMsg = int8(-1); OutMsgPre = OutMsg;

%% Vong lap xu ly.

% Tao vong lap phat hien lan duong trong video nhap vao. % Vong lap nay dung nhung doi tuong da duoc tao.

warningTextColors = {[1 0 0], [1 0 0], [0 0 0], [0 0 0]};

while true

RGB = step(hVideoSrc); %% nhan dang nguoi

[bbox,score] = step(peopleDetector,RGB);

[selectedBbox,selectedScore] = selectStrongestBbox(bbox,score); %% nhan dang vat can mau do

diff_im = imsubtract(RGB(:,:,1), rgb2gray(RGB)); diff_im = medfilt2(diff_im, [3 3]);

% chuyen doi mau toi thanh ket qua nhi phan diff_im = im2bw(diff_im,0.18);

diff_im = bwareaopen(diff_im,300);

% tong hop cac thanh phan trong diem anh bw = bwlabel(diff_im, 8);

stats = regionprops(bw, 'BoundingBox', 'Centroid'); a1='Cm';

c= fscanf(s); %c='22';

label_str = strcat(c,a1);

%% boundingbox vat can va hien thi khoang cach for object = 1:length(stats)

bbox = stats(object).BoundingBox; bc = stats(object).Centroid;

70 RGB = insertShape(RGB, 'Rectangle',bbox, 'Color',

'green','LineWidth',2);

RGB = insertText(RGB,[bc(1), bc(2)], label_str, ... 'FontSize',20, 'BoxOpacity', 1); end

% bounding box nguoi

RGB = insertObjectAnnotation(RGB,'rectangle',selectedBbox,... cellstr(num2str(selectedScore)),'Color','r');

%%

% Chon vung duoi cua video dau vao (dinh nghia vung quan sat) Imlow = RGB(NumRows+1:end, :, :);

% Phat hien bien va bien doi Hough.

Imlow = step(hColorConv1, Imlow); % Chuyen anh RGB sang anh cuong do.

I = step(hFilter2D, Imlow);

% Bao hoa cac gia tri giua 0 va 1. I(I < 0) = 0;

I(I > 1) = 1;

Edge = step(hAutothreshold, I);

[H, Theta, Rho] = step(hHough, Edge);

% Phat hien dinh. H1 = H;

% Mo rong ma tran H voi theta < -78 do va theta >= 78 do. H1(:, 1:12) = 0;

H1(:, end-12:end) = 0;

Idx1 = step(hLocalMaxFind1, H1); Count1 = size(Idx1,1);

% Chon Rhos va Thetas tuong ung voi dinh. Line = [Rho(Idx1(:, 2)); Theta(Idx1(:, 1))];

Enable = [ones(1,Count1) zeros(1, ExpLaneNum-Count1)];

% Theo doi tap hop cac dau phan cach lan duong.

71 MaxLaneNum, ExpLaneNum, Enable, Line, ...

TrackThreshold, frameFound+frameLost);

% Chuyen duong thang tu toa do Polar sang Cartesian.

Pts = step(hHoughLines1, Rep_ref(2,:), Rep_ref(1,:), Imlow);

% Lan duong trai va phai.

[TwoValidLanes, NumNormalDriving, TwoLanes, OutMsg] = ...

videodeparturewarning(Pts, Imlow, MaxLaneNum, Count_ref, ... NumNormalDriving, OutMsg);

% Dien giai: 0 = Right lane departure,

% 1 = Normal driving, 2 = Left lane departure % Output

Frame = Frame + 1; if Frame >= 5

TwoLanes1 = TwoLanes + [offset; offset]'; if DrawPoly && TwoValidLanes

if TwoLanes(4,1) >= 239 Templ = TwoLanes1(3:4, 1); else Templ = [0 239]'; end if TwoLanes(4,2) >= 239 Tempr = TwoLanes1(3:4, 2); else Tempr = [359 239]'; end

Pts_poly = [TwoLanes1(:,1); Templ; Tempr; ... TwoLanes1(3:4,2); TwoLanes1(1:2,2)]; % Ve lan duong. RGB = insertShape(RGB,'FilledPolygon',Pts_poly.',... 'Color',[1 1 1],'Opacity',0.0); end % Ve duong line.

72 RGB = insertShape(RGB,'Line',TwoLanes1',...

'Color',{'yellow','yellow'}); % Chen text canh bao.

txt = warnText{OutMsg+1}; txtLoc = warnTextLoc(OutMsg+1, :); txtColor = single(warningTextColors{mod(Frame-1,4)+1}); RGB = insertText(RGB,txtLoc,txt,'TextColor', txtColor, ... 'FontSize',20, 'BoxOpacity', 0);

%% truyen tin hieu lech trai lech phai xuong arduino thong qua serial port % lech trai if (OutMsg == 0) writeDigitalPin (a,2,1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,1) writePWMVoltage (a, 3,5) pause (0.1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) %writePWMVoltage (a,2,0) pause (0.5) writeDigitalPin (a,12,1) writeDigitalPin (a,13,0) writePWMVoltage (a, 3,5) pause(0.05) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) writePWMVoltage (a, 3,0)

elseif (OutMsg == 1 | OutMsg == 2)

writeDigitalPin (a,2,0) end

73 if (OutMsg == 1) writeDigitalPin (a,4,1); writeDigitalPin (a,12,0); writeDigitalPin (a,13,0); %writePWMVoltage (a,2,0); elseif (OutMsg == 0 | OutMsg == 2) writeDigitalPin (a,4,0) end if (OutMsg == 2) %led sang writeDigitalPin (a,8,1) %dieu khien motor

writeDigitalPin (a,12,1) writeDigitalPin (a,13,0) writePWMVoltage (a,3,5) pause (0.1) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0) %writePWMVoltage (a,3,0) pause (0.5) writeDigitalPin (a,12,0) writeDigitalPin (a,13,1) writePWMVoltage (a,3,5) pause(0.05) writeDigitalPin (a,12,0) writeDigitalPin (a,13,0)

elseif (OutMsg == 0 | OutMsg == 1) %led tat

writeDigitalPin (a,8,0) %writePWMVoltage (a,2,0) end

74 OutMsgPre = OutMsg; step(hVideoOut,RGB); end release(hVideoSrc);

% dong giao tiep voi cong com fclose(s);

B. Xác định dấu phân cách trái / phải

function [TwoValidLanes, NumNormalDriving, TwoLanes, OutMsg] = ... videodeparturewarning(Pts, Imlow, MaxLaneNum, Count_ref, ...

NumNormalDriving, OutMsg)

% hObject handle to exit_pushbutton7 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) Dis_inf = size(Imlow, 2); % Width of image

Halfwidth = Dis_inf * 0.5; Left_dis = single(intmax('int16')); Left_pts = zeros(4, 1); Right_dis = single(intmax('int16')); Right_pts = zeros(4, 1); Pts = Pts(:, [2 1 4 3])'; for i = 1:MaxLaneNum

% Pick the column corresponding to the point closer to the top if Pts(1, i) >= Pts(3, i) ColNum = Pts(2, i); else ColNum = Pts(4, i); end if Count_ref(i) >= 5

centerDis = abs(Halfwidth - ColNum); else

centerDis = Dis_inf; end

75 if (Halfwidth - ColNum) >= 0 % left lane

if centerDis < Left_dis Left_dis = centerDis; Left_pts = Pts(:, i); end

else % right lane if centerDis < Right_dis Right_dis = centerDis; Right_pts = Pts(:, i); end end end % Departure detection if Left_dis < Dis_inf TmpLeftPts = Left_pts; else TmpLeftPts = zeros(4, 1); end if Right_dis < Dis_inf TmpRightPts = Right_pts; else TmpRightPts = zeros(4, 1); end

TwoLanes = int32([TmpLeftPts TmpRightPts]); % Check whether both lanes are valid

Check1 = (TwoLanes(1,:) ~= TwoLanes(3,:)) | ... (TwoLanes(2,:) ~= TwoLanes(4,:));

Check2 = (abs(TwoLanes(1,:) - TwoLanes(3,:)) + ... abs(TwoLanes(2,:) - TwoLanes(4,:))) >= 10;

TwoValidLanes = (Left_dis <= Dis_inf) && (Right_dis <= Dis_inf) && ...

all((TwoLanes(1,:)>=0) & Check1 & Check2);

Diswarn = Dis_inf * 0.4; % Distance threshold for departure warning

Một phần của tài liệu Nghiên cứu hệ thống quan sát cho xe trong việc xác định tình trạng giao thông đồ án tốt nghiệp ngành công nghệ kỹ thuật ô tô (Trang 54)