본문 바로가기

▶3D 프린팅/삼디강좌

[김성민의 삼디 Life] G-code 기초 1 - 프린팅 완료 후 출력물을 쉽게 빼자

[김성민의 삼디 Life - Gcode 로 프린팅 완료후 출력물 쉽게 빼기]



처음 3D 프린터를 접하고 출력을 시도해보려고 하니

stl 을 gcode 로 변환을 해야 한다는 말을 듣는다. 


아니, 뭐가 그리 복잡해!

그냥 종이 인쇄하듯이 "인쇄" 버튼 누르게 하면 되지..

이런 마음이 든다. 

아마도 좀더 3D 프린터가 보급화되고 나면 2D 프린터처럼 곧바로 클릭한번만에 인쇄하는 날이 오지 않을까? 


어쨋든, 현재의 프린팅 방식은 반드시 슬라이싱이라고 하는 Gcode 변환을 거쳐야만 한다.

그런데, Gcode 라고 하는 것이 뭔가 거창하고 복잡한것 같았지만

안을 들여다보니 사실 별거 없었다. 

물론 처음에 열어보고는 무슨 암호문인가 싶었던 경험이 있지만 말이다. 



이번 포스팅에서는 왕초보의 눈에 암호문과 같아 보였던 Gcode를 

아주 쉽게 볼 수 있는 방법을 공유하고

G-code 를 살짝 변경하여 출력이 끝나면

출력물이 내 앞으로 나오면서 마치도록 End code 를 변경하는 것을 해보도록 하겠다. 



1. Gcode 는 G로 시작하는 명령어



Gcode 변환을 한다는 것은 G 로 시작하는 명령어의 연속을 만들어냄을 의미한다. 



사진에서 보는바와 같이 매 줄을 G 와 M 으로 시작하는 파일을 만드는데

이것을 G code 변환이라고 한다. 



1) M 코드 


여기서 M으로 시작하는 코드는 아마도 Machine 의 앞글자가 아닐까 싶다. 

M으로 시작하는 코드는 프린터 장치를 켜거나 끄거나 하는 등의 명령을 수행한다. 

예를 들어, 팬을 켜거나 끄거나, Bed와 노즐 온도를 높이거나 낮추거나

LCD 창에 특정 문장을 써놓는다거나,

모터 동작을 전체적으로 끈다거나 하는 동작을 수행한다. 

그러나 이건 알면 도움은 되겠지만 궂이 모른다고 해도 크게 문제가 되진 않는다. 

Cura, Simplify3D, IdeaMaker, Slic3r 등의 슬라이서 소프트웨어의 기본설정값은 M 으로 시작하는 코드를 아주 잘 셋팅해놓았기 때문이다. 

궂이 만지지 않아도 되는 값이라는 것이다. 

나는 현재 Cura 를 사용하고 있지만 Simplify3D 에서 Gcode 변환된 파일을 열어보면 프린터를 시작할 때와 마칠 때 M 코드는 거의 동일하다. 그냥 '복붙' 하더라도 크게 상관이 없다는 말이다. 


혹시 M 코드에 대해 궁금하다고 하면 아래 사이트에 들어가보면 아주 자세히 확인해 볼 수 있다. 


http://marlinfw.org/meta/gcode/


그런데 정리된 모든 M 코드가 다 쓰이는 것은 아니다. 

일반적인 프린팅 환경과 슬라이스 프로그램에서는 한정된 몇개의 M 코드만이 쓰이고 있어서 잘 쓰이는 것만을 다음과 같이 정리해보았다. 


## 가장 잘 쓰이는 M코드 9가지 ##

  • M104 Sxxx  ;  xxx 온도로 노즐온도를 셋팅한다.
                           M104 S190  190도로 셋팅
                           M104 S0      노즐을 끈다 (주로 마칠때)
  • M109 Sxxx  ;  노즐온도가 xxx 에 도달하기 까지 기다린다.
                          M109 S190  노즐온도가 190도가 되기까지 다음 동작을 하지 않고 기다린다.
  • M140 Sxxx  ;  xxx 온도로 베드온도를 셋팅한다
                          M140 S60  베드를 60도로 셋팅
                          M140 S0    베드 히팅을 정지한다 (주로 마칠때)
  • M190 Sxxx  ; 베드온도가 xxx 에 도달하기 까지 기다린다.
  • M82 ; 노즐 압출을 절대값 모드로 정한다 (기본설정)
              예를 들어, 익스트루더를 E 라고 했을 때 E1 에서 E2 로 변하면 1만큼 증가한다. 이것이 절대모드이다. E10 에서 E100으로 변했다고 하면 90 증가한 것이다. 
              그런데, 상대모드는 E1 에서 E2 로 변했다고 하면 첫번째 E1 은 1을 압출한 것이고, 다음으로 오는 E2 는 또 다시 2 압출한 것이다. 상대모드는 슬라이서에서 잘 사용이 안되는 것 같다. 그냥 M82 만 기억하자. 
  • M117 ; LCD 스크린이 있다면 거기에다가 원하는 문장을 써 넣을 수 있다. 
              예를 들어, M117 Merry Christmas 라고 쓰면  LCD 창에 Merry Christmas 라고 나타난다. Octoprint 에서는 현재 프린팅 진행사항은 LCD 창에 퍼센트로 나타내주는 플러그인이 있는데 M117 명령을 이용해서 구현하기도 한다. 
  • M84 ; Stepper 모터의 작동을 모두 끈다. 이 명령을 수행하면 노즐을 손으로 이리저리 위치이동시킬 수가 있다. Prusa 방식의 경우는 손으로 베드를 밀고 당기고 하면서 수동 베드 레벨링시 사용하면 좋다. 만약 프린터가 마치고 베드나 노즐을 손으로 움직여 왔다면 바로 M84 코드 덕분인 것이다.
  • M106  Sxxx ; Fan 을 켠다.  
                xxx 값에 해당하는 빠르기로 팬을 돌리는데 xxx 는 0 이 끈것이고 255가 팬의 가장 빠른 속도를 나타낸다. 
  • M107  ; Fan 을 끈다. 
               보통은 첫번째 레이어를 베드 안착을 위해 팬을 안돌리는데, 첫레이어 시작시 M107 코드를 만나볼 수 있다. 


그 외에도 가속도나 저크값을 바꾸거나 보드에서 음악이 나오게 한다거나 하는 저마다의 상황에 필요한 M 코드들이 준비가 되어 있으나 실제로 위에 있는 9개만 알아도 Gcode 를 이해하고 읽어내려가는데 하등의 문제가 없고, 저기에 나오지 않는 M 코드가 나왔다고 하면 위에 남겨놓은 링크를 눌러 잠시 확인해보기만 하면 된다. 하지만 그럴일은 거의없을 것이다. 대부분 9가지로 다 커버되기 때문이다. 



2) G 코드 


G 코드도 M 코드만큼까진 아니지만 종류가 많다. 

그러나 우리가 알아야 할 G 코드는 딱 5가지 뿐이다. 

이 다섯가지의 G 코드만 알면 수만 줄로 되어 있는 변환된 G 코드를 다 읽어낼 수 있기 때문이다. 그것도 쌍으로 되어 있는게 있어서 실제로 3가지 정도만 알면 된다. 


G0, G1


G0 과 G1 은 같은 코드다.

왜 동일한 동작에 두가지 코드를 사용하는지 이해가 가지 않을 만큼 똑같다.

다만 G0 은 노즐이 필라멘트를 압출하지 않고 그냥 이동할 때 많이 쓰이고

G1 은 노즐을 압출하며 이동할 때 많이 쓰이는 정도의 차이는 있다. 

내가 사용하는 Cura 슬라이서에서는 단순 이동시에는 G0 , 프린팅 이동시는 G1 을 사용하고 있지만, simplify3D 에서는 모두 G1 을 사용하고 있다. 


사용법은 다음과 같다. 


G1 X??? Y*** Z&&& E%%% F$$$$$


X, Y, Z 는 금방 이해 될거다.  G1 뒤에 X, Y, Z 가 있으면 거기에 입력된 장소로 노즐이 이동하는 것이다. 

예를 들어, G1 X110 Y110 Z1.0  이라고 하면 베드 사이즈가 220mm x 220mm 인 내 베드의 정 중앙으로 노즐이 이동하게 된다. 1mm 사이를 띄우고 말이다. 


보통은 Z 방향의 이동은 레이어가 올라갈때 한번쯤 발생하고 X, Y 만 줄기차게 바뀐다.  다음처럼 말이다. 



위에 예시를 든 G1 으로 시작하는 코드의 X, Y 좌료를 엑셀을 이용해서 값을 추출해서 좌표를 찍어보았다. 



그냥 노즐이 지나가는 경로를 하나씩 표시해준거나 다름이 없었다. 

그런데,  X, Y 값이 바뀌면서 함께 바꾸는게 있으니 바로 E 뒤에 있는 값이다. 

앞서 M 코드 설명할 때 잠시 등장했었는데 E 는 Extruder 의 준말로 Extruder 모터의 회전을 통해 필라멘트를 얼마만큼 내보냈는지를 나타내주는 용도로 쓰인다. 

만약 펌웨어의 Steps per Unit 의 셋팅이 잘 되어 있다면

G1 E100 이라고 명령하면 익스트루더 모터가 열심히 돌면서 필라멘트를 정확히 10cm 를 밀어내게 된다. 


마지막으로 F 는 Feedrate 이다. 속도를 뜻하는 것이다. 

앞서 나온 X, Y, Z, E 의 값은 모두 mm 단위를 가지고 있는데,

F 는 mm/Min 의 단위를 가지고 있다. 즉 분당 속도를 뜻하기 때문에

일반적으로 슬라이서 셋팅값인 초당으로 보기 위해서는 60으로 나눠주면 알 수 있다. 

F2400 이라고 하면  프린팅 속도 40mm/s 에 해당한다고 할 수 있다. 


여기까지가 전부다. G1 코드가 G 코드의 99% 이상을 차지하고 있기에 이제 대부분의 G 코드를 해석해낼 수 있을 것이다. 

이제 나머지 3개만 더 알면 되는데 그건 G1 에 비해 더 쉽다. 



G92


현재 위치를 주어진 값으로 셋팅하는 무시무시한 코드다.


예를 들어, 다음과 같은 경우를 생각해보자.


G1 X110 Y110 

G92 X0 Y0


첫번째 코드에 의해 노즐은 중앙으로 이동한다. 

두번째 코드는 중앙에 위치한 노즐의 X, Y 위치값을 0,0 으로 정해버리는 것이다. 


만약 내가 노즐을 오른쪽으로 1cm 만큼 옮기려고 했다면

이전 같으면  이렇게 했을 것이다. 


G1 X120   ;  Y 를 안적은 것은 Y 쪽으로는 안 움직였으니깐


그런데, G92 로 (0,0) 좌표로 바꾸고 났기 때문에 이제는 다음과 같이 적어주면 된다. 


G1 X10


만약 오른쪽이 아닌 중심에서 왼쪽으로 1cm 옮기고 싶었다면


G1 X-10


요렇게 해주면 된다. 


그런데, G92 코드는 X, Y 좌표값을 재정의 할 때는 쓰이지 않는다. 

어쩌면 End stop 이 걸렸을 때 펌웨어 단에서 사용이 되는 것 같긴 하지만, 일반적인 출력 상황에서는 X, Y 값이 시시때때로 바뀌어서 좋을 것은 없어 보인다. 


하지만 Extruder 에 대해서는 아주 빈번하게 사용된다. 다음과 같이 말이다. 


위 Gcode 는 심플리파이로 변환한 것인데 여기에 보면 G92 가 수시로 사용되고 있는 것을 볼 수 있다. 

한번 외벽을 그리고 나서 extruder 위치를 초기화 해서 매번 새출발을 한다. 

Cura 에서는 이와는 달리 계속해서 누적하며 출력이 끝날때까지 더해간다. 

그렇기 때문에 Gcode 의 끝에 가면 E 값이 심플리와 Cura 가 확연히 차이를 보게 된다. 



Cura 는 300 대의 값을 갖는 반면에  심플리파이는 여전히 1미만의 값으로 출력하고 있는데, 이는 G92 로 계속해서 초기화 하는 심플리파이만의 방식 때문에 그렇다고 할 수 있다. 

Cura 의 장점은 Gcode 의 끝단을 보면 필라멘트를 얼마나 사용했는지를 한눈에 볼 수 있다는 점이고,

Simplify3D 는 매 순간 얼마만큼 압출이 되고 있는지를 쉽게 확인해볼 수 있다는 장점이 있다. 


내가 이것을 모를 때에는 엄청나게 당황했던 적이 있다. 

Extruder 의 Step 값을 캘리브레이션 할 때 

G1 E100 F300 이라고 명령을 했는데... 명령이 전혀 안먹히는 것이었다. 

또 다음 순간 해보니 이번에는 압출을 하는게 아니라 필라멘트가 거꾸로 튀어나오고 있는 것이었다. 

그 경우는 방금전 G1 E100 F300 을 하고 나서

다시 압출량을 보고자 G1 E50 F300 을 연이어 명령했을때였다. 

당연히 익스트루더 모터는 현재 위치가 100 인데 지금 받은 명령이 50으로 가야 한다고 하니 이전에 지나왔던 곳으로 5cm 만큼 리트랙션을 시키게 되었다. 내가 바보같은 명령을 준 것이고 프린터는 충실히 명령에 따른 것이었다. 


이런 상황을 만들지 않기 위해서는 G92 E0 명령으로 익스투르더 위치를 초기화 해놓고 진행하는 것이 필요한데, 이것은 Start Code 에서 많이 보이는 형태이다. 




G90, G91



G90 은 절대좌표계이고

G91 은 상대좌표계를 뜻한다. 


예를 들어 


G90 

G1 X10 Y10 Z10 


이라고 하면 노즐은 (10,10,10)의 위치로 이동한다.


반면에


G91

G1 X10 Y10 Z10 


이라고 하면 노즐은 현재에 있는 위치에서 X축으로 10mm 만큼, Y 축으로 10mm 만큼, Z 축으로 10mm 만큼을 이동한다. 

즉 상대적인 위치로의 이동을 한다는 뜻이다. 

보통의 경우는 G90 만 알고 있으면 되는데, 특별한 상황에서는 상대좌표를 쓰는게 편리하다. 

다음과 같이 말이다 




2. End Code 를 수정하여 출력물 쉽게 꺼내기


출력이 모두 끝나고 만약 End code 가 설정되어 있지 않는다면

노즐은 마지막 압출을 진행한 위치에 그대로 멈춘채 

뜨거운 노즐의 열기로 출력물을 녹이기 시작할 것이다. 


그러나 다행이도 슬라이서 프로그램이 기본 End-code 를 제공해주고 있다. 


내가 쓰는 cura 는 다음과 같은 End code 를 가지고 있었다. 


(End Code)

M104 S0 ;extruder heater off

M140 S0 ;heated bed heater off (if you have it)

G91 ;relative positioning

G1 E-1 F300  ;retract the filament a bit before lifting the nozzle, to release some of the pressure

G1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more

G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way

M84 ;steppers off

G90 ;absolute positioning


친절하게도 내가 앞서 말한 M 코드와 G 코드에 대한 설명이 세미콜론 뒤에 작성이 되어 있다. 


위 G 코드는 이렇게 읽어볼 수 있다. 

프린팅이 마치면 일단 베드와 노즐 히팅을 끄고 (M104, M140)

상대좌표로 만든 후 (G91)

5mm/s 의 속도로 노즐을 리트랙션 하고 (G1 E-1 F300)

노즐을 0.5mm 출력물로 부터 위로 떨어뜨린 후에 (G1 Z+0.5)

왼쪽과 뒤쪽으로 20mm 만큼 속도 150mm/s 로 이동시킨후

x,y 홈으로 노즐을 이동시킨다 (G28 코드의 기능이다)

그 뒤 할 것 다했으니 스테퍼 모터를 정지시키고 (M84)

절대좌표로 다시 돌아온다 (G90)


처음에는 그런가 보다 하고 썼지만

G code 를 조금 알게 되고 나서는

뭔가 조금 더 편하게 쓰면 좋겠다 싶어서 이것을 수정하였고, 

결과는 다음 영상에서와 같이 되었다. 



그 전에는 노즐을 Home 위치로 이동시키다보니 

베드가 항상 안쪽으로 들어가 있어서 출력물을 꺼내기 위해서는

베드를 손으로 당겨 앞으로 가져오고 나서야 떼거나

혹은 클립을 제거할 수가 있었으나 이제는 앞으로 튀어나온 출력물을

보다 손쉽게 떼어낼 수 있게 되었다. 


내가 변경한 코드는 다음과 같다. 


<쉽게 출력물 꺼낼 수 있는 End Code>


G91 

G1 Z+0.5 E-1 F9000 

G90

G1 X-10 Y200 F3600 

M104 S0

M140 S0

M84


잠시 코드를 읽어보면 다음과 같다. 

먼저 상대좌표로 바꾼다 (G91)

그리고 노즐을 현재 마친 상태에서 0.5mm 띄우고 (Z+0.5) 리트랙션을 1mm (E-1) 아주 빠른 속도 (F9000)로 시킨다. 

이렇게 하는 이유는 노즐이 이후 움직일 때 표면을 긁는다거나 끝에 매달린 필라가 녹아져 내려오는 것을 방지하기 위함이다. 

그리고 다시 절대좌표로 바꾼다. (G90)

이제 노즐을 원하는 위치로 이동시킨다. (G1)

베드와 노즐의 히팅을 끄고 (M104, M140), 스테모터도 끈다(M84)



이 코드를 이해했다고 하면 

이제 스타트 코드와 엔드코드를 마음껏 바꾸어서

내가 원하는 기능을 수행을 하고 출력을 하게 한다거나

출력이 끝나고 나서 Action 을 다르게 줄 수 있다. 


그러나 조심하자. 

나는 처음 End code 를 미숙하게 만지다가 

5시간 진행한 출력물이 마치자 마자 

뜨겁게 달궈진 노즐과 히터블럭이 출력물을 짓누르는 경험을 했었다. 

ㅠㅠ 


그 경험때문인지 이제는 같은 잘못을 반복하지 않게 되는 것 같다. 



이제 경험이 쌓였으니

Octoprint 에서 pause 를 했을 때 노즐을 출력물 밖으로 빼고 노즐 변경을 한 후에 다시 Resume 을 통해 아까 멈췄던 곳으로 가서 다시 출력이 시작하도록 Gcode 를 변경해보도록 하겠다. 


그건 다음 포스팅을 통해 공유하고자 한다. 


Gcode 와 함께 즐거운 프린팅 생활 되길 바란다.  ^^





김성민의 북리지 - 함께 성장하는 책 리더십 지혜