Tổng quan smart sesor laser omron; thiết kế cơ khí cho hệ đo; thiết kế hệ thống điện; phần mềm điều khiển; kết quả thực nghiệm. Tổng quan smart sesor laser omron; thiết kế cơ khí cho hệ đo; thiết kế hệ thống điện; phần mềm điều khiển; kết quả thực nghiệm.
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ĐÀM HỮU VIỆT XÂY DỰNG THIẾT BỊ ĐO ĐỘ SÂU PHẠM VI 0-2MM SỬ DỤNG ĐẦU DỀ LASER LUẬN VĂN THẠC SĨ KHOA HỌC NGÀNH: CƠ ĐIỆN TỬ HÀ NỘI – 2019 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ĐÀM HỮU VIỆT XÂY DỰNG THIẾT BỊ ĐO ĐỘ SÂU PHẠM VI 0-2MM SỬ DỤNG ĐẦU DỀ LASER LUẬN VĂN THẠC SĨ KHOA HỌC NGÀNH: CƠ ĐIỆN TỬ NGƯỜI HƯỚNG DẪN KHOA HỌC PGS.TS VŨ TOÀN THẮNG HÀ NỘI – 2019 LỜI CAM ĐOAN Tôi xin cam đoan cơng trình nghiên cứu khoa học độc lập riêng Các số liệu sử dụng phân tích luận án có nguồn gốc rõ ràng, thực công bố theo quy định Các kết nghiên cứu luận án tơi tự tìm hiểu, phân tích cách trung thực, khách quan phù hợp với thực tiễn Việt Nam Các kết chưa công bố nghiên cứu khác TÁC GIẢ LUẬN VĂN Đàm Hữu Việt iii MỤC LỤC LỜI CAM ĐOAN iii DANH MỤC HÌNH ẢNH iv PHẦN MỞ ĐẦU 1 Lý chọn đề tài Lịch sử nghiên cứu Mục đích nghiên cứu luận văn Tóm tắt đọng luận điểm đóng góp vào luận văn Phương pháp nghiên cứu .3 CHƯƠNG 1:TÌM HIỂU SMART SESOR LASER OMRON 1.1 Tìm hiểu dòng cảm biến ZX-L-N 1.2 Ứng dụng dòng cảm biến ZX-L-N .6 1.3 Cấu tạo CHƯƠNG 2: THIẾT KẾ CƠ KHÍ CHO HỆ ĐO 14 2.1 Tổng quan hệ khí 14 2.2 Kết cấu tổng thể máy 18 2.2.1 Các thành phần cấu tạo máy 18 CHƯƠNG 3: THIẾT KẾ HỆ THỐNG ĐIỆN 27 3.1 Phần mạch điện máy CNC 27 3.1.1 Động bước 27 3.1.2 Driver điều khiển động bước 28 3.2 Xây dựng mạch điện cotroller 32 3.2.1 Tìm hiểu kit Nucleo- F410RB 33 3.3 Thiết lập tay khuếch đại .37 CHƯƠNG 4: PHẦN MỀM ĐIỀU KHIỂN 40 4.1 Yêu cầu phần mềm 40 4.2 Phần mềm xử lý 40 4.2.1 Giới thiệu sơ qua Qt 40 4.2.2 Phần mềm giao diện PC 40 i CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM 43 5.1 Hình ảnh thực tế 43 5.2 Sai số dịch chuyển hệ .44 5.3 Thực đo mẫu J530 48 5.3.1 Thực đo điểm mặt phẳng 48 5.3.2 Thực đo khoảng cách hai điểm hai mặt phẳng .54 KẾT LUẬN TÀI LIỆU THAM KHẢO 64 PHỤ LỤC ii DANH MỤC HÌNH ẢNH Hình 1.1: Kích thước phổ biến dịng cảm biến ZX-L-N Hình 1.2: Các loại đầu cảm biến sử dụng Hình 1.3: Ứng dụng chất bán dẫn linh kiện Hình 1.4: Ứng dụng thực phẩm Hình 1.5: Ứng dụng đồ gia dụng Hình 1.6: Ứng dụng xe hơi, máy công cụ robot Hình 1.7: Đặc điểm góc Hình 1.8: Đặc tính tuyến tính vật liệu Hình 1.9: Đặc tính tuyến tính khoảng cách Hình 1.10: Kích thước đầu cảm biến ZX-LD30V 10 Hình 1.11: Sơ đồ mạch giai đoạn đầu vào/đầu model ZX-LDA11-N 12 Hình 1.12: Cách kết nối khuếch đại 12 Hình 1.13: Kích thước khuếch đại 13 Hình 2.1: Phần khung hệ có sẵn máy CNC 14 Hình 2.2: Sơ đồ nguyên lý máy CNC 15 Hình 2.3: Mơ hình động bước sanyo 18 Hình 2.4: Vitme sử dụng 19 Hình 2.5 : Cơ cấu dẫn động 19 Hình 2.6: Ray dẫn hướng 20 Hình 2.7: Mô đầu đo laser ZX-LD30V 23 Hình 2.8: Khn sử dụng cho ZX-LD30V 24 Hình 2.9: Mặt trước mặt sau vỏ điện thoại J530 25 Hình 2.10: Mơ hình tổng thể máy 25 Hình 2.11: Cụm đầu đo Mẫu 26 Hình 3.1: Động bước Sanyo Denki 27 Hình 3.2: Driver P440 MV-SD3 29 Hình 3.3: Mơ hình đấu dây động với Driver 31 Hình 3.4: Sơ đầu đấu dây điện động driver 32 iv Hình 3.5: Mơ hình hoạt đông hệ đo 33 Hình 3.6: Bộ Kit Nucleo- F410RB 34 Hình 3.7: Chức chi tiết chân 35 Hình 3.8: Mạch nguyên lý cotroller 36 Hình 3.9: Hồn chỉnh controller 37 Hình 3.10: Mặt sau Bộ Khuếch Đại 37 Hình 3.11: Chế độ [SPCL] -> [SET] 38 Hình 3.12: Chế độ [FOCUS]-> [mA] 38 Hình 3.13: Thiết lập chế độ đầu tối đa 20mA 38 Hình 3.14: Thiết lập chế độ đầu tối thiểu 4mA 39 Hình 3.15: Kết thiết lập [FOCUS]->[OK] 39 Hình 4.1: Chức phần mềm 41 Hình 5.1: Hệ đo hồn chỉnh 43 Hình 5.2: Đầu đo laser lúc làm việc 43 Hình 5.6: Kích thước đo mặt Camera+mặt khay sim 49 Hình 5.8: Vị trí đo mặt phẳng camera hiển thị phầm mềm 51 Hình 5.9: Biểu đồ thể sai số mặt phẳng chứa khay sim 52 Hình 5.10: Vị trí đo khay sim hiển thị phầm mềm 52 Hình 5.11: Biểu đồ thể sai số mặt phẳng chứa khay sim 53 Hình 5.12: Vị trí đo măt phẳng chứa Pin hiển thị phầm mềm 54 Hình 5.13: Tọa độ mặt phẳng (1) (2) (3) 54 Hình 5.14: Tọa độ mặt phẳng (4) (5) 55 Hình 5.16: Biểu đồ thể sai số mặt phẳng (1) (2) 57 Hình 5.17: Vị trí đo mặt (1) (2) mơ 57 Hình 5.18: Kết đo khoảng cách mặt phẳng (1) (3) phầm mềm 58 Hình 5.19: Biểu đồ thể sai số mặt phẳng (1) (3) 59 Hình 5.20: Vị trí đo mặt (1) (3) mô 60 Hình 5.21: Kết đo khoảng cách mặt phẳng (1) (2) phầm mềm 61 Hình 5.22: Biểu đồ thể sai số mặt phẳng (1) (2) 62 v Hình 5.23: Vị trí đo mặt (1) (2) mô 62 DANH MỤC BẢNG BIỂU Bảng 1: Cài đặt dòng tải cho động Bảng 2: Cài đặt chế độ vi bước Bảng 3: Cấu hình cổng kết nối động nguồn cung cấp vi PHẦN MỞ ĐẦU Lý chọn đề tài Từ phát minh nay, laser không ngừng nghiên cứu phát triển Với nhu cầu ứng dụng rộng rãi hầu hết lĩnh vực nghiên cứu khoa học ứng dụng với tiến lĩnh vực khoa học quang điện tử, laser ngày phát triển đa dạng chủng loại ngày hồn thiện Với tính chất ưu việt so với nguồn sáng thông thường, ứng dụng laser khẳng định vị trí quan trọng nhiều lĩnh vực: nghiên cứu, hóa học, qn sự, mơi trường, công nghiệp… Chất lượng sản phẩm chế tạo máy phụ thuộc vào nhiều yếu tố, yếu tố gia cơng đóng vai trị quan trọng Sau có sản phẩm từ q trình gia cơng, để đánh giá chất lượng sản phẩm có nhiều phương pháp, phương pháp mang lại độ xác cao sử dụng đầu đo laser để kiểm tra Bên cạnh đó, cơng nghiệp phịng thí nghiệm thường phải đo kiểm định kích thước sản phẩm loạt sản phẩm giống địi hỏi độ xác định Một cách đơn giản đưa chúng hệ Đềcác vng góc chuẩn xác định kích thước thơng qua tọa độ Đây tài có tính ứng dụng cao sản xuất, đo lường cơng nghiệp, đó, tơi định chọn đề tài: “Xây dựng thiết bị đo độ sâu phạm vi 0-2mm sử dụng đầu dò laser” Lịch sử nghiên cứu Sử dụng đầu đo laser ZX-LD30V khoa học cơng nghiệp có số ứng dụng sau: - Tạp chí Khoa học Cơng nghệ 117 (2017) 054-057: Phương pháp xác định xác chiều dài làm việc cánh tay đòn thiết bị chuẩn Momen - Tạp chí Khoa học Công nghệ số 4(44): Nghiên cứu ảnh hưởng chế độ cắt đến tuổi bền đá mài phương pháp đo mòn đá sử dụng đầu đo laser Mục đích nghiên cứu luận văn Mục đích nghiên cứu: - Đề xuất tiêu đánh giá đầu đo laser, phương pháp sử dụng đầu đo laser - Xác định quan hệ thông số công nghệ thông số đặc trưng đầu đo laser, nhằm nâng cao tính xác lắp lên hệ đo.Trên sở kết nghiên cứu, ứng dụng để điều khiển vị trí đo, phương pháp lấy số liệu phân tích kết đo, tiến tới điều khiển tự động điều khiển thích nghi với q trình đo Tổng qt tốn: Với đề tài “Xây dựng thiết bị đo độ sâu phạm vi 0-2mm sử dụng đầu dò laser”, nhận thấy rằng, với khoảng cách từ 0-2mm khoảng cách nhỏ, sử dụng để lắp ráp cho linh kiện bé Độ sâu trường hợp hiểu ta chọn mặt phẳng chuẩn, khoảng cách mặt phẳng đến mặt phẳng khác độ sâu Với tất điều này, luận văn trình bày vỏ điện thoại J530, lắp ráp cần độ xác khoảng cách mặt mặt phẳng Đối tượng phạm vi nghiên cứu: - Nghiên cứu đầu đo laser ZX-LD30V khuếch đại ZX-LDA11-N - Vỏ điện thoại Samsung J530 - Sử dụng hệ đo máy CNC, trục Z gắn đầu đo laser - Những kết phương pháp nghiên cứu đạt vận dụng trình nghiên cứu ứng dụng thực tiễn sử dụng đầu đo laser ứng dụng khác Tóm tắt cô đọng luận điểm đóng góp vào luận văn Tóm tắt đọng luận điểm bản: - Nghiên cứu tổng quan đo độ sâu, dụng cụ thiết bị chuyên dùng đo chiều sâu - Xây dựng hệ thống đo chiều sâu bao gồm phần phần điện ghép nối điều khiển chuyển động trục máy tính Nghiên cứu yếu tố ảnh hưởng đến độ xác đo thiết bị // send it to the planner b=tiny_line(nx,ny,pz,pu,pv,pw,true); if(!b) return false; } b=tiny_line(x,y,pz,pu,pv,pw,true); return b; } float parseNumber(char code,float val) { char *ptr=serialBuffer; // start at the beginning of serialBuffer while((long)ptr > && (*ptr) && (long)ptr < (long)serialBuffer+sofar) { // walk to the end if(*ptr==code) { // if you find code on your walk, return atof(ptr+1); // convert the digits that follow into a float and return it } ptr=strchr(ptr,' ')+1; // take a step from here to the letter after the next space } return val; // end reached, nothing found, return default val } void output(char *code,float val) { char buffer[50]; sprintf(buffer,"%s%f\n",code,val); pc.printf(buffer); } 80 /** * print the current position, feedrate, and absolute mode */ void where() { output("X",px);wait_ms(10); output("Y",py);wait_ms(10); output("Z",pz);wait_ms(10); output("U",pu);wait_ms(10); output("V",pv);wait_ms(10); output("W",pw);wait_ms(10); output("F",fr);wait_ms(10); pc.printf(mode_abs?"ABS\n":"REL\n"); } void help() { pc.printf(("GcodeCNCDemo6AxisV2\n"));wait_ms(100); pc.printf(("Commands:\n"));wait_ms(100); pc.printf(("G00/G01 [X/Y/Z/U/V/W] [F(feedrate)]; - linear move\n"));wait_ms(100); pc.printf(("G02 [X] [Y] [I] [J] [F(feedrate)]; - clockwise arc\n"));wait_ms(100); pc.printf(("G03 [X] [Y] [I] [J] [F(feedrate)]; - counter-clockwise arc\n"));wait_ms(100); pc.printf(("G04 P[seconds]; - delay\n"));wait_ms(100); pc.printf(("G90; - absolute mode\n"));wait_ms(100); pc.printf(("G91; - relative mode\n"));wait_ms(100); pc.printf(("G92 [X/Y/Z/U/V/W]; - change logical position\n"));wait_ms(100); pc.printf(("G93 [X/Y/Z/U/V/W]; - change resolution\n"));wait_ms(100); pc.printf(("G94 [X/Y/Z/U/V/W]; - change max speed\n"));wait_ms(100); 81 pc.printf(("M18; - disable motors\n"));wait_ms(100); pc.printf(("M100; - this help message\n"));wait_ms(10); pc.printf(("M114; - report position and feedrate\n"));wait_ms(10); pc.printf(("M202; - Gun OFF\n"));wait_ms(10); pc.printf(("M203; - Gun ON\n"));wait_ms(10); pc.printf(("All commands must end with a newline.\n"));wait_ms(10); } void motor_enable() { enable_pin=1; } void motor_disable() { enable_pin=0; } /** * Read the input serialBuffer and find any recognized commands One G or M command per line */ void processCommand() { int cmd = (int) parseNumber('G',-1); bool result=true; char response[MAX_BUF]="ok\n"; switch(cmd) { case 0: case 1: 82 { // line feedrate(parseNumber('F',fr)); result=line(parseNumber('X',(mode_abs?px:0)) + (mode_abs?0:px), parseNumber('Y',(mode_abs?py:0)) + (mode_abs?0:py), parseNumber('Z',(mode_abs?pz:0)) + (mode_abs?0:pz), parseNumber('U',(mode_abs?pu:0)) + (mode_abs?0:pu), parseNumber('V',(mode_abs?pv:0)) + (mode_abs?0:pv), parseNumber('W',(mode_abs?pw:0)) + (mode_abs?0:pw)); break; } case 2: case 3: { // arc feedrate(parseNumber('F',fr)); result=arc(parseNumber('I',(mode_abs?px:0)) + (mode_abs?0:px), parseNumber('J',(mode_abs?py:0)) + (mode_abs?0:py), parseNumber('X',(mode_abs?px:0)) + (mode_abs?0:px), parseNumber('Y',(mode_abs?py:0)) + (mode_abs?0:py), (cmd==2) ? -1 : 1); break; } case 4: pause(parseNumber('P',0)*1000); break; // dwell case 90: mode_abs=1; break; // absolute mode case 91: mode_abs=0; break; // relative mode case 92: // set logical position position( parseNumber('X',0), parseNumber('Y',0), parseNumber('Z',0), 83 parseNumber('U',0), parseNumber('V',0), parseNumber('W',0) ); break; case 93: //RESOLUTION Changed Resolution[XX]=parseNumber('X',Resolution[XX]); Resolution[YY]=parseNumber('Y',Resolution[YY]); Resolution[ZZ]=parseNumber('Z',Resolution[ZZ]); Resolution[UU]=parseNumber('U',Resolution[UU]); Resolution[VV]=parseNumber('V',Resolution[VV]); Resolution[WW]=parseNumber('W',Resolution[WW]); break; case 94: //Max_Speed Changed Max_Speed[XX]=parseNumber('X',Max_Speed[XX]); Max_Speed[YY]=parseNumber('Y',Max_Speed[YY]); Max_Speed[ZZ]=parseNumber('Z',Max_Speed[ZZ]); Max_Speed[UU]=parseNumber('U',Max_Speed[UU]); Max_Speed[VV]=parseNumber('V',Max_Speed[VV]); Max_Speed[WW]=parseNumber('W',Max_Speed[WW]); break; default: break; } cmd = (int)parseNumber('M',-1); switch(cmd) { case 17: motor_enable(); break; case 18: motor_disable(); break; case 100: help(); break; case 114: where(); break; 84 //additional case //case 200: autoSwitch=false;digitalWrite(gunPin,LOW);Serial.print("ok\n");break; //case 201: autoSwitch=true; digitalWrite(gunPin,LOW);Serial.print("ok\n");break; case 202: gunPin=0; break; case 203: float _voltage=3.3*analogPin.read(); sprintf(response,"$%.6f ok\n",_voltage); gunPin=1; break; default: break; } if(result) pc.printf(response); } /** * prepares the input serialBuffer to receive a new message and tells the serial connected device it is ready for more */ void ready() { sofar=0; // clear input serialBuffer //Serial.print(F(">")); // signal ready to receive input } void limitIsr() { isRunning=false; 85 pc.printf("Limit reached!\n"); } #define TEST false int main() { //setup pc.baud(BAUD); //xLimitPin.rise(&limitIsr); //yLimitPin.rise(&limitIsr); //zLimitPin.rise(&limitIsr); motor_enable(); position(0,0,0,0,0,0); // set staring position feedrate(1000); // set default speed ready(); step_pin[XX]=1; dir_pin[ZZ]=1; if(TEST) {while(1) { onestep(ZZ); wait_ms(10); }} while(1) { while(pc.readable()) { // if something is available char c=pc.getc(); // get it if(sofar=0 && feed_rate>MAX_FEEDRATE[on_axis]) { gcode=QString("G00 X%1 Y%2 Z%3 F%4\n") arg(QString::number(_point.getCoor(XAXIS),'f',2)) arg(QString::number(_point.getCoor(YAXIS),'f',2)) arg(QString::number(_point.getCoor(ZAXIS),'f',2)) arg(QString::number(MAX_FEEDRATE[on_axis],'f',2)); }else { gcode=QString("G00 X%1 Y%2 Z%3\n") arg(QString::number(_point.getCoor(XAXIS),'f',2)) arg(QString::number(_point.getCoor(YAXIS),'f',2)) arg(QString::number(_point.getCoor(ZAXIS),'f',2)); } runGCode(gcode); 87 } 3.3 Hàm nạp G-code void MainWindow::runGCode(QString gcode) { ui->messageEdit->appendPlainText(gcode); if(!port->isOpen()) { inform(QString("Error! Adapter is not connected!")); return ; } if(!gcode.endsWith('\n')) gcode.append('\n'); port->write(gcode.toLatin1().data(),gcode.length()); } 3.4 Hàm tính đường thẳng QVector QuXYRectProfile::generateProfile(int on_axis) { if(on_axism_par[P_sizeY]) on_axis=XAXIS; else on_axis=YAXIS; } QVector result; QuCNCPointF A1; A1.copyPoint(m_convex); A1.setGunCmd(1); if(on_axis==XAXIS) { int row=0; 88 while(1) { if(row*m_par[P_dY]>m_par[P_sizeY]) break; int col=0; while(1) { if(col*m_par[P_dX]>m_par[P_sizeX]) break; QuCNCPointF _p;_p.copyPoint(A1); if(row%2==0) _p.m_coor[XAXIS]+=col*m_par[P_dX]; else _p.m_coor[XAXIS]+=m_par[P_sizeX]-col*m_par[P_dX]; _p.m_coor[YAXIS]+=row*m_par[P_dY]; result.append(_p); col++; } row++; } }else { int col=0; while(1) { if(col*m_par[P_dX]>m_par[P_sizeX]) break; int row=0; while(1) { if(row*m_par[P_dY]>m_par[P_sizeX]) break; QuCNCPointF _p;_p.copyPoint(A1); 89 _p.m_coor[XAXIS]+=col*m_par[P_dX]; if(col%2==0) _p.m_coor[YAXIS]+=row*m_par[P_dY]; else _p.m_coor[YAXIS]+=m_par[P_sizeX]-row*m_par[P_dY]; result.append(_p); row++; } col++; } } return result; } 3.5 Hàm tính hệ số ( làm chuẩn) void MainWindow::on_calibBtn_pressed() { int N=calibVoltVector.size(); if(NappendPlainText(serialBuffer); if(serialBuffer.contains(QString("ok"))) { toolPoint.copyPoint(cmdPoint); 91 updateToolPoint(); inform(QString("Command is performed!")); //in case executing A GENERATED PROFILE if(isExecutingPath) { ui->paintWidget->addPointToProcessedPath( QPointF(toolPoint.m_coor[XAXIS],toolPoint.m_coor[YAXIS])); proc_num++; if(proc_num>=desiredPath.length()) { isExecutingPath=false; inform(QString("Process is done! Require RESET!")); ui->execBtn->setText("EXECUTE"); }else { cmdPoint.copyPoint(desiredPath[proc_num]); runGCode(desiredPath[proc_num].gCodeToReach()); } } //in case executing a GCode file if(isExecutingGCode) { ui->paintWidget->addPointToProcessedPath( QPointF(toolPoint.m_coor[XAXIS],toolPoint.m_coor[YAXIS])); if(gcodeStream.atEnd()) { isExecutingGCode=false; ui->gCodeExecBtn->setText("EXECUTE GCODE"); 92 inform("GCode file is run over!"); }else { QString gcode=gcodeStream.readLine(); cmdPoint=targetPointFromGCode(gcode,cmdPoint); runGCode(gcode); } } if(serialBuffer.contains('$')) { m_volt=parseNumber(serialBuffer,'$',0); m_range=getLaserRange(m_volt); ui->lcdNumber->display(m_range); ui->actualRangeSpin->setValue(m_range); ui->voltLCDNumber->display(m_volt); if(isWriting) { measureStream