여러분은 가만히 계세요 제가 모두 고장낼게요

IT 지식, PC 모바일 문제 해결 그리고 종종 애니 게임 일상생활 근황을 종종 올리고 있어요!

냐.한국 자세히보기

카테고리 없음

엔더3 무한출력 프린터 - 소프트웨어 메크로 구성

Kamilake 2023. 1. 7. 16:25
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

아직 케이블 정리와 출력물 센서, 출력물 트레이와 같은 부가기능들은 건드리지도 못했지만 하드웨어를 완성했으니 소프트웨어와 메크로를 구성할 차례입니다.

이 가이드를 따라 하시려면 Klipper 펌웨어가 설치된 무한출력 프린터가 필요합니다.

Klipper 초기 설치에 관해서는 나중에 포스트를 작성해 볼게요

https://kamilake.com/593

 

엔더3 무한출력 프린터 - 홀/탭가공 위치 정하기

프린터 구조 설계는 얼추 자리 잡은 것 같습니다. 저 디자인이 가장 나은 것 같아요 이제 알루미늄 프로파일들을 서로 결합하기 위한 카운터보어 홀들을 뚫어줄 차례입니다. 위 사진과 같은 부

kamilake.com

https://kamilake.com/595

 

엔더3 무한출력 프린터 - 기초 뼈대 조립하기

엔더3 무한출력 프린터 - 홀/탭가공 위치 정하기 프린터 구조 설계는 얼추 자리 잡은 것 같습니다. 저 디자인이 가장 나은 것 같아요 이제 알루미늄 프로파일들을 서로 결합하기 위한 카운터보어

kamilake.com

 

Marlin 또는 순정 펌웨어에서도 문제없이 작동하지만, Klipper의 메크로 기능을 위주로 설명하고 있기 때문에 Marlin에서 그대로 사용하고 싶다면 메크로 GCode를 직접 출력물 파일에 작성하세요.

저는 비어있는 32비트 라즈베리 파이 OS 서버 버전에 KIAUH로 구성된 Moonraker, fluidd UI를 갖고 있습니다.

다른 UI에서도 모든 방법은 똑같아요

작업 대기열을 만들고 자동으로 작업 대기열 순으로 출력하려면 [이 글]을 읽어주세요.

 

Klipper을 사용해서 일상적인 출력이 잘 될 때까지 오셨다면 아래 메크로를 구경하고 작동 방식을 파악해 보세요.

GCODE 반복 구성

먼저, printer.cfg에 [sdcard_loop]가 필요합니다. 

[sdcard_loop]는 Gcode 속에서 반복 구간을 정의할 수 있게 해 주는데, 이 구성을 사용하면 출력물을 무제한 프린트할 수 있습니다.

후술 할 프린터 작업 대기열을 구축하실 분에게는 필요 없을 수도 있지만, 몇 번 출력할 지에 따라 다른 Gcode를 만들어두고 사용하실 수도 있기 때문에 활성화해두시는 것을 권장합니다.

메크로를 사용하면 수동으로 Gcode를 편집하거나 기능을 추가할 때 수고를 줄일 수 있습니다.

 

출력 완료 메크로

이 메크로는 Cura에서 마지막 Gcode로 등록하기 위한 코드입니다.
이렇게 하면, 미리 슬라이스한 Gcode를 바꾸지 않고도 출력 마지막 동작을 정의할 수 있게 됩니다

[gcode_macro _PRINT_IS_FINISHED]
gcode:
  G91 ;Relative positioning
  G1 E-2 F2700 ;Retract a bit
  G1 E-2 Z0.2 F2400 ;Retract and raise Z
  G1 X5 Y5 F3000 ;Wipe out
  G1 Z20 ;Raise Z more
  G90 ;Absolute positioning

  M106 S0 ;Turn-off fan
  M104 S0 ;Turn-off hotend
  M140 S0 ;Turn-off bed
  ; M84 X Y E ;Disable all steppers but Z
  _WAIT_FOR_BED_COOLING
  REMOVE_OBJECT
  M84 X Y E

출력 완료 메크로는 Cura의 기본값을 가져왔습니다. 하지만 스텝모터 비활성화 코드를 사용하지 않고 냉각 대기와 출력물 제거를 위한 코드가 추가되었기 때문에 무한 출력에 사용할 수 있습니다.

출력물 제거 기본 메크로

[gcode_macro REMOVE_OBJECT]
description: 출력물 제거
gcode:
  TURN_OFF_HEATERS
  _WAIT_FOR_BED_COOLING
  G1 Z50 F3000.0
  G1 Y100 F5000.0
  G1 Y220 F100.0
  G28 Y
  G1 Y100 F5000.0
  G1 Y220 F500.0
  G28 Y
  G1 Y100 F5000.0
  G1 Y220 F1000.0
  G28

이 메크로는 베드에 붙어있는 출력물을 제거하기 위한 메크로입니다.(주의: Marlin에서도 사용할 수 있는 만큼 예시 코드에는 탈조를 체크하는 피드백 동작이 없습니다. 이 메크로를 사용하신다면 카메라 또는 눈으로 볼 수 있는 곳에서만 작업하세요.)

간단하게 베드를 앞 뒤로 세 번 움직이는데, 베드의 시작 부분이 출력물 이젝터 바로 아래로 들어가는 순간부터 속도를 아주 느리게 줄여줍니다.  마지막 움직임은 혹시 모를 상황을 대비해서 추가했기 때문에 속도를 조금 더 올려서 움직이도록 합니다.

 

출력물 제거 고급 메크로

[gcode_macro ACTIVE_REMOVE_OBJECT]
description: 출력물 제거
gcode:
  {% set max_retry = 5 %}
  G1 Z50 F3000.0
  G1 Y100 F5000.0
  G1 Y220 F100.0
  G1 Y10 F1000.0 ; Move to home but don't touch Y Endstop
  {% for wipe in range(max_retry) %}
    {% if printer.query_endstops.last_query["y"] %}
      ;bed ejection failed
      G28 Y
      G1 Z50 F3000.0
      G1 Y100 F5000.0
      G1 Y220 F100.0
      G1 Y10 F1000.0 ; Move to home but don't touch Y Endstop
    {% endif %}
  {% endfor %}

  {% if printer.query_endstops.last_query["y"] %}
    ;bed ejection failed more then max retry times
    M117 ejection failed more then {% max_retry %} times
    PAUSE
  {% endif %}
  G28

이 메크로를 사용하기 위해서는 python jinja2가 필요합니다.

먼저, 위 Marlin 호환 코드처럼 베드를 이동해 분리 동작을 수행합니다.

사람이 올라가도 안 흔들릴 정도로 아주 튼튼한 이젝터 프로파일이 베드 바로 위를 가로막고 있기 때문에 출력물이 붙어있는 상태에서는 절대로 베드의 Y 좌표가 "100+출력물 오프셋"을 넘기지 못하는데, 이를 이용하면 됩니다.

위 Gcode에서는 Y 좌표를 220까지 이동시켰다 다시 10으로 돌아옵니다.(0에는 엔드스탑이 있어서 가지 않습니다)

만약 베드 중앙(오프셋 50)에 출력물이 있다면 150까지는 문제없이 이동할 텐데, 베드는 220까지 이동하기 때문에 150에서 멈춰버린 베드는 스텝 스킵(탈조 현상)을 일으키고 150에서 멈춰있을 겁니다.

그 상태로 베드를 다시 좌표 10 근처로 이동하면 당연히 10을 지나 -70까지 가려고 하는데, 그러면 엔드스탑을 건드려서 이동을 멈추게 됩니다.

그 상태로 Klipper 함수 query_endstops를 사용해서 Y 엔드스탑 상태를 확인하고, 만약 리미트 스위치에 무언가 닿아 있다면 출력물을 제거하지 못한 상태이기 때문에 다시 제거동작을 반복하면 됩니다.

여러 번 시도해도 실패한다면 출력을 멈추고 디스플레이에 오류를 표시하면 됩니다.

성공했다면 더 이상 시도하지 말고 바로 다음 출력을 위해 이동하구요

 

베드 냉각 대기 메크로

[gcode_macro _WAIT_FOR_BED_COOLING]
description: 베드가 35도로 식을때까지 대기
gcode: 
  SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
  RESPOND PREFIX="info" MSG="start wait..."
  TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM=35
  RESPOND PREFIX="info" MSG="finish waiting!"

베드 히터를 끈 다음 배드의 최대 온도를 35도로 설정합니다.

35도까지 냉각이 완료되면 이어서 작업을 진행합니다.

 

프라임 블롭 출력 메크로

[gcode_macro PRINTHEAD_PRIME]
gcode:
  G28
  G1 F15000
  G1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
  G1 F15000
  G1 X0.1 Y10 Z0.5 F5000.0 ; Move to start position
  G1 F15000
  G1 X0.1 Y10 Z1 F15.0 E10 ; Start to print blob
  ; G1 F15000
  ; G1 X0.4 Y10 Z3 F100.0 E25 ; Move Z up
  G1 F15000
  G1 X0.4 Y10 Z4 F20.0 E30 ; Slow down
  G1 F15000
  G1 X0.4 Y10 Z5 F5000.0 E30 ; retract
  G1 F15000
  G1 X4.4 Y14 Z4.1 F5000.0 ; move away
  G92 E0 ; Reset Extruder
  G1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
  G1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish

이 메크로는 처음 출력을 진행할 때, 노즐 프라이밍을 위한 작은 출력물을 생성합니다.

브림, 스커트를 사용하거나 Cura에서 기본 제공되는 Ender의 프라임 라인을 그릴 수도 있지만 이들은 높이가 낮아서 이젝터 밑으로 그대로 통과하거나 베드 사이에 끼어버릴 수 있기 때문에 사용하면 안 됩니다.

Ender 프라임 라인은 이젝터를 통과할 수 없을 만큼 충분히 두껍지만 길이가 너무 길어 출력 중 베드가 제 위치에 있을 수 없어서 사용할 수 없습니다.

그렇게 하기 위해 두껍고 작고 오래 붙어있는 구조로 작은 블롭을 만들어서 해결하면 됩니다.

이 메크로는 Cura 등에서 시작 Gcode로 들어가게 됩니다.

 

메크로 구성 파일

printer.cfg
0.00MB

위 메크로들은 여러분에게 메크로의 역할과 동작을 설명하기 위해 작성되었습니다. 그대로 붙여 넣어도 아주 잘 작동하겠지만. Gcode를 이해하는 데에만 사용하는 것을 권장합니다.

후술 할 글에 피드백 센서를 장착하고, 카메라 객체 인식을 사용하고, 쿨링팬으로 더 빠르게 베드를

식히는 등의 추가기능이 늘어날 텐데, 그때 제가 향상된 printer.cfg 파일을 첨부파일로 올려 드릴거에요.