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.
Danh sách bài viết:
- Giới thiệu Klipper
- Chuẩn bị phần cứng và cài đặt Klipper
- Flash firmware và tạo file printer.cfg
- Hiệu chỉnh cơ bản
- Input Shaper và Pressure Advance
- Tạo macro Klipper cơ bản
- 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à đợiBạn có thể tạo một macro và chỉ cần gõ:
BAT_DAU_INLợ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áoQuy 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áoSử 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=210Tạ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:
- Tạo macro một lần trong Klipper
- Đặt lệnh START_PRINT trong phần mềm cắt lát
- 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_PRINTCura
Start G-code:
START_PRINT BED_TEMP={material_bed_temperature_layer_0} EXTRUDER_TEMP={material_print_temperature_layer_0}End G-code:
END_PRINTCách thiết lập trong PrusaSlicer
- Mở PrusaSlicer
- Vào Printer Settings > Custom G-code
- Xóa hết nội dung trong Start G-code
- Thêm dòng:
START_PRINT BED_TEMP=[first_layer_bed_temperature] EXTRUDER_TEMP=[first_layer_temperature] - Xóa hết nội dung trong End G-code
- Thêm dòng:
END_PRINT - 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_filamentMacro 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 nozzleMacro 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_CONFIGMacro 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 validNguyê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 đềuLỗ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ànDebug 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
- Luôn có giá trị mặc định: Sử dụng
|default(giá_trị)để tránh lỗi - Chuyển đổi kiểu dữ liệu: Sử dụng
|floathoặc|intkhi cần - Test từng phần: Viết macro đơn giản trước, sau đó mở rộng dần
- Sao lưu config: Luôn backup trước khi thêm macro mới
- Đọ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