Kết quả thu được: • Giới thiệu tổng quan các linh kiện, vật liệu chính trong mô hình. • Nghiên cứu, mô hình hóa, mô phỏng động lực học của mô hình trên phần mềm Matlab Simulink. • Thiết kế, chế tạo mô hình máy bay Quadcopter theo cơ cấu động cơ nâng đồng trục. • Thiết kế, chế tạo dàn phun thuốc trừ sâu, phù hợp với kích thước của máy bay. • Tích hợp hoàn chỉnh dàn phun và mô hình máy bay Quadcopter. • Thực hiện bay thử nghiệm thành công và đặt được những thông số đề ra ban đầu.
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NÔNG LÂM THÀNH PHỐ HỒ CHÍ MINH KHĨA LUẬN TỐT NGHIỆP CHẾ TẠO, ỨNG DỤNG ROBOT BAY CÁNH QUADROTOR TRONG NÔNG NGHIỆP Sinh viên thực : HÀN VĂN THI DƯƠNG QUYNH Ngành : CƠ ĐIỆN TỬ Niên khóa : 2013 – 2017 Thá ng 06/ 201 CHẾ TẠO, ỨNG DỤNG ROBOT BAY CÁNH QUADROTOR TRONG NÔNG NGHIỆP TÁC GIẢ HÀN VĂN THI – DƯƠNG QUYNH Khóa luận tốt nghiệp đệ trình đáp ứng yêu cầu cấp Kỹ sư ngành Cơ Điện Tử Giáo viên hướng dẫn: TS VƯƠNG THÀNH TIÊN ThS NGUYỄN TẤN PHÚC Tháng 06 năm 2017 LỜI CẢM ƠN Em xin trân trọng cảm ơn tất quý thầy cô trường Đại học Nơng Lâm TP.Hồ Chí Minh q Thầy Cơ khoa Cơ Khí - Cơng Nghệ trang bị cho em kiến thức quý báu giúp đỡ em suốt trình học tập trường Em xin chân thành cảm ơn thầy cô môn Cơ Điện Tử giúp đỡ em nhiệt tình thời gian thực Đề tài Em xin bày tỏ biết ơn chân thành thầy Nguyễn Tấn Phúc thầy Vương Thành Tiên tận tình hướng dẫn em suốt trình làm Luận văn tốt nghiệp Đặc biệt, em xin cảm ơn quý thầy cô hội đồng dành thời gian nhận xét góp ý để luận văn em hoàn thiện Cuối cùng, em xin gửi lời cảm ơn đến người thân bạn bè động viên, ủng hộ tạo cho em điều kiện thuận lợi suốt trình hồn thành luận văn Tp.Hồ Chí Minh, tháng 06 năm 2017 Sinh viên thực Hàn Văn Thi Dương Quynh TĨM TẮT Đề tài: “Chế tạo, ứng dụng mơ hình Robot bay cánh Quadrotor nơng nghiệp” thực Khoa Cơ Khí – Cơng Nghệ, Trường Đại Học Nơng Lâm Thành Phố Hồ Chí Minh Thời gian thực từ tháng đến tháng năm 2017 Đề tài thực thành công việc nghiên cứu, mơ động lực học mơ hình máy may Quadcopter phần mềm Matlab Simulink, thiết kế, ứng dụng thành cơng mơ hình máy bay cánh Quadcopter tích hợp dàn phun thuốc trừ sâu phục vụ nơng nghiệp Hồn thành báo cáo hồn chỉnh phương pháp trình tự bước nghiên cứu, thiết kế, xây dựng khí, mơ hình hóa, kết thử nghiệm Là tiền đề cho khóa sau tham khảo, tiếp tục phát triển tối ưu hóa đề tài Kết thu được: • • Giới thiệu tổng quan linh kiện, vật liệu mơ hình Nghiên cứu, mơ hình hóa, mơ động lực học mơ hình phần mềm Matlab Simulink • Thiết kế, chế tạo mơ hình máy bay Quadcopter theo cấu động nâng đồng trục • Thiết kế, chế tạo dàn phun thuốc trừ sâu, phù hợp với kích thước máy bay • Tích hợp hồn chỉnh dàn phun mơ hình máy bay Quadcopter • Thực bay thử nghiệm thành công đặt thơng số đề ban đầu Vì nhiều lý lo khách quan, thời gian độ rộng lớn đề tài, nên dù cố gắng phương pháp nghiên cứu chúng em không tránh khỏi thiếu sót Chúng em mong nhận đóng góp ý kiến q thầy/cơ bạn bè để đề tài em hoàn thiện MỤC LỤC Trang TRANG TỰA i DANH MỤC CÁC TỪ VIẾT TẮT Ký tự PID Nguồn gốc Proportional Integral Derivative Kp Ki Kd GPS Proportional Gain Integral Gain Derivative Gain Global Positioning System BLDC Motor KV Brushless Direct Current Motor ESC Electric Speed Controler PPM IC Pulse Position Modulation Integrated Circuit FET VCC Field Effect Transistor Voltage Common Collector GND POT Ground Percent of Overshoot KiloVolt Chú giải Bộ điều khiển PID chế phản hồi vòng điều khiển (bộ điều khiển) tổng quát sử dụng rộng rãi hệ thống điều khiển cơng nghiệp Thơng số tỉ lệ Thơng số tích phân Thơng số vi phân Hệ thống định vị tồn cầu - hệ thống xác định vị trí dự vị trí vệ tinh nhân tạo Bộ Quốc phòng Hoa Kỳ thiết kế xây dụng, vận hành quản lý Động chiều không chổi than Số vòng quay động chiều không chổi than quay Volt điện Mạch điều khiển tốc độ động chiều khơng chổi than Điều chế xung vị trí Vi mạch tập hợp mạch điện chứa linh kiện bán dẫn transistor linh kiện điện tử thụ động kết nối với để thực chức xác định Transistor hiệu ứng trường Điện áp cấp xung tích cực (Xuất phát từ cách đặt tên cơng nghệ tạo vi mạch tích hợp CMOS) Nối đất Là sai lệch giá trị cực đại giá trị xác lập đáp ứng, tính theo phần trăm Ký hiệu t U I P S V ps p DANH MỤC CÁC KÝ HIỆU Tên gọi Đơn vị Phút V A W m2 m/s kg/m3 kg/m3 Thời gian Điện Dòng điện Cơng suất Diện tích Vận tốc Mật độ khơng khí Áp suất khơng khí DANH MỤC CÁC BẢNG Trang DANH MỤC CÁC HÌNH Trang Hình 1.1: Sản phẩm Agras MG-1 DJI Hình 1.2: Chú ong robot với phần lưới bên có khả thu giữ phấn hoa hoa đực để thụ phấn cho hoa Hình 1.3: Máy bay khơng người lái DAx8 Hình 1.4: Mơ hình máy bay phun thuốc trừ sâu thầy Phan Kế Hiển, giảng viên khoa Kỹ thuật điện tử - Trường Cao đẳng nghề KTCN Việt Nam - Hàn Quốc Hình 1.5: Mơ hình máy bay phun thuốc trừ sâu Hình 1.6: Máy bay phun thuốc trừ sâu Tỉnh Đồng Tháp Hình 2.1: Mơ hình Quadcopter Hình 2.2: Ngun lý hoạt động Quadcopter Hình 2.3: Sơ đồ điều khiển PID Hình 2.4: Cấu trúc điều khiển PID Hình 2.5: Cơng thức điều khiển PID Hình 2.6: Các tiêu chí đánh giá điều khiển PID Hình 2.7: Kp- Khâu tỉ lệ Hình 2.8: Ki- khâu tích phân Hình 2.9: Kd- Khâu vi phân Hình 2.10: Cơng thức Ziegler – Nichols Hình 2.11: Động Brushless DC Hình 2.12: Các Rotor BLDC nam châm vĩnh cửu, stator xếp cuộn dây Hình 2.13: Việc bố trí cuộn dây BLDC hiển thị đây, với màu sắc khác cho cuộn dây khác Hình 2.14: Các cuộn dây cấp điện từ nguồn điện DC trở thành nam châm điện Hình 2.15: Các Rotor di chuyển phía cuộn dây lực hút hai nam châm trái dấu Hình 2.16: Trong BLDC Hình 2.17: Các DC điện áp cần thiết cuộn dây Hình 2.18: Động Tarot 2814/700KV Hình 2.19: Cánh Quạt Hình 2.20: ESC HOBBYWING 40A Hình 2.21: Mạch APM 2.8 Hình 2.22: Bơm áp lực Mini 12V 36W Hình 2.23: Cảm biến MPU 6050 Hình 2.24: Nguyên lý Accelerometer Hình 2.25: Nguyên lý quay hồi chuyển Gyro Hình 2.26: Một số kết cấu Quadcopter Hình 2.27: Thiết bị bay khơng người lái Hình 2.28: Một số thiết bị bay có chức tương tự Hình 2.29: Motor đồng trục Hình 2.30: Quadcopter với thiết kế động đồng trục Hình 2.31: Ảnh minh họa Hình 2.32: Pin Lipo Hình 2.33: Sơ đồ kết nối ESC với thiết bị khác Hình 2.34: Sơ đồ mạch nguyên lý điều khiển tốc độ máy bơm Hình 4.1: Sơ đồ cấu hình Quadcopter Hình 4.2: Quy ước trục Hình 4.3: Tổng quan Mơ Hình 4.4: Khối điều khiển trạng thái Hình 4.6: Khối Nhiễu Hình 4.7: Khối động lực Motor Hình 4.8: Giao diện GUI mơ Hình 4.9: Sơ đồ kết nối phần máy bay mơ hình Hình 4.10: Bản vẽ 2D mơ hình Quadcopter Hình 4.11: Mơ hình hóa phần mềm SolidWorks Hình 4.12: Cấu tạo dàn phun thuốc trừ sâu Hình 4.13: Mơ 3D dàn phun thuốc trừ sâu Hình 4.14: Càng đáp Hình 4.15: Mơ hình thực tế bay thử nghiệm Hình 4.16: Giao diện Mission Planner 10 % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end % - Executes on slider movement function AZslider_Callback(hObject, eventdata, handles) % hObject handle to AZslider (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider handles.AZval = get(hObject,'Value')*360; % Cai dat goc phuong vi theo handles.ELval = get(handles.ELslider,'Value')*90; % Dat che xem cao theo view(handles.axes1,handles.AZval,handles.ELval); view(handles.axes2,handles.AZval,handles.ELval); drawnow guidata(hObject,handles); % - Executes during object creation, after setting all properties function AZslider_CreateFcn(hObject, eventdata, handles) % hObject handle to AZslider (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called 87 % Hint: slider controls usually have a light gray background if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end % - Executes during object creation, after setting all properties function axes1_CreateFcn(hObject, eventdata, handles) % hObject handle to axes1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes1 function points = circlePoints(center, radius, numberOfPoints) % Helper function for plotting points % Inspired by "circle()" from Peter Corke's MATLAB Robotics Toolbox c = center.'; % [x;y] location of center r = radius; n = numberOfPoints; % compute points around the circumference th = (0:n-1)'/n*2*pi; % angles coresponding to each point x = r*cos(th) + c(1); % x part y = r*sin(th) + c(2); % y part points = [x,y].'; if length(c) > z = ones(size(x))*c(3); % z part points = [x, y, z].'; end function frameSkips_Callback(hObject, eventdata, handles) % hObject handle to frameSkips (see GCBO) 88 % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of frameSkips as text % str2double(get(hObject,'String')) returns contents of frameSkips as a double handles.frameSkipVal = str2double(get(hObject,'String')); guidata(hObject,handles); % - Executes during object creation, after setting all properties function frameSkips_CreateFcn(hObject, eventdata, handles) % hObject handle to frameSkips (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows % See ISPC and COMPUTER if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end handles.frameSkipVal = str2double(get(hObject,'String')); guidata(hObject,handles); function plotAnim(button, handles) hObject = button; mode = get(hObject,'String'); handles = guidata(gcbo); j = handles.j; if strcmp(mode,'Start') set(hObject,'String','Stop') guidata(hObject,handles) A = evalin('base', 'yout'); 89 tout = evalin('base', 'tout'); frameSkipVal = str2double(get(handles.frameSkips,'String'))+1; r = 5; d = 1.25; h = 25; % cm, and rotor height above arms (entirely cosmetic) a = 1; b = 1; c = 0.2; % Construct rotor representations N = [d h].';% m1 rotor center E = [0 -d h].';% m4 rotor center W = [0 d h].';% m2 rotor center S = [-d h].';% m3 rotor center Nr = circlePoints(N, r, 20); Nr = [Nr Nr(:,1)]; % Rotor blade circles Er = circlePoints(E, r, 20); Er = [Er Er(:,1)]; Wr = circlePoints(W, r, 20); Wr = [Wr Wr(:,1)]; Sr = circlePoints(S, r, 20); Sr = [Sr Sr(:,1)]; % Motors connecting to center of blade circles mN = [d,d; 0,0; h,0]; mE = [0,0; -d,-d; h,0]; mW = [0,0; d,d; h,0]; mS = [-d,-d; 0,0; h,0]; % Construct body plot points bNS = [ d, -d; 0, 0; 90 0, 0]; %For drawing the body "X" shape bEW = [ 0, 0; d, -d; 0, 0]; % Body Top = [ a/2, 0,-a/2, 0; 0, b/2, 0,-b/2; c/2, c/2, c/2, c/2]; Bot = vertcat(Top(1:2,:),-Top(3,:)); NEB = [ a/2, a/2, 0, 0; 0, 0, b/2, b/2; c/2,-c/2,-c/2, c/2]; NWB = [ a/2, a/2, 0, 0; 0, 0,-b/2,-b/2; c/2,-c/2,-c/2, c/2]; SEB = -NWB; SWB = -NEB; phi = A(1,4); the = A(1,5); psi = A(1,6); % Rib R = [cos(psi)*cos(the) cos(psi)*sin(the)*sin(phi)-sin(psi)*cos(phi) cos(psi)*sin(the)*cos(phi)+sin(psi)*sin(phi); sin(psi)*cos(the) sin(psi)*sin(the)*sin(phi)+cos(psi)*cos(phi) sin(psi)*sin(the)*cos(phi)-cos(psi)*sin(phi); -sin(the) cos(the)*sin(phi) cos(the)*cos(phi)]; % Support for X-configuration if (~evalin('base','quadModel.plusConfig')) Rz = [ sqrt(2)/2, sqrt(2)/2, 0; 91 -sqrt(2)/2,sqrt(2)/2, 0; 0, 0, 1]; Nr=Rz*Nr; Er=Rz*Er; Wr=Rz*Wr; Sr=Rz*Sr; mN = Rz*mN; mE = Rz*mE; mW = Rz*mW; mS = Rz*mS; bNS = Rz*bNS; bEW = Rz*bEW; Top = Rz*Top; Bot = Rz*Bot; NEB = Rz*NEB; NWB = Rz*NWB; SWB = Rz*SWB; SEB = Rz*SEB; end % Bring in and rotate body frame velocity vector U = A(:,7); V = A(:,8); W = A(:,9); Vi = zeros(length(A),3); MvMax= max(sqrt(U.^2+V.^2+W.^2)); Vb = 3/MvMax*[U, V, W].'; Vi(1,:) = R*Vb(:,1); % Angular Velocity Vector P = A(:,1); Q = A(:,2); 92 Rw = A(:,3); omi = zeros(length(A),3); MombMax = max(sqrt(P.^2+Q.^2+Rw.^2)); omb = 3/MombMax*[P,Q,Rw].'; omi(1,:) = R*omb(:,1); phi = A(:,4); the= A(:,5); psi = A(:,6); minX = min(A(:,10))*3.28; % meters to feet minY = min(A(:,11))*3.28; %minZ = min(A(:,12))*3.28; maxX = max(A(:,10))*3.28; maxY = max(A(:,11))*3.28; maxZ = max(A(:,12))*3.28; colors = jet(length(A(:,10))); % ROTATION MATRIX BELOW - ZYX ROTATION R = cell(length(A),1); for i = 1:length(A) R{i,1} = [cos(psi(i))*cos(the(i)) cos(psi(i))*sin(the(i))*sin(phi(i))sin(psi(i))*cos(phi(i)) cos(psi(i))*sin(the(i))*cos(phi(i)) +sin(psi(i))*sin(phi(i)); sin(psi(i))*cos(the(i)) sin(psi(i))*sin(the(i))*sin(phi(i)) +cos(psi(i))*cos(phi(i)) sin(psi(i))*sin(the(i))*cos(phi(i))cos(psi(i))*sin(phi(i)); -sin(the(i)) cos(the(i))*sin(phi(i)) cos(the(i))*cos(phi(i))]; end while ( strcmp(get(hObject,'String'),'Stop')) handles = guidata(gcbo); j = handles.j; 93 guidata(hObject,handles); % Update handles data Vi(j,:) = R{j,1}*Vb(:,j); NrR = R{j,1}*Nr; ErR = R{j,1}*Er; WrR = R{j,1}*Wr; SrR = R{j,1}*Sr; bNSR = R{j,1}*bNS; bEWR = R{j,1}*bEW; TopR = R{j,1}*Top; BotR = R{j,1}*Bot; % Rotate body parts Via Initialized R mNr = R{j,1}*mN; mEr = R{j,1}*mE; mWr = R{j,1}*mW; mSr = R{j,1}*mS; NEBR = R{j,1}*NEB; NWBR = R{j,1}*NWB; SWBR = R{j,1}*SWB; SEBR = R{j,1}*SEB; % Plot the quad rotation and ang velocity and inertial frame velocity vector axes(handles.axes1) plot3(bNSR(1,:),bNSR(2,:),bNSR(3,:),'b','LineWidth',3) hold on plot3(bEWR(1,:),bEWR(2,:),bEWR(3,:),'b','LineWidth',3) plot3(NrR(1,:),NrR(2,:),NrR(3,:),'g') plot3(ErR(1,:),ErR(2,:),ErR(3,:),'k') plot3(WrR(1,:),WrR(2,:),WrR(3,:),'k') plot3(SrR(1,:),SrR(2,:),SrR(3,:),'g') plot3(mNr(1,:),mNr(2,:),mNr(3,:),'k','LineWidth',4) % Motor 94 plot3(mEr(1,:),mEr(2,:),mEr(3,:),'k','LineWidth',4) % Motor plot3(mWr(1,:),mWr(2,:),mWr(3,:),'k','LineWidth',4) % Motor plot3(mSr(1,:),mSr(2,:),mSr(3,:),'k','LineWidth',4) % Motor fill3(TopR(1,:),TopR(2,:),TopR(3,:),'r'); alpha(0.8); fill3(BotR(1,:),BotR(2,:),BotR(3,:),'g'); alpha(0.8); grey = [0.5 0.5 0.5]; ne = fill3(NEBR(1,:),NEBR(2,:),NEBR(3,:),'c'); alpha(ne,0.8); nw = fill3(NWBR(1,:),NWBR(2,:),NWBR(3,:),grey); alpha(nw,0.8); sw = fill3(SWBR(1,:),SWBR(2,:),SWBR(3,:),grey); alpha(sw,0.8); se = fill3(SEBR(1,:),SEBR(2,:),SEBR(3,:),grey); alpha(se,0.8); xlabel('X') ylabel('Y') zlabel('Z') xlim([-3 3]) ylim([-3 3]) zlim([-3 3]) handles.AZval = get(handles.AZslider,'Value')*360; handles.ELval = get(handles.ELslider,'Value')*90; view(handles.axes1,handles.AZval,handles.ELval) omi(j,:) = R{j,1}*omb(:,j); qp1 = quiver3(0,0,0,omi(j,1),omi(j,2),omi(j,3),'r'); qp2 = quiver3(0,0,0,Vi(j,1),Vi(j,2),Vi(j,3),'k'); axis square grid on hold off drawnow if (j==1) cla(handles.axes2) else if (handles.skipFlag==1) 95 cla(handles.axes2) X = A(1:frameSkipVal:j,10)*3.28; Y = A(1:frameSkipVal:j,11)*3.28; Z = A(1:frameSkipVal:j,12)*3.28; axes(handles.axes2) hold on scatter3(X,Y,Z,36,colors(1:frameSkipVal:j,:)); end end X = A(j,10)*3.28; Y = A(j,11)*3.28; Z = A(j,12)*3.28; axes(handles.axes2) hold on scatter3(X,Y,Z,36,colors(j,:)); if (j == || handles.skipFlag==1) fill3([minX-1 maxX+1 maxX+1 minX-1], [minY-1 minY-1 maxY+1 maxY+1], [0 0 0],'g'); alpha(0.7); handles.skipFlag = 0; guidata(hObject,handles) end xlabel('X (ft)') ylabel('Y (ft)') zlabel('Z (ft)') xlim([minX-1 maxX+1]) ylim([minY-1 maxY+1]) zlim([-0.1 maxZ+1]) handles.AZval = get(handles.AZslider,'Value')*360; handles.ELval = get(handles.ELslider,'Value')*90; view(handles.axes2,handles.AZval,handles.ELval) 96 axis square grid on drawnow hold off if (j == size(A,1)) handles.j = 1; set(hObject,'String','Start'); guidata(hObject,handles); return else if (j+frameSkipVal