從Marlin設定看3D列印機 - Configuration.h 基礎篇

Marlin是目前3D列印最風行的軔體之一
大部份DIY套件都是以Marlin為核心
一些常見的商業機種也是Marlin去發展的
Marlin的原始碼可以從以下網址獲得
https://github.com/MarlinFirmware
這篇文章從Marlin最主要的設定檔 Configuration.h 切入來看3D列印機的組成
本篇Marlin版本: 1.1.0 - RC8
跟硬體有關的部份以Arduino Mega2560 + Ramps 1.4為主


Configuration.h是Marlin主要的設定檔
https://github.com/MarlinFirmware/Marlin/blob/RC/Marlin/Configuration.h
各家提供的Marlin軔體有99%都是差在這個設定檔
了解這個檔案可以幫助你更了解你的列印機是如何組成

以下主要講解基礎設定,有沒講到的部份表示那是進階設定
或一般機種不會有那個東西,預設都是關閉的


0.選擇你的機器

在Marlin的sample_configurations/目錄下
預先為幾種機型準備了設定檔
Marlin主要支援以下幾種類型的機器

(1) 笛卡兒型(Cartesio) 被稱作XYZ型 馬達的 機械運動是以三軸XYZ的方向進行動作

Prusa i3 , Ultimaker , MakerBot , InfintyX1都是這型

(2) CoreXY 理論上屬於笛卡爾型,但是因為驅動式比較沒那麼直觀,XY移動是兩個馬達聯動的,所以獨立一個項目,CoreXY沒有準備好的預設檔,需要自行設定

(3) 三角洲型(Delta) 機身呈三角型 ,以三個機械臂移動效應器的機構

Kossel系列 , 台灣的Atom , Flux都是這型

(4) 機械臂(SCARA)

機構看起來像機械臂,因為這型目前DIY存在零件工藝的問題所以很少人在玩(工業自動化生產很多)
預設的configutations.h是XYZ型
其它特定型號的可以忽略 ,基本上都是上面三種之一



1.連線設定



SERIAL_PORT是設定你想要用哪個Serial Port進行設定

#define SERIAL_PORT 0
#define BAUDRATE 250000

MEGA2560有四組Serial Port
0就是預設的port , USB連線也是這個Port , 如果改成0以外的設定
就不能跟PC連線進行控制了(只能燒軔體)
但是以Ramps 1.4來說 只有0跟2是可以用的
因為1和3的腳位被挪作它用了

BAUDRATE是俗稱鮑率 SerialPort的連線速度設定
控制器需與韌體設定一致
這個數字基本上越快越好
使用Serial Port進行操控時必須與控制端參數一致

2.主機板設定



設定你所使用的主機板 編譯時會依據你所選的主機板設定對應的腳位同一種主機板有不同設定

主機板定義在boards.h

https://github.com/MarlinFirmware/Marlin/blob/RC/Marlin/boards.h

以Ramps 1.4為例
在Boards.h定義如下

#define BOARD_RAMPS_14_EFB 43
#define BOARD_RAMPS_14_EEB 44
#define BOARD_RAMPS_14_EFF 45
#define BOARD_RAMPS_14_EEF 46
#define BOARD_RAMPS_14_SF 48

BOARD_RAMPS_14_SF似乎是CNC機台的設定,這邊先不用理會
前面幾組設定差異主要在Ramps 1.4板子 MOSFET輸出的設定



E = Extruder(Hotend) = 擠出機加熱頭
F = Fan = 模型風扇(對著模型吹的那個風扇,不是吹散熱片那個)
B = Bed = 熱床

你的列印機有一個噴嘴 一個風扇 一個熱床
那就要選擇BOARD_RAMPS_14_EFB
然候把你的加熱頭接到D8 風扇接到D9 熱床接到D10
如果有兩個噴嘴一個熱床 就選BOARD_RAMPS_14_EEB
就把第一個加熱頭接到D8 第二個加熱頭接到D9 熱床接到D10
模型風扇就要另外找外接模組處理


3.擠出機設定

#define EXTRUDERS 1
#define SINGLENOZZLE

EXTRUDERS 設定你的機器有幾組噴嘴和擠出機

SINGLENOZZLE 如果你的機器是多個擠出機對一組噴嘴,請啟用這個設定
 




你的擠出機數量 通常是1
有多組擠出機要在這裡設定數量
如果你是多組擠出機對應一個噴嘴的機種,請反註解掉這個選項
例如這個 E3D Cyclops



4.電源設定




Marlin支援電源供應器有三種

0 = 就是一般使用開關打開的電源供應器
1 = ATX 就是電腦用的 如果想用M80/M81來開關電源就使用這種
2 = XBOX360 如果使用XBOX360電源來改裝就用這種



5.電阻設定

設定加熱頭和熱床溫度感應種類

#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0
#define TEMP_SENSOR_BED 0
TEMP_SENSOR_BED是熱床
TEMP_SENSOR_0~3是最高支援四組噴嘴的設定
種類表列在參數上方 簡略說明一下

1:100k thermistor - best choice for EPCOS 100k (4.7k pullup)

5:100K thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (4.7k pullup)

1是常見的Beta=3950的電阻,便宜的都是這型
5是一些國外原廠的噴頭用的,例如原版E3D , J-Head
設定電阻Type前,請先確定pullup數值 一般Ramps衍生的都是4.7K
也有部份使用1k 例如Ramps-FD
這個數字請看電路圖如下



以下為設定溫度保護上下限
當溫度低於設定或高於設定,就會自動停機
直到機器被重置(Reset)
最低溫度:
#define HEATER_0_MINTEMP 5
#define HEATER_1_MINTEMP 5
#define HEATER_2_MINTEMP 5
#define HEATER_3_MINTEMP 5
#define BED_MINTEMP 5


最高溫度:
#define HEATER_0_MAXTEMP 275
#define HEATER_1_MAXTEMP 275
#define HEATER_2_MAXTEMP 275
#define HEATER_3_MAXTEMP 275
#define BED_MAXTEMP 150


PID設定





此處為設定噴嘴PID,預設是開啟
PID可以視為一種現代的溫度控制演算法
影響此PID有三個參數kP , kI , kD 預設是Ultimaker所使用的參數

一般列印機在組裝完成後,應進行PID的校調
確保加熱可以達到最佳效能,未校調可能在維持溫度過程會比較不穩定

有關PID校調可以參考以下影片
https://www.youtube.com/watch?v=APzJfYAgFkQ&t=188s

此處簡單說明
GCode校準PID指令如下
以E3D V6為例 建議指令如下(有鐵氟龍內襯的請先把內襯拿掉再進行校正)

M303S230C10

M303:GCode指令
S230:以230度為基準進行效調
C10:進行10輪測試

可以視自己需要進行調整
接下來Marlin會進行一段時間的加熱校正

校正完成後會將完成參數輸出
將輸出參數複製到程式碼下面

#define DEFAULT_Kp 22.2
#define DEFAULT_Ki 1.08
#define DEFAULT_Kd 114

覆蓋掉即可
另外熱床部分也有PID可以設定



但預設是關閉的
要啟用請將這一行
#define PIDTEMPBED
給反註解掉

如果沒有啟用PID,溫度控制就只是單純的開關溫控(最簡單的例子:你家的大同電鍋)
有PID才會使用PWM控制
這邊要注意,如果你的熱床因為大電流使用了繼電器Relay進行控制
此處不要啟用PID,不然你會聽到你的繼電器出現北斗神拳的音效
假如你的熱床電流大又想使用PWM,請使用外接大電流MOS模組,或者固態繼電器



6.限位開關設定




以XYZ型為例
每個軸都有MAX和MIN的限位開關可以設定,使用哪些限位開關視機械結構而定
常見的烈印機一個軸通常都只有一個限位開關
限位開關的用途是限制噴頭移動範圍,以及給機器移動一個基準點(歸零點)
第一個部是設定你這台機器用了哪些限位開關


預設的範例是三軸皆始用MIN
#define USE_XMIN_PLUG
#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG

使用那組開關需將該組開關反註解
例如要用Y_MAX需將
// #define USE_YMAX_PLUG
前面的//拿掉改為
#define USE_YMAX_PLUG


接下來是設定限位開關是否全部使用內部PULL UP電阻
Mega 2560內建上拉電阻 啟用的話可以不用外加
#define ENDSTOPPULLUPS

為所有限位開關通通使用上拉電阻
也可以各別設定

所謂Pull Up電阻的線路如下






那根4.7k就是Pull Up電阻

這個線路表示沒觸發前是高電位(5V) 開關接通後是低電位(GND)


如果不是全部使用可以在下面項目各別啟用
最後需設定的是是否反轉開關邏輯

#define X_MIN_ENDSTOP_INVERTING false
#define Y_MIN_ENDSTOP_INVERTING false
#define Z_MIN_ENDSTOP_INVERTING false
#define X_MAX_ENDSTOP_INVERTING false
#define Y_MAX_ENDSTOP_INVERTING false
#define Z_MAX_ENDSTOP_INVERTING false
#define Z_MIN_PROBE_ENDSTOP_INVERTING false

預設的邏輯是開關沒按下前是低電位,按下後是高電位=(5v or 3.3v)
反轉後則表是沒按下前是高電位,按下後是低電位(=0v)

此處設定須視機器開關設定去做設定



7.動作設定





DEFAULT_AXIS_STEPS_PER_UNIT
設定動作所需要的微步數,需根據機器去修改 計算前請先確定自己所使用的零件參數
此數字定義為:移動1mm所需要的步數

以XYZ機種為例
皮帶驅動XY軸範例:


GT2皮帶
20齒同步輪
GT2皮帶齒距2mm 一圈20齒表示轉一圈移動40mm
步進馬達步進角 1.8度
步進驅動16微步
表示轉一圈需要(360/1.8) * 16 = 3200步
此軸移動1mm需要3200 / 40 = 80步
此軸數字需設為80

螺桿驅動Z軸範例:

螺桿導程8mm 表示轉一圈會移動8mm
步進馬達步進角 1.8度
步進驅動16微步
表示轉一圈需要(360/1.8) * 16 = 3200步
此軸移動1mm需要3200 / 8 = 400步
此軸數字需設為400

擠出機設定範例:

MK8擠出齒輪 齒輪部直徑7.43mm
圓周為7.43 * PI = 23.34mm
步進馬達步進角 1.8度
步進驅動16微步
表示轉一圈需要(360/1.8) * 16 = 3200步
此軸移動1mm需要3200 / 23.34 = 137.1步
此軸數字需設為137.1

DEFAULT_MAX_FEEDRATE
移動最大速度,限制機器的最大移動速度,可以避面因為切片軟體設定速度過快而失步

計算方法:
硬體+軔體所能提供的最大速度 / 動作微步數

mega 2560 + marlin來說所能提供的最大脈衝數為40k/s
如果是Due可以到303k/s
例如你的X軸移動1mm需要80步
那你的X軸理論移動極速為40000/80 = 500 mm/s

但需注意這是理論值,實際上因為Marlin會有一些額外的控制,例如圖形12864 LCD

所以這裡計算出來的數字最好打個七八成

Marlin所做的工作越少,越可以接近理論數字
上面例子來說X軸MAX FEEDRATE最好設為350~400為適當

DEFAULT_MAX_ACCELERATION

加速度設定

一般來說不用動

如果你的特定軸速度過快,印轉角有衝過頭的現象可以減少這個軸的加速度來改善

另外加速度比較低,電機動作會比較安靜





X_ENABLE_ON
Y_ENABLE_ON
Z_ENABLE_ON
E_ENABLE_ON

這是設定馬達驅動的Enable是高電位還是低電位
常見的A4988或DRV8825是0 LV8728是1

INVERT_X_DIR
INVERT_Y_DIR
INVERT_Z_DIR
INVERT_E0_DIR
...

這是設定移動的方向,需視機器設計而定
true / false是不同的方向
如果發現機器移動方向不對 例如控制X +10移動卻是反方向
就修改這邊的設定





#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR -1

設定G28歸零的方向
1是MAX -1是MIN
看機器的限位開關設計決定這邊的設定


#define X_MIN_POS 0 

#define Y_MIN_POS 0 
#define Z_MIN_POS 0 
#define X_MAX_POS 200 
#define Y_MAX_POS 200 
#define Z_MAX_POS 200

設定機器的列印範圍
以上兩個項目要一起看,這兩項設定會決定列印空間的位置
列印空間一般來說 左下角為(0,0) 左上為(0,Y_MAX) 右下為(X_MAX , 0) 右上為(X_MAX , Y_MAX)
噴頭接觸到底板為Z=0 , 最高列印高度為Z_MAX
歸零位置是看機器設定上噴嘴是停在什麼位置
以Ultimaker為例,噴嘴歸靈位置是在左上 平台停在機器底部(離噴嘴最遠)
所以這邊就要設定

#define X_HOME_DIR -1 // X_MIN
#define Y_HOME_DIR 1 // Y_MAX
#define Z_HOME_DIR 1 // Z_MAX

歸零後,會根據MIN_POS和MAX_POS決定列印的最大與最小移動範圍

X最大移動範圍就是以歸零後的位置為基準點 
設定此點為X_MIN_POS,最大可以移動到X_MAX_POS

Y最大移動範圍就是以歸零後的位置為基準點 
設定此點為Y_MAX_POS,最小可以移動到Y_MIN_POS


8.EEPROM設定




啟用EEPROM可以將一些設定儲存下來,另外也可以直接在面板上調整機器的一些組態(啟動後面板會多出一些可以設定的選項)
如果沒有啟用,則只能透過重新燒錄軔體來修改機器參數
Mega2560有內建EEPROM
但Due沒有,如果使用Due記得先確定使用的板子有額外加上EEPROM
使用方法只需將#define EEPROM_SETTINGS反註解即可


這邊要注意,一但啟用EEPROM,如果你修改了機器參數(例如馬達微部,列印尺寸等等)
重新燒錄軔體後,須對機器下gcode
M502(重置所有設定) + M500(儲存設定至EEPROM)
不然你會發現你的機器參數還是保持在上傳韌體之前的狀態

留言

  1. 非常感謝整理 以前只知道要調整設定 卻不太清楚代表的意思 現在比較明瞭了

    回覆刪除
  2. 這些資訊幫助很大,謝謝您

    回覆刪除
  3. 加油!! 現在大部分的3D列印書籍都是寫給從零開始的初學者看的,像這樣更進階更系統化的3D列印機知識很少有人再整理,希望有一天能看到板主出書!

    回覆刪除
  4. 請問如果我沒有用熱床的話
    要怎麼改寫程式?

    回覆刪除
    回覆
    1. 如果只是單純沒接熱床的話不需要改寫
      切片軟體設定不要開熱床就好
      如果熱床接頭要拿去做成別的功能就要修改所使用的板子類型或者自己定義pin

      刪除
  5. 我想請問Z軸上升下降的程式語法是在哪段(DLP作動)??能幫忙解惑一下嗎

    回覆刪除
    回覆
    1. 作者已經移除這則留言。

      刪除
    2. 不太確定你要問的是什麼
      要問GCode怎麼下還是移動Z的程式碼?
      要找程式碼要從marlin_main.cpp去追喔

      刪除
  6. 我想問一下 假如我的馬達是a4988
    那關於這行程式我該如何做修改
    //#define CONFIG_STEPPERS_TOSHIBA

    回覆刪除
  7. 請問是否也能寫一個delta機型的教學呢?謝謝

    回覆刪除
  8. 你好,
    請問如果想改成寫字機的話z軸應該要怎麼改 目前是想要讓z軸裝一個伺服馬達。

    回覆刪除
  9. Arduino:1.6.9 (Windows 8.1), 板子:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

    In file included from sketch\MarlinConfig.h:42:0,

    from sketch\G26_Mesh_Validation_Tool.cpp:27:

    SanityCheck.h:1278: error: #error "Enable USE_XMIN_PLUG when homing X to MIN."

    #error "Enable USE_XMIN_PLUG when homing X to MIN."

    ^

    exit status 1
    #error "Enable USE_XMIN_PLUG when homing X to MIN."

    This report would have more information with
    "Show verbose output during compilation"
    option enabled in File -> Preferences.

    請問我該怎麼修改阿

    回覆刪除
    回覆
    1. // Delta and Cartesian use 3 homing endstops
      #if !IS_SCARA
      #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG)
      #error "Enable USE_XMIN_PLUG when homing X to MIN."
      #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG)
      #error "Enable USE_XMAX_PLUG when homing X to MAX."
      #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG)
      #error "Enable USE_YMIN_PLUG when homing Y to MIN."
      #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG)
      #error "Enable USE_YMAX_PLUG when homing Y to MAX."

      刪除
    2. 你設定要歸零到X MIN
      但是沒有設定X MIN的限位開關
      檢查一下configuration.h裡面 USE_XMIN_PLUG是否有啟用

      刪除
    3. 我搜尋找不到下面這些耶
      #define USE_XMIN_PLUG
      #define USE_YMIN_PLUG
      #define USE_ZMIN_PLUG

      刪除
    4. 你的Marlin是最新版的嗎?
      我的參數依據都是github上最新的版本
      不會沒有這個參數

      刪除
    5. 我最近才載的https://www.youtube.com/watch?v=H_sGcUn7vVM&list=LLLzqQiOnIDW7fNqjqNpmmiA&index=4&t=4s

      刪除
    6. https://www.youtube.com/watch?v=BTUVGvbJbc8&t=269s

      刪除
    7. 那應該要有喔
      https://github.com/MarlinFirmware/Marlin/blob/1.1.x/Marlin/Configuration.h
      第510行

      還有 134行那邊主機板的型號也要正確

      刪除
  10. 我現在螢幕有畫面只是不能動
    所以我是要複製你給的那堆東西貼在Configuration.h上嗎

    回覆刪除
    回覆
    1. 有畫面不能動是指面板已經有Marlin的資訊出來嗎?
      如果是的話可能是你機器設定還沒完整
      還有機器各項接線都要完成 例如熱敏還有限位開關等
      不然可能會觸發保護不能操作

      刪除
    2. 還有 我上面貼的那些就是Configuration.h的預設內容....

      刪除
  11. 複製過去在改成我的設定嗎?

    回覆刪除
    回覆
    1. 我的意思是 如果你是用官版的Marlin
      Configuration.h應該像我貼的那個樣子
      不需要複製什麼 你手上的應該跟我貼的一樣

      如果不一樣
      那就要看你的Marlin是從哪邊來的

      刪除
  12. 如果你手上的版本有少
    建議可以試看看從github下載完整的Marlin
    整個重新設定過一遍

    編譯並燒到主板後
    連著USB線 使用Repetier-Host之類的軟體 連線開機
    看是否有錯誤回報
    只靠機器上的LCD面板無法看到完整錯誤訊息
    在調整階段建議用PC連線控制會比較容易處理問題

    回覆刪除
    回覆
    1. 畫面沒了
      Arduino:1.6.9 (Windows 8.1), 板子:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

      In file included from sketch\MarlinConfig.h:42:0,

      from sketch\G26_Mesh_Validation_Tool.cpp:27:

      SanityCheck.h:378: error: static assertion failed: Movement bounds ([XY]_MIN_POS, [XY]_MAX_POS) are too narrow to contain [XY]_BED_SIZE.

      static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,

      ^

      exit status 1
      static assertion failed: Movement bounds ([XY]_MIN_POS, [XY]_MAX_POS) are too narrow to contain [XY]_BED_SIZE.

      This report would have more information with
      "Show verbose output during compilation"
      option enabled in File -> Preferences.

      刪除
    2. 畫面我之前弄過我忘了怎麼弄
      LCD 2004

      刪除
  13. 有畫面連接也行影印也行只是他不會動

    回覆刪除
  14. 想請問一下,我的螢幕面板顯示溫度是def,是什麼意思?

    回覆刪除
  15. 網誌管理員已經移除這則留言。

    回覆刪除
  16. 網誌管理員已經移除這則留言。

    回覆刪除
  17. 你好:
    我是使用Delta的印表機,
    我列印的成品尺寸不對,
    我看過有文章提及在EEPROM中的X,Y,Z-axis Steps per mn,
    但是我的EEPROM只有 Steps per mn,
    請教是否 Configuration.h 要修改哪一部分?
    謝謝

    回覆刪除
    回覆
    1. 7.動作設定 489行 那個陣列就是分別設定x,y,z,e的steps

      刪除
    2. 今天我有修改 Configuration.h
      #define XAXIS_STEPS_PER_MM 86.564
      #define YAXIS_STEPS_PER_MM 86.564
      #define ZAXIS_STEPS_PER_MM 80.5247

      ========== Start configuration string ==========
      {
      "editMode": 2,
      "processor": 0,
      "baudrate": 115200,
      "xStepsPerMM": 86.564,
      "yStepsPerMM": 86.564,
      "zStepsPerMM": 80.525,
      ...
      結果還是一樣,後來我想Delta是不分 xyz的,我另外再研究
      謝謝

      刪除
    3. all 3 motors MUST have the same steps per mm so only one setting is needed. Math does not work with different settings.

      刪除
    4. 你描述的參數看起來不太像Marlin? 用的是哪一家的軔體呢?
      我查閱現在最新的Marlin 2.0韌體應該跟我這篇文寫的差異不大

      另外你的STEPS設定非常怪 正常來說這個應該都是整數(除非你的皮帶是特殊規格 不是常見的2GT)
      這個STEPS設定是不能動的
      如果是Delta機種 發現尺吋有問題應該調整的是機器臂長半徑等參數
      不該直接調整STEPS(就算是XYZ機種也不該隨意調整 馬達同步輪這應該是固定值)
      否則你的成品幾何會有問題

      刪除
    5. 另外Delta機種確實三軸STEPS都應該一樣
      Delta的XYZ並不是三維XYZ座標
      而是指那三根立柱

      刪除
    6. 我查了一下 你似乎使用的是Repetier 不是Marlin
      你使用Repetier的話建議使用官網提供的設定工具去做設定
      https://www.repetier.com/download-now/
      Repetier我也用了一陣子 照官網工具的流程走基本上都不會有問題
      設定也可以直接匯入現成設定檔 很好用

      刪除
    7. 厲害!我是使用Repetier沒錯,是去淘寶買回來自組,韌體是現成的。既然問題不在設定檔,那就;再研究其他看看,謝謝。

      刪除
    8. 不知道你的問題解決了沒?
      淘寶件老實說軔體出包機率很大
      因為很多是copy別家的軔體然後自己賣零件(有些設定檔打開還可以看到裡面的mark是別家的....)
      或者軔體已經是不知道多久前的老舊版本
      要買淘寶件最好自己對軔體有一定概念
      像Repetier這種最好使用官網的版本重新設定一次會比較妥當

      刪除

張貼留言

這個網誌中的熱門文章

如何簡單判定步進馬達的線組

自動調平的迷思 從Repetier G32/G33看平台自動校正