Klipper A-Z phần 6: Hướng dẫn tạo macro Klipper cơ bản

Sau khi đã nắm được các tính năng nâng cao của Klipper, chúng ta sẽ học cách tạo macro để tự động hóa quy trình in 3D. Macro giúp bạn gộp nhiều lệnh phức tạp thành một lệnh đơn giản, tiết kiệm thời gian và chuẩn hóa quy trình làm việc.

Klipper A-Z phần 6: Hướng dẫn tạo macro Klipper cơ bản
Photo by Chris Stein / Unsplash

Danh sách bài viết:

  1. Giới thiệu Klipper
  2. Chuẩn bị phần cứng và cài đặt Klipper
  3. Flash firmware và tạo file printer.cfg
  4. Hiệu chỉnh cơ bản
  5. Input Shaper và Pressure Advance
  6. Tạo macro Klipper cơ bản
  7. Khắc phục sự cố và bảo trì hệ thống

Macro trong Klipper là gì?

Định nghĩa

Macro trong Klipper là một nhóm các lệnh G-code được gom lại thành một lệnh duy nhất. Khi bạn gọi macro, tất cả các lệnh bên trong sẽ được thực hiện theo thứ tự.

Ví dụ đơn giản: Thay vì phải gõ từng lệnh:

G28        ; Về vị trí home
M140 S60   ; Đun nóng bed đến 60 độ
M109 S200  ; Đun nóng nozzle đến 200 độ và đợi

Bạn có thể tạo một macro và chỉ cần gõ:

BAT_DAU_IN

Lợi ích của macro

  • Tiết kiệm thời gian: Thực hiện nhiều lệnh bằng một lệnh duy nhất
  • Tránh sai sót: Không phải nhớ và gõ lại các lệnh phức tạp
  • Chuẩn hóa quy trình: Đảm bảo mọi lần in đều làm theo cùng một trình tự
  • Dễ chỉnh sửa: Thay đổi quy trình mà không cần cắt lát lại file
  • Tích hợp tốt: Hoạt động với mọi phần mềm cắt lát

Cách viết macro cơ bản

Cấu trúc macro

[gcode_macro TEN_MACRO]
description: Mô tả ngắn gọn về macro này
gcode:
    ; Các lệnh G-code ở đây phải thụt vào
    G28                    ; Về home
    M117 Macro đang chạy   ; Hiển thị thông báo

Quy tắc quan trọng:

  • Tên macro có thể chứa chữ cái, số và dấu gạch dưới
  • Số chỉ được ở cuối tên (ví dụ: TEST_MACRO25)
  • Các lệnh G-code phải thụt vào bằng space hoặc tab
  • Chữ hoa hay thường đều được (TEST_MACRO = test_macro)

Macro đơn giản đầu tiên

[gcode_macro VE_HOME]
description: Về vị trí home và hiển thị thông báo
gcode:
    G28                           ; Về home tất cả trục
    M117 Da ve home!              ; Hiển thị thông báo
    G4 P3000                      ; Đợi 3 giây
    M117                          ; Xóa thông báo

Sử dụng tham số trong macro

[gcode_macro DUN_NONG]
description: Đun nóng bed và nozzle
gcode:
    {% set bed_temp = params.BED|default(60)|float %}
    {% set nozzle_temp = params.NOZZLE|default(200)|float %}
    
    M140 S{bed_temp}              ; Bắt đầu đun bed
    M104 S{nozzle_temp}           ; Bắt đầu đun nozzle
    M117 Dang dun nong...

Cách sử dụng:

DUN_NONG BED=70 NOZZLE=210

Tạo START_PRINT và END_PRINT

Tại sao cần START_PRINT?

Thông thường, phần mềm cắt lát sẽ thêm các lệnh khởi động vào đầu file G-code. Tuy nhiên, nếu bạn muốn thay đổi quy trình khởi động (ví dụ thêm bed leveling), bạn phải cắt lát lại tất cả file cũ.

Với START_PRINT macro, bạn chỉ cần:

  1. Tạo macro một lần trong Klipper
  2. Đặt lệnh START_PRINT trong phần mềm cắt lát
  3. Mọi thay đổi sau này chỉ cần sửa macro

START_PRINT macro cơ bản

[gcode_macro START_PRINT]
description: Bắt đầu quy trình in
gcode:
    # Lấy nhiệt độ từ phần mềm cắt lát
    {% set bed_temp = params.BED_TEMP|default(60)|float %}
    {% set extruder_temp = params.EXTRUDER_TEMP|default(190)|float %}
    
    # Đặt chế độ tọa độ tuyệt đối
    G90
    
    # Bắt đầu đun bed (nhưng không đợi)
    M140 S{bed_temp}
    
    # Về home
    G28
    
    # Nâng nozzle lên một chút
    G1 Z5 F3000
    
    # Đợi bed đạt nhiệt độ
    M190 S{bed_temp}
    
    # Đun và đợi nozzle đạt nhiệt độ
    M109 S{extruder_temp}
    
    # Vẽ đường purge (làm sạch nozzle)
    G1 X2 Y10 F3000               ; Di chuyển đến vị trí bắt đầu
    G1 Z0.3 F240                  ; Hạ xuống gần bed
    G92 E0                        ; Reset bộ đếm filament
    G1 Y190 E15 F1500             ; Vẽ đường thứ nhất
    G1 X2.3 F5000                 ; Dịch chuyển sang bên
    G1 Y10 E30 F1200              ; Vẽ đường thứ hai
    G92 E0                        ; Reset lại bộ đếm
    G1 Z2 F3000                   ; Nâng nozzle lên
    
    M117 Bat dau in!

END_PRINT macro

[gcode_macro END_PRINT]
description: Kết thúc quy trình in
gcode:
    # Tắt tất cả heater
    M140 S0                       ; Tắt bed
    M104 S0                       ; Tắt nozzle
    M106 S0                       ; Tắt quạt
    
    # Rút filament và di chuyển nozzle ra xa
    G91                           ; Chế độ tọa độ tương đối
    G1 X-2 Y-2 E-3 F300           ; Di chuyển ra xa và rút filament
    
    # Nâng nozzle lên
    G1 Z10 F3000
    G90                           ; Trở về chế độ tọa độ tuyệt đối
    
    # Di chuyển đến vị trí lấy sản phẩm
    G1 X0 Y200 F2000
    
    # Tắt motor
    M84
    
    M117 Hoan thanh!

Tích hợp với phần mềm cắt lát (slicer)

PrusaSlicer / SuperSlicer

Start G-code:

START_PRINT BED_TEMP=[first_layer_bed_temperature] EXTRUDER_TEMP=[first_layer_temperature]

End G-code:

END_PRINT

Cura

Start G-code:

START_PRINT BED_TEMP={material_bed_temperature_layer_0} EXTRUDER_TEMP={material_print_temperature_layer_0}

End G-code:

END_PRINT

Cách thiết lập trong PrusaSlicer

  1. Mở PrusaSlicer
  2. Vào Printer Settings > Custom G-code
  3. Xóa hết nội dung trong Start G-code
  4. Thêm dòng: START_PRINT BED_TEMP=[first_layer_bed_temperature] EXTRUDER_TEMP=[first_layer_temperature]
  5. Xóa hết nội dung trong End G-code
  6. Thêm dòng: END_PRINT
  7. Lưu settings

Macro hữu ích khác

Macro thay filament

[gcode_macro THAY_FILAMENT]
description: Tạm dừng và thay filament
gcode:
    {% set X = params.X|default(50)|float %}
    {% set Y = params.Y|default(0)|float %}
    {% set Z = params.Z|default(10)|float %}
    
    SAVE_GCODE_STATE NAME=thay_filament
    PAUSE                         ; Tạm dừng in
    
    G91                           ; Chế độ tương đối
    G1 E-0.8 F2700               ; Rút filament ngắn
    G1 Z{Z}                      ; Nâng Z lên
    G90                          ; Chế độ tuyệt đối
    G1 X{X} Y{Y} F3000           ; Di chuyển đến vị trí thay
    G91                          ; Chế độ tương đối
    G1 E-50 F1000                ; Rút filament dài
    
    M117 Thay filament va nhan RESUME
    RESTORE_GCODE_STATE NAME=thay_filament

Macro làm sạch nozzle

[gcode_macro LAM_SACH_NOZZLE]
description: Làm sạch nozzle bằng cách di chuyển
gcode:
    SAVE_GCODE_STATE NAME=lam_sach
    
    G90                           ; Tọa độ tuyệt đối
    G1 Z15 F3000                 ; Nâng Z lên
    
    # Di chuyển qua lại để làm sạch
    G1 X50 Y5 Z2 F12000
    G1 X100 Y5 Z2 F12000
    G1 X50 Y5 Z2 F12000
    G1 X100 Y5 Z2 F12000
    G1 X50 Y5 Z2 F12000
    
    RESTORE_GCODE_STATE NAME=lam_sach
    M117 Da lam sach nozzle

Macro PID tuning nhanh

[gcode_macro PID_NOZZLE]
description: PID tuning cho nozzle
gcode:
    {% set TEMP = params.TEMP|default(210)|float %}
    M117 PID tuning nozzle...
    PID_CALIBRATE HEATER=extruder TARGET={TEMP}
    SAVE_CONFIG

[gcode_macro PID_BED]
description: PID tuning cho bed
gcode:
    {% set TEMP = params.TEMP|default(60)|float %}
    M117 PID tuning bed...
    PID_CALIBRATE HEATER=heater_bed TARGET={TEMP}
    SAVE_CONFIG

Macro kiểm tra nhiệt độ

[gcode_macro KIEM_TRA_NHIET_DO]
description: Hiển thị nhiệt độ hiện tại
gcode:
    {% set nozzle = printer.extruder.temperature %}
    {% set bed = printer.heater_bed.temperature %}
    M117 Nozzle: {nozzle}C Bed: {bed}C
    {action_respond_info("Nozzle: %.1fC, Bed: %.1fC" % (nozzle, bed))}

Xử lý lỗi thường gặp

Lỗi "UndefinedError"

Error evaluating 'gcode_macro START_PRINT': UndefinedError: 'dict object' has no attribute 'BED_TEMP'

Nguyên nhân: Tên tham số trong slicer và macro không khớp

Giải pháp: Kiểm tra tên tham số:

# Trong slicer: START_PRINT BED_TEMP=60
# Trong macro: params.BED_TEMP ✓ (đúng)
# Trong macro: params.BED ✗ (sai)

Lỗi indentation

Error in 'gcode_macro': Option 'gcode' is not valid

Nguyên nhân: Các lệnh G-code không được thụt vào đúng cách

Sai:

[gcode_macro TEST]
gcode:
G28                             ; Không thụt vào
    M117 Hello                  ; Thụt vào không đều

Đúng:

[gcode_macro TEST]
gcode:
    G28                         ; Thụt vào đều
    M117 Hello                  ; Thụt vào đều

Lỗi kiểu dữ liệu

Sai:

{% set temp = params.TEMP %}      ; temp là string
M104 S{temp}                      ; Có thể gây lỗi

Đúng:

{% set temp = params.TEMP|default(200)|float %}  ; Chuyển thành số
M104 S{temp}                                      ; An toàn

Debug macro

Khi macro không hoạt động đúng, hãy thêm thông báo để debug:

[gcode_macro DEBUG_MACRO]
gcode:
    {action_respond_info("Bắt đầu macro")}
    {% set temp = params.TEMP|default(200)|float %}
    {action_respond_info("Nhiệt độ: %.1f" % temp)}
    M104 S{temp}
    {action_respond_info("Hoàn thành macro")}

Tips hữu ích

  1. Luôn có giá trị mặc định: Sử dụng |default(giá_trị) để tránh lỗi
  2. Chuyển đổi kiểu dữ liệu: Sử dụng |float hoặc |int khi cần
  3. Test từng phần: Viết macro đơn giản trước, sau đó mở rộng dần
  4. Sao lưu config: Luôn backup trước khi thêm macro mới
  5. Đọc log: Khi có lỗi, kiểm tra klippy.log để biết nguyên nhân

Kết luận

Macro là công cụ mạnh mẽ giúp tự động hóa quy trình in 3D và chuẩn hóa workflow. Bắt đầu với những macro đơn giản như START_PRINT và END_PRINT, sau đó dần dần mở rộng theo nhu cầu sử dụng.

Điểm quan trọng cần nhớ:

  • Macro giúp tiết kiệm thời gian và tránh sai sót
  • START_PRINT/END_PRINT cung cấp sự nhất quán giữa các lần in
  • Luôn test kỹ macro trước khi sử dụng trong thực tế
  • Sử dụng thông báo debug khi gặp vấn đề
  • Backup config thường xuyên

Bài tiếp theo: Khắc phục sự cố và bảo trì hệ thống Klipper


Tài liệu tham khảo

  1. Tài liệu chính thức Klipper - Command Templates
  2. Tài liệu chính thức Klipper - Sample Macros
  3. Voron Documentation - Hướng dẫn Macro cho người mới
  4. Voron Documentation - Sử dụng Slicer với PRINT_START
  5. Obico - Hướng dẫn Klipper Macros
  6. Klipper Discourse - START_PRINT và END_PRINT Macros

Read more

Mua máy in 3D hãng hay tự lắp ráp (DIY): Lựa chọn nào phù hợp cho người mới bắt đầu?

Mua máy in 3D hãng hay tự lắp ráp (DIY): Lựa chọn nào phù hợp cho người mới bắt đầu?

Máy in 3D đang ngày càng phổ biến tại Việt Nam, từ những người đam mê công nghệ đến học sinh, sinh viên và các doanh nghiệp nhỏ. Tuy nhiên, câu hỏi đặt ra cho người mới bắt đầu là: nên mua máy in 3D có sẵn từ hãng hay tự lắp ráp để tiết kiệm chi phí? Chúng ta cùng phân tích nhé!

By Hải Nguyễn