切片軟體對模型進行切片後會生成.gcode檔案,這就是我們常說的G代碼。G代碼是用于指導3D列印機怎麼動作的檔案,其實最主要就是指導列印機的3軸電機和擠出機如何動作,比如某個電機正轉多少、速度多少。
3D列印機本質就是gcode的執行器,同樣的雕刻機、雷射雕刻機也是。我們把一張平面圖形通過軟體生成G代碼,G代碼就可以控制雷射雕刻機的x、y電機先運動到哪兒、再運動到哪兒、接着運動到哪兒.....一系列運動之後就把平面圖形雕刻出來了。我們把3D模型經過切片軟體處理後,就是把3D模型切成一層一層的平面圖形,同樣的道理控制電機經過一系列運動就可以把模型列印出來了。
是以3D列印機的控制固件、切片軟體并不複雜,隻要知道了G代碼的文法,就可以自己寫一個G代碼的執行固件、G代碼的生成上位機。甚至不需要G代碼,你可以自己定義一種代碼,然後自己根據定義的代碼來設計執行固件和代碼生成上位機。
M92 E92.640000
M190 S60.000000
M109 S210.000000
;Sliced at: Wed 04-12-2019 20:39:58
;Basic settings: Layer height: 0.2 Walls: 0.8 Fill: 20
;Print time: 59 minutes
;Filament used: 2.708m 8.0g
;Filament cost: None
;M190 S60 ;Uncomment to add your own bed temperature line
;M109 S210 ;Uncomment to add your own temperature line
G21 ;metric values
G90 ;absolute positioning
M82 ;set extruder to absolute mode
M107 ;start with the fan off
G28 X0 Y0 ;move X/Y to min endstops
G28 Z0 ;move Z to min endstops
G1 Z15.0 F9000 ;move the platform down 15mm
G92 E0 ;zero the extruded length
G1 F200 E3 ;extrude 3mm of feed stock
G92 E0 ;zero the extruded length again
G1 F9000
;Put printing message on LCD screen
M117 Printing...
;Layer count: 250
;LAYER:-2
;RAFT
G0 F9000 X70.699 Y72.424 Z0.300
;TYPE:SUPPORT
G1 F1200 X71.320 Y71.910 E0.10054
G1 X72.120 Y71.371 E0.22086
G1 X72.666 Y71.071 E0.29856
G1 X73.699 Y70.614 E0.43945
G1 X74.884 Y70.287 E0.59277
G1 X75.607 Y70.181 E0.68391
.......
上面是Cura輸出的列印模型的G代碼,第1行到第3行分别是M92、M190、M109指令,後面跟着的是指令的參數。第4行到第10行是“;”後面跟着模型的屬性資訊,“;”是G代碼的注釋符。再後面又是指令号跟着指令參數......當開始列印時,列印機會按照這個G代碼檔案,一行一行的執行。
了解了G代碼檔案的組成,現在來說一下G代碼檔案中用到的指令。指令隻需要看一下就行,讀G代碼的時候,遇到什麼指令再回來查就可以了。
G代碼的指令分為:延時的G指令、即時的G指令、即時的M和T指令。延時和即時的差別在于收到指令後,對指令的回應處理不同。控制器收到指令後,都會把指令放入循環隊列中,隻要把延時指令成功放入隊列,控制器就會給出應答,可是對于即時指令,隻有執行該指令後才會給出應答。
一、延時的G指令
RepRap固件接收到這些指令後,會先存儲在一個循環隊列緩存裡再執行。這意味着固件在接收到一條指令後馬上可以傳輸下一條。另一方面,這也意味着一組線段可以沒有間斷的情況下連續列印。為了實作指令流的控制,當接受到可緩存的指令時,如果固件把它成功放到本地緩存裡,就立即給出應答,如果本地緩存已滿,則會延時等到緩存有空出的位置時,才給出應答。
G0/G1: 直線移動
G0和G1指令完全等價,作用就是讓噴頭線性移動到一個特定的位置。參數完整形式為:
G0 Xnnn Ynnn Znnn Ennn Fnnn Snnn
或者
G1 Xnnn Ynnn Znnn Ennn Fnnn Snnn
使用時,不需要所有的參數全部存在,但至少要有一個參數。其中,
Xnnn表示X軸的移動位置;
Ynnn表示Y軸的移動位置;
Znnn表示Z軸的移動位置;
Ennn表示E軸(擠出頭步進電機)的移動位置;
Fnnn表示移動速度,機關是毫米/每分鐘;
Snnn表示是否檢查限位開關,S0不檢查,S1檢查,預設值是S0;
如:
G1 F1500
G1 X50 Y25.3 E22.4
這兩行G-code,表示首先将移動速度設定為1500mm/min,然後将擠出頭移動至x=50mm, y=25.3mm的位置上,z軸高度不變,并且将擠出頭步進電機移動至22.4mm的位置上。注意,指令是将擠出頭移動到某個位置,而不是移動多少距離。比如前一個位置是X40 Y20 E20,那麼執行這條指令後,擠出頭往X正方向移動10mm,往Y正方向移動5.3mm,擠出機擠出2.4mm長度的耗材。
G28:複位
列印機複位指令。執行時會讓3個軸依次往限位開關的方向運作,碰到限位開關後還會減速做一次1mm左右的往返運動,來保證複位的準确性。如果在指令後面加上坐标值,則隻會複位坐标值對應的坐标軸。(坐标值的數字會被忽略)
如:
G28 X0 Y72.3
隻會複位x軸和y軸。
一般G代碼檔案開頭都會用此指令來複位3軸。(如上面的示例)
G29:Z軸高度三點測試
這條指令會測試列印平面上三個點的Z軸高度,并在序列槽上輸出結果。參數為Snnn,表示對測試結果的處理方式。S1表示更新記憶體中的Z軸高度值(重置系統會丢失),S2表示更新記憶體以及EEPROM中的Z軸高度值(重置系統不會丢失)。
無參數時,G29指令表示隻從序列槽上輸出結果,不更新記憶體或EEPROM中的Z軸高度值。
一般來說,隻有使用高位限位開關(也就是說,Z軸的限位開關位于Z軸坐标最大處),且在擠出頭上附帶有Z軸高度測試微動開關的機型,适合使用G29指令測試Z軸高度。其他機械配置的機型,不适合使用G29指令。G29指令由固件配置
#define FEATURE_Z_PROBE 1
決定是否開啟。如果這個配置項定義為0,則編譯時會去除對G29指令的支援,節省記憶體的使用。
指令執行時,列印平面上的三個點,其XY坐标由以下固件配置參數決定:
#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
在指令執行的開始和結束處,會分别執行一段預定義的G-code。預設的預定義内容為:
#define Z_PROBE_START_SCRIPT “G28”
#define Z_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。第一行和最後一行,是測試開始時以及測試結束時的擠出頭坐标位置。
G30:Z軸高度單點測試(單步)
這條指令作為一個完整Z軸高度測試過程的一步,測試列印平面上一個點的Z軸高度,并在序列槽上輸出結果。這個完整的Z軸高度測試過程,通常是由3D列印機控制軟體連續發出的,通過參數控制G30的執行狀态。是以在手動工作方式下,G30指令隻适合不帶參數運作(等價于G30 P3,見下面的參數說明)。
指令參數為:Pnnn,表示測試的狀态,P1表示目前這步是整個Z軸高度測試過程的第一步;P2表示目前這步是整個Z軸高度測試過程的最後一步;P3表示目前這步是Z軸高度測試過程的唯一一步,也就是說既是第一步也是最後一步;P0表示目前這步是Z軸高度測試過程中的中間一步。無參數情況下,P的預設值是3。
與G29指令類似,G30指令同樣由固件配置
#define FEATURE_Z_PROBE 1
決定是否開啟。
G30指令的輸出,與上面的G29輸出格式一緻,但隻有其中的一行,需要上位機軟體多次發出G30指令,再綜合處理所有的輸出結果。
G31:輸出Z軸高度測試微動開關狀态
這條指令非常簡單,沒有參數。執行後會輸出目前Z軸高度測試微動開關的目前狀态:
Z-probestate:L
其中L表示微動開關沒有觸發。如果是處于觸發狀态,這裡會輸出H。
G29指令、G30指令、G31指令隻進行Z軸的高度測試,并不進行自動調平。有些上位機3D列印機控制軟體,會通過這一組指令配合自動跳屏算法實作(上位機)熱床自動調平功能。如果希望不通過上位機,隻由3D列印機自身完成自動調平功能,需要使用G32指令。
G32:熱床自動調平
這條指令在G29指令的基礎上,不僅測試列印平面上三個點的Z軸高度,而且還會根據測試的結果,對3D列印機的機械參數進行調整,實作熱床自動調平。G32指令使用的參數與G29指令是一緻的:Snnn,表示測試結果的處理方式。S1表示更新記憶體中的相關參數值(重置系統會丢失),S2表示更新記憶體以及EEPROM中的相關參數值(重置系統不會丢失)。
G32指令執行完成時,不僅Z軸高度參數發生了改變,而且還會根據3D列印機的硬體配置,對熱床進行相應的調平處理。
如果熱床本身是使用步進電機進行高度控制的,那麼程式會自動調整步進電機的位置,使熱床自動調整為平整的狀态;如果熱床本身不能移動(這個應該是更常見的情況),那麼G32指令會在3D列印機記憶體中建構一個轉換矩陣(Transformation matrix),讓未來3D列印機所處理的所有三維空間位置,都先經過這個矩陣的變換,保證在Z=0的情況下,正好與熱床平面完全吻合。由于這裡涉及到高深的計算機圖形學知識,我們就不詳細介紹了。
G32指令,由固件配置
#define FEATURE_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中。
二、即時的G指令
以下指令也可以被緩存, 但是直到所有之前緩存的指令被執行完,并且該指令執行後,才會給出應答。 是以主機會等待指令執行完畢(才收到的應答)。這些指令導緻的短暫停頓不會影響機器的正常性能。
G4: 暫停移動
讓噴頭在目前位置停留一段時間。參數可以為:G4 Pnnn或G4 Snnn。Pnnn表示以毫秒為機關,Snnn表示以秒為機關。
如:G4 P2000與G4 S2完全等價,都表示停頓2秒。
在停頓過程中機器仍可以被控制,如擠出頭溫度。
G20:使用英寸作為機關
執行這條指令後,後面的指令都以英寸作為機關。
G21: 使用毫米作為機關
執行這條指令後,後面的指令都以毫米作為機關。
G90/G91:設定坐标模式
這兩條指令用于設定目前坐标模式為絕對坐标模式(G90)或者相對坐标模式(G91)。沒有參數。
未設定時預設值是絕對坐标模式。我們在這篇教程中,所有的例子也都是以絕對坐标模式給出的。
在相對坐标模式下,每次步進電機XYZE移動之後,目前位置都會重置為0。對于以下兩條G-code指令
G0 X1
G0 X-1
如果3D列印機目前處于相對坐标模式下,那麼X軸步進電機會先向正方向移動一個機關,再向反方向移動一個機關。第二條語句,實際移動距離是1個機關(向X軸反方向)。
而如果3D列印機目前處于絕對坐标模式下,那麼X軸步進電機會先移動到X=1的位置處,再移動到X=-1的位置處。第二條語句,實際移動距離是2個機關(向X軸反方向)。
G92:設定目前位置為某個坐标值
把目前位置設定為某個坐标值,可以用來設定零點,如果參數為空表示把目前位置設定為所有軸的的零點。
如:G92 X10 E90 ;表示把目前位置設定為x=10,噴頭坐标=90
再如:G92 E0 ;表示把目前噴頭坐标設定為0
三、即時的M和T指令
M0:列印機停止
列印機會終止任何動作,然後關機。所有的電機和加熱器都會被關掉,這個時候隻能通過reset按鈕來重新開機控制器。
M1: 列印機休眠
列印機會終止任何動作,然後休眠。所有的馬達和加熱器都會被關掉,但是接收到G或M指令時,列印機可以被喚醒并進入工作狀态。
M3:主軸開啟,順時針旋轉(CNC專用)
如:M3 S4000 ;主軸以4000RPM速度順時針旋轉
M4:主軸開啟,逆時針旋轉(CNC專用)
如:M4 S4000 ;主軸以4000RPM速度逆時針旋轉
M5:主軸關閉(CNC專用)
M7:氣霧冷卻系統開啟(CNC專用)
M8:水冷系統開啟(CNC專用)
M9:所有的冷卻系統關閉(CNC專用)
M10:吸塵系統開啟(CNC專用)
M11:吸塵系統關閉(CNC專用)
M17:啟動所有步進電機
M18:關閉所有步進電機
M20:讀取SD卡根目錄中的檔案
讀取SD卡根目錄的檔案,并通過序列槽輸出檔案名。
M21:初始化SD卡
初始化SD卡。如果在機器通電時插入SD卡,會預設初始化SD卡。開始其他SD卡功能時,SD卡一定要先初始化。本指令相當于檔案系統中執行Mount動作。
M22:解除安裝SD卡
解除安裝SD卡,也就是執行Unmount動作。沒有相關的參數。
M23:選擇SD卡中的檔案
選擇一個SD卡上的檔案。檔案選擇之後,可以執行列印、删除等動作。
如:M23 filename.gcode ;選中filename.gcode檔案
M24:開始列印SD卡中選中的檔案
開始列印通過M23指令選中的檔案。
M25:暫停SD卡列印
暫停列印通過M23指令標明的檔案。
M26:設定目前檔案的目前位置
設定目前檔案的目前位置。參數為:Snnn,表示目前位置的位元組數。
比如我要從目前檔案的100位元組開始寫入資料,那麼就要先用本指令跳到100位元組處。
M27:報告SD卡列印進度
擷取SD卡列印進度。沒有相關參數。
M27指令的輸出,格式為:
SD printing byte 11518/1127578
這條指令供上位機擷取目前的3D列印進度資訊,用于顯示在電腦界面上。
M28:開始往SD卡檔案中寫入資料
接收到此指令後,後續接收到的指令(除了M29)都會被當成資料寫入該檔案。
指令後面會跟着檔案名,如果檔案不存在則會被建立,如果存在則會被覆寫。接收到這條指令後,後續接收到的指令都會被寫入該檔案中,直到接收到M29指令。
如:M28 filename.gcode
M29:停止往SD卡檔案中寫入資料
接收到此指令後,後續接收到的指令要開始正常執行。
M30:删除SD卡中的檔案
如:M30 filename.gcode ;删除filename.gcode檔案
M32:建立子目錄
在SD卡上建立一個子目錄。參數為:filename,表示待建立的子目錄(包含目錄名,以/分隔);
以上所有SD卡相關指令,都由固件配置
define SDSUPPORT 1
決定是否開啟。如果固件不需要支援SD卡,關閉這項固件配置,可以節省不少記憶體空間。
M42:直接讀寫端口
此指令直接讀/寫一個Arduino端口,為3D列印控制軟體上位機擴充程式功能提供基礎。參數包括:
Pnnn表示Arduino的輸入/輸出端口;輸出時固件程式會同時輸出到數字端口和模拟端口;輸入時固件程式會從數字端口輸入;
Snnn表示寫入輸出端口的值,0到255之間是合法的數字;當S參數不存在的時候,M42指令起輸入作用;
Repetier-firmware固件中預先定義了一個表格,稱為“敏感端口表格”,所有位于這個表格内的端口,也就是目前已經被步進電機、限位開關以及熱敏電阻占用的端口,都不能被M42指令影響。其他目前未占用的端口,可以由這條指令進行IO操作。
M43: Stand by on material exhausted
M82/M83:設定擠出頭步進電機坐标模式
與G90/G91指令類似,這兩條指令用于設定擠出頭目前坐标模式為絕對坐标模式(M82)或者相對坐标模式(M83)。沒有參數。
未設定時預設值是絕對坐标模式。
需要注意的是,G90/G91設定的坐标模式,同時對XYZE四個軸起作用,但M82/M83設定的坐标模式,隻對E軸(擠出頭步進電機)起作用。
M84:設定步進電機自動關閉時間
當3D列印機一段時間沒有接收到步進電機運動指令之後,3D列印機(為了節能)會自動關閉步進電機。使用M84指令,可以設定這個自動關閉步進電機的時間。參數包括:Snnn,表示步進電機關閉的時間,以秒為機關。
如果使用M84時沒有指定S參數,則步進電機會立即關閉。
M84指令的預設值是360秒。在固件配置中,預設值由
#define STEPPER_INACTIVE_TIME 360L
控制。
M85:設定3D列印機自動關閉時間
當3D列印機一段時間沒有接收到指令之後,3D列印機(為了節能)會自動關閉步進電機以及擠出頭、熱床等裝置。使用M85指令,可以設定這個自動關閉3D列印機的時間。參數包括:Snnn,表示在關閉步進電機之前步進電機沒有活動的時間,以秒為機關。
如果使用M85時沒有指定S參數,或者使用了S0參數,則代表取消3D列印機自動關閉功能,擠出頭、熱床等在工作完成之後,一直會處于目前狀态,而不會被自動關閉。
M85指令的預設值是0(不自動關閉)。在固件配置中,預設值由
#define MAX_INACTIVE_TIME 0L
控制。
M92: 設定AXIS_STEPS_PER_UNIT參數(Sprinter和Marlin固件)
設定步進電機移動1mm對應的脈沖數,可脫機儲存.。在校準的時候非常有用,不用每次都修改程式,然後重新下載下傳。
參數包括:
Xnnn,表示X軸的分辨率;
Ynnn,表示Y軸的分辨率;
Znnn,表示Z軸的分辨率;
Ennn,表示E軸(擠出機步進電機)的分辨率;
M98: 擷取 axis_hysteresis_mm 參數
M99: 設定 axis_hysteresis_mm 參數(Marlin固件)
Example: M99 X<mm> Y<mm> Z<mm> E<mm>
重新設定hysteresis值.。我們知道齒輪等機械結構,在轉換方向時候都會有滞後現象。你可以測量在他們在轉換方向的時候有多長的距離是丢失掉的,然後把它寫入hysteresis值,這樣之後的轉向運動,機器将會進補償運動,來彌補這些誤差。
M99:暫時關閉步進電機(其他)
M99指令可以暫時關閉XYZ軸步進電機一段時間。指令參數包括:
Snnn表示所需暫時關閉步進電機的時間,以秒為機關;
X表示暫時關閉X軸步進電機;
Y表示暫時關閉Y軸步進電機;
Z表示暫時關閉Z軸步進電機;
如果S參數沒有指定,則暫時關閉10秒鐘時間。暫時關閉時間到達之後,重新打開相應軸的步進電機。
M104:設定擠出機(噴頭)溫度
設定擠出頭的目标溫度。執行這條指令後,不需要等待達到這個溫度,控制闆繼續執行下一條G-code語句。相關參數包括:
Snnn,表示目标溫度;
Tnnn,表示對應的擠出頭;
P,表示要等待前面的指令完成之後,再開始設定擠出頭溫度;
Fnnn,表示到達目标溫度之後,是否觸發蜂鳴器。F1表示要觸發;
如果執行指令時沒有帶T參數,則針對目前擠出頭設定目标溫度。
如:M104 S190 ;将擠出機的溫度設定為190度
M105: 擷取目前溫度(機關:℃)
擷取目前溫度值,包括擠出頭和熱床的溫度。相關參數包括:
X,表示輸出ADC測量的原始值;
M105指令的輸出,格式為:
T:18.97 /0 B:18.75 /0 [email protected]:0 @:0
可以看到,T:之後的部分,代表擠出頭的目前溫度/目标溫度;B:之後的部分代表熱床的目前溫度/目标溫度。
在PID溫度控制模式下,[email protected]:後面的數字代表熱床目前的輸出強度,是一個0~255的值,@:後面的數字,代表擠出頭目前的輸出強度,也是一個0~255的值。例子中,擠出頭、熱床都處于關閉狀态,是以這個位置的值都是0。
M106: 打開風扇
如:M106 S127 ;打開風扇(半速)。'S'表示 PWM值 (0-255). 可簡單了解為:風扇有0-255級強度可選,其中 M106 S0 意味着風扇将被關掉。
在固件配置中,定義
#define FEATURE_FAN_CONTROL 1
表示支援風扇控制功能,在編譯中會包含相關的代碼。
M107: 關閉風扇
不推薦. 請用M106 S0 代替。
M108: 設定擠出機速度
設定擠出機電機的轉速 (不推薦,請使用 M113)
M109: 等待擠出頭加熱達到目标溫度
設定擠出頭的目标溫度,并等待達到這個溫度。相關參數包括:
Snnn,表示目标溫度;
Tnnn,表示對應的擠出頭;
Fnnn,表示到達目标溫度之後,是否觸發蜂鳴器。F1表示要觸發;
如果執行指令時沒有帶T參數,則針對目前擠出頭設定目标溫度。
如: M109 S185 ;等待擠出頭加熱到185度
M110: 設定目前的行碼
設定目前行為第123行. 然後,接下來會執行第124行的指令。
M111:允許/禁止運作時調試标志
運作時調試标志是一組布爾值,一共有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),在這個模式下,所有對步進電機的移動指令,都會被忽略;
M112: 緊急停止
所有進行中的動作都會被立即終止,然後關掉Reprap. 所有電機和加熱器都會被關掉. 可以按Reset按鈕(闆上)以重新開機.
M113: 設定擠出機的 PWM
M114: 擷取擠出頭目前位置
輸出擠出頭目前位置。沒有相關的參數。
M114指令的輸出,格式為:
X:20.00Y:30.00Z:10.000E:0.0000
M115: 擷取3D列印機資訊
輸出3D列印機資訊。沒有相關的參數。
M115指令的輸出,格式為:
FIRMWARE_NAME:Repetier_0.92.3FIRMWARE_URL:…Printedfilament:0.00mPrintingtime:0days0hours0minSpeedMultiply:100FlowMultiply:100
第一行是固件的版本資訊,很長,沒有列完整。第二行是已經列印了多少米耗材,列印時間是幾天幾小時幾分鐘。第三行是速度系數,參考M220指令。第四行是流率系數,參考M221指令。
M116: 等待溫度達到目标溫度
等待所有擠出頭/熱床到達由之前的M104/M140指令所指定的目标溫度。沒有相關參數。
M117: 在液晶上顯示消息
如:M117 Hello World ;在液晶上顯示Hello World
M118: Negotiate Features
M119: 輸出限位開關狀态
将目前限位開關狀态輸出。沒有相關的參數。
M119指令的輸出,格式為:
endstopshit:x_min:Ly_min:Lz_min:L
列出了XYZ三個軸的低位限位開關的目前狀态。L代表限位開關沒有觸發。H代表限位開關被觸發了。
M120:測試蜂鳴器
使蜂鳴器發出蜂鳴聲。參數為
Snnn表示發出聲音/不發出聲音的時間,以毫秒為機關;
Pnnn表示重複的次數;
如果3D列印機有蜂鳴器,而且是無源蜂鳴器,那麼通過S參數和P參數的組合,可以得到不同頻率的聲音。比如
M120 S24 P8
可以得到一個較長的蜂鳴聲。如果3D列印機的蜂鳴器是有源蜂鳴器,那麼M120指令隻能控制蜂鳴時間,不能控制蜂鳴器的聲音頻率。
M121: Pop
M126: Open Valve
M127: Close Valve
M128: Extruder Pressure PWM
M129: Extruder pressure off
M130: 設定 PID P 值
M131: 設定 PID I 值
M132: 設定 PID D 值
M133: Set PID I limit value
M134: Write PID values to EEPROM
M136: Print PID settings to host
M140 設定熱床目标溫度
設定熱床的目标溫度。執行這條指令後,不需要等待達到這個溫度,立即開始執行下一條G-code語句。相關參數包括:
Snnn表示目标溫度;
Fnnn表示到達目标溫度之後,是否觸發蜂鳴器。F1表示要觸發;
M141: Chamber Temperature (Fast)
M142: Holding Pressure
M143: 設定最大熱頭溫度
M160: Number of mixed materials
M190: 等待熱床加熱達到目标溫度
設定熱床的目标溫度,并等待達到這個溫度。相關參數包括:
Snnn,表示目标溫度;
Fnnn,表示到達目标溫度之後,是否觸發蜂鳴器。F1表示要觸發;
M200:設定體積擠出模式
将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的耗材。)同時,下位機要使用下面的語句:
M200 T0 D0.4
将實際的擠出頭噴頭直徑設定為0.4mm。同時在上位機和下位機進行這樣的操作之後,3D列印機可以在E軸參數機關為mm3的情況下,正确完成列印操作。
M201/M202:設定最大加速度
這兩條指令設定列印加速度。包括擠出頭工作時(列印中)的運動加速度(M201),以及擠出頭不工作時(移動中)的運動加速度(M202)。參數為
Xnnn,表示X軸的加速度;
Ynnn,表示Y軸的加速度;
Znnn,表示Z軸的加速度;
Ennn,表示E軸的加速度;
在固件配置中,定義
#define RAMP_ACCELERATION 1
表示支援加速度功能,在編譯中會包含相關的代碼。
M203:監控溫度
使用序列槽輸出監控3D列印機的溫度。參數為
Snnn表示是否監控,S0關閉監控,S1打開監控;
當監控處于打開狀态,可以從序列槽定時擷取目前的溫度資訊。
監控輸出格式與M105指令的輸出結果完全一緻。
M204:設定PID參數
設定擠出頭溫度控制的PID參數,指令參數為
Snnn表示對應的擠出頭,無S參數表示使用目前擠出頭;
Xnnn表示P參數;
Ynnn表示I參數;
Znnn表示D參數;
M207:修改抖動(Jerk)值
修改目前的最大抖動值。指令參數為
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。
M208: 設定XYZ軸行程的限制
M209:開啟/關閉自動回抽
開啟/關閉自動回抽功能。指令參數為
Snnn表示是否開啟自動回抽功能,1表示開啟,0表示關閉;
通常上位機切片器負責在合适的位置處加入回抽指令。如果你的切片器功能比較弱,不能加入合适的回抽指令,那麼可以打開這個特性,由固件自動回抽。
在固件配置中,定義
#define FEATURE_RETRACTION 1
表示支援自動回抽功能,在編譯中會包含相關的代碼。
M220:設定速度
設定3D列印機運作速度系數。指令參數為
Snnn表示系數,是一個百分數,如果S參數不存在,則使用預設值100;
3D列印機運作速度系數,是一個在25%到500%範圍内變化的值。這個系數值在3D列印機運作過程中,與切片器給出的3D列印機運動速度基礎值相乘,得到最終的3D列印機實際運動速度值。
M220指令的輸出,格式為:SpeedMultiply:100
M221:設定流率
設定3D列印機的流率系數(Flow rate)。指令參數為
Snnn表示系數,是一個百分數,如果S參數不存在,則使用預設值100;
3D列印機流率系數,是在上位機切片軟體通過耗材直徑、噴頭直徑、層高以及3D列印速度等因素綜合計算得到的E軸運動速度的基礎上,疊加的一個E軸運動速度系數。簡單地說,就是控制擠出頭耗材擠出量的多少。這個系數可以在25%到500%範圍内變化。
M221指令的輸出,格式為:FlowMultiply:100
M226: Gcode Initiated Pause
M227: Enable Automatic Reverse and Prime
M228: Disable Automatic Reverse and Prime
M229: Enable Automatic Reverse and Prime
M230: Disable / Enable Wait for Temperature Change
M240: Start conveyor belt motor / Echo off
M241: Stop conveyor belt motor / echo on
M245: 打開風扇
M246: 關閉風扇
M251:将目前Z軸位置儲存為Z軸高度值
這條指令可以将目前的Z軸位置儲存為Z軸高度值,以使前面的Z軸高度手動/自動測量的結果起作用。通常,M251指令隻工作在三角洲機型上,并且應該與G29指令聯合使用(自動測量Z軸高度)。這條指令沒有相關的參數。
當3D列印機打開EEPROM支援時,這條指令還會将Z軸高度值同時儲存在EEPROM中。
隻有當固件配置定義
#define Z_HOME_DIR -1
也就是Z軸向正方向歸位,并且定義
#define MAX_HARDWARE_ENDSTOP_Z true
也就是存在硬體的Z軸高位限位開關時,M251指令才會在編譯中包含相關的代碼。
通常,隻有三角洲類型的3D列印機才能滿足這兩個條件限制。
M280:多頭重複列印模式設定
有些特殊配置的3D列印機,允許2~4個擠出頭同時工作,并且這些擠出頭動作完全一緻,同時列印出多件完全一樣的列印件,這種工作模式叫做多頭重複列印模式(Ditto mode)。M280指令對這個模式進行設定。指令參數為
Snnn表示這個模式下的擠出頭個數;S0表示關閉多頭重複列印模式;S1S3表示工作在多頭重複列印模式下,并且3D列印機擁有額外的13個擠出頭。
在固件配置中,定義
#define FEATURE_DITTO_PRINTING 1
表示支援多頭重複列印模式功能,在編譯中會包含相關的代碼。
M281:測試硬體看門狗功能
這條指令用于測試CPU硬體中的看門狗功能。實際上,就是造成一個死循環,不再執行“喂狗”動作,進而觸發CPU硬體看門狗,最終(故意地)造成3D列印機重新開機。這條指令隻是用于3D列印機固件開發測試。
M300: 播放提示音
M301: Set PID parameters - Hot End
M302:設定是否允許冷擠出
為了保護3D列印機的擠出頭,通常設定下,E軸的運動必須在擠出頭加熱到一定溫度之後才被允許。在擠出頭冷卻的情況下,所有的E軸運動指令是被3D列印機固件忽略的。但有些情況下我們需要在擠出頭冷卻的情況下運動E軸,這時可以通過M302指令進行設定。指令參數為
Snnn表示是否允許冷擠出,S0表示不允許,S1表示允許,沒有S參數預設表示允許;
M302指令的輸出,為目前是否允許冷擠出。允許時會輸出:Cold extrusion allowed
不允許時會輸出:Code extrusion disallowed
M303:自動測試PID參數
自動測試PID參數值。指令參數為
Pnnn表示待測試的擠出頭編号,從0開始,P<擠出頭個數>代表待測試的是熱床;
Snnn表示列印溫度;
Rnnn代表重複測試次數;
X代表是否儲存于EEPROM中;
由于加熱、散熱需要較多時間,這條指令執行時間很長。
M304: Set PID parameters - Bed
M320/M321:開啟/關閉自動調平
開啟(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指令相同,由固件配置
#define FEATURE_AUTOLEVEL 1
決定是否開啟。
M322的輸出結果為:
Info:Autolevelmatrixreset
表示自動調平轉換矩陣已經被清零。
M330:測試蜂鳴器
測試(無源)蜂鳴器,産生一個特定頻率的聲音。指令參數為
Snnn表示聲音的頻率;
Pnnn表示聲音持續的時間,以毫秒為機關;
如果指令沒有包含S參數或者P參數,則會使用預設值S1以及P1000。
M400:等待目前所有移動指令完成
等待在3D列印機記憶體中待處理的移動指令執行完成。沒有相關的參數。
執行這條語句之後,可以保證在下一條G-code指令執行時,所有步進電機都不處于運動狀态中。
M401:儲存目前的位置
将目前位置,包括XYZE步進電機,儲存于記憶體的一組專用變量中。未來可以用M402指令恢複這組位置。沒有相關的參數。
M402:恢複之前儲存的位置
恢複之前由M401指令儲存的位置值。指令參數為
X表示恢複X位置;
Y表示恢複Y位置;
Z表示恢複Z位置;
E表示恢複E位置;
Fnnn表示使用參數給定的速度,無F參數時使用目前速度值;
M600:更換耗材
在擁有顯示屏的3D列印機上,啟動更換耗材向導界面。沒有相關的參數。
通常,這個向導界面是從顯示屏界面上觸發的。M600指令提供一個接口,使更換耗材向導界面可以從上位機軟體觸發。
M601:暫停/恢複擠出頭
暫停或者恢複擠出頭。指令參數為
Snnn表示暫停或者恢複,S1表示暫停擠出頭,S0表示恢複擠出頭工作;
暫停擠出頭包括停止擠出頭加溫以及停止擠出頭步進電機工作。恢複則相反,加熱擠出頭到原來的溫度。
T: 設定目前擠出頭
對于擁有多個擠出頭的3D列印機來說,需要使用T指令選擇目前工作的擠出頭。這條指令的參數值直接跟在T後面即可。例如:
T0表示選擇第一個擠出頭;
T1表示選擇第二個擠出頭;
參數是T指令最特殊的一點。這與其他所有的G-code指令都不相同。
四、輔助步進電機指令
一些3D列印機的機械設計,會在XYZE四個步進電機軸之外,使用更多的輔助步進電機。Repetier-firmware提供了一套輔助步進電機指令,讓使用者(以及上位機軟體)可以操作這些輔助步進電機。由于輔助步進電機的用途、參數各異,為了讓這套指令更加通用,這些指令被設計為非常簡單的形式。
G201:移動步進電機位置
将步進電機P的位置移動到X位置處。參數包括:
Pnnn表示第P個輔助步進電機;
Xnnn表示這個步進電機的目标位置;
這條指令與G1指令非常類似。
G202:設定目前位置
将X位置設定為步進電機P的目前位置。不實際移動步進電機。參數包括:
Pnnn表示第P個輔助步進電機;
Xnnn表示這個步進電機的目前位置;
這條指令與G92指令非常類似。
G203:報告目前位置
報告步進電機P的目前位置。參數包括:
Pnnn表示第P個輔助步進電機;
這條指令與M114指令非常類似。
G203 開啟/關閉步進電機
用于開啟/關閉步進電機P。參數包括:
Pnnn表示第P個輔助步進電機;
Snnn表示開閉标志,S0表示關閉步進電機,S1表示開啟步進電機;
步進電機開啟後,有兩種可能的狀态。一種是“運動”狀态,也就是正在進行正向或反向的旋轉。另一種是“保持位置”狀态,也就是保持目前的位置不變。雖然步進電機關閉也不會主動移動位置,但“保持位置”狀态與步進電機關閉狀态仍有顯著的差別。“保持位置”狀态下,當步進電機受力時,會産生一個反向的力矩,使步進電機位置保持不變。
這條指令與“節能管理”一節中的M84指令有關。M84指令用于關閉XYZE步進電機,但不能打開這些步進電機。
五、設定與EEPROM管理
固件的設定,是一個比較有趣的話題,很多玩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:輸出EEPROM設定
輸出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)。
M206:修改EEPROM設定
修改EEPROM中的某個值。指令參數為
Pnnn表示待修改的值的位置(即EEPROM中的位址);
Tnnn表示值的類型,0代表8bit整數類型,1代表16bit整數類型,2代表32bit整數類型,3代表32bit浮點類型;
Snnn表示值,隻能帶整數,用于T為0, 1, 2的情況;
Xnnn表示值,隻能帶浮點數,用于T為3的情況;
可以看出,M206指令的使用是很複雜的,需要了解EEPROM中數值的存儲位置以及數值類型,才能進行有效的修改。是以小編建議除非你完全了解M206指令的含義,否則不要使用這個指令。
M360:輸出固件配置資訊
輸出固件配置資訊。沒有相關參數。
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
參考:
1、https://www.baidu.com/link?url=bszFzxZ32hnxvH9RulYAwVGtKAyoMFRhnC53ipsvZs5DopdZ_2W3P7glJ2TjzHOp&wd=&eqid=b24f850900187bb3000000035de9b34d
2、https://www.cnblogs.com/mazhenyu/p/10711939.html
3、http://linuxcnc.org/docs/2.6/html/gcode/gcode.html#_conventions