3D프린터를 처음 시작하면 예외없이 경험하는게 있다면 단연 ABL(오토 베드 레벨링) 문제이다. 물론 운이 좋다면 문제 없이 넘어갔을 수 있다. 하지만 대부분의 경우 경험했을 가능성이 높을 것 같다.
왜냐하면 프린터의 종류, 즉 FDM/FFF 혹은 SLA 등을 막론하고 가장 기본적인 부분이 BL(베드 레벨링)이기 때문이다. 따라서 가장 우선적으로 고려하게 되는 업그레이드 사항이 BL(베드 레벨링)이기도 하다. 물론 스풀홀더나 필라멘트 필터를 추가하는 등의 업그레이드 사항도 있다.
BL(베드 레벨링)을 사전적 의미로 설명하자면 베드의 높낮이를 맞추는 작업이라고 할 수 있다. 3D출력을 위해서는 베드 위에 재료를 쌓아나가야 하는데 베드의 높낮이가 맞지 않는다면 출력 지점이 허공에 있거나 베드 보다 낮은 위치에 있게 되어 심각한 손상을 초래할 수도 있다.
따라서 BL(베드 레벨링)이 성공적이면 3D프린팅을 편리하게 하고 출력 품질 향상에도 도움을 줄 수 있다.
BL(베드 레벨링)은 MBL(수동 베드 레벨링)과 ABL(오토 베드 레벨링) 두 가지로 나눌 수 있는데, 여기서는 ABL(오토 베드 레벨링)에 대해 정리하고자 한다.
우선 ABL(오토 베드 레벨링)에는 어떤 것이 있는지에 대해 알아보도록 하자.
ABL(오토 베드 레벨링) 장치는 Z축 엔드스탑의 역할을 한다. 따라서 사용하는 엔드스탑에 따라 구분할 수 있다.
첫번째는 엔드스탑이 근접센서인 경우다. 가장 대중적이다. 작동방법이 간단하며 장치 구성이 복잡하지 않다. 하지만 센서자체의 오차가 발생할 가능성이 있다.
두번째는 홀 센서나 광학 엔드스탑이 근접센서인 경우다. 센서 단독으로 사용되는 경우는 드물다. 센싱을 위한 자석 등의 부수적인 요소가 필요하기 때문에 구성이 쉽지 않다. 이를 보완하기 위해 프로브를 이용하는 경우가 많다. 아래 그림과 같이 프로브가 베드와 닿으면 눌러져서 센서가 위치한 곳까지 이동하여 센서를 작동시키는 형태가 보통이다.
https://reprap.org/wiki/CrashProbe
세번째는 서보 모터와 마이크로 스위치를 사용하는 경우이다. 이 경우를 예로 아래에서 ABL(오토 베드 레벨링) 장치를 만드는 방법을 구체적으로 설명할 것이다. 일단 서보모터는 각도제어가 가능하다. Z축 엔드스탑은 마이크로 스위치 혹은 리미트 스위치라고 부르는 것을 사용한다. 이를 서보암을 통해 서보모터와 연결한다. 리미트 스위치가 노즐보다 아래에 위치해서 베드와 충돌하지 않도록 서보모터의 각도를 제어한다. 이는 레벨링할 때만 스위치를 아래로 내리고 그렇지 않은 경우에는 위로 올리는 식으로 제어하는 것이다.
장점은 비용이 저렴하고 구조가 단순한 편이다. 베드 위에 내열 테이프 등을 바르는 경우에도 보정이 필요없다. 물론 단점들도 존재한다. 서보모터의 분해능이 높지 않아서 각도가 맞지않을 경우 레벨링이 실패할 수도 있다. 경우에 따라서는 파손을 염두에 두어야 할 경우도 있다.
ABL(오토 베드 레벨링) 센서 제작
이제 서보모터와 리미트 스위치를 이용하여 센서를 제작할 것이다.
준비물:
- 서보 모터: SG90
- 프로브(서보 모터 마운트와 서보암): 서보 모터를 쿨엔드에 장착할 마운트와 모터에 연결할 암(서보암 또는 프로브암)
- 마이크로 스위치: 날개를 떼거나 롤러가 달린 제품을 사용하는 것을 권장한다. 아래 그림은 롤러가 달린 제품이다.
1. 오토레벨링 장치 만들기
https://smartstore.naver.com/tmaking/products/6563006887
서보모터 마운트와 서보모터, 프로브암, 마이크로 스위치를 결합한다. 서보모터의 선과 마이크로 스위치의 선을 RAMPS에 연결한다. 마이크로 스위치 선을 Z축 엔드스탑 핀에 연결한다. 그리고 RAMPS의 VCC와 5V핀에 점퍼를 꽂아 쇼트시켜 전원이 인가되도록 해야 한다. 서보모터의 신호, 5V전원, 그리고 GND의 순서로 서보모터핀과 연결된다. 순서를 지키지 않으면 고장의 원인이 되므로 주의해야 한다.(아래 그림 참조)
2. 펌웨어 설정: 서보모터 설정
marlin 펌웨어를 수정해서 아두이노에 업로드하여 서보 모터를 작동가능하게 한다.
*** marlin1.1.6 ***
configuration.h
// Number of servos
//
// If you select a configuration below, this will receive a default value and does not need to be set manually
// set it manually if you have more servos than extruders and wish to manually control some
// leaving it undefined or defining as 0 will disable the servo subsystem
// If unsure, leave commented / disabled
//
#define NUM_SERVOS 1 //Servo index starts with 0 for M280 command
/**
* Z Servo Probe, such as an endstop switch on a rotating arm.
*/
#define Z_ENDSTOP_SERVO_NR 0 // Defaults to SERVO 0 connector.
*** marlin2.x.x ***
/**
* Number of servos
*
* For some servo-related options NUM_SERVOS will be set automatically.
* Set this manually if there are extra servos needing manual control.
* Leave undefined or set to 0 to entirely disable the servo subsystem.
*/
#define NUM_SERVOS 1 // Servo index starts with 0 for M280 command
/**
* Z Servo Probe, such as an endstop switch on a rotating arm.
*/
#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector.
서보 모터가 잘 작동하는지 확인하고, ABL(오토 베드 레벨링)을 위한 서보모터 회전 각도를 찾는다.
3. 펌웨어 설정: Z프로브 offset
필수적으로 Z프로브와 노즐 사이의 오프셋을 알아야 오토 레벨링이 작동할 때 정확한 측정 위치를 잡을 수 있다. Z프로브는 베드의 위치를 감지하므로 이 값이 정확해야 노즐이 베드에 닿지 않으면서 베드 안착(Bed Adhesion)이 성공하도록 할 수 있다.
이를 위해서 노즐을 베드 한가운데로 이동시키고, 수동 레벨링처럼 명함 한 장 정도의 간격으로 노즐과 베드 사이의 거리를 맞춘다. 그 다음 프런트페이스의 입력창에서 아래 명령어를 입력해서 노즐의 좌표를 (0,0,0)으로 설정한다.
> G92 X0 Y0 Z0
다음으로 노즐을 위로 올리고, 프로브암을 수직으로 내려서 마이크로 스위치가 베드에 닿을 수 있게 준비한다. Z축 엔드스탑이 작동할 때까지 M119 명령어를 사용하여 노즐을 조금씩 내린다.
프런터페이스의 통신창에서 아래와 같이 Z_min이 triggered로 바뀔 때까지 내린다.
>> SENDING: M119
X_min: open
Y_min: open
Z_min: triggered!
echo: endstops hit: Z:3.7
현재 위치를 확인하기 위해 M114명령어를 입력한다.
>> SENDING: M114
X: 12.01 Y:0.00 Z:3.70 E:0.00
Count X: 12.01 Y:0.00 Z:3.70
Z축에 출력되는 값이 노즐과 엔드스탑 사이의 간격이 된다.
4. 펌웨어 설정: 서보모터 설정(2)
- 서보모터 각도 설정:
서보 모터 각도를 설정하는 방법은 아래와 같다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
*** marlin1.1.6 ***
*** marlin2.x.x ***
/**
* Z Servo Probe, such as an endstop switch on a rotating arm.
*/
#define Z_SERVO_ANGLES {{0,0}, {0,0}, {112,25}} // X,Y,Z Axis Extend and Retract angles
{112,25}에서 112 값은 프로브 암이 베드와 수직일 때의 값이고, 25는 프로브 암이 베드에 닿지 않게 하기 위한 값이다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
- 서보모터 비활성화 설정:
ABL(오토 베드 레벨링) 완료 후 서보모터의 지터현상이 있을 경우 이를 막기 위해 DEACTIVATE_SERVOS_AFTER_MOVE 비활성화하여 서보 모터를 비활성화시켜야 한다.
서보 모터를 비활성화하는 지연 시간은 SERVO_DELAY값으로 설정한다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
*** marlin1.1.6 ***
*** marlin2.x.x ***
// Servo deactivation
//
// With this option servos are powered only during movement, then turned off to prevent jitter.
#define DEACTIVATE_SERVOS_AFTER_MOVE
// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle.
// 300ms is a good value but you can try less delay.
// If the servo can't reach the requested position, increase it.
#define SERVO_DELAY { 300, }
-----------------------------------------------------------------------------------------------------------------------------------------------------------
5. 펌웨어 설정: ABL(오토 베드 레벨링) 활성화
- ABL(오토 베드 레벨링) 설정 방법은 다음과 같다.
1. AUTO_BED_LEVELING_BILINEAR의 주석을 해제한 다음 ABL(오토 베드 레벨링) 기능을 활성화시킨다.
2. Z_MIN_PROBE_REPEATABILITY_TEST는 ABL(오토 베드 레벨링) 과정에서 각 지점에서 마이크로 스위치가 바닥(Z_min)까지 하강하는 것을 반복함으로써 정확도를 높이는 역할을 한다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
#define AUTO_BED_LEVELING_BILINEAR
// Enable the M48 repeatability test to test probe accuracy
#define Z_MIN_PROBE_REPEATABILITY_TEST
-----------------------------------------------------------------------------------------------------------------------------------------------------------
- 다음은 ABL(오토 베드 레벨링)을 할 때의 측정 위치를 결정하는 방법이다. 여기에서는 기본적으로는 BILINEAR 모드를 사용한다.
1. 먼저 주석을 해제하여 AUTO_BED_LEVELING_BILINEAR를 활성화한다. 반대로 여기에 주석을 붙여 비활성화하면 3점 모드가 작동하여 임의로 지정된 3개의 좌표에서 오토 레벨링을 수행한다.
2. LEFT/RIGHT/FRONT/BACK_PROBE_BED_POSITION 에서 주어진 좌표를 사각형의 네 꼭지점으로 잡고 격자를 그리며 ABL(오토 베드 레벨링) 을 하게 된다. LEFT/RIGHT값은 X축 좌표를 FRONT/BACK값은 Y축 좌표를 지정한다.
3. 이 사각형의 각 변의 길이는 MIN_PROBE_EDGE값보다 커야 하는데, 이 값을 특별히 수정할 필요는 없다.
4. GRID_MAX_POINTS_X 값으로는 2 또는 3을 주로 사용한다. 2를 사용할 경우 사각형의 네 꼭지점에서만 측정할 것이고, 3을 사용할 경우 9개 점에서 ABL(오토 베드 레벨링)을 수행하게 된다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
*** marlin1.1.6 ***
*** marlin2.x.x ***
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension.
#define GRID_MAX_POINTS_X 3
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
// Set the boundaries for probing (where the probe can reach).
#define LEFT_PROBE_BED_POSITION 50
#define RIGHT_PROBE_BED_POSITION 205
#define FRONT_PROBE_BED_POSITION 50
#define BACK_PROBE_BED_POSITION 205 // The Z probe minimum outer margin (to validate G29 parameters).
#define MIN_PROBE_EDGE 0 //10
-----------------------------------------------------------------------------------------------------------------------------------------------------------
- 이제 오프셋을 입력할 차례다.
앞서 3번 단계에서 찾은 각 축의 오프셋값을 입력한다. 이 때 X축, Y축의 오프셋은 정수여야 한다. X,Y축 오프셋은 정밀할 필요가 없다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
*** marlin1.1.6 ***
*** marlin2.x.x ***
#define X_PROBE_OFFSET_FROM_EXTRUDER 20 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 18 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER -10.8
-----------------------------------------------------------------------------------------------------------------------------------------------------------
- 다음은 나머지 부분에 대한 설명이다.
Z축 호밍을 시작하기 전에는 헤드를 일정 높이 들어올려야 한다(또는 베드를 하강시킨다). 프로브 암을 들어 올리거나 내리기 위해서는 충분한 여유공간이 필요하기 때문이다. Z_HOMING_HEIGHT 값은 그 높이를 결정한다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
*** marlin1.1.6 ***
*** marlin2.x.x ***
#define Z_HOMING_HEIGHT 4
-----------------------------------------------------------------------------------------------------------------------------------------------------------
이제 ABL(오토 베드 레벨링) 이 정상적으로 작동하는지 프런트페이스로 확인해 보고, 슬라이서의 스타트 코드에 반영하여 실제로 사용한다. ABL(오토 베드 레벨링) 을 위한 Gcode명령어는 다음과 같다.
G29
단, 프런터페이스는 물론 실제로 출력할 때에도 Z축 ABL(오토 베드 레벨링) 이전에 X축과 Y축의 호밍이 완료되어 있어야 한다. 따라서 슬라이서의 스타트 코드는 다음과 같은 식으로 수정되어야 한다.
G28 X0 Y0
G29
이 코드는 먼저 X축과 Y축의 호밍을 완료한 다음(G28), Z축의 ABL(오토 베드 레벨링) 을 수행하는(G29) 일반적인 스타트 코드이다. 그런데 종종 X축과 Y축의 호밍을 완료한 후 정지하고 "Z probe out.bed"라는 오류 메시지를 출력하는 경우가 있다. ABL(오토 베드 레벨링) 하는 시점에서 Z프로브가 베드를 벗어나 있기 때문이다. 앞에서 Z프로브와 노즐 사이의 X,Y,Z축 오프셋값을 측정하고 입력했던 것을 기억하는가? 프린터는 이 값을 바탕으로 Z프로브의 현재 위치를 추론한 후, 센서가 베드에서 벗어나 있다고 판단하면 ABL(오토 베드 레벨링) 을 중지시킨다.
이 문제를 해결하기 위해서는 오토 레벨링 전에 센서가 베드 내에 들어가는 위치로 프린터 헤드를 이동시켜야 한다. 따라서 스타트 코드는 다음과 같다.
G28 X0 Y0
G1 X40 Y5
G29
이 코드는 X축과 Y축의 호밍을 완료한 다음, Z축의 오토 레벨링을 수행하기 전에 먼저 헤드를 (40,5)의 좌표로 이동시킨다(G1). 센서가 베드 안에 충분히 들어가는 위치라면 어떤 값을 사용해도 무방하다. 이렇게 함으로써 오류가 발생하지 않도록 한다.
'3D프린팅' 카테고리의 다른 글
ABL(Auto Bed Leveling) & Z-offset adjustment (0) | 2022.09.23 |
---|---|
Open Build형 3D Printer의 케이스 제작 (0) | 2022.08.10 |
3D프린터의 10가지 혁신적 원칙 (0) | 2022.07.30 |
This AI Creates A 3D Model of You! (0) | 2022.05.26 |
Enclosure for marlin PS_ON (Auto power off your printer) (0) | 2022.05.26 |
댓글