/* config.h - compile time configuration Part of Grbl Copyright (c) 2012-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl 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. Grbl 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 Grbl. If not, see . */ // This file contains compile-time configurations for Grbl's internal system. For the most part, // users will not need to directly modify these, but they are here for specific needs, i.e. // performance tuning or adjusting to non-typical machines. // IMPORTANT: Any changes here requires a full re-compiling of the source code to propagate them. #ifndef config_h #define config_h #include "grbl.h" // For Arduino IDE compatibility. // Define CPU pin map and default settings. // NOTE: OEMs can avoid the need to maintain/update the defaults.h and cpu_map.h files and use only // one configuration file by placing their specific defaults and pin map at the bottom of this file. // If doing so, simply comment out these two defines and see instructions below. #define DEFAULTS_GENERIC #define CPU_MAP_ATMEGA328P // Arduino Uno CPU // Serial baud rate // #define BAUD_RATE 230400 #define BAUD_RATE 115200 // Define realtime command special characters. These characters are 'picked-off' directly from the // serial read data stream and are not passed to the grbl line execution parser. Select characters // that do not and must not exist in the streamed g-code program. ASCII control characters may be // used, if they are available per user setup. Also, extended ASCII codes (>127), which are never in // g-code programs, maybe selected for interface programs. // NOTE: If changed, manually update help message in report.c. #define CMD_RESET 0x18 // ctrl-x. #define CMD_STATUS_REPORT '?' #define CMD_CYCLE_START '~' #define CMD_FEED_HOLD '!' // NOTE: All override realtime commands must be in the extended ASCII character set, starting // at character value 128 (0x80) and up to 255 (0xFF). If the normal set of realtime commands, // such as status reports, feed hold, reset, and cycle start, are moved to the extended set // space, serial.c's RX ISR will need to be modified to accomodate the change. // #define CMD_RESET 0x80 // #define CMD_STATUS_REPORT 0x81 // #define CMD_CYCLE_START 0x82 // #define CMD_FEED_HOLD 0x83 #define CMD_SAFETY_DOOR 0x84 #define CMD_JOG_CANCEL 0x85 #define CMD_DEBUG_REPORT 0x86 // Only when DEBUG enabled, sends debug report in '{}' braces. #define CMD_FEED_OVR_RESET 0x90 // Restores feed override value to 100%. #define CMD_FEED_OVR_COARSE_PLUS 0x91 #define CMD_FEED_OVR_COARSE_MINUS 0x92 #define CMD_FEED_OVR_FINE_PLUS 0x93 #define CMD_FEED_OVR_FINE_MINUS 0x94 #define CMD_RAPID_OVR_RESET 0x95 // Restores rapid override value to 100%. #define CMD_RAPID_OVR_MEDIUM 0x96 #define CMD_RAPID_OVR_LOW 0x97 // #define CMD_RAPID_OVR_EXTRA_LOW 0x98 // *NOT SUPPORTED* #define CMD_SPINDLE_OVR_RESET 0x99 // Restores spindle override value to 100%. #define CMD_SPINDLE_OVR_COARSE_PLUS 0x9A #define CMD_SPINDLE_OVR_COARSE_MINUS 0x9B #define CMD_SPINDLE_OVR_FINE_PLUS 0x9C #define CMD_SPINDLE_OVR_FINE_MINUS 0x9D #define CMD_SPINDLE_OVR_STOP 0x9E #define CMD_COOLANT_FLOOD_OVR_TOGGLE 0xA0 #define CMD_COOLANT_MIST_OVR_TOGGLE 0xA1 // If homing is enabled, homing init lock sets Grbl into an alarm state upon power up. This forces // the user to perform the homing cycle (or override the locks) before doing anything else. This is // mainly a safety feature to remind the user to home, since position is unknown to Grbl. #define HOMING_INIT_LOCK // Comment to disable // Define the homing cycle patterns with bitmasks. The homing cycle first performs a search mode // to quickly engage the limit switches, followed by a slower locate mode, and finished by a short // pull-off motion to disengage the limit switches. The following HOMING_CYCLE_x defines are executed // in order starting with suffix 0 and completes the homing routine for the specified-axes only. If // an axis is omitted from the defines, it will not home, nor will the system update its position. // Meaning that this allows for users with non-standard cartesian machines, such as a lathe (x then z, // with no y), to configure the homing cycle behavior to their needs. // NOTE: The homing cycle is designed to allow sharing of limit pins, if the axes are not in the same // cycle, but this requires some pin settings changes in cpu_map.h file. For example, the default homing // cycle can share the Z limit pin with either X or Y limit pins, since they are on different cycles. // By sharing a pin, this frees up a precious IO pin for other purposes. In theory, all axes limit pins // may be reduced to one pin, if all axes are homed with seperate cycles, or vice versa, all three axes // on separate pin, but homed in one cycle. Also, it should be noted that the function of hard limits // will not be affected by pin sharing. // NOTE: Defaults are set for a traditional 3-axis CNC machine. Z-axis first to clear, followed by X & Y. #define HOMING_CYCLE_0 (1< 3us, and, when added with the // user-supplied step pulse time, the total time must not exceed 127us. Reported successful // values for certain setups have ranged from 5 to 20us. // #define STEP_PULSE_DELAY 10 // Step pulse delay in microseconds. Default disabled. // The number of linear motions in the planner buffer to be planned at any give time. The vast // majority of RAM that Grbl uses is based on this buffer size. Only increase if there is extra // available RAM, like when re-compiling for a Mega2560. Or decrease if the Arduino begins to // crash due to the lack of available RAM or if the CPU is having trouble keeping up with planning // new incoming motions as they are executed. // #define BLOCK_BUFFER_SIZE 16 // Uncomment to override default in planner.h. // Governs the size of the intermediary step segment buffer between the step execution algorithm // and the planner blocks. Each segment is set of steps executed at a constant velocity over a // fixed time defined by ACCELERATION_TICKS_PER_SECOND. They are computed such that the planner // block velocity profile is traced exactly. The size of this buffer governs how much step // execution lead time there is for other Grbl processes have to compute and do their thing // before having to come back and refill this buffer, currently at ~50msec of step moves. // #define SEGMENT_BUFFER_SIZE 6 // Uncomment to override default in stepper.h. // Line buffer size from the serial input stream to be executed. Also, governs the size of // each of the startup blocks, as they are each stored as a string of this size. Make sure // to account for the available EEPROM at the defined memory address in settings.h and for // the number of desired startup blocks. // NOTE: 80 characters is not a problem except for extreme cases, but the line buffer size // can be too small and g-code blocks can get truncated. Officially, the g-code standards // support up to 256 characters. In future versions, this default will be increased, when // we know how much extra memory space we can re-invest into this. // #define LINE_BUFFER_SIZE 80 // Uncomment to override default in protocol.h // Serial send and receive buffer size. The receive buffer is often used as another streaming // buffer to store incoming blocks to be processed by Grbl when its ready. Most streaming // interfaces will character count and track each block send to each block response. So, // increase the receive buffer if a deeper receive buffer is needed for streaming and avaiable // memory allows. The send buffer primarily handles messages in Grbl. Only increase if large // messages are sent and Grbl begins to stall, waiting to send the rest of the message. // NOTE: Grbl generates an average status report in about 0.5msec, but the serial TX stream at // 115200 baud will take 5 msec to transmit a typical 55 character report. Worst case reports are // around 90-100 characters. As long as the serial TX buffer doesn't get continually maxed, Grbl // will continue operating efficiently. Size the TX buffer around the size of a worst-case report. // #define RX_BUFFER_SIZE 128 // (1-254) Uncomment to override defaults in serial.h // #define TX_BUFFER_SIZE 100 // (1-254) // A simple software debouncing feature for hard limit switches. When enabled, the interrupt // monitoring the hard limit switch pins will enable the Arduino's watchdog timer to re-check // the limit pin state after a delay of about 32msec. This can help with CNC machines with // problematic false triggering of their hard limit switches, but it WILL NOT fix issues with // electrical interference on the signal cables from external sources. It's recommended to first // use shielded signal cables with their shielding connected to ground (old USB/computer cables // work well and are cheap to find) and wire in a low-pass circuit into each limit pin. // #define ENABLE_SOFTWARE_DEBOUNCE // Default disabled. Uncomment to enable. // Configures the position after a probing cycle during Grbl's check mode. Disabled sets // the position to the probe target, when enabled sets the position to the start position. // #define SET_CHECK_MODE_PROBE_TO_START // Default disabled. Uncomment to enable. // Force Grbl to check the state of the hard limit switches when the processor detects a pin // change inside the hard limit ISR routine. By default, Grbl will trigger the hard limits // alarm upon any pin change, since bouncing switches can cause a state check like this to // misread the pin. When hard limits are triggered, they should be 100% reliable, which is the // reason that this option is disabled by default. Only if your system/electronics can guarantee // that the switches don't bounce, we recommend enabling this option. This will help prevent // triggering a hard limit when the machine disengages from the switch. // NOTE: This option has no effect if SOFTWARE_DEBOUNCE is enabled. // #define HARD_LIMIT_FORCE_STATE_CHECK // Default disabled. Uncomment to enable. // Adjusts homing cycle search and locate scalars. These are the multipliers used by Grbl's // homing cycle to ensure the limit switches are engaged and cleared through each phase of // the cycle. The search phase uses the axes max-travel setting times the SEARCH_SCALAR to // determine distance to look for the limit switch. Once found, the locate phase begins and // uses the homing pull-off distance setting times the LOCATE_SCALAR to pull-off and re-engage // the limit switch. // NOTE: Both of these values must be greater than 1.0 to ensure proper function. // #define HOMING_AXIS_SEARCH_SCALAR 1.5 // Uncomment to override defaults in limits.c. // #define HOMING_AXIS_LOCATE_SCALAR 10.0 // Uncomment to override defaults in limits.c. // Enable the '$RST=*', '$RST=$', and '$RST=#' eeprom restore commands. There are cases where // these commands may be undesirable. Simply comment the desired macro to disable it. // NOTE: See SETTINGS_RESTORE_ALL macro for customizing the `$RST=*` command. #define ENABLE_RESTORE_EEPROM_WIPE_ALL // '$RST=*' Default enabled. Comment to disable. #define ENABLE_RESTORE_EEPROM_DEFAULT_SETTINGS // '$RST=$' Default enabled. Comment to disable. #define ENABLE_RESTORE_EEPROM_CLEAR_PARAMETERS // '$RST=#' Default enabled. Comment to disable. // Defines the EEPROM data restored upon a settings version change and `$RST=*` command. Whenever the // the settings or other EEPROM data structure changes between Grbl versions, Grbl will automatically // wipe and restore the EEPROM. This macro controls what data is wiped and restored. This is useful // particularily for OEMs that need to retain certain data. For example, the BUILD_INFO string can be // written into the Arduino EEPROM via a seperate .INO sketch to contain product data. Altering this // macro to not restore the build info EEPROM will ensure this data is retained after firmware upgrades. // NOTE: Uncomment to override defaults in settings.h // #define SETTINGS_RESTORE_ALL (SETTINGS_RESTORE_DEFAULTS | SETTINGS_RESTORE_PARAMETERS | SETTINGS_RESTORE_STARTUP_LINES | SETTINGS_RESTORE_BUILD_INFO) // Enable the '$I=(string)' build info write command. If disabled, any existing build info data must // be placed into EEPROM via external means with a valid checksum value. This macro option is useful // to prevent this data from being over-written by a user, when used to store OEM product data. // NOTE: If disabled and to ensure Grbl can never alter the build info line, you'll also need to enable // the SETTING_RESTORE_ALL macro above and remove SETTINGS_RESTORE_BUILD_INFO from the mask. // NOTE: See the included grblWrite_BuildInfo.ino example file to write this string seperately. #define ENABLE_BUILD_INFO_WRITE_COMMAND // '$I=' Default enabled. Comment to disable. // AVR processors require all interrupts to be disabled during an EEPROM write. This includes both // the stepper ISRs and serial comm ISRs. In the event of a long EEPROM write, this ISR pause can // cause active stepping to lose position and serial receive data to be lost. This configuration // option forces the planner buffer to completely empty whenever the EEPROM is written to prevent // any chance of lost steps. // However, this doesn't prevent issues with lost serial RX data during an EEPROM write, especially // if a GUI is premptively filling up the serial RX buffer simultaneously. It's highly advised for // GUIs to flag these gcodes (G10,G28.1,G30.1) to always wait for an 'ok' after a block containing // one of these commands before sending more data to eliminate this issue. // NOTE: Most EEPROM write commands are implicitly blocked during a job (all '$' commands). However, // coordinate set g-code commands (G10,G28/30.1) are not, since they are part of an active streaming // job. At this time, this option only forces a planner buffer sync with these g-code commands. #define FORCE_BUFFER_SYNC_DURING_EEPROM_WRITE // Default enabled. Comment to disable. // In Grbl v0.9 and prior, there is an old outstanding bug where the `WPos:` work position reported // may not correlate to what is executing, because `WPos:` is based on the g-code parser state, which // can be several motions behind. This option forces the planner buffer to empty, sync, and stop // motion whenever there is a command that alters the work coordinate offsets `G10,G43.1,G92,G54-59`. // This is the simplest way to ensure `WPos:` is always correct. Fortunately, it's exceedingly rare // that any of these commands are used need continuous motions through them. #define FORCE_BUFFER_SYNC_DURING_WCO_CHANGE // Default enabled. Comment to disable. // By default, Grbl disables feed rate overrides for all G38.x probe cycle commands. Although this // may be different than some pro-class machine control, it's arguable that it should be this way. // Most probe sensors produce different levels of error that is dependent on rate of speed. By // keeping probing cycles to their programmed feed rates, the probe sensor should be a lot more // repeatable. If needed, you can disable this behavior by uncommenting the define below. // #define ALLOW_FEED_OVERRIDE_DURING_PROBE_CYCLES // Default disabled. Uncomment to enable. // Enables and configures parking motion methods upon a safety door state. Primarily for OEMs // that desire this feature for their integrated machines. At the moment, Grbl assumes that // the parking motion only involves one axis, although the parking implementation was written // to be easily refactored for any number of motions on different axes by altering the parking // source code. At this time, Grbl only supports parking one axis (typically the Z-axis) that // moves in the positive direction upon retracting and negative direction upon restoring position. // The motion executes with a slow pull-out retraction motion, power-down, and a fast park. // Restoring to the resume position follows these set motions in reverse: fast restore to // pull-out position, power-up with a time-out, and plunge back to the original position at the // slower pull-out rate. // NOTE: Still a work-in-progress. Machine coordinates must be in all negative space and // does not work with HOMING_FORCE_SET_ORIGIN enabled. Parking motion also moves only in // positive direction. // #define PARKING_ENABLE // Default disabled. Uncomment to enable // Configure options for the parking motion, if enabled. #define PARKING_AXIS Z_AXIS // Define which axis that performs the parking motion #define PARKING_TARGET -5.0 // Parking axis target. In mm, as machine coordinate [-max_travel,0]. #define PARKING_RATE 500.0 // Parking fast rate after pull-out in mm/min. #define PARKING_PULLOUT_RATE 100.0 // Pull-out/plunge slow feed rate in mm/min. #define PARKING_PULLOUT_INCREMENT 5.0 // Spindle pull-out and plunge distance in mm. Incremental distance. // Must be positive value or equal to zero. // Enables a special set of M-code commands that enables and disables the parking motion. // These are controlled by `M56`, `M56 P1`, or `M56 Px` to enable and `M56 P0` to disable. // The command is modal and will be set after a planner sync. Since it is g-code, it is // executed in sync with g-code commands. It is not a real-time command. // NOTE: PARKING_ENABLE is required. By default, M56 is active upon initialization. Use // DEACTIVATE_PARKING_UPON_INIT to set M56 P0 as the power-up default. // #define ENABLE_PARKING_OVERRIDE_CONTROL // Default disabled. Uncomment to enable // #define DEACTIVATE_PARKING_UPON_INIT // Default disabled. Uncomment to enable. // This option will automatically disable the laser during a feed hold by invoking a spindle stop // override immediately after coming to a stop. However, this also means that the laser still may // be reenabled by disabling the spindle stop override, if needed. This is purely a safety feature // to ensure the laser doesn't inadvertently remain powered while at a stop and cause a fire. #define DISABLE_LASER_DURING_HOLD // Default enabled. Comment to disable. // This feature alters the spindle PWM/speed to a nonlinear output with a simple piecewise linear // curve. Useful for spindles that don't produce the right RPM from Grbl's standard spindle PWM // linear model. Requires a solution by the 'fit_nonlinear_spindle.py' script in the /doc/script // folder of the repo. See file comments on how to gather spindle data and run the script to // generate a solution. // #define ENABLE_PIECEWISE_LINEAR_SPINDLE // Default disabled. Uncomment to enable. // N_PIECES, RPM_MAX, RPM_MIN, RPM_POINTxx, and RPM_LINE_XX constants are all set and given by // the 'fit_nonlinear_spindle.py' script solution. Used only when ENABLE_PIECEWISE_LINEAR_SPINDLE // is enabled. Make sure the constant values are exactly the same as the script solution. // NOTE: When N_PIECES < 4, unused RPM_LINE and RPM_POINT defines are not required and omitted. #define N_PIECES 4 // Integer (1-4). Number of piecewise lines used in script solution. #define RPM_MAX 11686.4 // Max RPM of model. $30 > RPM_MAX will be limited to RPM_MAX. #define RPM_MIN 202.5 // Min RPM of model. $31 < RPM_MIN will be limited to RPM_MIN. #define RPM_POINT12 6145.4 // Used N_PIECES >=2. Junction point between lines 1 and 2. #define RPM_POINT23 9627.8 // Used N_PIECES >=3. Junction point between lines 2 and 3. #define RPM_POINT34 10813.9 // Used N_PIECES = 4. Junction point between lines 3 and 4. #define RPM_LINE_A1 3.197101e-03 // Used N_PIECES >=1. A and B constants of line 1. #define RPM_LINE_B1 -3.526076e-1 #define RPM_LINE_A2 1.722950e-2 // Used N_PIECES >=2. A and B constants of line 2. #define RPM_LINE_B2 8.588176e+01 #define RPM_LINE_A3 5.901518e-02 // Used N_PIECES >=3. A and B constants of line 3. #define RPM_LINE_B3 4.881851e+02 #define RPM_LINE_A4 1.203413e-01 // Used N_PIECES = 4. A and B constants of line 4. #define RPM_LINE_B4 1.151360e+03 /* --------------------------------------------------------------------------------------- This optional dual axis feature is primarily for the homing cycle to locate two sides of a dual-motor gantry independently, i.e. self-squaring. This requires an additional limit switch for the cloned motor. To self square, both limit switches on the cloned axis must be physically positioned to trigger when the gantry is square. Highly recommend keeping the motors always enabled to ensure the gantry stays square with the $1=255 setting. For Grbl on the Arduino Uno, the cloned axis limit switch must to be shared with and wired with z-axis limit pin due to the lack of available pins. The homing cycle must home the z-axis and cloned axis in different cycles, which is already the default config. The dual axis feature works by cloning an axis step output onto another pair of step and direction pins. The step pulse and direction of the cloned motor can be set independently of the main axis motor. However to save precious flash and memory, this dual axis feature must share the same settings (step/mm, max speed, acceleration) as the parent motor. This is NOT a feature for an independent fourth axis. Only a motor clone. WARNING: Make sure to test the directions of your dual axis motors! They must be setup to move the same direction BEFORE running your first homing cycle or any long motion! Motors moving in opposite directions can cause serious damage to your machine! Use this dual axis feature at your own risk. */ // NOTE: This feature requires approximately 400 bytes of flash. Certain configurations can // run out of flash to fit on an Arduino 328p/Uno. Only X and Y axes are supported. Variable // spindle/laser mode IS supported, but only for one config option. Core XY, spindle direction // pin, and M7 mist coolant are disabled/not supported. // #define ENABLE_DUAL_AXIS // Default disabled. Uncomment to enable. // Select the one axis to mirror another motor. Only X and Y axis is supported at this time. #define DUAL_AXIS_SELECT X_AXIS // Must be either X_AXIS or Y_AXIS // To prevent the homing cycle from racking the dual axis, when one limit triggers before the // other due to switch failure or noise, the homing cycle will automatically abort if the second // motor's limit switch does not trigger within the three distance parameters defined below. // Axis length percent will automatically compute a fail distance as a percentage of the max // travel of the other non-dual axis, i.e. if dual axis select is X_AXIS at 5.0%, then the fail // distance will be computed as 5.0% of y-axis max travel. Fail distance max and min are the // limits of how far or little a valid fail distance is. #define DUAL_AXIS_HOMING_FAIL_AXIS_LENGTH_PERCENT 5.0 // Float (percent) #define DUAL_AXIS_HOMING_FAIL_DISTANCE_MAX 25.0 // Float (mm) #define DUAL_AXIS_HOMING_FAIL_DISTANCE_MIN 2.5 // Float (mm) // Dual axis pin configuration currently supports two shields. Uncomment the shield you want, // and comment out the other one(s). // NOTE: Protoneer CNC Shield v3.51 has A.STP and A.DIR wired to pins A4 and A3 respectively. // The variable spindle (i.e. laser mode) build option works and may be enabled or disabled. // Coolant pin A3 is moved to D13, replacing spindle direction. #define DUAL_AXIS_CONFIG_PROTONEER_V3_51 // Uncomment to select. Comment other configs. // NOTE: Arduino CNC Shield Clone (Originally Protoneer v3.0) has A.STP and A.DIR wired to // D12 and D13, respectively. With the limit pins and stepper enable pin on this same port, // the spindle enable pin had to be moved and spindle direction pin deleted. The spindle // enable pin now resides on A3, replacing coolant enable. Coolant enable is bumped over to // pin A4. Spindle enable is used far more and this pin setup helps facilitate users to // integrate this feature without arguably too much work. // Variable spindle (i.e. laser mode) does NOT work with this shield as configured. While // variable spindle technically can work with this shield, it requires too many changes for // most user setups to accomodate. It would best be implemented by sharing all limit switches // on pins D9/D10 (as [X1,Z]/[X2,Y] or [X,Y2]/[Y1,Z]), home each axis independently, and // updating lots of code to ensure everything is running correctly. // #define DUAL_AXIS_CONFIG_CNC_SHIELD_CLONE // Uncomment to select. Comment other configs. /* --------------------------------------------------------------------------------------- OEM Single File Configuration Option Instructions: Paste the cpu_map and default setting definitions below without an enclosing #ifdef. Comment out the CPU_MAP_xxx and DEFAULT_xxx defines at the top of this file, and the compiler will ignore the contents of defaults.h and cpu_map.h and use the definitions below. */ // Paste CPU_MAP definitions here. // Paste default settings definitions here. #endif