11. [Requis] Architecture logicielle et centralisation des macros fondamentales

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 macro PRINT_END pour é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 !

Choix utilisateur pour les Cookies
Nous utilisons des cookies afin de vous proposer les meilleurs services possibles. Si vous déclinez l'utilisation de ces cookies, le site web pourrait ne pas fonctionner correctement.
Tout accepter
Tout décliner
Analytique
Outils utilisés pour analyser les données de navigation et mesurer l'efficacité du site internet afin de comprendre son fonctionnement.
Google Analytics
Accepter
Décliner
Publicité
Si vous acceptez, les annonces présentes sur la page seront adaptées à vos préférences.
Publicité Google
Accepter
Décliner
Sauvegarder