From 4f91fc96780c2076a07417f8441ec61f07b1486e Mon Sep 17 00:00:00 2001 From: Benoit LORAND Date: Sat, 25 Jan 2025 17:32:18 +0100 Subject: [PATCH] Ajout de la configuration de la Ender 5 avec l'extruder Sprite. --- .../Configuration.h | 3412 +++++++++++++ .../Configuration_adv.h | 4268 +++++++++++++++++ .../_Bootscreen.h | 97 + .../_Statusscreen.h | 62 + .../firmware-2.1.2.5.bin | Bin 0 -> 291032 bytes 5 files changed, 7839 insertions(+) create mode 100644 Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration.h create mode 100644 Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration_adv.h create mode 100644 Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Bootscreen.h create mode 100644 Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Statusscreen.h create mode 100644 Ender5 with SKR mini E3 V3.0 and Sprite extruder/firmware-2.1.2.5.bin diff --git a/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration.h b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration.h new file mode 100644 index 0000000..faf043e --- /dev/null +++ b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration.h @@ -0,0 +1,3412 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define CONFIG_EXAMPLES_DIR "config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 3.0" + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + */ +#define CONFIGURATION_H_VERSION 02010205 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some useful links to help get your machine configured and calibrated: + * + * Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all + * + * Průša Calculator: https://blog.prusa3d.com/calculator_3416/ + * + * Calibration Guides: https://reprap.org/wiki/Calibration + * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * https://web.archive.org/web/20220907014303/https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * https://youtu.be/wAL9d7FgInk + * https://teachingtechyt.github.io/calibration.html + * + * Calibration Objects: https://www.thingiverse.com/thing:5573 + * https://www.thingiverse.com/thing:1278865 + */ + +// @section info + +// Author info of this build printed to the host during boot and M115 +#define STRING_CONFIG_H_AUTHOR "(BigTreeTech, SKR-mini-E3-V3.0)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** +#define SHOW_BOOTSCREEN + +// Show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +// Choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V3_0 +#endif + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 2 + +/** + * Serial Port Baud Rate + * This is the default communication speed for all serial ports. + * Set the baud rate defaults for additional serial ports below. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +//#define BAUD_RATE_GCODE // Enable G-code M575 to set the baud rate + +/** + * Select a secondary serial port on the board to use for communication with the host. + * Currently Ethernet (-2) is only supported on Teensy 4.1 boards. + * :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT_2 -1 +//#define BAUDRATE_2 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE + +/** + * Select a third serial port on the board to use for communication with the host. + * Currently only supported for AVR, DUE, LPC1768/9 and STM32/STM32F1 + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_3 1 +//#define BAUDRATE_3 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// Name displayed in the LCD "Ready" message and Info menu +#define CUSTOM_MACHINE_NAME "Ender-5 Pro" + +// Printer's unique ID, used by some programs to differentiate between machines. +// Choose your own or use a service like https://www.uuidgenerator.net/version4 +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section stepper drivers + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * Use TMC2208/TMC2208_STANDALONE for TMC2225 drivers and TMC2209/TMC2209_STANDALONE for TMC2226 drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, + * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] + */ +#define X_DRIVER_TYPE TMC2209 +#define Y_DRIVER_TYPE TMC2209 +#define Z_DRIVER_TYPE TMC2209 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 +//#define Z4_DRIVER_TYPE A4988 +//#define I_DRIVER_TYPE A4988 +//#define J_DRIVER_TYPE A4988 +//#define K_DRIVER_TYPE A4988 +//#define U_DRIVER_TYPE A4988 +//#define V_DRIVER_TYPE A4988 +//#define W_DRIVER_TYPE A4988 +#define E0_DRIVER_TYPE TMC2209 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 +//#define E6_DRIVER_TYPE A4988 +//#define E7_DRIVER_TYPE A4988 + +/** + * Additional Axis Settings + * + * Define AXISn_ROTATES for all axes that rotate or pivot. + * Rotational axis coordinates are expressed in degrees. + * + * AXISn_NAME defines the letter used to refer to the axis in (most) G-code commands. + * By convention the names and roles are typically: + * 'A' : Rotational axis parallel to X + * 'B' : Rotational axis parallel to Y + * 'C' : Rotational axis parallel to Z + * 'U' : Secondary linear axis parallel to X + * 'V' : Secondary linear axis parallel to Y + * 'W' : Secondary linear axis parallel to Z + * + * Regardless of these settings the axes are internally named I, J, K, U, V, W. + */ +#ifdef I_DRIVER_TYPE + #define AXIS4_NAME 'A' // :['A', 'B', 'C', 'U', 'V', 'W'] + #define AXIS4_ROTATES +#endif +#ifdef J_DRIVER_TYPE + #define AXIS5_NAME 'B' // :['B', 'C', 'U', 'V', 'W'] + #define AXIS5_ROTATES +#endif +#ifdef K_DRIVER_TYPE + #define AXIS6_NAME 'C' // :['C', 'U', 'V', 'W'] + #define AXIS6_ROTATES +#endif +#ifdef U_DRIVER_TYPE + #define AXIS7_NAME 'U' // :['U', 'V', 'W'] + //#define AXIS7_ROTATES +#endif +#ifdef V_DRIVER_TYPE + #define AXIS8_NAME 'V' // :['V', 'W'] + //#define AXIS8_ROTATES +#endif +#ifdef W_DRIVER_TYPE + #define AXIS9_NAME 'W' // :['W'] + //#define AXIS9_ROTATES +#endif + +// @section extruder + +// This defines the number of extruders +// :[0, 1, 2, 3, 4, 5, 6, 7, 8] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +// Save and restore temperature and fan speed on tool-change. +// Set standby for the unselected tool with M104/106/109 T... +#if ENABLED(SINGLENOZZLE) + //#define SINGLENOZZLE_STANDBY_TEMP + //#define SINGLENOZZLE_STANDBY_FAN +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }. + // For Dual Servo use two pairs: { { lower, raise }, { lower, raise } } + #define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism using movements and no solenoid + * + * project : https://www.thingiverse.com/thing:3080893 + * movements : https://youtu.be/0xCEiG9VS3k + * https://youtu.be/Bqbcs0CU2FE + */ +//#define MAGNETIC_PARKING_EXTRUDER + +#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder + + #if ENABLED(PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined. + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + + #define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point + #define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple + #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point + #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling + + #endif + +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD + +/** + * Magnetic Switching Toolhead + * + * Support swappable and dockable toolheads with a magnetic + * docking mechanism using movement and no servo. + */ +//#define MAGNETIC_SWITCHING_TOOLHEAD + +/** + * Electromagnetic Switching Toolhead + * + * Parking for CoreXY / HBot kinematics. + * Toolheads are parked at one edge and held with an electromagnet. + * Supports more than 2 Toolheads. See https://youtu.be/JolbsAKTKf4 + */ +//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD + +#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1) + //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock + #if ENABLED(PRIME_BEFORE_REMOVE) + #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length + #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length + #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate + #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate + #endif + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching + #endif +#endif + +/** + * "Mixing Extruder" + * - Adds G-codes M163 and M164 to set and "commit" the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools. + * - This implementation supports up to two mixing extruders. + * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation). + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands + //#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD + //#define MIXING_PRESETS // Assign 8 default V-tool presets for 2 or 3 MIXING_STEPPERS + #if ENABLED(GRADIENT_MIX) + //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias + #endif +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle + +// @section multi-material + +/** + * Multi-Material Unit + * Set to one of these predefined models: + * + * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) + * PRUSA_MMU2 : Průša MMU2 + * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) + * EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) + * EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) + * + * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. + * See additional options in Configuration_adv.h. + * :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"] + */ +//#define MMU_MODEL PRUSA_MMU2 + +// @section psu control + +/** + * Power Supply Control + * + * Enable and connect the power supply to the PS_ON_PIN. + * Specify whether the power supply is active HIGH or active LOW. + */ +//#define PSU_CONTROL +//#define PSU_NAME "Power Supply" + +#if ENABLED(PSU_CONTROL) + //#define MKS_PWC // Using the MKS PWC add-on + //#define PS_OFF_CONFIRM // Confirm dialog when power off + //#define PS_OFF_SOUND // Beep 1s when power off + #define PSU_ACTIVE_STATE HIGH // Set 'LOW' for ATX, 'HIGH' for X-Box + + //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 + //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power + //#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay + + //#define POWER_OFF_TIMER // Enable M81 D to power off after a delay + //#define POWER_OFF_WAIT_FOR_COOLDOWN // Enable M81 S to power off only after cooldown + + //#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on) + //#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off) + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU for fans + #define AUTO_POWER_E_FANS // Turn on PSU for E Fans + #define AUTO_POWER_CONTROLLERFAN // Turn on PSU for Controller Fan + #define AUTO_POWER_CHAMBER_FAN // Turn on PSU for Chamber Fan + #define AUTO_POWER_COOLER_FAN // Turn on PSU for Cooler Fan + #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration + //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. + #endif + #if EITHER(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN) + //#define AUTO_POWER_E_TEMP 50 // (°C) PSU on if any extruder is over this temperature + //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) PSU on if the chamber is over this temperature + //#define AUTO_POWER_COOLER_TEMP 26 // (°C) PSU on if the cooler is over this temperature + #endif +#endif + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * Temperature Sensors: + * + * NORMAL IS 4.7kΩ PULLUP! Hotend sensors can use 1kΩ pullup with correct resistor and table. + * + * ================================================================ + * Analog Thermistors - 4.7kΩ pullup - Normal + * ================================================================ + * 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors + * 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA + * 332 : 100kΩ Same as #1, but 3.3V scaled for DUE + * 2 : 200kΩ ATC Semitec 204GT-2 + * 202 : 200kΩ Copymaster 3D + * 3 : ???Ω Mendel-parts thermistor + * 4 : 10kΩ Generic Thermistor !! DO NOT use for a hotend - it gives bad resolution at high temp. !! + * 5 : 100kΩ ATC Semitec 104GT-2/104NT-4-R025H42G - Used in ParCan, J-Head, and E3D, SliceEngineering 300°C + * 501 : 100kΩ Zonestar - Tronxy X3A + * 502 : 100kΩ Zonestar - used by hot bed in Zonestar Průša P802M + * 503 : 100kΩ Zonestar (Z8XM2) Heated Bed thermistor + * 504 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-B3950) Hotend Thermistor + * 505 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-3950) Bed Thermistor + * 512 : 100kΩ RPW-Ultra hotend + * 6 : 100kΩ EPCOS - Not as accurate as table #1 (created using a fluke thermocouple) + * 7 : 100kΩ Honeywell 135-104LAG-J01 + * 71 : 100kΩ Honeywell 135-104LAF-J01 + * 8 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT + * 9 : 100kΩ GE Sensing AL03006-58.2K-97-G1 + * 10 : 100kΩ RS PRO 198-961 + * 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1% + * 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed + * 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1% + * 14 : 100kΩ (R25), 4092K (beta25), 4.7kΩ pull-up, bed thermistor as used in Ender-5 S1 + * 15 : 100kΩ Calibrated for JGAurora A5 hotend + * 17 : 100kΩ Dagoma NTC white thermistor + * 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327 + * 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input + * 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input + * 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950 + * 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950 + * 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950 + * 66 : 4.7MΩ Dyze Design / Trianglelab T-D500 500°C High Temperature Thermistor + * 67 : 500kΩ SliceEngineering 450°C Thermistor + * 68 : PT100 Smplifier board from Dyze Design + * 70 : 100kΩ bq Hephestos 2 + * 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32 + * 666 : 200kΩ Einstart S custom thermistor with 10k pullup. + * 2000 : 100kΩ Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor + * + * ================================================================ + * Analog Thermistors - 1kΩ pullup + * Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ. + * (but gives greater accuracy and more stable PID) + * ================================================================ + * 51 : 100kΩ EPCOS (1kΩ pullup) + * 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup) + * 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup) + * + * ================================================================ + * Analog Thermistors - 10kΩ pullup - Atypical + * ================================================================ + * 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor + * + * ================================================================ + * Analog RTDs (Pt100/Pt1000) + * ================================================================ + * 110 : Pt100 with 1kΩ pullup (atypical) + * 147 : Pt100 with 4.7kΩ pullup + * 1010 : Pt1000 with 1kΩ pullup (atypical) + * 1022 : Pt1000 with 2.2kΩ pullup + * 1047 : Pt1000 with 4.7kΩ pullup (E3D) + * 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage. + * NOTE: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21. + * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply. + * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. + * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x + * + * ================================================================ + * SPI RTD/Thermocouple Boards + * ================================================================ + * -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-2 and bed) + * NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below. + * -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-2 and bed) + * -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-2 and bed) + * + * NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default, + * Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN, + * Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the + * Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported. + * + * ================================================================ + * Analog Thermocouple Boards + * ================================================================ + * -4 : AD8495 with Thermocouple + * -1 : AD595 with Thermocouple + * + * ================================================================ + * Custom/Dummy/Other Thermal Sensors + * ================================================================ + * 0 : not used + * 1000 : Custom - Specify parameters in Configuration_adv.h + * + * !!! Use these for Testing or Development purposes. NEVER for production machine. !!! + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 +#define TEMP_SENSOR_6 0 +#define TEMP_SENSOR_7 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_PROBE 0 +#define TEMP_SENSOR_CHAMBER 0 +#define TEMP_SENSOR_COOLER 0 +#define TEMP_SENSOR_BOARD 0 +#define TEMP_SENSOR_REDUNDANT 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 +#if TEMP_SENSOR_IS_MAX_TC(0) + #define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000) + #define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000 +#endif +#if TEMP_SENSOR_IS_MAX_TC(1) + #define MAX31865_SENSOR_OHMS_1 100 + #define MAX31865_CALIBRATION_OHMS_1 430 +#endif +#if TEMP_SENSOR_IS_MAX_TC(2) + #define MAX31865_SENSOR_OHMS_2 100 + #define MAX31865_CALIBRATION_OHMS_2 430 +#endif + +#if HAS_E_TEMP_SENSOR + #define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 + #define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer + #define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#endif + +#if TEMP_SENSOR_BED + #define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 + #define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer + #define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#endif + +#if TEMP_SENSOR_CHAMBER + #define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 + #define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer + #define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#endif + +/** + * Redundant Temperature Sensor (TEMP_SENSOR_REDUNDANT) + * + * Use a temp sensor as a redundant sensor for another reading. Select an unused temperature sensor, and another + * sensor you'd like it to be redundant for. If the two thermistors differ by TEMP_SENSOR_REDUNDANT_MAX_DIFF (°C), + * the print will be aborted. Whichever sensor is selected will have its normal functions disabled; i.e. selecting + * the Bed sensor (-1) will disable bed heating/monitoring. + * + * For selecting source/target use: COOLER, PROBE, BOARD, CHAMBER, BED, E0, E1, E2, E3, E4, E5, E6, E7 + */ +#if TEMP_SENSOR_REDUNDANT + #define TEMP_SENSOR_REDUNDANT_SOURCE E1 // The sensor that will provide the redundant reading. + #define TEMP_SENSOR_REDUNDANT_TARGET E0 // The sensor that we are providing a redundant reading for. + #define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort. +#endif + +// Below this temperature the heater will be switched off +// because it probably indicates a broken thermistor wire. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 +#define HEATER_6_MINTEMP 5 +#define HEATER_7_MINTEMP 5 +#define BED_MINTEMP 5 +#define CHAMBER_MINTEMP 5 + +// Above this temperature the heater will be switched off. +// This can protect components from overheating, but NOT from shorts and failures. +// (Use MINTEMP for thermistor short/failure protection.) +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 +#define HEATER_6_MAXTEMP 275 +#define HEATER_7_MAXTEMP 275 +#define BED_MAXTEMP 150 +#define CHAMBER_MAXTEMP 60 + +/** + * Thermal Overshoot + * During heatup (and printing) the temperature can often "overshoot" the target by many degrees + * (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees + * a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP. + */ +#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== + +// @section hotend temp + +/** + * Temperature Control + * + * (NONE) : Bang-bang heating + * PIDTEMP : PID temperature control (~4.1K) + * MPCTEMP : Predictive Model temperature control. (~1.8K without auto-tune) + */ +#define PIDTEMP // See the PID Tuning Guide at https://reprap.org/wiki/PID_Tuning +//#define MPCTEMP // ** EXPERIMENTAL ** See https://marlinfw.org/docs/features/model_predictive_control.html + +#define PID_MAX 255 // Limit hotend current while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop + +#if ENABLED(PIDTEMP) + //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation. + //#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with G-code: M301 E[extruder number, 0-2] + + #if ENABLED(PID_PARAMS_PER_HOTEND) + // Specify up to one value per hotend here, according to your setup. + // If there are fewer values, the last one applies to the remaining hotends. + #define DEFAULT_Kp_LIST { 22.20, 22.20 } + #define DEFAULT_Ki_LIST { 1.08, 1.08 } + #define DEFAULT_Kd_LIST { 114.00, 114.00 } + #else + #define DEFAULT_Kp 21.73 + #define DEFAULT_Ki 1.54 + #define DEFAULT_Kd 76.55 + #endif +#else + #define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current +#endif + +/** + * Model Predictive Control for hotend + * + * Use a physical model of the hotend to control temperature. When configured correctly this gives + * better responsiveness and stability than PID and removes the need for PID_EXTRUSION_SCALING + * and PID_FAN_SCALING. Use M306 T to autotune the model. + * @section mpctemp + */ +#if ENABLED(MPCTEMP) + //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1.3K bytes of flash) + //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash) + + #define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active. + #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. + + #define MPC_INCLUDE_FAN // Model the fan speed? + + // Measured physical constants from M306 + #define MPC_BLOCK_HEAT_CAPACITY { 16.7f } // (J/K) Heat block heat capacities. + #define MPC_SENSOR_RESPONSIVENESS { 0.22f } // (K/s per ∆K) Rate of change of sensor temperature from heat block. + #define MPC_AMBIENT_XFER_COEFF { 0.068f } // (W/K) Heat transfer coefficients from heat block to room air with fan off. + #if ENABLED(MPC_INCLUDE_FAN) + #define MPC_AMBIENT_XFER_COEFF_FAN255 { 0.097f } // (W/K) Heat transfer coefficients from heat block to room air with fan on full. + #endif + + // For one fan and multiple hotends MPC needs to know how to apply the fan cooling effect. + #if ENABLED(MPC_INCLUDE_FAN) + //#define MPC_FAN_0_ALL_HOTENDS + //#define MPC_FAN_0_ACTIVE_HOTEND + #endif + + // Filament Heat Capacity (joules/kelvin/mm) + // Set at runtime with M306 H + #define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA). + // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG). + // 0.00515 J/K/mm for 1.75mm ABS (0.0137 J/K/mm for 2.85mm ABS). + // 0.00522 J/K/mm for 1.75mm Nylon (0.0138 J/K/mm for 2.85mm Nylon). + + // Advanced options + #define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization. + #define MPC_MIN_AMBIENT_CHANGE 1.0f // (K/s) Modeled ambient temperature rate of change, when correcting model inaccuracies. + #define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced. + + #define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height. + #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position. +#endif + +//=========================================================================== +//====================== PID > Bed Temperature Control ====================== +//=========================================================================== + +// @section bed temp + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +/** + * PID Bed Heating + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + * + * With this option disabled, bang-bang will be used. BED_LIMIT_SWITCHING enables hysteresis. + */ +#define PIDTEMPBED + +#if ENABLED(PIDTEMPBED) + //#define MIN_BED_POWER 0 + //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. + + // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 41.78 + #define DEFAULT_bedKi 7.32 + #define DEFAULT_bedKd 158.93 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#else + //#define BED_LIMIT_SWITCHING // Keep the bed temperature within BED_HYSTERESIS of the target +#endif + +//=========================================================================== +//==================== PID > Chamber Temperature Control ==================== +//=========================================================================== + +/** + * PID Chamber Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and CHAMBER_LIMIT_SWITCHING will enable + * hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 200W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use chamber PID until someone else verifies that your hardware works. + * @section chamber temp + */ +//#define PIDTEMPCHAMBER +//#define CHAMBER_LIMIT_SWITCHING + +/** + * Max Chamber Power + * Applies to all forms of chamber control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the chamber heater that acts like a divider + * so don't use it unless you are OK with PWM on your heater. (See the comment on enabling PIDTEMPCHAMBER) + */ +#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current + +#if ENABLED(PIDTEMPCHAMBER) + #define MIN_CHAMBER_POWER 0 + //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. + + // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element + // and placed inside the small Creality printer enclosure tent. + // + #define DEFAULT_chamberKp 37.04 + #define DEFAULT_chamberKi 1.40 + #define DEFAULT_chamberKd 655.17 + // M309 P37.04 I1.04 D655.17 + + // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles. +#endif // PIDTEMPCHAMBER + +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) + //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash) + //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash) +#endif + +// @section safety + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 600 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed +#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber +#define THERMAL_PROTECTION_COOLER // Enable thermal protection for the laser cooling + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +// +// MarkForged Kinematics +// See https://reprap.org/forum/read.php?152,504042 +// +//#define MARKFORGED_XY +//#define MARKFORGED_YX + +// Enable for a belt style printer with endless "Z" motion +//#define BELTPRINTER + +// Enable for Polargraph Kinematics +//#define POLARGRAPH +#if ENABLED(POLARGRAPH) + #define POLARGRAPH_MAX_BELT_LEN 1035.0 // (mm) Belt length at full extension. Override with M665 H. + #define DEFAULT_SEGMENTS_PER_SECOND 5 // Move segmentation based on duration +#endif + +// @section delta + +// Enable for DELTA kinematics and configure below +//#define DELTA +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DEFAULT_SEGMENTS_PER_SECOND 200 + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // Add three-point calibration to the MarlinUI menu. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // G33 Delta Auto-Calibration. Enable EEPROM_SETTINGS to store results. + //#define DELTA_AUTO_CALIBRATION + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // Default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) + // Step size for paper-test probing + #define PROBE_MANUALLY_STEP 0.05 // (mm) + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 140.0 // (mm) + + // Maximum reachable area + #define DELTA_MAX_RADIUS 140.0 // (mm) + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 250.0 // (mm) + + // Distance between bed and nozzle Z home position + #define DELTA_HEIGHT 250.00 // (mm) Get this value from G33 auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // (mm) Get these values from G33 auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 124.0 // (mm) Get this value from G33 auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // (mm) Get these values from G33 auto calibrate + + // Delta radius and diagonal rod adjustments + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) +#endif + +// @section scara + +/** + * MORGAN_SCARA was developed by QHARLEY in South Africa in 2012-2013. + * Implemented and slightly reworked by JCERNY in June, 2014. + * + * Mostly Printed SCARA is an open source design by Tyler Williams. See: + * https://www.thingiverse.com/thing:2487048 + * https://www.thingiverse.com/thing:1241491 + */ +//#define MORGAN_SCARA +//#define MP_SCARA +#if EITHER(MORGAN_SCARA, MP_SCARA) + // If movement is choppy try lowering this value + #define DEFAULT_SEGMENTS_PER_SECOND 200 + + // Length of inner and outer support arms. Measure arm lengths precisely. + #define SCARA_LINKAGE_1 150 // (mm) + #define SCARA_LINKAGE_2 150 // (mm) + + // SCARA tower offset (position of Tower relative to bed zero position) + // This needs to be reasonably accurate as it defines the printbed position in the SCARA space. + #define SCARA_OFFSET_X 100 // (mm) + #define SCARA_OFFSET_Y -56 // (mm) + + #if ENABLED(MORGAN_SCARA) + + //#define DEBUG_SCARA_KINEMATICS + #define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly + + // Radius around the center where the arm cannot reach + #define MIDDLE_DEAD_ZONE_R 0 // (mm) + + #define THETA_HOMING_OFFSET 0 // Calculated from Calibration Guide and M360 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ + #define PSI_HOMING_OFFSET 0 // Calculated from Calibration Guide and M364 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ + + #elif ENABLED(MP_SCARA) + + #define SCARA_OFFSET_THETA1 12 // degrees + #define SCARA_OFFSET_THETA2 131 // degrees + + #endif + +#endif + +// @section tpara + +// Enable for TPARA kinematics and configure below +//#define AXEL_TPARA +#if ENABLED(AXEL_TPARA) + #define DEBUG_TPARA_KINEMATICS + #define DEFAULT_SEGMENTS_PER_SECOND 200 + + // Length of inner and outer support arms. Measure arm lengths precisely. + #define TPARA_LINKAGE_1 120 // (mm) + #define TPARA_LINKAGE_2 120 // (mm) + + // SCARA tower offset (position of Tower relative to bed zero position) + // This needs to be reasonably accurate as it defines the printbed position in the SCARA space. + #define TPARA_OFFSET_X 0 // (mm) + #define TPARA_OFFSET_Y 0 // (mm) + #define TPARA_OFFSET_Z 0 // (mm) + + #define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly + + // Radius around the center where the arm cannot reach + #define MIDDLE_DEAD_ZONE_R 0 // (mm) + + // Calculated from Calibration Guide and M360 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ + #define THETA_HOMING_OFFSET 0 + #define PSI_HOMING_OFFSET 0 +#endif + +// @section machine + +// Articulated robot (arm). Joints are directly mapped to axes with no kinematics. +//#define ARTICULATED_ROBOT_ARM + +// For a hot wire cutter with parallel horizontal axes (X, I) where the heights of the two wire +// ends are controlled by parallel axes (Y, J). Joints are directly mapped to axes (no kinematics). +//#define FOAMCUTTER_XYUV + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section endstops + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_IMIN_PLUG +//#define USE_JMIN_PLUG +//#define USE_KMIN_PLUG +//#define USE_UMIN_PLUG +//#define USE_VMIN_PLUG +//#define USE_WMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG +//#define USE_IMAX_PLUG +//#define USE_JMAX_PLUG +//#define USE_KMAX_PLUG +//#define USE_UMAX_PLUG +//#define USE_VMAX_PLUG +//#define USE_WMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_IMIN + //#define ENDSTOPPULLUP_JMIN + //#define ENDSTOPPULLUP_KMIN + //#define ENDSTOPPULLUP_UMIN + //#define ENDSTOPPULLUP_VMIN + //#define ENDSTOPPULLUP_WMIN + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_IMAX + //#define ENDSTOPPULLUP_JMAX + //#define ENDSTOPPULLUP_KMAX + //#define ENDSTOPPULLUP_UMAX + //#define ENDSTOPPULLUP_VMAX + //#define ENDSTOPPULLUP_WMAX + #define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_IMIN + //#define ENDSTOPPULLDOWN_JMIN + //#define ENDSTOPPULLDOWN_KMIN + //#define ENDSTOPPULLDOWN_UMIN + //#define ENDSTOPPULLDOWN_VMIN + //#define ENDSTOPPULLDOWN_WMIN + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_IMAX + //#define ENDSTOPPULLDOWN_JMAX + //#define ENDSTOPPULLDOWN_KMAX + //#define ENDSTOPPULLDOWN_UMAX + //#define ENDSTOPPULLDOWN_VMAX + //#define ENDSTOPPULLDOWN_WMAX + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define I_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define J_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define K_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define U_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define V_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define W_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define I_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define J_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define K_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define U_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define V_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define W_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Threshold + * + * Enable if your probe or endstops falsely trigger due to noise. + * + * - Higher values may affect repeatability or accuracy of some bed probes. + * - To fix noise install a 100nF ceramic capacitor in parallel with the switch. + * - This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, which already have the 100nF capacitor. + * + * :[2,3,4,5,6,7] + */ +//#define ENDSTOP_NOISE_THRESHOLD 2 + +// Check for stuck or disconnected endstops during homing moves. +#define DETECT_BROKEN_ENDSTOP + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (linear=steps/mm, rotational=steps/°) + * Override with M92 + * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 424.9 } + +/** + * Default Max Feed Rate (linear=mm/s, rotational=°/s) + * Override with M203 + * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + +/** + * Default Max Acceleration (speed change with time) (linear=mm/(s^2), rotational=°/(s^2)) + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 10000 } + +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + +/** + * Default Acceleration (speed change with time) (linear=mm/(s^2), rotational=°/(s^2)) + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk limits (mm/s) + * Override with M205 X Y Z . . . E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) + #define DEFAULT_XJERK 10.0 + #define DEFAULT_YJERK 10.0 + #define DEFAULT_ZJERK 0.3 + //#define DEFAULT_IJERK 0.3 + //#define DEFAULT_JJERK 0.3 + //#define DEFAULT_KJERK 0.3 + //#define DEFAULT_UJERK 0.3 + //#define DEFAULT_VJERK 0.3 + //#define DEFAULT_WJERK 0.3 + + //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif +#endif + +#define DEFAULT_EJERK 5.0 // May be used by Linear Advance + +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge + #define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle + // for small segments (< 1mm) with large junction angles (> 135°). +#endif + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See https://marlinfw.org/docs/configuration/probes.html +// + +/** + * Enable this option for a probe connected to the Z-MIN pin. + * The probe replaces the Z-MIN endstop and is used for Z homing. + * (Automatically enables USE_PROBE_FOR_Z_HOMING.) + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// Force the use of the probe for Z-axis homing +#define USE_PROBE_FOR_Z_HOMING + +/** + * Z_MIN_PROBE_PIN + * + * Override this pin only if the probe cannot be connected to + * the default Z_MIN_PROBE_PIN for the selected MOTHERBOARD. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - For simple switches... + * - Normally-closed (NC) also connect to GND. + * - Normally-open (NO) also connect to 5V. + */ +//#define Z_MIN_PROBE_PIN PC2 + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Use the nozzle as the probe, as with a conductive + * nozzle system or a piezo-electric smart effector. + */ +//#define NOZZLE_AS_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 +#ifdef Z_PROBE_SERVO_NR + //#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles +#endif + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +#define BLTOUCH + +/** + * MagLev V4 probe by MDD + * + * This probe is deployed and activated by powering a built-in electromagnet. + */ +//#define MAGLEV4 +#if ENABLED(MAGLEV4) + //#define MAGLEV_TRIGGER_PIN 11 // Set to the connected digital output + #define MAGLEV_TRIGGER_DELAY 15 // Changing this risks overheating the coil +#endif + +/** + * Touch-MI Probe by hotends.fr + * + * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed. + * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is + * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position. + * + * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING, + * and a minimum Z_HOMING_HEIGHT of 10. + */ +//#define TOUCH_MI_PROBE +#if ENABLED(TOUCH_MI_PROBE) + #define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts + //#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed + //#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu) +#endif + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice. +//#define RACK_AND_PINION_PROBE +#if ENABLED(RACK_AND_PINION_PROBE) + #define Z_PROBE_DEPLOY_X X_MIN_POS + #define Z_PROBE_RETRACT_X X_MAX_POS +#endif + +/** + * Magnetically Mounted Probe + * For probes such as Euclid, Klicky, Klackender, etc. + */ +//#define MAG_MOUNTED_PROBE +#if ENABLED(MAG_MOUNTED_PROBE) + #define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed + #define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed + + #define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe + #define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock + #define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed + #define MAG_MOUNTED_DEPLOY_4 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed + #define MAG_MOUNTED_DEPLOY_5 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed + #define MAG_MOUNTED_STOW_1 { PROBE_STOW_FEEDRATE, { 245, 114, 20 } } // Move to dock + #define MAG_MOUNTED_STOW_2 { PROBE_STOW_FEEDRATE, { 245, 114, 0 } } // Place probe beside remover + #define MAG_MOUNTED_STOW_3 { PROBE_STOW_FEEDRATE, { 230, 114, 0 } } // Side move to remove probe + #define MAG_MOUNTED_STOW_4 { PROBE_STOW_FEEDRATE, { 210, 114, 20 } } // Side move to remove probe + #define MAG_MOUNTED_STOW_5 { PROBE_STOW_FEEDRATE, { 0, 0, 0 } } // Extra move if needed +#endif + +// Duet Smart Effector (for delta printers) - https://docs.duet3d.com/en/Duet3D_hardware/Accessories/Smart_Effector +// When the pin is defined you can use M672 to set/reset the probe sensitivity. +//#define DUET_SMART_EFFECTOR +#if ENABLED(DUET_SMART_EFFECTOR) + #define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin +#endif + +/** + * Use StallGuard2 to probe the bed with the nozzle. + * Requires stallGuard-capable Trinamic stepper drivers. + * CAUTION: This can damage machines with Z lead screws. + * Take extreme care when setting up this feature. + */ +//#define SENSORLESS_PROBING + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - https://reprap.org/wiki/Kossel#Autolevel_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. + */ +//#define Z_PROBE_ALLEN_KEY +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + #define Z_PROBE_ALLEN_KEY_DEPLOY_1 { 30.0, DELTA_PRINTABLE_RADIUS, 100.0 } + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_FEEDRATE + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2 { 0.0, DELTA_PRINTABLE_RADIUS, 100.0 } + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_FEEDRATE)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3 { 0.0, (DELTA_PRINTABLE_RADIUS) * 0.75, 100.0 } + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_FEEDRATE + + #define Z_PROBE_ALLEN_KEY_STOW_1 { -64.0, 56.0, 23.0 } // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_FEEDRATE + + #define Z_PROBE_ALLEN_KEY_STOW_2 { -64.0, 56.0, 3.0 } // Push it down + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_FEEDRATE)/10 + + #define Z_PROBE_ALLEN_KEY_STOW_3 { -64.0, 56.0, 50.0 } // Move it up to clear + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_FEEDRATE + + #define Z_PROBE_ALLEN_KEY_STOW_4 { 0.0, 0.0, 50.0 } + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_FEEDRATE + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Nozzle-to-Probe offsets { X, Y, Z } + * + * X and Y offset + * Use a caliper or ruler to measure the distance from the tip of + * the Nozzle to the center-point of the Probe in the X and Y axes. + * + * Z offset + * - For the Z offset use your best known value and adjust at runtime. + * - Common probes trigger below the nozzle and have negative values for Z offset. + * - Probes triggering above the nozzle height are uncommon but do exist. When using + * probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES + * to avoid collisions during probing. + * + * Tune and Adjust + * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. + * - PROBE_OFFSET_WIZARD (Configuration_adv.h) can be used for setting the Z offset. + * + * Assuming the typical work area orientation: + * - Probe to RIGHT of the Nozzle has a Positive X offset + * - Probe to LEFT of the Nozzle has a Negative X offset + * - Probe in BACK of the Nozzle has a Positive Y offset + * - Probe in FRONT of the Nozzle has a Negative Y offset + * + * Some examples: + * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 } // Example "1" + * #define NOZZLE_TO_PROBE_OFFSET {-10, 5, -1 } // Example "2" + * #define NOZZLE_TO_PROBE_OFFSET { 5, -5, -1 } // Example "3" + * #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 } // Example "4" + * + * +-- BACK ---+ + * | [+] | + * L | 1 | R <-- Example "1" (right+, back+) + * E | 2 | I <-- Example "2" ( left-, back+) + * F |[-] N [+]| G <-- Nozzle + * T | 3 | H <-- Example "3" (right+, front-) + * | 4 | T <-- Example "4" ( left-, front-) + * | [-] | + * O-- FRONT --+ + */ +#define NOZZLE_TO_PROBE_OFFSET { -31.4, -40.1, -2.76 } + +// Most probes should stay away from the edges of the bed, but +// with NOZZLE_AS_PROBE this can be negative for a wider probing area. +#define PROBING_MARGIN 10 + +// X and Y axis travel speed (mm/min) between probes +#define XY_PROBE_FEEDRATE (133*60) + +// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_FEEDRATE_FAST (4*60) + +// Feedrate (mm/min) for the "accurate" probe of each point +#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) + +/** + * Probe Activation Switch + * A switch indicating proper deployment, or an optical + * switch triggered when the carriage is near the bed. + */ +//#define PROBE_ACTIVATION_SWITCH +#if ENABLED(PROBE_ACTIVATION_SWITCH) + #define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active + //#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin +#endif + +/** + * Tare Probe (determine zero-point) prior to each probe. + * Useful for a strain gauge or piezo sensor that needs to factor out + * elements such as cables pulling on the carriage. + */ +//#define PROBE_TARE +#if ENABLED(PROBE_TARE) + #define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin + #define PROBE_TARE_DELAY 200 // (ms) Delay after tare before + #define PROBE_TARE_STATE HIGH // State to write pin for tare + //#define PROBE_TARE_PIN PA5 // Override default pin + #if ENABLED(PROBE_ACTIVATION_SWITCH) + //#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active + #endif +#endif + +/** + * Probe Enable / Disable + * The probe only provides a triggered signal when enabled. + */ +//#define PROBE_ENABLE_DISABLE +#if ENABLED(PROBE_ENABLE_DISABLE) + //#define PROBE_ENABLE_PIN -1 // Override the default pin here +#endif + +/** + * Multiple Probing + * + * You may get improved results by probing 2 or more times. + * With EXTRA_PROBING the more atypical reading(s) will be disregarded. + * + * A total of 2 does fast/slow probes with a weighted average. + * A total of 3 or more adds more slow probes, taking the average. + */ +//#define MULTIPLE_PROBING 2 +//#define EXTRA_PROBING 1 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with NOZZLE_TO_PROBE_OFFSET, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // (mm) Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // (mm) Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // (mm) Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // (mm) Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // (mm) Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// Before deploy/stow pause for user confirmation +//#define PAUSE_BEFORE_DEPLOY_STOW +#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) + //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) + //#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define PROBING_ESTEPPERS_OFF // Turn all extruder steppers off when probing +//#define PROBING_STEPPERS_OFF // Turn all steppers off (unless needed to hold position) when probing (including extruders) +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// Require minimum nozzle and/or bed temperature for probing +//#define PREHEAT_BEFORE_PROBING +#if ENABLED(PREHEAT_BEFORE_PROBING) + #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time + #define PROBING_BED_TEMP 50 +#endif + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders +//#define I_ENABLE_ON 0 +//#define J_ENABLE_ON 0 +//#define K_ENABLE_ON 0 +//#define U_ENABLE_ON 0 +//#define V_ENABLE_ON 0 +//#define W_ENABLE_ON 0 + +// Disable axis steppers immediately when they're not being stepped. +// WARNING: When motors turn off there is a chance of losing position accuracy! +//#define DISABLE_X +//#define DISABLE_Y +//#define DISABLE_Z +//#define DISABLE_I +//#define DISABLE_J +//#define DISABLE_K +//#define DISABLE_U +//#define DISABLE_V +//#define DISABLE_W + +// Turn off the display blinking that warns about possible accuracy reduction +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +//#define DISABLE_E // Disable the extruder when not stepping +#define DISABLE_OTHER_EXTRUDERS // Keep only the active extruder enabled + +// @section motion + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true +//#define INVERT_I_DIR false +//#define INVERT_J_DIR false +//#define INVERT_K_DIR false +//#define INVERT_U_DIR false +//#define INVERT_V_DIR false +//#define INVERT_W_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false +#define INVERT_E5_DIR false +#define INVERT_E6_DIR false +#define INVERT_E7_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety. +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety. + +/** + * Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled. + * - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed. + * - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle. + */ +//#define Z_IDLE_HEIGHT Z_HOME_POS + +//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. + +//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 +//#define I_HOME_DIR -1 +//#define J_HOME_DIR -1 +//#define K_HOME_DIR -1 +//#define U_HOME_DIR -1 +//#define V_HOME_DIR -1 +//#define W_HOME_DIR -1 + +// @section geometry + +// The size of the printable area +#define X_BED_SIZE 220 +#define Y_BED_SIZE 200 + +// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 300 +//#define I_MIN_POS 0 +//#define I_MAX_POS 50 +//#define J_MIN_POS 0 +//#define J_MAX_POS 50 +//#define K_MIN_POS 0 +//#define K_MAX_POS 50 +//#define U_MIN_POS 0 +//#define U_MAX_POS 50 +//#define V_MIN_POS 0 +//#define V_MAX_POS 50 +//#define W_MIN_POS 0 +//#define W_MAX_POS 50 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y +// #define MIN_SOFTWARE_ENDSTOP_Z + #define MIN_SOFTWARE_ENDSTOP_I + #define MIN_SOFTWARE_ENDSTOP_J + #define MIN_SOFTWARE_ENDSTOP_K + #define MIN_SOFTWARE_ENDSTOP_U + #define MIN_SOFTWARE_ENDSTOP_V + #define MIN_SOFTWARE_ENDSTOP_W +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z + #define MAX_SOFTWARE_ENDSTOP_I + #define MAX_SOFTWARE_ENDSTOP_J + #define MAX_SOFTWARE_ENDSTOP_K + #define MAX_SOFTWARE_ENDSTOP_U + #define MAX_SOFTWARE_ENDSTOP_V + #define MAX_SOFTWARE_ENDSTOP_W +#endif + +#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * IMPORTANT: Runout will only trigger if Marlin is aware that a print job is running. + * Marlin knows a print job is running when: + * 1. Running a print job from media started with M24. + * 2. The Print Job Timer has been started with M75. + * 3. The heaters were turned on and PRINTJOB_TIMER_AUTOSTART is enabled. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + */ +#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_ENABLED_DEFAULT false // Enable the sensor on startup. Override with M412 followed by M500. + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + //#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder. + // This is automatically enabled for MIXING_EXTRUDERs. + + // Override individually if the runout sensors vary + //#define FIL_RUNOUT1_STATE LOW + //#define FIL_RUNOUT1_PULLUP + //#define FIL_RUNOUT1_PULLDOWN + + //#define FIL_RUNOUT2_STATE LOW + //#define FIL_RUNOUT2_PULLUP + //#define FIL_RUNOUT2_PULLDOWN + + //#define FIL_RUNOUT3_STATE LOW + //#define FIL_RUNOUT3_PULLUP + //#define FIL_RUNOUT3_PULLDOWN + + //#define FIL_RUNOUT4_STATE LOW + //#define FIL_RUNOUT4_PULLUP + //#define FIL_RUNOUT4_PULLDOWN + + //#define FIL_RUNOUT5_STATE LOW + //#define FIL_RUNOUT5_PULLUP + //#define FIL_RUNOUT5_PULLDOWN + + //#define FIL_RUNOUT6_STATE LOW + //#define FIL_RUNOUT6_PULLUP + //#define FIL_RUNOUT6_PULLDOWN + + //#define FIL_RUNOUT7_STATE LOW + //#define FIL_RUNOUT7_PULLUP + //#define FIL_RUNOUT7_PULLDOWN + + //#define FIL_RUNOUT8_STATE LOW + //#define FIL_RUNOUT8_PULLUP + //#define FIL_RUNOUT8_PULLDOWN + + // Commands to execute on filament runout. + // With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c") + // NOTE: After 'M412 H1' the host handles filament runout and this script does not apply. + #define FILAMENT_RUNOUT_SCRIPT "M600" + + // After a runout is detected, continue printing this length of filament + // before executing the runout script. Useful for a sensor at the end of + // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. + //#define FILAMENT_RUNOUT_DISTANCE_MM 3 + + #ifdef FILAMENT_RUNOUT_DISTANCE_MM + // Enable this option to use an encoder disc that toggles the runout pin + // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM + // large enough to avoid false positives.) + //#define FILAMENT_MOTION_SENSOR + #endif +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + +/** + * Normally G28 leaves leveling disabled on completion. Enable one of + * these options to restore the prior leveling state or to always enable + * leveling immediately after G28. + */ +//#define RESTORE_LEVELING_AFTER_G28 +#define ENABLE_LEVELING_AFTER_G28 + +/** + * Auto-leveling needs preheating + */ +//#define PREHEAT_BEFORE_LEVELING +#if ENABLED(PREHEAT_BEFORE_LEVELING) + #define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time + #define LEVELING_BED_TEMP 50 +#endif + +/** + * Bed Distance Sensor + * + * Measures the distance from bed to nozzle with accuracy of 0.01mm. + * For information about this sensor https://github.com/markniu/Bed_Distance_sensor + * Uses I2C port, so it requires I2C library markyue/Panda_SoftMasterI2C. + */ +//#define BD_SENSOR + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of flash! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL, PROBE_MANUALLY) + // Set a height for the start of manual adjustment + #define MANUAL_PROBE_START_Z 0.2 // (mm) Comment out to use the last-measured height +#endif + +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) + /** + * Gradually reduce leveling correction until a set height is reached, + * at which point movement will be level to the machine's XY plane. + * The height can be set with M420 Z + */ + #define ENABLE_LEVELING_FADE_HEIGHT + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + #define DEFAULT_LEVELING_FADE_HEIGHT 0.0 // (mm) Default fade height. + #endif + + /** + * For Cartesian machines, instead of dividing moves on mesh boundaries, + * split up moves into short segments like a Delta. This follows the + * contours of the bed more closely than edge-to-edge straight moves. + */ + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26. + #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26. + #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves. + #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves. + #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. + #endif + +#endif + +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + + #define UBL_MESH_WIZARD // Run several commands in a row to get a complete mesh + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment + #define MESH_EDIT_MENU // Add a menu to edit mesh points +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LCD_BED_TRAMMING + +#if ENABLED(LCD_BED_TRAMMING) + #define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets + #define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at tramming points + #define BED_TRAMMING_Z_HOP 4.0 // (mm) Z height of nozzle between tramming points + //#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner + //#define BED_TRAMMING_USE_PROBE + #if ENABLED(BED_TRAMMING_USE_PROBE) + #define BED_TRAMMING_PROBE_TOLERANCE 0.1 // (mm) + #define BED_TRAMMING_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify + //#define BED_TRAMMING_AUDIO_FEEDBACK + #endif + + /** + * Corner Leveling Order + * + * Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge. + * + * LF Left-Front RF Right-Front + * LB Left-Back RB Right-Back + * + * Examples: + * + * Default {LF,RB,LB,RF} {LF,RF} {LB,LF} + * LB --------- RB LB --------- RB LB --------- RB LB --------- RB + * | 4 3 | | 3 2 | | <3> | | 1 | + * | | | | | | | <3>| + * | 1 2 | | 1 4 | | 1 2 | | 2 | + * LF --------- RF LF --------- RF LF --------- RF LF --------- RF + */ + #define BED_TRAMMING_LEVELING_ORDER { LF, RF, RB, LB } +#endif + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 +//#define MANUAL_I_HOME_POS 0 +//#define MANUAL_J_HOME_POS 0 +//#define MANUAL_K_HOME_POS 0 +//#define MANUAL_U_HOME_POS 0 +//#define MANUAL_V_HOME_POS 0 +//#define MANUAL_W_HOME_POS 0 + +/** + * Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. + * + * - Moves the Z probe (or nozzle) to a defined XY point before Z homing. + * - Allows Z homing only when XY positions are known and trusted. + * - If stepper drivers sleep, XY homing may be required again before Z homing. + */ +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT X_CENTER // (mm) X point for Z homing + #define Z_SAFE_HOMING_Y_POINT Y_CENTER // (mm) Y point for Z homing +#endif + +// Homing speeds (linear=mm/min, rotational=°/min) +#define HOMING_FEEDRATE_MM_M { (20*60), (20*60), (4*60) } + +// Validate that endstops are triggered on homing moves +#define VALIDATE_HOMING_ENDSTOPS + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the XY skew factor directly: + //#define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + + // Or, set the Z skew factors directly: + //#define XZ_SKEW_FACTOR 0.0 + //#define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section eeprom + +/** + * EEPROM + * + * Persistent storage to preserve configurable settings across reboots. + * + * M500 - Store settings to EEPROM. + * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) + * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) + */ +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +//#define DISABLE_M503 // Saves ~2700 bytes of flash. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save flash. +#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load +#if ENABLED(EEPROM_SETTINGS) + #define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. + //#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build. +#endif + +// @section host + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// @section units + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// +// Preheat Constants - Up to 10 are supported without changes +// +#define PREHEAT_1_LABEL "PLA" +#define PREHEAT_1_TEMP_HOTEND 210 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_TEMP_CHAMBER 35 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_LABEL "PETG" +#define PREHEAT_2_TEMP_HOTEND 245 +#define PREHEAT_2_TEMP_BED 80 +#define PREHEAT_2_TEMP_CHAMBER 35 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_3_LABEL "ABS" +#define PREHEAT_3_TEMP_HOTEND 240 +#define PREHEAT_3_TEMP_BED 110 +#define PREHEAT_3_TEMP_CHAMBER 35 +#define PREHEAT_3_FAN_SPEED 255 // Value from 0 to 255 + +// @section motion + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z_raise } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_MOVE 0 // Park motion: 0 = XY Move, 1 = X Only, 2 = Y Only, 3 = X before Y, 4 = Y before X + #define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance + #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } } + // Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }} + #define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } } + #define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } } + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Move the nozzle to the initial position after cleaning + #define NOZZLE_CLEAN_GOBACK + + // For a purge/clean station that's always at the gantry height (thus no Z move) + //#define NOZZLE_CLEAN_NO_Z + + // For a purge/clean station mounted on the X axis + //#define NOZZLE_CLEAN_NO_Y + + // Require a minimum hotend temperature for cleaning + #define NOZZLE_CLEAN_MIN_TEMP 170 + //#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe + + // Explicit wipe G-code script applies to a G12 with no arguments. + //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" + +#endif + +// @section host + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M140/M190/M141/M191. + * The print job timer will only be stopped if the bed/chamber target temp is + * below BED_MINTEMP/CHAMBER_MINTEMP. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M140 (bed, no wait) - high temp = none, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * M141 (chamber, no wait) - high temp = none, low temp = stop timer + * M191 (chamber, wait) - high temp = start timer, low temp = none + * + * For M104/M109, high temp is anything over EXTRUDE_MINTEMP / 2. + * For M140/M190, high temp is anything over BED_MINTEMP. + * For M141/M191, high temp is anything over CHAMBER_MINTEMP. + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +// @section stats + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER +#if ENABLED(PRINTCOUNTER) + #define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print. A value of 0 will save stats at end of print. +#endif + +// @section security + +/** + * Password + * + * Set a numerical password for the printer which can be requested: + * + * - When the printer boots up + * - Upon opening the 'Print from Media' Menu + * - When SD printing is completed or aborted + * + * The following G-codes can be used: + * + * M510 - Lock Printer. Blocks all commands except M511. + * M511 - Unlock Printer. + * M512 - Set, Change and Remove Password. + * + * If you forget the password and get locked out you'll need to re-flash + * the firmware with the feature disabled, reset EEPROM, and (optionally) + * re-flash the firmware again with this feature enabled. + */ +//#define PASSWORD_FEATURE +#if ENABLED(PASSWORD_FEATURE) + #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended + #define PASSWORD_ON_STARTUP + #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P S. + //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent G-codes from running + //#define PASSWORD_AFTER_SD_PRINT_END + //#define PASSWORD_AFTER_SD_PRINT_ABORT + //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE +#endif + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section interface + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, da, de, el, el_CY, es, eu, fi, fr, gl, hr, hu, it, + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek (Greece)', 'el_CY':'Greek (Cyprus)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See https://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * Info Screen Style (0:Classic, 1:Průša) + * + * :[0:'Classic', 1:'Průša'] + */ +#define LCD_INFO_SCREEN_STYLE 0 + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + */ +#define SDSUPPORT + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// This option reverses the encoder direction for Select Screen. +// +// If CLOCKWISE normally moves LEFT this makes it go RIGHT. +// If CLOCKWISE normally moves RIGHT this makes it go LEFT. +// +//#define REVERSE_SELECT_DIRECTION + +// +// Encoder EMI Noise Filter +// +// This option increases encoder samples to filter out phantom encoder clicks caused by EMI noise. +// +//#define ENCODER_NOISE_FILTER +#if ENABLED(ENCODER_NOISE_FILTER) + #define ENCODER_SAMPLES 10 +#endif + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU +//#define INDIVIDUAL_AXIS_HOMING_SUBMENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 20 +#define LCD_FEEDBACK_FREQUENCY_HZ 1000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= +// @section lcd + +// +// RepRapDiscount Smart Controller. +// https://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// GT2560 (YHCB2004) LCD Display +// +// Requires Testato, Koepel softwarewire library and +// Andriy Golovnya's LiquidCrystal_AIP31068 library. +// +//#define YHCB2004 + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// https://web.archive.org/web/20200719145306/http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// https://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// https://web.archive.org/web/20140823033947/http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require LiquidCrystal_I2C library: +// https://github.com/MarlinFirmware/New-LiquidCrystal +// https://github.com/fmalpartida/New-LiquidCrystal/wiki +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2-wire Non-latching LCD SR from https://github.com/fmalpartida/New-LiquidCrystal/wiki/schematics#user-content-ShiftRegister_connection +// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +// +// 3-wire SR LCD with strobe using 74HC4094 +// https://github.com/mikeshub/SailfishLCD +// Uses the code directly from Sailfish +// +//#define FF_INTERFACEBOARD + +// +// TFT GLCD Panel with Marlin UI +// Panel connected to main board by SPI or I2C interface. +// See https://github.com/Serhiy-K/TFTGLCDAdapter +// +//#define TFTGLCD_PANEL_SPI +//#define TFTGLCD_PANEL_I2C + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// +// NOTE: If the LCD is unresponsive you may need to reverse the plugs. +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// K.3D Full Graphic Smart Controller +// +//#define K3D_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/electronics/3d-printer-modules/autonomous-printing/graphical-lcd-screen-v1-0/ +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// https://www.panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// Alfawise Ex8 printer LCD marked as WYH L12864 COG +// +//#define WYH_L12864 + +// +// MakerLab Mini Panel with graphic +// controller and SD support - https://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// https://reprap.org/wiki/MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// https://web.archive.org/web/20180605050442/http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// MKS MINI12864 with graphic controller and SD support +// https://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// MKS MINI12864 V3 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight. +// +//#define MKS_MINI_12864_V3 + +// +// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout. +// https://www.aliexpress.com/item/33018110072.html +// +//#define MKS_LCD12864A +//#define MKS_LCD12864B + +// +// FYSETC variant of the MINI12864 graphic controller with SD support +// https://wiki.fysetc.com/Mini12864_Panel/ +// +//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default +//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) +//#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight +//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight +//#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. + +// +// BigTreeTech Mini 12864 V1.0 / V2.0 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight. +// https://github.com/bigtreetech/MINI-12864 +// +//#define BTT_MINI_12864 + +// +// Factory display for Creality CR-10 / CR-7 / Ender-3 +// https://marlinfw.org/docs/hardware/controllers.html#cr10_stockdisplay +// +// Connect to EXP1 on RAMPS and compatible boards. +// +#define CR10_STOCKDISPLAY + +// +// Ender-2 OEM display, a variant of the MKS_MINI_12864 +// +//#define ENDER2_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 +// A clone of the RepRapDiscount full graphics display but with +// different pins/wiring (see pins_ANET_10.h). Enable one of these. +// +//#define ANET_FULL_GRAPHICS_LCD +//#define ANET_FULL_GRAPHICS_LCD_ALT_WIRING + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/item/32837222770.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// https://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +// +// eMotion Tech LCD with SD +// https://www.reprap-france.com/produit/1234568748-ecran-graphique-128-x-64-points-2-1 +// +//#define EMOTION_TECH_LCD + +//============================================================================= +//============================== OLED Displays ============================== +//============================================================================= + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + #define U8GLIB_SSD1306 + //#define U8GLIB_SH1106 +#endif + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS OLED 1.3" 128×64 Full Graphics Controller +// https://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// Zonestar OLED 128×64 Full Graphics Controller +// +//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller +//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) +//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller + +// +// Einstart S OLED SSD1306 +// +//#define U8GLIB_SH1106_EINSTART + +// +// Overlord OLED display/controller with i2c buzzer and LEDs +// +//#define OVERLORD_OLED + +// +// FYSETC OLED 2.42" 128×64 Full Graphics Controller with WS2812 RGB +// Where to find : https://www.aliexpress.com/item/4000345255731.html +//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller + +// +// K.3D SSD1309 OLED 2.42" 128×64 Full Graphics Controller +// +//#define K3D_242_OLED_CONTROLLER // Software SPI + +//============================================================================= +//========================== Extensible UI Displays =========================== +//============================================================================= + +/** + * DGUS Touch Display with DWIN OS. (Choose one.) + * ORIGIN : https://www.aliexpress.com/item/32993409517.html + * FYSETC : https://www.aliexpress.com/item/32961471929.html + * MKS : https://www.aliexpress.com/item/1005002008179262.html + * + * Flash display with DGUS Displays for Marlin: + * - Format the SD card to FAT32 with an allocation size of 4kb. + * - Download files as specified for your type of display. + * - Plug the microSD card into the back of the display. + * - Boot the display and wait for the update to complete. + * + * ORIGIN (Marlin DWIN_SET) + * - Download https://github.com/coldtobi/Marlin_DGUS_Resources + * - Copy the downloaded DWIN_SET folder to the SD card. + * - Product: https://www.aliexpress.com/item/32993409517.html + * + * FYSETC (Supplier default) + * - Download https://github.com/FYSETC/FYSTLCD-2.0 + * - Copy the downloaded SCREEN folder to the SD card. + * - Product: https://www.aliexpress.com/item/32961471929.html + * + * HIPRECY (Supplier default) + * - Download https://github.com/HiPrecy/Touch-Lcd-LEO + * - Copy the downloaded DWIN_SET folder to the SD card. + * + * MKS (MKS-H43) (Supplier default) + * - Download https://github.com/makerbase-mks/MKS-H43 + * - Copy the downloaded DWIN_SET folder to the SD card. + * - Product: https://www.aliexpress.com/item/1005002008179262.html + * + * RELOADED (T5UID1) + * - Download https://github.com/Neo2003/DGUS-reloaded/releases + * - Copy the downloaded DWIN_SET folder to the SD card. + * + * Flash display with DGUS Displays for Marlin: + * - Format the SD card to FAT32 with an allocation size of 4kb. + * - Download files as specified for your type of display. + * - Plug the microSD card into the back of the display. + * - Boot the display and wait for the update to complete. + */ +//#define DGUS_LCD_UI_ORIGIN +//#define DGUS_LCD_UI_FYSETC +//#define DGUS_LCD_UI_HIPRECY +//#define DGUS_LCD_UI_MKS +//#define DGUS_LCD_UI_RELOADED +#if ENABLED(DGUS_LCD_UI_MKS) + #define USE_MKS_GREEN_UI +#endif + +// +// Touch-screen LCD for Malyan M200/M300 printers +// +//#define MALYAN_LCD + +// +// Touch UI for FTDI EVE (FT800/FT810) displays +// See Configuration_adv.h for all configuration options. +// +//#define TOUCH_UI_FTDI_EVE + +// +// Touch-screen LCD for Anycubic printers +// +//#define ANYCUBIC_LCD_I3MEGA +//#define ANYCUBIC_LCD_CHIRON +#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + //#define ANYCUBIC_LCD_DEBUG + //#define ANYCUBIC_LCD_GCODE_EXT // Add ".gcode" to menu entries for DGUS clone compatibility +#endif + +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT + +// +// Third-party or vendor-customized controller interfaces. +// Sources should be installed in 'src/lcd/extui'. +// +//#define EXTENSIBLE_UI + +#if ENABLED(EXTENSIBLE_UI) + //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display +#endif + +//============================================================================= +//=============================== Graphical TFTs ============================== +//============================================================================= + +/** + * Specific TFT Model Presets. Enable one of the following options + * or enable TFT_GENERIC and set sub-options. + */ + +// +// 480x320, 3.5", SPI Display with Rotary Encoder from MKS +// Usually paired with MKS Robin Nano V2 & V3 +// https://github.com/makerbase-mks/MKS-TFT-Hardware/tree/master/MKS%20TS35 +// +//#define MKS_TS35_V2_0 + +// +// 320x240, 2.4", FSMC Display From MKS +// Usually paired with MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT24 + +// +// 320x240, 2.8", FSMC Display From MKS +// Usually paired with MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT28 + +// +// 320x240, 3.2", FSMC Display From MKS +// Usually paired with MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT32 + +// +// 480x320, 3.5", FSMC Display From MKS +// Usually paired with MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT35 + +// +// 480x272, 4.3", FSMC Display From MKS +// +//#define MKS_ROBIN_TFT43 + +// +// 320x240, 3.2", FSMC Display From MKS +// Usually paired with MKS Robin +// +//#define MKS_ROBIN_TFT_V1_1R + +// +// 480x320, 3.5", FSMC Stock Display from Tronxy +// +//#define TFT_TRONXY_X5SA + +// +// 480x320, 3.5", FSMC Stock Display from AnyCubic +// +//#define ANYCUBIC_TFT35 + +// +// 320x240, 2.8", FSMC Stock Display from Longer/Alfawise +// +//#define LONGER_LK_TFT28 + +// +// 320x240, 2.8", FSMC Stock Display from ET4 +// +//#define ANET_ET4_TFT28 + +// +// 480x320, 3.5", FSMC Stock Display from ET5 +// +//#define ANET_ET5_TFT35 + +// +// 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU BX +// https://github.com/bigtreetech/BIQU-BX/tree/master/Hardware +// +//#define BIQU_BX_TFT70 + +// +// 480x320, 3.5", SPI Stock Display with Rotary Encoder from BIQU B1 SE Series +// https://github.com/bigtreetech/TFT35-SPI/tree/master/v1 +// +//#define BTT_TFT35_SPI_V1_0 + +// +// Generic TFT with detailed options +// +//#define TFT_GENERIC +#if ENABLED(TFT_GENERIC) + // :[ 'AUTO', 'ST7735', 'ST7789', 'ST7796', 'R61505', 'ILI9328', 'ILI9341', 'ILI9488' ] + #define TFT_DRIVER AUTO + + // Interface. Enable one of the following options: + //#define TFT_INTERFACE_FSMC + //#define TFT_INTERFACE_SPI + + // TFT Resolution. Enable one of the following options: + //#define TFT_RES_320x240 + //#define TFT_RES_480x272 + //#define TFT_RES_480x320 + //#define TFT_RES_1024x600 +#endif + +/** + * TFT UI - User Interface Selection. Enable one of the following options: + * + * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled + * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities + * TFT_LVGL_UI - A Modern UI using LVGL + * + * For LVGL_UI also copy the 'assets' folder from the build directory to the + * root of your SD card, together with the compiled firmware. + */ +//#define TFT_CLASSIC_UI +//#define TFT_COLOR_UI +//#define TFT_LVGL_UI + +#if ENABLED(TFT_COLOR_UI) + //#define TFT_SHARED_IO // SPI is shared between TFT display and other devices. Disable async data transfer +#endif + +#if ENABLED(TFT_LVGL_UI) + //#define MKS_WIFI_MODULE // MKS WiFi module +#endif + +/** + * TFT Rotation. Set to one of the following values: + * + * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y, + * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y, + * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y, + * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION + */ +//#define TFT_ROTATION TFT_NO_ROTATION + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. +// +//#define DWIN_CREALITY_LCD // Creality UI +//#define DWIN_LCD_PROUI // Pro UI by MRiscoC +//#define DWIN_CREALITY_LCD_JYERSUI // Jyers UI by Jacob Myers +//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation) +//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation) + +// +// Touch Screen Settings +// +//#define TOUCH_SCREEN +#if ENABLED(TOUCH_SCREEN) + #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens + #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus + + //#define DISABLE_ENCODER // Disable the click encoder, if any + //#define TOUCH_IDLE_SLEEP_MINS 5 // (minutes) Display Sleep after a period of inactivity. Set with M255 S. + + #define TOUCH_SCREEN_CALIBRATION + + //#define TOUCH_CALIBRATION_X 12316 + //#define TOUCH_CALIBRATION_Y -8981 + //#define TOUCH_OFFSET_X -43 + //#define TOUCH_OFFSET_Y 257 + //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE + + #if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS) + #define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM + #endif + + #if ENABLED(TFT_COLOR_UI) + //#define SINGLE_TOUCH_NAVIGATION + #endif +#endif + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/ +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press + +// +// EasyThreeD ET-4000+ with button input and status LED +// +//#define EASYTHREED_UI + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section fans + +// Set number of user-controlled fans. Disable to use all board-defined fans. +// :[1,2,3,4,5,6,7,8] +//#define NUM_M106_FANS 1 + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +// :[0,1,2,3,4,5,6,7] +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// @section extras + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// @section lights + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +// Support for PCA9533 PWM LED driver +//#define PCA9533 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For NeoPixel LED an overall brightness parameter is also available. + * + * === CAUTION === + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * + * NOTE: A separate 5V power supply is required! The NeoPixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * + * Requires PWM frequency between 50 <> 100Hz (Check HAL or variant) + * Use FAST_PWM_FAN, if possible, to reduce fan noise. + */ + +// LED Type. Enable only one of the following two options: +//#define RGB_LED +//#define RGBW_LED + +#if EITHER(RGB_LED, RGBW_LED) + //#define RGB_LED_R_PIN 34 + //#define RGB_LED_G_PIN 43 + //#define RGB_LED_B_PIN 35 + //#define RGB_LED_W_PIN -1 +#endif + +#if ANY(RGB_LED, RGBW_LED, PCA9632) + //#define RGB_STARTUP_TEST // For PWM pins, fade between all colors + #if ENABLED(RGB_STARTUP_TEST) + #define RGB_STARTUP_TEST_INNER_MS 10 // (ms) Reduce or increase fading speed + #endif +#endif + +// Support for Adafruit NeoPixel LED driver +#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW, NEO_RGBW, NEO_GRB, NEO_RBG, etc. + // See https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.h + //#define NEOPIXEL_PIN 4 // LED driving pin + //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE + //#define NEOPIXEL2_PIN 5 + #define NEOPIXEL_PIXELS 10 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup + + // Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ... + //#define NEOPIXEL2_SEPARATE + #if ENABLED(NEOPIXEL2_SEPARATE) + #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip + #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) + #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup + #define NEOPIXEL_M150_DEFAULT -1 // Default strip for M150 without 'S'. Use -1 to set all by default. + #else + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel + #endif + + // Use some of the NeoPixel LEDs for static (background) lighting + //#define NEOPIXEL_BKGD_INDEX_FIRST 0 // Index of the first background LED + //#define NEOPIXEL_BKGD_INDEX_LAST 5 // Index of the last background LED + //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +// @section servos + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Set to 0 to turn off servo support. + */ +//#define NUM_SERVOS 3 // Note: Servo index starts with 0 for M280-M282 commands + +// (ms) Delay before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Edit servo angles with M281 and save to EEPROM with M500 +//#define EDITABLE_SERVO_ANGLES + +// Disable servo with M282 to reduce power consumption, noise, and heat when not in use +//#define SERVO_DETACH_GCODE diff --git a/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration_adv.h b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration_adv.h new file mode 100644 index 0000000..04f6a5f --- /dev/null +++ b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/Configuration_adv.h @@ -0,0 +1,4268 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define CONFIG_EXAMPLES_DIR "config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 3.0" + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + */ +#define CONFIGURATION_ADV_H_VERSION 02010205 + +// @section develop + +/** + * Configuration Export + * + * Export the configuration as part of the build. (See signature.py) + * Output files are saved with the build (e.g., .pio/build/mega2560). + * + * See `build_all_examples --ini` as an example of config.ini archiving. + * + * 1 = marlin_config.json - Dictionary containing the configuration. + * This file is also generated for CONFIGURATION_EMBEDDING. + * 2 = config.ini - File format for PlatformIO preprocessing. + * 3 = schema.json - The entire configuration schema. (13 = pattern groups) + * 4 = schema.yml - The entire configuration schema. + */ +//#define CONFIG_EXPORT 2 // :[1:'JSON', 2:'config.ini', 3:'schema.json', 4:'schema.yml'] + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * Thermocouple sensors are quite sensitive to noise. Any noise induced in + * the sensor wires, such as by stepper motor wires run in parallel to them, + * may result in the thermocouple sensor reporting spurious errors. This + * value is the number of errors which can occur in a row before the error + * is reported. This allows us to ignore intermittent error conditions while + * still detecting an actual failure, which should result in a continuous + * stream of errors from the sensor. + * + * Set this value to 0 to fail on the first error to occur. + */ +#define THERMOCOUPLE_MAX_ERRORS 15 + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value + #define HOTEND0_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value + #define HOTEND1_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value + #define HOTEND2_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value + #define HOTEND3_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value + #define HOTEND4_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value + #define HOTEND5_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_6 == 1000 + #define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND6_BETA 3950 // Beta value + #define HOTEND6_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_7 == 1000 + #define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND7_BETA 3950 // Beta value + #define HOTEND7_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value + #define BED_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value + #define CHAMBER_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_COOLER == 1000 + #define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define COOLER_BETA 3950 // Beta value + #define COOLER_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_PROBE == 1000 + #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define PROBE_BETA 3950 // Beta value + #define PROBE_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_BOARD == 1000 + #define BOARD_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BOARD_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BOARD_BETA 3950 // Beta value + #define BOARD_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +#if TEMP_SENSOR_REDUNDANT == 1000 + #define REDUNDANT_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define REDUNDANT_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define REDUNDANT_BETA 3950 // Beta value + #define REDUNDANT_SH_C_COEFF 0 // Steinhart-Hart C coefficient +#endif + +/** + * Thermocouple Options — for MAX6675 (-2), MAX31855 (-3), and MAX31865 (-5). + */ +//#define TEMP_SENSOR_FORCE_HW_SPI // Ignore SCK/MOSI/MISO pins; use CS and the default SPI bus. +//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board. +//#define MAX31865_SENSOR_WIRES_1 2 +//#define MAX31865_SENSOR_WIRES_2 2 + +//#define MAX31865_50HZ_FILTER // Use a 50Hz filter instead of the default 60Hz. +//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors. + +//#define MAX31865_USE_AUTO_MODE // Read faster and more often than 1-shot; bias voltage always on; slight effect on RTD temperature. +//#define MAX31865_MIN_SAMPLING_TIME_MSEC 100 // (ms) 1-shot: minimum read interval. Reduces bias voltage effects by leaving sensor unpowered for longer intervals. +//#define MAX31865_IGNORE_INITIAL_FAULTY_READS 10 // Ignore some read faults (keeping the temperature reading) to work around a possible issue (#23439). + +//#define MAX31865_WIRE_OHMS_0 0.95f // For 2-wire, set the wire resistances for more accurate readings. +//#define MAX31865_WIRE_OHMS_1 0.0f +//#define MAX31865_WIRE_OHMS_2 0.0f + +/** + * Hephestos 2 24V heated bed upgrade kit. + * https://www.en3dstudios.com/product/bq-hephestos-2-heated-bed-kit/ + */ +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #define HEATER_BED_INVERTING true +#endif + +// +// Heated Bed Bang-Bang options +// +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS + #endif +#endif + +// +// Heated Chamber options +// +#if DISABLED(PIDTEMPCHAMBER) + #define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + #define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS + #endif +#endif + +#if TEMP_SENSOR_CHAMBER + //#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug) + //#define HEATER_CHAMBER_INVERTING false + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug) + + //#define CHAMBER_FAN // Enable a fan on the chamber + #if ENABLED(CHAMBER_FAN) + //#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan) + #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve; 3=similar to 1 but fan is always on. + #if CHAMBER_FAN_MODE == 0 + #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) + #elif CHAMBER_FAN_MODE == 1 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target + #elif CHAMBER_FAN_MODE == 2 + #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target + #elif CHAMBER_FAN_MODE == 3 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target + #endif + #endif + + //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber + #if ENABLED(CHAMBER_VENT) + #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo + #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber + #define LOW_EXCESS_HEAT_LIMIT 3 + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #endif +#endif + +// +// Laser Cooler options +// +#if TEMP_SENSOR_COOLER + #define COOLER_MINTEMP 8 // (°C) + #define COOLER_MAXTEMP 26 // (°C) + #define COOLER_DEFAULT_TEMP 16 // (°C) + #define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + #define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element (e.g., TEC, External chiller via relay) + #define COOLER_INVERTING false + #define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required. + #define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc. + #define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g. + #if ENABLED(COOLER_FAN) + #define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target + #define COOLER_FAN_FACTOR 25 // PWM increase per °C above target + #endif +#endif + +// +// Motherboard Sensor options +// +#if TEMP_SENSOR_BOARD + #define THERMAL_PROTECTION_BOARD // Halt the printer if the board sensor leaves the temp range below. + #define BOARD_MINTEMP 8 // (°C) + #define BOARD_MAXTEMP 70 // (°C) + //#define TEMP_BOARD_PIN -1 // Board temp sensor pin override. +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // (seconds) + #define THERMAL_PROTECTION_HYSTERESIS 4 // (°C) + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // (seconds) + #define WATCH_TEMP_INCREASE 2 // (°C) +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // (seconds) + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // (°C) + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // (seconds) + #define WATCH_BED_TEMP_INCREASE 2 // (°C) +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // (seconds) + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // (°C) + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // (seconds) + #define WATCH_CHAMBER_TEMP_INCREASE 2 // (°C) +#endif + +/** + * Thermal Protection parameters for the laser cooler. + */ +#if ENABLED(THERMAL_PROTECTION_COOLER) + #define THERMAL_PROTECTION_COOLER_PERIOD 10 // (seconds) + #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // (°C) + + /** + * Laser cooling watch settings (M143/M193). + */ + #define WATCH_COOLER_TEMP_PERIOD 60 // (seconds) + #define WATCH_COOLER_TEMP_INCREASE 3 // (°C) +#endif + +#if ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_BED, THERMAL_PROTECTION_CHAMBER, THERMAL_PROTECTION_COOLER) + /** + * Thermal Protection Variance Monitor - EXPERIMENTAL. + * Kill the machine on a stuck temperature sensor. Disable if you get false positives. + */ + //#define THERMAL_PROTECTION_VARIANCE_MONITOR // Detect a sensor malfunction preventing temperature updates +#endif + +#if ENABLED(PIDTEMP) + // Add an additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) // heating power = Kc * e_speed + #define LPQ_MAX_LEN 50 + #endif + + /** + * Add an additional term to the heater power, proportional to the fan speed. + * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan. + * You can either just add a constant compensation with the DEFAULT_Kf value + * or follow the instruction below to get speed-dependent compensation. + * + * Constant compensation (use only with fan speeds of 0% and 100%) + * --------------------------------------------------------------------- + * A good starting point for the Kf-value comes from the calculation: + * kf = (power_fan * eff_fan) / power_heater * 255 + * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater. + * + * Example: + * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8 + * Kf = (2.4W * 0.8) / 40W * 255 = 12.24 + * + * Fan-speed dependent compensation + * -------------------------------- + * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%). + * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled. + * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature + * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big. + * 2. Note the Kf-value for fan-speed at 100% + * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving. + * 4. Repeat step 1. and 2. for this fan speed. + * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in + * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED + */ + //#define PID_FAN_SCALING + #if ENABLED(PID_FAN_SCALING) + //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION + #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION) + // The alternative definition is used for an easier configuration. + // Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED. + // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. + + #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf + #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf + #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING + + #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) + #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 + + #else + #define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed) + #define DEFAULT_Kf 10 // A constant value added to the PID-tuner + #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING + #endif + #endif +#endif + +/** + * Automatic Temperature Mode + * + * Dynamically adjust the hotend target temperature based on planned E moves. + * + * (Contrast with PID_EXTRUSION_SCALING, which tracks E movement and adjusts PID + * behavior using an additional kC value.) + * + * Autotemp is calculated by (mintemp + factor * mm_per_sec), capped to maxtemp. + * + * Enable Autotemp Mode with M104/M109 F S B. + * Disable by sending M104/M109 with no F parameter (or F0 with AUTOTEMP_PROPORTIONAL). + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0) + // Turn on AUTOTEMP on M104/M109 by default using proportions set here + //#define AUTOTEMP_PROPORTIONAL + #if ENABLED(AUTOTEMP_PROPORTIONAL) + #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature + #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature + #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F) + #endif +#endif + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means TEMP_SENSOR_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a MINTEMP error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * MINTEMP error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a MINTEMP error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +/** + * The number of milliseconds a hotend will preheat before starting to check + * the temperature. This value should NOT be set to the time it takes the + * hot end to reach the target temperature, but the time it takes to reach + * the minimum temperature your thermistor can read. The lower the better/safer. + * This shouldn't need to be more than 30 seconds (30000) + */ +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +/** + * Extruder runout prevention. + * If the machine is idle and the temperature over MINTEMP + * then extrude some filament every couple of SECONDS. + */ +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +/** + * Hotend Idle Timeout + * Prevent filament in the nozzle from charring and causing a critical jam. + */ +//#define HOTEND_IDLE_TIMEOUT +#if ENABLED(HOTEND_IDLE_TIMEOUT) + #define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection + #define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection + #define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout + #define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +// @section fans + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan turns on automatically whenever any driver is enabled and turns + * off (or reduces to idle speed) shortly after drivers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN FAN2_PIN // Set a custom pin for the controller fan + //#define CONTROLLER_FAN2_PIN -1 // Set a custom pin for second controller fan + //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered + //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled. + #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.) + #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled + #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled + #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors + + // Use TEMP_SENSOR_BOARD as a trigger for enabling the controller fan + //#define CONTROLLER_FAN_MIN_BOARD_TEMP 40 // (°C) Turn on the fan if the board reaches this temperature + + #define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings + #if ENABLED(CONTROLLER_FAN_EDITABLE) + #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu + #endif +#endif + +/** + * Fan Kickstart + * When part cooling or controller fans first start, run at a speed that + * gets it spinning reliably for a short time before setting the requested speed. + * (Does not work on Sanguinololu with FAN_SOFT_PWM.) + */ +//#define FAN_KICKSTART_TIME 100 // (ms) +//#define FAN_KICKSTART_POWER 180 // 64-255 + +// Some coolers may require a non-zero "off" state. +//#define FAN_OFF_PWM 1 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * Fan Fast PWM + * + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally + * to produce a frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY + * Set this to your desired frequency. + * For AVR, if left undefined this defaults to F = F_CPU/(2*255*1) + * i.e., F = 31.4kHz on 16MHz micro-controllers or F = 39.2kHz on 20MHz micro-controllers. + * For non AVR, if left undefined this defaults to F = 1Khz. + * This F value is only to protect the hardware from an absence of configuration + * and not to complete it when users are not aware that the frequency must be specifically set to support the target board. + * + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * Setting very high frequencies can damage your hardware. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5kHz, 31.4kHz (default), 7.8kHz, 3.92kHz, 1.95kHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1kHz, 39.2kHz (default), 9.77kHz, 4.9kHz, 2.44kHz, 1.22kHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +//#define FAST_PWM_FAN // Increase the fan PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 // Define here to override the defaults below + //#define USE_OCR2A_AS_TOP + #ifndef FAST_PWM_FAN_FREQUENCY + #ifdef __AVR__ + #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) + #else + #define FAST_PWM_FAN_FREQUENCY 1000U + #endif + #endif +#endif + +/** + * Use one of the PWM fans as a redundant part-cooling fan + */ +//#define REDUNDANT_PART_COOLING_FAN 2 // Index of the fan to sync with FAN 0. + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN FAN1_PIN +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define E6_AUTO_FAN_PIN -1 +#define E7_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define COOLER_AUTO_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 +#define COOLER_AUTO_FAN_TEMPERATURE 18 +#define COOLER_AUTO_FAN_SPEED 255 + +/** + * Hotend Cooling Fans tachometers + * + * Define one or more tachometer pins to enable fan speed + * monitoring, and reporting of fan speeds with M123. + * + * NOTE: Only works with fans up to 7000 RPM. + */ +//#define FOURWIRES_FANS // Needed with AUTO_FAN when 4-wire PWM fans are installed +//#define E0_FAN_TACHO_PIN -1 +//#define E0_FAN_TACHO_PULLUP +//#define E0_FAN_TACHO_PULLDOWN +//#define E1_FAN_TACHO_PIN -1 +//#define E1_FAN_TACHO_PULLUP +//#define E1_FAN_TACHO_PULLDOWN +//#define E2_FAN_TACHO_PIN -1 +//#define E2_FAN_TACHO_PULLUP +//#define E2_FAN_TACHO_PULLDOWN +//#define E3_FAN_TACHO_PIN -1 +//#define E3_FAN_TACHO_PULLUP +//#define E3_FAN_TACHO_PULLDOWN +//#define E4_FAN_TACHO_PIN -1 +//#define E4_FAN_TACHO_PULLUP +//#define E4_FAN_TACHO_PULLDOWN +//#define E5_FAN_TACHO_PIN -1 +//#define E5_FAN_TACHO_PULLUP +//#define E5_FAN_TACHO_PULLDOWN +//#define E6_FAN_TACHO_PIN -1 +//#define E6_FAN_TACHO_PULLUP +//#define E6_FAN_TACHO_PULLDOWN +//#define E7_FAN_TACHO_PIN -1 +//#define E7_FAN_TACHO_PULLUP +//#define E7_FAN_TACHO_PULLDOWN + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * @section caselight + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. + //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) + //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu + #if ENABLED(NEOPIXEL_LED) + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light + #endif + #if EITHER(RGB_LED, RGBW_LED) + //#define CASE_LIGHT_USE_RGB_LED // Use RGB / RGBW LED as case light + #endif + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section endstops + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +// @section idex + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // A max coordinate so the X1 carriage can't hit the parked X2 carriage + #define X2_MIN_POS 80 // A min coordinate so the X2 carriage can't hit the parked X1 carriage + #define X2_MAX_POS 353 // The max position of the X2 carriage, typically also the home position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // NOTE: For Dual X Carriage use M218 T1 Xn to override the X2_HOME_POS. + // This allows recalibration of endstops distance without a rebuild. + // Remember to set the second extruder's X-offset to 0 in your slicer. + + // This is the default power-up mode which can be changed later using M605 S. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + + // Default action to execute following M605 mode change commands. Typically G28X to apply new mode. + //#define EVENT_GCODE_IDEX_AFTER_MODECHANGE "G28X" +#endif + +// @section multi stepper + +/** + * Multi-Stepper / Multi-Endstop + * + * When X2_DRIVER_TYPE is defined, this indicates that the X and X2 motors work in tandem. + * The following explanations for X also apply to Y and Z multi-stepper setups. + * Endstop offsets may be changed by 'M666 X Y Z' and stored to EEPROM. + * + * - Enable INVERT_X2_VS_X_DIR if the X2 motor requires an opposite DIR signal from X. + * + * - Enable X_DUAL_ENDSTOPS if the second motor has its own endstop, with adjustable offset. + * + * - Extra endstops are included in the output of 'M119'. + * + * - Set X_DUAL_ENDSTOP_ADJUSTMENT to the known error in the X2 endstop. + * Applied to the X2 motor on 'G28' / 'G28 X'. + * Get the offset by homing X and measuring the error. + * Also set with 'M666 X' and stored to EEPROM with 'M500'. + * + * - Use X2_USE_ENDSTOP to set the endstop plug by name. (_XMIN_, _XMAX_, _YMIN_, _YMAX_, _ZMIN_, _ZMAX_) + */ +#if HAS_X2_STEPPER && DISABLED(DUAL_X_CARRIAGE) + //#define INVERT_X2_VS_X_DIR // X2 direction signal is the opposite of X + //#define X_DUAL_ENDSTOPS // X2 has its own endstop + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ // X2 endstop board plug. Don't forget to enable USE_*_PLUG. + #define X2_ENDSTOP_ADJUSTMENT 0 // X2 offset relative to X endstop + #endif +#endif + +#if HAS_DUAL_Y_STEPPERS + //#define INVERT_Y2_VS_Y_DIR // Y2 direction signal is the opposite of Y + //#define Y_DUAL_ENDSTOPS // Y2 has its own endstop + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ // Y2 endstop board plug. Don't forget to enable USE_*_PLUG. + #define Y2_ENDSTOP_ADJUSTMENT 0 // Y2 offset relative to Y endstop + #endif +#endif + +// +// Multi-Z steppers +// +#ifdef Z2_DRIVER_TYPE + //#define INVERT_Z2_VS_Z_DIR // Z2 direction signal is the opposite of Z + + //#define Z_MULTI_ENDSTOPS // Other Z axes have their own endstops + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ // Z2 endstop board plug. Don't forget to enable USE_*_PLUG. + #define Z2_ENDSTOP_ADJUSTMENT 0 // Z2 offset relative to Z endstop + #endif + #ifdef Z3_DRIVER_TYPE + //#define INVERT_Z3_VS_Z_DIR // Z3 direction signal is the opposite of Z + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z3_USE_ENDSTOP _YMAX_ // Z3 endstop board plug. Don't forget to enable USE_*_PLUG. + #define Z3_ENDSTOP_ADJUSTMENT 0 // Z3 offset relative to Z endstop + #endif + #endif + #ifdef Z4_DRIVER_TYPE + //#define INVERT_Z4_VS_Z_DIR // Z4 direction signal is the opposite of Z + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z4_USE_ENDSTOP _ZMAX_ // Z4 endstop board plug. Don't forget to enable USE_*_PLUG. + #define Z4_ENDSTOP_ADJUSTMENT 0 // Z4 offset relative to Z endstop + #endif + #endif +#endif + +// Drive the E axis with two synchronized steppers +//#define E_DUAL_STEPPER_DRIVERS +#if ENABLED(E_DUAL_STEPPER_DRIVERS) + //#define INVERT_E1_VS_E0_DIR // E direction signals are opposites +#endif + +// @section extruder + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +/** + * Homing Procedure + * Homing (G28) does an indefinite move towards the endstops to establish + * the position of the toolhead relative to the workspace. + */ + +//#define SENSORLESS_BACKOFF_MM { 2, 2, 0 } // (linear=mm, rotational=°) Backoff from endstops before sensorless homing + +#define HOMING_BUMP_MM { 4, 4, 2 } // (linear=mm, rotational=°) Backoff from endstops after first bump +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) + +//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (linear=mm, rotational=°) Backoff from endstops after homing +//#define XY_COUNTERPART_BACKOFF_MM 0 // (mm) Backoff X after homing Y, and vice-versa + +#define QUICK_HOME // If G28 contains XY do a diagonal move first +//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X +//#define HOME_Z_FIRST // Home Z first. Requires a real endstop (not a probe). +//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first + +// @section bltouch + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the + * wiring of the BROWN, RED and ORANGE wires. + * + * Note: If the trigger signal of your probe is not being recognized, it has been very often + * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + #define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! + * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. + * If disabled, OD mode is the hard-coded default on 3.0 + * On startup, Marlin will compare its EEPROM to this value. If the selected mode + * differs, a mode set EEPROM write will be completed at initialization. + * Use the option below to force an EEPROM write to a V3.1 probe regardless. + */ + //#define BLTOUCH_SET_5V_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Enable "HIGH SPEED" option for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians + * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM. + * + * Set the default state here, change with 'M401 S' or UI, use M500 to save, M502 to reset. + */ + //#define BLTOUCH_HS_MODE true + + +#endif // BLTOUCH + +// @section calibration + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + /** + * Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]] + * These positions are machine-relative and do not shift with the M206 home offset! + * If not defined, probe limits will be used. + * Override with 'M422 S X Y'. + */ + //#define Z_STEPPER_ALIGN_XY { { 10, 190 }, { 100, 10 }, { 190, 190 } } + + /** + * Orientation for the automatically-calculated probe positions. + * Override Z stepper align points with 'M422 S X Y' + * + * 2 Steppers: (0) (1) + * | | 2 | + * | 1 2 | | + * | | 1 | + * + * 3 Steppers: (0) (1) (2) (3) + * | 3 | 1 | 2 1 | 2 | + * | | 3 | | 3 | + * | 1 2 | 2 | 3 | 1 | + * + * 4 Steppers: (0) (1) (2) (3) + * | 4 3 | 1 4 | 2 1 | 3 2 | + * | | | | | + * | 1 2 | 2 3 | 3 4 | 4 1 | + */ + #ifndef Z_STEPPER_ALIGN_XY + //#define Z_STEPPERS_ORIENTATION 0 + #endif + + /** + * Z Stepper positions for more rapid convergence in bed alignment. + * Requires 3 or 4 Z steppers. + * + * Define Stepper XY positions for Z1, Z2, Z3... corresponding to the screw + * positions in the bed carriage, with one position per Z stepper in stepper + * driver order. + */ + //#define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + + #ifndef Z_STEPPER_ALIGN_STEPPER_XY + // Amplification factor. Used to scale the correction step up or down in case + // the stepper (spindle) position is farther out than the test point. + #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! + #endif + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle + #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment + #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this + #define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done? + // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights? + // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed. + #define HOME_AFTER_G34 +#endif + +// +// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. +// +//#define ASSISTED_TRAMMING +#if ENABLED(ASSISTED_TRAMMING) + + // Define from 3 to 9 points to probe. + #define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } } + + // Define position names for probe points. + #define TRAMMING_POINT_NAME_1 "Front-Left" + #define TRAMMING_POINT_NAME_2 "Front-Right" + #define TRAMMING_POINT_NAME_3 "Back-Right" + #define TRAMMING_POINT_NAME_4 "Back-Left" + + #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation + //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first + + //#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu + + //#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment + + /** + * Screw thread: + * M3: 30 = Clockwise, 31 = Counter-Clockwise + * M4: 40 = Clockwise, 41 = Counter-Clockwise + * M5: 50 = Clockwise, 51 = Counter-Clockwise + */ + #define TRAMMING_SCREW_THREAD 30 + +#endif + +// @section motion control + +/** + * Input Shaping -- EXPERIMENTAL + * + * Zero Vibration (ZV) Input Shaping for X and/or Y movements. + * + * This option uses a lot of SRAM for the step buffer. The buffer size is + * calculated automatically from SHAPING_FREQ_[XY], DEFAULT_AXIS_STEPS_PER_UNIT, + * DEFAULT_MAX_FEEDRATE and ADAPTIVE_STEP_SMOOTHING. The default calculation can + * be overridden by setting SHAPING_MIN_FREQ and/or SHAPING_MAX_FEEDRATE. + * The higher the frequency and the lower the feedrate, the smaller the buffer. + * If the buffer is too small at runtime, input shaping will have reduced + * effectiveness during high speed movements. + * + * Tune with M593 D F: + * + * D Set the zeta/damping factor. If axes (X, Y, etc.) are not specified, set for all axes. + * F Set the frequency. If axes (X, Y, etc.) are not specified, set for all axes. + * T[map] Input Shaping type, 0:ZV, 1:EI, 2:2H EI (not implemented yet) + * X<1> Set the given parameters only for the X axis. + * Y<1> Set the given parameters only for the Y axis. + */ +//#define INPUT_SHAPING_X +//#define INPUT_SHAPING_Y +#if EITHER(INPUT_SHAPING_X, INPUT_SHAPING_Y) + #if ENABLED(INPUT_SHAPING_X) + #define SHAPING_FREQ_X 40 // (Hz) The default dominant resonant frequency on the X axis. + #define SHAPING_ZETA_X 0.15f // Damping ratio of the X axis (range: 0.0 = no damping to 1.0 = critical damping). + #endif + #if ENABLED(INPUT_SHAPING_Y) + #define SHAPING_FREQ_Y 40 // (Hz) The default dominant resonant frequency on the Y axis. + #define SHAPING_ZETA_Y 0.15f // Damping ratio of the Y axis (range: 0.0 = no damping to 1.0 = critical damping). + #endif + //#define SHAPING_MIN_FREQ 20 // By default the minimum of the shaping frequencies. Override to affect SRAM usage. + //#define SHAPING_MAX_STEPRATE 10000 // By default the maximum total step rate of the shaped axes. Override to affect SRAM usage. + //#define SHAPING_MENU // Add a menu to the LCD to set shaping parameters. +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_I_STEP_PIN false +#define INVERT_J_STEP_PIN false +#define INVERT_K_STEP_PIN false +#define INVERT_U_STEP_PIN false +#define INVERT_V_STEP_PIN false +#define INVERT_W_STEP_PIN false +#define INVERT_E_STEP_PIN false + +/** + * Idle Stepper Shutdown + * Enable DISABLE_IDLE_* to shut down axis steppers after an idle period. + * The default timeout duration can be overridden with M18 and M84. Set to 0 for No Timeout. + */ +#define DEFAULT_STEPPER_TIMEOUT_SEC 120 +#define DISABLE_IDLE_X +#define DISABLE_IDLE_Y +#define DISABLE_IDLE_Z // Disable if the nozzle could fall onto your printed part! +//#define DISABLE_IDLE_I +//#define DISABLE_IDLE_J +//#define DISABLE_IDLE_K +//#define DISABLE_IDLE_U +//#define DISABLE_IDLE_V +//#define DISABLE_IDLE_W +#define DISABLE_IDLE_E // Shut down all idle extruders + +// Default Minimum Feedrates for printing and travel moves +#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum feedrate. Set with M205 S. +#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum travel feedrate. Set with M205 T. + +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. + +// Slow down the machine if the lookahead buffer is (by default) half full. +// Increase the slowdown divisor for larger buffer sizes. +#define SLOWDOWN +#if ENABLED(SLOWDOWN) + #define SLOWDOWN_DIVISOR 2 +#endif + +/** + * XY Frequency limit + * Reduce resonance by limiting the frequency of small zigzag infill moves. + * See https://hydraraptor.blogspot.com/2010/12/frequency-limit.html + * Use M201 F G to change limits at runtime. + */ +//#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F. +#ifdef XY_FREQUENCY_LIMIT + #define XY_FREQUENCY_MIN_PERCENT 5 // (%) Minimum FR percentage to apply. Set with M201 G. +#endif + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (linear=mm, rotational=°) One value for each linear axis + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Add steps for motor direction changes on CORE kinematics + //#define CORE_BACKLASH + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // increments while checking for the contact to be broken. + #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) + #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_FEEDRATE_SLOW // (mm/min) + #endif + #endif +#endif + +/** + * Automatic backlash, position, and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#define CALIBRATION_GCODE +#if ENABLED(CALIBRATION_GCODE) + + //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." + //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" + + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm + + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min + + // The following parameters refer to the conical section of the nozzle tip. + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes flash). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + //#define CALIBRATION_MEASURE_IMIN + //#define CALIBRATION_MEASURE_IMAX + //#define CALIBRATION_MEASURE_JMIN + //#define CALIBRATION_MEASURE_JMAX + //#define CALIBRATION_MEASURE_KMIN + //#define CALIBRATION_MEASURE_KMAX + //#define CALIBRATION_MEASURE_UMIN + //#define CALIBRATION_MEASURE_UMAX + //#define CALIBRATION_MEASURE_VMIN + //#define CALIBRATION_MEASURE_VMAX + //#define CALIBRATION_MEASURE_WMIN + //#define CALIBRATION_MEASURE_WMAX + + // Probing at the exact top center only works if the center is flat. If + // probing on a screw head or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define the pin to read during calibration + #ifndef CALIBRATION_PIN + //#define CALIBRATION_PIN -1 // Define here to override the default pin + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.) +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +/** + * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro) + */ +//#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster +//#define DIGIPOT_MCP4451 +#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 + + // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. + // These correspond to the physical drivers, so be mindful if the order is changed. + #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + + //#define DIGIPOT_USE_RAW_VALUES // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents) + + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + //#define DIGIPOT_I2C_ADDRESS_A 0x2C // Unshifted slave address for first DIGIPOT + //#define DIGIPOT_I2C_ADDRESS_B 0x2D // Unshifted slave address for second DIGIPOT +#endif + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if HAS_MANUAL_MOVE_MENU + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel + #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines + #if IS_ULTIPANEL + #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +// +// LCD Backlight Timeout +// +//#define LCD_BACKLIGHT_TIMEOUT_MINS 1 // (minutes) Timeout before turning off the backlight + +#if HAS_BED_PROBE && EITHER(HAS_MARLINUI_MENU, HAS_TFT_LVGL_UI) + #define PROBE_OFFSET_WIZARD // Add a Probe Z Offset calibration option to the LCD menu + #if ENABLED(PROBE_OFFSET_WIZARD) + /** + * Enable to init the Probe Z-Offset when starting the Wizard. + * Use a height slightly above the estimated nozzle-to-probe Z offset. + * For example, with an offset of -5, consider a starting height of -4. + */ + //#define PROBE_OFFSET_WIZARD_START_Z -4.0 + + // Set a convenient position to do the calibration (probing point and nozzle/bed-distance) + //#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER } + #endif +#endif + +#if HAS_MARLINUI_MENU + + #if HAS_BED_PROBE + // Add calibration in the Probe Offsets menu to compensate for X-axis twist. + //#define X_AXIS_TWIST_COMPENSATION + #if ENABLED(X_AXIS_TWIST_COMPENSATION) + /** + * Enable to init the Probe Z-Offset when starting the Wizard. + * Use a height slightly above the estimated nozzle-to-probe Z offset. + * For example, with an offset of -5, consider a starting height of -4. + */ + #define XATC_START_Z 0.0 + #define XATC_MAX_POINTS 3 // Number of points to probe in the wizard + #define XATC_Y_POSITION Y_CENTER // (mm) Y position to probe + #define XATC_Z_OFFSETS { 0, 0, 0 } // Z offsets for X axis sample points + #endif + + // Show Deploy / Stow Probe options in the Motion menu. + #define PROBE_DEPLOY_STOW_MENU + #endif + + // Include a page of printer information in the LCD Main Menu + #define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + // Insert a menu for preheating at the top level to allow for quick access + //#define PREHEAT_SHORTCUT_MENU_ITEM + +#endif // HAS_MARLINUI_MENU + +#if ANY(HAS_DISPLAY, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + //#define SOUND_MENU_ITEM // Add a mute option to the LCD menu + #define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state +#endif + +#if EITHER(HAS_DISPLAY, DWIN_LCD_PROUI) + // The timeout to return to the status screen from sub-menus + //#define LCD_TIMEOUT_TO_STATUS 15000 // (ms) + + #if ENABLED(SHOW_BOOTSCREEN) + #define BOOTSCREEN_TIMEOUT 3000 // (ms) Total Duration to display the boot screen(s) + #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI) + #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash) + #endif + #endif + + // Scroll a longer status message into view + #define STATUS_MESSAGE_SCROLLING + + // Apply a timeout to low-priority status messages + //#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds) + + // On the Info Screen, display XY with one decimal place when possible + //#define LCD_DECIMAL_SMALL_XY + + // Show the E position (filament used) during printing + //#define LCD_SHOW_E_TOTAL + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + #define LED_CONTROL_MENU + #if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif + #if ENABLED(NEO2_COLOR_PRESETS) + #define NEO2_USER_PRESET_RED 255 // User defined RED value + #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value + #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value + #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value + #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip + #endif + #endif + +#endif // HAS_DISPLAY || DWIN_LCD_PROUI + +// Add 'M73' to set print job progress, overrides Marlin's built-in estimate +#define SET_PROGRESS_MANUALLY +#if ENABLED(SET_PROGRESS_MANUALLY) + #define SET_PROGRESS_PERCENT // Add 'P' parameter to set percentage done, otherwise use Marlin's estimate + //#define SET_REMAINING_TIME // Add 'R' parameter to set remaining time, otherwise use Marlin's estimate + //#define SET_INTERACTION_TIME // Add 'C' parameter to set time until next filament change or other user interaction + #define M73_REPORT // Report M73 values to host + #if BOTH(M73_REPORT, SDSUPPORT) + #define M73_REPORT_SD_ONLY // Report only when printing from SD + #endif +#endif + +// LCD Print Progress options. Multiple times may be displayed in turn. +#if HAS_DISPLAY && EITHER(SDSUPPORT, SET_PROGRESS_MANUALLY) + #define SHOW_PROGRESS_PERCENT // Show print progress percentage (doesn't affect progress bar) + #define SHOW_ELAPSED_TIME // Display elapsed printing time (prefix 'E') + //#define SHOW_REMAINING_TIME // Display estimated time to completion (prefix 'R') + #if ENABLED(SET_INTERACTION_TIME) + #define SHOW_INTERACTION_TIME // Display time until next user interaction ('C' = filament change) + #endif + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show/report progress with decimal digits, not all UIs support this + + #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif + #endif +#endif + +#if ENABLED(SDSUPPORT) + /** + * SD Card SPI Speed + * May be required to resolve "volume init" errors. + * + * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED + * otherwise full speed will be applied. + * + * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED'] + */ + //#define SD_SPI_SPEED SPI_HALF_SPEED + + // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty. + // Enable this option and set to HIGH if your SD cards are incorrectly detected. + //#define SD_DETECT_STATE HIGH + + //#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up + //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) + + //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping + + #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted + + //#define MEDIA_MENU_AT_TOP // Force the media menu to be listed on the top of the main menu + + #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") + + #if ENABLED(PRINTER_EVENT_LEDS) + #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination + #endif + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) + #define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss + #define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. + #define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor + //#define POWER_LOSS_PULLDOWN + #define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + #define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + + // Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled! + //#define POWER_LOSS_RECOVER_ZHOME + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + //#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed + #endif + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + #define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define SDSORT_FOLDERS -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Enable G-code M34 to set sorting behaviors: M34 S<-1|0|1> F<-1|0|1> + #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES true // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // Allow international symbols in long filenames. To display correctly, the + // LCD's font must contain the characters. Check your selected LCD language. + #define UTF_FILENAME_SUPPORT + + #define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 ' and list long filenames with 'M20 L' + //#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol + //#define M20_TIMESTAMP_SUPPORT // Include timestamps by adding the 'T' flag to M20 commands + + #define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu + + //#define SD_ABORT_NO_COOLDOWN // Leave the heaters on after Stop Print (not recommended!) + + /** + * Abort SD printing when any endstop is triggered. + * This feature is enabled with 'M540 S1' or from the LCD menu. + * Endstops must be activated for this option to work. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + //#define SD_ABORT_ON_ENDSTOP_HIT_GCODE "G28XY" // G-code to run on endstop hit (e.g., "G28XY" or "G27") + #endif + + //#define SD_REPRINT_LAST_SELECTED_FILE // On print completion open the LCD Menu and select the same file + + #define AUTO_REPORT_SD_STATUS // Auto-report media status with 'M27 S' + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS2_USB + //#define USE_UHS3_USB + + #define DISABLE_DUE_SD_MMC // Disable USB Host access to USB Drive to prevent hangs on block access for DUE platform + + /** + * Native USB Host supported by some boards (USB OTG) + */ + //#define USE_OTG_USB_HOST + + #if DISABLED(USE_OTG_USB_HOST) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + #endif + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + /** + * Enable this option if you have more than ~3K of unused flash space. + * Marlin will embed all settings in the firmware binary as compressed data. + * Use 'M503 C' to write the settings out to the SD Card as 'mc.zip'. + * See docs/ConfigEmbedding.md for details on how to use 'mc-apply.py'. + */ + //#define CONFIGURATION_EMBEDDING + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + #if ENABLED(BINARY_FILE_TRANSFER) + // Include extra facilities (e.g., 'M20 F') supporting firmware upload via BINARY_FILE_TRANSFER + //#define CUSTOM_FIRMWARE_UPLOAD + #endif + + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + #define SDCARD_CONNECTION ONBOARD + + // Enable if SD detect is rendered useless (e.g., by using an SD extender) + //#define NO_SD_DETECT + + /** + * Multiple volume support - EXPERIMENTAL. + * Adds 'M21 Pm' / 'M21 S' / 'M21 U' to mount SD Card / USB Drive. + */ + //#define MULTI_VOLUME + #if ENABLED(MULTI_VOLUME) + #define VOLUME_SD_ONBOARD + #define VOLUME_USB_FLASH_DRIVE + #define DEFAULT_VOLUME SV_SD_ONBOARD + #define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE + #endif + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_MARLINUI_U8GLIB + // Save many cycles by drawing a hollow frame or no frame on the Info Screen + //#define XYZ_NO_FRAME + #define XYZ_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of flash. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2434 bytes of flash. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + /** + * Graphical Display Sleep + * + * The U8G library provides sleep / wake functions for SH1106, SSD1306, + * SSD1309, and some other DOGM displays. + * Enable this option to save energy and prevent OLED pixel burn-in. + * Adds the menu item Configuration > LCD Timeout (m) to set a wait period + * from 0 (disabled) to 99 minutes. + */ + //#define DISPLAY_SLEEP_MINUTES 2 // (minutes) Timeout before turning off the screen. Set with M255 S. + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if IS_U8GLIB_ST7920 + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customization + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM for numbered hotends) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active + //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling + //#define STATUS_FLOWMETER_ANIM // Use multiple bitmaps to indicate coolant flow + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_MARLINUI_U8GLIB + +#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI + #define MENU_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens + //#define OVERLAY_GFX_REVERSE // Swap the CW/CCW indicators in the graphics overlay +#endif + +// +// Additional options for DGUS / DWIN displays +// +#if HAS_DGUS_LCD + #define LCD_BAUDRATE 115200 + + #define DGUS_RX_BUFFER_SIZE 128 + #define DGUS_TX_BUFFER_SIZE 48 + //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) + + #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates + + #if ANY(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS, DGUS_LCD_UI_HIPRECY) + #define DGUS_PRINT_FILENAME // Display the filename during printing + #define DGUS_PREHEAT_UI // Display a preheat screen during heatup + + #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS) + //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS + #else + #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY + #endif + + #define DGUS_FILAMENT_LOADUNLOAD + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + #define DGUS_FILAMENT_PURGE_LENGTH 10 + #define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS + #endif + + #define DGUS_UI_WAITING // Show a "waiting" screen between some screens + #if ENABLED(DGUS_UI_WAITING) + #define DGUS_UI_WAITING_STATUS 10 + #define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping + #endif + #endif +#endif // HAS_DGUS_LCD + +// +// Additional options for AnyCubic Chiron TFT displays +// +#if ENABLED(ANYCUBIC_LCD_CHIRON) + // By default the type of panel is automatically detected. + // Enable one of these options if you know the panel type. + //#define CHIRON_TFT_STANDARD + //#define CHIRON_TFT_NEW + + // Enable the longer Anycubic powerup startup tune + //#define AC_DEFAULT_STARTUP_TUNE + + /** + * Display Folders + * By default the file browser lists all G-code files (including those in subfolders) in a flat list. + * Enable this option to display a hierarchical file browser. + * + * NOTES: + * - Without this option it helps to enable SDCARD_SORT_ALPHA so files are sorted before/after folders. + * - When used with the "new" panel, folder names will also have '.gcode' appended to their names. + * This hack is currently required to force the panel to show folders. + */ + #define AC_SD_FOLDER_VIEW +#endif + +// +// Specify additional languages for the UI. Default specified by LCD_LANGUAGE. +// +#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) + #define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it + #ifdef LCD_LANGUAGE_2 + //#define LCD_LANGUAGE_AUTO_SAVE // Automatically save language to EEPROM on change + #endif +#endif + +// +// Touch UI for the FTDI Embedded Video Engine (EVE) +// +#if ENABLED(TOUCH_UI_FTDI_EVE) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_LULZBOT_CLCD_UI // LulzBot Color LCD UI + //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) + //#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815 + //#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813 + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // LulzBot CLCD UI EXP1 mapping + //#define AO_EXP2_PINMAP // LulzBot CLCD UI EXP2 mapping + //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping + //#define S6_TFT_PINMAP // FYSETC S6 pin mapping + //#define F6_TFT_PINMAP // FYSETC F6 pin mapping + + //#define OTHER_PIN_LAYOUT // Define pins manually below + #if ENABLED(OTHER_PIN_LAYOUT) + // Pins for CS and MOD_RESET (PD) must be chosen + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // UTF8 processing and rendering. + // Unsupported characters are shown as '?'. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + // Western accents support. These accented characters use + // combined bitmaps and require relatively little storage. + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + // Additional character groups. These characters require + // full bitmaps and take up considerable storage: + //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ + //#define TOUCH_UI_UTF8_COPYRIGHT // © ® + //#define TOUCH_UI_UTF8_GERMANIC // ß + //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ + //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ + //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ + //#define TOUCH_UI_UTF8_ORDINALS // º ª + //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ + //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ + //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ + #endif + + // Cyrillic character set, costs about 27KiB of flash + //#define TOUCH_UI_UTF8_CYRILLIC_CHARSET + #endif + + // Use a smaller font when labels don't fit buttons + #define TOUCH_UI_FIT_TEXT + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE + + // Output extra debug info for Touch UI events + //#define TOUCH_UI_DEBUG + + // Developer menu (accessed by touching "About Printer" copyright text) + //#define TOUCH_UI_DEVELOPER_MENU +#endif + +// +// Classic UI Options +// +#if TFT_SCALED_DOGLCD + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// +// ADC Button Debounce +// +#if HAS_ADC_BUTTONS + #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR + #define BABYSTEP_WITHOUT_HOMING + #define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps + #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep + #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep + + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + #define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + #define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + #define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. + */ +#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #if ENABLED(DISTINCT_E_FACTORS) + #define ADVANCE_K { 0.0 } // (mm) Compression length per 1mm/s extruder speed, per extruder + #else + #define ADVANCE_K 0.0 // (mm) Compression length applying to all extruders + #endif + //#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L. + //#define LA_DEBUG // Print debug information to serial during operation. Disable for production use. + //#define ALLOW_LOW_EJERK // Allow a DEFAULT_EJERK value of <10. Recommended for direct drive hotends. + //#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz. +#endif + +// @section leveling + +/** + * Use Safe Bed Leveling coordinates to move axes to a useful position before bed probing. + * For example, after homing a rotational axis the Z probe might not be perpendicular to the bed. + * Choose values the orient the bed horizontally and the Z-probe vertically. + */ +//#define SAFE_BED_LEVELING_START_X 0.0 +//#define SAFE_BED_LEVELING_START_Y 0.0 +//#define SAFE_BED_LEVELING_START_Z 0.0 +//#define SAFE_BED_LEVELING_START_I 0.0 +//#define SAFE_BED_LEVELING_START_J 0.0 +//#define SAFE_BED_LEVELING_START_K 0.0 +//#define SAFE_BED_LEVELING_START_U 0.0 +//#define SAFE_BED_LEVELING_START_V 0.0 +//#define SAFE_BED_LEVELING_START_W 0.0 + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Probing Margins + * + * Override PROBING_MARGIN for each side of the build plate + * Useful to get probe points to exact positions on targets or + * to allow leveling to avoid plate clamps on only specific + * sides of the bed. With NOZZLE_AS_PROBE negative values are + * allowed, to permit probing outside the bed. + * + * If you are replacing the prior *_PROBE_BED_POSITION options, + * LEFT and FRONT values in most cases will map directly over + * RIGHT and REAR would be the inverse such as + * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) + * + * This will allow all positions to match at compilation, however + * should the probe position be modified with M851XY then the + * probe points will follow. This prevents any change from causing + * the probe to be unable to reach any points. + */ +#if PROBE_SELECTED && !IS_KINEMATIC + //#define PROBING_MARGIN_LEFT PROBING_MARGIN + //#define PROBING_MARGIN_RIGHT PROBING_MARGIN + //#define PROBING_MARGIN_FRONT PROBING_MARGIN + //#define PROBING_MARGIN_BACK PROBING_MARGIN +#endif + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS) + //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +// @section probes + +/** + * Thermal Probe Compensation + * + * Adjust probe measurements to compensate for distortion associated with the temperature + * of the probe, bed, and/or hotend. + * Use G76 to automatically calibrate this feature for probe and bed temperatures. + * (Extruder temperature/offset values must be calibrated manually.) + * Use M871 to set temperature/offset values manually. + * For more details see https://marlinfw.org/docs/features/probe_temp_compensation.html + */ +//#define PTC_PROBE // Compensate based on probe temperature +//#define PTC_BED // Compensate based on bed temperature +//#define PTC_HOTEND // Compensate based on hotend temperature + +#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND) + /** + * If the probe is outside the defined range, use linear extrapolation with the closest + * point and the point with index PTC_LINEAR_EXTRAPOLATION. e.g., If set to 4 it will use the + * linear extrapolation between data[0] and data[4] for values below PTC_PROBE_START. + */ + //#define PTC_LINEAR_EXTRAPOLATION 4 + + #if ENABLED(PTC_PROBE) + // Probe temperature calibration generates a table of values starting at PTC_PROBE_START + // (e.g., 30), in steps of PTC_PROBE_RES (e.g., 5) with PTC_PROBE_COUNT (e.g., 10) samples. + #define PTC_PROBE_START 30 // (°C) + #define PTC_PROBE_RES 5 // (°C) + #define PTC_PROBE_COUNT 10 + #define PTC_PROBE_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif + + #if ENABLED(PTC_BED) + // Bed temperature calibration builds a similar table. + #define PTC_BED_START 60 // (°C) + #define PTC_BED_RES 5 // (°C) + #define PTC_BED_COUNT 10 + #define PTC_BED_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif + + #if ENABLED(PTC_HOTEND) + // Note: There is no automatic calibration for the hotend. Use M871. + #define PTC_HOTEND_START 180 // (°C) + #define PTC_HOTEND_RES 5 // (°C) + #define PTC_HOTEND_COUNT 20 + #define PTC_HOTEND_ZOFFS { 0 } // (µm) Z adjustments per sample + #endif + + // G76 options + #if BOTH(PTC_PROBE, PTC_BED) + // Park position to wait for probe cooldown + #define PTC_PARK_POS { 0, 0, 100 } + + // Probe position to probe and wait for probe to reach target temperature + //#define PTC_PROBE_POS { 12.0f, 7.3f } // Example: MK52 magnetic heatbed + #define PTC_PROBE_POS { 90, 100 } + + // The temperature the probe should be at while taking measurements during + // bed temperature calibration. + #define PTC_PROBE_TEMP 30 // (°C) + + // Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster. + // Note: The Z=0.0 offset is determined by the probe Z offset (e.g., as set with M851 Z). + #define PTC_PROBE_HEATING_OFFSET 0.5 // (mm) + #endif +#endif // PTC_PROBE || PTC_BED || PTC_HOTEND + +// @section extras + +// +// G60/G61 Position Save and Return +// +//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Requires ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MIN_ARC_SEGMENT_MM 0.1 // (mm) Minimum length of each arc segment + #define MAX_ARC_SEGMENT_MM 1.0 // (mm) Maximum length of each arc segment + #define MIN_CIRCLE_SEGMENTS 72 // Minimum number of segments in a complete circle + //#define ARC_SEGMENTS_PER_SEC 50 // Use the feedrate to choose the segment length + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure +#endif + +// G5 Bézier Curve Support with XYZE destination and IJPQ offsets +//#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes + +#if EITHER(ARC_SUPPORT, BEZIER_CURVE_SUPPORT) + //#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes +#endif + +/** + * Direct Stepping + * + * Comparable to the method used by Klipper, G6 direct stepping significantly + * reduces motion calculations, increases top printing speeds, and results in + * less step aliasing by calculating all motions in advance. + * Preparing your G-code: https://github.com/colinrgodsey/step-daemon + */ +//#define DIRECT_STEPPING + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// @section motion + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 5000000 : Maximum for TMC2xxx stepper drivers + * 1000000 : Maximum for LV8729 stepper driver + * 500000 : Maximum for A4988 stepper driver + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section gcode + +// The number of linear moves that can be in the planner at once. +// The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g., 8, 16, 32) +#if BOTH(SDSUPPORT, DIRECT_STEPPING) + #define BLOCK_BUFFER_SIZE 8 +#elif ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 +#else + #define BLOCK_BUFFER_SIZE 16 +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Monitor RX buffer usage +// Dump an error to the serial port if the serial receive buffer overflows. +// If you see these errors, increase the RX_BUFFER_SIZE value. +// Not supported on all platforms. +//#define RX_BUFFER_MONITOR + +/** + * Emergency Command Parser + * + * Add a low-level parser to intercept certain commands as they + * enter the serial receive buffer, so they cannot be blocked. + * Currently handles M108, M112, M410, M876 + * NOTE: Not yet implemented for all platforms. + */ +#define EMERGENCY_PARSER + +/** + * Realtime Reporting (requires EMERGENCY_PARSER) + * + * - Report position and state of the machine (like Grbl). + * - Auto-report position during long moves. + * - Useful for CNC/LASER. + * + * Adds support for commands: + * S000 : Report State and Position while moving. + * P000 : Instant Pause / Hold while moving. + * R000 : Resume from Pause / Hold. + * + * - During Hold all Emergency Parser commands are available, as usual. + * - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports. + */ +//#define REALTIME_REPORTING_COMMANDS +#if ENABLED(REALTIME_REPORTING_COMMANDS) + //#define FULL_REPORT_TO_HOST_FEATURE // Auto-report the machine status like Grbl CNC +#endif + +/** + * Bad Serial-connections can miss a received command by sending an 'ok' + * Therefore some clients abort after 30 seconds in a timeout. + * Some other clients start sending commands while receiving a 'wait'. + * This "wait" is only sent when the buffer is empty. 1 second is a good value here. + */ +//#define NO_TIMEOUTS 1000 // (ms) + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// This option inserts short delays between lines of serial output. +#define SERIAL_OVERRUN_PROTECTION + +// For serial echo, the number of digits after the decimal point +#define SERIAL_FLOAT_PRECISION 4 + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +// @section extras + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +// @section gcode + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +// @section tool change + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if HAS_MULTI_EXTRUDER + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) + //#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change + #if ENABLED(TOOLCHANGE_NO_RETURN) + //#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change + #endif + + /** + * Extra G-code to run while executing tool-change commands. Can be used to use an additional + * stepper motor (e.g., I axis in Configuration.h) to drive the tool-changer. + */ + //#define EVENT_GCODE_TOOLCHANGE_T0 "G28 A\nG1 A0" // Extra G-code to run while executing tool-change command T0 + //#define EVENT_GCODE_TOOLCHANGE_T1 "G1 A10" // Extra G-code to run while executing tool-change command T1 + //#define EVENT_GCODE_TOOLCHANGE_ALWAYS_RUN // Always execute above G-code sequences. Use with caution! + + /** + * Tool Sensors detect when tools have been picked up or dropped. + * Requires the pins TOOL_SENSOR1_PIN, TOOL_SENSOR2_PIN, etc. + */ + //#define TOOL_SENSOR + + /** + * Retract and prime filament on tool-change to reduce + * ooze and stringing and to get cleaner transitions. + */ + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + // Load / Unload + #define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length + #define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart. Adjust with LCD or M217 B. + #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading) + #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down) + + // Longer prime to clean out a SINGLENOZZLE + #define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length + #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate + #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm) Cutting retraction out of park, for less stringing, better wipe, etc. Adjust with LCD or M217 G. + + // Cool after prime to reduce stringing + #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip + #define TOOLCHANGE_FS_FAN_SPEED 255 // 0-255 + #define TOOLCHANGE_FS_FAN_TIME 10 // (seconds) + + // Use TOOLCHANGE_FS_PRIME_SPEED feedrate the first time each extruder is primed + //#define TOOLCHANGE_FS_SLOW_FIRST_PRIME + + /** + * Prime T0 the first time T0 is sent to the printer: + * [ Power-On -> T0 { Activate & Prime T0 } -> T1 { Retract T0, Activate & Prime T1 } ] + * If disabled, no priming on T0 until switching back to T0 from another extruder: + * [ Power-On -> T0 { T0 Activated } -> T1 { Activate & Prime T1 } -> T0 { Retract T1, Activate & Prime T0 } ] + * Enable with M217 V1 before printing to avoid unwanted priming on host connect. + */ + //#define TOOLCHANGE_FS_PRIME_FIRST_USED + + /** + * Tool Change Migration + * This feature provides G-code and LCD options to switch tools mid-print. + * All applicable tool properties are migrated so the print can continue. + * Tools must be closely matching and other restrictions may apply. + * Useful to: + * - Change filament color without interruption + * - Switch spools automatically on filament runout + * - Switch to a different nozzle on an extruder jam + */ + #define TOOLCHANGE_MIGRATION_FEATURE + + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#define TOOLCHANGE_PARK + #if ENABLED(TOOLCHANGE_PARK) + #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min) + //#define TOOLCHANGE_PARK_X_ONLY // X axis only move + //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move + #endif +#endif // HAS_MULTI_EXTRUDER + +// @section advanced pause + +/** + * Advanced Pause for Filament Change + * - Adds the G-code M600 Filament Change to initiate a filament change. + * - This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + * + * Requirements: + * - For Filament Change parking enable and configure NOZZLE_PARK_FEATURE. + * - For user interaction enable an LCD display, HOST_PROMPT_SUPPORT, or EMERGENCY_PARSER. + * + * Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 50 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 350 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_PURGE_RETRACT 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + #define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // (mm/s) feedrate to purge before unload + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + //#define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is triggered again. + //#define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post-timeout before continuing. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change + + #define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc_smart + +/** + * Trinamic Smart Drivers + * + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode: + * - Connect your SPI pins to the Hardware SPI interface on the board. + * Some boards have simple jumper connections! See your board's documentation. + * - Define the required Stepper CS pins in your `pins_MYBOARD.h` file. + * (See the RAMPS pins, for example.) + * - You can also use Software SPI with GPIO pins instead of Hardware SPI. + * + * To use TMC220x stepper drivers with Serial UART: + * - Connect PDN_UART to the #_SERIAL_TX_PIN through a 1K resistor. + * For reading capabilities also connect PDN_UART to #_SERIAL_RX_PIN with no resistor. + * Some boards have simple jumper connections! See your board's documentation. + * - These drivers can also be used with Hardware Serial. + * + * The TMC26XStepper library is required for TMC26X stepper drivers. + * https://github.com/MarlinFirmware/TMC26XStepper + * + * The TMCStepper library is required for other TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + * + * @section tmc/config + */ +#if HAS_TRINAMIC_CONFIG || HAS_TMC26X + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + + /** + * Interpolate microsteps to 256 + * Override for each driver with _INTERPOLATE settings below + */ + #define INTERPOLATE true + + #if AXIS_IS_TMC_CONFIG(X) + #define X_CURRENT 580 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_CURRENT_HOME (X_CURRENT/2) // (mA) RMS current for sensorless homing + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 // Multiplied x1000 for TMC26X + #define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ... + //#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis + //#define X_HOLD_MULTIPLIER 0.5 // Enable to override 'HOLD_MULTIPLIER' for the X axis + #endif + + #if AXIS_IS_TMC_CONFIG(X2) + #define X2_CURRENT X_CURRENT + #define X2_CURRENT_HOME X_CURRENT_HOME + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_RSENSE X_RSENSE + #define X2_CHAIN_POS -1 + //#define X2_INTERPOLATE true + //#define X2_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Y) + #define Y_CURRENT 580 + #define Y_CURRENT_HOME (Y_CURRENT/2) + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS -1 + //#define Y_INTERPOLATE true + //#define Y_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Y2) + #define Y2_CURRENT Y_CURRENT + #define Y2_CURRENT_HOME Y_CURRENT_HOME + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_RSENSE Y_RSENSE + #define Y2_CHAIN_POS -1 + //#define Y2_INTERPOLATE true + //#define Y2_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Z) + #define Z_CURRENT 580 + #define Z_CURRENT_HOME (Z_CURRENT/2) + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS -1 + //#define Z_INTERPOLATE true + //#define Z_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Z2) + #define Z2_CURRENT Z_CURRENT + #define Z2_CURRENT_HOME Z_CURRENT_HOME + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_RSENSE Z_RSENSE + #define Z2_CHAIN_POS -1 + //#define Z2_INTERPOLATE true + //#define Z2_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Z3) + #define Z3_CURRENT Z_CURRENT + #define Z3_CURRENT_HOME Z_CURRENT_HOME + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_RSENSE Z_RSENSE + #define Z3_CHAIN_POS -1 + //#define Z3_INTERPOLATE true + //#define Z3_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(Z4) + #define Z4_CURRENT Z_CURRENT + #define Z4_CURRENT_HOME Z_CURRENT_HOME + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_RSENSE Z_RSENSE + #define Z4_CHAIN_POS -1 + //#define Z4_INTERPOLATE true + //#define Z4_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(I) + #define I_CURRENT 800 + #define I_CURRENT_HOME I_CURRENT + #define I_MICROSTEPS 16 + #define I_RSENSE 0.11 + #define I_CHAIN_POS -1 + //#define I_INTERPOLATE true + //#define I_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(J) + #define J_CURRENT 800 + #define J_CURRENT_HOME J_CURRENT + #define J_MICROSTEPS 16 + #define J_RSENSE 0.11 + #define J_CHAIN_POS -1 + //#define J_INTERPOLATE true + //#define J_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(K) + #define K_CURRENT 800 + #define K_CURRENT_HOME K_CURRENT + #define K_MICROSTEPS 16 + #define K_RSENSE 0.11 + #define K_CHAIN_POS -1 + //#define K_INTERPOLATE true + //#define K_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(U) + #define U_CURRENT 800 + #define U_CURRENT_HOME U_CURRENT + #define U_MICROSTEPS 8 + #define U_RSENSE 0.11 + #define U_CHAIN_POS -1 + //#define U_INTERPOLATE true + //#define U_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(V) + #define V_CURRENT 800 + #define V_CURRENT_HOME V_CURRENT + #define V_MICROSTEPS 8 + #define V_RSENSE 0.11 + #define V_CHAIN_POS -1 + //#define V_INTERPOLATE true + //#define V_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(W) + #define W_CURRENT 800 + #define W_CURRENT_HOME W_CURRENT + #define W_MICROSTEPS 8 + #define W_RSENSE 0.11 + #define W_CHAIN_POS -1 + //#define W_INTERPOLATE true + //#define W_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E0) + #define E0_CURRENT 650 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS -1 + //#define E0_INTERPOLATE true + //#define E0_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E1) + #define E1_CURRENT E0_CURRENT + #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_RSENSE E0_RSENSE + #define E1_CHAIN_POS -1 + //#define E1_INTERPOLATE true + //#define E1_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E2) + #define E2_CURRENT E0_CURRENT + #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_RSENSE E0_RSENSE + #define E2_CHAIN_POS -1 + //#define E2_INTERPOLATE true + //#define E2_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E3) + #define E3_CURRENT E0_CURRENT + #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_RSENSE E0_RSENSE + #define E3_CHAIN_POS -1 + //#define E3_INTERPOLATE true + //#define E3_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E4) + #define E4_CURRENT E0_CURRENT + #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_RSENSE E0_RSENSE + #define E4_CHAIN_POS -1 + //#define E4_INTERPOLATE true + //#define E4_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E5) + #define E5_CURRENT E0_CURRENT + #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_RSENSE E0_RSENSE + #define E5_CHAIN_POS -1 + //#define E5_INTERPOLATE true + //#define E5_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E6) + #define E6_CURRENT E0_CURRENT + #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_RSENSE E0_RSENSE + #define E6_CHAIN_POS -1 + //#define E6_INTERPOLATE true + //#define E6_HOLD_MULTIPLIER 0.5 + #endif + + #if AXIS_IS_TMC_CONFIG(E7) + #define E7_CURRENT E0_CURRENT + #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_RSENSE E0_RSENSE + #define E7_CHAIN_POS -1 + //#define E7_INTERPOLATE true + //#define E7_HOLD_MULTIPLIER 0.5 + #endif + + // @section tmc/spi + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define Z4_CS_PIN -1 + //#define I_CS_PIN -1 + //#define J_CS_PIN -1 + //#define K_CS_PIN -1 + //#define U_CS_PIN -1 + //#define V_CS_PIN -1 + //#define W_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + //#define E6_CS_PIN -1 + //#define E7_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SPI_MOSI -1 + //#define TMC_SPI_MISO -1 + //#define TMC_SPI_SCK -1 + + // @section tmc/serial + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + //#define X_SLAVE_ADDRESS 0 + //#define Y_SLAVE_ADDRESS 0 + //#define Z_SLAVE_ADDRESS 0 + //#define X2_SLAVE_ADDRESS 0 + //#define Y2_SLAVE_ADDRESS 0 + //#define Z2_SLAVE_ADDRESS 0 + //#define Z3_SLAVE_ADDRESS 0 + //#define Z4_SLAVE_ADDRESS 0 + //#define I_SLAVE_ADDRESS 0 + //#define J_SLAVE_ADDRESS 0 + //#define K_SLAVE_ADDRESS 0 + //#define U_SLAVE_ADDRESS 0 + //#define V_SLAVE_ADDRESS 0 + //#define W_SLAVE_ADDRESS 0 + //#define E0_SLAVE_ADDRESS 0 + //#define E1_SLAVE_ADDRESS 0 + //#define E2_SLAVE_ADDRESS 0 + //#define E3_SLAVE_ADDRESS 0 + //#define E4_SLAVE_ADDRESS 0 + //#define E5_SLAVE_ADDRESS 0 + //#define E6_SLAVE_ADDRESS 0 + //#define E7_SLAVE_ADDRESS 0 + + // @section tmc/smart + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + // @section tmc/stealthchop + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #if HAS_STEALTHCHOP + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_I + #define STEALTHCHOP_J + #define STEALTHCHOP_K + #define STEALTHCHOP_U + #define STEALTHCHOP_V + #define STEALTHCHOP_W + #define STEALTHCHOP_E + #endif + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * CHOPPER_DEFAULT_19V + * CHOPPER_DEFAULT_24V + * CHOPPER_DEFAULT_36V + * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define your own with: + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_24V // All axes (override below) + //#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below) + //#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X + //#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below) + //#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y + //#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below) + //#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z + //#define CHOPPER_TIMING_I CHOPPER_TIMING // For I Axis + //#define CHOPPER_TIMING_J CHOPPER_TIMING // For J Axis + //#define CHOPPER_TIMING_K CHOPPER_TIMING // For K Axis + //#define CHOPPER_TIMING_U CHOPPER_TIMING // For U Axis + //#define CHOPPER_TIMING_V CHOPPER_TIMING // For V Axis + //#define CHOPPER_TIMING_W CHOPPER_TIMING // For W Axis + //#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below) + //#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E4 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E5 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E6 CHOPPER_TIMING_E + //#define CHOPPER_TIMING_E7 CHOPPER_TIMING_E + + // @section tmc/status + + /** + * Monitor Trinamic drivers + * for error conditions like overtemperature and short to ground. + * To manage over-temp Marlin can decrease the driver current until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant G-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + // @section tmc/hybrid + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 20 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define Z4_HYBRID_THRESHOLD 3 + #define I_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s] + #define J_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s] + #define K_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s] + #define U_HYBRID_THRESHOLD 3 // [mm/s] + #define V_HYBRID_THRESHOLD 3 + #define W_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + #define E6_HYBRID_THRESHOLD 30 + #define E7_HYBRID_THRESHOLD 30 + + /** + * Use StallGuard to home / probe X, Y, Z. + * + * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only + * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }. + * + * SPI_ENDSTOPS *** TMC2130/TMC5160 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when + * homing and adds a guard period for endstop triggering. + * + * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis. + * @section tmc/stallguard + */ + //#define SENSORLESS_HOMING // StallGuard capable drivers only + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 72 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 70 + #define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY + #define Z_STALL_SENSITIVITY 10 + //#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define I_STALL_SENSITIVITY 8 + //#define J_STALL_SENSITIVITY 8 + //#define K_STALL_SENSITIVITY 8 + //#define U_STALL_SENSITIVITY 8 + //#define V_STALL_SENSITIVITY 8 + //#define W_STALL_SENSITIVITY 8 + //#define SPI_ENDSTOPS // TMC2130/TMC5160 only + #define IMPROVE_HOMING_RELIABILITY + #endif + + // @section tmc/config + + /** + * TMC Homing stepper phase. + * + * Improve homing repeatability by homing to stepper coil's nearest absolute + * phase position. Trinamic drivers use a stepper phase table with 1024 values + * spanning 4 full steps with 256 positions each (ergo, 1024 positions). + * Full step positions (128, 384, 640, 896) have the highest holding torque. + * + * Values from 0..1023, -1 to disable homing phase for that axis. + */ + //#define TMC_HOME_PHASE { 896, 896, 896 } + + /** + * Step on both rising and falling edge signals (as with a square wave). + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continuous reporting. + */ + #define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_otpw(1); \ + * stepperY.intpol(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC_CONFIG || HAS_TMC26X + +// @section i2cbus + +// +// I2C Master ID for LPC176x LCD and Digital Current control +// Does not apply to other peripherals based on the Wire library. +// +//#define I2C_MASTER_ID 1 // Set a value from 0 to 2 + +/** + * TWI/I2C BUS + * + * This feature is EXPERIMENTAL but may be useful for custom I2C peripherals. + * Enable this to send and receive I2C data from slave devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +//#define EXPERIMENTAL_I2CBUS +#if ENABLED(EXPERIMENTAL_I2CBUS) + #define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave +#endif + +// @section photo + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) + + // Canon RC-1 or homebrew digital camera trigger + // Data from: https://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // https://web.archive.org/web/20200920094805/https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) + + /** + * PHOTO_PULSES_US may need adjustment depending on board and camera model. + * Pin must be running at 48.4kHz. + * Be sure to use a PHOTOGRAPH_PIN which can rise and fall quick enough. + * (e.g., MKS SBase temp sensor pin was too slow, so used P1.23 on J8.) + * + * Example pulse data for Nikon: https://bit.ly/2FKD0Aq + * IR Wiring: https://git.io/JvJf7 + */ + //#define PHOTO_PULSES_US { 2000, 27850, 400, 1580, 400, 3580, 400 } // (µs) Durations for each 48.4kHz oscillation + #ifdef PHOTO_PULSES_US + #define PHOTO_PULSE_DELAY_US 13 // (µs) Approximate duration of each HIGH and LOW pulse in the oscillation + #endif +#endif + +// @section cnc + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See https://marlinfw.org/docs/configuration/2.0.9/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH + + #define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power + #if ENABLED(SPINDLE_LASER_USE_PWM) + #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR, ESP32, and LPC) + // ESP32: If SPINDLE_LASER_PWM_PIN is onboard then <=78125Hz. For I2S expander + // the frequency determines the PWM resolution. 2500Hz = 0-100, 977Hz = 0-255, ... + // (250000 / SPINDLE_LASER_FREQUENCY) = max value. + #endif + + //#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11 + #if ENABLED(AIR_EVACUATION) + #define AIR_EVACUATION_ACTIVE LOW // Set to "HIGH" if the on/off function is active HIGH + //#define AIR_EVACUATION_PIN 42 // Override the default Cutter Vacuum or Laser Blower pin + #endif + + //#define AIR_ASSIST // Air Assist control with G-codes M8-M9 + #if ENABLED(AIR_ASSIST) + #define AIR_ASSIST_ACTIVE LOW // Active state on air assist pin + //#define AIR_ASSIST_PIN 44 // Override the default Air Assist pin + #endif + + //#define SPINDLE_SERVO // A servo converting an angle to spindle power + #ifdef SPINDLE_SERVO + #define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control + #define SPINDLE_SERVO_MIN 10 // Minimum angle for servo spindle + #endif + + /** + * Speed / Power can be set ('M3 S') and displayed in terms of: + * - PWM255 (S0 - S255) + * - PERCENT (S0 - S100) + * - RPM (S0 - S50000) Best for use with a spindle + * - SERVO (S0 - S180) + */ + #define CUTTER_POWER_UNIT PWM255 + + /** + * Relative Cutter Power + * Normally, 'M3 O' sets + * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX. + * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX + * instead of normal range (0 to SPEED_POWER_MAX). + * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM + */ + //#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX] + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + /** + * M3/M4 Power Equation + * + * Each tool uses different value ranges for speed / power control. + * These parameters are used to convert between tool power units and PWM. + * + * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE + * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE + */ + #if ENABLED(SPINDLE_LASER_USE_PWM) + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 5000 // (RPM) + #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM + #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) + #endif + + #else + + #if ENABLED(SPINDLE_LASER_USE_PWM) + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 0 // (%) 0-100 + #define SPEED_POWER_MAX 100 // (%) 0-100 + #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments) + #endif + + // Define the minimum and maximum test pulse time values for a laser test fire function + #define LASER_TEST_PULSE_MIN 1 // (ms) Used with Laser Control Menu + #define LASER_TEST_PULSE_MAX 999 // (ms) Caution: Menu may not show more than 3 characters + + #define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop + + /** + * Laser Safety Timeout + * + * The laser should be turned off when there is no movement for a period of time. + * Consider material flammability, cut rate, and G-code order when setting this + * value. Too low and it could turn off during a very slow move; too high and + * the material could ignite. + */ + #define LASER_SAFETY_TIMEOUT_MS 1000 // (ms) + + /** + * Any M3 or G1/2/3/5 command with the 'I' parameter enables continuous inline power mode. + * + * e.g., 'M3 I' enables continuous inline power which is processed by the planner. + * Power is stored in move blocks and applied when blocks are processed by the Stepper ISR. + * + * 'M4 I' sets dynamic mode which uses the current feedrate to calculate a laser power OCR value. + * + * Any move in dynamic mode will use the current feedrate to calculate the laser power. + * Feed rates are set by the F parameter of a move command e.g. G1 X0 Y10 F6000 + * Laser power would be calculated by bit shifting off 8 LSB's. In binary this is div 256. + * The calculation gives us ocr values from 0 to 255, values over F65535 will be set as 255 . + * More refined power control such as compensation for accel/decel will be addressed in future releases. + * + * M5 I clears inline mode and set power to 0, M5 sets the power output to 0 but leaves inline mode on. + */ + + /** + * Enable M3 commands for laser mode inline power planner syncing. + * This feature enables any M3 S-value to be injected into the block buffers while in + * CUTTER_MODE_CONTINUOUS. The option allows M3 laser power to be committed without waiting + * for a planner synchronization + */ + //#define LASER_POWER_SYNC + + /** + * Scale the laser's power in proportion to the movement rate. + * + * - Sets the entry power proportional to the entry speed over the nominal speed. + * - Ramps the power up every N steps to approximate the speed trapezoid. + * - Due to the limited power resolution this is only approximate. + */ + //#define LASER_POWER_TRAP + + // + // Laser I2C Ammeter (High precision INA226 low/high side module) + // + //#define I2C_AMMETER + #if ENABLED(I2C_AMMETER) + #define I2C_AMMETER_IMAX 0.1 // (Amps) Calibration value for the expected current range + #define I2C_AMMETER_SHUNT_RESISTOR 0.1 // (Ohms) Calibration shunt resistor value + #endif + + // + // Laser Coolant Flow Meter + // + //#define LASER_COOLANT_FLOW_METER + #if ENABLED(LASER_COOLANT_FLOW_METER) + #define FLOWMETER_PIN 20 // Requires an external interrupt-enabled pin (e.g., RAMPS 2,3,18,19,20,21) + #define FLOWMETER_PPL 5880 // (pulses/liter) Flow meter pulses-per-liter on the input pin + #define FLOWMETER_INTERVAL 1000 // (ms) Flow rate calculation interval in milliseconds + #define FLOWMETER_SAFETY // Prevent running the laser without the minimum flow rate set below + #if ENABLED(FLOWMETER_SAFETY) + #define FLOWMETER_MIN_LITERS_PER_MINUTE 1.5 // (liters/min) Minimum flow required when enabled + #endif + #endif + + #endif +#endif // SPINDLE_FEATURE || LASER_FEATURE + +/** + * Synchronous Laser Control with M106/M107 + * + * Marlin normally applies M106/M107 fan speeds at a time "soon after" processing + * a planner block. This is too inaccurate for a PWM/TTL laser attached to the fan + * header (as with some add-on laser kits). Enable this option to set fan/laser + * speeds with much more exact timing for improved print fidelity. + * + * NOTE: This option sacrifices some cooling fan speed options. + */ +//#define LASER_SYNCHRONOUS_M106_M107 + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +// @section filament width + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +// @section power + +/** + * Power Monitor + * Monitor voltage (V) and/or current (A), and -when possible- power (W) + * + * Read and configure with M430 + * + * The current sensor feeds DC voltage (relative to the measured current) to an analog pin + * The voltage sensor feeds DC voltage (relative to the measured voltage) to an analog pin + */ +//#define POWER_MONITOR_CURRENT // Monitor the system current +//#define POWER_MONITOR_VOLTAGE // Monitor the system voltage + +#if ENABLED(POWER_MONITOR_CURRENT) + #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_CURRENT_OFFSET 0 // Offset (in amps) applied to the calculated current + #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) +#endif + +#if ENABLED(POWER_MONITOR_VOLTAGE) + #define POWER_MONITOR_VOLTS_PER_VOLT 0.077933 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage +#endif + +// @section safety + +/** + * Stepper Driver Anti-SNAFU Protection + * + * If the SAFE_POWER_PIN is defined for your board, Marlin will check + * that stepper drivers are properly plugged in before applying power. + * Disable protection if your stepper drivers don't support the feature. + */ +//#define DISABLE_DRIVER_SAFE_POWER_PROTECT + +// @section cnc + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +// @section reporting + +/** + * Auto-report fan speed with M123 S + * Requires fans with tachometer pins + */ +//#define AUTO_REPORT_FANS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES +#if ENABLED(AUTO_REPORT_TEMPERATURES) && TEMP_SENSOR_REDUNDANT + //#define AUTO_REPORT_REDUNDANT // Include the "R" sensor in the auto-report +#endif + +/** + * Auto-report position with M154 S + */ +#define AUTO_REPORT_POSITION + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT +#if ENABLED(EXTENDED_CAPABILITIES_REPORT) + #define M115_GEOMETRY_REPORT +#endif + +// @section security + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +// @section volumetrics + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter (and enable volumetric). + * M200 S0/S1 to disable/enable volumetric extrusion. + */ + //#define VOLUMETRIC_DEFAULT_ON + + //#define VOLUMETRIC_EXTRUDER_LIMIT + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + /** + * Default volumetric extrusion limit in cubic mm per second (mm^3/sec). + * This factory setting applies to all extruders. + * Use 'M200 [T] L' to override and 'M502' to reset. + * A non-zero value activates Volume-based Extrusion Limiting. + */ + #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 // (mm^3/sec) + #endif +#endif + +// @section reporting + +// Extra options for the M114 "Current Position" report +#define M114_DETAIL // Use 'M114` for details to check planner calculations +//#define M114_REALTIME // Real current position based on forward kinematics +//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed. + +#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) + +// @section gcode + +/** + * Spend 28 bytes of SRAM to optimize the G-code parser + */ +#define FASTER_GCODE_PARSER + +#if ENABLED(FASTER_GCODE_PARSER) + //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters +#endif + +/** + * Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) + */ +//#define MEATPACK_ON_SERIAL_PORT_1 +//#define MEATPACK_ON_SERIAL_PORT_2 + +//#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase + +//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. + +// Enable and set a (default) feedrate for all G0 moves +//#define G0_FEEDRATE 3000 // (mm/min) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined menu items to run custom G-code. + * Up to 25 may be defined, but the actual number is LCD-dependent. + */ + +// @section custom main menu + +// Custom Menu: Main Menu +//#define CUSTOM_MENU_MAIN +#if ENABLED(CUSTOM_MENU_MAIN) + //#define CUSTOM_MENU_MAIN_TITLE "Custom Commands" + #define CUSTOM_MENU_MAIN_SCRIPT_DONE "M117 User Script Done" + #define CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_MAIN_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_MAIN_ONLY_IDLE // Only show custom menu when the machine is idle + + #define MAIN_MENU_ITEM_1_DESC "Home & UBL Info" + #define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W" + //#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL + #define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_2_CONFIRM + + //#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL + //#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_3_CONFIRM + + //#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level" + //#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + //#define MAIN_MENU_ITEM_4_CONFIRM + + //#define MAIN_MENU_ITEM_5_DESC "Home & Info" + //#define MAIN_MENU_ITEM_5_GCODE "G28\nM503" + //#define MAIN_MENU_ITEM_5_CONFIRM +#endif + +// @section custom config menu + +// Custom Menu: Configuration Menu +//#define CUSTOM_MENU_CONFIG +#if ENABLED(CUSTOM_MENU_CONFIG) + //#define CUSTOM_MENU_CONFIG_TITLE "Custom Commands" + #define CUSTOM_MENU_CONFIG_SCRIPT_DONE "M117 Wireless Script Done" + #define CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_CONFIG_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_CONFIG_ONLY_IDLE // Only show custom menu when the machine is idle + + #define CONFIG_MENU_ITEM_1_DESC "Wifi ON" + #define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678" + //#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON" + #define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678" + //#define CONFIG_MENU_ITEM_2_CONFIRM + + //#define CONFIG_MENU_ITEM_3_DESC "Radio OFF" + //#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678" + //#define CONFIG_MENU_ITEM_3_CONFIRM + + //#define CONFIG_MENU_ITEM_4_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_4_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_4_CONFIRM + + //#define CONFIG_MENU_ITEM_5_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_5_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_5_CONFIRM +#endif + +// @section custom buttons + +/** + * User-defined buttons to run custom G-code. + * Up to 25 may be defined. + */ +//#define CUSTOM_USER_BUTTONS +#if ENABLED(CUSTOM_USER_BUTTONS) + //#define BUTTON1_PIN -1 + #if PIN_EXISTS(BUTTON1) + #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. + #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? + #define BUTTON1_GCODE "G28" + #define BUTTON1_DESC "Homing" // Optional string to set the LCD status + #endif + + //#define BUTTON2_PIN -1 + #if PIN_EXISTS(BUTTON2) + #define BUTTON2_HIT_STATE LOW + #define BUTTON2_WHEN_PRINTING false + #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL + #endif + + //#define BUTTON3_PIN -1 + #if PIN_EXISTS(BUTTON3) + #define BUTTON3_HIT_STATE LOW + #define BUTTON3_WHEN_PRINTING false + #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL + #endif +#endif + +// @section host + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + #define HOST_PAUSE_M76 // Tell the host to pause in response to M76 + #define HOST_PROMPT_SUPPORT // Initiate host prompts to get user feedback + #if ENABLED(HOST_PROMPT_SUPPORT) + #define HOST_STATUS_NOTIFICATIONS // Send some status messages to the host as notifications + #endif + //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start + //#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down +#endif + +// @section extras + +/** + * Cancel Objects + * + * Implement M486 to allow Marlin to skip objects + */ +//#define CANCEL_OBJECTS +#if ENABLED(CANCEL_OBJECTS) + #define CANCEL_OBJECTS_REPORTING // Emit the current object as a status message +#endif + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: https://aus3d.com.au/products/magnetic-encoder-module + * Alternative Supplier: https://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + * @section i2c encoders + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistent errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + * @section joystick + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + //#define INVERT_JOY_X // Enable if X direction is reversed + //#define INVERT_JOY_Y // Enable if Y direction is reversed + //#define INVERT_JOY_Z // Enable if Z direction is reversed + + // Use M119 with JOYSTICK_DEBUG to find reasonable values after connecting: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } + //#define JOYSTICK_DEBUG +#endif + +/** + * Mechanical Gantry Calibration + * Modern replacement for the Průša TMC_Z_CALIBRATION. + * Adds capability to work with any adjustable current drivers. + * Implemented as G34 because M915 is deprecated. + * @section calibrate + */ +//#define MECHANICAL_GANTRY_CALIBRATION +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma + #define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move + #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move + //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction + + //#define GANTRY_CALIBRATION_SAFE_POSITION XY_CENTER // Safe position for nozzle + //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM + //#define GANTRY_CALIBRATION_COMMANDS_PRE "" + #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position +#endif + +/** + * Instant freeze / unfreeze functionality + * Potentially useful for emergency stop that allows being resumed. + * @section interface + */ +//#define FREEZE_FEATURE +#if ENABLED(FREEZE_FEATURE) + //#define FREEZE_PIN 41 // Override the default (KILL) pin here + #define FREEZE_STATE LOW // State of pin indicating freeze +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + * @section debug matrix + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Test pattern at startup: 0=none, 1=sweep, 2=spiral + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The order of the LED matrix units may be reversed + //#define MAX7219_REVERSE_EACH // The LEDs in each matrix unit row may be reversed + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 2 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 4 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. + #define MAX7219_DEBUG_PROFILE 6 // Display the fraction of CPU time spent in profiled code on this LED matrix + // row. By default idle() is profiled so this shows how "idle" the processor is. + // See class CodeProfiler. +#endif + +/** + * NanoDLP Sync support + * + * Support for Synchronized Z moves when used with NanoDLP. G0/G1 axis moves will + * output a "Z_move_comp" string to enable synchronization with DLP projector exposure. + * This feature allows you to use [[WaitForDoneMessage]] instead of M400 commands. + * @section nanodlp + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Send a "Z_move_comp" report for any axis move (not just Z). +#endif + +/** + * Ethernet. Use M552 to enable and set the IP address. + * @section network + */ +#if HAS_ETHERNET + #define MAC_ADDRESS { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D } // A MAC address unique to your network +#endif + +/** + * Native ESP32 board with WiFi or add-on ESP32 WiFi-101 module + */ +//#define WIFISUPPORT // Marlin embedded WiFi management. Not needed for simple WiFi serial port. +//#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib) + +/** + * Extras for an ESP32-based motherboard with WIFISUPPORT + * These options don't apply to add-on WiFi modules based on ESP32 WiFi101. + */ +#if ENABLED(WIFISUPPORT) + //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) using SPIFFS + //#define OTASUPPORT // Support over-the-air firmware updates + //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host + + /** + * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with + * the following defines, customized for your network. This specific file is excluded via + * .gitignore to prevent it from accidentally leaking to the public. + * + * #define WIFI_SSID "WiFi SSID" + * #define WIFI_PWD "WiFi Password" + */ + //#include "Configuration_Secure.h" // External file with WiFi SSID / Password +#endif + +// @section multi-material + +/** + * Průša Multi-Material Unit (MMU) + * Enable in Configuration.h + * + * These devices allow a single stepper driver on the board to drive + * multi-material feeders with any number of stepper motors. + */ +#if HAS_PRUSA_MMU1 + /** + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + * + * Override the default DIO selector pins here, if needed. + * Some pins files may provide defaults for these pins. + */ + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#elif HAS_PRUSA_MMU2 + // Serial port used for communication with MMU2. + #define MMU2_SERIAL_PORT 2 + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + + // Settings for filament load / unload from the LCD menu. + // This is for Průša MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 1145 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + + /** + * Using a sensor like the MMU2S + * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. + * See https://help.prusa3d.com/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560#42048, step 11 + */ + #if HAS_PRUSA_MMU2S + #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) + + #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) + #define MMU2_CAN_LOAD_SEQUENCE \ + { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \ + { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \ + { -52.0, MMU2_CAN_LOAD_FEEDRATE } + + #define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values + #define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation + + #define MMU2_CAN_LOAD_INCREMENT 0.2 // (mm) To reuse within MMU2 module + #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ + { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } + + #else + + /** + * MMU1 Extruder Sensor + * + * Support for a Průša (or other) IR Sensor to detect filament near the extruder + * and make loading more reliable. Suitable for an extruder equipped with a filament + * sensor less than 38mm from the gears. + * + * During loading the extruder will stop when the sensor is triggered, then do a last + * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. + * If all attempts fail, a filament runout will be triggered. + */ + //#define MMU_EXTRUDER_SENSOR + #if ENABLED(MMU_EXTRUDER_SENSOR) + #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail + #endif + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // HAS_PRUSA_MMU2 + +/** + * Advanced Print Counter settings + * @section stats + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +// +// M100 Free Memory Watcher to debug memory usage +// +//#define M100_FREE_MEMORY_WATCHER + +// +// M42 - Set pin states +// +//#define DIRECT_PIN_CONTROL + +// +// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe +// +//#define PINS_DEBUGGING + +// Enable Tests that will run at startup and produce a report +//#define MARLIN_TEST_BUILD + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#if ENABLED(MARLIN_DEV_MODE) + /** + * D576 - Buffer Monitoring + * To help diagnose print quality issues stemming from empty command buffers. + */ + //#define BUFFER_MONITORING +#endif + +/** + * Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial. + * When running in the debugger it will break for debugging. This is useful to help understand + * a crash from a remote location. Requires ~400 bytes of SRAM and 5Kb of flash. + */ +//#define POSTMORTEM_DEBUGGING + +/** + * Software Reset options + */ +//#define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller +//#define SOFT_RESET_ON_KILL // Use a digital button to soft-reset the controller after KILL + +// Report uncleaned reset reason from register r2 instead of MCUSR. Supported by Optiboot on AVR. +//#define OPTIBOOT_RESET_REASON diff --git a/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Bootscreen.h b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Bootscreen.h new file mode 100644 index 0000000..324cb4a --- /dev/null +++ b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Bootscreen.h @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * https://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 81 +#define CUSTOM_BOOTSCREEN_INVERTED + +const unsigned char custom_start_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11101111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100011,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11110011,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100001,B11100001,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111110,B01111000,B00000000,B00000000,B00000011,B11011101,B11111111,B11111111,B11111111,B11111111, + B11111110,B11111111,B10000000,B01111110,B00000000,B00000001,B11101110,B11111111,B11111111,B11111111,B11111111, + B11111110,B01111101,B11001111,B11111100,B00000000,B00000000,B11110111,B01111111,B11111111,B11111111,B11111111, + B11111111,B10001110,B00000110,B00000000,B00000000,B00000000,B01111011,B10111111,B11111111,B11111111,B11111111, + B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111101,B11011111,B11111111,B11111111,B11111111, + B11111111,B11111100,B00000001,B11111110,B00000000,B00000000,B00111110,B11100111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111100,B00000000,B00000011,B00011111,B01110011,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111000,B00000000,B00000001,B10001111,B10000001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B00000000,B11111100,B00000000,B00000000,B11110000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11100000,B00001111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111110,B00000011,B11111111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111001,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000111,B11000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000111,B11100000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000111,B11110001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000111,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100001,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000,B10111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111011,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111001,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B01111110,B11110000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B10001110,B00000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00011111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B01111111,B11111111,B11111111,B11111111, + B11111111,B00000000,B00000000,B01111111,B11111111,B11111111,B11111000,B01111111,B11111111,B11111111,B11111111, + B11111111,B10000000,B00000000,B01111111,B11111111,B11111111,B11100000,B01111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111101,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111111,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B00001111,B11100111,B11110011,B00001111,B11111100,B00100011,B11111100,B00111111,B11111111,B11111111, + B11111111,B00001111,B11101111,B10000000,B00000111,B11110000,B00000011,B11110000,B00011110,B00000000,B01111111, + B11111110,B00011111,B11001111,B10000001,B10000111,B11000111,B10000111,B11000111,B00001100,B00000000,B01111111, + B11111110,B00000000,B00011111,B11000111,B11000111,B10001111,B11000111,B10011111,B00001111,B00001100,B11111111, + B11111110,B00000000,B00011111,B10000111,B10001111,B00011111,B10001111,B00011111,B00001111,B00011111,B11111111, + B11111100,B00111111,B10011111,B10001111,B10001111,B00011111,B10001110,B00000000,B00011110,B00111111,B11111111, + B11111100,B01111111,B00111111,B00001111,B00011110,B00111111,B00011110,B00111111,B11111110,B00111111,B11111111, + B11111000,B01111111,B11111111,B00011111,B00011100,B00111111,B00011100,B01111111,B11111100,B01111111,B11111111, + B11111000,B11111111,B11111111,B00011110,B00011100,B01111110,B00011100,B01111111,B11111100,B01111111,B11111111, + B11110000,B11111111,B11001110,B00111110,B00111100,B01111110,B00111100,B01111111,B10111000,B11111111,B11111111, + B11110000,B11111111,B10011110,B00111100,B00111000,B01111100,B00111000,B01111110,B01111000,B11111111,B11111111, + B11100001,B11111111,B00111100,B01111100,B01111000,B01111100,B01111000,B00111100,B11110001,B11111111,B11111111, + B11100001,B11111000,B00111000,B01111000,B01111000,B00010000,B00011000,B00000001,B11110001,B11111111,B11111111, + B00000000,B00000000,B01100000,B00100000,B00111100,B00000000,B01111100,B00000111,B10000000,B01111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111110,B00011111,B11111110,B00011111,B11111111,B11111111,B11111111 +}; diff --git a/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Statusscreen.h b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Statusscreen.h new file mode 100644 index 0000000..d1e2f4a --- /dev/null +++ b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/_Statusscreen.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * https://marlinfw.org/tools/u8glib/converter.html + */ + +// +// Status Screen Logo bitmap +// +#define STATUS_LOGO_Y 8 +#define STATUS_LOGO_WIDTH 39 + +const unsigned char status_logo_bmp[] PROGMEM = { + B11111000,B00000001,B10000000,B00000000,B00001100, + B01001000,B00000000,B10000000,B00000000,B00010010, + B01000011,B11000011,B10001100,B11010000,B00000010, + B01110001,B00100100,B10010010,B01100111,B11001100, + B01000001,B00100100,B10011110,B01000000,B00000010, + B01001001,B00100100,B10010000,B01000000,B00010010, + B11111011,B10110011,B11001110,B11100000,B00001100 +}; + +// +// Use default bitmaps +// +#define STATUS_HOTEND_ANIM +#define STATUS_BED_ANIM +#define STATUS_HEATERS_XSPACE 20 +#if HOTENDS < 2 + #define STATUS_HEATERS_X 48 + #define STATUS_BED_X 72 +#else + #define STATUS_HEATERS_X 40 + #define STATUS_BED_X 80 +#endif diff --git a/Ender5 with SKR mini E3 V3.0 and Sprite extruder/firmware-2.1.2.5.bin b/Ender5 with SKR mini E3 V3.0 and Sprite extruder/firmware-2.1.2.5.bin new file mode 100644 index 0000000000000000000000000000000000000000..e955300629c71e3508a7d7d327e25bfb5beff7a8 GIT binary patch literal 291032 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 BXc)Ctyu;iS0S`+E`uTQ1hItz<@ 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�q@CX_==x&^mn(KUugpDJYbLG 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 literal 0 HcmV?d00001