13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Mainsail

  • [3D Printer] Marlin vs Mainsail: 펌웨어와 웹UI 조합 가이드

    [3D Printer] Marlin vs Mainsail: 펌웨어와 웹UI 조합 가이드

    Marlin vs Mainsail, 3D 프린터에서 뭘 골라야 덜 고생할까

    3D 프린터 세팅을 만지다 보면 꼭 한 번은 Marlin Mainsail 비교 검색을 하게 되더라고요. 저도 처음엔 둘이 같은 층위에서 경쟁하는 줄 알았습니다. 근데 실제로 써보니까 이건 펌웨어(firmware, 프린터를 직접 제어하는 소프트웨어)와 웹 인터페이스(web interface, 브라우저에서 관리하는 화면)를 한 줄에 놓고 보는 바람에 헷갈리는 경우가 많았던 거더라고요. 쉽게 말해 Marlin vs Mainsail은 완전히 1:1 비교가 아니라, 실전에서는 Marlin vs Klipper + Mainsail 쪽으로 이해해야 맞습니다.

    제가 홈랩에서 엔더 계열, 클론 보드, 라즈베리 파이 조합으로 이것저것 굴려보니 선택 기준이 꽤 명확해졌거든요. 오늘은 그 기준을 정리해보겠습니다. 3D 프린터 펌웨어를 안정성 기준으로 볼지, 아니면 Mainsail 설정까지 포함해서 운영 편의성으로 볼지에 따라 답이 달라져요.

    Marlin Mainsail 비교를 위한 3D 프린터 제어 구조 다이어그램

    Marlin은 메인보드에서 직접 동작하고, Mainsail은 보통 Klipper와 Moonraker 위에서 동작하는 웹 화면이라는 관계를 한눈에 보여주는 그림입니다.

    1. 먼저 정리: Marlin과 Mainsail은 다른 걸 비교하는 겁니다

    여기서 중요한 포인트! Marlin은 오픈소스 3D 프린터 펌웨어고, Mainsail은 Klipper 기반 프린터를 브라우저에서 관리하는 프런트엔드(front-end, 사용자 화면)예요. 즉 Mainsail은 보통 Klipper + Moonraker 조합 위에서 의미가 있습니다.

    처음엔 이게 뭔가 싶었는데, 개념만 바로 잡으면 선택이 훨씬 쉬워져요.

    • Marlin: 프린터 메인보드에 직접 올라가는 전통적인 펌웨어
    • Klipper: 메인보드와 호스트 장치(주로 Raspberry Pi)를 함께 쓰는 구조의 펌웨어 시스템
    • Mainsail: Klipper를 웹에서 편하게 관리하는 UI
    • Moonraker: Klipper 상태를 API로 제공하는 서비스

    그래서 엄밀히 말하면 비교 질문은 이렇게 바꾸는 게 정확해요.

    “안정성과 단순함의 Marlin을 쓸까, 아니면 Klipper + Mainsail로 운영 편의성과 튜닝 속도를 가져갈까?”

    2. 실제로는: 어떤 사람이 어떤 조합을 써야 할까

    제가 직접 해보니 선택 기준은 결국 세 가지더라고요. 설치 난이도, 운영 편의성, 튜닝 빈도예요. 프린터를 한 번 맞춰놓고 오래 쓰는 분은 Marlin이 편하고, 세팅을 자주 바꾸고 매크로(macro, 반복 작업 자동화)를 많이 쓰는 분은 Klipper + Mainsail이 훨씬 낫더라고요.

    항목 Marlin Klipper + Mainsail
    구조 메인보드 중심 메인보드 + 호스트 장치
    초기 진입장벽 상대적으로 낮음 상대적으로 높음
    설정 변경 재빌드/재플래시가 잦을 수 있음 설정 파일 수정 후 재시작 중심
    웹 관리 기본 제공 아님 Mainsail로 매우 편함
    매크로 활용 제한적 강력함
    튜닝 속도 보수적 빠른 반복 작업에 유리
    추천 사용자 안정성 우선, 입문/순정 유지 개조 잦음, 자동화 선호, 홈랩 성향

    사실 저는 한동안 Marlin만 썼어요. 이유는 단순했어요. 고장 포인트가 적고, 한번 맞춰두면 조용히 돌아가거든요. 그런데 프린터를 두 대 이상 돌리고, 시작 매크로와 정지 매크로를 자주 손대기 시작하니까 Mainsail 쪽이 너무 편했더라고요. 이거 진짜 편하더라고요.

    3. Marlin이 여전히 좋은 이유

    3-1. 순정에 가깝게 오래 쓰는 프린터

    보드 교체가 없고, 센서 추가도 많지 않고, 프린트 프로파일도 어느 정도 고정되어 있다면 Marlin은 여전히 좋은 선택이에요. 3D 프린터 펌웨어로서 검증된 생태계가 넓고, 보드 호환 사례도 많거든요.

    3-2. 단순함이 곧 안정성인 경우

    라즈베리 파이나 별도 SBC(single-board computer, 초소형 단일보드 컴퓨터)를 두지 않아도 되니 구조가 단순해요. 실제로 서버실 관점에서 보면 관리 대상이 하나 줄어드는 셈이죠. 저는 장비 수가 늘어날수록 이런 단순함이 꽤 크게 느껴졌어요.

    3-3. 이런 분께 추천합니다

    • 프린터 한 대를 오래 안정적으로 쓰고 싶은 분
    • 웹 대시보드보다 본체 LCD나 기본 호스트 프로그램이 익숙한 분
    • 펌웨어를 자주 뜯어고치지 않는 분

    4. Mainsail이 빛나는 순간: Klipper와 함께할 때입니다

    Mainsail 설정을 한 번 끝내놓으면 그다음부터 운영 경험이 확 달라져요. 브라우저에서 상태를 보고, 매크로를 버튼으로 실행하고, 설정 파일을 바로 수정하고, 로그도 확인하기 쉬워집니다. 홈랩 운영자 입장에서는 이게 진짜 커요.

    특히 이런 상황에서 체감이 큽니다.

    • 베드 메시(bed mesh, 베드 높이 보정 지도)를 자주 다시 잡는 경우
    • Pressure Advance(압출 선행 보정), Input Shaper(진동 보정) 같은 튜닝을 반복하는 경우
    • 프린터 여러 대를 한 화면에서 관리하고 싶은 경우
    • 매크로로 프리히트, 노즐 청소, 종료 루틴을 자동화하고 싶은 경우

    저도 처음엔 Klipper vs Marlin 논쟁을 성능 중심으로만 봤는데, 실제로는 운영 편의성 차이가 더 크게 느껴졌어요. 출력물 품질만 놓고 단정할 문제는 아니고, 내가 얼마나 자주 세팅을 만질 사람이냐가 핵심이더라고요.

    Mainsail 설정 흐름을 보여주는 홈랩 3D 프린터 운영 화면

    Mainsail에서 온도, 작업 상태, 매크로 버튼, 설정 파일 편집이 한 화면 흐름으로 이어지는 모습을 보여주는 이미지 자리입니다.

    5. 실전 구현: 제가 실제로 확인하는 최소 점검 루틴

    여기서는 딱 실무적으로 가보겠습니다. 새 장비를 받거나 기존 프린터 구성을 정리할 때 저는 먼저 현재 상태를 읽고, 그다음 운영 방식에 맞는 조합을 고르거든요.

    5-1. Marlin 환경에서 먼저 확인할 것

    Marlin 장비는 G-code(지코드, 프린터 제어 명령) 몇 개만으로도 상태 점검이 꽤 돼요.

    1. 펌웨어 정보 확인
    2. 저장된 설정 확인
    3. Z 오프셋이나 메시 상태 확인
    4. 필요하면 저장
    # 터미널 또는 호스트 소프트웨어에서 전송하는 예시 G-code
    M115    ; 펌웨어 정보 확인
    M503    ; 현재 저장된 설정 출력
    M851    ; Z probe offset 확인
    M500    ; EEPROM 저장

    여기서 팁 하나. M503 출력은 꼭 보관해두세요. 저도 예전에 감으로 만지다가 기존 값이 뭐였는지 몰라서 한참 삽질 좀 했습니다 ㅎㅎ

    5-2. Klipper + Mainsail 환경에서 먼저 확인할 것

    Mainsail 쪽은 서비스가 살아 있는지부터 보는 게 좋아요. 프린터가 멈춘 것 같아도 실제로는 Klipper가 아니라 Moonraker나 웹 서버 문제인 경우가 꽤 많거든요.

    sudo systemctl status klipper
    sudo systemctl status moonraker
    sudo systemctl status nginx

    이후에는 설정 파일에서 운영에 필요한 최소 섹션을 먼저 확인해요.

    # printer.cfg 예시
    [virtual_sdcard]
    path: ~/printer_data/gcodes
    
    [pause_resume]
    
    [display_status]
    
    [gcode_macro START_PRINT]
    gcode:
      G28
      BED_MESH_PROFILE LOAD=default
      G92 E0
    
    [gcode_macro END_PRINT]
    gcode:
      M104 S0
      M140 S0
      G91
      G1 Z10 F300
      G90
      G1 X0 Y220 F6000

    이 정도만 있어도 웹에서 운영하는 맛이 나더라고요. 매크로 버튼 한 번으로 루틴이 정리되니까요. 처음 세팅할 때는 귀찮아도, 두 번째 프린터부터는 시간 절약이 확 느껴져요.

    5-3. Mainsail 업데이트 관리 예시

    Mainsail은 보통 Moonraker의 Update Manager(업데이트 관리자)를 통해 관리돼요.

    # moonraker.conf 예시
    [update_manager]
    refresh_interval: 168
    enable_auto_refresh: True
    
    [update_manager mainsail]
    type: web
    channel: stable
    repo: mainsail-crew/mainsail
    path: ~/mainsail

    이 설정은 웹 인터페이스 쪽 업데이트 관리를 붙일 때 많이 보는 형태예요. 다만 여기서 중요한 건 업데이트 전에 백업하는 거예요. 특히 Klipper 계열은 업데이트 후 MCU 재플래시가 필요한 경우가 있어서, 출력 일정 있을 때는 섣불리 올리면 안 돼요.

    Mainsail 설정과 3D 프린터 펌웨어 구성을 설명하는 설정 비교 이미지

    Klipper의 printer.cfg와 Moonraker 설정 파일이 각각 어떤 역할을 하는지 구분해서 보여주는 이미지 자리입니다.

    6. 조합 추천: 제가 실제로는 이렇게 고릅니다

    6-1. 입문자 또는 순정 유지형

    Marlin 추천이에요. 프린터를 한 대 운용하고, 설정 변경이 많지 않다면 이쪽이 덜 피곤하거든요. 문제 생겼을 때 검색되는 사례도 많고요.

    6-2. 개조형, 홈랩형, 자동화 선호형

    Klipper + Mainsail 추천이에요. 특히 BLTouch류 프로브, 베드 메시, 매크로 자동화, 여러 필라멘트 프로파일 관리까지 들어가면 운영 편의성이 훨씬 좋아져요.

    6-3. 가장 무난한 현실적 결론

    솔직히 말하면 Marlin과 Mainsail 중 하나를 고르는 문제가 아니라, Marlin으로 충분한 사람과 Klipper + Mainsail로 넘어가야 하는 사람을 구분하는 문제에 더 가까워요.

    상황 추천 조합 이유
    순정 프린터, 안정성 우선 Marlin 구조가 단순하고 유지보수 부담이 적음
    세팅을 자주 수정함 Klipper + Mainsail 설정 반영과 매크로 관리가 편함
    프린터 여러 대 운영 Klipper + Mainsail 웹 기반 관리 이점이 큼
    라즈베리 파이 없이 간단히 운용 Marlin 추가 호스트 장치가 필요 없음

    7. ⚠️ 실제로 많이 겪는 문제와 해결법

    7-1. Mainsail을 설치했는데 Marlin 프린터가 안 붙는 경우

    이건 고장이 아니라 구조 문제인 경우가 많아요. Mainsail은 Klipper용 웹 인터페이스라서, Marlin 프린터를 직접 붙이는 용도로 생각하면 안 돼요. 저도 처음엔 이 부분에서 한참 헷갈렸거든요.

    해결: Marlin이면 OctoPrint 같은 일반 호스트 구성을 검토하고, Mainsail을 쓰려면 Klipper 전환을 먼저 판단해야 해요.

    7-2. Klipper 업데이트 후 프린터가 안 움직이는 경우

    업데이트 후 호스트 쪽 소프트웨어와 MCU 펌웨어 버전이 어긋나는 경우가 있어요.

    해결: 업데이트 전 설정 백업, 변경 로그 확인, 필요 시 MCU 재빌드를 준비하세요. 급한 출력 전날 밤 업데이트하는 건 정말 비추천이에요.

    7-3. 매크로는 멋지게 만들었는데 오히려 꼬이는 경우

    START_PRINT, END_PRINT 매크로를 욕심내서 한 번에 많이 넣으면 예상치 못한 이동 순서 문제나 온도 타이밍 문제가 생겨요.

    해결: 처음엔 홈, 메시 로드, 온도, 파킹 정도만 넣고 점진적으로 늘리세요. 저도 한 번에 다 넣었다가 노즐이 허공에서 대기하는 황당한 상황을 겪었거든요.

    8. 검증과 결과: 무엇이 더 좋았나

    결론부터 말씀드리면, 정답은 장비 스펙보다 운영 습관에 더 가까워요.

    • Marlin은 단순하고 든든해요. 한 번 잡아두면 오래 가더라고요.
    • Klipper + Mainsail은 운영 경험이 뛰어나요. 튜닝과 자동화에서 강하더라고요.
    • Marlin Mainsail 비교는 결국 “안정성 중심”과 “운영 편의성 중심”의 비교로 읽는 게 맞아요.

    제가 실제로 써보니까, 출력 품질 자체보다도 문제를 얼마나 빨리 파악하고 다시 돌릴 수 있느냐가 만족도를 더 크게 좌우하더라고요. 그런 면에서 단일 장비면 Marlin, 여러 장비와 잦은 튜닝이면 Mainsail 쪽이 손이 덜 가요.

    Marlin Mainsail 비교 이후 결과 검증을 위한 대시보드 이미지

    운영 결과를 검증하는 장면으로, 프린트 진행률과 온도 그래프, 상태 패널이 안정적으로 보이는 이미지 자리입니다.

    9. 정리와 FAQ

    9-1. 한 문장 정리

    Marlin은 안정적인 기본기, Mainsail은 Klipper와 결합했을 때 강력한 운영 도구예요. 둘 중 하나가 무조건 우위라고 보기보다, 프린터를 어떻게 굴릴지 먼저 정하는 게 맞아요.

    9-2. 자주 묻는 질문

    Q. Marlin 프린터에 Mainsail만 붙여서 쓸 수 있나요?
    A. 보통 그렇게 보시면 안 돼요. Mainsail은 Klipper 기반 운영을 전제로 보는 편이 정확해요.

    Q. Klipper로 가면 무조건 출력 품질이 더 좋아지나요?
    A. 무조건이라고 말하긴 어려워요. 다만 튜닝과 운영이 편해져서 결과적으로 더 좋은 상태에 빨리 도달하는 경우는 많더라고요.

    Q. 입문자는 뭘 고르면 되나요?
    A. 프린터 한 대를 안정적으로 쓰는 단계라면 Marlin이 편해요. 반대로 세팅을 계속 바꾸고 실험하는 성향이면 Klipper + Mainsail이 잘 맞거든요.

    다음 글에서는 Klipper + Mainsail 초기 세팅 체크리스트를 단계별로 정리해보겠습니다. 이전 글에서 다뤘던 홈랩 백업 습관과 연결해서 보면 더 이해가 잘 되실 겁니다.

    Marlin Mainsail 비교 선택 기준을 요약한 인포그래픽

    누가 Marlin을 선택하고, 누가 Klipper와 Mainsail 조합을 선택하면 좋은지 한 장으로 요약하는 비교 인포그래픽 자리입니다.

  • [3D Printer] Klipper 펌웨어 설치 및 고급 설정: 출력 품질 극대화 완벽 가이드

    마블링 같은 출력물… 그냥 두고 볼 수 없었습니다

    3D 프린터를 처음 샀을 때 기억 나시나요? 저는 당시 Marlin 펌웨어로 세팅하고 그냥 쓰고 있었는데, 출력물 표면에 물결 무늬(ringing 또는 ghosting이라고 부르는 현상)가 계속 생기는 거예요. 파라미터 이것저것 건드려봤는데 영 개선이 안 되더라고요. 그러다 동료 엔지니어한테서 처음 Klipper 펌웨어 얘기를 들었습니다. “그거 쓰면 진짜 달라져” 하는 말에 반신반의하면서 설치해봤는데… 솔직히 그 이후로 Marlin으로 돌아갈 생각이 전혀 없어요.

    이 글에서는 Klipper 설치부터 고급 설정까지, 제가 직접 삽질하면서 쌓은 경험을 최대한 실용적으로 풀어드리려 합니다. 3D프린터 펌웨어를 처음 바꿔보시는 분도, 이미 Klipper를 쓰고 있지만 최적화가 잘 안 되는 분도 도움이 되셨으면 좋겠네요.

    ▲ Klipper의 핵심 구조 — 라즈베리 파이(호스트)와 마이크로컨트롤러(MCU)가 역할을 나눠서 처리하는 방식입니다.

    Klipper 펌웨어란 무엇인가요? — 쉽게 말해서

    Klipper는 3D 프린터의 제어 로직을 마이크로컨트롤러(MCU) 단독으로 처리하지 않고, 라즈베리 파이(Raspberry Pi) 같은 싱글보드 컴퓨터와 역할을 분리해서 처리하는 오픈소스 3D프린터 펌웨어입니다.

    쉽게 말해서, 기존 Marlin 같은 펌웨어는 프린터 보드(예: SKR, RAMPS) 안에서 모든 계산을 혼자 다 처리했어요. 근데 그 보드들 성능이 그렇게 좋진 않잖아요. Klipper는 복잡한 수학 계산(G-code 파싱, 가감속 계산 등)을 라즈베리 파이에서 처리하고, 보드는 그냥 “이 모터를 이 타이밍에 이만큼 돌려”라는 저수준 명령만 받아서 실행하는 구조거든요.

    항목 Marlin 펌웨어 Klipper 펌웨어
    연산 위치 프린터 보드(MCU) 단독 라즈베리 파이 + MCU 분산
    설정 변경 펌웨어 재컴파일 필요 텍스트 파일 수정 후 재시작
    입력 성형(Input Shaping) 제한적 가속도계 연동 자동 보정 가능
    압력 선행(Pressure Advance) Linear Advance (설정 복잡) Pressure Advance (직관적)
    인터페이스 LCD 또는 별도 호스트 Mainsail/Fluidd 웹 UI
    다중 MCU 지원 어려움 기본 지원

    이 구조 덕분에 설정을 바꿀 때마다 펌웨어를 새로 컴파일해서 플래시할 필요가 없어요. printer.cfg 파일만 수정하고 Klipper를 재시작하면 끝입니다. 처음에 이게 얼마나 편한지 실감 못 했는데, 써보고 나서 “아 이래서 다들 Klipper 쓰는구나” 했습니다.

    준비물 및 환경 구성

    Klipper 설치 전에 필요한 것들을 정리해볼게요. 제가 쓰는 환경 기준으로 설명하겠지만, 대부분의 환경에 적용 가능합니다.

    하드웨어 요구사항

    • 싱글보드 컴퓨터: 라즈베리 파이 3B+ 이상 권장 (저는 Pi 4 2GB 사용)
    • 프린터 보드: SKR Mini E3, BTT Octopus, Creality 보드 등 대부분 지원
    • MicroSD 카드: 라즈베리 파이용 8GB 이상
    • USB 케이블: 라즈베리 파이 ↔ 프린터 보드 연결용 (데이터 전송 지원)

    소프트웨어 스택

    • Klipper: 실제 펌웨어 코어
    • Moonraker: Klipper와 웹 UI를 연결하는 API 서버
    • Mainsail 또는 Fluidd: 웹 기반 인터페이스 (저는 Mainsail 사용)
    • KIAUH(Klipper Installation And Update Helper): 설치 자동화 스크립트

    Klipper 설치 단계별 가이드

    자, 이제 본격적으로 Klipper 설치 과정입니다. 처음에는 좀 복잡해 보이는데, 한 번만 하고 나면 별거 아니에요. 차근차근 따라오세요.

    1단계: 라즈베리 파이 OS 설치

    라즈베리 파이 이미저(Raspberry Pi Imager)로 Raspberry Pi OS Lite (64-bit)를 설치합니다. GUI 없는 Lite 버전으로 충분하고, 오히려 더 가볍게 돌아가요.

    이미저에서 고급 설정으로 SSH 활성화와 Wi-Fi 설정까지 미리 해두면 나중에 편합니다. 저는 여기서 SSH 설정 안 해두고 나중에 모니터 연결해서 했던 기억이… 🤦

    2단계: SSH 접속 및 초기 업데이트

    # 라즈베리 파이에 SSH로 접속
    ssh pi@[라즈베리파이_IP주소]
    
    # 패키지 업데이트
    sudo apt update && sudo apt upgrade -y

    3단계: KIAUH로 Klipper, Moonraker, Mainsail 설치

    # KIAUH 다운로드
    cd ~
    git clone https://github.com/dw-0/kiauh.git
    
    # KIAUH 실행
    ./kiauh/kiauh.sh

    KIAUH 메뉴가 뜨면 순서대로 설치합니다:

    1. 1번 메뉴 (Install) 선택
    2. Klipper 설치
    3. Moonraker 설치
    4. Mainsail 또는 Fluidd 설치 (둘 중 하나)

    설치 중에 Python 가상환경 세팅이나 의존성 설치가 자동으로 이루어져요. 예전에는 이걸 수동으로 다 해야 했는데, KIAUH 덕분에 진짜 편해졌더라고요.

    4단계: 프린터 보드용 Klipper MCU 펌웨어 컴파일 및 플래시

    이 단계가 핵심입니다. 프린터 보드에 올릴 Klipper MCU 펌웨어를 라즈베리 파이에서 컴파일해야 해요.

    # Klipper 디렉토리로 이동
    cd ~/klipper
    
    # 메뉴 기반 설정 도구 실행
    make menuconfig

    여기서 본인 보드에 맞는 설정을 해줘야 합니다. 예를 들어 BTT SKR Mini E3 V3 기준으로는:

    • Micro-controller Architecture: STMicroelectronics STM32
    • Processor model: STM32G0B1
    • Bootloader offset: 8KiB bootloader
    • Communication interface: USB (on PA11/PA12)

    ⚠️ 주의: 보드마다 설정이 달라요. Klipper 공식 문서나 보드 제조사 GitHub에서 본인 보드에 맞는 설정을 반드시 확인하세요. 잘못된 설정으로 플래시하면 보드가 벽돌이 될 수 있거든요. 저도 한 번 당했는데, 다행히 DFU 모드로 복구했어요.

    # 설정 완료 후 컴파일
    make clean
    make -j4
    
    # 컴파일 결과물 위치: ~/klipper/out/klipper.bin

    컴파일된 klipper.bin을 SD카드에 복사해서 보드에 플래시하거나, USB DFU 방식으로 직접 플래시합니다. 방법은 보드마다 다르니 반드시 확인이 필요해요.

    ▲ Mainsail 웹 인터페이스에서 printer.cfg를 직접 편집하고 저장하면 바로 적용됩니다 — 펌웨어 재플래시 없이요.

    5단계: printer.cfg 기본 설정

    Klipper의 핵심 설정 파일인 printer.cfg를 작성합니다. 이게 Marlin에서 Configuration.h 역할을 한다고 보시면 돼요. 근데 훨씬 읽기 쉽고 수정하기 편합니다.

    # printer.cfg 기본 예시 (Cartesian 방식 프린터)
    
    [mcu]
    # 보드가 연결된 시리얼 포트 확인: ls /dev/serial/by-id/
    serial: /dev/serial/by-id/usb-Klipper_stm32g0b1xx_XXXXXXXXXXXXXXXX-if00
    
    [printer]
    kinematics: cartesian
    max_velocity: 300
    max_accel: 3000
    max_z_velocity: 5
    max_z_accel: 100
    
    [stepper_x]
    step_pin: PB13
    dir_pin: !PB12
    enable_pin: !PB14
    microsteps: 16
    rotation_distance: 40
    endstop_pin: ^PC0
    position_endstop: 0
    position_max: 235
    homing_speed: 50
    
    [stepper_y]
    step_pin: PB10
    dir_pin: !PB2
    enable_pin: !PB11
    microsteps: 16
    rotation_distance: 40
    endstop_pin: ^PC1
    position_endstop: 0
    position_max: 235
    homing_speed: 50
    
    [stepper_z]
    step_pin: PB0
    dir_pin: PC5
    enable_pin: !PB1
    microsteps: 16
    rotation_distance: 8
    endstop_pin: probe:z_virtual_endstop
    position_min: -5
    position_max: 250
    
    [extruder]
    step_pin: PB3
    dir_pin: !PB4
    enable_pin: !PD1
    microsteps: 16
    rotation_distance: 33.500
    nozzle_diameter: 0.400
    filament_diameter: 1.750
    heater_pin: PC8
    sensor_type: EPCOS 100K B57560G104F
    sensor_pin: PA0
    min_temp: 0
    max_temp: 250
    
    [heater_bed]
    heater_pin: PC9
    sensor_type: ATC Semitec 104GT-2
    sensor_pin: PC4
    min_temp: 0
    max_temp: 130

    처음에는 이게 양이 많아 보이는데, 사실 각 섹션이 뭘 의미하는지 한 번만 파악하면 Marlin보다 오히려 직관적이에요.

    Klipper 고급 설정 — 출력 품질 극대화

    자, 이제 진짜 Klipper의 진가를 발휘하는 고급 기능들입니다. 이게 제가 Klipper로 넘어온 가장 큰 이유예요.

    Pressure Advance (압력 선행 보정)

    Pressure Advance는 익스트루더가 필라멘트를 밀 때 노즐 내부에 생기는 압력 지연을 보정하는 기능입니다. 쉽게 말해, 코너 부분에서 필라멘트가 뭉치거나 늘어지는 현상을 잡아주는 거예요.

    [extruder]
    # 위 extruder 섹션에 추가
    pressure_advance: 0.05
    pressure_advance_smooth_time: 0.040

    정확한 값은 캘리브레이션 타워를 출력해서 찾아야 해요. Klipper 공식 문서에 캘리브레이션 방법이 잘 나와 있습니다. 저는 이거 세팅하고 나서 코너 품질이 확실히 달라졌더라고요. 특히 벤치마크 모델 출력할 때 차이가 눈에 띄었습니다.

    Input Shaping (입력 성형) — 링잉 제거의 핵심

    이게 Klipper의 킬러 기능이라고 생각합니다. Input Shaping(입력 성형)은 프린터 프레임이 진동할 때 생기는 링잉(ringing, 고스팅) 현상을 소프트웨어적으로 보정하는 기술이에요.

    가속도계(accelerometer)를 연결하면 자동으로 프린터의 공진 주파수를 측정해서 최적의 보정 필터를 적용해줍니다. 저는 ADXL345 모듈을 라즈베리 파이 SPI 핀에 연결해서 사용했어요.

    # ADXL345 가속도계 설정
    [adxl345]
    cs_pin: rpi:None
    spi_bus: spidev0.0
    
    [resonance_tester]
    accel_chip: adxl345
    probe_points:
        117.5, 117.5, 20
    # SSH에서 공진 주파수 측정 실행
    # Mainsail 콘솔 또는 SSH에서:
    SHAPER_CALIBRATE AXIS=X
    SHAPER_CALIBRATE AXIS=Y

    측정 결과를 바탕으로 Klipper가 자동으로 추천 필터를 알려줘요. 그걸 printer.cfg에 적용하면 됩니다:

    [input_shaper]
    shaper_freq_x: 45.8
    shaper_freq_y: 38.2
    shaper_type: mzv

    💡 팁: 가속도계가 없어도 수동으로 캘리브레이션 타워를 출력해서 주파수를 추정할 수 있어요. 다만 ADXL345 같은 저렴한 모듈을 하나 구해두면 훨씬 정확하고 빠르게 캘리브레이션할 수 있습니다.

    Bed Mesh Leveling (베드 메쉬 레벨링)

    베드가 완벽하게 평평한 경우는 거의 없죠. Bed Mesh는 베드 여러 포인트를 측정해서 높이 편차를 보정 맵으로 만들어 출력 중에 실시간으로 Z축을 조정하는 기능입니다.

    [bed_mesh]
    speed: 120
    horizontal_move_z: 5
    mesh_min: 10, 10
    mesh_max: 225, 225
    probe_count: 5, 5
    algorithm: bicubic

    Macro(매크로) 활용 — 반복 작업 자동화

    Klipper의 매크로 기능도 정말 편리해요. 자주 쓰는 작업을 버튼 하나로 실행할 수 있게 만들 수 있거든요.

    # 출력 시작 매크로 예시
    [gcode_macro START_PRINT]
    gcode:
        {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
        {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}
        M140 S{BED_TEMP}
        G28
        BED_MESH_CALIBRATE
        M109 S{EXTRUDER_TEMP}
        M190 S{BED_TEMP}
        G92 E0
        G1 X5 Y20 Z0.3 F5000
        G1 X5 Y200 E15 F1500
        G92 E0
    
    [gcode_macro END_PRINT]
    gcode:
        G91
        G1 E-5 F3000
        G1 Z10 F3000
        G90
        G1 X0 Y220 F5000
        M104 S0
        M140 S0
        M84

    슬라이서(Slicer)에서 시작/종료 G-code를 START_PRINT BED_TEMP={material_bed_temperature} EXTRUDER_TEMP={material_print_temperature}처럼 설정하면, 슬라이서에서 설정한 온도가 자동으로 매크로에 전달돼요. 이거 처음 알았을 때 진짜 편하다 싶었습니다.

    ▲ Input Shaping 적용 전후 비교 — 공진 주파수 측정 그래프와 실제 출력물의 링잉(ghosting) 현상 개선 결과

    ⚠️ 트러블슈팅 — 제가 겪은 삽질들

    설치하면서 자주 만나는 문제들을 정리해봤어요. 저도 다 겪어봤던 것들이라 공감하실 분들 많을 거예요.

    문제 1: MCU 연결이 안 됨 (Unable to connect)

    가장 흔한 문제입니다. printer.cfg의 시리얼 포트가 맞는지 확인하세요.

    # 연결된 USB 장치 시리얼 ID 확인
    ls /dev/serial/by-id/
    
    # 출력 예시:
    # usb-Klipper_stm32g0b1xx_XXXXXXXXXXXXXXXX-if00

    이 경로를 그대로 printer.cfg의 [mcu] 섹션 serial:에 넣으면 됩니다. USB 케이블 불량인 경우도 꽤 있어요. 데이터 전송이 되는 케이블인지 확인해보세요.

    문제 2: Klipper 서비스 시작 후 에러 로그

    # Klipper 로그 실시간 확인
    tail -f ~/printer_data/logs/klippy.log
    
    # 서비스 상태 확인
    sudo systemctl status klipper

    대부분의 에러는 printer.cfg 설정 오류거든요. 로그를 보면 어느 섹션, 어느 파라미터에서 문제가 났는지 꽤 친절하게 알려줍니다.

    문제 3: 베드 레벨링 프로브 동작 안 함

    BLTouch나 CR Touch 같은 프로브를 쓰는 경우, 핀 설정이 까다로울 수 있어요. 특히 probe_with_touch_mode 옵션을 켜야 하는 경우도 있거든요. 저는 처음에 이거 몰라서 한참 헤맸습니다.

    [bltouch]
    sensor_pin: ^PC14
    control_pin: PA1
    pin_up_touch_mode_reports_triggered: False
    probe_with_touch_mode: True
    x_offset: -44
    y_offset: -10
    z_offset: 2.350

    문제 4: 압출량(Extruder) 캘리브레이션

    rotation_distance 값이 맞지 않으면 압출량이 부정확해집니다. 마크 테스트(Mark Test)로 캘리브레이션해야 해요.

    # 100mm 압출 명령 (Mainsail 콘솔에서)
    G91
    G1 E100 F100
    
    # 실제 압출된 길이를 측정하고 아래 공식으로 계산
    # 새 rotation_distance = 기존값 × (요청량 / 실제압출량)
    # 예: 33.5 × (100 / 98.5) = 34.01

    ✅ 결과 확인 — 이렇게 달라졌습니다

    Klipper 설정을 완료하고 나서 체감한 변화를 솔직하게 공유할게요.

    • 🎉 링잉(Ringing) 현상: Input Shaping 적용 후 거의 사라졌습니다. 코너 부분이 훨씬 깔끔해졌어요.
    • 🎉 코너 품질: Pressure Advance 세팅 후 코너 뭉침/늘어짐이 확실히 개선됐어요.
    • 🎉 출력 속도: Input Shaping 덕분에 고속 출력에서도 품질 저하가 줄어들었습니다. 가속도를 더 높게 설정할 수 있게 됐어요.
    • 🎉 운용 편의성: 설정 변경이 너무 편해요. 파라미터 하나 바꾸는 데 펌웨어 재컴파일이 필요 없으니까요.
    • 🎉 웹 인터페이스: Mainsail에서 실시간 모니터링, 파일 관리, 매크로 실행이 다 돼서 편합니다.

    물론 초기 세팅 난이도가 Marlin보다 높은 건 사실이에요. 라즈베리 파이 세팅, 리눅스 기본 조작, 각 보드별 펌웨어 컴파일 설정 등 진입 장벽이 있습니다. 근데 한 번만 넘어서면, 그 이후는 오히려 훨씬 편하거든요.

    ▲ Mainsail 대시보드 — 온도 그래프, 출력 진행률, 매크로 버튼 등을 웹 브라우저에서 실시간으로 모니터링할 수 있습니다.

    자주 묻는 질문 (FAQ)

    Q. Klipper가 모든 프린터 보드와 호환되나요?

    대부분의 주요 보드를 지원합니다. Klipper 공식 문서의 Config Reference 페이지에서 지원 MCU 목록을 확인할 수 있어요. STM32, AVR, RP2040 계열은 대부분 지원됩니다.

    Q. 라즈베리 파이 없이 Klipper를 쓸 수 있나요?

    네, 가능합니다. 라즈베리 파이 대신 오렌지 파이(Orange Pi), 일반 리눅스 PC도 호스트로 사용할 수 있어요.

    Q. Klipper 설치 후 기존 Marlin으로 되돌릴 수 있나요?

    네, 가능합니다. 프린터 보드에 Marlin 펌웨어를 다시 플래시하면 됩니다. 라즈베리 파이 쪽 Klipper 설정은 그냥 두거나 삭제하면 돼요.

    Q. Input Shaping에 가속도계가 반드시 필요한가요?

    필수는 아닙니다. 가속도계 없이 캘리브레이션 프린트로 수동으로 주파수를 추정할 수 있어요. 다만 ADXL345 같은 저렴한 모듈을 하나 구해두면 훨씬 정확하고 빠르게 캘리브레이션할 수 있습니다.

    마무리 — 그래서 Klipper, 써야 할까요?

    13년간 서버와 인프라를 다뤄온 입장에서, Klipper는 3D 프린터를 “설정 파일로 관리하는 시스템”으로 바꿔준 펌웨어라고 생각합니다. 코드로 인프라를 관리하는 IaC(Infrastructure as Code) 철학이랑 비슷한 느낌이랄까요.

    처음 설치가 좀 복잡한 건 사실입니다. 근데 그 이후로는 정말 편해요. 설정 하나 바꿀 때마다 Arduino IDE 켜고 컴파일하고 플래시하는 과정이 없어지는 것만으로도 충분히 투자할 가치가 있다고 생각합니다.

    처음엔 그냥 출력 품질 개선 목적으로 시작했는데, 이제는 홈랩 서버에서 Moonraker API로 자동화 스크립트도 돌리고, 출력 완료 시 알림도 보내고… 점점 재미있어지고 있어요. 혹시 이런 자동화 연동에 관심 있으신 분은 다음 글에서 Moonraker API 활용 자동화 방법도 다룰 예정이니 기대해주세요.

    질문이나 본인만의 Klipper 세팅 팁이 있으시면 댓글로 공유해주세요. 저도 아직 배우는 중이라, 다른 분들 경험도 궁금하거든요. 😊