玩過(guò)一段時(shí)間3D打印機(jī)的朋友,都會(huì)接觸到G-code文件。所謂G-code文件, 指的是3D模型在進(jìn)入3D打印機(jī)實(shí)際打印之前,必須要經(jīng)過(guò)切片器處理而成的一種中間格式文件。這種中間格式文件的內(nèi)容,實(shí)際上每一行都是3D打印機(jī)固件所能理解的命令。而這些命令,也被稱為G-code命令,是3D打印機(jī)和電腦之間最重要的命令交互界面。
事實(shí)上所有從計(jì)算機(jī)發(fā)送到3D打印機(jī)的內(nèi)容,全部都是G-code命令,沒(méi)有任何例外。不論計(jì)算機(jī)和3D打印機(jī)之間是如何連接的,用常見(jiàn)的USB線也好,用SD卡作為G-code文件介質(zhì)也好,或是用比較新式的TCP/IP連接也可以,這個(gè)連接通道中的所有信息,都是G-code命令。這個(gè)特征非常重要,牢牢記住這個(gè)特征,可以在我們分析、解決很多3D打印機(jī)問(wèn)題的時(shí)候,提供強(qiáng)有力的支撐。 既然所有3D打印機(jī)都使用G-code作為對(duì)外聯(lián)系的唯一信息交互方式,那么這種“語(yǔ)言”的標(biāo)準(zhǔn)就很重要了。不幸的是,雖然所有的3D打印機(jī),都使用G-code作為與計(jì)算機(jī)的交互語(yǔ)言,但實(shí)際上每種3D打印機(jī)“說(shuō)出”的G-code,都多多少少有些不同。這也可以說(shuō),每種3D打印機(jī)都有自己的“方言”。我們要研究G-code,就要從一種最常見(jiàn)的“方言”,也可以說(shuō)是“普通話”開(kāi)始,先了解一種,然后再學(xué)習(xí)其他類似的語(yǔ)言,相互對(duì)比,就很容易了。 我們這篇文章,專門研究的是Repetier公司出品的Repetier-firmware固件所使用的G-code語(yǔ)法。如果這正是你需要的,那么就很方便了。如果你想研究的是其他3D打印機(jī)固件,比如marlin之類,那就不太巧了,有些內(nèi)容可能不完全一致。不過(guò),文章中提到的方法,仍然適用,你可以以這篇文章為基礎(chǔ),自己搞定對(duì)marlin的研究。 這篇文章主要面向具有一定技術(shù)水平的朋友,從第一節(jié)開(kāi)始,我們就開(kāi)始分門別類解釋每一條G-code命令,這對(duì)于已經(jīng)了解如何使用G-code的朋友會(huì)比較方便。
第一節(jié),基礎(chǔ)運(yùn)動(dòng)既然G-code是計(jì)算機(jī)指揮3D打印機(jī)干活用的一套語(yǔ)言,那么其中最重要的就是運(yùn)動(dòng)類的指令。 G0/G1 直線移動(dòng) 雖然從名字上看,G0叫做“快速直線移動(dòng)”,而G1叫做“直線移動(dòng)”,但實(shí)際上在Repetier-firmware里面,G0和G1指令是完全等價(jià)的,沒(méi)有任何區(qū)別。移動(dòng)是否快速,完全是靠參數(shù)F來(lái)決定的(下面會(huì)詳細(xì)介紹)。這條指令的作用也很簡(jiǎn)單,就是將擠出頭線性移動(dòng)到一個(gè)特定的位置。這條指令帶有不少參數(shù),完整的形式是這樣的: G0 Xnnn Ynnn Znnn Ennn Fnnn Snnn 或者 G1 Xnnn Ynnn Znnn Ennn Fnnn Snnn 使用時(shí),不需要所有的參數(shù)全部存在,但至少要有一個(gè)參數(shù)。其中, Xnnn表示X軸的移動(dòng)位置; Ynnn表示Y軸的移動(dòng)位置; Znnn表示Z軸的移動(dòng)位置; Ennn表示E軸(擠出頭步進(jìn)電機(jī))的移動(dòng)位置; Fnnn表示速度,單位是毫米/每分鐘; Snnn表示是否檢查限位開(kāi)關(guān),S0不檢查,S1檢查,缺省值是S0; 舉例來(lái)說(shuō), G1 F1500 G1 X50 Y25.3 E22.4 這樣兩行G-code,表示了首先將速度設(shè)置為1500mm/min,也就是25mm/s,然后將擠出頭移動(dòng)至x=50mm, y=25.3mm的位置上,z軸高度不變,并且將擠出頭步進(jìn)電機(jī)移動(dòng)至22.4mm的位置上。這里,速度、xyz位置都比較好理解,但擠出頭步進(jìn)電機(jī)的位置怎么理解呢?移動(dòng)至22.4mm處,代表著擠出了多少耗材呢?實(shí)際上,這里擠出頭的具體動(dòng)作,要根據(jù)之前擠出頭步進(jìn)電機(jī)所在的狀態(tài)(也就是位置)而定。比如在這兩條語(yǔ)句之前,擠出頭步進(jìn)電機(jī)已經(jīng)處于20mm的位置處,那么這里擠出頭步進(jìn)電機(jī)只要再前進(jìn)2.4mm就可以了。 仔細(xì)想想,其實(shí)擠出頭步進(jìn)電機(jī)的工作方式,與xyz軸完全一樣。xyz軸之所以比較好理解,是因?yàn)槲覀兦宄闹涝c(diǎn)(0, 0, 0)的位置在哪里。而對(duì)于e軸來(lái)說(shuō)原點(diǎn)的位置也會(huì)在打印開(kāi)始處被初始化到0的位置。知道了原點(diǎn)的位置,就可以正確理解擠出頭步進(jìn)電機(jī)的工作方式了。實(shí)際上,擠出頭步進(jìn)電機(jī)仍然是以原點(diǎn)為基礎(chǔ),只不過(guò)是在整個(gè)打印過(guò)程中持續(xù)增加的。(思考:切片器的擠出頭回抽動(dòng)作,對(duì)應(yīng)了什么樣的G-code代碼?) 再舉一例, G1 F1500 G1 X50 Y25.3 E22.4 F3000 這個(gè)例子與上面的例子非常類似,唯一的區(qū)別,就是F參數(shù)了。而這兩條語(yǔ)句的意義,除了對(duì)XYZE的移動(dòng)之外,還會(huì)將打印速度,從語(yǔ)句執(zhí)行開(kāi)始時(shí)的1500mm/min,提高到語(yǔ)句執(zhí)行結(jié)束時(shí)的3000mm/min。這里有兩點(diǎn)需要注意。 第一點(diǎn),F(xiàn)參數(shù)與XYZE參數(shù)一樣,在語(yǔ)句執(zhí)行的過(guò)程中線性插值; 第二點(diǎn),在預(yù)先知道第一點(diǎn)的前提下,F(xiàn)參數(shù)使得計(jì)算機(jī)對(duì)3D打印機(jī)的控制更加深入和精準(zhǔn)了。計(jì)算得當(dāng)?shù)那闆r下,切片器可以精確控制3D打印機(jī)的加速和減速過(guò)程,使得整個(gè)3D打印過(guò)程更加順滑。 G2/G3 圓弧移動(dòng) 這兩條命令中,G2是順時(shí)針圓弧移動(dòng),G3是逆時(shí)針圓弧移動(dòng)。命令的完整形式是: G2 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn 或者 G3 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn 其中, Xnnn表示移動(dòng)目標(biāo)點(diǎn)的X坐標(biāo); Ynnn表示移動(dòng)目標(biāo)點(diǎn)的Y坐標(biāo); Innn表示圓心位置,值是圓心距離當(dāng)前位置的X分量; Jnnn表示圓心位置,值是圓心距離當(dāng)前位置的Y分量; Rnnn表示圓形的半徑長(zhǎng)度; Ennn表示E軸(擠出頭步進(jìn)電機(jī))的移動(dòng)位置; Fnnn表示速度,單位是毫米/每分鐘; 根據(jù)勾股定理,R2 = I2 + J2。因此,如果提供了圓心位置參數(shù),就不需要提供半徑參數(shù)了。反之,如果提供了半徑參數(shù),也可以根據(jù)當(dāng)前點(diǎn)和目標(biāo)點(diǎn)計(jì)算出圓心位置,就不需要提供I/J參數(shù)了。其他幾個(gè)的參數(shù)用法,與G0/G1是完全一樣的。 G2/G3命令面臨的最尷尬的問(wèn)題,是常用的上位機(jī)切片器軟件,包括Slic3r以及Cura engine,并不會(huì)生成這兩條指令。所有3D模型中的圓弧,在STL文件中已經(jīng)被轉(zhuǎn)化為使用大量小線段擬合而成的曲線。這樣,切片器自然也不會(huì)把這些小線段當(dāng)做圓弧處理。最終的G-code輸出結(jié)果,也只會(huì)存在G0/G1指令,而不會(huì)存在G2/G3指令。當(dāng)然,據(jù)打印虎所知,如果你使用的是比較小眾的上位機(jī)軟件,比如artCAM等,因?yàn)檫@些軟件的輸入并不是STL文件,因此它們的輸出G-code是很有可能出現(xiàn)G2/G3命令的。 如果確定了你的3D打印機(jī)只會(huì)接收到G0/G1直線移動(dòng)命令,那么我們完全可以在3D打印機(jī)固件配置中,定義 #define ARC_SUPPORT 0 這樣,所有與G2/G3指令相關(guān)的代碼,就都不會(huì)編譯,也不會(huì)包含在最終的固件代碼中了??梢怨?jié)省一些固件的空間,同時(shí)并不會(huì)影響任何3D打印機(jī)的功能。 還有一個(gè)問(wèn)題留給大家思考:在上位機(jī)切片軟件輸出G2/G3命令的情況下,相比于上位機(jī)切片軟件輸出G0/G1命令的情況,是否3D打印機(jī)打印圓形物體時(shí)會(huì)更圓呢?(答案是不會(huì)。)那么其中的原理是什么? G4 暫停移動(dòng) 這條命令讓擠出機(jī)在當(dāng)前位置停止一段時(shí)間。可能的參數(shù)包括: Pnnn表示停止移動(dòng)的時(shí)間,以毫秒為單位,1000毫秒等于1秒。 Snnn也表示停止移動(dòng)的時(shí)間,以秒為單位。 因此,G4 P2000命令與G4 S2命令是完全等價(jià)的。 G10/G11 回抽/反回抽 這兩條命令使擠出頭執(zhí)行一個(gè)回抽(G10)或者相反的動(dòng)作(G11)。所謂回抽,就是讓E軸步進(jìn)電機(jī)反轉(zhuǎn)一小段。而反回抽則讓E軸步進(jìn)電機(jī)正轉(zhuǎn)一小段。參數(shù)只有一個(gè): Snnn表示回抽的距離。S1表示長(zhǎng)回抽,S0表示短回抽。 實(shí)際上,目前的切片器并不太依賴于G10/G11指令執(zhí)行回抽動(dòng)作,而是利用G1 Ennn命令直接命令擠出頭步進(jìn)電機(jī)前進(jìn)或倒退到某一個(gè)位置。因此,與G2/G3命令類似,G10/G11命令基本上是個(gè)擺設(shè),除非未來(lái)有專門的切片器可以生成這兩條指令,否則完全可以將這兩條指令關(guān)閉,節(jié)省內(nèi)存空間。在固件配置中,定義 #define FEATURE_RETRACTION 0 可以關(guān)閉G10/G11功能,在編譯期去除這段相關(guān)的代碼。 G20/G21 設(shè)置距離單位 這兩條命令非常簡(jiǎn)單,用于設(shè)置當(dāng)前距離單位為英寸(G20)或者毫米(G21)。沒(méi)有參數(shù)。 未設(shè)置時(shí)缺省值是毫米。 G28 歸零 這條命令使3D打印機(jī)XYZ軸以及擠出頭E軸歸零。參數(shù)包括: X表示使X軸歸零 Y表示使Y軸歸零 Z表示使Z軸歸零 E表示重置E軸的位置為0,與XYZ軸不同的是,如果使用了E參數(shù),E軸步進(jìn)電機(jī)并不運(yùn)動(dòng),而是將當(dāng)前的E軸位置直接設(shè)置為0,這樣下面對(duì)E軸的運(yùn)動(dòng)指令,都會(huì)解釋為相對(duì)0點(diǎn)的運(yùn)動(dòng)。 如果使用時(shí)沒(méi)有任何參數(shù),直接使用G28,等價(jià)于G28 XYZ命令。這時(shí)并不會(huì)對(duì)E軸進(jìn)行重置為0的操作。 XYZ軸歸零的順序,由固件配置HOMEING_ORDER決定,比如定義為 #define HOMING_ORDER HOME_ORDER_XYZ 就代表著先歸零X軸,然后是Y軸,最后是Z軸。 T 設(shè)置當(dāng)前擠出頭 對(duì)于擁有多個(gè)擠出頭的3D打印機(jī)來(lái)說(shuō),需要使用T命令選擇當(dāng)前工作的擠出頭。這條命令有一個(gè)無(wú)名參數(shù),參數(shù)值直接跟在T后面。例如: T0表示選擇第一個(gè)擠出頭; T1表示選擇第二個(gè)擠出頭; 參數(shù)是T命令最特殊的一點(diǎn)。這與其他所有的G-code命令都不相同。
第二節(jié),Z軸高度測(cè)試與自動(dòng)調(diào)平三角洲類型的3D打印機(jī),由于其打印速度更快,受到很多3D打印用戶的歡迎。與XYZ式3D打印機(jī)最大的一個(gè)不同,在于三角洲類型3D打印機(jī)的運(yùn)動(dòng)計(jì)算更加復(fù)雜,很難依賴人工調(diào)平達(dá)到較好的打印效果。因此,對(duì)Z軸的自動(dòng)高度測(cè)試,以及自動(dòng)調(diào)平相關(guān)的功能,就顯得更加重要了。以下G-code命令,是Repetier-firmware對(duì)這方面進(jìn)行支持的一組命令。當(dāng)然,這些功能并不僅限于三角洲類型的3D打印機(jī)。如果是包含了Z軸高度測(cè)試微動(dòng)開(kāi)關(guān)的XYZ式3D打印機(jī),也同樣可以使用這些功能。 G29 Z軸高度三點(diǎn)測(cè)試 這條命令測(cè)試打印平面上三個(gè)點(diǎn)的Z軸高度,并在串口上輸出結(jié)果。參數(shù)包括: Snnn測(cè)試結(jié)果的處理方式。S1表示更新內(nèi)存中的Z軸高度值(重置系統(tǒng)會(huì)丟失),S2表示更新內(nèi)存以及EEPROM中的Z軸高度值(重置系統(tǒng)不會(huì)丟失)。 無(wú)參數(shù)時(shí),G29命令表示只從串口上輸出結(jié)果,不更新內(nèi)存或EEPROM中的Z軸高度值。 一般來(lái)說(shuō),只有使用高位限位開(kāi)關(guān)(也就是說(shuō),Z軸的限位開(kāi)關(guān)位于Z軸坐標(biāo)最大處),且在擠出頭上附帶有Z軸高度測(cè)試微動(dòng)開(kāi)關(guān)的機(jī)型,適合使用G29命令測(cè)試Z軸高度。其他機(jī)械配置的機(jī)型,不適合使用G29命令。G29命令由固件配置 #define FEATURE_Z_PROBE 1 決定是否開(kāi)啟。如果這個(gè)配置項(xiàng)定義為0,則編譯時(shí)會(huì)去除對(duì)G29命令的支持,節(jié)省內(nèi)存的使用。 命令執(zhí)行時(shí),打印平面上的三個(gè)點(diǎn),其XY坐標(biāo)由以下固件配置參數(shù)決定: #define Z_PROBE_X1 -52 #define Z_PROBE_Y1 -30 #define Z_PROBE_X2 52 #define Z_PROBE_Y2 -30 #define Z_PROBE_X3 0 #define Z_PROBE_Y3 60 命令執(zhí)行的開(kāi)始和結(jié)束,分別會(huì)執(zhí)行一段預(yù)定義的G-code。缺省的固件配置定義為: #define Z_PROBE_START_SCRIPT “G28” #define Z_PROBE_FINISHED_SCRIPT “” 可以看出,在缺省狀態(tài)下,開(kāi)始執(zhí)行G29時(shí),系統(tǒng)會(huì)自動(dòng)對(duì)擠出頭進(jìn)行復(fù)位(G28命令)。結(jié)束執(zhí)行G29時(shí),沒(méi)有特殊的動(dòng)作。 G29命令的Z軸高度測(cè)試,通常由一個(gè)微動(dòng)開(kāi)關(guān)控制觸發(fā)。這個(gè)開(kāi)關(guān)的端口號(hào),由Z_PROBE_PIN單獨(dú)指定。 G29命令的輸出,格式為: X:0.00 Y:0.00 Z:200.00 E:0.00 Z-probe:5.01 X:-52.00 Y:-30.00 Z-probe:13.04 X:52.00 Y:-30.00 Z-probe:12.77 X:0.00 Y:60.00 X:0.00 Y:60.00 Z:-98.48 E:0.00 從以上例子的輸出可以看出,G29命令一共測(cè)試了三個(gè)坐標(biāo)點(diǎn),分別在(-52, -30), (53, 30)以及(0, 60)的位置,形成一個(gè)正三角形。三個(gè)點(diǎn)的Z軸高度相差比較懸殊,在第一個(gè)點(diǎn)正好是5mm的情況下,后兩個(gè)點(diǎn)分別是13.04mm以及12.77mm。第一行和最后一行,是測(cè)試開(kāi)始時(shí)以及測(cè)試結(jié)束時(shí)的擠出頭坐標(biāo)位置。 G30 Z軸高度單點(diǎn)測(cè)試(單步) 這條命令作為一個(gè)完整Z軸高度測(cè)試過(guò)程的一步,測(cè)試打印平面上一個(gè)點(diǎn)的Z軸高度,并在串口上輸出結(jié)果。這個(gè)完整的Z軸高度測(cè)試過(guò)程,通常是由3D打印機(jī)控制軟件連續(xù)發(fā)出的,通過(guò)參數(shù)控制G30的執(zhí)行狀態(tài)。因此在手動(dòng)工作方式下,G30命令只適合不帶參數(shù)運(yùn)行(等價(jià)于G30 P3,見(jiàn)下面的參數(shù)說(shuō)明)。 G30命令的參數(shù)包括: Pnnn表示測(cè)試的狀態(tài),P1表示當(dāng)前這步是整個(gè)Z軸高度測(cè)試過(guò)程的第一步;P2表示當(dāng)前這步是整個(gè)Z軸高度測(cè)試過(guò)程的最后一步;P3表示當(dāng)前這步是Z軸高度測(cè)試過(guò)程的唯一一步,也就是說(shuō)既是第一步也是最后一步;P0表示當(dāng)前這步是Z軸高度測(cè)試過(guò)程中的中間一步。無(wú)參數(shù)情況下,P的缺省值是3。 與G29命令類似,G30命令同樣由固件配置 #define FEATURE_Z_PROBE 1 決定是否開(kāi)啟。 G30命令的輸出,與上面的G29輸出格式一致,但只有其中的一行,需要上位機(jī)軟件多次發(fā)出G30命令,再綜合處理所有的輸出結(jié)果。 G31 輸出Z軸高度測(cè)試微動(dòng)開(kāi)關(guān)狀態(tài) 這條命令非常簡(jiǎn)單,沒(méi)有參數(shù)。執(zhí)行后會(huì)輸出當(dāng)前Z軸高度測(cè)試微動(dòng)開(kāi)關(guān)的當(dāng)前狀態(tài): Z-probe state:L 其中L表示微動(dòng)開(kāi)關(guān)沒(méi)有觸發(fā)。如果是處于觸發(fā)狀態(tài),這里會(huì)輸出H。 G29命令、G30命令、G31命令只進(jìn)行Z軸的高度測(cè)試,并不進(jìn)行自動(dòng)調(diào)平。有些上位機(jī)3D打印機(jī)控制軟件,會(huì)通過(guò)這一組命令配合自動(dòng)跳屏算法實(shí)現(xiàn)(上位機(jī))熱床自動(dòng)調(diào)平功能。如果希望不通過(guò)上位機(jī),只由3D打印機(jī)自身完成自動(dòng)調(diào)平功能,需要使用G32命令。 G32 熱床自動(dòng)調(diào)平 這條命令在G29命令的基礎(chǔ)上,不僅測(cè)試打印平面上三個(gè)點(diǎn)的Z軸高度,而且還會(huì)根據(jù)測(cè)試的結(jié)果,對(duì)3D打印機(jī)的機(jī)械參數(shù)進(jìn)行調(diào)整,實(shí)現(xiàn)熱床自動(dòng)調(diào)平。G32命令使用的參數(shù)與G29命令是一致的: Snnn測(cè)試結(jié)果的處理方式。S1表示更新內(nèi)存中的相關(guān)參數(shù)值(重置系統(tǒng)會(huì)丟失),S2表示更新內(nèi)存以及EEPROM中的相關(guān)參數(shù)值(重置系統(tǒng)不會(huì)丟失)。 G32命令執(zhí)行完成時(shí),不僅Z軸高度參數(shù)發(fā)生了改變,而且還會(huì)根據(jù)3D打印機(jī)的硬件配置,對(duì)熱床進(jìn)行相應(yīng)的調(diào)平處理。 如果熱床本身是使用步進(jìn)電機(jī)進(jìn)行高度控制的,那么程序會(huì)自動(dòng)調(diào)整步進(jìn)電機(jī)的位置,使熱床自動(dòng)調(diào)整為平整的狀態(tài);如果熱床本身不能移動(dòng)(這個(gè)應(yīng)該是更常見(jiàn)的情況),那么G32命令會(huì)在3D打印機(jī)內(nèi)存中構(gòu)建一個(gè)轉(zhuǎn)換矩陣(Transformation matrix),讓未來(lái)3D打印機(jī)所處理的所有三維空間位置,都先經(jīng)過(guò)這個(gè)矩陣的變換,保證在Z=0的情況下,正好與熱床平面完全吻合。由于這里涉及到高深的計(jì)算機(jī)圖形學(xué)知識(shí),我們就不詳細(xì)介紹了。有修改這方面代碼需求的朋友,可以直接與打印虎進(jìn)行聯(lián)系。 G32命令,由固件配置 #define FEATURE_AUTOLEVEL 1 決定是否開(kāi)啟。 G32命令的輸出,格式與G29命令類似: X:0.00 Y:0.00 Z:200.00 E:0.00 Z-probe:5.00 X:-52.00 Y:-30.00 Z-probe:12.97 X:52.00 Y:-30.00 Z-probe:12.76 X:0.00 Y:60.00 Info: 0.99709 -0.00319 -0.07628 0.00000 0.99912 -0.4191 0.07634 0.004179 0.99621 Info: Autoleveling enabled X:7.32 Y:64.08 Z:-95.66 E:0.00 X:0.00 Y:0.00 Z:200.00 E:0.00 除了與G29命令相似的測(cè)量信息之外,G32命令還輸出了計(jì)算得到的自動(dòng)調(diào)平矩陣,并且打開(kāi)了自動(dòng)調(diào)平功能。需要注意的一點(diǎn)是,G32命令雖然生成了自動(dòng)調(diào)平矩陣,但并沒(méi)將其保存在EEPROM中,因此下次開(kāi)機(jī)這個(gè)信息將會(huì)丟失??梢耘浜螹320 S1命令,將自動(dòng)調(diào)平矩陣保存在EEPROM中。 M251 將當(dāng)前Z軸位置保存為Z軸高度值 這條命令可以將當(dāng)前的Z軸位置保存為Z軸高度值,以使前面的Z軸高度手動(dòng)/自動(dòng)測(cè)量的結(jié)果起作用。通常,M251命令只工作在三角洲機(jī)型上,并且應(yīng)該與G29命令聯(lián)合使用(自動(dòng)測(cè)量Z軸高度)。這條命令沒(méi)有相關(guān)的參數(shù)。 當(dāng)3D打印機(jī)打開(kāi)EEPROM支持時(shí),這條命令還會(huì)將Z軸高度值同時(shí)保存在EEPROM中。 只有當(dāng)固件配置定義 #define Z_HOME_DIR -1 也就是Z軸向正方向歸位,并且定義 #define MAX_HARDWARE_ENDSTOP_Z true 也就是存在硬件的Z軸高位限位開(kāi)關(guān)時(shí),M251命令才會(huì)在編譯中包含相關(guān)的代碼。 通常,只有三角洲類型的3D打印機(jī)才能滿足這兩個(gè)條件限制。 M320/M321 開(kāi)啟/關(guān)閉自動(dòng)調(diào)平 開(kāi)啟(M320)或者關(guān)閉(M321)自動(dòng)調(diào)平功能,使自動(dòng)調(diào)平轉(zhuǎn)換矩陣起作用或不起作用。命令參數(shù)為 Snnn表示是否保存于EEPROM,沒(méi)有S參數(shù)或者S0表示不保存于EEPROM,S1表示保存于EEPROM,在關(guān)閉自動(dòng)調(diào)平(M321)命令中S3表示將自動(dòng)調(diào)平矩陣清零且保存于EEPROM中; M320的輸出結(jié)果為: Info:Autoleveling enabled 表示自動(dòng)調(diào)平已經(jīng)打開(kāi)。 M321的輸出結(jié)果為: Info:Autoleveling disabled 表示自動(dòng)調(diào)平已經(jīng)關(guān)閉。 M322 清零自動(dòng)調(diào)平轉(zhuǎn)換矩陣 清零(M322)自動(dòng)調(diào)平轉(zhuǎn)換矩陣。顯然,清零這個(gè)動(dòng)作的同時(shí)自動(dòng)調(diào)平功能也關(guān)閉了。命令參數(shù)為 Snnn表示是否保存于EEPROM,S0表示不保存于EEPROM,S1表示保存于EEPROM; 也就是說(shuō), M321 S3 命令等價(jià)于 M322 S1 命令,兩者都是清零自動(dòng)調(diào)平矩陣,關(guān)閉自動(dòng)調(diào)平功能,并且將這個(gè)設(shè)置保存于EEPROM之中。 以上三條命令,與G32命令相同,由固件配置 #define FEATURE_AUTOLEVEL 1 決定是否開(kāi)啟。 M322的輸出結(jié)果為: Info:Autolevel matrix reset 表示自動(dòng)調(diào)平轉(zhuǎn)換矩陣已經(jīng)被清零。
第三節(jié),坐標(biāo)模式與坐標(biāo)位置G90/G91 設(shè)置坐標(biāo)模式 這兩條命令用于設(shè)置當(dāng)前坐標(biāo)模式為絕對(duì)坐標(biāo)模式(G90)或者相對(duì)坐標(biāo)模式(G91)。沒(méi)有參數(shù)。 未設(shè)置時(shí)缺省值是絕對(duì)坐標(biāo)模式。我們?cè)谶@篇教程中,所有的例子也都是以絕對(duì)坐標(biāo)模式給出的。 在相對(duì)坐標(biāo)模式下,每次步進(jìn)電機(jī)XYZE移動(dòng)之后,當(dāng)前位置都會(huì)重置為0。對(duì)于以下兩條G-code命令 G0 X1 G0 X-1 如果3D打印機(jī)當(dāng)前處于相對(duì)坐標(biāo)模式下,那么X軸步進(jìn)電機(jī)會(huì)先向正方向移動(dòng)一個(gè)單位,再向反方向移動(dòng)一個(gè)單位。第二條語(yǔ)句,實(shí)際移動(dòng)距離是1個(gè)單位(向X軸反方向)。 而如果3D打印機(jī)當(dāng)前處于絕對(duì)坐標(biāo)模式下,那么X軸步進(jìn)電機(jī)會(huì)先移動(dòng)到X=1的位置處,再移動(dòng)到X=-1的位置處。第二條語(yǔ)句,實(shí)際移動(dòng)距離是2個(gè)單位(向X軸反方向)。 G92 設(shè)置位置 設(shè)置3D打印機(jī)內(nèi)存中XYZE的位置值。不移動(dòng)對(duì)應(yīng)的步進(jìn)電機(jī)。參數(shù)包括: Xnnn表示X軸的位置值; Ynnn表示Y軸的位置值; Znnn表示Z軸的位置值; Ennn表示E軸(擠出機(jī)步進(jìn)電機(jī))的位置值;
第四節(jié),輔助步進(jìn)電機(jī)一些3D打印機(jī)的機(jī)械設(shè)計(jì),會(huì)在XYZE四個(gè)步進(jìn)電機(jī)軸之外,使用更多的輔助步進(jìn)電機(jī)。Repetier-firmware提供了一套輔助步進(jìn)電機(jī)指令,讓用戶(以及上位機(jī)軟件)可以操作這些輔助步進(jìn)電機(jī)。由于輔助步進(jìn)電機(jī)的用途、參數(shù)各異,為了讓這套指令更加通用,這些指令被設(shè)計(jì)為非常簡(jiǎn)單的形式。 G201 移動(dòng)步進(jìn)電機(jī)位置 將步進(jìn)電機(jī)P的位置移動(dòng)到X位置處。參數(shù)包括: Pnnn表示第P個(gè)輔助步進(jìn)電機(jī); Xnnn表示這個(gè)步進(jìn)電機(jī)的目標(biāo)位置; 這條命令與G1命令非常類似。 G202 設(shè)置當(dāng)前位置 將X位置設(shè)置為步進(jìn)電機(jī)P的當(dāng)前位置。不實(shí)際移動(dòng)步進(jìn)電機(jī)。參數(shù)包括: Pnnn表示第P個(gè)輔助步進(jìn)電機(jī); Xnnn表示這個(gè)步進(jìn)電機(jī)的當(dāng)前位置; 這條命令與G92命令非常類似。 G203 報(bào)告當(dāng)前位置 報(bào)告步進(jìn)電機(jī)P的當(dāng)前位置。參數(shù)包括: Pnnn表示第P個(gè)輔助步進(jìn)電機(jī); 這條命令與M114命令非常類似。 G203 開(kāi)啟/關(guān)閉步進(jìn)電機(jī) 用于開(kāi)啟/關(guān)閉步進(jìn)電機(jī)P。參數(shù)包括: Pnnn表示第P個(gè)輔助步進(jìn)電機(jī); Snnn表示開(kāi)閉標(biāo)志,S0表示關(guān)閉步進(jìn)電機(jī),S1表示開(kāi)啟步進(jìn)電機(jī); 步進(jìn)電機(jī)開(kāi)啟后,有兩種可能的狀態(tài)。一種是“運(yùn)動(dòng)”狀態(tài),也就是正在進(jìn)行正向或反向的旋轉(zhuǎn)。另一種是“保持位置”狀態(tài),也就是保持當(dāng)前的位置不變。雖然步進(jìn)電機(jī)關(guān)閉也不會(huì)主動(dòng)移動(dòng)位置,但“保持位置”狀態(tài)與步進(jìn)電機(jī)關(guān)閉狀態(tài)仍有顯著的區(qū)別?!氨3治恢谩睜顟B(tài)下,當(dāng)步進(jìn)電機(jī)受力時(shí),會(huì)產(chǎn)生一個(gè)反向的力矩,使步進(jìn)電機(jī)位置保持不變。 這條命令與“節(jié)能管理”一節(jié)中的M84命令有關(guān)。M84命令用于關(guān)閉XYZE步進(jìn)電機(jī),但不能打開(kāi)這些步進(jìn)電機(jī)。
第五節(jié),SD卡管理M20 列目錄 顯示SD卡所有目錄內(nèi)容。沒(méi)有相關(guān)的參數(shù)。 M20命令的輸出,格式為: Begin file list a.gcode TEST/ TEST/c.gcode b.gcode End file list 這個(gè)目錄內(nèi)容清單,說(shuō)明了這張SD卡上目前有3個(gè)文件,分別是a.gcode,b.gcode以及c.gcode,其中,a.gcode和b.gcode都保存于根目錄下,而c.gcode保存于一個(gè)名稱為TEST的文件夾里面。 M21 加載SD卡 嘗試加載SD卡,也就是執(zhí)行Mount動(dòng)作。沒(méi)有相關(guān)的參數(shù)。 M22 卸載SD卡 卸載SD卡,也就是執(zhí)行Unmount動(dòng)作。沒(méi)有相關(guān)的參數(shù)。 M23 選擇文件 選擇一個(gè)SD卡上的文件。參數(shù)為 filename表示被選擇的文件名(包含目錄名,以/分隔); 文件選擇之后,可以執(zhí)行打印、刪除等動(dòng)作。例如命令 M23 TEST/c.gcode 選定了SD卡TEST文件夾里面的c.gcode文件作為當(dāng)前文件。 同時(shí)輸出格式為: File opened:c.gcode Size:1127565 File selected 表示文件已經(jīng)順利打開(kāi)。 M24 開(kāi)始SD卡打印 打印當(dāng)前選定的SD卡文件。逐行讀入SD卡文件內(nèi)容G-code代碼,并執(zhí)行。沒(méi)有相關(guān)參數(shù)。 M25 暫停SD卡打印 暫停當(dāng)前的SD卡打印。沒(méi)有相關(guān)參數(shù)。 M26 設(shè)置當(dāng)前文件當(dāng)前位置 設(shè)置當(dāng)前文件的當(dāng)前位置。參數(shù)為 Snnn表示當(dāng)前位置的字節(jié)數(shù)。 M27 獲取SD卡打印進(jìn)度 獲取SD卡打印進(jìn)度。沒(méi)有相關(guān)參數(shù)。 M27命令的輸出,格式為: SD printing byte 11518/1127578 這條命令供上位機(jī)獲取當(dāng)前的3D打印進(jìn)度信息,用于顯示在電腦界面上。 M28 寫SD卡文件 寫一個(gè)SD卡文件。參數(shù)為: filename表示待寫入的文件名(包含目錄名,以/分隔); 從執(zhí)行M28命令開(kāi)始,所有3D打印機(jī)接收到的G-code,除了M29命令以外,都會(huì)保存至指定的SD卡文件中,而不會(huì)被實(shí)際執(zhí)行。這條命令可以將一個(gè)G-code文件從上位機(jī)3D打印控制軟件復(fù)制到3D打印機(jī)的SD卡上,以供未來(lái)執(zhí)行。 M29 結(jié)束寫SD卡文件 結(jié)束以M28開(kāi)始的“保存至SD卡文件”狀態(tài),將3D打印機(jī)恢復(fù)到正常狀態(tài)。從此,所有接收到的G-code命令,都會(huì)被直接解釋執(zhí)行。沒(méi)有相關(guān)參數(shù)。 M30 刪除文件 刪除一個(gè)SD卡中的文件。參數(shù)為: filename表示待刪除的文件名(包含目錄名,以/分隔); M32 創(chuàng)建子目錄 在SD卡上創(chuàng)建一個(gè)子目錄。參數(shù)為: filename表示待創(chuàng)建的子目錄(包含目錄名,以/分隔); 以上所有SD卡相關(guān)指令,都由固件配置 #define SDSUPPORT 1 決定是否開(kāi)啟。如果固件不需要支持SD卡,關(guān)閉這項(xiàng)固件配置,可以節(jié)省不少內(nèi)存空間。
第六節(jié),節(jié)能管理M84 設(shè)置步進(jìn)電機(jī)自動(dòng)關(guān)閉時(shí)間 當(dāng)3D打印機(jī)一段時(shí)間沒(méi)有接收到步進(jìn)電機(jī)運(yùn)動(dòng)指令之后,3D打印機(jī)(為了節(jié)能)會(huì)自動(dòng)關(guān)閉步進(jìn)電機(jī)。使用M84指令,可以設(shè)置這個(gè)自動(dòng)關(guān)閉步進(jìn)電機(jī)的時(shí)間。參數(shù)包括: Snnn表示步進(jìn)電機(jī)關(guān)閉的時(shí)間,以秒為單位。 如果使用M84時(shí)沒(méi)有指定S參數(shù),則步進(jìn)電機(jī)會(huì)立即關(guān)閉。 M84命令的缺省值是360秒。在固件配置中,缺省值由 #define STEPPER_INACTIVE_TIME 360L 控制。 M85 設(shè)置3D打印機(jī)自動(dòng)關(guān)閉時(shí)間 當(dāng)3D打印機(jī)一段時(shí)間沒(méi)有接收到指令之后,3D打印機(jī)(為了節(jié)能)會(huì)自動(dòng)關(guān)閉步進(jìn)電機(jī)以及擠出頭、熱床等設(shè)備。使用M85指令,可以設(shè)置這個(gè)自動(dòng)關(guān)閉3D打印機(jī)的時(shí)間。參數(shù)包括: Snnn表示在關(guān)閉步進(jìn)電機(jī)之前步進(jìn)電機(jī)沒(méi)有活動(dòng)的時(shí)間,以秒為單位。 如果使用M85時(shí)沒(méi)有指定S參數(shù),或者使用了S0參數(shù),則代表取消3D打印機(jī)自動(dòng)關(guān)閉功能,擠出頭、熱床等在工作完成之后,一直會(huì)處于當(dāng)前狀態(tài),而不會(huì)被自動(dòng)關(guān)閉。 M85命令的缺省值是0(不自動(dòng)關(guān)閉)。在固件配置中,缺省值由 #define MAX_INACTIVE_TIME 0L 控制。
第七節(jié),溫度管理M104 設(shè)置擠出頭目標(biāo)溫度 設(shè)置擠出頭的目標(biāo)溫度。執(zhí)行這條命令后,不需要等待達(dá)到這個(gè)溫度,立即開(kāi)始執(zhí)行下一條G-code語(yǔ)句。相關(guān)參數(shù)包括: Snnn表示目標(biāo)溫度; Tnnn表示對(duì)應(yīng)的擠出頭; P表示要等待前面的指令完成之后,再開(kāi)始設(shè)置擠出頭溫度; Fnnn表示到達(dá)目標(biāo)溫度之后,是否觸發(fā)蜂鳴器。F1表示要觸發(fā); 如果執(zhí)行命令時(shí)沒(méi)有帶T參數(shù),則針對(duì)當(dāng)前擠出頭設(shè)置目標(biāo)溫度。 M140 設(shè)置熱床目標(biāo)溫度 設(shè)置熱床的目標(biāo)溫度。執(zhí)行這條命令后,不需要等待達(dá)到這個(gè)溫度,立即開(kāi)始執(zhí)行下一條G-code語(yǔ)句。相關(guān)參數(shù)包括: Snnn表示目標(biāo)溫度; Fnnn表示到達(dá)目標(biāo)溫度之后,是否觸發(fā)蜂鳴器。F1表示要觸發(fā); M105 獲取當(dāng)前的溫度 獲取當(dāng)前溫度值,包括擠出頭和熱床的溫度。相關(guān)參數(shù)包括: X表示輸出AD轉(zhuǎn)換輸入的原始值; M105命令的輸出,格式為: T:18.97 /0 B:18.75 /0 B@:0 @:0 可以看到,T:之后的部分,代表擠出頭的當(dāng)前溫度/目標(biāo)溫度;B:之后的部分代表熱床的當(dāng)前溫度/目標(biāo)溫度。 在PID溫度控制模式下,B@:后面的數(shù)字代表熱床當(dāng)前的輸出強(qiáng)度,是一個(gè)0~255的值,@:后面的數(shù)字,代表擠出頭當(dāng)前的輸出強(qiáng)度,也是一個(gè)0~255的值。例子中,擠出頭、熱床都處于關(guān)閉狀態(tài),所以這個(gè)位置的值都是0。 M109 等待擠出頭加熱達(dá)到目標(biāo)溫度 設(shè)置擠出頭的目標(biāo)溫度,并等待達(dá)到這個(gè)溫度。相關(guān)參數(shù)包括: Snnn表示目標(biāo)溫度; Tnnn表示對(duì)應(yīng)的擠出頭; Fnnn表示到達(dá)目標(biāo)溫度之后,是否觸發(fā)蜂鳴器。F1表示要觸發(fā); 如果執(zhí)行命令時(shí)沒(méi)有帶T參數(shù),則針對(duì)當(dāng)前擠出頭設(shè)置目標(biāo)溫度。 M190 等待熱床加熱達(dá)到目標(biāo)溫度 設(shè)置熱床的目標(biāo)溫度,并等待達(dá)到這個(gè)溫度。相關(guān)參數(shù)包括: Snnn表示目標(biāo)溫度; Fnnn表示到達(dá)目標(biāo)溫度之后,是否觸發(fā)蜂鳴器。F1表示要觸發(fā); M116 等待溫度達(dá)到目標(biāo)溫度 等待所有擠出頭/熱床到達(dá)由之前的M104/M140指令所指定的目標(biāo)溫度。沒(méi)有相關(guān)參數(shù)。
第八節(jié),其他常用指令M92 設(shè)置分辨率 設(shè)置3D打印機(jī)內(nèi)存中XYZE步進(jìn)電機(jī)的分辨率。參數(shù)包括: Xnnn表示X軸的分辨率; Ynnn表示Y軸的分辨率; Znnn表示Z軸的分辨率; Ennn表示E軸(擠出機(jī)步進(jìn)電機(jī))的分辨率; M106/M107 打開(kāi)/關(guān)閉風(fēng)扇 這兩條命令用于打開(kāi)(M106)或關(guān)閉(M107)風(fēng)扇。相關(guān)的參數(shù)包括: Snnn表示打開(kāi)風(fēng)扇時(shí)風(fēng)扇的轉(zhuǎn)速,取值范圍在0~255之間; P表示要等待前面的指令完成之后,再開(kāi)始調(diào)整風(fēng)扇轉(zhuǎn)速; 在固件配置中,定義 #define FEATURE_FAN_CONTROL 1 表示支持風(fēng)扇控制功能,在編譯中會(huì)包含相關(guān)的代碼。 M114 輸出當(dāng)前位置 輸出擠出頭當(dāng)前位置。沒(méi)有相關(guān)的參數(shù)。 M114命令的輸出,格式為: X:20.00 Y:30.00 Z:10.000 E:0.0000 M115 輸出3D打印機(jī)信息 輸出3D打印機(jī)信息。沒(méi)有相關(guān)的參數(shù)。 M115命令的輸出,格式為: FIRMWARE_NAME:Repetier_0.92.3 FIRMWARE_URL:… Printed filament:0.00m Printing time:0 days 0 hours 0 min SpeedMultiply:100 FlowMultiply:100 第一行是固件的版本信息,很長(zhǎng),我沒(méi)有列完整。第二行是已經(jīng)打印了多少米耗材,打印時(shí)間是幾天幾小時(shí)幾分鐘。第三行是速度系數(shù),參考M220命令。第四行是流率系數(shù),參考M221命令。 M119 輸出限位開(kāi)關(guān)狀態(tài) 將當(dāng)前限位開(kāi)關(guān)狀態(tài)輸出。沒(méi)有相關(guān)的參數(shù)。 M119命令的輸出,格式為: endstops hit: x_min:L y_min:L z_min:L 列出了XYZ三個(gè)軸的低位限位開(kāi)關(guān)的當(dāng)前狀態(tài)。L代表限位開(kāi)關(guān)沒(méi)有觸發(fā)。H代表限位開(kāi)關(guān)被觸發(fā)了。 M201/M202 設(shè)置最大加速度 這兩條命令設(shè)置打印加速度。包括擠出頭工作時(shí)(打印中)的運(yùn)動(dòng)加速度(M201),以及擠出頭不工作時(shí)(移動(dòng)中)的運(yùn)動(dòng)加速度(M202)。參數(shù)為 Xnnn表示X軸的加速度; Ynnn表示Y軸的加速度; Znnn表示Z軸的加速度; Ennn表示E軸的加速度; 在固件配置中,定義 #define RAMP_ACCELERATION 1 表示支持加速度功能,在編譯中會(huì)包含相關(guān)的代碼。 M203 監(jiān)控溫度 使用串口輸出監(jiān)控3D打印機(jī)的溫度。參數(shù)為 Snnn表示是否監(jiān)控,S0關(guān)閉監(jiān)控,S1打開(kāi)監(jiān)控; 當(dāng)監(jiān)控處于打開(kāi)狀態(tài),可以從串口定時(shí)獲取當(dāng)前的溫度信息。 監(jiān)控輸出格式與M105命令的輸出結(jié)果完全一致。 M204 設(shè)置PID參數(shù) 設(shè)置擠出頭溫度控制的PID參數(shù),命令參數(shù)為 Snnn表示對(duì)應(yīng)的擠出頭,無(wú)S參數(shù)表示使用當(dāng)前擠出頭; Xnnn表示P參數(shù); Ynnn表示I參數(shù); Znnn表示D參數(shù); M207 修改抖動(dòng)(Jerk)值 修改當(dāng)前的最大抖動(dòng)值。命令參數(shù)為 Xnnn表示XY軸的最大抖動(dòng)值; Znnn表示Z軸的最大抖動(dòng)值; Ennn表示E軸的最大抖動(dòng)值; XY軸抖動(dòng)指的是3D打印機(jī)同時(shí)在X軸和Y軸上移動(dòng)時(shí),產(chǎn)生的和速度最大值。比如,3D打印機(jī)加熱頭正在向X軸正方向全速移動(dòng),下一條指令變?yōu)橄験軸正方向移動(dòng)。如果同時(shí)在X軸和Y軸上改變速度,那么實(shí)際產(chǎn)生的速度是X方向的速度和Y方向的速度的向量和,這個(gè)比較大的速度變化值,會(huì)對(duì)3D打印機(jī)的機(jī)械部件產(chǎn)生不利的影響,而且會(huì)造成比較大的噪音。這里的設(shè)置,就限制了這個(gè)XY軸上和速度的最大值。當(dāng)然這個(gè)值也不能設(shè)置的太小,太小的話,首先打印速度會(huì)變得很慢,而且打印會(huì)產(chǎn)生更多的瑕疵。 Z軸抖動(dòng)與XY軸抖動(dòng)意義類似,不同點(diǎn)是Z-Jerk是Z軸方向不為0的抖動(dòng)速度值。因?yàn)檫@項(xiàng)涉及到Z軸的運(yùn)動(dòng),因此最大速度就低多了。 M207命令的輸出,格式為: Jerk:20.00 ZJerk:0.30 這個(gè)輸出意義很簡(jiǎn)單,表示XY軸抖動(dòng)速度為20mm/s,Z軸抖動(dòng)速度為0.3mm/s。 M220 設(shè)置速度 設(shè)置3D打印機(jī)運(yùn)行速度系數(shù)。命令參數(shù)為 Snnn表示系數(shù),是一個(gè)百分?jǐn)?shù),如果S參數(shù)不存在,則使用缺省值100; 3D打印機(jī)運(yùn)行速度系數(shù),是一個(gè)在25%到500%范圍內(nèi)變化的值。這個(gè)系數(shù)值在3D打印機(jī)運(yùn)行過(guò)程中,與切片器給出的3D打印機(jī)運(yùn)動(dòng)速度基礎(chǔ)值相乘,得到最終的3D打印機(jī)實(shí)際運(yùn)動(dòng)速度值。 M220命令的輸出,格式為: SpeedMultiply:100 M221 設(shè)置流率 設(shè)置3D打印機(jī)的流率系數(shù)(Flow rate)。命令參數(shù)為 Snnn表示系數(shù),是一個(gè)百分?jǐn)?shù),如果S參數(shù)不存在,則使用缺省值100; 3D打印機(jī)流率系數(shù),是在上位機(jī)切片軟件通過(guò)耗材直徑、噴頭直徑、層高以及3D打印速度等因素綜合計(jì)算得到的E軸運(yùn)動(dòng)速度的基礎(chǔ)上,疊加的一個(gè)E軸運(yùn)動(dòng)速度系數(shù)。簡(jiǎn)單地說(shuō),就是控制擠出頭耗材擠出量的多少。這個(gè)系數(shù)可以在25%到500%范圍內(nèi)變化。 M221命令的輸出,格式為: FlowMultiply:100 M302 設(shè)置是否允許冷擠出 為了保護(hù)3D打印機(jī)的擠出頭,通常設(shè)置下,E軸的運(yùn)動(dòng)必須在擠出頭加熱到一定溫度之后才被允許。在擠出頭冷卻的情況下,所有的E軸運(yùn)動(dòng)命令是被3D打印機(jī)固件忽略的。但有些情況下我們需要在擠出頭冷卻的情況下運(yùn)動(dòng)E軸,這時(shí)可以通過(guò)M302命令進(jìn)行設(shè)置。命令參數(shù)為 Snnn表示是否允許冷擠出,S0表示不允許,S1表示允許,沒(méi)有S參數(shù)缺省表示允許; M302命令的輸出,為當(dāng)前是否允許冷擠出。允許時(shí)會(huì)輸出: Cold extrusion allowed 不允許時(shí)會(huì)輸出: Code extrusion disallowed
第九節(jié),較不常用指令這些指令實(shí)在無(wú)法歸類了,只能以“較不常用指令”為名字,放在了一起。 M42直接讀寫端口 此命令直接讀/寫一個(gè)Arduino端口,為3D打印控制軟件上位機(jī)擴(kuò)展程序功能提供基礎(chǔ)。參數(shù)包括: Pnnn表示Arduino的輸入/輸出端口;輸出時(shí)固件程序會(huì)同時(shí)輸出到數(shù)字端口和模擬端口;輸入時(shí)固件程序會(huì)從數(shù)字端口輸入; Snnn表示寫入輸出端口的值,0到255之間是合法的數(shù)字;當(dāng)S參數(shù)不存在的時(shí)候,M42指令起輸入作用; Repetier-firmware固件中預(yù)先定義了一個(gè)表格,稱為“敏感端口表格”,所有位于這個(gè)表格內(nèi)的端口,也就是當(dāng)前已經(jīng)被步進(jìn)電機(jī)、限位開(kāi)關(guān)以及熱敏電阻占用的端口,都不能被M42命令影響。其他當(dāng)前未占用的端口,可以由這條命令進(jìn)行IO操作。 M82/M83 設(shè)置擠出頭步進(jìn)電機(jī)坐標(biāo)模式 與G90/G91命令類似,這兩條命令用于設(shè)置擠出頭當(dāng)前坐標(biāo)模式為絕對(duì)坐標(biāo)模式(M82)或者相對(duì)坐標(biāo)模式(M83)。沒(méi)有參數(shù)。 未設(shè)置時(shí)缺省值是絕對(duì)坐標(biāo)模式。 需要注意的是,G90/G91設(shè)置的坐標(biāo)模式,同時(shí)對(duì)XYZE四個(gè)軸起作用,但M82/M83設(shè)置的坐標(biāo)模式,只對(duì)E軸(擠出頭步進(jìn)電機(jī))起作用。 M99 暫時(shí)關(guān)閉步進(jìn)電機(jī) M99命令可以暫時(shí)關(guān)閉XYZ軸步進(jìn)電機(jī)一段時(shí)間。命令參數(shù)包括: Snnn表示所需暫時(shí)關(guān)閉步進(jìn)電機(jī)的時(shí)間,以秒為單位; X表示暫時(shí)關(guān)閉X軸步進(jìn)電機(jī); Y表示暫時(shí)關(guān)閉Y軸步進(jìn)電機(jī); Z表示暫時(shí)關(guān)閉Z軸步進(jìn)電機(jī); 如果S參數(shù)沒(méi)有指定,則暫時(shí)關(guān)閉10秒鐘時(shí)間。暫時(shí)關(guān)閉時(shí)間到達(dá)之后,重新打開(kāi)相應(yīng)軸的步進(jìn)電機(jī)。 M111 允許/禁止運(yùn)行時(shí)調(diào)試標(biāo)志 運(yùn)行時(shí)調(diào)試標(biāo)志是一組布爾值,一共有6個(gè)不同的標(biāo)志,使用位域(Bit Field)的表示方式。用戶可以利用M111指令修改這些標(biāo)志的值。相關(guān)參數(shù)包括: Snnn表示直接將調(diào)試標(biāo)志設(shè)置為S值; Pnnn表示以位操作的方式,將P值與當(dāng)前調(diào)試標(biāo)志做某種操作。如果P值是正數(shù),則進(jìn)行按位或操作(增加P參數(shù)所帶的標(biāo)志位);如果P值是負(fù)數(shù),則忽略P的符號(hào),進(jìn)行取反后按位與操作(去除P參數(shù)所帶的標(biāo)志位); 調(diào)試標(biāo)志的位域,由以下6個(gè)布爾值組成: 第1位,值為1,表示是否回顯(Echo)由上位機(jī)發(fā)送至下位機(jī)的命令; 第2位,值為2,表示是否輸出信息(Info),實(shí)際在固件代碼中并未使用; 第3位,值為4,表示是否輸出錯(cuò)誤(Error),在固件出錯(cuò)時(shí)會(huì)將出錯(cuò)信息發(fā)送回上位機(jī); 第4位,值為8,表示是否進(jìn)入模擬執(zhí)行模式(Dry run),在模擬執(zhí)行模式下,3D打印機(jī)不實(shí)際執(zhí)行上位機(jī)發(fā)送的命令,只修改3D打印機(jī)的內(nèi)存狀態(tài); 第5位,值為16,表示是否進(jìn)入調(diào)試通訊模式(Communication),實(shí)際在固件代碼中似乎并未使用; 第6位,值為32,表示是否進(jìn)入禁止移動(dòng)模式(No Move),在這個(gè)模式下,所有對(duì)步進(jìn)電機(jī)的移動(dòng)命令,都會(huì)被忽略; M117 發(fā)送消息至LCD屏幕 將一條詳細(xì)發(fā)送至LCD屏幕,顯示為當(dāng)前狀態(tài)信息。參數(shù)為 message表示待顯示在LCD屏幕上的文本; M120 測(cè)試蜂鳴器 使蜂鳴器發(fā)出蜂鳴聲。參數(shù)為 Snnn表示發(fā)出聲音/不發(fā)出聲音的時(shí)間,以毫秒為單位; Pnnn表示重復(fù)的次數(shù); 如果3D打印機(jī)有蜂鳴器,而且是無(wú)源蜂鳴器,那么通過(guò)S參數(shù)和P參數(shù)的組合,可以得到不同頻率的聲音。比如 M120 S24 P8 可以得到一個(gè)較長(zhǎng)的蜂鳴聲。如果3D打印機(jī)的蜂鳴器是有源蜂鳴器,那么M120指令只能控制蜂鳴時(shí)間,不能控制蜂鳴器的聲音頻率。 M200 設(shè)置體積擠出模式 將3D打印機(jī)設(shè)置為“體積擠出模式”,同時(shí)設(shè)定擠出頭直徑參數(shù)。相關(guān)參數(shù)包括 Tnnn表示對(duì)應(yīng)的擠出頭,無(wú)T參數(shù)表示使用當(dāng)前擠出頭; Dnnn表示擠出頭的實(shí)際直徑,無(wú)D參數(shù)表示關(guān)閉體積擠出模式; 體積擠出模式,是相對(duì)于缺省的“長(zhǎng)度擠出模式”而言的另一種擠出模式。在常見(jiàn)的“長(zhǎng)度擠出模式”下,G-code中的使E軸運(yùn)動(dòng)的G0/G1命令,其參數(shù)都是以長(zhǎng)度單位mm作為單位的。這樣確實(shí)比較簡(jiǎn)單,但問(wèn)題是我們?cè)谇衅臅r(shí)候,就必須知道要使用的噴頭直徑,否則無(wú)法計(jì)算出耗材前進(jìn)的實(shí)際長(zhǎng)度。 為了使G-code在生成之后適用于多種不同噴頭直徑的3D打印機(jī)機(jī)型,我們可以在上位機(jī)切片時(shí),將E軸參數(shù)變?yōu)橐泽w積單位mm3作為單位,然后在下位機(jī)固件中,再設(shè)定正在使用的噴頭直徑,以達(dá)到最終正確輸出的目的。為了以體積單位mm3作為E軸的參數(shù)單位,上位機(jī)需要將噴頭直徑設(shè)定為1.128mm(這樣,耗材每前進(jìn)1mm,會(huì)噴出1mm*π*(1.128mm/2)2約等于1mm3的耗材。)同時(shí),下位機(jī)要使用下面的語(yǔ)句: M200 T0 D0.4 將實(shí)際的擠出頭噴頭直徑設(shè)置為0.4mm。同時(shí)在上位機(jī)和下位機(jī)進(jìn)行這樣的操作之后,3D打印機(jī)可以在E軸參數(shù)單位為mm3的情況下,正確完成打印操作。 M209 開(kāi)啟/關(guān)閉自動(dòng)回抽 開(kāi)啟/關(guān)閉自動(dòng)回抽功能。命令參數(shù)為 Snnn表示是否開(kāi)啟自動(dòng)回抽功能,1表示開(kāi)啟,0表示關(guān)閉; 通常上位機(jī)切片器負(fù)責(zé)在合適的位置處加入回抽指令。如果你的切片器功能比較弱,不能加入合適的回抽指令,那么可以打開(kāi)這個(gè)特性,由固件自動(dòng)回抽。 在固件配置中,定義 #define FEATURE_RETRACTION 1 表示支持自動(dòng)回抽功能,在編譯中會(huì)包含相關(guān)的代碼。 M280 多頭重復(fù)打印模式設(shè)置 有些特殊配置的3D打印機(jī),允許2~4個(gè)擠出頭同時(shí)工作,并且這些擠出頭動(dòng)作完全一致,同時(shí)打印出多件完全一樣的打印件,這種工作模式叫做多頭重復(fù)打印模式(Ditto mode)。M280命令對(duì)這個(gè)模式進(jìn)行設(shè)置。命令參數(shù)為 Snnn表示這個(gè)模式下的擠出頭個(gè)數(shù);S0表示關(guān)閉多頭重復(fù)打印模式;S1~S3表示工作在多頭重復(fù)打印模式下,并且3D打印機(jī)擁有額外的1~3個(gè)擠出頭。 在固件配置中,定義 #define FEATURE_DITTO_PRINTING 1 表示支持多頭重復(fù)打印模式功能,在編譯中會(huì)包含相關(guān)的代碼。 M281 測(cè)試硬件看門狗功能 這條命令用于測(cè)試CPU硬件中的看門狗功能。實(shí)際上,就是造成一個(gè)死循環(huán),不再執(zhí)行“喂狗”動(dòng)作,從而觸發(fā)CPU硬件看門狗,最終(故意地)造成3D打印機(jī)重啟。這條命令只是用于3D打印機(jī)固件開(kāi)發(fā)測(cè)試。 M303 自動(dòng)測(cè)試PID參數(shù) 自動(dòng)測(cè)試PID參數(shù)值。命令參數(shù)為 Pnnn表示待測(cè)試的擠出頭編號(hào),從0開(kāi)始,P<擠出頭個(gè)數(shù)>代表待測(cè)試的是熱床; Snnn表示打印溫度; Rnnn代表重復(fù)測(cè)試次數(shù); X代表是否保存于EEPROM中; 由于加熱、散熱需要較多時(shí)間,這條命令執(zhí)行時(shí)間很長(zhǎng)。 M330 測(cè)試蜂鳴器 測(cè)試(無(wú)源)蜂鳴器,產(chǎn)生一個(gè)特定頻率的聲音。命令參數(shù)為 Snnn表示聲音的頻率; Pnnn表示聲音持續(xù)的時(shí)間,以毫秒為單位; 如果命令沒(méi)有包含S參數(shù)或者P參數(shù),則會(huì)使用缺省值S1以及P1000。
第十節(jié),保存與恢復(fù)當(dāng)前位置M400 等待當(dāng)前所有移動(dòng)指令完成 等待在3D打印機(jī)內(nèi)存中待處理的移動(dòng)命令執(zhí)行完成。沒(méi)有相關(guān)的參數(shù)。 執(zhí)行這條語(yǔ)句之后,可以保證在下一條G-code命令執(zhí)行時(shí),所有步進(jìn)電機(jī)都不處于運(yùn)動(dòng)狀態(tài)中。 M401 保存當(dāng)前的位置 將當(dāng)前位置,包括XYZE步進(jìn)電機(jī),保存于內(nèi)存的一組專用變量中。未來(lái)可以用M402命令恢復(fù)這組位置。沒(méi)有相關(guān)的參數(shù)。 M402 恢復(fù)之前保存的位置 恢復(fù)之前由M401命令保存的位置值。命令參數(shù)為 X表示恢復(fù)X位置; Y表示恢復(fù)Y位置; Z表示恢復(fù)Z位置; E表示恢復(fù)E位置; Fnnn表示使用參數(shù)給定的速度,無(wú)F參數(shù)時(shí)使用當(dāng)前速度值;
第十一節(jié),暫停與更換耗材M600 更換耗材 在擁有顯示屏的3D打印機(jī)上,啟動(dòng)更換耗材向?qū)Ы缑妗](méi)有相關(guān)的參數(shù)。 通常,這個(gè)向?qū)Ы缑媸菑娘@示屏界面上觸發(fā)的。M600命令提供一個(gè)接口,使更換耗材向?qū)Ы缑婵梢詮纳衔粰C(jī)軟件觸發(fā)。 M601 暫停/恢復(fù)擠出頭 暫?;蛘呋謴?fù)擠出頭。命令參數(shù)為 Snnn表示暫?;蛘呋謴?fù),S1表示暫停擠出頭,S0表示恢復(fù)擠出頭工作; 暫停擠出頭包括停止擠出頭加溫以及停止擠出頭步進(jìn)電機(jī)工作?;謴?fù)則相反,加熱擠出頭到原來(lái)的溫度。
第十二節(jié),設(shè)置與EEPROM管理固件的設(shè)置,是一個(gè)比較有趣的話題,很多玩3D打印機(jī)的朋友,在遇到設(shè)置相關(guān)的問(wèn)題時(shí)都會(huì)犯迷糊。實(shí)際上,對(duì)于某一項(xiàng)特定的設(shè)置,比如說(shuō)X軸的步進(jìn)電機(jī)分辨率,在3D打印機(jī)主板上,有三個(gè)不同的位置(也是三種不同的存儲(chǔ)器)保存了這項(xiàng)內(nèi)容,而它們的值還有可能不同。讓我們先來(lái)了解一下這些保存設(shè)置內(nèi)容的位置,以方便大家的理解。 首先,是固件配置文件(configuration.h)中的設(shè)置值。配置文件中的值,會(huì)跟隨固件一起編譯,之后在刷機(jī)過(guò)程中,保存在了3D打印機(jī)的靜態(tài)存儲(chǔ)區(qū)(Flash ROM)中。除了刷機(jī)之外,靜態(tài)存儲(chǔ)區(qū)的內(nèi)容不會(huì)發(fā)生變動(dòng),可以認(rèn)為是只讀的。每次開(kāi)機(jī)的時(shí)候,都是一樣的值在等待著我們。 第二份設(shè)置值,保存在電可擦寫靜態(tài)存儲(chǔ)區(qū)(EEPROM)。EEPROM的讀寫代價(jià),比靜態(tài)存儲(chǔ)區(qū)要小。因此,3D打印機(jī)允許在刷機(jī)之后,修改設(shè)置值,而這些修改之后的設(shè)置值,就存儲(chǔ)在EEPROM之中。每次開(kāi)機(jī),程序會(huì)先檢查EEPROM,如果EEPROM中是空白的,則將靜態(tài)存儲(chǔ)區(qū)的第一份設(shè)置值復(fù)制到EEPROM之中。而如果EEPROM中已經(jīng)有保存好的設(shè)置值,則程序會(huì)直接使用EEPROM中的值。有些朋友在玩3D打印機(jī)過(guò)程中可能會(huì)有這樣的經(jīng)驗(yàn),就是明明修改了固件配置文件中的設(shè)置值,但刷機(jī)之后竟然沒(méi)有發(fā)生變化。這種情況,往往就是EEPROM在搗鬼了。我們完全可以使用G-code M502 M500兩條指令(指令的具體含義可以參考下面),重寫EEPROM,解決這樣的問(wèn)題。 第三份設(shè)置,保存在內(nèi)存(RAM)中。實(shí)際用戶使用的值,就是內(nèi)存中的值。由于內(nèi)存只在加電情況下能夠保持其中的內(nèi)容,因此每次開(kāi)機(jī)時(shí),3D打印機(jī)會(huì)根據(jù)上面描述的邏輯,重建內(nèi)存中的設(shè)置值。如果某條指令修改的是內(nèi)存中的設(shè)置值,那么這也代表著這次修改是一個(gè)臨時(shí)修改,下次開(kāi)機(jī)這個(gè)值就會(huì)消失了。 總的來(lái)說(shuō),三份固件設(shè)置,使用的優(yōu)先級(jí)是 內(nèi)存 > EEPROM > 配置文件 但設(shè)置的持久性,就要反過(guò)來(lái)了。明確了解了這些,特別有助于我們解決一些與設(shè)置相關(guān)的問(wèn)題,自然,看下面這些命令描述的時(shí)候,也就不會(huì)迷糊了。 M205 輸出EEPROM設(shè)置 輸出EEPROM的當(dāng)前設(shè)置值表格。沒(méi)有相關(guān)的參數(shù)。 M205命令的輸出,格式為: EPR:2 75 115200 Baudrate EPR:3 129 0.000 Filament printed [m] EPR:2 125 0 Printer active … 這是一個(gè)很長(zhǎng)的輸出,我們這里只截取了前三行。每行中,EPR:后面的第一個(gè)數(shù)字,是這個(gè)設(shè)置項(xiàng)值的類型。0代表8bit整數(shù)類型,1代表16bit整數(shù)類型,2代表32bit整數(shù)類型,3代表32bit浮點(diǎn)類型。第二個(gè)數(shù)字,是設(shè)置項(xiàng)值的位置(即EEPROM中的地址)。第三個(gè)數(shù)字,是設(shè)置項(xiàng)的值。最后,是設(shè)置項(xiàng)的意義。 以第一行為例,第一行設(shè)置的是通訊波特率(Baudrate),當(dāng)前值是115200。波特率設(shè)置項(xiàng),在EEPROM中的位置(地址)是75,這個(gè)值是一個(gè)32bit整數(shù)類型,因此占據(jù)了從位置75開(kāi)始的連續(xù)4個(gè)字節(jié)(也就是位置75, 76, 77, 78)。 M206 修改EEPROM設(shè)置 修改EEPROM中的某個(gè)值。命令參數(shù)為 Pnnn表示待修改的值的位置(即EEPROM中的地址); Tnnn表示值的類型,0代表8bit整數(shù)類型,1代表16bit整數(shù)類型,2代表32bit整數(shù)類型,3代表32bit浮點(diǎn)類型; Snnn表示值,只能帶整數(shù),用于T為0, 1, 2的情況; Xnnn表示值,只能帶浮點(diǎn)數(shù),用于T為3的情況; 可以看出,M206指令的使用是很復(fù)雜的,需要了解EEPROM中數(shù)值的存儲(chǔ)位置以及數(shù)值類型,才能進(jìn)行有效的修改。因此打印虎建議除非你完全理解M206指令的含義,否則不要使用這個(gè)指令。 M360 輸出固件配置信息 輸出固件配置信息。沒(méi)有相關(guān)參數(shù)。 M360命令的輸出,格式為: Config:Baudrate:115200 Config:InputBuffer:127 Config:NumExtruder:1 … 這是一個(gè)很長(zhǎng)的輸出,我們這里只截取了前三行。每行中,都有一項(xiàng)配置信息的名稱,以及對(duì)應(yīng)的值。 M500 保存內(nèi)存中的設(shè)置值到EEPROM 將3D打印機(jī)內(nèi)存中的設(shè)置值保存到EEPROM中。沒(méi)有相關(guān)的參數(shù)。 M501 讀取EEPROM的設(shè)置值到內(nèi)存 將EEPROM中的設(shè)置值讀取到3D打印機(jī)內(nèi)存中。沒(méi)有相關(guān)的參數(shù)。 M502 將內(nèi)存中的設(shè)置值重置 將內(nèi)存中的設(shè)置值重置為固件配置(configuration.h)中的值。沒(méi)有相關(guān)的參數(shù)。 由于每次系統(tǒng)掉電后,內(nèi)存中的值都會(huì)消失,重新啟動(dòng)時(shí)從EEPROM中讀取,因此單獨(dú)使用M502命令將只對(duì)3D打印機(jī)掉電重啟之前起作用。如果想起長(zhǎng)期作用,需要配合M500,將設(shè)置值保存到EEPROM中。
第十三節(jié),步進(jìn)電機(jī)參考電壓調(diào)節(jié)目前市面上支持軟件設(shè)置步進(jìn)電機(jī)參考電壓的3D打印機(jī)主板很少。大部分3D打印機(jī)主板只能通過(guò)調(diào)整微調(diào)電位器來(lái)控制步進(jìn)電機(jī)參考電壓。在這些3D打印機(jī)上,這一組命令是無(wú)效的。 M907 設(shè)置步進(jìn)電機(jī)參考電壓(百分比值) 設(shè)置步進(jìn)電機(jī)參考電壓。命令參數(shù)為 Snnn表示對(duì)所有步進(jìn)電機(jī)進(jìn)行統(tǒng)一設(shè)置; Xnnn表示對(duì)X軸步進(jìn)電機(jī)進(jìn)行設(shè)置; Ynnn表示對(duì)Y軸步進(jìn)電機(jī)進(jìn)行設(shè)置; Znnn表示對(duì)Z軸步進(jìn)電機(jī)進(jìn)行設(shè)置; Ennn表示對(duì)E軸步進(jìn)電機(jī)進(jìn)行設(shè)置; 所有的參數(shù)值,都是一個(gè)0~100之間的百分比數(shù)值。 M908 設(shè)置步進(jìn)電機(jī)參考電壓 與M907命令類似,設(shè)置步進(jìn)電機(jī)參考電壓。命令參數(shù)為 Pnnn表示步進(jìn)電機(jī)編號(hào); Snnn表示步進(jìn)電機(jī)參考電壓設(shè)置值,要求為0~255之間的一個(gè)數(shù)值; 這個(gè)命令與M907命令類似,同樣要求3D打印機(jī)主板支持。在不支持軟件調(diào)整參考電壓的3D打印機(jī)主板上,M908命令無(wú)效。 M909 輸出步進(jìn)電機(jī)參考電壓值 輸出當(dāng)前的步進(jìn)電機(jī)參考電壓值。沒(méi)有相關(guān)的參數(shù)。 M910 將步進(jìn)電機(jī)參考電壓值保存至EEPROM 將M907/M908命令設(shè)置的步進(jìn)電機(jī)參考電壓值保存至EEPROM。沒(méi)有相關(guān)的參數(shù)。
第十四節(jié),需要輔助硬件支持的指令M80/M81 打開(kāi)/關(guān)閉ATX電源 在配置了ATX電源的3D打印機(jī)上,打開(kāi)(M80)或者關(guān)閉(M81)ATX電源。沒(méi)有相關(guān)的參數(shù)。 M340 伺服電機(jī)控制 伺服電機(jī)控制功能。命令參數(shù)為 Pnnn表示伺服電機(jī)編號(hào),從0開(kāi)始,最大為3,可以控制4個(gè)伺服電機(jī); Snnn為控制時(shí)間,單位為毫秒,應(yīng)該是一個(gè)500到2500之間的數(shù)值; Rnnn為自動(dòng)關(guān)閉時(shí)間,單位為毫秒; M350 設(shè)置步進(jìn)電機(jī)細(xì)分?jǐn)?shù) 在支持細(xì)分?jǐn)?shù)設(shè)置的3D打印機(jī)主板上(這類主板很少見(jiàn)),設(shè)置步進(jìn)電機(jī)細(xì)分?jǐn)?shù)。命令參數(shù)為 Snnn表示將細(xì)分?jǐn)?shù)的每一位(bit)都設(shè)置為相同的值,S0表示所有都設(shè)置為0,S1表示所有都設(shè)置為1; Xnnn表示設(shè)置細(xì)分?jǐn)?shù)第0位; Ynnn表示設(shè)置細(xì)分?jǐn)?shù)第1位; Znnn表示設(shè)置細(xì)分?jǐn)?shù)第2位; Ennn表示設(shè)置細(xì)分?jǐn)?shù)第3位; Pnnn表示設(shè)置細(xì)分?jǐn)?shù)第4位; 需要注意的是,在大多數(shù)3D打印機(jī)主板上,細(xì)分?jǐn)?shù)設(shè)置是主板硬件設(shè)計(jì)時(shí)就固定的,不能通過(guò)軟件調(diào)整。這種情況下,M350命令無(wú)效。 M355 設(shè)置照明燈開(kāi)關(guān) 設(shè)置照明燈的開(kāi)關(guān)。命令參數(shù)為 Snnn表示照明燈的開(kāi)關(guān)狀態(tài),S0表示關(guān)閉照明燈,S1表示打開(kāi)照明燈; 無(wú)參數(shù)時(shí)輸出當(dāng)前照明燈的狀態(tài)。 在固件配置中,定義 #define CASE_LIGHTS_PIN -1 表示照明燈的電路硬件連接pin值,-1代表照明燈未連接。 M355命令的輸出,為當(dāng)前是否打開(kāi)了照明燈。打開(kāi)時(shí)會(huì)輸出: Case lights on 關(guān)閉時(shí)會(huì)輸出: Case lights off
通過(guò)上面的章節(jié),給大家詳細(xì)講解了Repetier-firmware支持的所有G-code命令。相信大家對(duì)這些命令有了初步了解之后,就想自己試驗(yàn)一下,看看單步執(zhí)行這些G-code命令是怎樣的效果。到此為止,我們的3D打印機(jī)G-code命令相關(guān)的內(nèi)容就都介紹完了。希望讀到這篇文章的朋友,獲得所需的知識(shí),并且對(duì)3D打印機(jī)有一個(gè)更深層次的認(rèn)識(shí)。 文章轉(zhuǎn)載自:打印虎
|
你可能喜歡
開(kāi)源3D建模軟件FreeCAD 1.0正式發(fā)布,支持W
人工智能與3D打印技術(shù)結(jié)合,實(shí)現(xiàn)小型核反應(yīng)
最新《Nature》:動(dòng)態(tài)界面3D打印
石墨烯增強(qiáng)混凝土能否推動(dòng)可持續(xù)建筑? UVA
推薦課程
神奇的3D打印
SLA3D打印工藝全套培訓(xùn)課程 - 軟件篇
3D打印月球燈視頻教程 包括完整貼圖建模流
【原創(chuàng)發(fā)布】Cura軟件修改二次開(kāi)發(fā)定制視頻