https://www.jianshu.com/p/f8a328457a45算法
研究過3D打印機的朋友,都會用到G-code文件。要使用3D打印機打印東西要通過幾個步驟: 一、建立3D模型 二、切片軟件處理,生成3D打印機能識別的命令(保存在G-code文件中) 三、發送打印命令給3D打印機學習
Gcode文件中的每一行都是3D打印機固件所能理解的命令。而這些命令,也被稱爲G-code命令,是3D打印機和電腦之間最重要的命令交互界面。測試
既然全部3D打印機都使用G-code做爲對外聯繫的惟一信息交互方式,那麼這種「語言」的標準就很重要了。不幸的是,雖然全部的3D打印機,都使用G-code做爲與計算機的交互語言,但實際上每種3D打印機使用的G-code,都多多少少有些不一樣。這也能夠說,每種3D打印機都有本身的「方言」。咱們要研究G-code,就要從一種最多見的「方言」,也能夠說是「普通話」開始,先了解一種,而後再學習其餘相似的語言,相互對比,就很容易了。ui
既然G-code是計算機指揮3D打印機幹活用的一套語言,那麼其中最重要的就是運動類的指令。設計
雖然從名字上看,G0叫作「快速直線移動」,而G1叫作「直線移動」,但實際上在Repetier-firmware裏面,G0和G1指令是徹底等價的,沒有任何區別。移動是否快速,徹底是靠參數F來決定的(下面會詳細介紹)。這條指令的做用也很簡單,就是將擠出頭線性移動到一個特定的位置。這條指令帶有很多參數,完整的形式是這樣的:調試
G0 Xnnn Ynnn Znnn Ennn Fnnn Snnncode
或者orm
G1 Xnnn Ynnn Znnn Ennn Fnnn Snnn教程
使用時,不須要全部的參數所有存在,但至少要有一個參數。其中,接口
Xnnn表示X軸的移動位置;
Ynnn表示Y軸的移動位置;
Znnn表示Z軸的移動位置;
Ennn表示E軸(擠出頭步進電機)的移動位置;
Fnnn表示速度,單位是毫米/每分鐘;
Snnn表示是否檢查限位開關,S0不檢查,S1檢查,缺省值是S0;
舉例來講,
G1F1500G1X50Y25.3E22.4
這樣兩行G-code,表示了首先將速度設置爲1500mm/min,也就是25mm/s,而後將擠出頭移動至x=50mm, y=25.3mm的位置上,z軸高度不變,而且將擠出頭步進電機移動至22.4mm的位置上。這裏,速度、xyz位置都比較好理解,但擠出頭步進電機的位置怎麼理解呢?移動至22.4mm處,表明着擠出了多少耗材呢?實際上,這裏擠出頭的具體動做,要根據以前擠出頭步進電機所在的狀態(也就是位置)而定。好比在這兩條語句以前,擠出頭步進電機已經處於20mm的位置處,那麼這裏擠出頭步進電機只要再前進2.4mm就能夠了。
仔細想一想,其實擠出頭步進電機的工做方式,與xyz軸徹底同樣。xyz軸之因此比較好理解,是由於咱們清楚的知道原點(0, 0, 0)的位置在哪裏。而對於e軸來講原點的位置也會在打印開始處被初始化到0的位置。知道了原點的位置,就能夠正確理解擠出頭步進電機的工做方式了。實際上,擠出頭步進電機仍然是以原點爲基礎,只不過是在整個打印過程當中持續增長的。(思考:切片器的擠出頭回抽動做,對應了什麼樣的G-code代碼?)
再舉一例,
G1F1500G1X50Y25.3E22.4F3000
這個例子與上面的例子很是相似,惟一的區別,就是F參數了。而這兩條語句的意義,除了對XYZE的移動以外,還會將打印速度,從語句執行開始時的1500mm/min,提升到語句執行結束時的3000mm/min。這裏有兩點須要注意。
第一點,F參數與XYZE參數同樣,在語句執行的過程當中線性插值;
第二點,在預先知道第一點的前提下,F參數使得計算機對3D打印機的控制更加深刻和精準了。計算得當的狀況下,切片器能夠精確控制3D打印機的加速和減速過程,使得整個3D打印過程更加順滑。
這兩條命令中,G2是順時針圓弧移動,G3是逆時針圓弧移動。命令的完整形式是:
G2 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn
或者
G3 Xnnn Ynnn Innn Jnnn Rnnn Ennn Fnnn
其中,
Xnnn表示移動目標點的X座標;
Ynnn表示移動目標點的Y座標;
Innn表示圓心位置,值是圓心距離當前位置的X份量;
Jnnn表示圓心位置,值是圓心距離當前位置的Y份量;
Rnnn表示圓形的半徑長度;
Ennn表示E軸(擠出頭步進電機)的移動位置;
Fnnn表示速度,單位是毫米/每分鐘;
根據勾股定理,R2 = I2 + J2。所以,若是提供了圓心位置參數,就不須要提供半徑參數了。反之,若是提供了半徑參數,也能夠根據當前點和目標點計算出圓心位置,就不須要提供I/J參數了。其餘幾個的參數用法,與G0/G1是徹底同樣的。
G2/G3命令面臨的最尷尬的問題,是經常使用的上位機切片器軟件,包括Slic3r以及Cura engine,並不會生成這兩條指令。全部3D模型中的圓弧,在STL文件中已經被轉化爲使用大量小線段擬合而成的曲線。這樣,切片器天然也不會把這些小線段當作圓弧處理。最終的G-code輸出結果,也只會存在G0/G1指令,而不會存在G2/G3指令。固然,據小編所知,若是你使用的是比較小衆的上位機軟件,好比artCAM等,由於這些軟件的輸入並非STL文件,所以它們的輸出G-code是頗有可能出現G2/G3命令的。
若是肯定了你的3D打印機只會接收到G0/G1直線移動命令,那麼咱們徹底能夠在3D打印機固件配置中,定義
#defineARC_SUPPORT 0
這樣,全部與G2/G3指令相關的代碼,就都不會編譯,也不會包含在最終的固件代碼中了。能夠節省一些固件的空間,同時並不會影響任何3D打印機的功能。
還有一個問題留給你們思考:在上位機切片軟件輸出G2/G3命令的狀況下,相比於上位機切片軟件輸出G0/G1命令的狀況,是否3D打印機打印圓形物體時會更圓呢?(答案是不會。)那麼其中的原理是什麼?
這條命令讓擠出機在當前位置中止一段時間。可能的參數包括:
Pnnn表示中止移動的時間,以毫秒爲單位,1000毫秒等於1秒。
Snnn也表示中止移動的時間,以秒爲單位。
所以,G4 P2000命令與G4 S2命令是徹底等價的。
這兩條命令使擠出頭執行一個回抽(G10)或者相反的動做(G11)。所謂回抽,就是讓E軸步進電機反轉一小段。而反回抽則讓E軸步進電機正轉一小段。參數只有一個:
Snnn表示回抽的距離。
S1表示長回抽,S0表示短回抽。
實際上,目前的切片器並不太依賴於G10/G11指令執行回抽動做,而是利用G1 Ennn命令直接命令擠出頭步進電機前進或倒退到某一個位置。所以,與G2/G3命令相似,G10/G11命令基本上是個擺設,除非將來有專門的切片器能夠生成這兩條指令,不然徹底能夠將這兩條指令關閉,節省內存空間。在固件配置中,定義
#defineFEATURE_RETRACTION 0
能夠關閉G10/G11功能,在編譯期去除這段相關的代碼。
G20/G21 設置距離單位
這兩條命令很是簡單,用於設置當前距離單位爲英寸(G20)或者毫米(G21)。沒有參數。
未設置時缺省值是毫米。
這條命令使3D打印機XYZ軸以及擠出頭E軸歸零。參數包括:
X表示使X軸歸零
Y表示使Y軸歸零
Z表示使Z軸歸零
E表示重置E軸的位置爲0,與XYZ軸不一樣的是,若是使用了E參數,E軸步進電機並不運動,而是將當前的E軸位置直接設置爲0,這樣下面對E軸的運動指令,都會解釋爲相對0點的運動。
若是使用時沒有任何參數,直接使用G28,等價於G28 XYZ命令。這時並不會對E軸進行重置爲0的操做。
XYZ軸歸零的順序,由固件配置HOMEING_ORDER決定,好比定義爲
#defineHOMING_ORDER HOME_ORDER_XYZ
就表明着先歸零X軸,而後是Y軸,最後是Z軸。
T 設置當前擠出頭
對於擁有多個擠出頭的3D打印機來講,須要使用T命令選擇當前工做的擠出頭。這條命令有一個無名參數,參數值直接跟在T後面。例如:
T0表示選擇第一個擠出頭;
T1表示選擇第二個擠出頭;
參數是T命令最特殊的一點。這與其餘全部的G-code命令都不相同。
Z軸高度測試與自動調平
三角洲類型的3D打印機,因爲其打印速度更快,受到不少3D打印用戶的歡迎。與XYZ式3D打印機最大的一個不一樣,在於三角洲類型3D打印機的運動計算更加複雜,很難依賴人工調平達到較好的打印效果。所以,對Z軸的自動高度測試,以及自動調平相關的功能,就顯得更加劇要了。如下G-code命令,是Repetier-firmware對這方面進行支持的一組命令。固然,這些功能並不只限於三角洲類型的3D打印機。若是是包含了Z軸高度測試微動開關的XYZ式3D打印機,也一樣可使用這些功能。
這條命令測試打印平面上三個點的Z軸高度,並在串口上輸出結果。參數包括:
Snnn測試結果的處理方式。S1表示更新內存中的Z軸高度值(重置系統會丟失),S2表示更新內存以及EEPROM中的Z軸高度值(重置系統不會丟失)。
無參數時,G29命令表示只從串口上輸出結果,不更新內存或EEPROM中的Z軸高度值。
通常來講,只有使用高位限位開關(也就是說,Z軸的限位開關位於Z軸座標最大處),且在擠出頭上附帶有Z軸高度測試微動開關的機型,適合使用G29命令測試Z軸高度。其餘機械配置的機型,不適合使用G29命令。G29命令由固件配置
#defineFEATURE_Z_PROBE 1
決定是否開啓。若是這個配置項定義爲0,則編譯時會去除對G29命令的支持,節省內存的使用。
命令執行時,打印平面上的三個點,其XY座標由如下固件配置參數決定:
#defineZ_PROBE_X1 -52#defineZ_PROBE_Y1 -30#defineZ_PROBE_X2 52#defineZ_PROBE_Y2 -30#defineZ_PROBE_X3 0#defineZ_PROBE_Y3 60
命令執行的開始和結束,分別會執行一段預約義的G-code。缺省的固件配置定義爲:
#defineZ_PROBE_START_SCRIPT 「G28」#defineZ_PROBE_FINISHED_SCRIPT 「」
能夠看出,在缺省狀態下,開始執行G29時,系統會自動對擠出頭進行復位(G28命令)。結束執行G29時,沒有特殊的動做。
G29命令的Z軸高度測試,一般由一個微動開關控制觸發。這個開關的端口號,由Z_PROBE_PIN單獨指定。
G29命令的輸出,格式爲:
X:0.00Y:0.00Z:200.00E:0.00Z-probe:5.01X:-52.00Y:-30.00Z-probe:13.04X:52.00Y:-30.00Z-probe:12.77X:0.00Y:60.00X:0.00Y:60.00Z:-98.48E:0.00
從以上例子的輸出能夠看出,G29命令一共測試了三個座標點,分別在(-52, -30), (53, 30)以及(0, 60)的位置,造成一個正三角形。三個點的Z軸高度相差比較懸殊,在第一個點正好是5mm的狀況下,後兩個點分別是13.04mm以及12.77mm。第一行和最後一行,是測試開始時以及測試結束時的擠出頭座標位置。
這條命令做爲一個完整Z軸高度測試過程的一步,測試打印平面上一個點的Z軸高度,並在串口上輸出結果。這個完整的Z軸高度測試過程,一般是由3D打印機控制軟件連續發出的,經過參數控制G30的執行狀態。所以在手動工做方式下,G30命令只適合不帶參數運行(等價於G30 P3,見下面的參數說明)。
G30命令的參數包括:
Pnnn表示測試的狀態,P1表示當前這步是整個Z軸高度測試過程的第一步;P2表示當前這步是整個Z軸高度測試過程的最後一步;P3表示當前這步是Z軸高度測試過程的惟一一步,也就是說既是第一步也是最後一步;P0表示當前這步是Z軸高度測試過程當中的中間一步。無參數狀況下,P的缺省值是3。
與G29命令相似,G30命令一樣由固件配置
#defineFEATURE_Z_PROBE 1
決定是否開啓。
G30命令的輸出,與上面的G29輸出格式一致,但只有其中的一行,須要上位機軟件屢次發出G30命令,再綜合處理全部的輸出結果。
這條命令很是簡單,沒有參數。執行後會輸出當前Z軸高度測試微動開關的當前狀態:
Z-probestate:L
其中L表示微動開關沒有觸發。若是是處於觸發狀態,這裏會輸出H。
G29命令、G30命令、G31命令只進行Z軸的高度測試,並不進行自動調平。有些上位機3D打印機控制軟件,會經過這一組命令配合自動跳屏算法實現(上位機)熱牀自動調平功能。若是但願不經過上位機,只由3D打印機自身完成自動調平功能,須要使用G32命令。
這條命令在G29命令的基礎上,不只測試打印平面上三個點的Z軸高度,並且還會根據測試的結果,對3D打印機的機械參數進行調整,實現熱牀自動調平。G32命令使用的參數與G29命令是一致的:
Snnn測試結果的處理方式。S1表示更新內存中的相關參數值(重置系統會丟失),S2表示更新內存以及EEPROM中的相關參數值(重置系統不會丟失)。
G32命令執行完成時,不只Z軸高度參數發生了改變,並且還會根據3D打印機的硬件配置,對熱牀進行相應的調平處理。
若是熱牀自己是使用步進電機進行高度控制的,那麼程序會自動調整步進電機的位置,使熱牀自動調整爲平整的狀態;若是熱牀自己不能移動(這個應該是更常見的狀況),那麼G32命令會在3D打印機內存中構建一個轉換矩陣(Transformation matrix),讓將來3D打印機所處理的全部三維空間位置,都先通過這個矩陣的變換,保證在Z=0的狀況下,正好與熱牀平面徹底吻合。因爲這裏涉及到高深的計算機圖形學知識,咱們就不詳細介紹了。有修改這方面代碼需求的朋友,能夠直接與小編進行聯繫。
G32命令,由固件配置
#defineFEATURE_AUTOLEVEL 1
決定是否開啓。
G32命令的輸出,格式與G29命令相似:
X:0.00Y:0.00Z:200.00E:0.00Z-probe:5.00X:-52.00Y:-30.00Z-probe:12.97X:52.00Y:-30.00Z-probe:12.76X:0.00Y:60.00Info: 0.99709-0.00319-0.076280.000000.99912-0.41910.076340.0041790.99621Info:AutolevelingenabledX:7.32Y:64.08Z:-95.66E:0.00X:0.00Y:0.00Z:200.00E:0.00
除了與G29命令類似的測量信息以外,G32命令還輸出了計算獲得的自動調平矩陣,而且打開了自動調平功能。須要注意的一點是,G32命令雖然生成了自動調平矩陣,但並沒將其保存在EEPROM中,所以下次開機這個信息將會丟失。能夠配合M320 S1命令,將自動調平矩陣保存在EEPROM中。
這條命令能夠將當前的Z軸位置保存爲Z軸高度值,以使前面的Z軸高度手動/自動測量的結果起做用。一般,M251命令只工做在三角洲機型上,而且應該與G29命令聯合使用(自動測量Z軸高度)。這條命令沒有相關的參數。
當3D打印機打開EEPROM支持時,這條命令還會將Z軸高度值同時保存在EEPROM中。
只有當固件配置定義
#defineZ_HOME_DIR -1
也就是Z軸向正方向歸位,而且定義
#defineMAX_HARDWARE_ENDSTOP_Z true
也就是存在硬件的Z軸高位限位開關時,M251命令纔會在編譯中包含相關的代碼。
一般,只有三角洲類型的3D打印機才能知足這兩個條件限制。
開啓(M320)或者關閉(M321)自動調平功能,使自動調平轉換矩陣起做用或不起做用。命令參數爲
Snnn表示是否保存於EEPROM,沒有S參數或者S0表示不保存於EEPROM,S1表示保存於EEPROM,在關閉自動調平(M321)命令中S3表示將自動調平矩陣清零且保存於EEPROM中;
M320的輸出結果爲:
Info:Autolevelingenabled
表示自動調平已經打開。
M321的輸出結果爲:
Info:Autolevelingdisabled
表示自動調平已經關閉。
M322 清零自動調平轉換矩陣
清零(M322)自動調平轉換矩陣。顯然,清零這個動做的同時自動調平功能也關閉了。命令參數爲
Snnn表示是否保存於EEPROM,S0表示不保存於EEPROM,S1表示保存於EEPROM;
也就是說,
M321 S3
命令等價於
M322 S1
命令,二者都是清零自動調平矩陣,關閉自動調平功能,而且將這個設置保存於EEPROM之中。
以上三條命令,與G32命令相同,由固件配置
#defineFEATURE_AUTOLEVEL 1
決定是否開啓。
M322的輸出結果爲:
Info:Autolevelmatrixreset
表示自動調平轉換矩陣已經被清零。
這兩條命令用於設置當前座標模式爲絕對座標模式(G90)或者相對座標模式(G91)。沒有參數。
未設置時缺省值是絕對座標模式。咱們在這篇教程中,全部的例子也都是以絕對座標模式給出的。
在相對座標模式下,每次步進電機XYZE移動以後,當前位置都會重置爲0。對於如下兩條G-code命令
G0 X1
G0 X-1
若是3D打印機當前處於相對座標模式下,那麼X軸步進電機會先向正方向移動一個單位,再向反方向移動一個單位。第二條語句,實際移動距離是1個單位(向X軸反方向)。
而若是3D打印機當前處於絕對座標模式下,那麼X軸步進電機會先移動到X=1的位置處,再移動到X=-1的位置處。第二條語句,實際移動距離是2個單位(向X軸反方向)。
設置3D打印機內存中XYZE的位置值。不移動對應的步進電機。參數包括:
Xnnn表示X軸的位置值;
Ynnn表示Y軸的位置值;
Znnn表示Z軸的位置值;
Ennn表示E軸(擠出機步進電機)的位置值;
一些3D打印機的機械設計,會在XYZE四個步進電機軸以外,使用更多的輔助步進電機。Repetier-firmware提供了一套輔助步進電機指令,讓用戶(以及上位機軟件)能夠操做這些輔助步進電機。因爲輔助步進電機的用途、參數各異,爲了讓這套指令更加通用,這些指令被設計爲很是簡單的形式。
將步進電機P的位置移動到X位置處。參數包括:
Pnnn表示第P個輔助步進電機;
Xnnn表示這個步進電機的目標位置;
這條命令與G1命令很是相似。
將X位置設置爲步進電機P的當前位置。不實際移動步進電機。參數包括:
Pnnn表示第P個輔助步進電機;
Xnnn表示這個步進電機的當前位置;
這條命令與G92命令很是相似。
報告步進電機P的當前位置。參數包括:
Pnnn表示第P個輔助步進電機;
這條命令與M114命令很是相似。
G203 開啓/關閉步進電機
用於開啓/關閉步進電機P。參數包括:
Pnnn表示第P個輔助步進電機;
Snnn表示開閉標誌,S0表示關閉步進電機,S1表示開啓步進電機;
步進電機開啓後,有兩種可能的狀態。一種是「運動」狀態,也就是正在進行正向或反向的旋轉。另外一種是「保持位置」狀態,也就是保持當前的位置不變。雖然步進電機關閉也不會主動移動位置,但「保持位置」狀態與步進電機關閉狀態仍有顯著的區別。「保持位置」狀態下,當步進電機受力時,會產生一個反向的力矩,使步進電機位置保持不變。
這條命令與「節能管理」一節中的M84命令有關。M84命令用於關閉XYZE步進電機,但不能打開這些步進電機。
顯示SD卡全部目錄內容。沒有相關的參數。
M20命令的輸出,格式爲:
Begin filelista.gcodeTEST/TEST/c.gcodeb.gcodeEnd filelist
這個目錄內容清單,說明了這張SD卡上目前有3個文件,分別是a.gcode,b.gcode以及c.gcode,其中,a.gcode和b.gcode都保存於根目錄下,而c.gcode保存於一個名稱爲TEST的文件夾裏面。
嘗試加載SD卡,也就是執行Mount動做。沒有相關的參數。
卸載SD卡,也就是執行Unmount動做。沒有相關的參數。
選擇一個SD卡上的文件。參數爲
filename表示被選擇的文件名(包含目錄名,以/分隔);
文件選擇以後,能夠執行打印、刪除等動做。例如命令
選定了SD卡TEST文件夾裏面的c.gcode文件做爲當前文件。
同時輸出格式爲:
Fileopened:c.gcodeSize:1127565Fileselected
表示文件已經順利打開。
打印當前選定的SD卡文件。逐行讀入SD卡文件內容G-code代碼,並執行。沒有相關參數。
暫停當前的SD卡打印。沒有相關參數。
設置當前文件的當前位置。參數爲
Snnn表示當前位置的字節數。
獲取SD卡打印進度。沒有相關參數。
M27命令的輸出,格式爲:
SD printingbyte11518/1127578
這條命令供上位機獲取當前的3D打印進度信息,用於顯示在電腦界面上。
寫一個SD卡文件。參數爲:
filename表示待寫入的文件名(包含目錄名,以/分隔);
從執行M28命令開始,全部3D打印機接收到的G-code,除了M29命令之外,都會保存至指定的SD卡文件中,而不會被實際執行。這條命令能夠將一個G-code文件從上位機3D打印控制軟件複製到3D打印機的SD卡上,以供將來執行。
結束以M28開始的「保存至SD卡文件」狀態,將3D打印機恢復到正常狀態。今後,全部接收到的G-code命令,都會被直接解釋執行。沒有相關參數。
刪除一個SD卡中的文件。參數爲:
filename表示待刪除的文件名(包含目錄名,以/分隔);
在SD卡上建立一個子目錄。參數爲:
filename表示待建立的子目錄(包含目錄名,以/分隔);
以上全部SD卡相關指令,都由固件配置
define SDSUPPORT 1
決定是否開啓。若是固件不須要支持SD卡,關閉這項固件配置,能夠節省很多內存空間。
節能管理
當3D打印機一段時間沒有接收到步進電機運動指令以後,3D打印機(爲了節能)會自動關閉步進電機。使用M84指令,能夠設置這個自動關閉步進電機的時間。參數包括:
Snnn表示步進電機關閉的時間,以秒爲單位。
若是使用M84時沒有指定S參數,則步進電機會當即關閉。
M84命令的缺省值是360秒。在固件配置中,缺省值由
#defineSTEPPER_INACTIVE_TIME 360L
控制。
當3D打印機一段時間沒有接收到指令以後,3D打印機(爲了節能)會自動關閉步進電機以及擠出頭、熱牀等設備。使用M85指令,能夠設置這個自動關閉3D打印機的時間。參數包括:
Snnn表示在關閉步進電機以前步進電機沒有活動的時間,以秒爲單位。
若是使用M85時沒有指定S參數,或者使用了S0參數,則表明取消3D打印機自動關閉功能,擠出頭、熱牀等在工做完成以後,一直會處於當前狀態,而不會被自動關閉。
M85命令的缺省值是0(不自動關閉)。在固件配置中,缺省值由
#defineMAX_INACTIVE_TIME 0L
控制。
溫度管理
設置擠出頭的目標溫度。執行這條命令後,不須要等待達到這個溫度,當即開始執行下一條G-code語句。相關參數包括:
Snnn表示目標溫度;
Tnnn表示對應的擠出頭;
P表示要等待前面的指令完成以後,再開始設置擠出頭溫度;
Fnnn表示到達目標溫度以後,是否觸發蜂鳴器。F1表示要觸發;
若是執行命令時沒有帶T參數,則針對當前擠出頭設置目標溫度。
M140 設置熱牀目標溫度
設置熱牀的目標溫度。執行這條命令後,不須要等待達到這個溫度,當即開始執行下一條G-code語句。相關參數包括:
Snnn表示目標溫度;
Fnnn表示到達目標溫度以後,是否觸發蜂鳴器。F1表示要觸發;
獲取當前溫度值,包括擠出頭和熱牀的溫度。相關參數包括:
X表示輸出AD轉換輸入的原始值;
M105命令的輸出,格式爲:
T:18.97 /0 B:18.75 /0 B@:0 @:0
能夠看到,T:以後的部分,表明擠出頭的當前溫度/目標溫度;B:以後的部分表明熱牀的當前溫度/目標溫度。
在PID溫度控制模式下,B@:後面的數字表明熱牀當前的輸出強度,是一個0255的值,@:後面的數字,表明擠出頭當前的輸出強度,也是一個0255的值。例子中,擠出頭、熱牀都處於關閉狀態,因此這個位置的值都是0。
設置擠出頭的目標溫度,並等待達到這個溫度。相關參數包括:
Snnn表示目標溫度;
Tnnn表示對應的擠出頭;
Fnnn表示到達目標溫度以後,是否觸發蜂鳴器。F1表示要觸發;
若是執行命令時沒有帶T參數,則針對當前擠出頭設置目標溫度。
設置熱牀的目標溫度,並等待達到這個溫度。相關參數包括:
Snnn表示目標溫度;
Fnnn表示到達目標溫度以後,是否觸發蜂鳴器。F1表示要觸發;
等待全部擠出頭/熱牀到達由以前的M104/M140指令所指定的目標溫度。沒有相關參數。
其餘經常使用指令
設置3D打印機內存中XYZE步進電機的分辨率。參數包括:
Xnnn表示X軸的分辨率;
Ynnn表示Y軸的分辨率;
Znnn表示Z軸的分辨率;
Ennn表示E軸(擠出機步進電機)的分辨率;
這兩條命令用於打開(M106)或關閉(M107)風扇。相關的參數包括:
Snnn表示打開風扇時風扇的轉速,取值範圍在0~255之間;
P表示要等待前面的指令完成以後,再開始調整風扇轉速;
在固件配置中,定義
#defineFEATURE_FAN_CONTROL 1
表示支持風扇控制功能,在編譯中會包含相關的代碼。
輸出擠出頭當前位置。沒有相關的參數。
M114命令的輸出,格式爲:
X:20.00Y:30.00Z:10.000E:0.0000
輸出3D打印機信息。沒有相關的參數。
M115命令的輸出,格式爲:
FIRMWARE_NAME:Repetier_0.92.3FIRMWARE_URL:…Printedfilament:0.00mPrintingtime:0days0hours0minSpeedMultiply:100FlowMultiply:100
第一行是固件的版本信息,很長,我沒有列完整。第二行是已經打印了多少米耗材,打印時間是幾天幾小時幾分鐘。第三行是速度係數,參考M220命令。第四行是流率係數,參考M221命令。
將當前限位開關狀態輸出。沒有相關的參數。
M119命令的輸出,格式爲:
endstopshit:x_min:Ly_min:Lz_min:L
列出了XYZ三個軸的低位限位開關的當前狀態。L表明限位開關沒有觸發。H表明限位開關被觸發了。
這兩條命令設置打印加速度。包括擠出頭工做時(打印中)的運動加速度(M201),以及擠出頭不工做時(移動中)的運動加速度(M202)。參數爲
Xnnn表示X軸的加速度;
Ynnn表示Y軸的加速度;
Znnn表示Z軸的加速度;
Ennn表示E軸的加速度;
在固件配置中,定義
#defineRAMP_ACCELERATION 1
表示支持加速度功能,在編譯中會包含相關的代碼。
使用串口輸出監控3D打印機的溫度。參數爲
Snnn表示是否監控,S0關閉監控,S1打開監控;
當監控處於打開狀態,能夠從串口定時獲取當前的溫度信息。
監控輸出格式與M105命令的輸出結果徹底一致。
設置擠出頭溫度控制的PID參數,命令參數爲
Snnn表示對應的擠出頭,無S參數表示使用當前擠出頭;
Xnnn表示P參數;
Ynnn表示I參數;
Znnn表示D參數;
修改當前的最大抖動值。命令參數爲
Xnnn表示XY軸的最大抖動值;
Znnn表示Z軸的最大抖動值;
Ennn表示E軸的最大抖動值;
XY軸抖動指的是3D打印機同時在X軸和Y軸上移動時,產生的和速度最大值。好比,3D打印機加熱頭正在向X軸正方向全速移動,下一條指令變爲向Y軸正方向移動。若是同時在X軸和Y軸上改變速度,那麼實際產生的速度是X方向的速度和Y方向的速度的向量和,這個比較大的速度變化值,會對3D打印機的機械部件產生不利的影響,並且會形成比較大的噪音。這裏的設置,就限制了這個XY軸上和速度的最大值。固然這個值也不能設置的過小,過小的話,首先打印速度會變得很慢,並且打印會產生更多的瑕疵。
Z軸抖動與XY軸抖動意義相似,不一樣點是Z-Jerk是Z軸方向不爲0的抖動速度值。由於這項涉及到Z軸的運動,所以最大速度就低多了。
M207命令的輸出,格式爲:
Jerk:20.00ZJerk:0.30
這個輸出意義很簡單,表示XY軸抖動速度爲20mm/s,Z軸抖動速度爲0.3mm/s。
設置3D打印機運行速度係數。命令參數爲
Snnn表示係數,是一個百分數,若是S參數不存在,則使用缺省值100;
3D打印機運行速度係數,是一個在25%到500%範圍內變化的值。這個係數值在3D打印機運行過程當中,與切片器給出的3D打印機運動速度基礎值相乘,獲得最終的3D打印機實際運動速度值。
M220命令的輸出,格式爲:
SpeedMultiply:100
設置3D打印機的流率係數(Flow rate)。命令參數爲
Snnn表示係數,是一個百分數,若是S參數不存在,則使用缺省值100;
3D打印機流率係數,是在上位機切片軟件經過耗材直徑、噴頭直徑、層高以及3D打印速度等因素綜合計算獲得的E軸運動速度的基礎上,疊加的一個E軸運動速度係數。簡單地說,就是控制擠出頭耗材擠出量的多少。這個係數能夠在25%到500%範圍內變化。
M221命令的輸出,格式爲:
FlowMultiply:100
爲了保護3D打印機的擠出頭,一般設置下,E軸的運動必須在擠出頭加熱到必定溫度以後才被容許。在擠出頭冷卻的狀況下,全部的E軸運動命令是被3D打印機固件忽略的。但有些狀況下咱們須要在擠出頭冷卻的狀況下運動E軸,這時能夠經過M302命令進行設置。命令參數爲
Snnn表示是否容許冷擠出,S0表示不容許,S1表示容許,沒有S參數缺省表示容許;
M302命令的輸出,爲當前是否容許冷擠出。容許時會輸出:
Cold extrusion allowed
不容許時會輸出:
Code extrusion disallowed
較不經常使用指令
這些指令實在沒法歸類了,只能以「較不經常使用指令」爲名字,放在了一塊兒。
此命令直接讀/寫一個Arduino端口,爲3D打印控制軟件上位機擴展程序功能提供基礎。參數包括:
Pnnn表示Arduino的輸入/輸出端口;輸出時固件程序會同時輸出到數字端口和模擬端口;輸入時固件程序會從數字端口輸入;
Snnn表示寫入輸出端口的值,0到255之間是合法的數字;當S參數不存在的時候,M42指令起輸入做用;
Repetier-firmware固件中預先定義了一個表格,稱爲「敏感端口表格」,全部位於這個表格內的端口,也就是當前已經被步進電機、限位開關以及熱敏電阻佔用的端口,都不能被M42命令影響。其餘當前未佔用的端口,能夠由這條命令進行IO操做。
與G90/G91命令相似,這兩條命令用於設置擠出頭當前座標模式爲絕對座標模式(M82)或者相對座標模式(M83)。沒有參數。
未設置時缺省值是絕對座標模式。
須要注意的是,G90/G91設置的座標模式,同時對XYZE四個軸起做用,但M82/M83設置的座標模式,只對E軸(擠出頭步進電機)起做用。
M99命令能夠暫時關閉XYZ軸步進電機一段時間。命令參數包括:
Snnn表示所需暫時關閉步進電機的時間,以秒爲單位;
X表示暫時關閉X軸步進電機;
Y表示暫時關閉Y軸步進電機;
Z表示暫時關閉Z軸步進電機;
若是S參數沒有指定,則暫時關閉10秒鐘時間。暫時關閉時間到達以後,從新打開相應軸的步進電機。
運行時調試標誌是一組布爾值,一共有6個不一樣的標誌,使用位域(Bit Field)的表示方式。用戶能夠利用M111指令修改這些標誌的值。相關參數包括:
Snnn表示直接將調試標誌設置爲S值;
Pnnn表示以位操做的方式,將P值與當前調試標誌作某種操做。若是P值是正數,則進行按位或操做(增長P參數所帶的標誌位);若是P值是負數,則忽略P的符號,進行取反後按位與操做(去除P參數所帶的標誌位);
調試標誌的位域,由如下6個布爾值組成:
第1位,值爲1,表示是否回顯(Echo)由上位機發送至下位機的命令;
第2位,值爲2,表示是否輸出信息(Info),實際在固件代碼中並未使用;
第3位,值爲4,表示是否輸出錯誤(Error),在固件出錯時會將出錯信息發送回上位機;
第4位,值爲8,表示是否進入模擬執行模式(Dry run),在模擬執行模式下,3D打印機不實際執行上位機發送的命令,只修改3D打印機的內存狀態;
第5位,值爲16,表示是否進入調試通信模式(Communication),實際在固件代碼中彷佛並未使用;
第6位,值爲32,表示是否進入禁止移動模式(No Move),在這個模式下,全部對步進電機的移動命令,都會被忽略;
將一條詳細發送至LCD屏幕,顯示爲當前狀態信息。參數爲
message表示待顯示在LCD屏幕上的文本;
使蜂鳴器發出蜂鳴聲。參數爲
Snnn表示發出聲音/不發出聲音的時間,以毫秒爲單位;
Pnnn表示重複的次數;
若是3D打印機有蜂鳴器,並且是無源蜂鳴器,那麼經過S參數和P參數的組合,能夠獲得不一樣頻率的聲音。好比
能夠獲得一個較長的蜂鳴聲。若是3D打印機的蜂鳴器是有源蜂鳴器,那麼M120指令只能控制蜂鳴時間,不能控制蜂鳴器的聲音頻率。
將3D打印機設置爲「體積擠出模式」,同時設定擠出頭直徑參數。相關參數包括
Tnnn表示對應的擠出頭,無T參數表示使用當前擠出頭;
Dnnn表示擠出頭的實際直徑,無D參數表示關閉體積擠出模式;
體積擠出模式,是相對於缺省的「長度擠出模式」而言的另外一種擠出模式。在常見的「長度擠出模式」下,G-code中的使E軸運動的G0/G1命令,其參數都是以長度單位mm做爲單位的。這樣確實比較簡單,但問題是咱們在切片的時候,就必須知道要使用的噴頭直徑,不然沒法計算出耗材前進的實際長度。
爲了使G-code在生成以後適用於多種不一樣噴頭直徑的3D打印機機型,咱們能夠在上位機切片時,將E軸參數變爲以體積單位mm3做爲單位,而後在下位機固件中,再設定正在使用的噴頭直徑,以達到最終正確輸出的目的。爲了以體積單位mm3做爲E軸的參數單位,上位機須要將噴頭直徑設定爲1.128mm(這樣,耗材每前進1mm,會噴出1mmπ(1.128mm/2)2約等於1mm3的耗材。)同時,下位機要使用下面的語句:
M200T0D0.4
將實際的擠出頭噴頭直徑設置爲0.4mm。同時在上位機和下位機進行這樣的操做以後,3D打印機能夠在E軸參數單位爲mm3的狀況下,正確完成打印操做。
開啓/關閉自動回抽功能。命令參數爲
Snnn表示是否開啓自動回抽功能,1表示開啓,0表示關閉;
一般上位機切片器負責在合適的位置處加入回抽指令。若是你的切片器功能比較弱,不能加入合適的回抽指令,那麼能夠打開這個特性,由固件自動回抽。
在固件配置中,定義
#defineFEATURE_RETRACTION 1
表示支持自動回抽功能,在編譯中會包含相關的代碼。
有些特殊配置的3D打印機,容許2~4個擠出頭同時工做,而且這些擠出頭動做徹底一致,同時打印出多件徹底同樣的打印件,這種工做模式叫作多頭重複打印模式(Ditto mode)。M280命令對這個模式進行設置。命令參數爲
Snnn表示這個模式下的擠出頭個數;S0表示關閉多頭重複打印模式;S1S3表示工做在多頭重複打印模式下,而且3D打印機擁有額外的13個擠出頭。
在固件配置中,定義
#defineFEATURE_DITTO_PRINTING 1
表示支持多頭重複打印模式功能,在編譯中會包含相關的代碼。
這條命令用於測試CPU硬件中的看門狗功能。實際上,就是形成一個死循環,再也不執行「喂狗」動做,從而觸發CPU硬件看門狗,最終(故意地)形成3D打印機重啓。這條命令只是用於3D打印機固件開發測試。
自動測試PID參數值。命令參數爲
Pnnn表示待測試的擠出頭編號,從0開始,P<擠出頭個數>表明待測試的是熱牀;
Snnn表示打印溫度;
Rnnn表明重複測試次數;
X表明是否保存於EEPROM中;
因爲加熱、散熱須要較多時間,這條命令執行時間很長。
測試(無源)蜂鳴器,產生一個特定頻率的聲音。命令參數爲
Snnn表示聲音的頻率;
Pnnn表示聲音持續的時間,以毫秒爲單位;
若是命令沒有包含S參數或者P參數,則會使用缺省值S1以及P1000。
保存與恢復當前位置
M400 等待當前全部移動指令完成
等待在3D打印機內存中待處理的移動命令執行完成。沒有相關的參數。
執行這條語句以後,能夠保證在下一條G-code命令執行時,全部步進電機都不處於運動狀態中。
將當前位置,包括XYZE步進電機,保存於內存的一組專用變量中。將來能夠用M402命令恢復這組位置。沒有相關的參數。
恢復以前由M401命令保存的位置值。命令參數爲
X表示恢復X位置;
Y表示恢復Y位置;
Z表示恢復Z位置;
E表示恢復E位置;
Fnnn表示使用參數給定的速度,無F參數時使用當前速度值;
暫停與更換耗材
M600 更換耗材
在擁有顯示屏的3D打印機上,啓動更換耗材嚮導界面。沒有相關的參數。
一般,這個嚮導界面是從顯示屏界面上觸發的。M600命令提供一個接口,使更換耗材嚮導界面能夠從上位機軟件觸發。
暫停或者恢復擠出頭。命令參數爲
Snnn表示暫停或者恢復,S1表示暫停擠出頭,S0表示恢復擠出頭工做;
暫停擠出頭包括中止擠出頭加溫以及中止擠出頭步進電機工做。恢復則相反,加熱擠出頭到原來的溫度。
固件的設置,是一個比較有趣的話題,不少玩3D打印機的朋友,在遇到設置相關的問題時都會犯迷糊。實際上,對於某一項特定的設置,好比說X軸的步進電機分辨率,在3D打印機主板上,有三個不一樣的位置(也是三種不一樣的存儲器)保存了這項內容,而它們的值還有可能不一樣。讓咱們先來了解一下這些保存設置內容的位置,以方便你們的理解。
首先,是固件配置文件(configuration.h)中的設置值。配置文件中的值,會跟隨固件一塊兒編譯,以後在刷機過程當中,保存在了3D打印機的靜態存儲區(Flash ROM)中。除了刷機以外,靜態存儲區的內容不會發生變更,能夠認爲是隻讀的。每次開機的時候,都是同樣的值在等待着咱們。
第二份設置值,保存在電可擦寫靜態存儲區(EEPROM)。EEPROM的讀寫代價,比靜態存儲區要小。所以,3D打印機容許在刷機以後,修改設置值,而這些修改以後的設置值,就存儲在EEPROM之中。每次開機,程序會先檢查EEPROM,若是EEPROM中是空白的,則將靜態存儲區的第一份設置值複製到EEPROM之中。而若是EEPROM中已經有保存好的設置值,則程序會直接使用EEPROM中的值。有些朋友在玩3D打印機過程當中可能會有這樣的經驗,就是明明修改了固件配置文件中的設置值,但刷機以後居然沒有發生變化。這種狀況,每每就是EEPROM在搗鬼了。咱們徹底可使用G-code M502 M500兩條指令(指令的具體含義能夠參考下面),重寫EEPROM,解決這樣的問題。
第三份設置,保存在內存(RAM)中。實際用戶使用的值,就是內存中的值。因爲內存只在加電狀況下可以保持其中的內容,所以每次開機時,3D打印機會根據上面描述的邏輯,重建內存中的設置值。若是某條指令修改的是內存中的設置值,那麼這也表明着此次修改是一個臨時修改,下次開機這個值就會消失了。
總的來講,三份固件設置,使用的優先級是
但設置的持久性,就要反過來了。明確瞭解了這些,特別有助於咱們解決一些與設置相關的問題,天然,看下面這些命令描述的時候,也就不會迷糊了。
輸出EEPROM的當前設置值表格。沒有相關的參數。
M205命令的輸出,格式爲:
EPR:275 115200BaudrateEPR:3129 0.000Filamentprinted[m]EPR:2125 0Printeractive[s]…
這是一個很長的輸出,咱們這裏只截取了前三行。每行中,EPR:後面的第一個數字,是這個設置項值的類型。0表明8bit整數類型,1表明16bit整數類型,2表明32bit整數類型,3表明32bit浮點類型。第二個數字,是設置項值的位置(即EEPROM中的地址)。第三個數字,是設置項的值。最後,是設置項的意義。
以第一行爲例,第一行設置的是通信波特率(Baudrate),當前值是115200。波特率設置項,在EEPROM中的位置(地址)是75,這個值是一個32bit整數類型,所以佔據了從位置75開始的連續4個字節(也就是位置75, 76, 77, 78)。
修改EEPROM中的某個值。命令參數爲
Pnnn表示待修改的值的位置(即EEPROM中的地址);
Tnnn表示值的類型,0表明8bit整數類型,1表明16bit整數類型,2表明32bit整數類型,3表明32bit浮點類型;
Snnn表示值,只能帶整數,用於T爲0, 1, 2的狀況;
Xnnn表示值,只能帶浮點數,用於T爲3的狀況;
能夠看出,M206指令的使用是很複雜的,須要瞭解EEPROM中數值的存儲位置以及數值類型,才能進行有效的修改。所以小編建議除非你徹底理解M206指令的含義,不然不要使用這個指令。
輸出固件配置信息。沒有相關參數。
M360命令的輸出,格式爲:
Config:Baudrate:115200Config:InputBuffer:127Config:NumExtruder:1…
這是一個很長的輸出,咱們這裏只截取了前三行。每行中,都有一項配置信息的名稱,以及對應的值。
M500 保存內存中的設置值到EEPROM
將3D打印機內存中的設置值保存到EEPROM中。沒有相關的參數。
M501 讀取EEPROM的設置值到內存
將EEPROM中的設置值讀取到3D打印機內存中。沒有相關的參數。
M502 將內存中的設置值重置
將內存中的設置值重置爲固件配置(configuration.h)中的值。沒有相關的參數。
因爲每次系統掉電後,內存中的值都會消失,從新啓動時從EEPROM中讀取,所以單獨使用M502命令將只對3D打印機掉電重啓以前起做用。若是想起長期做用,須要配合M500,將設置值保存到EEPROM中。
步進電機參考電壓調節
目前市面上支持軟件設置步進電機參考電壓的3D打印機主板不多。大部分3D打印機主板只能經過調整微調電位器來控制步進電機參考電壓。在這些3D打印機上,這一組命令是無效的。
M907 設置步進電機參考電壓(百分比值)
設置步進電機參考電壓。命令參數爲
Snnn表示對全部步進電機進行統一設置;
Xnnn表示對X軸步進電機進行設置;
Ynnn表示對Y軸步進電機進行設置;
Znnn表示對Z軸步進電機進行設置;
Ennn表示對E軸步進電機進行設置;
全部的參數值,都是一個0~100之間的百分比數值。
M908 設置步進電機參考電壓
與M907命令相似,設置步進電機參考電壓。命令參數爲
Pnnn表示步進電機編號;
Snnn表示步進電機參考電壓設置值,要求爲0~255之間的一個數值;
這個命令與M907命令相似,一樣要求3D打印機主板支持。在不支持軟件調整參考電壓的3D打印機主板上,M908命令無效。
M909 輸出步進電機參考電壓值
輸出當前的步進電機參考電壓值。沒有相關的參數。
M910 將步進電機參考電壓值保存至EEPROM
將M907/M908命令設置的步進電機參考電壓值保存至EEPROM。沒有相關的參數。
須要輔助硬件支持的指令
M80/M81 打開/關閉ATX電源
在配置了ATX電源的3D打印機上,打開(M80)或者關閉(M81)ATX電源。沒有相關的參數。
M340 伺服電機控制
伺服電機控制功能。命令參數爲
Pnnn表示伺服電機編號,從0開始,最大爲3,能夠控制4個伺服電機;
Snnn爲控制時間,單位爲毫秒,應該是一個500到2500之間的數值;
Rnnn爲自動關閉時間,單位爲毫秒;
M350 設置步進電機細分數
在支持細分數設置的3D打印機主板上(這類主板不多見),設置步進電機細分數。命令參數爲
Snnn表示將細分數的每一位(bit)都設置爲相同的值,S0表示全部都設置爲0,S1表示全部都設置爲1;
Xnnn表示設置細分數第0位;
Ynnn表示設置細分數第1位;
Znnn表示設置細分數第2位;
Ennn表示設置細分數第3位;
Pnnn表示設置細分數第4位;
須要注意的是,在大多數3D打印機主板上,細分數設置是主板硬件設計時就固定的,不能經過軟件調整。這種狀況下,M350命令無效。
M355 設置照明燈開關
設置照明燈的開關。命令參數爲
Snnn表示照明燈的開關狀態,S0表示關閉照明燈,S1表示打開照明燈;
無參數時輸出當前照明燈的狀態。
在固件配置中,定義
#defineCASE_LIGHTS_PIN -1
表示照明燈的電路硬件鏈接pin值,-1表明照明燈未鏈接。
M355命令的輸出,爲當前是否打開了照明燈。打開時會輸出:
Caselights on
關閉時會輸出:
Caselights off