3D 프린터에서 베드 레벨링을 잡아주는 작업은 매우 중요합니다. 베드 레벨링이 잘 되어야 출력물 안착이 잘되기 때문에 문제없이 프린팅을 하기위한 전제조건이 됩니다. 그리고 프린터기를 캘리브레이션 해주는 작업도 출력물의 품질에 영향을 주기 때문에 상당히 중요한 절차입니다. 그런데 이렇게 중요한 베드 레벨링이나 캘리브레이션은 참으로 까다로운작업이 아닐 수 없습니다.
다행스럽게도 제가 사용하고 있는 Anycubic Kossel 모델에서는 정식으로 레벨링을 위한 probe를 개발해서 발매를 했습니다. 키트형태로 되어 있어서 추가 부품만 구매를 하면 볼팅 및 케이블 포트연결 만으로 간단하게 업그레이드 할수 있습니다.
키트를 이용하면 다음과 같이 배드 평탄도를 측정해 볼 수 있답니다. 다음 그래프는 제 프린터의 평탄도를 측정해본 결과입니다. 전혀 체감하지 못했었는데 실제로는 이렇게 배드가 한쪽으로 기울어져 있는 상태였네요. 출력물이 좀 특어진 상태가 되는 문제가 있었는데 이런게 원인일수도 있겠네요.
아무튼, 지금부터 오토레벨링 오토 캘리브레이션을 위한 프린터 업그레이드 방법을 알아보겠습니다.
하드웨어 업그레이드
키트 구성품은 다음과 같습니다. Probe 센서, 연장 케이블, 자석 거치대, 조립용 볼트 등이 포함되어 있고 가격도 아주 저렴합니다.
그리고 간단한 부품만큼이나 설치도 간단합니다.
먼저 자석거치대를 프린터 헤드 하단에 장착을 해 줍니다.
그리고 센서의 결선은 메뉴얼에 나온 결선도를 참고하시면 쉽게 연결할 수 있습니다.
그림을 확대해서 보면 "Leveling module"이라고 된 아이가 "Z-"라고 인쇄되어 있는 단자에 연결되도록 되어 있는 것을 볼 수 있습니다. 그리고 표현상 빨간색과 검정색으로 두 선을 구분해 두었는데 실제로는 open/close 스위치라서 극성은 중요치 않습니다.
이제 선만 딱딱 연결해주고 probe를 자석에 가져다 대면 척하고 달라붙습니다.
이제 이것만 있으면 귀찮은 레벨링은 바이바이입니다.
펌웨어 업그레이드
이제 펌웨어만 손봐주면 됩니다. 물런 Anycubic 홈페이지에서 배포하는 펌웨어 hex파일을 사용해도 됩니다만 전 컴파일된 HEX코드 펌웨어를 사용하면 1. 펌웨어의 세부적인 사항을 입맛대로 변경하기 어렵다거나, 2. 디테일한 조직의 흐름을 파악하기가 어려운 단점이 있기 때문에 코드를 직접 컴파일 하는 방법을 선호하고 있습니다.
펌웨어는 "Marlin 1.1.x-bugfix"(http://marlinfw.org/meta/download/) 배포버전을 사용하였습니다. 기본적으로, Anycubic delta kossel 프린터용으로 키네틱 설정이 완료된 상태(스텝모터 4개와 엔드스톱 3개 + 레벨링프로브 1개, 쿨링팬 1개, LCD컨트롤러 등이 모두 정상 인식된 상태)에서, 오토레벨링/오토 켈리브레이션을 위해 추가로 조정해주어야 할 부분들만 발췌한 것입니다. 하나하나 살펴보겠습니다.
※ kossel프린터에 펌웨어를 처음 올리는 상황에서 Marlin 펌웨어를 받아서 아래 사항만 수정한 후 업로드하면 프린터가 정상동작하지 않을 수 있습니다. (예, 스텝모터 동작방향이 반대라던가, LCD가 안나온다던가)
Probe type 설정
/**
* A Fix-Mounted Probe either doesn't deploy or needs manual deployment.
* (e.g., an inductive probe or a nozzle-based probe-switch.)
*/
#define FIX_MOUNTED_PROBE
레벨링이나 캘리브레이션시 베드를 터칭하는 Probe의 형태를 결정하는 부분입니다. Anycubic probe는 사용할때마다 손으로 붙였다가 때었다가 해야하는 형태이기 때문에 FIX_MOUNTED_PROBE를 설정해 줍니다.
Probe가 연결된 핀 설정
/**
* Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
*
* Enable this option for a probe connected to the Z Min endstop pin.
*/
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
Probe가 연결된 단자를 알려주는 부분입니다. 앞에서 Probe는 "Z-" 위치에 연결을 했습니다. 그러면 이 부분을 주석해제합니다.
Probe offset 설정
/**
* Z Probe to nozzle (X,Y) offset, relative to (0, 0).
* X and Y offsets must be integers.
*
* In the following example the X and Y offsets are both positive:
* #define X_PROBE_OFFSET_FROM_EXTRUDER 10
* #define Y_PROBE_OFFSET_FROM_EXTRUDER 10
*
* +-- BACK ---+
* | |
* L | (+) P | R <-- probe (20,20)
* E | | I
* F | (-) N (+) | G <-- nozzle (10,10)
* T | | H
* | (-) | T
* | |
* O-- FRONT --+
* (0,0)
*/
#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]
필라멘트가 녹아나오는 노즐팁의 위치, 그러니까 실제로 프린터의 출력지점과 레벨링을 위한 Probe가 베드를 터치해서 인식하는 팁 위치간의 차이입니다.
설계상으로 X, Y 축으로는 동일한 좌표이며, Z축으로만 위 사진에 표시된것 만큼 차이가 있으므로 그 값을 여기서 설정해 줍니다. 측정을 해보면 약 16이 약간 넘는 숫자가 나오는데요. 여기서 애매한 부분이 Probe가 눌려서 센싱이 되는 순간이 어디인지 명확하지 않다는 겁니다. 그래서 Anycubic에서는 -15.9를 기본값으로 제시해 주어서 저도 그 값을 그냥 따라사용 했습니다.
EEPROM 설정
// EEPROM
//
// The microcontroller can store settings in the EEPROM, e.g. max velocity...
// M500 - stores parameters in EEPROM
// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).
// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to.
//
#define EEPROM_SETTINGS // Enable for M500 and M501 commands
캘리브레이션이나 레벨링을 해서 수정된 설정값을 프린터에 기억시키기 위해서 EEPROM을 사용하도록 설정해야 합니다. 다운받은 마릴린 펌웨어에서 delta용 configuration.h파일에서는 이부분이 기본적으로 사용하지 않는것으로 되어 있었습니다.
캘리브레이션 활성화
// Delta calibration menu
// uncomment to add three points calibration menu option.
// See http://minow.blogspot.com/index.html#4918805519571907051
#define DELTA_CALIBRATION_MENU
// uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
#define DELTA_AUTO_CALIBRATION
캘리브레이션 기능을 활성화 시키는 부분입니다. 주석처리를 제거해서 기능을 활성화 해 줍니다.
G29 vs G33 (http://hennerley.nz/2018/01/29/g29-vs-g33/)
오토 레벨링관련 방법을 찾다보면 Marlin에서 제공하는 기능에는 G29 code를 사용하는 "Unified Bed Levelling" 과 G33을 사용하는 "Auto Calibration" 두 가지가 있다는 것을 알 수 있습니다. 그리고 조금더 찾아보면 이 두 가지중에 어떤 기능을 사용하는게 맞는것인가에 대한 토론까지 벌어진 것을 알 수 있습니다. 링크는 그 논란(?)에 대한 결론을 내릴 수 있도록 자세한 설명이 되어 있는 곳입니다.
결론적으로 제가 이해한바로는 이렇습니다. 한마디로 G29는 편법, G33은 정공법이다라고 할 수 있을 것 같습니다. 내용에는 자동차 핸들을 예로한 설명이 나오는데요. 자동차 핸들이 삐뚤어져서 차가 직진하고 있음에도 핸들이 약간 돌아간 상태의 차가 있을때 이걸 고치는 방법으로 먼저 핸들만 빼뚤어진 만큼만 다시 바로잡을 수도 있고 삐뚤어진 원인을 분석해서 휠, 프레임, 조향 시스템 등 전반적인 문제를 해결하는 방법이 있을텐데, 전자가 G29, 후자가 G33이라고 비유를 했습니다. 추가적으로 G29는 계산적인 방법으로 기계적 오차를 상쇄하는 방법이기 때문에 간단하게 외향적 문제를 해결할 수는 있지만 프린터의 매 움직임마다 보정을 위한 추가적인 계산이 발생한다고 합니다. 3D프린터는 한줄의 G코드를 움직이기 위해서도 그 움직임을 미분해서 수십 수백번의 연속적인 계산을 수행을 하게되는데요 움직일때마다 추가적인 계산이 더 필요하다면 프로세서에 무리를 주기 때문에 기본적으로 G33을 이용한 보정을 우선하는게 맞다라는 취지로 이해했습니다.
업데이트한 펌웨어 업로드
수정이 끝난 펌웨어를 프린터에 업로드 하기만 하면 되는데요. Arduino IDE 1.8.9 버전에서 문제업이 올라가는것을 확인하였습니다.
오토 캘리브레이션(Auto Calibration)
이제 모든 준비가 끝났으니 캘리브레이션을 진행해 보겠습니다.
사전준비
스탭모터 캘리브레이션
Delta Kossel은 사용하는 4개의 스탭모터가 모두 동일하기 때문에 익스투루더를 이용해서 스탭모터 캘리브레이션을 진행하고 이값을 반영하였습니다.
- 프린터에 필라맨트를 설치하고 특정위치에 매직팬 등으로 위치를 표시합니다.
- Fronterface로 프린터를 연결하고 170도 이상으로 노즐을 가열합니다. (익스투루터 락을 풀어주기 위함)
- 노즐 가열이 끝나면 필라멘트를 100mm 익스트루드 시킵니다.
- 움직인 거리를 확인하고 매직으로 표시한 부분이 움직인 실제 거리를 정확히 측정합니다.
- 다음 공식으로 스텝퍼 스탭수를 계산합니다. (실제 움직인 거리가 90mm인경우 스탭수는 111.1111)
100 / [측정값 (예)90] * 100 = 111.1111 - Fronterface 명령창에 다음 명령을 입력해서 스탭수를 수정합니다. (필요에 따라 다른 스텝퍼 스탭수도 조정)
M92 E111.1111 - 수정값 EEPROM에 저장합니다.
M500
센서상태 확인
프린터의 안전을 위해서 연결된 오토레벨링 probe가 잘 동작하는지 먼저 확인해 줍니다.
M119 코드를 입력해주면 현제 센서의 상태가 출력됩니다. X, Y, Z 타워 상부에 있는 3개의 Endstop과 오토레벨 센서에 대해서 그 상태를 알려주는데요. Probe를 손으로 살짝 누른상태에서 M119명령을 넣으면 "z_min:TRIGGERED"라는 반응이 나온다면 정상입니다.
캘리브레이션 시작
- Fronterface에서 다음 명령어로 EEPROM을 초기화 합니다.
M502
M500 - G33 코드로 캘리브레이션을 시작합니다.
좀더 정밀한 캘을 위해서는 P파라미터를 추가해서 "G33 P1, G33 P2, G33 P5, G33 P10"을 차례대로 진행합니다. 각 단계마다 시간이 오래 걸려서 P10까지는 한다면 많은 인내심이 필요합니다. ^^ - 캘이 끝나고나면 화면에 수정값이 표시됩니다. M500으로 수정값 저장합니다.
Iteration : 04 std dev:0.150
Calibration OK rolling back.
.Height:292.01 Ex:+0.00 Ey:-3.42 Ez:-3.41 Radius:100.42
. Tx:+1.01 Ty:+0.32 Tz:-1.32
Save with M500 and/or copy to Configuration.h - G33 P1명령으로 높이측정을 다시한번 실시합니다.
오토캘리브레이션 특성상 실제 높이보다 측정높이가 약간 크게 나오기 때문에 Z-Offset을 조정해서 이부분 수정이 필요하다고 합니다.
Calibration OK std dev:0.000
.Height:292.00
Save with M500 and/or copy to Configuration.h - 센서를 제거하고 노즐을 차츰차츰 내려서 베드의 정중앙에 오도록 이동합니다. 노즐과 베드사이에 종이한장을 넣었을때 살짝 걸릴정도의 높이를 까지 이동시킨 후 프린터의 Z좌표를 확인합니다.
- 프린터 LCD에 표시되는 Z좌표를 오차값입니다. 이 값만큼을 z-offset과 프린터 높이를 수정해 줍니다.
M851 Z16.10 (예: 측정오차가 0.1이고 기존 z-offset이 16이면 16 + 0.1 = 16.1)
M665 H292.00 (예: 측정된 오차가 0.1이고 기존 높이가 292.1이면 292.1 - 0.1 = 292)
노즐이 최대로(Z위치 0.0) 내려왔는데도 베드와 접촉하지 못하고 허공에 있는 경우가 발생할 수도 있습니다. 소프트웨어 인터락으로 Z좌표가 음수가되는 위치로는 움직이지 못하도록 막혀있습니다. (설정으로 인터락은 해제할 수 있음) 이때는 음수값으로 적당한 오차를 가정하여 수정을하고 높이측정(G33 P1)을 한번더 해줍니다. - M500 명령으로 변경값을 저장합니다.
이상 일련의 절차를 수행하는 영상입니다.
이상 모든 캘리브레이션 및 레벨링 과정이 완료되었습니다. 이제 실제로 출력을 하면서 결과물을 상태를 확인하고 추가보정을 해주면 되겠습니다.
마무리
위에 언급된 과정을 거친다면, 대부분은 일정 수준 이상의 출력물을 얻을 수 있지 않을까 생각합니다. 여러가지 귀찮은 과정을 자동으로 수행해 주기 때문에 매우 편리한 기능인것은 분명합니다. 간단한 부품 추가만으로 이모든일이 가능하다니 정말 개발자분들 존경스럽네요.
물런 출력물의 품질에 영향을 주는 요소는 너무 많기 때문에 그렇지 않는 경우가 발생할 수도 있습니다. 그리고 캘리브레이션이 매우 중요한 작업이긴 하지만, 하드웨어의 정확한 조립이 선행되어야 함은 말할 필요도 없는 당연한 얘기입니다. 만약 레벨링에 미묘한 오류가 있거나 출력품의 싸이즈에 생각보다 큰 오차가 발생하는 경우 캘리브레이션에 올인하기전에 초심으로 돌아가 프린터의 조립상태를 하나하나 꼼꼼히 따져볼 필요도 있습니다. 저도 오토 캘리브레이션이 모든걸 해결해줄거라 생각하고 기대가 컷지만 역시 한계가 있음을 느끼고 있습니다.
이제 요행을 바라지 말고 어떤 개선이 필요할지 고민을 좀 해봐야 할것 같습니다.
끝!
댓글