Delta (rostock型)3d打印機算法解讀及調(diào)試步驟
三、Marlin程序解讀
這里鴨哥不打算講marlin的整個loop()函數(shù)的流程,講講delta機型的核心部分。對于marlin來說,delta機型和非delta機型在對于溫控、看門狗、電機運動甚至空間坐標等方面都是一樣的。區(qū)別在哪里呢?區(qū)別就在與delta多了一個笛卡爾坐標轉(zhuǎn)換的函數(shù) Marlin的loop()主體流程 Void loop () { Get_command() ; //從sd卡或者串口獲取gcode Process_command(); //解析gcode并且執(zhí)行代碼 Manage_heater();//控制機器的噴頭和熱床的溫度 Manage_inactivity();// checkHitEndstops();//檢查endstop的狀態(tài) Lcd_update(); //更新lcd 上面的信息 }
在這個過程中 process_command()是控制的核心,各位仔細研讀一下process_command()的代碼就發(fā)現(xiàn)arduino的厲害了。簡單說一下process_command()的流程,說白了,process_command()就是一個巨大的case 結(jié)構(gòu),這里講講G1命令的大致邏輯(G1命令不知道的自己搜索去): Process_command() { Case 0: //g0->g1 Case 1 : { if(Stopped == false) { get_coordinates(); // 獲取當前的坐標,這里是指打印件的世界坐標哦,不是delta的xyz電機的坐標哦!普通結(jié)構(gòu)的打印機則是一樣的。 #ifdef FWRETRACT if(autoretract_enabled) if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { //獲取 命令中 xyze軸的參數(shù) Float echange=destination[E_AXIS]-current_position[E_AXIS]; //這里是算最小回抽值的,如果移動距離小于最小回抽值就不回抽了。這里是一個輔助功能。簡單了解可以了。 if((echange<-MIN_RETRACT && !retracted) || (echange>MIN_RETRACT && retracted)) { //move appears to be an attempt to retract or recover current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations plan_set_e_position(current_position[E_AXIS]); //AND from the planner retract(!retracted); return; } } #endif //FWRETRACT prepare_move(); //執(zhí)行移動命令
return; } } 從上面的代碼來看呢,對于運動類的Gcode,marlin會在process_command()函數(shù)中獲取xyze各軸的參數(shù)后算出目標坐標(destination[_AXIS]),也會使用get_coordinates()來獲取當前坐標(current_position[E_AXIS])(再次強調(diào),這個坐標是打印件的世界坐標),當我們知道了目標坐標和當前坐標以后,空間中移動的距離就可以算出來了(不會算的,請自覺請高中數(shù)學(xué)老師吃飯去),接下來marlin就使用perpare_move()來控制電機啦。 接下來呢很自然就要講講prepare_move()這個函數(shù)啦。先上代碼先,代碼鴨哥做了精簡,只看關(guān)鍵的部分就是delta和普通結(jié)構(gòu)的代碼,先說一下plan_buffer_line()這個函數(shù)的作用的把坐標數(shù)組current_position 、 destination 放到一個內(nèi)存的一個緩存區(qū)里面,然后控制電機轉(zhuǎn)多少圈這樣一個作用的,具體代碼可以自己去看,在一旦進入這個函數(shù)以后,delta和普通機型的代碼都是一樣的,也就是說delta和普通結(jié)構(gòu)的電機控制其實是一樣的。 Difference數(shù)組 :用來儲存目標坐標和當前坐標之間的距離的,(這里是包含了xyze軸的數(shù)組) Destination數(shù)組:目標坐標的數(shù)值,是從process_command()函數(shù)中G1讀取XYZE參數(shù)獲取的。 Current_position數(shù)組:當前坐標的數(shù)值,是從G1 命令中g(shù)et_coordinates()傳遞過來的。如果是3個軸都歸零的情況下,current_position就是儲存三個坐標原點,如果開始運動了,這里的值就是上一個prepare_move()循環(huán)執(zhí)行后上一次的destination的值。(這個下面會有看到賦值語句) Delta數(shù)組:delta打印機的xyz三個電機要移動的距離 void prepare_move() {
#ifdef DELTA // 設(shè)置機子是delta機型(rostock) float difference[NUM_AXIS]; //定義目標距離,用于轉(zhuǎn)換坐標用的過渡變量 for (int8_t i=0; i < NUM_AXIS; i++) { difference = destination - current_position; } //計算世界坐標的距離值 //***開始計算笛卡爾距離 并且暴力直線插值來減少運算量***// float cartesian_mm = sqrt(sq(difference[X_AXIS]) + sq(difference[Y_AXIS]) + sq(difference[Z_AXIS])); if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); } if (cartesian_mm < 0.000001) { return; } float seconds = 6000 * cartesian_mm / feedrate / feedmultiply; int steps = max(1, int(delta_segments_per_second * seconds)); for (int s = 1; s <= steps; s++) { float fraction = float(s) / float(steps);//直線插值 for(int8_t i=0; i < NUM_AXIS; i++) { destination = current_position + difference * fraction; } //***結(jié)束計算笛卡爾距離 并且暴力直線插值來減少運算量***// calculate_delta(destination);//將打印件的世界坐標轉(zhuǎn)換為xyz電機軸的運動量 plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder); } #endif // DELTA 。。。。。。。。。。。。 #if ! (defined DELTA || defined SCARA) // Do not use feedmultiply for E or Z only moves if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) { plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); //直接將destination的值發(fā)送去運動緩存里面 } else { plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder); } #endif // !(DELTA || SCARA) for(int8_t i=0; i < NUM_AXIS; i++) { current_position = destination; //更新當前坐標的值為剛執(zhí)行的目標坐標值 } }
Delta3D打印機代碼解讀及調(diào)機心得(一)
Delta3D打印機代碼解讀及調(diào)機心得(三)
Delta3D打印機代碼解讀及調(diào)機心得(四) |
你可能喜歡
最新《Nature》:動態(tài)界面3D打印
石墨烯增強混凝土能否推動可持續(xù)建筑? UVA
杜克大學(xué):新型無溶劑3D打印材料,可用于醫(yī)
超強金屬3D打印合金問世:為太空探索打造極
推薦課程
神奇的3D打印
SLA3D打印工藝全套培訓(xùn)課程 - 軟件篇
3D打印月球燈視頻教程 包括完整貼圖建模流
【原創(chuàng)發(fā)布】Cura軟件修改二次開發(fā)定制視頻