Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
1,19 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ TAY MÁY SCARA CHO CÁC ỨNG DỤNG CÔNG NGHIỆP NGÀNH: KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GIẢNG VIÊN HƯỚNG DẪN: TS PHẠM QUỐC THIỆN Sinh viên thực hiện: MSSV: Lớp: Nguyễn Minh Hiếu 1811050145 18DTDA1 Đào Quang Vinh 1811050141 18DTDA1 Đinh Hoàng Lâm 1811050240 18DTDA1 TP Hồ Chí Minh, tháng 8, năm 2022 Mã đề: 80 TĨM TẮT Đây đề tài mang tính thực tế cao, mà công nghiệp ngày phát triển cạnh tranh khơng ngừng địi hỏi śt chất lượng phải được cải thiện nhờ dây chuyền máy móc đại thay lao động chân tay người Như đồ án môn học chúng em được tìm hiểu được cách xây dựng mơ hình robot SCARA gờm mơ hình khí giao diện điều khiển có chức gắp thả vật Sau hồn thành đề tài nhóm đạt được là: - Xây dựng kết cấu cho robot - Dựng mơ hình 3D Solidwords - Chọn truyền, động cơ, chọn trục - Lập trình điều khiển hoạt động - Tính toán động học robot - Xây dựng giao diện điều khiển Processing Qua đề tài nhóm biết cách vận dụng kiến thức chuyên môn được đào tạo trường Đại học HUTECH thời gian qua vào với thực tế sống nhất với công nghiệp Không chỉ qua đồ án nhóm chúng em học được rất nhiều kĩ làm việc nhóm, giải vấn đề, tìm tài liệu, viết báo cáo rất có ích cho sau này.Một lần nhóm chúng em xin chân thành cảm ơn hướng dẫn tận tình thầy Phạm Quốc Thiện giúp chúng em hoàn thành đề tài Do giới hạn thời gian kiến thức đồ án này, chúng em chỉ giải số vấn đề bản việc thiết kế robot ngồi cịn rất nhiều vấn đề cần phải giải quyết, tương lai nhóm chúng em sẽ nghiên cứu thêm toán động lực học số thuật tốn nội suy khác đờng thời tối ưu phần khí để có sản iii Mã đề: 80 phẩm robot hồn thiện chúng em rất mong q thầy bạn đóng góp ý kiến để đề tài hoàn thiện ABSTRACT This is a highly practical topic, when the industry is growing, the competition is constantly demanding that productivity and quality must be improved thanks to modern machinery lines replacing manual labor People So in the course project, we learned how to build a SCARA robot model including a mechanical model and a control interface with the function of picking and dropping objects After completing the project, the group achieved: - Build structures for robots - Build 3D models with Solidwords - Select transmission, motor, select shaft - Programmable operation controller - Calculating robot kinematics - Build console using Processing Through the above topic, the group has learned how to apply the professional knowledge trained at HUTECH University in the past time into real life, especially with industry Not only that through this project, our group also learned a lot such as teamwork skills, problem solving, finding documents, writing reports very useful for later Once again our group We would like to express our sincere thanks to Mr Pham Quoc Thien for his enthusiastic guidance to help us complete this thesis Due to the limitation of time and knowledge in this project, we have only solved the problem solving some basic problems in designing a robot, besides there are many problems that need to be solved, in the future our group will study more dynamic problems and some other interpolation algorithms at the same time Optimize the iv Mã đề: 80 mechanical part to have a complete robot product, so we hope that you and your teachers can contribute ideas to make this topic even more perfect MỤC LỤC LỜI CAM ĐOAN Error! Bookmark not defined LỜI CẢM ƠN ii TÓM TẮT iii ABSTRACT iv DANH MỤC HÌNH ẢNH viii DANH MỤC BẢNG x DANH MỤC CÁC TỪ VIẾT TẮT xi CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1.1 Tính cần thiết đề tài 1.2 Ứng dụng đề tài 1.3 Mục tiêu nghiên cứu 1.4 Nhiệm vụ nghiên cứu 1.5 Phạm vi giới hạn đề tài 1.6 Kết sau hoàn thành 1.7 Kết cấu nội dung chương 1.8 Thời gian thực đề tài CHƯƠNG 2: TỔNG QUAN GIẢI PHÁP 2.1 Tổng quan hệ thống Scara công nghiệp 2.1.1 Sơ lược trình phát triển Robot công nghiệp 2.1.2 Phân loại Robot 2.1.3 Cấu trúc Robot công nghiệp 11 2.1.4 Tổng quan thành phần hệ thống Robot 12 v Mã đề: 80 2.2 Giải pháp nghiên cứu đề tài 13 2.2.1 Lý thuyết 13 2.2.2 Thực nghiệm 13 CHƯƠNG 3: QUY TRÌNH THIẾT KẾ PHẦN CỨNG VÀ PHẦN MỀM 14 3.1 Thiết kế phần cứng cho hệ thống 14 3.1.1 Phân tích lựa chọn cấu trúc 14 3.1.2 Tính tốn chọn thiết bị truyền động 18 3.1.3 Lựa chọn thiết bị điều khiển 25 3.1.4 Thiết lập sơ đồ điện 31 3.2 Thiết kế phần mềm 32 3.2.1 Bài toán động học 32 3.2.2 Tìm hiểu Arduino 37 3.3 Tìm hiểu phát triển giao diện giám sát điều khiển tay máy SCARA 42 CHƯƠNG 4: THI CƠNG MƠ HÌNH THỰC NGHIỆM 46 4.1 Chế tạo phần cứng 46 4.1.1 Thiết kế hệ thớng khí 46 4.1.2 Thi cơng khí 50 4.2 Phân tích đánh giá kết 55 4.2.1 Kết nghiên cứu 55 4.2.2 Kết xây dựng mơ hình 56 4.3.3 Đánh giá kết đạt được 56 CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 57 5.1 Kết luận 57 5.2 Hướng phát triển 57 TÀI LIỆU THAM KHẢO 58 vi Mã đề: 80 PHỤ LỤC 59 Code chương trình: 59 Code giao diện điều khiển 69 Bản vẽ tay máy Scara 93 vii Mã đề: 80 DANH MỤC HÌNH ẢNH Hình 1: Robot kiểu tọa độ Đề Các Hình 2: Robot kiểu tọa độ trục Hình 3: Robot kiểu tọa độ cầu Hình 4: Robot SCARA Hình 5: Tay máy kiểu tay người Hình 6: Một dạng Robot điều khiển Servo 10 Hình 7: Robot Hàn 11 Hình 8: Robot ngành hàng không vũ trụ 11 Hình 9: Tởng quan thành phần hệ thống Robot 12 Hình 1: Tay gắp ………………………………………………………………… 15 Hình 2: Mơ hình 3D tởng qt cánh tay Robot 16 Hình 3: Mơ hình tởng thể tay máy Scara 17 Hình 4: Sơ đồ khối 18 Hình 5: Hộp giảm tốc bánh trụ 19 Hình 6: Hộp giảm tốc bánh hành tinh 19 Hình 7: Bộ truyền đai 20 Hình 8: Vít me đai ốc 21 Hình 9: Step motor Nema 17 23 Hình 10: Động RC Servo MG996 23 Hình 11: Bộ truyền đai GT2 25 Hình 12: Arduino UNO 25 Hình 13: Sơ đồ chân Vi điều khiển ATmega328 26 viii Mã đề: 80 Hình 14: CNC Shield V3 27 Hình 15: Sơ đồ Pinout CNC shield V3 28 Hình 16: Các chân tùy chỉnh vi bước 29 Hình 17: Sơ đồ chân Driver A4988 30 Hình 18: Sơ đồ động lực mạch điều khiển Robot Scara 32 Hình 19: Quy tắc đặt trục tọa độ Dernavit-Hartenberg 32 Hình 20: Quy tắc bàn tay phải giúp xác định trục 34 Hình 21: Xác định hướng trục 35 Hình 22: Arduino IDE 40 Hình 23: Lưu đồ giải thuật hệ thống 42 Hình 24: Phần mềm Labview 43 Hình 25: Phần mềm Visual Basic 44 Hình 26: Phần mềm Processing 44 Hình 27: Giao diện điều khiển cánh tay Robot Scara 45 Hình 1: Ổ bi 608RS lắp khâu đế………………………………………………….46 Hình 2: Vòng bi LM10UU lắp khâu 47 Hình 3: Vòng bi 6806 2RS 51108 lắp khớp nối khâu khâu 48 Hình 4: Puly GT2 48 Hình 5: Ròng rọc GT2 49 Hình 6: Puly GT2 80 49 Hình 7: Puly GT2 120 49 Hình 8: Dây đai GT2 50 Hình 9: Thi công khâu đế 51 Hình 10: Thi cơng khâu 52 Hình 11: Thi cơng khâu 53 Hình 12: Thi cơng khâu 54 ix Mã đề: 80 Hình 13: Thi công tay gắp 54 Hình 14: Mơ hình cánh tay robot Scara 55 DANH MỤC BẢNG Bảng 1: Thời gian thực đề tài Bảng 1: Thông số kỹ thuật………………………………………………………….17 Bảng 2: Thông số kỹ thuật Arduno Uno 25 Bảng 3: Bảng tùy chỉnh vi bước cho động A4988 29 Bảng 4: Bảng tùy chỉnh vi bước cho Driver DRV8825 29 Bảng 5: Bảng thông số chế độ 31 Bảng 6: Bảng thông số D-H 35 Bảng 7: Đầu vào hệ thống 41 Bảng 8: Đầu hệ thống 41 Bảng 1: Bảng danh sách thiết bị……………………………………………………50 Bảng Chi tiết bản cách gia công đế 51 Bảng 3: Chi tiết bản cách gia công khâu 52 Bảng 4: Chi tiết bản cách gia công khâu 53 Bảng 5: Chi tiết bản cách gia công khâu 53 x Mã đề: 80 DANH MỤC CÁC TỪ VIẾT TẮT RBCN: Robot công nghiệp SCARA: Selective Compliance Articulated Robot Arm ĐATN: Đờ án tốt nghiệp CTHT: Cơng tắc hành trình xi cp5.addButton("clearSteps") setPosition(490, 650) setSize(135, 40) setFont(font) setCaptionLabel("(CLEAR)") ; //Z controls cp5.addSlider("speedSlider") setPosition(490, 740) setSize(180, 30) setRange(500, 4000) setColorLabel(#3269c2) setFont(font) setCaptionLabel("") ; cp5.addSlider("accelerationSlider") setPosition(720, 740) setSize(180, 30) setRange(500, 4000) setColorLabel(#3269c2) setFont(font) setCaptionLabel("") ; 79 cp5.addSlider("gripperValue") setPosition(605, 445) setSize(190, 30) setRange(0, 100) setColorLabel(#3269c2) setFont(font) setCaptionLabel("") ; } void draw() { background(#F2F2F2); // background black textSize(26); fill(33); text("Forward Kinematics", 120, 135); text("Inverse Kinematics", 590, 135); textSize(40); text("SCARA Robot Control", 260, 60); textSize(45); text("J1", 35, 250); text("J2", 35, 375); text("J3", 35, 500); text("Z", 35, 625); textSize(22); text("Speed", 545, 730); 80 text("Acceleration", 745, 730); //println("PREV: "+accelerationSlider); fill(speedSlider); fill(accelerationSlider); fill(j1Slider); fill(j2Slider); fill(j3Slider); fill(zSlider); fill(j1JogValue); fill(j2JogValue); fill(j3JogValue); fill(zJogValue); fill(gripperValue); updateData(); //println(data); saveStatus=0; // keep savePosition variable or false See, when button SAVE pressed it makes the value 1, which indicates to store the value in the arduino code // If slider moved, calculate new position of X,Y and Z with forward kinematics if (slider1Previous != j1Slider) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false 81 theta1 = round(cp5.getController("j1Slider").getValue()); // get the value from the slider1 theta2 = round(cp5.getController("j2Slider").getValue()); forwardKinematics(); myPort.write(data); } } slider1Previous = j1Slider; if (slider2Previous != j2Slider) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false theta1 = round(cp5.getController("j1Slider").getValue()); // get the value from the slider1 theta2 = round(cp5.getController("j2Slider").getValue()); forwardKinematics(); myPort.write(data); } } slider2Previous = j2Slider; if (slider3Previous != j3Slider) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false theta1 = round(cp5.getController("j1Slider").getValue()); // get the value from the slider1 theta2 = round(cp5.getController("j2Slider").getValue()); 82 forwardKinematics(); myPort.write(data); } } slider3Previous = j3Slider; if (sliderzPrevious != zSlider) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false zP = round(cp5.getController("zSlider").getValue()); myPort.write(data); } } sliderzPrevious = zSlider; if (gripperValuePrevious != gripperValue) { if (activeIK == false) { // Check whether the inverseKinematics mode is active, Executre Forward kinematics only if inverseKinematics mode is off or false gripperAdd = round(cp5.getController("gripperValue").getValue()); gripperValue=gripperAdd+50; updateData(); println(data); myPort.write(data); } } gripperValuePrevious = gripperValue; 83 activeIK = false; // deactivate inverseKinematics so the above if statements can be executed the next interation fill(33); textSize(32); text("X: ", 500, 290); text(xP, 533, 290); text("Y: ", 650, 290); text(yP, 685, 290); text("Z: ", 800, 290); text(zP, 835, 290); textSize(26); text("Gripper", 650, 420); text("CLOSE", 510, 470); text("OPEN", 810, 470); textSize(18); if (positionsCounter >0 ) { text(positions[positionsCounter-1], 460, 630); text("Last saved position: No."+(positionsCounter-1), 460, 600); } else { text("Last saved position:", 460, 600); text("None", 460, 630); } } 84 // FORWARD KINEMATICS void forwardKinematics() { float theta1F = theta1 * PI / 180; // degrees to radians float theta2F = theta2 * PI / 180; xP = round(L1 * cos(theta1F) + L2 * cos(theta1F + theta2F)); yP = round(L1 * sin(theta1F) + L2 * sin(theta1F + theta2F)); } // INVERSE KINEMATICS void inverseKinematics(float x, float y) { theta2 = acos((sq(x) + sq(y) - sq(L1) - sq(L2)) / (2 * L1 * L2)); if (x < & y < 0) { theta2 = (-1) * theta2; } theta1 = atan(x / y) - atan((L2 * sin(theta2)) / (L1 + L2 * cos(theta2))); theta2 = (-1) * theta2 * 180 / PI; theta1 = theta1 * 180 / PI; // Angles adjustment depending in which quadrant the final tool coordinate x,y is if (x >= & y >= 0) { // 1st quadrant theta1 = 90 - theta1; } 85 if (x < & y > 0) { // 2nd quadrant theta1 = 90 - theta1; } if (x < & y < 0) { // 3d quadrant theta1 = 270 - theta1; phi = 270 - theta1 - theta2; phi = (-1) * phi; } if (x > & y < 0) { // 4th quadrant theta1 = -90 - theta1; } if (x < & y == 0) { theta1 = 270 + theta1; } // Calculate "phi" angle so gripper is parallel to the X axis phi = 90 + theta1 + theta2; phi = (-1) * phi; // Angle adjustment depending in which quadrant the final tool coordinate x,y is if (x < & y < 0) { // 3d quadrant phi = 270 - theta1 - theta2; } if (abs(phi) > 165) { phi = 180 + phi; 86 } theta1=round(theta1); theta2=round(theta2); phi=round(phi); cp5.getController("j1Slider").setValue(theta1); cp5.getController("j2Slider").setValue(theta2); cp5.getController("j3Slider").setValue(phi); cp5.getController("zSlider").setValue(zP); } void controlEvent(ControlEvent theEvent) { if (theEvent.isController()) { println(theEvent.getController().getName()); } } public void xTextfield(String theText) { //If we enter a value into the Textfield, read the value, convert to integer, set the inverseKinematics mode active xP=Integer.parseInt(theText); activeIK = true; inverseKinematics(xP, yP); // Use inverse kinematics to calculate the J1(theta1), J2(theta2), and J3(phi) positions 87 //activeIK = false; println("Test; theta1: "+theta1+" theta2: "+theta2); } public void yTextfield(String theText) { yP=Integer.parseInt(theText); activeIK = true; inverseKinematics(xP, yP); //activeIK = false; } public void zTextfield(String theText) { zP=Integer.parseInt(theText); activeIK = true; inverseKinematics(xP, yP); } public void j1JogMinus() { int a = round(cp5.getController("j1Slider").getValue()); a=a-j1JogValue; cp5.getController("j1Slider").setValue(a); } //J1 control public void j1JogPlus() { int a = round(cp5.getController("j1Slider").getValue()); a=a+j1JogValue; cp5.getController("j1Slider").setValue(a); 88 } //J2 control public void j2JogMinus() { int a = round(cp5.getController("j2Slider").getValue()); a=a-j2JogValue; cp5.getController("j2Slider").setValue(a); } public void j2JogPlus() { int a = round(cp5.getController("j2Slider").getValue()); a=a+j2JogValue; cp5.getController("j2Slider").setValue(a); } //J3 control public void j3JogMinus() { int a = round(cp5.getController("j3Slider").getValue()); a=a-j3JogValue; cp5.getController("j3Slider").setValue(a); } public void j3JogPlus() { int a = round(cp5.getController("j3Slider").getValue()); a=a+j3JogValue; cp5.getController("j3Slider").setValue(a); } //J3 control public void zJogMinus() { 89 int a = round(cp5.getController("zSlider").getValue()); a=a-zJogValue; cp5.getController("zSlider").setValue(a); } public void zJogPlus() { int a = round(cp5.getController("zSlider").getValue()); a=a+zJogValue; ; cp5.getController("zSlider").setValue(a); } public void move() { myPort.write(data); println(data); } public void savePosition() { // Save the J1, J2, J3 and Z position in the array positions[positionsCounter]="J1="+str(round(cp5.getController("j1Slider").getValue()) ) +"; J2=" + str(round(cp5.getController("j2Slider").getValue())) +"; J3="+str(round(cp5.getController("j3Slider").getValue())) +"; Z="+str(round(cp5.getController("zSlider").getValue())); positionsCounter++; 90 saveStatus = 1; updateData(); myPort.write(data); saveStatus=0; } public void run() { if (runStatus == 0) { cp5.getController("run").setCaptionLabel("STOP"); cp5.getController("run").setColorLabel(#e74c3c); runStatus = 1; } else if (runStatus == 1) { runStatus = 0; cp5.getController("run").setCaptionLabel("RUN PROGRAM"); cp5.getController("run").setColorLabel(255); } updateData(); myPort.write(data); } public void updateSA() { myPort.write(data); } public void clearSteps() { 91 saveStatus = 2; // clear all steps / program updateData(); myPort.write(data); println("Clear: "+data); positionsCounter=0; saveStatus = 0; } public void updateData() { data = str(saveStatus) +","+str(runStatus) +","+str(round(cp5.getController("j1Slider").getValue())) +","+str(round(cp5.getController("j2Slider").getValue())) +","+str(round(cp5.getController("j3Slider").getValue())) +","+str(round(cp5.getController("zSlider").getValue())) +","+str(gripperValue) +","+str(speedSlider) +","+str(accelerationSlider); } 92 Bản vẽ tay máy Scara 93 ... QUY TRÌNH THIẾT KẾ PHẦN CỨNG VÀ PHẦN MỀM 3.1 Thiết kế phần cứng cho hệ thớng 3.1.1 Phân tích lựa chọn cấu trúc • Số bậc tự cần thiết Bậc tự do: Bậc tự (BTD) cấu thông số độc lập cần thiết để... (Ng̀n: Internet) - Tay máy SCARA: Hình 4: Robot SCARA (Nguồn: Internet) Robot SCARA đời vào năm 1979 trường đại học Yamanaski ( Nhật Bản) dùng cho cơng việc lắp ráp Đó kiểu tay máy đặc biệt gồm... Hình 5: Tay máy kiểu tay người (Ng̀n: Internet) Tồn kết cấu chỉ liên quan đến khả định vị phần công tác Muốn định vị nó, cần bở sung cở tay Muốn định hướng tùy ý phần công tác, cô? ?tay phải