본문 바로가기
Hardware/3D Printing

중간에서 멈춘 3D 프린터 출력물 심패소생, Gcode 수정으로 멈춘 위치에서 이어서 출력하기

by lovey25 2020. 9. 7.
반응형

3D 프린터 사용할 때 갑자기 출력이 중단되는 것만큼 난감한 상황도 없습니다. 몇십 분짜리 작은 모델 출력 중이라면 다시 하면 되지만 몇 시간짜리 출력 중인데 절반 이상 출력했거나 아니면 거의 다 끝나갈 무렵 출력이 멈춘다면 멘붕 멘붕 그런 어처구니없는 상황은 또 없습니다.

그런 난감한 상황에서 지푸라기라도 잡는 심정으로 멈춘 부분부터 나머지 출력을 이어서 하는 방법 알아보겠습니다.

저는 아래와 같은 모델을 출력중에 난감한 상황을 겪었습니다. 

겨우 92개 레이어에 3시간 남짓한 출력시간이 소요되는 출력물로 3D 출력 계에서는 보잘것없는 모델에 불과하지만 3시간 이상 걸리는 작업에서 이미 2시간을 넘어서 출력이 되고 있는 상황이었기 때문에 갑작스러운 SD카드 오류가 떠서 멍청하게 멈춰있는 프린터를 봤을 때 그 상실감은 결코 보잘것없는 게 아니었습니다. ㅠ.ㅠ

최근, 손대지 않았는데 SD카드가 제거되었다는 메시지가 저절로 뜨는 경우가 가끔 있어서 좀 불안하다 했었는데 결국 이사단이 나 버렸네요. 거의 출력 끝나가던 상황이라 그냥 포기하긴 너무 아까워서 이어 붙이기 시도했습니다.

3D 프린터는 Gcode라고 하는 스크립트를 기반으로 일련의 명령어들을 순서대로 수행을 하면서 출력 수행하게 됩니다. 그렇기 때문에 출력이 멈춘 위치를 알아낼 수 있다면 남아있는 스크립트를 계속 실행하는것 만으로 아무 일 없던 것처럼 출력을 마무리할 수 있게 됩니다.

그래서 이어 붙이기가 성공하기 위한 전제조건이 바로 중단된 출력물이 베드에서 움직이지 않고 그대로 있어야 하는 것입니다. 만약 조금이라도 움직여 버렸다면 원래 좌표에 딱 맞게 다시 위치시키는 건 거의 불가능하지 않을까 싶습니다. 출력물이 아직 베드에 안착된 상태라면 다음으로 해야 할 중요한 일은 중단된 출력 위치를 파악하는 것입니다. 기존 출력물의 좌표계와 이어 붙일 좌표계가 일치해야 하는 건 당연한 것이고 어디서부터 출력을 계속해야 할지도 알아야 거사가 성사될 수 있겠죠.

저는 멘붕을 맞은 상황이라서 프린터 화면에 뜬 Z 축 자표를 확인하지 않고 그냥 프린터를 꺼버리는 바람에 Z 축이 얼마나 올라가서 멈춘 건지 확인을 못했습니다. 하지만 다행히 출력물은 베드에 안착된 상태로 손대지 않았고 Time Lapse로 레이어마다 한 장씩 사진을 찍던 중이라서 몇 장의 사진이 찍혔는지 확인해서 중단된 레이어를 알아낼 수 있었습니다.

제 경우 34번째 레이어까지 출력이 완료되었고 35번째 레이어에서 출력이 멈추었습니다. 하지만 저처럼 중단된 레이어를 확인할 수단이 없더라도 알아낼 수 있는 방법은 있습니다.

프린터 컨트롤 프로그램으로 Frontface 많이 사용하실 텐데요. 이런 컨트롤 프로그램을 통해서 노즐을 조금씩 움직여서 중단된 출력물에서 가장 높은 곳과 최대한 만나도록 한 다음 Z좌표값을 읽는 것입니다. 정확하게 딱 맞는 위치가 어딘지 아주 정확하게 파악하는 게 쉽지는 않지만 아주 어려운 것도 아닙니다.

왜냐하면 레이어 높이를 0.1mm 이하로 아주 미세하게 출력하는 전문가라면 이 글을 보고 있지도 않을 테고 보통 레이어 간격은 0.2~4mm 정도를 가장 많이 사용하게 될 텐데 만약 0.3mm 레이어 높이로 출력을 했고 10번째 레이어에서 출력이 중단되었다고 가정해보면 10번째 레이어 높이는 3mm이고 그전과 후의 레이어는 2.7mm, 3.3mm라서 이 정도라면 육안으로 확인해도 충분히 근접한 레이어의 순서를 확인할 수 있습니다.

제 경우 0.2mm 간격에 34번째 레이어까지 출력이 끝나고 35번째 레이어를 출력하던 중에 종료되었습니다. 34번째 레이어의 높이는 6.9mm인데요. (초기 레이어 높이(0.3) + 레이어 간격(0.2)*최초 레이어를 제외한 나머지 레이서 수(33)=6.9) 결론적으로 높이 7.1 ~ 7.3mm 사이 어느 즈음에서 다시 시작해야 한다는 결론을 낼 수 있습니다. 

이제 Gcode를 열어서 이어 붙이기 편집이 가능하도록 코드를 살짝 편집하겠습니다.

출력에 사용된 Gcode를 열어서 "Z7.3"을 검색합니다.

Z7.3이 나오는 20833행 앞부분에서 이미 출력이 끝난 부분을 지워주면 되는데요. 여기서 살짝 애매한 부분이 그 정확한 위치를 찾는 것입니다. 그래서 저는 과감히 Z7.1 레이어는 포기하고 20833행 앞은 모두 지웠습니다. 다만 맨 앞에 초기화 코드는 다시 출력을 시작해도 필요하니 살려둡니다. 아래 캡처한 코드가 Gcode의 앞부분입니다.

Gcode의 시작 시 20행까지 homing, 노즐과 베드 온도 설정으로 주는 코드가 있고 21행부터 28행까지 익스트루더를 초기화하는 코드가 있으니 29행까지는 살려두고 30행부터 위에서 찾은 20832행까지를 삭제합니다. 수정된 코드는 아래와 같은 모습이 되겠죠.

이제 큰 틀은 정리가 되었습니다. 마지막으로 Gcode편집을 끝내기 전에 확인해야 할 사항 3가지가 있습니다.

먼저 출력 초기화 부분에 프린터 노즐을 움직이도록 하는 코드가 있다면 이미 출력되어 있는 모델과 부딪칠 수 있는 가능성이 있는지 확인해야 합니다. 위 코드에서는 20행에서 homing을 하고 출력 직전에 배드면으로 빠르게 접근하기 위해서 15mm 높이까지 이동하게 하는 명령어가 21행에 있습니다. 저는 출력물이 7mm가량에 불과하기 때문에 문제없지만 만약 출력물이 15mm 이상까지 출력이 되어 있는 경우라면 이 코드를 삭제하거나 수정해야겠죠.

다음으로 팬 속도를 확인합니다. 요즘은 배드와 안착을 좋게 하기 위해서 출력 초기 몇 레이어에서는 쿨링팬을 동작하지 않도록 하는 방식으로 Gcode가 만들어지기 때문에 앞에서 날려버린 코드에서 쿨링팬을 켜주는 코드가 포함되어 있었다면 그 부분을 살려주어야 합니다. 그래서 저는 32행에 "M106 S255" 코드를 넣어서 쿨링팬을 동작하도록 해 주었습니다.

마지막으로 가장 중요한 익스트루더 초기화 작업에 수정이 필요합니다. 출력을 하는 동안 노즐 위치는 프린터 출력 공간의 절대좌표를 따르기 때문에 선행된 코드의 유무가 후행 코드에 영향을 미치지 않습니다. A위치에서 출력을 하라면 A위치로 가면 그만이죠 하지만 익스트루더는 얘기가 다릅니다. 익스트루더의 기준값은 출력을 시작하는 시점의 필라멘트 위치를 0이라고 가정하고 0에서부터 밀어내는 필라멘트의 상대 길이를 바탕으로 출력이 진행되기 때문인데요. 앞서 우리는 필요 없는 선행 코드를 지워버렸기 때문에 그동안 사용된 필라멘트 길이만큼 밀어내야 할 중간과정이 없어졌습니다. 그래서 현재 필라멘트 위치 값을 영점으로 인식하도록 코드 수정이 필요합니다. 35행에서 G1 F30000 E3397.25224라는 코드가 나타나는데 이상태 대로라면 프린터기는 출력을 시작하자마자 필라멘트를 3.3m를 일단 뽑아내고 시작하게 됩니다. 그래서 33행에 추가된 G92 명령어에 35행의 익스트루더 값 E3397.25224를 복사해서 현재 필라멘트의 위치가 3393.25224만큼 이미 밀어낸 상태임을 강제로 재설정해 줍니다.

이제 모든 준비가 끝났습니다. Gcode를 다시 프린터로 보내서 출력을 하고 죽어가는 모델을 살리면 되겠습니다.

다행히 출력은 잘 마무리가 되었습니다. 3시간짜리 출력을 다시 해야 하나 조마조마했는데 심폐소생에 성공했습니다.

워낙 벽면 출력 품질이 좋지 않아서 이어 붙이기가 얼마나 잘 된 건지 말씀드리긴 힘들지만 출력을 재개하는 위치가 저처럼 단순한 판이 이어지는 구조가 아니라 볼륨이 있는 모델인 경우에는 출력 중단 지점이 많이 티가 나지도 않을 것 같아서 충분히 유용하게 사용할 수 있을 팁인 것 같습니다.

반응형

댓글