Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 118 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
118
Dung lượng
2,56 MB
Nội dung
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CƠ KHÍ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC NGÀNH: CÔNG NGHỆ KỸ THUẬT CƠ ĐIỆN TỬ ĐỀ TÀI: NGHIÊN CỨU, THIẾT KẾ MODULE VẬN CHUYỂN ĐA HƯỚNG TỰ CÂN BẰNG CBHD: TS Nguyễn Xuân Chung Nhóm sinh viên: Vũ Đình Cơng MSV:2018605225 Nguyễn Thanh Nam MSV:2018604712 Phạm Văn Sang MSV:2018603962 Nguyễn Văn Quang MSV:2018603968 Hà Nội - 2022 MỤC LỤC MỤC LỤC DANH MỤC BẢNG BIỂU DANH MỤC HÌNH ẢNH LỜI NÓI ĐẦU CHƯƠNG TỔNG QUAN VỀ HỆ THỐNG 1.1 Đặt vấn đề 1.2 Lịch sử hình thành nghiên cứu 1.2.1 Lịch sử hình thành 1.2.2 Nghiên cứu 11 1.3 Lý chọn đề tài 12 1.3.1 Giới thiệu module vận chuyển đa hướng tự cân 12 1.3.2 Các loại xe SPMT 14 1.4 Mục tiêu đề tài 15 1.5 Phương pháp, phạm vi, giới hạn nghiên cứu 15 1.5.1 Phương pháp nghiên cứu 15 1.5.2 Phạm vi nghiên cứu 16 1.5.3 Giới hạn nghiên cứu 16 CHƯƠNG CƠ SỞ LÍ THUYẾT 17 2.1 Mô tả phần cứng 17 2.1.1 Cấu trúc module xe tự hành 17 2.2 Động học robot 19 2.2.1 Động học thuận robot 19 2.2.2 Động học ngược robot 25 2.2.3 Mô chuyển động module phần mềm Matlab 26 CHƯƠNG TÍNH TỐN THIẾT KẾ KẾT CẤU 28 3.1 Tính tốn lựa chọn cấu truyền động module thực tế 28 3.1.1 Tính tốn lựa chọn động 28 3.1.2 Lựa chọn hộp giảm tốc dẫn động bánh xe 30 3.1.3 Tính tốn thơng số hộp giảm tốc 31 3.1.4 Tính cặp bánh ăn khớp ngồi: 32 3.1.5 Tính cặp bánh ăn khớp trong: 34 3.1.6 Tính tốn thiết kế trục 36 3.1.7 Chọn chiều rộng ổ lăn 37 3.1.8 Tính chọn kích thước dọc trục truyền 38 3.1.9 Tính tốn khả lên xuống dốc xe 39 3.1.10 Tính tốn khả vượt độ cao địa hình: 39 CHƯƠNG THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN 41 4.1 Các thơng số tính tốn bản: 41 4.2 Mơ hình tốn học 46 4.3 Mô hình hóa hồn chỉnh matlab simulink 47 4.4 Phương pháp điều khiển 49 4.4.1 Khái niệm điều khiển PID 49 4.4.2 Lựa chọn phương pháp điều khiển 50 4.5 Mô tả sơ đồ điều khiển hệ thống 52 4.6 Lưu đồ thuật toán mođun thực tế 53 CHƯƠNG CHẾ TẠO MƠ HÌNH MODULE CHUYỂN ĐỘNG ĐA HƯỚNG 54 5.1 Thiết kế mô hình 54 5.2 Tính tốn lựa chọn cấu truyền động mơ hình 54 5.3 Thiết kế hệ thống điều khiển 57 5.3.1 Mô tả sơ đồ điều khiển hệ thống 57 5.4 Các khối phần cứng 57 5.4.1 Khối động 57 5.4.2 Khối driver điều khiển động bước 59 5.4.3 Kit Thu Phát Bluetooth ESP32-DEVKITC-32D 60 5.4.4 Khối nguồn 62 5.4.5 Khối hạ áp 63 5.4.6 Adapter sạc pin 3s 12.6V 65 5.5 Thiết kế kêt cấu thiết kế chi tiết 66 5.5.1 Khung xe 66 5.5.2 Chân robot 69 5.5.3 Thiết kế mạch điện tử 73 5.6 Chế tạo 74 CHƯƠNG KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 78 6.1 Kết đạt 78 6.2 Hạn chế 79 6.3 Định hướng phát triển 79 TÀI LIỆU THAM KHẢO 81 PHỤ LỤC 82 DANH MỤC BẢNG BIỂU Bảng 3-1 Thông số truyền bánh xe 36 Bảng 3-2 Chiều rộng ổ lăn 𝑏0 38 Bảng 3-3 Bảng tra lực kéo - đẩy xi lanh thủy lực theo áp suất làm việc 40 Bảng 5-1 Các chi tiết khung xe 67 Bảng 5-2 Các chi tiết trục bánh xe 69 Bảng 5-3 Các linh kiện sử dụng mạch điều khiển 73 DANH MỤC HÌNH ẢNH Hình 1-1 Hình ảnh robot di động 11 Hình 1-2 Những xe SPMT kết hợp lại với 13 Hình 1-3 Xe SPMT vận chuyển hàng 13 Hình 1-4 Xe SPMT hãng Mammoet 14 Hình 1-5 Module SPMT Light trục 15 Hình 2-1 Module xe tự hành SPMT 17 Hình 2-2 Module xe di chuyển theo đường thẳng 17 Hình 2-3 Module xe di chuyển cung cong 18 Hình 2-4 Module xe di chuyển quỹ đạo tròn 18 Hình 2-5 Phân tích động học robot 20 Hình 2-6 Phân tích động học robot 20 Hình 2-7 Động học vi phân 25 Hình 2-8 Robot di chuyển theo quỹ đạo cong 26 Hình 2-9 Robot quay quanh tâm 26 Hình 2-10 Robot lên 27 Hình 2-11 Robot theo phương ngang 27 Hình 2-12 Robot di chuyển theo phương chéo 27 Hình 3-1 Phân tích lực module thực tế 28 Hình 3-2 Sơ đồ nguyên lý truyền động hộp giảm tốc 31 Hình 3-3 Kích thước dọc trục truyền 38 Hình 4-1 Xác định lực kéo bánh xe 42 Hình 4-2 Cell NCR18650B 44 Hình 4-3 Động cảm ứng pha xoay chiều cực 45 Hình 4-4 Mơ hình hóa đáp ứng động matlab simulink 47 Hình 4-5 Đồ thị giới hạn momen xoắn 1600Nm 48 Hình 4-6 Đồ thị gia tốc theo thời gian 48 Hình 4-7 Đồ thị vận tốc theo thời gian 49 Hình 4-8 Thuật tốn điều khiển PID 51 Hình 4-9 Sơ đồ khối điều khiển mô đun thực tế 52 Hình 4-10 Lưu đồ thuật tốn mơ đun thực 53 Hình 5-1 Phân tích lực cho mơ hình 54 Hình 5-2 Hình ảnh tổng quan hệ thống thiết kế phần mềm solidwork 56 Hình 5-3 Sơ đồ khối kết nối mơ hình 57 Hình 5-4 Kích thước động 28BYJ-48 58 Hình 5-5 Mạch ULN 2003 điều khiển động bước 28BYJ-48 59 Hình 5-6 Hình ảnh thực tế Kit Esp32 60 Hình 5-7 Sơ đồ chân Kit RF thu phát wifi bluetooth ESP32 61 Hình 5-8 Pin 18650 thực tế 62 Hình 5-9 Sơ đồ đấu nối pin 3s 63 Hình 5-10 Module hạ áp LM 2596 64 Hình 5-11 Adapter sạc pin 3s 65 Hình 5-12 Khung sườn xe góc 66 Hình 5-13 Khung sườn xe góc 66 Hình 5-14 Chân chuyển động robot 69 Hình 5-15 Mạch in phần mềm thiết kế 73 Hình 5-16 Mạch in chế tạo 74 Hình 5-17 Chế tạo chân đế góc 74 Hình 5-18 Chế tạo chân đế góc 75 Hình 5-19 Chế tạo khung mơ hình hồn chỉnh góc 75 Hình 5-20 Chế tạo khung mơ hình hồn chỉnh góc 76 Hình 5-21 Chế tạo khung mơ hình hồn chỉnh góc 76 Hình 5-22 Chế tạo mơ hình hồn chỉnh góc 77 Hình 5-23 Chế tạo mơ hình hồn chỉnh góc 77 100 double originalSetpoint2 = 89; double setpoint2 = originalSetpoint2; double input2, output2; double p2 = 0.58; double i2 = 0.9; double d2 = 0.006; int move_ = 0; int move_1 = 0; int move_2 = 0; int last_move = 0; PID pid2(&input2, &output2, &setpoint2, p2, i2, d2, DIRECT); void set_robot(int speed_) // input2 { //sp duong 230 la tien - phai sp 230 la lui int dir = dir_now; int dir_2; int sp, sp2; int error = setpoint2 - input2; if (mode_now != 3) { sp = (def - speed_) ; sp2 = (def + speed_) ; } else { sp = (def * dir_now - speed_) ; sp2 = (def * dir_now + speed_) ; 101 error = error * dir_now; } if (sp > 0) sp = constrain(sp, min_sp, max_sp); else { if (sp > -min_sp) sp = -min_sp; else if (sp < -max_sp)sp = -max_sp; } if (sp2 > 0)sp2 = constrain(sp2, min_sp, max_sp); else { if (sp2 > -min_sp) sp2 = -min_sp; else if (sp2 < -max_sp)sp2 = -max_sp; } // if (error < 0)dir_2 = tien; else dir_2 = lui; if (abs(error) < 3) { if (mode_now == 2) { dir_now = move_2; //Serial.println("dir:"+String(dir_now)+","+String(move_2)); } else if (mode_now == 1) dir_now = move_1; sp = sp > ? 350 : -350; sp2 = sp2 > ? -350 : 350; 102 } else { if (mode_now != 3)dir_now = 1; sp = sp * dir_2; sp2 = sp2 * dir_2; } if (mode_now != 3) { sp = sp * dir_now; sp2 = sp2 * dir_now; } //Serial.println("robot 1:"+String(sp)+"2:"+String(sp2)); steppers[0]->setSpeed(-sp); steppers[1]->setSpeed(-sp2); } void set_robot2(int speed_) { //sp2 am la tien int dir = dir_now; int sp, sp2; int dir_2; int error = setpoint - input; if (mode_now != 3) { sp = (def sp2 = (def - speed_) ; + speed_) ; 103 } else { sp = (def * dir - speed_) ; sp2 = (def * dir + speed_) ; error = error * dir_now; } //Serial.println("robot 2:"+String(sp)+"2:"+String(sp2)); if (sp > 0) { if (sp > max_sp)sp = max_sp; else if (sp < min_sp) sp = min_sp; } else { if (sp > -min_sp)sp = -min_sp; else if (sp < -max_sp)sp = -max_sp; } if (sp2 > 0) { if (sp2 > max_sp)sp2 = max_sp; else if (sp2 < min_sp) sp2 = min_sp; } else { if (sp2 > -min_sp) sp2 = -min_sp; 104 else if (sp2 < -max_sp)sp2 = -max_sp; } //error=error*dir_now; if (error > 0)dir_2 = tien; else dir_2 = lui; if (abs(error) < 3) { if (mode_now == 2) { dir_now = move_2; //Serial.println("dir:"+String(dir_now)+","+String(move_2)); } else if (mode_now == 1) dir_now = move_1; sp = sp > ? 350 : -350; sp2 = sp2 > ? -350 : 350; } else { if (mode_now != 3)dir_now = 1; sp = sp * dir_2; sp2 = sp2 * dir_2; } if (mode_now != 3) 105 { sp = sp * dir_now; sp2 = sp2 * dir_now; } // Serial.println("robot 2:"+String(sp)+"2:"+String(sp2)); steppers[2]->setSpeed(sp); steppers[3]->setSpeed(sp2); } void move_robot() { for (int i = ; i < count; i++) { steppers[i]->runSpeed(); } } void setup() { Serial.begin(9600); // pinMode(speak,OUTPUT); // put your setup code here, to run once: for (int i = ; i < count; i++) { steppers[i]->setMaxSpeed(1000); } for (int j = 0; j < 2; j++) { 106 pinMode(sensor[j], INPUT); } pid.SetMode(AUTOMATIC); pid.SetSampleTime(5); pid.SetOutputLimits(-250, 250); // 80 - OK Strong enough pid2.SetMode(AUTOMATIC); pid2.SetSampleTime(5); pid2.SetOutputLimits(-250, 250); // 80 - OK Strong enough // unsigned long time_ = millis(); } float map1(float x) { return (0.0593) * x - 25.0606; } float map2(float x) { return (0.0642) * x - 19.2975; } bool send_ = 0; void loop() { // put your main code here, to run repeatedly: 107 // stepper.setSpeed(50); //stepper.runSpeed(); static bool start_ = 0; if (Serial.available()) { String command = (Serial.readStringUntil('\n')); int commaIndex = command.indexOf(','); if (commaIndex != -1) { angle = command.substring(0, commaIndex).toFloat(); move_ = command.substring(commaIndex + 1).toInt(); if (move_ == || move_ == 3) { if (move_ == mode_3_r) { angle_2 = -135; angle = -45; } else { angle_2 = 45; angle = 135; } mode_now = 3; } else if (move_ > && move_ < 9) // { 108 if (move_ == 4) { // move_2 = 0; angle = 45; angle_mod_2 = angle; angle_2 = 135; } else if (move_ == 5) { //move_2 = 0; angle = 135; angle_mod_2 = angle; angle_2 = 45; } else if (move_ == 6) { angle = angle_mod_2; move_2 = 1; } else if(move_ ==7) { angle = angle_mod_2; move_2 = -1; } else { angle = angle_mod_2; move_2 = 0; 109 } last_move = move_; mode_now = 2; } else { move_1 = move_; mode_now = 1; angle_2 = angle; } } //Serial.println("mode:"+String(mode_now)+"dir_:"+String(move_1)+"dir_2: "+String(move_2)); // Serial.println(angle); } float adc_1 = analogRead(sensor[0]); float adc_2 = analogRead(sensor[1]); input = map1(adc_1); input2 = map2(adc_2); static unsigned long time_1 = millis(); static unsigned long time_2 = millis(); if (mode_now == 3) { if (angle < 0) 110 { input = input - 180; input2 = input2 - 180; dir_now = -1; } else { dir_now = 1; } } /* */ if(last_mode != mode_now) { if(last_mode == && mode_now != 1) { // pid.SetTunings(p-0.2,0,0); // pid2.SetTunings(p-0.2,0,0); } last_mode = mode_now; } setpoint = angle_2; setpoint2 = angle; pid.Compute(); pid2.Compute(); 111 set_robot(output); set_robot2(output2); move_robot(); // Serial.println("i1:"+String(input)+"i2:"+String(input2)); //v2 } Code matlab clear all; clc; close all; %%function donghocnghich [v10,v11,v20,v21,v30,v31,v40,v41]= donghocnghich8banh(u,v,r) xQ_cham= 0.05; yQ_cham= 0; omega = 0; a = 100; % radius of the wheel(fixed) b = 50; % distance between wheel frame to vehicle frame( along y-axis) c = 10; %% angular of steering %% warning : velocity vector ro2, ro3 is always put reverse value ro1=pi/2; ro2=pi/2; ro3=pi/2; ro4=pi/2; denta1 denta2 denta3 denta4 = = = = c*sin(pi/2-ro1); c*sin(pi/2-ro2); c*sin(pi/2-ro3); c*sin(pi/2-ro4); denta1_ = c*cos(pi/2-ro1); 112 denta2_ = c*cos(pi/2-ro2); denta3_ = c*cos(pi/2-ro3); denta4_ = c*cos(pi/2-ro4); K=8*a^2+8*b^2+denta1^2+denta1_^2+denta2^2+denta2_^2+ denta3^2+denta3_^2+denta4^2+denta4_^2 %K=100; W1=(-cos(ro1)*(b-denta1)+sin(ro1)*(a+denta1_)); W2=(-cos(ro1)*(b+denta1)+sin(ro1)*(a-denta1_)); W3=(-cos(ro2)*(b-denta2)-sin(ro2)*(a+denta2_)); W4=(-cos(ro2)*(b+denta2)-sin(ro2)*(a-denta2_)); W5=(cos(ro3)*(b-denta3)-sin(ro3)*(a-denta3_)); W6=(cos(ro3)*(b+denta3)-sin(ro3)*(a+denta3_)); W7=(cos(ro4)*(b-denta4)+sin(ro4)*(a-denta4_)); W8=(cos(ro4)*(b+denta4)+sin(ro4)*(a+denta4_)); %% jacobian matrix J =[K*cos(ro1)/8,K*cos(ro1)/8,K*cos(ro2)/8,K*cos(ro2)/ 8,K*cos(ro3)/8, K*cos(ro3)/8,K*cos(ro4)/8, K*cos(ro4)/8; K*sin(ro1)/8, K*sin(ro1)/8, K*sin(ro2)/8, K*sin(ro2)/8, K*sin(ro3)/8, K*sin(ro3)/8, K*sin(ro4)/8, K*sin(ro4)/8; W1, W2, W3, W4, W5, W6, W7, W8] %J=10*10^3*J A=(1.0e-06)* J*(J') B= (1.0e-03)*inv(A) C=(J')*B I=B*A p_cham=[xQ_cham; yQ_cham; omega]; q_cham=C*p_cham v_10=q_cham(1,:) v_11=q_cham(2,:) v_20=q_cham(3,:) v_21=q_cham(4,:) v_30=q_cham(5,:) v_31=q_cham(6,:) v_40=q_cham(7,:) v_41=q_cham(8,:) %% kinematic simulation of a steering wheel mobile robot %% simulation parameter dt=0.1; % step size 113 ts=10; % simulation time t=0:dt:ts; % Time span %% initial conditions x0=0.5; y0=0.5; psi0=0; eta0 = [x0;y0;psi0]; eta(:,1)=eta0; % lay cot cua ma tran %% loop starts here for i=1:length(t) psi = eta(3,i); % current orientation in rad %Jacobian matrix J_psi = [cos(psi),-sin(psi),0; sin(psi),cos(psi),0; 0,0,1]; %% inputs omega = [v_10;v_11;v_20;v_21;v_30;v_31;v_40;v_41]; %% wheel configuration matrix % velocity input commands zeta(:,i) = J*omega; % time derivative of generalized coordinates eta_dot(:,i) = J_psi * zeta(:,i); %% position propagation using Euler method eta(:,i+1) = eta(:,i) + dt * eta_dot(:,i); %state update % (generalized coordinates) end %% plotting functions figure plot(t, eta(1, 1:i),'r'); set(gca, 'fontsize',24) xlabel('t,[s]'); ylabel('x,[m]'); figure plot(t, eta(2,1:i),'b-'); 114 set(gca,'fontsize',24); xlabel('t,[s]'); ylabel('y,[m]'); %figure %plot(t, eta(1,1:i),'r'); %hold on %plot(t, eta(2,i:i),'b '); %plot(t, eta(3,1:i),'m-,'); %legend('x,[m]','y,[m]','\psi,[rad]'); %set(gca,'fontsize',24) %xlabel('t,[s]'); %ylabel('\eta,[units]'); %% Animation (mobile robot motion animation) l = 0.38; % length of the mobile robot w = 0.27; % width of the mobile robot % Mobile robot cooridinates box_v = [-l/2,l/2,l/2,-l/2,-l/2; -w/2,-w/2,w/2,w/2,-w/2;]; figure for i = 1:5:length(t) psi = eta(3,i); R_psi = [cos(psi), -sin(psi); sin(psi), cos(psi);]; % rotation matrix v_pos = R_psi*box_v; fill(v_pos(1, :)+eta(1,i),v_pos(2,:)+eta(2,i),'g') hold on, grid on axis([-1 20 -1 20]), axis square plot(eta(1,1:i),eta(2,1:i),'b-'); legend('MR','Path') set(gca, 'fontsize',24) xlabel('x,[m]'); ylabel('y,[m]'); pause(0.1) hold off end % animation ends here ... điều khiển ESP 32 - Thiết kế kết cấu hệ thống điều khiển module vận chuyển đa hướng - Thiết kế mơ hình module vận chuyển đa hướng tự cân - Đánh giá thiết kế hệ thống thiết kế kết cấu - Chế tạo... nên khả di chuyển chưa linh hoạt, khả đánh lái hạn chế Vì việc thiết kế ? ?Module vận chuyển đa hướng tự cân bằng? ?? chủ động linh hoạt vận chuyển hàng hóa vấn đề mà chúng em cần phải nghiên cứu... chức module nhằm tạo chuyển động tối ưu cân - Nghiên cứu xây dựng thuật giải, phương pháp điều khiển hệ thống - Nghiên cứu thiết kế chế tạo module vận chuyển đa hướng chuyển hướng chủ động 1.5