Après avoir structuré l'arborescence globale de notre projet et finalisé le dossier matériel, nous attaquons le second pilier de notre architecture : le répertoire des scripts. Dans cet Article, nous mettons en place le fichier racine Macros.cfg. L'intérêt de ce module ? Centraliser en un seul script l'intégralité des routines fondamentales qui orchestrent chaque cycle d'impression (allumage, extinction, pauses et reprise sécurisée). Une approche saine et étanche qui pose les bases de notre automatisation logicielle.
L'élégance de la centralisation algorithmique : Contrairement aux scripts utilitaires ou de confort, les blocs présentés ici interagissent directement avec l'état natif de Klipper et votre trancheur (Slicer). Rassembler ces commandes fondamentales dans un fichier dédié protège votre Hub central de toute modification accidentelle.
1. Structure centralisée du fichier Macros/Macros.cfg
Ce fichier doit être créé dans votre nouveau sous-dossier de configuration Macros (chemin : ~/printer_data/config/Macros/Macros.cfg). Veillez à respecter scrupuleusement la majuscule. Voici le script de production stable et complet à y injecter :
#############################################################################
#############################################################################
# ZEW-Neptune4Max V1.0 | CUSTOM INTERFACE COMPONENT
# -------------------------------------------------------------------------
# MODULE : STANDARD MACROS & PRINT MANAGEMENT (Macros.cfg)
# FUNCTION : Print Start/End, Pause/Resume, and KAMP Integration
# DESIGNED BY : Frédéric IMBERT
# VERSION : 1.0.0 (2026-05-06)
# STATUS : PRODUCTION / STABLE
#############################################################################
#############################################################################
# --- MACRO: PRINT_START ---
[gcode_macro PRINT_START]
description: Main start procedure with Heat Soak and Adaptive Mesh
gcode:
# 1. Variables retrieval from Slicer
{% set bed_temp = params.BED_TEMP|default(60)|float %}
{% set extruder_temp = params.EXTRUDER_TEMP|default(210)|float %}
{% set soak_minutes = params.BED_HEAT_SOAK_MINUTES|default(5)|int %}
# 2. Preparation (Sequential heating)
RESPOND MSG="Attente du plateau : {bed_temp}°C..."
M190 S{bed_temp} # Wait for bed to reach target
M104 S150 # Pre-heat nozzle to 150°C (no-ooze temp)
G90 # Absolute positioning
G28 # Homing with warm bed for better accuracy
# 3. Heat Soak (Stabilization)
{% if soak_minutes > 0 %}
RESPOND MSG="Stabilisation thermique : {soak_minutes} minutes..."
G4 P{soak_minutes * 60 * 1000}
{% endif %}
# 4. Adaptive Bed Mesh (KAMP Interception)
RESPOND MSG="Adaptive Bed Mesh in progress..."
BED_MESH_CLEAR
BED_MESH_CALIBRATE
# 5. Smart Parking (KAMP Smart Park)
SMART_PARK
# 6. Final heating
M109 S{extruder_temp} # Wait for nozzle to reach print temp
# 7. Adaptive Purge (KAMP Line Purge)
LINE_PURGE
RESPOND MSG="Print Started!"
# --- MACRO: PRINT_END ---
[gcode_macro PRINT_END]
description: Shutdown procedure after print completion
gcode:
Frame_Light_OFF
Part_Light_OFF
M400 ; Wait for moves to finish
TURN_OFF_HEATERS
G92 E0
G91 ; Relative positioning
G1 E-2 F2700 ; Retract
G1 X5 Y5 F3000 ; Nozzle wipe
G1 E-2 Z0.2 F1600
G1 Z4 F3000 ; Lift head
G90 ; Absolute positioning
G1 X0 Y415 ; Present part (Max Y)
M107 ; Stop fans
M84 ; Disable steppers
SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE=0
M117 Finished
END_TUNE ; Completion jingle
#############################################################################
# INTERRUPTION MANAGEMENT (PAUSE / RESUME / CANCEL)
#############################################################################
# --- MACRO: PAUSE ---
[gcode_macro PAUSE]
description: Pause the current print
rename_existing: BASE_PAUSE
gcode:
PAUSE_TUNE
{% set z = params.Z|default(30)|int %}
{% if printer['pause_resume'].is_paused|int == 0 %}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=etemp VALUE={printer['extruder'].target|default(220)}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE={z}
SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE=0
SAVE_GCODE_STATE NAME=PAUSE
BASE_PAUSE
G91
{% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %}
G1 E-2 F2700
G1 X3 Y3 F3000
G1 E-2 Z{z} F1600
SAVE_GCODE_STATE NAME=ZLIFT
{% else %}
{ action_respond_info("Pause zhop too high for Z axis.") }
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE=0
G1 E-2 F2700
G1 X3 Y3 F3000
G1 E-2 F1600
SAVE_GCODE_STATE NAME=ZLIFT
{% endif %}
G90
G1 X{printer.toolhead.axis_minimum.x+5} Y{printer.toolhead.axis_maximum.y-5} F6000
SAVE_GCODE_STATE NAME=PAUSEPARK
SET_HEATER_TEMPERATURE HEATER=extruder TARGET=175
SET_IDLE_TIMEOUT TIMEOUT=43200
{% endif %}
# --- MACRO: RESUME ---
[gcode_macro RESUME]
description: Resume the current print
rename_existing: BASE_RESUME
variable_zhop: 0
variable_etemp: 0
gcode:
{% if printer['pause_resume'].is_paused|int == 1 %}
SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE=1
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout}
{% if etemp > 0 %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={etemp|int}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={etemp|int - 4} MAXIMUM={etemp|int + 10}
{% endif %}
RESTORE_GCODE_STATE NAME=PAUSEPARK MOVE=1 MOVE_SPEED=100
G91
M83
G1 E80 F200 ; Purge 80mm to prime
G4 P2000
G1 X20 F15000 ; Wipe move
G1 X-20
RESTORE_GCODE_STATE NAME=ZLIFT MOVE=1 MOVE_SPEED=60
G1 X-3 Y-3 F3000
G1 Z{zhop * -1} F900
RESTORE_GCODE_STATE NAME=PAUSE MOVE=1 MOVE_SPEED=60
M400
BASE_RESUME
{% endif %}
# --- MACRO: CANCEL_PRINT ---
[gcode_macro CANCEL_PRINT]
description: Cancel the current print
rename_existing: BASE_CANCEL_PRINT
gcode:
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout}
CLEAR_PAUSE
SDCARD_RESET_FILE
PRINT_END
BASE_CANCEL_PRINT
2. Rationalisation algorithmique : Analyse des macros
Ce module structure le comportement dynamique de la machine à travers 5 routines fondamentales :
- PRINT_START (Lancement d'impression)
Cette routine récupère les températures de consigne définies par votre Slicer. Elle pilote une chauffe séquentielle, applique un Heat Soak (stabilisation thermique) de 5 minutes pour dilater uniformément la structure du plateau géant, effectue le homing (G28) à chaud, puis appelle l'écosystème KAMP (Klipper Adaptive Bed Mesh & Purge). Ce dernier génère un maillage de palpation ultra-localisé et applique une ligne de purge intelligente juste avant d'attaquer la première couche. - PRINT_END (Fin d'impression)
Dès que le fichier G-code est entièrement lu, cette macro coupe les éclairages de la machine, désactive les chauffes, opère une rétraction de sécurité pour éliminer le suintement, puis dégage l'outil. Sa signature ZEW ? Elle **propulse automatiquement le plateau au maximum vers l'avant (Y415)** pour vous présenter la pièce terminée, tout en exécutant un avertissement sonore. - PAUSE (Interruption sécurisée)
Qu'elle soit initiée manuellement ou déclenchée par le capteur de fin de filament, elle mémorise l'état exact des coordonnées cartésiennes, effectue un retrait suivi d'un soulèvement d'axe (Z-hop). Elle parque la tête en zone sûre et, fonction indispensable, **abaisse la buse à 175°C** pour éviter que le plastique statique ne brûle ou ne cristallise dans le brise-chaleur pendant votre absence. - RESUME (Reprise de l'impression)
Pour repartir proprement après un arrêt, cette macro réactive le capteur de filament, remonte la buse à sa température d'impression initiale et attend sa stabilisation. Elle applique ensuite une **purge généreuse de 80 mm** pour réamorcer parfaitement la buse (idéal après un changement de bobine), effectue un mouvement d'essuyage rapide et replace précisément la tête là où elle s'était arrêtée. - CANCEL_PRINT (Annulation définitive)
En cas d'échec d'impression (décollement, spaghetti), cette commande réinitialise les temporisations d'inactivité de Klipper, nettoie l'état de pause de la mémoire tampon de la carte SD, et appelle directement la macroPRINT_ENDpour éteindre proprement la machine et présenter le plateau en toute sécurité.
3. Raccordement : L'intégration modulaire dans printer.cfg
Fidèle aux principes de propreté et de modularité de notre charte **ZEW-Neptune4Max V1.0**, votre fichier maître printer.cfg ne doit plus stocker de macros kilométriques. Il délègue l'intelligence logicielle en appelant nos blocs spécialisés.
Ouvrez votre fichier printer.cfg central et raccordez ce module en ajoutant la directive d'inclusion surlignée en orange au sein de votre bloc de configuration modulaire :
#############################################################################
# MODULAR CONFIGURATION (INCLUDES)
#############################################################################
[force_move]
enable_force_move: True
# --- HARDWARE ---
[include Hardware/Neptune4max.cfg] # Main printer configuration (Chassis & Signaling)
[include Hardware/Extruders.cfg] # Extruder and heater settings
[include Hardware/Fans.cfg] # Cooling and enclosure fans
#[include Hardware/Adxl.cfg] # Input Shaper calibration
# --- INTELLIGENCE (Macros) ---
[include Macros/Macros.cfg] # Core system macros Rappel crucial de sensibilité à la casse (Linux) : L'environnement Debian qui fait tourner Klipper ne pardonne aucune approximation. Le répertoire hôte s'appelle Macros et le script cible s'appelle Macros.cfg. Écrire l'include avec une minuscule (ex: macros/macros.cfg) lèvera instantanément une erreur fatale au redémarrage.
Avec cette intégration fondamentale, nous mettons en place le cœur algorithmique de notre architecture standardisée. Votre Elegoo Neptune 4 Max dispose désormais d'un cycle de vie robuste, isolé et parfaitement géré. Dans le prochain article, nous poursuivrons la structuration de notre répertoire Macros en nous attaquant au fichier Helpers.cfg, dédié aux macros dites de confort ou de contrôle de certaines fonctions. Restez connectés !