elsa in mac

Marlin - Linear Advance 기능 아시나요 ? 본문

3D 프린터/3D 프린터 관련 정보

Marlin - Linear Advance 기능 아시나요 ?

elsa in mac 2017. 11. 2. 15:40


이번 포스트에서는 Marlin 펌웨어에서 제공하는 Linear Advance에 대해 살펴 보도록 하겠습니다. 

올 4월에 Marlin 펌웨어에서 공식적으로 Linear Advance라는 기능을 제공하게 되었는데요.. Linear Advance 기능은 일종의 Pressure control(압출 제어) 기능 입니다. 

3D 프린터에서 압력과 관련된 부분은 딱 하나 바로 Nozzle 이죠.. Nozzle을 통해 필라멘트를 압출시킬 때, 압력이 필요 합니다. ^^

지금까지 3D 프린팅과 관련되어 가장 골치 아픈 난제 중의 하나가 바로 필라멘트 압출과 관련된 품질 문제 입니다. 이미 3D 프린터를 사용하고 계신 분들은 익히 경험을 하셨겠지만. 프린팅 전 노즐 가열 단계에서는 노즐을 통해 이미 녹은 필라멘트가 천천히 노즐 구멍을 통해 홀러나오는 Ozzling 문제가 있고, 프린트 중에는 각 Layer 프린팅의 시작과 종료 지점에 지저분한 "똥"을 남기는 문제가 있죠..  영문으로는 Seam, Blob 혹은 Zits 라고 부루죠.. 이 작은 필라멘트 덩어리 때문에 거미즐 즉, string이 발생하기도 합니다. 

또한 압출이 적절하게 설정되지 않은 경우, Line간에 Gap이 발생하기도 하고, Layer가 꽉 체워지지 않는 문제도 발생히게 되죠.... 

이러한 프린트 품질 문제에 적절히 대응하기 위해, Slicer S/W에는 다양한 기능들이 존재 합니다. 대표적인 것으로 한 Layer의 종결 시점에 압출을 중단하는 Coast와 종결 지점을 더 지나가면서 가열된 노즐로 문질러 버리는 WIpe 기능이 있고, 그 밖에 Over Extrution (압출 과다) 와 그 반대인 Under Extrusion (압출 부족)를 조절하기 위해 Layer Width나, Extrusion Multiplier, flow rate 등등을 적절하게 Tuning 하게 되죠...

이 모든 파라미터들이 조정하게 되는 최종은 결국 Nozzle 끝에 걸리는 압력을 조절하는 것입니다.  물론 시간이라는 변수가 포함되죠..  단위 시간에 얼마나 빨리 필라멘트를 압출시키느냐... 즉, 바꿔 말하면 상황에 따라 얼마 만큼의 필라멘트를 밀어내거나 혹은 반대로 잡아 당기느냐에 따라 프린트의 품질이 좌우되게 됩니다. 

3D 프린터의 X와 Y는 서로 동기화 되어 있습니다. 동기화 되어 있지 않다면.. 엉망 진창으로 프린트가 되겠죠... Z축의 경우에는 기본적으로는 동기화 되어 있지 않습니다. Z축이 동기화 되어 있지 않다고 말할 수 있는 이유는 한 Layer를 그리고(X, Y) 다음 Layer를 그리기 위해 일정 높이를 올라갈 때, 천천히 올라가던 빨리 올라가던 상관이 없기 때문입니다.  Mesh Auto Leveling을 사용하는 경우는 X,Y 위치에 따라 미세하게 Z축 높이를 조절하기는 하지만, 이것은 어디까지나 수평을 맞추기 위한 부가적인 동작일 뿐 모델의 프린팅 정보는 아닙니다. 하지만, X,Y는 이니죠.... 만약 X축 모터와 Y축 모터에 대한 Acceleration, jerk, velocity등이 각각 다르다면, 동기화를 위헤 저속으로 설정된 쪽에 맞춰지게 될 겁니다. 

그럼 필라멘트를 밀어내는 Extruder는 어떨까... Extruder는 동기화 되어 있다고도 볼 수 있고 아닐 수도 있습니다. X,Y가 바뀌지 않는데 필라멘트를 밀어낼 이유가 없죠.. 하지만, 엄밀히 말하면 X,Y와 정확히 동기화 되어 있다고 보기 힘듭니다. 

코너가 round된 모델의 한 Layer를 출력할 때, 코너 부분에서 출력 속도가 줄어 듭니다. 자동차로 코너링을 할 때와 별반 다르지 않죠.. 출력 속도가 줄어든다면 당연히 필라멘트가 압출되는 속도도 줄어들어야 합니다. 그리고, 다시 코너를 돌아 직선을 쭉 그려야 한다면 원래의 속도로 상승을 할 것이고, 이에 따라 필라멘트 압출 속도도 적절히 올라가야 겠죠...

어찌 보면, 이러한 Extruder의 동기화가 당연한 것 같은데, 실상 우리는 그렇게 출력하고 있지 않습니다. 물론, Slicer S/W들이 G-Code를 생성할 때, 각 레이어의 이러한 동기화 요소들을 어느정도 반영을 하고 있다고 생각되지만, 그리 뛰어난 것은 아닙니다.  즉, Slicer의 성능과 알고리즘에 따라 앞서 말씀 드린데로 Extruder는 어느 정도 동기화되어 있을 수도 있고, 없을 수도 있습니다.  Slicer의 우수성을 평가하는 성능 지표 중에 하나는 바로 이와 같이 모델 분석과 압출조절을 통해 동일한 모델을 얼마나 좋은 품질로 뽑을 수 있는 G-Code를 생성해 낼 수 있느냐 하는 것에 있다고 볼 수 있습니다. 

자.. 다시 본론으로 돌아가서, Marlin에서 Slicer와는 무관하게 G-Code를 분석... 필라멘트 압출을 X,Y와 동기화 시키는 기능이 바로 Linear Advance 기능 입니다.  즉, 앞서 설명드린데로.. 느린구간과 빠른구간, 출력된 방향과 반대방향으로의 급속한 병향 전환 등등의 동작을 간파하고 그에 적절하게 대응하여 프린트 하는 내내, 끊임없이 필라멘트 압출을 조절 하는 기능인 것이죠..

우선, Linear Advance 기능을 활성화하는 방법은 간단합니다. 

Marlin 펌웨어 소스의 Configuration_adv.h 파일을 열어 보면, 아래와 같이 Implementation of linear pressure control 이라는 섹션이 있습니다.  

위의 소스를 기준으로 624라인에 보시면, //#define LIN_ADVANCE 라고 주석처리가 되어 있는 것을 확인할 수 있습니다. 이 부분의 주석(//)을 제거하여 기능을 활성화 시켜 주면  됩니다. 

Linear Advance는 K 라는 값을 조절하여 Pressure control 정도를 조절할 수 있게 되어 있는데, 0 이상의 값으로 정의 됩니다. 이 값이 0 라는 의미는 Linear Advance 기능을 사용하지 않는다는 의미가 되죠.. Max 값은 정해진 것이 없지만.. K 값이 높을 수록 Pressure control의 강도가 높아집니다. 

즉, 속도가 가변하는 구간이 있다고 치고, K 값이 낮으면 가변 구간에서 압력을 조절을 드문드문 하게 되며, K값이 높아지면 아주 세밀하게 자주자주 압력을 조절하게 됩니다.  K값이 높으면 좋을 것 같지만.. 압력을 조절한다는 것은 결국 Extruder의 모터를  정지, 압출, 역회전 이 3가지 모션을 사용하는 것 이므로 대단히 시끄러워 질 수 있습니다. 

또한 아주 좁은 구간에서 압출과 역회전을 너무 자주하면 동일한 필라멘트 부분이 기어에 달아서 약해지거나 끊어질 수도 있겠죠... (시끄러워 지는게 더 큰 문제지만....)

Linear Advance 기능은 Marlin이 직접 압출제어를 하는 것이기 때문에, Slicer에서 설정한 압출제어 기능을 모두 OFF 시켜야 합니다. 그렇지 않을 경우 오 동작으로 오히려 품질이 더 나빠질 수 있죠.. 즉, coast, wipe, extra restart retraction distance, 등등의 기능은 모두 사용하면 안 됩니다. 바꿔 말하면 오직 retraction Distance만 유효하다고 볼 수 있습니다. 

기본 설정은 M900 이라는 G-Code를 사용하는데, 형식은 다음과 같습니다. 

M900 Wxxx  Hyyy Dzzz

M900 Kxxx

W는 extrusion width, H는 layer Height, D는 필라멘트의 직경(Filament diameter) 입니다.  위의 두 줄을 slicer의 start script 에다 추가를 해 주면 되죠. 위치는 어디든 상관이 없습니다.  예를 들어, layer height 0.2mm, width 0.42 mm, 필라멘트 1.75mm를 사용한다면, M900 W0.42  H0.2  D1.75 이렇게 설정을 하면 되겠죠.. K 값은 실제로는 Try & Error를 통해 자신이 만족할 만한 값을 찾야야 합니다. calibration cube나 작은 사각형 모델등을 출력해 보면서 찾으면 되겠죠..

K 값은 Controller의 LCD 창의 Control > Filament > Advanc K 에서도 변경을 할 수 있습니다.  위의 소스에서 #define LIN_ADVANCE 를 활성화 시켜 주면 나타나게 되죠.

자 그럼 실제 이 기능을 썼을 경우의 효과가 있느냐 인데...

제 개인적은 경험으로는 상당히 좋습니다. 이미 예전부터 사용해 왔고..현재도 계속 사용하고 있죠.. 따라서, 이 기능을 사용했을 경우의 출력물 품질은 제 블로그에 올린 출력물들을 보시면 그냥 확인이 됩니다. coast나 wipe 등등을 사용하지 않아도, 아주 깨끗한 표면과 Top Layer 품질을 얻을 수 있습니다.  매우 만족스러워요...

다만......

앞서 말씀 드린데로.. Extruder와 모터가 상당히 시끄러워 집니다.  저의 경우에는 TMC2100 드라이버를 적용하여 사용하고 있기 때문에 시끄러운줄을 모르겠지만... SBase Controller나 DRV4988, DR8825등 여타 다른 모터 구동 드라이버들을 사용하고 계시다면, 이전 보다 훨씬 시끄러워 질 겁니다.  챔버를 사용하고 걔시다면 별 상관이 없을 수도 있고....

이론적으로는 지속적으로 끊임없이 압력조절을 하기 때문에, retraction이 필요없거나 혹은 기존의 retraction 값을 줄일 수 있다고 하지만, 저의 경우에는 그렇치 않습니다. retraction 값은 그냥 그대로 4mm ....  이 것은 아마도 hotend의 구성에 따른 것 같기도 하고, 보우덴 방식을 사용하고 있기 때문일 수도 있다고 이해하고 있습니다. 

혹시, 기존에 품질 문제로 고민을 하고 계신 분들 중에 아직 Linear Advance 기능을 사용해 보지 않으셨다면, 시간 나실 때 Try 해 보시기 바랍니다. 

아래는 참고 링크들 입니다. 

Marlin - M900 - Linear Advance Factors

Marlin - Linear Advance 설명 (영문)

공유하기 링크
Comments