본문 바로가기
Hardware/3D Printing

Marlin 1.1.X 세팅의 모든것 - Anycubic Delta Kossel, Configuration 수정하기 (1/2) - Configuration.h

by lovey25 2019. 4. 16.

Marlin은 3D 프린터 뿐만 아니라 다양한 CNC 머신에 사용 할 수 있는 전천후 펌웨어입니다. 그래서 펌웨어 자체가 수많은 파일로 이루어진 거대한 C++ 프로젝트입니다.

그런데 얼마나 기가 막히게 만들어 놨는지 마를린 펌웨어를 사용하는 사용자는 C++에 대한 전문지식이 없더라도 다음 두 가지 파일의 내용만 이해한다면 대부분의 오픈소스 3D 프린터에 이식해서 사용할 수 있습니다. (물론 이두개 파일만 하더라도 1000줄에 육박하는 코드이긴 합니다.)

  • Configuration.h
  • Configuration_avd.h

이번글은 이 두 가지 파일의 각 부분이 무엇을 의미하는지 그리고 제가 사용하고 있는 Delta kossel 프린터에 적용하기 위해서는 어떤 설정을 사용해야 하는지를 다루어보려 합니다. 이번엔 그 첫번째로 Configuration.h를 살펴보겠습니다.

마를린의 최신 버전은 홈페이지(http://marlinfw.org/meta/download/)에서 받을 수 있습니다. 지금 글을 작성하고 있는 현재를 기준으로 공식 배포된 최종 버전은 1.1.9이고 마를린 2.0 알파버전도 나와 있는 상태입니다. 이 글은 1.1.X 버전을 기준으로 작성된 점 참고해 주세요.

※ note: 불필요한 주석 및 Delta 프린터 기준으로 로직에 관련이 없는 부분은 생략하였습니다.

Delta Settings

#define DELTA
#if ENABLED(DELTA)
  #define DELTA_SEGMENTS_PER_SECOND 80
  #define DELTA_DIAGONAL_ROD 218//mm
  //  #define DELTA_SMOOTH_ROD_OFFSET 182// 
  //  #define DELTA_EFFECTOR_OFFSET 33 // mm
  //  #define DELTA_CARRIAGE_OFFSET 15.5 // mm
  #define DELTA_RADIUS  98.4//(DELTA_SMOOTH_ROD_OFFSET-(DELTA_EFFECTOR_OFFSET)-(DELTA_CARRIAGE_OFFSET))
  #define DELTA_PRINTABLE_RADIUS 85  
#endif

DELTA_SEGMENT_PER_SECOND

Delta프린터는 일반적인 직교좌표를 사용하는 프린터와 구조가 다르죠. 3개의 세로 축방향의 운동을 담당하는 스텝 모터의 동작의 조합으로 프린터 공간 내에서 수평운동이 수행되도록 되어 있습니다. 따라서 프린터영역의 직교좌표에서의 운동을 구현하기 위해서는 좌표계의 변환의 계산과정이 필요합니다.

A위치에서 B위치로 이동하라는 명령이 있는 경우 델타 프린터는 A에서 B까지의 이동거리를 여러개로 잘게 쪼개어 하나씩 처리를 하면서 이동합니다. 이때 얼마나 이동단위를 잘게 나눌 건지 그 크기를 결정하는 것이 DELTA_SEGMENT_PER_SECOND 값입니다. 이 값이 작으면 모자이크 처리된 그림처럼 이동경로가 거칠어진다는 개념인데 값의 변화에 따른 결과물에 대한 영향이 크지않기 때문에 크게 문제가 되지 않는 수준에서 손대지 않는게 정신건강에 좋다고 합니다. 이 값이 무한정 커질 수 없는것이 잘게 쪼개면 쪼갤수록 계산량이 많아져서 프린트 성능에 영향을 미칠 수 있습니다.

프린터 사이즈 설정

아래 그림과 같이 프린터의 동작부에 대한 치수를 입력하는 부분입니다. 좌표변황에 사용되는 기본 치수이기 때문에 최대한 정확한 값을 넣어주어야 합니다.

5,6,7번행의 DELTA_SMOOTH_ROD_OFFSET, DELTA_EFFECTOR_OFFSET, DELTA_CARRIAGE_OFFSET 이 3가지는 8행의 DELTA_RADIUS를 결정하기 위해서 사용되는 값입니다(단순 산수죠). 제가 사용하고 있는 Anycubic사의 모델에서는 이값을 98.4로 설정하고 5,6,7행은 주석처리를 했습니다.

인터페이스

#define SERIAL_PORT 0
#define BAUDRATE 115200
//#define BLUETOOTH  // AT90USB기반 블루투스 인터페이스용

디버깅용으로 사용할 시리얼포트를 선택하는 옵션입니다. Anycubic Kossel의 경우 TriGorilla보드를 사용하는데, Arduino Mega 2560과 호환이 되는 보드입니다. 그래서 기본적으로 포트 "0"이 기본(USB연결) 시리얼포트입니다.

그리고 Baudrate는 시리얼 통신속도인데 사용가능한 최대값을 사용하시면 됩니다. 안된다면 한단계씩 낮추어가면서 가능한 설정을 찾으면 됩니다.

Moterboard 설정

#ifndef MOTHERBOARD
  #define MOTHERBOARD 33
#endif

사용하는 메인보드에 맞게 넣어주면 됩니다. 이 숫자는 "Boards.h"파일에 정의되어 있습니다.

TriGorilla보드는 RAMPS1.4규격이라고 하던데 33번은 RAMPS1.3이네요. 음 별 문제없으니 그냥 33으로 두겠습니다.

프린터 이름

#define CUSTOM_MACHINE_NAME "EveryX"

프린터 전원을 켰을 때 첫 화면에 나오는 문구입니다. 원하는대로 설정해주시면 됩니다 단, 한글은 아직 안되요.

Extruder 설정

#define EXTRUDERS 1
//#define DISTINCT_E_FACTORS
//#define SINGLENOZZLE
//#define SWITCHING_EXTRUDER
//#define MIXING_EXTRUDER

1행의 EXTRUDERS는 익스트루더 개수입니다.

그리고 2~5행은 멀티 익스트루더나 믹싱 익스트루더의 기능을 켜거나 끄기위한 매크로입니다. Kossel은 모두 해당사항 없습니다.

전원공급장치

#define POWER_SUPPLY 0

컴퓨터에 사용하는 파워서플라이처럼 자동 On/Off 스위칭을 지원하는 파워를 ATX파워라고하는데요. ATX파워를 사용하는경우 "1" 그렇지 않은경우에는 "0"입니다.

온도관련 설정

센서

#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0
#define TEMP_SENSOR_BED 1

//#define TEMP_SENSOR_1_AS_REDUNDANT
#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10

사용하는 온도센서를 설정하는 부분입니다. 사용한다면 주석에 있는 센서목록에서 해당하는 번호를 골라주고 그렇지 않으면 "0"으로 설정합니다. TEMP_SENSOR_0은 익스트루더의 온도를 측정하기 위한 부분이고 TEMP_SENOR_BED는 히팅베드 온도측정용입니다. Anycubic Kossel은 익스트루더 센서만 있지만 추후 베드 업그레이드를 위해서 히팅베드센서도 활성화 해두었네요.

참고로 1번은 "100k thermistor" 입니다. 설치되어 있는 센서의 저항을 측정해 보시면 거~의(?) 100kΩ 나오는걸 알수 있습니다. 이정도 차이가 있어도 큰 문제는 없나보네요.

TEMP_SENSPR_1_AS_REDUNDANT는 여분의 센서가 있는 경우 듀얼로 센싱하는 방식을 설정할때 사용합니다. 주석을 지워서 예비센서 기능을 사용하는 경우 2개의 센서의 온도값을 측정해서 온도의 차이가 바로 다음줄에 MAX_REDUNDANT_TEMP_SENSOR_DIFF 보다 큰경우 히팅을 차단하는 역할을 합니다. 센서의 고장이나 기구의 파손등으로 발생하는 오작동을 막기위한 기능으로 보입니다.

온도조절

#define TEMP_RESIDENCY_TIME 3  // (seconds)
#define TEMP_HYSTERESIS 3       // (degC) range of +/- temperatures considered "close" to the target one
#define TEMP_WINDOW     1       // (degC) Window around target to start the residency timer x degC early.

#define TEMP_BED_RESIDENCY_TIME 10  // (seconds)
#define TEMP_BED_HYSTERESIS 3       // (degC) range of +/- temperatures considered "close" to the target one
#define TEMP_BED_WINDOW     1       // (degC) Window around target to start the residency timer x degC early.

1~3행: 히팅노즐의 목표온도 도달여부를 확인하는데 사용되는 설정값

4~6행: 히팅베드의 목표온도 도달여부를 확인하는데 사용되는 설정값

RESIDENCY_TIME

목표온도권을 유지하는 최소시간을 나타냅니다. 이 시간이상 목표온도권에서 온도가 유지가 된다면 히팅이 완료되었다고 판단합니다.

HYSTERESIS

목표온도권의 범위를 한정하는 설정값입니다. "3"이면 목표온도에서 ±3도를 목표온도 범위로 봅니다.

WINDOW

RESIDENCY_TIME을 측정하는 기준온도입니다. 목표온도가 100이고 WINDOW값이 1인경우 온도가 99가 되는순간부터 시간을 측정해서 RESIDENCY_TIME을 초과하는지를 판단합니다.

최소/최대 온도

#define HEATER_0_MINTEMP 5
#define HEATER_1_MINTEMP 5
#define HEATER_2_MINTEMP 5
#define HEATER_3_MINTEMP 5
#define BED_MINTEMP 5

// When temperature exceeds max temp, your heater will be switched off.
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
// You should use MINTEMP for thermistor short/failure protection.
#define HEATER_0_MAXTEMP 275
#define HEATER_1_MAXTEMP 275
#define HEATER_2_MAXTEMP 275
#define HEATER_3_MAXTEMP 275
#define BED_MAXTEMP 150

MINTEMP: 센서 와이어링에 문제가 없는지 판단하기 위한 최소 온도값을 설정합니다. 이 이상으로 온도가 측정되어야 해당 히팅파트가 작동을 합니다. 센서가 연결되지 않은 경우 측정값은 0입니다.

MAXTEMP: 최대 작동온도 범위입니다. 이 이상 온도가 올라가면 히터작동이 중지됩니다. 오버히팅으로 인한 장비 손상을 예방하는 안전장치 되겠습니다.

제어방법 설정

#define PIDTEMP
#define BANG_MAX 255 // limits current to nozzle while in bang-bang mode; 255=full current
#define PID_MAX BANG_MAX // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current

#if ENABLED(PIDTEMP)
  //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result.
  //#define PID_DEBUG // Sends debug data to the serial port.
  //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
  //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
  //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders)
                                  // Set/get with gcode: M301 E[extruder number, 0-2]
  #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
                                  // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
  #define K1 0.95 //smoothing factor within the PID
  
  // Ultimaker
  #define  DEFAULT_Kp 22.2
  #define  DEFAULT_Ki 1.08
  #define  DEFAULT_Kd 114
#endif // PIDTEMP

//#define PIDTEMPBED
//#define BED_LIMIT_SWITCHING
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current

1행과 22행은 PID(Proportional-Integral-Differential)제어의 사용여부를 선택하는 코드입니다. 주석처리해서 정의를 하지 않으면 PID제어대신 뱅뱅(Bang-Bang) 제어를 사용하겠다는 뜻입니다.

위의 코드의 경우 히팅노즐은 PID제어를 사용하고 히팅베드는 뱅뱅제어를 사용하는군요.

PID제어는 게인값을 조절해서 히터가 목표한 온도에 최대한 빠르게 도달하고 그 온도를 안정적으로 유지할 수 있도록 하는 방식입니다. 5~20행의 내용이 그에대한 설정값입니다. 오버슈팅이 너무크거나 불필요하게 온도가 안정되기를 기다려서 프린팅 시작이 느린경우 수정을 하시면 되겠습니다. 그러나 히팅노즐의 온도조절에 특별히 문제가 없다면 기본값을 사용하며 되겠습니다.

Extruder

#define PREVENT_COLD_EXTRUSION
#define EXTRUDE_MINTEMP 170

#define PREVENT_LENGTHY_EXTRUDE
#define EXTRUDE_MAXLENGTH 200

#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders
#define THERMAL_PROTECTION_BED     // Enable thermal protection for the heated bed

1, 2행: 히팅노즐에 필라멘트가 녹지않은 상태에서는 익스트루터용 스텝모터가 동작하지 못하도록하는 인터락 옵션입니다. 170도 이상인 경우에만 움직일 수 있도록 설정되어 있네요.

4, 5행: 어떠한 오류로 인한 필라멘트의 과도한 압출을 예방하는 옵션입니다.

7, 8행: 온도센서가 고장나거나 원래위치에서 탈락이되어서 제대로된 측정이 불가능한 경우 히팅파트는 목표온도를 맞추기 위해서 계속 온도를 올리게 되는데요 이런 경우 고장이나 화재를 일으킬 수 있습니다. 이런 사고를 막기위한 옵션으로 목표온도에 도달하는데 시간이 너무 오래걸리거나 하면 프린터기를 멈추는 기능입니다.

Endstop

//#define USE_XMIN_PLUG
//#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG
#define USE_XMAX_PLUG
#define USE_YMAX_PLUG
#define USE_ZMAX_PLUG

#define ENDSTOPPULLUPS // Comment this out to disable the endstop pullup resistors

#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.

//#define ENDSTOP_INTERRUPTS_FEATURE

1~6행: 사용하는 엔드스탑을 설정합니다. 기본적으로 X, Y, Z타워의 끝부분에 하나씩 그리고 오토레벨링을 하는 Probe용 엔드스탑까지해서 총 4개의 리미트 스위치를 사용하는 설정입니다.

8행: 모든 엔드스탑에 자체적으로 풀업저항을 적용시키는 옵션입니다.

10~16행: 리미트스위치의 로직을 설정하는 옵션입니다. false인 경우 스위치 눌려졌을 때 동작하고 true는 그 반대입니다.

18행: 엔드스탑이 인터럽트를 지원하는 포트에 물려있는 경우 사용하는 옵션입니다. TriGoillar보드의 인터럽트핀 관련 내용을 찾지못했는데 이 옵션이 주석처리되어 있는걸 보니 엔드스탑이 인터럽트 처리가 아닌것 같네요.

움직임 설정

/**
 * Default Axis Steps Per Unit (steps/mm)
 *                                      X, Y, Z, E0 [, E1[, E2[, E3]]]  */
#define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 80, 96 }

/**
 * Default Max Feed Rate (mm/s)
 *                                      X, Y, Z, E0 [, E1[, E2[, E3]]]  */
#define DEFAULT_MAX_FEEDRATE          { 200, 200, 200, 200}

/**
 * Default Max Acceleration (change/s) change = mm/s
 *                                      X, Y, Z, E0 [, E1[, E2[, E3]]]  */
#define DEFAULT_MAX_ACCELERATION      { 3000, 3000, 3000, 3000 }

/**
 * Default Acceleration (change/s) change = mm/s
 */
#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION   1500    // X, Y, Z acceleration for travel (non printing) moves

/**
 * Default Jerk (mm/s) */
#define DEFAULT_XJERK                 5.0
#define DEFAULT_YJERK                 5.0
#define DEFAULT_ZJERK                 5.0
#define DEFAULT_EJERK                 5.0

프린터의 노즐이 움직이는 속도를 설정하는 부분입니다. EEPROM사용이 설정되어 있다면 EEPROM에 저장된 값이 우선합니다.

4행: STEP수는 사용하는 스텝모터, 풀리등에 따라서 다른 값을 적용해 주어야 합니다. 

6~21행: FEEDRATE, ACCELERATION은 단어 그대로 속도와 가속도입니다. 여기 설정된 값은 G코드에서 속도와 가속도 요소가 없을때 적용되는 기본값입니다.

24~28행: JERK는 노즐의 급격한 속도변화 혹은 동작방향의 변화가 있을때 적용하는 최소속도를 지정하는 옵션입니다. Delta프린터의 경우 유니버셜 조인트에 유격이 있는 경우 각진 출력물을 뽑을때 모서리가 살짝 튀어나오는 문제가 생길 수 있는데 이런 경우 이 옵션을 조절하면 도움이 될것 같습니다.

Z Probe

#define FIX_MOUNTED_PROBE

#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left  +right  [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER -15.9  // Z offset: -below +above  [the nozzle] !!!!!

#define XY_PROBE_SPEED 6000
#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)

#define PROBE_DOUBLE_TOUCH
#define Z_MIN_PROBE_PIN Z_MIN_PIN
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
#define Z_MIN_PROBE_REPEATABILITY_TEST

Z Probe는 높이방향으로 출력범위를 감지하는데 사용되는 리미트스위치입니다.

1행: 고정된 형태의 Probe를 사용한다는 설정입니다. 수동으로 Probe를 붙였다 땠다하는 형태입니다.

3~5행: Z Probe가 베드를 센싱하는 점과 실제로 필라멘트가 압출되는 노즐팁의 물리적인 거리차이를 입력하는 부분입니다. 저같은 경우 다음과 같은 Probe를 사용하기 때문에 Z방향으로의 offset만 설정하였습니다.

7~9행: 레벨링 측정시 이동 속도를 지정하는 부분입니다. 

11행: 정확도 향상을 위해서 Probe가 터치를 2번씩 하게 하는 옵션입니다. 설정하게 되면 처음 터칭까지는 빠르게 접근했다가 두번째는 속도를 줄여서 다시 터칭하게되고 2번째 측정한 위치를 레벨링데이터로 사용합니다. 이 속도는 위의 8, 9행의 속도가 적용됩니다.

12, 13행: Probe가 연결된 핀을 설정하는 부분입니다.

14행: Probe의 정확도를 테스트할 수 있는 기능을 활성화 하는 부분입니다. Gcode의 M48명령으로 테스트를 하고 표준편차를 출력해 줍니다.

Probe offset

#define Z_PROBE_OFFSET_RANGE_MIN -40
#define Z_PROBE_OFFSET_RANGE_MAX 20

M851명령이나 컨트롤러에서 Z offset을 조정할때 조절가능한 최대 범위를 지정합니다.

Stepper 설정

#define X_ENABLE_ON 0
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define E_ENABLE_ON 0 // For all extruders

#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false

#define DISABLE_E false // For all extruders
#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled

#define INVERT_X_DIR true
#define INVERT_Y_DIR true
#define INVERT_Z_DIR true

#define INVERT_E0_DIR true
#define INVERT_E1_DIR false
#define INVERT_E2_DIR false
#define INVERT_E3_DIR false

Stepping 모터 사용여부를 설정하는 옵션입니다. 대부분 기본값으로 Stepper 동작에 문제가 없어서 손댈필요가 없는데 한가지 Stepper 회전방향은 바꿔줄 필요가 있습니다. 

13~20행이 Stepper 회전방향을 바꿔주는 부분입니다. 명령어와 반대방향으로 Stepper가 돌아갈때 bool값을 반대로 바꿔주면 됩니다.

Homing 동작 설정

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

#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS)
#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS)
#define Z_MIN_POS 0
#define X_MAX_POS DELTA_PRINTABLE_RADIUS
#define Y_MAX_POS DELTA_PRINTABLE_RADIUS
#define Z_MAX_POS MANUAL_Z_HOME_POS

G28동작으로 수행되는 Homing은 프린터의 활동 영역을 설정해주는 매우 기본적인 동작입니다. 이 동작의 결과로 베드의 위치를 인식하고 출력할 수 있는 최대 범위를 결정합니다. 델타 프린터는 프린터 헤더를 위로 쭉 이동시켜서 우선 각 타워 상부에 위치하고 있는 엔드스탑을 터치하면서 프린터의 높이 상한값을 인식합니다. 그리고 펌웨어에 프로그램되어 있거나 캘리브레이션을 한 값을 바탕으로 프린터의 바닥면을 계산하게 됩니다.

여기 1~3행이 바로 엔드스탑이 있는 방향이 어디인지를 지정하는 부분입니다. 만약 반대로 되어 있다면 프린터는 있지도 않은 엔드스탑을 향해서 무한정 이동하게 되겠죠.

그리고 5행부터가 최대 출력범위를 지정하는 부분이 되겠습니다. 델타프린터는 베드의 정중앙이 바로 좌표원점(x=0, y=0, z=0)이 되겠습니다.

Filament Runout Sensor

//#define FILAMENT_RUNOUT_SENSOR

말 그대로 필라멘트를 다쎴는지 감지하는 센서를 사용할 경우 설정하는 부분입니다.

Auto bed leveling

//#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR
#define AUTO_BED_LEVELING_BILINEAR

//#define DEBUG_LEVELING_FEATURE

#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
  #define ABL_GRID_MAX_POINTS_X 9
  #define ABL_GRID_MAX_POINTS_Y ABL_GRID_MAX_POINTS_X
  // Set the number of grid points per dimension.
  // Works best with 5 or more points in each dimension.
  #define ABL_GRID_POINTS_X 5
  #define ABL_GRID_POINTS_Y ABL_GRID_POINTS_X

#define DELTA_PROBEABLE_RADIUS (DELTA_PRINTABLE_RADIUS-16)
  #define LEFT_PROBE_BED_POSITION -(DELTA_PROBEABLE_RADIUS+5)
  #define RIGHT_PROBE_BED_POSITION (DELTA_PROBEABLE_RADIUS+13)
  #define FRONT_PROBE_BED_POSITION -(DELTA_PROBEABLE_RADIUS-2)
  #define BACK_PROBE_BED_POSITION (DELTA_PROBEABLE_RADIUS)
  #define MIN_PROBE_EDGE 20

자작 프린터의 베드 레벨링은 참 까다로운 작업중 하나입니다. 그래서 이 오토레벨링 기능은 참 유용합니다.

마를린의 오토 베드 레벨링은 3가지 방식(1~3행)을 지원합니다. 사용하고자 하는 옵션만 주석제거해서 기능을 선택합니다. 

  • 3POINT: 베드의 임의의 3점을 감지해서 레벨링을 하는 방식입니다. 완벽하게 베드가 평평하다면 빠른속도로 레벨링을 할 수 있는 방법 되겠습니다.
  • LINEAR: 역시 평평한 베드에 사용하는 방식인데 측정하는 위치가 베드를 그리드로 나누어서 좀더 많은 위치를 확인합니다.
  • BILINEAR: 베드가 크고 고르지 않은경우 사용하기 적합한 방식이라고 합니다. linear방식과 마찬가지로 측정포인트를 그리드로 설정하는 방식입니다. 델타 프린터는 베드의 평평도를 잡아주는게 중요하기 때문이 이 방식을 사용합니다.

Homing 위치 설정

#define BED_CENTER_AT_0_0
#define MANUAL_Z_HOME_POS 320 // Distance between the nozzle to printbed after homing
#define HOMING_FEEDRATE_Z  (60*60)

델타는 프린터좌표 원점이 베드의 중앙입니다. 1행은 델타프린터의 경우 항상 사용해야하는 옵션 되겠습니다.

MANUAL_Z_HOME_POS는 출력가능한 최대높와 같습니다. 베드 레벨링 작업이 있었다면 높이가 변경되겠지만 그렇지 않은경우 엔드스탑을 터치한 위치로부터 아래로 MANUAL_Z_HOME_POS위치만금 이동한 위치를 원점으로 설정하게 됩니다.

Homing동작을 할때 stepper이동속도는 HOMING_FEEDRATE_Z로 결정됩니다.

EEPROM

#define EEPROM_SETTINGS

#if ENABLED(EEPROM_SETTINGS)
  #define EEPROM_CHITCHAT // Please keep turned on if you can.
#endif

EEPROM을 사용하기 위한 옵션입니다. 4행의 EEPROM_CHITCHAT은 관련 명령을 수행한 후 EEPROM에 저장된 결과값을 시리얼로 출력해주는 기능입니다.

예열온도

// @section temperature

// Preheat Constants
#define PREHEAT_1_TEMP_HOTEND 180
#define PREHEAT_1_TEMP_BED     70
#define PREHEAT_1_FAN_SPEED     0 // Value from 0 to 255

#define PREHEAT_2_TEMP_HOTEND 240
#define PREHEAT_2_TEMP_BED    110
#define PREHEAT_2_FAN_SPEED     0 // Value from 0 to 255

예열온도를 지정하는 부분입니다.

언어

#define LCD_LANGUAGE en
#define DISPLAY_CHARSET_HD44780 JAPANESE

사용언어를 지정하는 부분입니다. 지원언어는 다양한데 아직 한글은 없습니다. 그리고 2행의 문자세트는 기본설정값이 JAPANESE입니다. 

SD Card

#define SDSUPPORT
#define SD_CHECK_AND_RETRY

컨트롤러에 SD카드가 있는 모델일 경우 사용하는 옵션입니다.

엔코더(조작스위치)

#define ENCODER_PULSES_PER_STEP 2
#define ENCODER_STEPS_PER_MENU_ITEM 5

컨트롤러에있는 돌리는 스위치(정식명칭을 모르겠네요)의 민감도를 설정하는 옵션입니다. 너무 민감해서 수치1을 조절하기 힘들때 이 설정을 바꿔주면 됩니다.

Controller

// CONTROLLER TYPE: Standard
//
// Marlin supports a wide variety of controllers.
// Enable one of the following options to specify your controller.
//

// ========== 중략 =========

// RepRapDiscount Smart Controller.
// http://reprap.org/wiki/RepRapDiscount_Smart_Controller
//
// Note: Usually sold with a white PCB.
//
#define REPRAP_DISCOUNT_SMART_CONTROLLER

사용하는 컨트롤러 타입을 지정해주는 옵션입니다. 마를린에는 매우 다양한 컨트롤러들을 지원하도록 만들어져 있습니다. 주석처리된 목록에서 사용하는 컨트롤러를 찾아서 해당 부분만 주석해제 해주시면 됩니다. Anycubic kossel모델은 REPRAP_DISCOUNT_SMART_CONTROLLER로 설정되어 있네요.

Fimament dia

#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75  //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software.  Used for sensor reading validation

필라멘트 굵기를 설정하는 옵션입니다. Gcode에 필라멘트 두께가 지정되기 때문에 큰 의미는 없는 옵션인거 같습니다.

 

끝!

728x90

댓글6

  • 엔코더의 방향은 어떻게 바꾸죠?

    답글

    • Favicon of https://kwonkyo.tistory.com BlogIcon lovey25 2019.05.03 16:14 신고

      찾아보니 다음과 같은 소스로 만들어져 있었습니다. Configuration.h 아무데나 "#define REVERSE_MENU_DIRECTION" 을 추가해주면 아래 코드 로직이 반대로 돌아겠네요. (단, 직접 테스트해보지 않아서 장담못하겠습니다. ;))
      -------------------------------------------
      // Manage encoder rotation
      #if ENABLED(REVERSE_MENU_DIRECTION) && ENABLED(REVERSE_ENCODER_DIRECTION)
      #define ENCODER_DIFF_CW (encoderDiff -= encoderDirection)
      #define ENCODER_DIFF_CCW (encoderDiff += encoderDirection)
      #elif ENABLED(REVERSE_MENU_DIRECTION)
      #define ENCODER_DIFF_CW (encoderDiff += encoderDirection)
      #define ENCODER_DIFF_CCW (encoderDiff -= encoderDirection)
      #elif ENABLED(REVERSE_ENCODER_DIRECTION)
      #define ENCODER_DIFF_CW (encoderDiff--)
      #define ENCODER_DIFF_CCW (encoderDiff++)
      #else
      #define ENCODER_DIFF_CW (encoderDiff++)
      #define ENCODER_DIFF_CCW (encoderDiff--)
      #endif

    • creativefactory 2019.05.03 18:46

      감사합니다!
      메뉴선택시 돌아가는 방향은 왼쪽 위/ 오른쪽 아래로 바뀌었는데 온도조절이나 스피드 조절방향은 왼쪽이 증가 오른쪽이 감소인데 어떻게 바꾸나요?

    • Favicon of https://kwonkyo.tistory.com BlogIcon lovey25 2019.05.04 01:34 신고

      음 그게 또 별개로 움직이게 될거라고는 생각 못했네요. 관련로직을 찾아보면 메뉴처럼 온도나 속도조절 방향도 찾을 수 있을것 같긴한데 제가 당장 찾아서 알려드리기에는 부족한점이 많네요. 찾게되면 다시 댓글 남기겠습니다.

  • YHJ 2021.01.05 18:49

    지금 자작하고 있는데 smps파워가 12v 350w 이고 베드 크기가 320x320입니다 베드 온도를 올리면 조금있다가 Bed heating failed이라고 뜨는데 조금 알아보니 20초동안 2도가 안올라가면 뜬다고 고하던데 이 시간 제한 풀수는 없나요?
    답글

    • Favicon of https://kwonkyo.tistory.com BlogIcon lovey25 2021.01.05 19:31 신고

      얼른 찾아봤는데요. configuration에서 조절할 수 있는 부분은 없는것 같고, 직접 temperature.cpp 파일의 히팅 로직을 만지셔야 할것 같습니다.
      펌웨어 내부 로직은 저에게 너무 복잡해서 제가 도와드릴 수 있는 부분이 없을것 같습니다. ;;