diff --git a/.gitignore b/.gitignore index 380a028506893f6ea37b7f905b4a64b9fd623e67..aa1d42424c38ae9ddbdf6052a63cbdbc294a1384 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ applet/ *.bak *.DS_Store *.idea +*.s +*.i +*.ii diff --git a/.travis.yml b/.travis.yml index 766b2933c9d3df42ac115a3868bec1bf5f7b91c7..cfcee4f775b353fd531e33078a8cb1a97de5ccd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,188 +26,144 @@ install: - mv LiquidCrystal_I2C/LiquidCrystal_I2C /usr/local/share/arduino/libraries/LiquidCrystal_I2C - git clone https://github.com/lincomatic/LiquidTWI2.git - mv LiquidTWI2 /usr/local/share/arduino/libraries/LiquidTWI2 - # Install astyle - - wget https://github.com/timonwong/astyle-mirror/archive/master.zip - - unzip master.zip - - cd astyle-mirror-master/build/gcc/ - - make prefix=$HOME astyle install before_script: # arduino requires an X server even with command line # https://github.com/arduino/Arduino/issues/1981 - Xvfb :1 -screen 0 1024x768x16 &> xvfb.log & # change back to home directory for compiling - cd $TRAVIS_BUILD_DIR - # Check style - # ~/bin/astyle --recursive --options=.astylerc "Marlin/*.h" "Marlin/*.cpp" script: - # Abort on style errors - # if [ "0" != `find . -name "*.orig" | wc -l` ] ; then echo "Improperly styled source -- run astyle" ; exit -999; fi - # Relaxed Travis check - # if [ "0" != `find . -name "*.orig" | wc -l` ] ; then echo "Improperly styled source -- run astyle" ; fi # build default config - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino - # backup configuration.h + - build_marlin + # Backup Configuration.h, Configuration_adv.h, and pins_RAMPS_14.h - cp Marlin/Configuration.h Marlin/Configuration.h.backup - cp Marlin/Configuration_adv.h Marlin/Configuration_adv.h.backup - - cp Marlin/pins_RAMPS_13.h Marlin/pins_RAMPS_13.h.backup + - cp Marlin/pins_RAMPS_14.h Marlin/pins_RAMPS_14.h.backup # add sensor for bed - - sed -i 's/#define TEMP_SENSOR_BED 0/#define TEMP_SENSOR_BED 1/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - opt_set TEMP_SENSOR_BED 1 + - build_marlin # change extruder numbers from 1 to 2 - - sed -i 's/#define MOTHERBOARD BOARD_RAMPS_13_EFB/#define MOTHERBOARD BOARD_RAMPS_13_EEB/g' Marlin/Configuration.h - - sed -i 's/#define EXTRUDERS 1/#define EXTRUDERS 2/g' Marlin/Configuration.h - - sed -i 's/#define TEMP_SENSOR_1 0/#define TEMP_SENSOR_1 1/g' Marlin/Configuration.h + - opt_set MOTHERBOARD BOARD_RAMPS_14_EEB + - opt_set EXTRUDERS 2 + - opt_set TEMP_SENSOR_1 1 #- cat Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - build_marlin # change extruder numbers from 2 to 3, needs to be a board with 3 extruders defined in pins.h - - sed -i 's/#define MOTHERBOARD BOARD_RAMPS_13_EEB/#define MOTHERBOARD BOARD_RUMBA/g' Marlin/Configuration.h - - sed -i 's/#define EXTRUDERS 2/#define EXTRUDERS 3/g' Marlin/Configuration.h - - sed -i 's/#define TEMP_SENSOR_2 0/#define TEMP_SENSOR_2 1/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - opt_set MOTHERBOARD BOARD_RUMBA + - opt_set EXTRUDERS 3 + - opt_set TEMP_SENSOR_2 1 + - build_marlin # enable PIDTEMPBED - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define PIDTEMPBED/#define PIDTEMPBED/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable PIDTEMPBED + - build_marlin # enable AUTO_BED_LEVELING - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define ENABLE_AUTO_BED_LEVELING/#define ENABLE_AUTO_BED_LEVELING/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable ENABLE_AUTO_BED_LEVELING + - build_marlin # enable AUTO_BED_LEVELING with servos - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define ENABLE_AUTO_BED_LEVELING/#define ENABLE_AUTO_BED_LEVELING/g' Marlin/Configuration.h - - sed -i 's/\/\/#define NUM_SERVOS/#define NUM_SERVOS/g' Marlin/Configuration.h - - sed -i 's/\/\/#define Z_ENDSTOP_SERVO_NR/#define Z_ENDSTOP_SERVO_NR/g' Marlin/Configuration.h - - sed -i 's/\/\/#define SERVO_ENDSTOP_ANGLES/#define SERVO_ENDSTOP_ANGLES/g' Marlin/Configuration.h - - sed -i 's/\/\/#define DEACTIVATE_SERVOS_AFTER_MOVE/#define DEACTIVATE_SERVOS_AFTER_MOVE/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable ENABLE_AUTO_BED_LEVELING NUM_SERVOS Z_ENDSTOP_SERVO_NR SERVO_ENDSTOP_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE + - build_marlin # enable EEPROM_SETTINGS & EEPROM_CHITCHAT - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define EEPROM_SETTINGS/#define EEPROM_SETTINGS/g' Marlin/Configuration.h - - sed -i 's/\/\/#define EEPROM_CHITCHAT/#define EEPROM_CHITCHAT/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT + - build_marlin ### LCDS ### # ULTIMAKERCONTROLLER - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define ULTIMAKERCONTROLLER/#define ULTIMAKERCONTROLLER/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable ULTIMAKERCONTROLLER + - build_marlin # MAKRPANEL # Needs to use melzi and sanguino hardware - #- cp Marlin/Configuration.h.backup Marlin/Configuration.h - #- sed -i 's/\/\/#define MAKRPANEL/#define MAKRPANEL/g' Marlin/Configuration.h - #- rm -rf .build/ - #- DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + #- restore_configs + #- opt_enable MAKRPANEL + #- build_marlin # REPRAP_DISCOUNT_SMART_CONTROLLER - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define REPRAP_DISCOUNT_SMART_CONTROLLER/#define REPRAP_DISCOUNT_SMART_CONTROLLER/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino - # G3D_PANE - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define G3D_PANEL/#define G3D_PANEL/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT + - build_marlin + # G3D_PANEL + - restore_configs + - opt_enable G3D_PANEL SDSUPPORT + - build_marlin # REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER/#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino - # REPRAPWORLD_KEYPAD + - restore_configs + - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + - build_marlin + # REPRAPWORLD_KEYPAD # Cant find configuration details to get it to compile - #- cp Marlin/Configuration.h.backup Marlin/Configuration.h - #- sed -i 's/\/\/#define ULTRA_LCD/#define ULTRA_LCD/g' Marlin/Configuration.h - #- sed -i 's/\/\/#define REPRAPWORLD_KEYPAD/#define REPRAPWORLD_KEYPAD/g' Marlin/Configuration.h - #- sed -i 's/\/\/#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0/#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0/g' Marlin/Configuration.h - #- rm -rf .build/ - #- DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + #- restore_configs + #- opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP + #- build_marlin # RA_CONTROL_PANEL - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define RA_CONTROL_PANEL/#define RA_CONTROL_PANEL/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable RA_CONTROL_PANEL + - build_marlin ### I2C PANELS ### # LCD_I2C_SAINSMART_YWROBOT # Failing at the moment needs different library - #- cp Marlin/Configuration.h.backup Marlin/Configuration.h - #- sed -i 's/\/\/#define LCD_I2C_SAINSMART_YWROBOT/#define LCD_I2C_SAINSMART_YWROBOT/g' Marlin/Configuration.h - #- rm -rf .build/ - #- DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + #- restore_configs + #- opt_enable LCD_I2C_SAINSMART_YWROBOT + #- build_marlin # LCD_I2C_PANELOLU2 - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define LCD_I2C_PANELOLU2/#define LCD_I2C_PANELOLU2/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable LCD_I2C_PANELOLU2 + - build_marlin # LCD_I2C_VIKI - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define LCD_I2C_VIKI/#define LCD_I2C_VIKI/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable LCD_I2C_VIKI + - build_marlin + # LCM1602 + - restore_configs + - opt_enable LCM1602 + - build_marlin + # Enable FILAMENTCHANGEENABLE + - restore_configs + - opt_enable FILAMENTCHANGEENABLE + - build_marlin # Enable filament sensor - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define FILAMENT_SENSOR/#define FILAMENT_SENSOR/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino - # Enable filament sensor with LCD display - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define ULTIMAKERCONTROLLER/#define ULTIMAKERCONTROLLER/g' Marlin/Configuration.h - - sed -i 's/\/\/#define FILAMENT_SENSOR/#define FILAMENT_SENSOR/g' Marlin/Configuration.h - - sed -i 's/\/\/#define FILAMENT_LCD_DISPLAY/#define FILAMENT_LCD_DISPLAY/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable FILAMENT_SENSOR + - build_marlin + # Enable filament sensor with LCD display + - restore_configs + - opt_enable ULTIMAKERCONTROLLER FILAMENT_SENSOR FILAMENT_LCD_DISPLAY + - build_marlin # Enable COREXY - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define COREXY/#define COREXY/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable COREXY + - build_marlin # Enable COREXZ - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define COREXZ/#define COREXZ/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - restore_configs + - opt_enable COREXZ + - build_marlin # Enable Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - sed -i 's/\/\/#define Z_DUAL_STEPPER_DRIVERS/#define Z_DUAL_STEPPER_DRIVERS/g' Marlin/Configuration_adv.h - - sed -i 's/\ \ \/\/\ \#define Z_DUAL_ENDSTOPS/#define Z_DUAL_ENDSTOPS/g' Marlin/Configuration_adv.h - - sed -i 's/#define X_MAX_PIN 2/#define X_MAX_PIN -1/g' Marlin/pins_RAMPS_13.h - - sed -i 's/\ \ \ \ \#define Z2_MAX_PIN 36/#define Z2_MAX_PIN 2/g' Marlin/Configuration_adv.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino - - cp Marlin/Configuration.h.backup Marlin/Configuration.h - - cp Marlin/Configuration_adv.h.backup Marlin/Configuration_adv.h - - cp Marlin/pins_RAMPS_13.h.backup Marlin/pins_RAMPS_13.h + - restore_configs + - opt_enable_adv Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS + - pins_set RAMPS_14 X_MAX_PIN -1 + - opt_set_adv Z2_MAX_PIN 2 + - build_marlin + - restore_configs ######## Example Configurations ############## # Delta Config (generic) - - cp Marlin/example_configurations/delta/generic/Configuration* Marlin/ - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - use_example_configs delta/generic + - build_marlin # Delta Config (generic) + ABL + ALLEN_KEY - - cp Marlin/example_configurations/delta/generic/Configuration* Marlin/ - - sed -i 's/#define DISABLE_MIN_ENDSTOPS/\/\/#define DISABLE_MIN_ENDSTOPS/g' Marlin/Configuration.h - - sed -i 's/\/\/#define AUTO_BED_LEVELING_FEATURE/#define AUTO_BED_LEVELING_FEATURE/g' Marlin/Configuration.h - - sed -i 's/\/\/#define Z_PROBE_ALLEN_KEY/#define Z_PROBE_ALLEN_KEY/g' Marlin/Configuration.h - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - use_example_configs delta/generic + - opt_disable DISABLE_MIN_ENDSTOPS + - opt_enable AUTO_BED_LEVELING_FEATURE Z_PROBE_ALLEN_KEY + - build_marlin # Delta Config (Mini Kossel) - - cp Marlin/example_configurations/delta/kossel_mini/Configuration* Marlin/ - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - use_example_configs delta/kossel_mini + - build_marlin # Makibox Config need to check board type for Teensy++ 2.0 - #- cp Marlin/example_configurations/makibox/Configuration* Marlin/ - #- rm -rf .build/ - #- DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + #- use_example_configs makibox + #- build_marlin # SCARA Config - - cp Marlin/example_configurations/SCARA/Configuration* Marlin/ - - rm -rf .build/ - - DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + - use_example_configs SCARA + - build_marlin # tvrrug Config need to check board type for sanguino atmega644p - #- cp Marlin/example_configurations/tvrrug/Round2/Configuration* Marlin/ - #- rm -rf .build/ - #- DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino + #- use_example_configs tvrrug/Round2 + #- build_marlin ######## Board Types ############# diff --git a/ArduinoAddons/Arduino_1.6.x/hardware/marlin/avr/boards.txt b/ArduinoAddons/Arduino_1.6.x/hardware/marlin/avr/boards.txt index e1e1a7a320ae913291a61ecaa6e8455e65e7ac86..fd3c85af6e344be550b0bfcc55c4d1187addc3a1 100644 --- a/ArduinoAddons/Arduino_1.6.x/hardware/marlin/avr/boards.txt +++ b/ArduinoAddons/Arduino_1.6.x/hardware/marlin/avr/boards.txt @@ -95,7 +95,7 @@ rambo.build.variant=rambo sanguino.name=Sanguino sanguino.upload.tool=arduino:avrdude -sanguino.upload.protocol=stk500 +sanguino.upload.protocol=arduino sanguino.upload.maximum_size=131072 sanguino.upload.speed=57600 diff --git a/LinuxAddons/bin/build_marlin b/LinuxAddons/bin/build_marlin new file mode 100755 index 0000000000000000000000000000000000000000..3af5aa12e1d67a503e79c8006bfa83e46b8a0c49 --- /dev/null +++ b/LinuxAddons/bin/build_marlin @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +rm -rf .build/ +DISPLAY=:1.0 ~/bin/arduino --verify --board marlin:avr:mega Marlin/Marlin.ino diff --git a/LinuxAddons/bin/opt_disable b/LinuxAddons/bin/opt_disable new file mode 100755 index 0000000000000000000000000000000000000000..36646dbe608b79519952723251e22a0f0b09604e --- /dev/null +++ b/LinuxAddons/bin/opt_disable @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +for opt in "$@" ; do + eval "sed -i 's/\(\/\/ *\)*\(\#define *$opt\)/\/\/\2/g' Marlin/Configuration.h" +done diff --git a/LinuxAddons/bin/opt_enable b/LinuxAddons/bin/opt_enable new file mode 100755 index 0000000000000000000000000000000000000000..42233f0635416ea02362cb16239bdc57774fbdf9 --- /dev/null +++ b/LinuxAddons/bin/opt_enable @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +for opt in "$@" ; do + eval "sed -i 's/\/\/ *\(#define *$opt\)/\1/g' Marlin/Configuration.h" +done diff --git a/LinuxAddons/bin/opt_enable_adv b/LinuxAddons/bin/opt_enable_adv new file mode 100755 index 0000000000000000000000000000000000000000..89dfce12192745c2dda84ce672f6737700fc5833 --- /dev/null +++ b/LinuxAddons/bin/opt_enable_adv @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +for opt in "$@" ; do + eval "sed -i 's/\/\/ *\(#define *$opt\)/\1/g' Marlin/Configuration_adv.h" +done diff --git a/LinuxAddons/bin/opt_set b/LinuxAddons/bin/opt_set new file mode 100755 index 0000000000000000000000000000000000000000..fda7f379a096974b7ad687ffa0e88529d72a404f --- /dev/null +++ b/LinuxAddons/bin/opt_set @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "sed -i 's/\(#define *$1\) *.*$/\1 $2/g' Marlin/Configuration.h" diff --git a/LinuxAddons/bin/opt_set_adv b/LinuxAddons/bin/opt_set_adv new file mode 100755 index 0000000000000000000000000000000000000000..9ce1e4ca7c655d78fef25371514184e876179269 --- /dev/null +++ b/LinuxAddons/bin/opt_set_adv @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "sed -i 's/\(#define *$1\) *.*$/\1 $2/g' Marlin/Configuration_adv.h" diff --git a/LinuxAddons/bin/pins_set b/LinuxAddons/bin/pins_set new file mode 100755 index 0000000000000000000000000000000000000000..4fe401c6ae4c690dc6b6f3bb90ac9152f965765d --- /dev/null +++ b/LinuxAddons/bin/pins_set @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "sed -i 's/\(#define *$2\) *.*$/\1 $3/g' Marlin/pins_$1.h" diff --git a/LinuxAddons/bin/restore_configs b/LinuxAddons/bin/restore_configs new file mode 100755 index 0000000000000000000000000000000000000000..ca77e556ae1a4b645e81edec98f208ffb9ac3b99 --- /dev/null +++ b/LinuxAddons/bin/restore_configs @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cp Marlin/Configuration.h.backup Marlin/Configuration.h +cp Marlin/Configuration_adv.h.backup Marlin/Configuration_adv.h +cp Marlin/pins_RAMPS_14.h.backup Marlin/pins_RAMPS_14.h diff --git a/LinuxAddons/bin/use_example_configs b/LinuxAddons/bin/use_example_configs new file mode 100755 index 0000000000000000000000000000000000000000..d1e6e468f2735963aa5645024b96d1ddd788e51d --- /dev/null +++ b/LinuxAddons/bin/use_example_configs @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "cp Marlin/example_configurations/$1/Configuration* Marlin/" diff --git a/Marlin/Conditionals.h b/Marlin/Conditionals.h index 979ddb791fba416a09d1da473e657b6b3557cfe8..824252ac6fa182e2d2465e585bfd3c12249ffc90 100644 --- a/Marlin/Conditionals.h +++ b/Marlin/Conditionals.h @@ -45,11 +45,26 @@ #define DOGLCD // Support for I2C LCD 128x64 (Controller SSD1306 graphic Display Family) #endif - #if ENABLED(PANEL_ONE) #define ULTIMAKERCONTROLLER #endif + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + + #ifndef ENCODER_PULSES_PER_STEP + #define ENCODER_PULSES_PER_STEP 4 + #endif + + #ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM 1 + #endif + + #ifndef LONG_FILENAME_HOST_SUPPORT + #define LONG_FILENAME_HOST_SUPPORT + #endif + #endif + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define DOGLCD #define U8GLIB_ST7920 @@ -135,28 +150,35 @@ // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection #if ENABLED(SAV_3DLCD) - #define SR_LCD_2W_NL // Non latching 2 wire shiftregister + #define SR_LCD_2W_NL // Non latching 2 wire shift register #define ULTIPANEL #define NEWPANEL #endif + #if ENABLED(DOGLCD) // Change number of lines to match the DOG graphic display + #ifndef LCD_WIDTH + #define LCD_WIDTH 22 + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 5 + #endif + #endif + #if ENABLED(ULTIPANEL) #define NEWPANEL //enable this if you have a click-encoder panel #define ULTRA_LCD - #if ENABLED(DOGLCD) // Change number of lines to match the DOG graphic display - #define LCD_WIDTH 22 - #define LCD_HEIGHT 5 - #else + #ifndef LCD_WIDTH #define LCD_WIDTH 20 + #endif + #ifndef LCD_HEIGHT #define LCD_HEIGHT 4 #endif #else //no panel but just LCD #if ENABLED(ULTRA_LCD) - #if ENABLED(DOGLCD) // Change number of lines to match the 128x64 graphics display - #define LCD_WIDTH 22 - #define LCD_HEIGHT 5 - #else + #ifndef LCD_WIDTH #define LCD_WIDTH 16 + #endif + #ifndef LCD_HEIGHT #define LCD_HEIGHT 2 #endif #endif @@ -242,9 +264,20 @@ /** * Axis lengths */ - #define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) - #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) - #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) + #define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) + #define Y_MAX_LENGTH (Y_MAX_POS - (Y_MIN_POS)) + #define Z_MAX_LENGTH (Z_MAX_POS - (Z_MIN_POS)) + + /** + * CoreXY and CoreXZ + */ + #if ENABLED(COREXY) + #define CORE_AXIS_2 B_AXIS + #define CORE_AXIS_3 Z_AXIS + #elif ENABLED(COREXZ) + #define CORE_AXIS_2 C_AXIS + #define CORE_AXIS_3 Y_AXIS + #endif /** * SCARA @@ -263,8 +296,8 @@ #define Z_HOME_POS MANUAL_Z_HOME_POS #else //!MANUAL_HOME_POSITIONS – Use home switch positions based on homing direction and travel limits #if ENABLED(BED_CENTER_AT_0_0) - #define X_HOME_POS X_MAX_LENGTH * X_HOME_DIR * 0.5 - #define Y_HOME_POS Y_MAX_LENGTH * Y_HOME_DIR * 0.5 + #define X_HOME_POS (X_MAX_LENGTH) * (X_HOME_DIR) * 0.5 + #define Y_HOME_POS (Y_MAX_LENGTH) * (Y_HOME_DIR) * 0.5 #else #define X_HOME_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) @@ -292,6 +325,13 @@ #define Z_SAFE_HOMING #endif + /** + * Avoid double-negatives for enabling features + */ + #if DISABLED(DISABLE_HOST_KEEPALIVE) + #define HOST_KEEPALIVE_FEATURE + #endif + /** * MAX_STEP_FREQUENCY differs for TOSHIBA */ @@ -312,14 +352,30 @@ * Advance calculated values */ #if ENABLED(ADVANCE) - #define EXTRUSION_AREA (0.25 * D_FILAMENT * D_FILAMENT * M_PI) - #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS] / EXTRUSION_AREA) + #define EXTRUSION_AREA (0.25 * (D_FILAMENT) * (D_FILAMENT) * M_PI) + #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS] / (EXTRUSION_AREA)) #endif #if ENABLED(ULTIPANEL) && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) #undef SD_DETECT_INVERTED #endif + /** + * Set defaults for missing (newer) options + */ + #ifndef DISABLE_INACTIVE_X + #define DISABLE_INACTIVE_X DISABLE_X + #endif + #ifndef DISABLE_INACTIVE_Y + #define DISABLE_INACTIVE_Y DISABLE_Y + #endif + #ifndef DISABLE_INACTIVE_Z + #define DISABLE_INACTIVE_Z DISABLE_Z + #endif + #ifndef DISABLE_INACTIVE_E + #define DISABLE_INACTIVE_E DISABLE_E + #endif + // Power Signal Control Definitions // By default use ATX definition #ifndef POWER_SUPPLY @@ -337,7 +393,10 @@ /** * Temp Sensor defines */ - #if TEMP_SENSOR_0 == -2 + #if TEMP_SENSOR_0 == -3 + #define HEATER_0_USES_MAX6675 + #define MAX6675_IS_MAX31855 + #elif TEMP_SENSOR_0 == -2 #define HEATER_0_USES_MAX6675 #elif TEMP_SENSOR_0 == -1 #define HEATER_0_USES_AD595 @@ -422,7 +481,9 @@ #define HAS_AUTO_FAN_2 (PIN_EXISTS(EXTRUDER_2_AUTO_FAN)) #define HAS_AUTO_FAN_3 (PIN_EXISTS(EXTRUDER_3_AUTO_FAN)) #define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3) - #define HAS_FAN (PIN_EXISTS(FAN)) + #define HAS_FAN0 (PIN_EXISTS(FAN)) + #define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLERFAN_PIN != FAN1_PIN && EXTRUDER_0_AUTO_FAN_PIN != FAN1_PIN && EXTRUDER_1_AUTO_FAN_PIN != FAN1_PIN && EXTRUDER_2_AUTO_FAN_PIN != FAN1_PIN) + #define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLERFAN_PIN != FAN2_PIN && EXTRUDER_0_AUTO_FAN_PIN != FAN2_PIN && EXTRUDER_1_AUTO_FAN_PIN != FAN2_PIN && EXTRUDER_2_AUTO_FAN_PIN != FAN2_PIN) #define HAS_CONTROLLERFAN (PIN_EXISTS(CONTROLLERFAN)) #define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0) #define HAS_SERVO_0 (PIN_EXISTS(SERVO0)) @@ -462,6 +523,7 @@ #define HAS_E1_ENABLE (PIN_EXISTS(E1_ENABLE)) #define HAS_E2_ENABLE (PIN_EXISTS(E2_ENABLE)) #define HAS_E3_ENABLE (PIN_EXISTS(E3_ENABLE)) + #define HAS_E4_ENABLE (PIN_EXISTS(E4_ENABLE)) #define HAS_X_DIR (PIN_EXISTS(X_DIR)) #define HAS_X2_DIR (PIN_EXISTS(X2_DIR)) #define HAS_Y_DIR (PIN_EXISTS(Y_DIR)) @@ -472,6 +534,7 @@ #define HAS_E1_DIR (PIN_EXISTS(E1_DIR)) #define HAS_E2_DIR (PIN_EXISTS(E2_DIR)) #define HAS_E3_DIR (PIN_EXISTS(E3_DIR)) + #define HAS_E4_DIR (PIN_EXISTS(E4_DIR)) #define HAS_X_STEP (PIN_EXISTS(X_STEP)) #define HAS_X2_STEP (PIN_EXISTS(X2_STEP)) #define HAS_Y_STEP (PIN_EXISTS(Y_STEP)) @@ -482,6 +545,7 @@ #define HAS_E1_STEP (PIN_EXISTS(E1_STEP)) #define HAS_E2_STEP (PIN_EXISTS(E2_STEP)) #define HAS_E3_STEP (PIN_EXISTS(E3_STEP)) + #define HAS_E4_STEP (PIN_EXISTS(E4_STEP)) /** * Helper Macros for heaters and extruder fan @@ -504,9 +568,31 @@ #if HAS_HEATER_BED #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v) #endif - #if HAS_FAN + + /** + * Up to 3 PWM fans + */ + #if HAS_FAN2 + #define FAN_COUNT 3 + #elif HAS_FAN1 + #define FAN_COUNT 2 + #elif HAS_FAN0 + #define FAN_COUNT 1 + #else + #define FAN_COUNT 0 + #endif + + #if HAS_FAN0 #define WRITE_FAN(v) WRITE(FAN_PIN, v) + #define WRITE_FAN0(v) WRITE_FAN(v) + #endif + #if HAS_FAN1 + #define WRITE_FAN1(v) WRITE(FAN1_PIN, v) #endif + #if HAS_FAN2 + #define WRITE_FAN2(v) WRITE(FAN2_PIN, v) + #endif + #define WRITE_FAN_N(n, v) WRITE_FAN##n(v) #define HAS_BUZZER (PIN_EXISTS(BEEPER) || defined(LCD_USE_I2C_BUZZER)) @@ -526,5 +612,10 @@ #endif #endif + #if ( (HAS_Z_MIN && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) || HAS_Z_PROBE ) && \ + ( ENABLED(FIX_MOUNTED_PROBE) || defined(Z_ENDSTOP_SERVO_NR) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED) ) + #define HAS_Z_MIN_PROBE + #endif + #endif //CONFIGURATION_LCD #endif //CONDITIONALS_H diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c4fa028cec7f8b59adf96fc5a7b6ff9c5914e25b..fff1dd56775bccc451a6cfdac5791ceada719927 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -341,10 +337,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -354,11 +392,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -381,6 +421,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -416,24 +458,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -444,7 +488,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -456,7 +500,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -478,25 +522,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -504,17 +560,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. - //#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. + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#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. - //If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing, - //it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -528,37 +596,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -632,6 +669,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -652,13 +697,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -666,12 +711,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -688,13 +733,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -709,7 +754,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -732,6 +777,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -743,9 +790,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs //#define LCD_I2C_VIKI - + // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -757,7 +804,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -839,19 +886,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 51141fc3c10ba00f6d84d0fa05c3863a1d145ebc..5328a74174ccc177140199b8b05fdbf50fe1d6d6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,11 +40,19 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius @@ -52,7 +74,7 @@ * The maximum buffered steps/sec of the extruder motor is called "se". * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* + * mintemp and maxtemp. Turn this off by executing M109 without F* * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode */ @@ -137,7 +159,7 @@ #if ENABLED(Z_DUAL_STEPPER_DRIVERS) // Z_DUAL_ENDSTOPS is a feature to enable the use of 2 endstops for both Z steppers - Let's call them Z stepper and Z2 stepper. - // That way the machine is capable to align the bed during home, since both Z steppers are homed. + // That way the machine is capable to align the bed during home, since both Z steppers are homed. // There is also an implementation of M666 (software endstops adjustment) to this feature. // After Z homing, this adjustment is applied to just one of the steppers in order to align the bed. // One just need to home the Z axis and measure the distance difference between both Z axis and apply the math: Z adjust = Z - Z2. @@ -232,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. -#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -268,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -335,8 +366,8 @@ // save 3120 bytes of PROGMEM by commenting out #define USE_BIG_EDIT_FONT // we don't have a big font for Cyrillic, Kana //#define USE_BIG_EDIT_FONT - - // If you have spare 2300Byte of progmem and want to use a + + // If you have spare 2300Byte of progmem and want to use a // smaller font on the Info-screen uncomment the next line. //#define USE_SMALL_INFOFONT #endif // DOGLCD @@ -344,13 +375,13 @@ // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -361,7 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions - //not implemented for CoreXY and deltabots! + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -380,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -389,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -461,8 +491,8 @@ const unsigned int dropsegments=5; //everything with less than this number of st #endif /******************************************************************************\ - * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * enable this section if you have TMC26X motor drivers. + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -470,61 +500,61 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps - -//#define X2_IS_TMC + + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps - -//#define Y_IS_TMC + + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps - -//#define Y2_IS_TMC + + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms - #define Y2_MICROSTEPS 16 //number of microsteps - -//#define Z_IS_TMC + #define Y2_MICROSTEPS 16 //number of microsteps + + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps - -//#define Z2_IS_TMC + + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps - -//#define E0_IS_TMC + + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps - -//#define E1_IS_TMC + + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms - #define E1_MICROSTEPS 16 //number of microsteps - -//#define E2_IS_TMC + #define E1_MICROSTEPS 16 //number of microsteps + + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms - #define E2_MICROSTEPS 16 //number of microsteps - -//#define E3_IS_TMC + #define E2_MICROSTEPS 16 //number of microsteps + + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms - #define E3_MICROSTEPS 16 //number of microsteps + #define E3_MICROSTEPS 16 //number of microsteps #endif /******************************************************************************\ - * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * enable this section if you have L6470 motor drivers. + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -532,69 +562,66 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define X2_IS_L6470 + + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Y_IS_L6470 + + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Y2_IS_L6470 - #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + + //#define Y2_IS_L6470 + #define Y2_MICROSTEPS 16 //number of microsteps + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off - #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Z_IS_L6470 + #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Z2_IS_L6470 + + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E0_IS_L6470 + + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E1_IS_L6470 - #define E1_MICROSTEPS 16 //number of microsteps + + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E2_IS_L6470 - #define E2_MICROSTEPS 16 //number of microsteps + + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E3_IS_L6470 - #define E3_MICROSTEPS 16 //number of microsteps + + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall - + #endif #include "Conditionals.h" diff --git a/Marlin/Default_Version.h b/Marlin/Default_Version.h index ea5727fba8bd93c694e15a0ba1581d1d2bd17150..b27b997e6723948135a5e834ab06407eeb66c76e 100644 --- a/Marlin/Default_Version.h +++ b/Marlin/Default_Version.h @@ -6,9 +6,9 @@ // #error "You must specify the following parameters related to your distribution" #if true -#define SHORT_BUILD_VERSION "1.1.0-RC3" -#define DETAILED_BUILD_VERSION "1.1.0-RC3 From Archive" -#define STRING_DISTRIBUTION_DATE "2015-12-01 12:00" +#define SHORT_BUILD_VERSION "1.1.0-RC4" +#define DETAILED_BUILD_VERSION "1.1.0-RC4 From Archive" +#define STRING_DISTRIBUTION_DATE "2016-03-07 12:00" // It might also be appropriate to define a location where additional information can be found -#define SOURCE_CODE_URL "http:// ..." +// #define SOURCE_CODE_URL "http:// ..." #endif \ No newline at end of file diff --git a/Marlin/Makefile b/Marlin/Makefile index 68b0de0ba13afe470c4f20da883235e18cfaf1f8..27cc5a7c5f3ec9f5a1c9db8bbadaaee60528f52a 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -12,14 +12,14 @@ # # Detailed instructions for using the makefile: # -# 1. Modify the line containg "ARDUINO_INSTALL_DIR" to point to the directory that +# 1. Modify the line containing "ARDUINO_INSTALL_DIR" to point to the directory that # contains the Arduino installation (for example, under Mac OS X, this # might be /Applications/Arduino.app/Contents/Resources/Java). # # 2. Modify the line containing "UPLOAD_PORT" to refer to the filename # representing the USB or serial connection to your Arduino board # (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file -# changes, you can use * as a wildcard (e.g. UPLOAD_PORT = /dev/tty.usb*). +# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*). # # 3. Set the line containing "MCU" to match your board's processor. # Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth @@ -163,6 +163,9 @@ MCU ?= at90usb1286 else ifeq ($(HARDWARE_MOTHERBOARD),81) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),811) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 else ifeq ($(HARDWARE_MOTHERBOARD),82) HARDWARE_VARIANT ?= Teensy MCU ?= at90usb646 @@ -218,7 +221,7 @@ endif # Set to 16Mhz if not yet set. F_CPU ?= 16000000 -# Arduino containd the main source code for the Arduino +# Arduino contained the main source code for the Arduino # Libraries, the "hardware variant" are for boards # that derives from that, and their source are present in # the main Marlin source directory @@ -287,7 +290,7 @@ CXXSRC = WMath.cpp WString.cpp Print.cpp Marlin_main.cpp \ SdFile.cpp SdVolume.cpp planner.cpp stepper.cpp \ temperature.cpp cardreader.cpp configuration_store.cpp \ watchdog.cpp SPI.cpp servo.cpp Tone.cpp ultralcd.cpp digipot_mcp4451.cpp \ - vector_3.cpp qr_solve.cpp buzzer.cpp + dac_mcp4728.cpp vector_3.cpp qr_solve.cpp buzzer.cpp ifeq ($(LIQUID_TWI2), 0) CXXSRC += LiquidCrystal.cpp else @@ -300,7 +303,7 @@ SRC += twi.c CXXSRC += Wire.cpp endif -#Check for Arduino 1.0.0 or higher and use the correct sourcefiles for that version +#Check for Arduino 1.0.0 or higher and use the correct source files for that version ifeq ($(shell [ $(ARDUINO_VERSION) -ge 100 ] && echo true), true) CXXSRC += main.cpp else @@ -421,7 +424,7 @@ lss: $(BUILD_DIR)/$(TARGET).lss sym: $(BUILD_DIR)/$(TARGET).sym # Program the device. -# Do not try to reset an arduino if it's not one +# Do not try to reset an Arduino if it's not one upload: $(BUILD_DIR)/$(TARGET).hex ifeq (${AVRDUDE_PROGRAMMER}, arduino) stty hup < $(UPLOAD_PORT); true diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index b25df0607f9b26011ccb9c8bccd9f3b72cbe9f06..35ab606d2d90e2865ef98757e513152b12840e5b 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -6,7 +6,7 @@ #define FORCE_INLINE __attribute__((always_inline)) inline /** - * Compiler warning on unused varable. + * Compiler warning on unused variable. */ #define UNUSED(x) (void) (x) @@ -45,13 +45,6 @@ typedef unsigned long millis_t; #include "MarlinSerial.h" -#ifndef cbi - #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) -#endif -#ifndef sbi - #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif - #include "WString.h" #ifdef USBCON @@ -110,7 +103,11 @@ FORCE_INLINE void serialprintPGM(const char* str) { void get_command(); -void idle(); // the standard idle routine calls manage_inactivity(false) +void idle( + #if ENABLED(FILAMENTCHANGEENABLE) + bool no_stepper_sleep=false // pass true to keep steppers from disabling on timeout + #endif +); void manage_inactivity(bool ignore_stepper_queue = false); @@ -217,12 +214,12 @@ void Stop(); * Debug flags - not yet widely applied */ enum DebugFlags { - DEBUG_ECHO = BIT(0), - DEBUG_INFO = BIT(1), - DEBUG_ERRORS = BIT(2), - DEBUG_DRYRUN = BIT(3), - DEBUG_COMMUNICATION = BIT(4), - DEBUG_LEVELING = BIT(5) + DEBUG_ECHO = _BV(0), + DEBUG_INFO = _BV(1), + DEBUG_ERRORS = _BV(2), + DEBUG_DRYRUN = _BV(3), + DEBUG_COMMUNICATION = _BV(4), + DEBUG_LEVELING = _BV(5) }; extern uint8_t marlin_debug_flags; @@ -230,8 +227,9 @@ extern bool Running; inline bool IsRunning() { return Running; } inline bool IsStopped() { return !Running; } -bool enqueuecommand(const char* cmd); //put a single ASCII command at the end of the current buffer or return false when it is full -void enqueuecommands_P(const char* cmd); //put one or many ASCII commands at the end of the current buffer, read from flash +bool enqueue_and_echo_command(const char* cmd, bool say_ok=false); //put a single ASCII command at the end of the current buffer or return false when it is full +void enqueue_and_echo_command_now(const char* cmd); // enqueue now, only return when the command has been enqueued +void enqueue_and_echo_commands_P(const char* cmd); //put one or many ASCII commands at the end of the current buffer, read from flash void prepare_arc_move(char isclockwise); void clamp_to_software_endstops(float target[3]); @@ -259,11 +257,9 @@ extern float home_offset[3]; // axis[n].home_offset extern float min_pos[3]; // axis[n].min_pos extern float max_pos[3]; // axis[n].max_pos extern bool axis_known_position[3]; // axis[n].is_known +extern bool axis_homed[3]; // axis[n].is_homed #if ENABLED(DELTA) - extern float delta[3]; - extern float endstop_adj[3]; // axis[n].endstop_adj - extern float delta_radius; #ifndef DELTA_RADIUS_TRIM_TOWER_1 #define DELTA_RADIUS_TRIM_TOWER_1 0.0 #endif @@ -273,7 +269,6 @@ extern bool axis_known_position[3]; // axis[n].is_known #ifndef DELTA_RADIUS_TRIM_TOWER_3 #define DELTA_RADIUS_TRIM_TOWER_3 0.0 #endif - extern float delta_diagonal_rod; #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER_1 #define DELTA_DIAGONAL_ROD_TRIM_TOWER_1 0.0 #endif @@ -283,7 +278,14 @@ extern bool axis_known_position[3]; // axis[n].is_known #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER_3 #define DELTA_DIAGONAL_ROD_TRIM_TOWER_3 0.0 #endif + extern float delta[3]; + extern float endstop_adj[3]; // axis[n].endstop_adj + extern float delta_radius; + extern float delta_diagonal_rod; extern float delta_segments_per_second; + extern float delta_diagonal_rod_trim_tower_1; + extern float delta_diagonal_rod_trim_tower_2; + extern float delta_diagonal_rod_trim_tower_3; void calculate_delta(float cartesian[3]); void recalc_delta_settings(float radius, float diagonal_rod); #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -308,19 +310,17 @@ extern bool axis_known_position[3]; // axis[n].is_known extern float extrude_min_temp; #endif -extern int fanSpeed; +#if FAN_COUNT > 0 + extern int fanSpeeds[FAN_COUNT]; +#endif #if ENABLED(BARICUDA) extern int ValvePressure; extern int EtoPPressure; #endif -#if ENABLED(FAN_SOFT_PWM) - extern unsigned char fanSpeedSoftPwm; -#endif - #if ENABLED(FILAMENT_SENSOR) - extern float filament_width_nominal; //holds the theoretical filament diameter ie., 3.00 or 1.75 + extern float filament_width_nominal; //holds the theoretical filament diameter i.e., 3.00 or 1.75 extern bool filament_sensor; //indicates that filament sensor readings should control extrusion extern float filament_width_meas; //holds the filament diameter as accurately measured extern signed char measurement_delay[]; //ring buffer to delay measurement @@ -351,6 +351,15 @@ extern uint8_t active_extruder; extern void digipot_i2c_init(); #endif +#if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) + void print_heaterstates(); +#endif + extern void calculate_volumetric_multipliers(); +// Print job timer related functions +millis_t print_job_timer(); +bool print_job_start(millis_t t = 0); +bool print_job_stop(bool force = false); + #endif //MARLIN_H diff --git a/Marlin/Marlin.ino b/Marlin/Marlin.ino index 09e73dcc183bd3730bb0f25074d446ef92e8b763..7450ee1fd0c946ce5735a93c2ee6d8e8249b5958 100644 --- a/Marlin/Marlin.ino +++ b/Marlin/Marlin.ino @@ -40,6 +40,10 @@ #elif ENABLED(LCD_I2C_TYPE_MCP23017) || ENABLED(LCD_I2C_TYPE_MCP23008) #include <Wire.h> #include <LiquidTWI2.h> + #elif ENABLED(LCM1602) + #include <Wire.h> + #include <LCD.h> + #include <LiquidCrystal_I2C.h> #elif ENABLED(DOGLCD) #include <U8glib.h> // library for graphics LCD by Oli Kraus (https://code.google.com/p/u8glib/) #else diff --git a/Marlin/MarlinSerial.cpp b/Marlin/MarlinSerial.cpp index ad23a062051a64d3063ffe5a35e77dbc69dfd755..b35ece685264311bbdcbfb59a8f9c3e140ea4e93 100644 --- a/Marlin/MarlinSerial.cpp +++ b/Marlin/MarlinSerial.cpp @@ -33,16 +33,19 @@ #endif FORCE_INLINE void store_char(unsigned char c) { - int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != rx_buffer.tail) { - rx_buffer.buffer[rx_buffer.head] = c; - rx_buffer.head = i; - } + CRITICAL_SECTION_START; + uint8_t h = rx_buffer.head; + uint8_t i = (uint8_t)(h + 1) & (RX_BUFFER_SIZE - 1); + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != rx_buffer.tail) { + rx_buffer.buffer[h] = c; + rx_buffer.head = i; + } + CRITICAL_SECTION_END; } @@ -76,7 +79,7 @@ void MarlinSerial::begin(long baud) { #endif if (useU2X) { - M_UCSRxA = BIT(M_U2Xx); + M_UCSRxA = _BV(M_U2Xx); baud_setting = (F_CPU / 4 / baud - 1) / 2; } else { @@ -88,50 +91,56 @@ void MarlinSerial::begin(long baud) { M_UBRRxH = baud_setting >> 8; M_UBRRxL = baud_setting; - sbi(M_UCSRxB, M_RXENx); - sbi(M_UCSRxB, M_TXENx); - sbi(M_UCSRxB, M_RXCIEx); + SBI(M_UCSRxB, M_RXENx); + SBI(M_UCSRxB, M_TXENx); + SBI(M_UCSRxB, M_RXCIEx); } void MarlinSerial::end() { - cbi(M_UCSRxB, M_RXENx); - cbi(M_UCSRxB, M_TXENx); - cbi(M_UCSRxB, M_RXCIEx); + CBI(M_UCSRxB, M_RXENx); + CBI(M_UCSRxB, M_TXENx); + CBI(M_UCSRxB, M_RXCIEx); } int MarlinSerial::peek(void) { - if (rx_buffer.head == rx_buffer.tail) { - return -1; + int v; + CRITICAL_SECTION_START; + uint8_t t = rx_buffer.tail; + if (rx_buffer.head == t) { + v = -1; } else { - return rx_buffer.buffer[rx_buffer.tail]; + v = rx_buffer.buffer[t]; } + CRITICAL_SECTION_END; + return v; } int MarlinSerial::read(void) { - // if the head isn't ahead of the tail, we don't have any characters - if (rx_buffer.head == rx_buffer.tail) { - return -1; + int v; + CRITICAL_SECTION_START; + uint8_t t = rx_buffer.tail; + if (rx_buffer.head == t) { + v = -1; } else { - unsigned char c = rx_buffer.buffer[rx_buffer.tail]; - rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE; - return c; + v = rx_buffer.buffer[t]; + rx_buffer.tail = (uint8_t)(t + 1) & (RX_BUFFER_SIZE - 1); } + CRITICAL_SECTION_END; + return v; } void MarlinSerial::flush() { - // don't reverse this or there may be problems if the RX interrupt - // occurs after reading the value of rx_buffer_head but before writing - // the value to rx_buffer_tail; the previous value of rx_buffer_head - // may be written to rx_buffer_tail, making it appear as if the buffer // don't reverse this or there may be problems if the RX interrupt // occurs after reading the value of rx_buffer_head but before writing // the value to rx_buffer_tail; the previous value of rx_buffer_head // may be written to rx_buffer_tail, making it appear as if the buffer // were full, not empty. - rx_buffer.head = rx_buffer.tail; + CRITICAL_SECTION_START; + rx_buffer.head = rx_buffer.tail; + CRITICAL_SECTION_END; } diff --git a/Marlin/MarlinSerial.h b/Marlin/MarlinSerial.h index c59884a2879216f78baf0db92b66e652d71c77d1..1c4cf9ed68004fb89de9a0a86923c0764be1b88a 100644 --- a/Marlin/MarlinSerial.h +++ b/Marlin/MarlinSerial.h @@ -23,6 +23,12 @@ #define MarlinSerial_h #include "Marlin.h" +#ifndef CRITICAL_SECTION_START + #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); + #define CRITICAL_SECTION_END SREG = _sreg; +#endif + + #ifndef SERIAL_PORT #define SERIAL_PORT 0 #endif @@ -69,13 +75,18 @@ // using a ring buffer (I think), in which rx_buffer_head is the index of the // location to which to write the next incoming character and rx_buffer_tail // is the index of the location from which to read. -#define RX_BUFFER_SIZE 128 - +// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256) +#ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 +#endif +#if !((RX_BUFFER_SIZE == 256) ||(RX_BUFFER_SIZE == 128) ||(RX_BUFFER_SIZE == 64) ||(RX_BUFFER_SIZE == 32) ||(RX_BUFFER_SIZE == 16) ||(RX_BUFFER_SIZE == 8) ||(RX_BUFFER_SIZE == 4) ||(RX_BUFFER_SIZE == 2)) + #error RX_BUFFER_SIZE has to be a power of 2 and >= 2 +#endif struct ring_buffer { unsigned char buffer[RX_BUFFER_SIZE]; - int head; - int tail; + volatile uint8_t head; + volatile uint8_t tail; }; #if UART_PRESENT(SERIAL_PORT) @@ -92,8 +103,12 @@ class MarlinSerial { //: public Stream int read(void); void flush(void); - FORCE_INLINE int available(void) { - return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE; + FORCE_INLINE uint8_t available(void) { + CRITICAL_SECTION_START; + uint8_t h = rx_buffer.head; + uint8_t t = rx_buffer.tail; + CRITICAL_SECTION_END; + return (uint8_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); } FORCE_INLINE void write(uint8_t c) { @@ -105,16 +120,19 @@ class MarlinSerial { //: public Stream FORCE_INLINE void checkRx(void) { if (TEST(M_UCSRxA, M_RXCx)) { unsigned char c = M_UDRx; - int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != rx_buffer.tail) { - rx_buffer.buffer[rx_buffer.head] = c; - rx_buffer.head = i; - } + CRITICAL_SECTION_START; + uint8_t h = rx_buffer.head; + uint8_t i = (uint8_t)(h + 1) & (RX_BUFFER_SIZE - 1); + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != rx_buffer.tail) { + rx_buffer.buffer[h] = c; + rx_buffer.head = i; + } + CRITICAL_SECTION_END; } } diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 1de6a9fec9ace45eafaeaee3f0c7b471f036169f..27f16b99c44075c083b67b08fd28a9482e861487 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -68,13 +68,17 @@ #include <SPI.h> #endif +#if ENABLED(DAC_STEPPER_CURRENT) + #include "stepper_dac.h" +#endif + /** * Look here for descriptions of G-codes: * - http://linuxcnc.org/handbook/gcode/g-code.html * - http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes * * Help us document these G-codes online: - * - http://marlinfirmware.org/index.php/G-Code + * - https://github.com/MarlinFirmware/Marlin/wiki/G-Code-in-Marlin * - http://reprap.org/wiki/G-code * * ----------------- @@ -203,6 +207,8 @@ * M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ] * M907 - Set digital trimpot motor current using axis codes. * M908 - Control digital trimpot directly. + * M909 - DAC_STEPPER_CURRENT: Print digipot/DAC current value + * M910 - DAC_STEPPER_CURRENT: Commit digipot/DAC value to external EEPROM via I2C * M350 - Set microstepping mode. * M351 - Toggle MS1 MS2 pins directly. * @@ -245,6 +251,7 @@ static float feedrate = 1500.0, saved_feedrate; float current_position[NUM_AXIS] = { 0.0 }; static float destination[NUM_AXIS] = { 0.0 }; bool axis_known_position[3] = { false }; +bool axis_homed[3] = { false }; static long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; @@ -266,8 +273,11 @@ float home_offset[3] = { 0 }; float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }; float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; +#if FAN_COUNT > 0 + int fanSpeeds[FAN_COUNT] = { 0 }; +#endif + uint8_t active_extruder = 0; -int fanSpeed = 0; bool cancel_heatup = false; const char errormagic[] PROGMEM = "Error:"; @@ -275,21 +285,17 @@ const char echomagic[] PROGMEM = "echo:"; const char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'}; static bool relative_mode = false; //Determines Absolute or Relative Coordinates -static char serial_char; static int serial_count = 0; -static boolean comment_mode = false; static char* seen_pointer; ///< A pointer to find chars in the command string (X, Y, Z, E, etc.) const char* queued_commands_P = NULL; /* pointer to the current line in the active sequence of commands, or NULL when none */ const int sensitive_pins[] = SENSITIVE_PINS; ///< Sensitive pin list for M42 // Inactivity shutdown millis_t previous_cmd_ms = 0; static millis_t max_inactive_time = 0; -static millis_t stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME * 1000L; +static millis_t stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000L; millis_t print_job_start_ms = 0; ///< Print job start time millis_t print_job_stop_ms = 0; ///< Print job stop time static uint8_t target_extruder; -bool no_wait_for_cooling = true; -bool target_direction; #if ENABLED(AUTO_BED_LEVELING_FEATURE) int xy_travel_speed = XY_TRAVEL_SPEED; @@ -410,9 +416,7 @@ bool target_direction; static bool filrunoutEnqueued = false; #endif -#if ENABLED(SDSUPPORT) - static bool fromsd[BUFSIZE]; -#endif +static bool send_ok[BUFSIZE]; #if HAS_SERVOS Servo servo[NUM_SERVOS]; @@ -427,6 +431,26 @@ bool target_direction; int lpq_len = 20; #endif +#if ENABLED(HOST_KEEPALIVE_FEATURE) + + // States for managing Marlin and host communication + // Marlin sends messages if blocked or busy + enum MarlinBusyState { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) + }; + + static MarlinBusyState busy_state = NOT_BUSY; + static millis_t next_busy_signal_ms = -1; + #define KEEPALIVE_STATE(n) do{ busy_state = n; }while(0) +#else + #define host_keepalive() ; + #define KEEPALIVE_STATE(n) ; +#endif // HOST_KEEPALIVE_FEATURE + //=========================================================================== //================================ Functions ================================ //=========================================================================== @@ -443,10 +467,16 @@ void serial_echopair_P(const char* s_P, float v) { serialprintPGM(s_P); void serial_echopair_P(const char* s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_P(const char* s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void gcode_M114(); + #if ENABLED(PREVENT_DANGEROUS_EXTRUDE) float extrude_min_temp = EXTRUDE_MINTEMP; #endif +#if ENABLED(HAS_Z_MIN_PROBE) + extern volatile bool z_probe_is_active; +#endif + #if ENABLED(SDSUPPORT) #include "SdFatUtil.h" int freeMemory() { return SdFatUtil::FreeRam(); } @@ -468,29 +498,25 @@ extern "C" { #endif //!SDSUPPORT /** - * Inject the next command from the command queue, when possible - * Return false only if no command was pending + * Inject the next "immediate" command, when possible. + * Return true if any immediate commands remain to inject. */ static bool drain_queued_commands_P() { - if (!queued_commands_P) return false; - - // Get the next 30 chars from the sequence of gcodes to run - char cmd[30]; - strncpy_P(cmd, queued_commands_P, sizeof(cmd) - 1); - cmd[sizeof(cmd) - 1] = '\0'; - - // Look for the end of line, or the end of sequence - size_t i = 0; - char c; - while ((c = cmd[i]) && c != '\n') i++; // find the end of this gcode command - cmd[i] = '\0'; - if (enqueuecommand(cmd)) { // buffer was not full (else we will retry later) - if (c) - queued_commands_P += i + 1; // move to next command - else - queued_commands_P = NULL; // will have no more commands in the sequence + if (queued_commands_P != NULL) { + size_t i = 0; + char c, cmd[30]; + strncpy_P(cmd, queued_commands_P, sizeof(cmd) - 1); + cmd[sizeof(cmd) - 1] = '\0'; + while ((c = cmd[i]) && c != '\n') i++; // find the end of this gcode command + cmd[i] = '\0'; + if (enqueue_and_echo_command(cmd)) { // success? + if (c) // newline char? + queued_commands_P += i + 1; // advance to the next command + else + queued_commands_P = NULL; // nul char? no more commands + } } - return true; + return (queued_commands_P != NULL); // return whether any more remain } /** @@ -498,32 +524,49 @@ static bool drain_queued_commands_P() { * Aborts the current queue, if any. * Note: drain_queued_commands_P() must be called repeatedly to drain the commands afterwards */ -void enqueuecommands_P(const char* pgcode) { +void enqueue_and_echo_commands_P(const char* pgcode) { queued_commands_P = pgcode; drain_queued_commands_P(); // first command executed asap (when possible) } /** - * Copy a command directly into the main command buffer, from RAM. - * - * This is done in a non-safe way and needs a rework someday. - * Returns false if it doesn't add any command + * Once a new command is in the ring buffer, call this to commit it */ -bool enqueuecommand(const char* cmd) { - if (*cmd == ';' || commands_in_queue >= BUFSIZE) return false; - - // This is dangerous if a mixing of serial and this happens - char* command = command_queue[cmd_queue_index_w]; - strcpy(command, cmd); - SERIAL_ECHO_START; - SERIAL_ECHOPGM(MSG_Enqueueing); - SERIAL_ECHO(command); - SERIAL_ECHOLNPGM("\""); +inline void _commit_command(bool say_ok) { + send_ok[cmd_queue_index_w] = say_ok; cmd_queue_index_w = (cmd_queue_index_w + 1) % BUFSIZE; commands_in_queue++; +} + +/** + * Copy a command directly into the main command buffer, from RAM. + * Returns true if successfully adds the command + */ +inline bool _enqueuecommand(const char* cmd, bool say_ok=false) { + if (*cmd == ';' || commands_in_queue >= BUFSIZE) return false; + strcpy(command_queue[cmd_queue_index_w], cmd); + _commit_command(say_ok); return true; } +void enqueue_and_echo_command_now(const char* cmd) { + while (!enqueue_and_echo_command(cmd)) idle(); +} + +/** + * Enqueue with Serial Echo + */ +bool enqueue_and_echo_command(const char* cmd, bool say_ok/*=false*/) { + if (_enqueuecommand(cmd, say_ok)) { + SERIAL_ECHO_START; + SERIAL_ECHOPGM(MSG_Enqueueing); + SERIAL_ECHO(cmd); + SERIAL_ECHOLNPGM("\""); + return true; + } + return false; +} + void setup_killpin() { #if HAS_KILL SET_INPUT(KILL_PIN); @@ -592,12 +635,26 @@ void servo_init() { servo[3].detach(); #endif - // Set position of Servo Endstops that are defined - #if HAS_SERVO_ENDSTOPS + #if HAS_SERVO_ENDSTOPS + + z_probe_is_active = false; + + /** + * Set position of all defined Servo Endstops + * + * ** UNSAFE! - NEEDS UPDATE! ** + * + * The servo might be deployed and positioned too low to stow + * when starting up the machine or rebooting the board. + * There's no way to know where the nozzle is positioned until + * homing has been done - no homing with z-probe without init! + * + */ for (int i = 0; i < 3; i++) if (servo_endstop_id[i] >= 0) servo[servo_endstop_id[i]].move(servo_endstop_angle[i][1]); - #endif + + #endif // HAS_SERVO_ENDSTOPS } @@ -631,6 +688,13 @@ void servo_init() { * • status LEDs */ void setup() { + + #ifdef DISABLE_JTAG + // Disable JTAG on AT90USB chips to free up pins for IO + MCUCR = 0x80; + MCUCR = 0x80; + #endif + setup_killpin(); setup_filrunoutpin(); setup_powerhold(); @@ -673,9 +737,8 @@ void setup() { SERIAL_ECHOPGM(MSG_PLANNER_BUFFER_BYTES); SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); - #if ENABLED(SDSUPPORT) - for (int8_t i = 0; i < BUFSIZE; i++) fromsd[i] = false; - #endif + // Send "ok" after commands by default + for (int8_t i = 0; i < BUFSIZE; i++) send_ok[i] = true; // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) Config_RetrieveSettings(); @@ -734,7 +797,7 @@ void setup() { * - Call LCD update */ void loop() { - if (commands_in_queue < BUFSIZE - 1) get_command(); + if (commands_in_queue < BUFSIZE) get_command(); #if ENABLED(SDSUPPORT) card.checkautostart(false); @@ -750,6 +813,7 @@ void loop() { // M29 closes the file card.closefile(); SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED); + ok_to_send(); } else { // Write the string from the read buffer to SD @@ -757,7 +821,7 @@ void loop() { if (card.logging) process_next_command(); // The card is saving because it's logging else - SERIAL_PROTOCOLLNPGM(MSG_OK); + ok_to_send(); } } else @@ -793,9 +857,12 @@ void gcode_line_error(const char* err, bool doFlush = true) { */ void get_command() { + static char serial_line_buffer[MAX_CMD_SIZE]; + static boolean serial_comment_mode = false; + if (drain_queued_commands_P()) return; // priority is given to non-serial commands - #if ENABLED(NO_TIMEOUTS) + #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 static millis_t last_command_time = 0; millis_t ms = millis(); @@ -810,29 +877,21 @@ void get_command() { // while (commands_in_queue < BUFSIZE && MYSERIAL.available() > 0) { - #if ENABLED(NO_TIMEOUTS) - last_command_time = ms; - #endif - - serial_char = MYSERIAL.read(); + char serial_char = MYSERIAL.read(); // - // If the character ends the line, or the line is full... + // If the character ends the line // - if (serial_char == '\n' || serial_char == '\r' || serial_count >= MAX_CMD_SIZE - 1) { + if (serial_char == '\n' || serial_char == '\r') { - // end of line == end of comment - comment_mode = false; + serial_comment_mode = false; // end of line == end of comment if (!serial_count) return; // empty lines just exit - char* command = command_queue[cmd_queue_index_w]; - command[serial_count] = 0; // terminate string + serial_line_buffer[serial_count] = 0; // terminate string + serial_count = 0; //reset buffer - // this item in the queue is not from sd - #if ENABLED(SDSUPPORT) - fromsd[cmd_queue_index_w] = false; - #endif + char* command = serial_line_buffer; while (*command == ' ') command++; // skip any leading spaces char* npos = (*command == 'N') ? command : NULL; // Require the N parameter to start the line @@ -864,7 +923,7 @@ void get_command() { } // if no errors, continue parsing } - else if (npos == command) { + else { gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM)); return; } @@ -897,48 +956,60 @@ void get_command() { // If command was e-stop process now if (strcmp(command, "M112") == 0) kill(PSTR(MSG_KILLED)); - cmd_queue_index_w = (cmd_queue_index_w + 1) % BUFSIZE; - commands_in_queue += 1; + #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 + last_command_time = ms; + #endif - serial_count = 0; //clear buffer + // Add the command to the queue + _enqueuecommand(serial_line_buffer, true); + } + else if (serial_count >= MAX_CMD_SIZE - 1) { + // Keep fetching, but ignore normal characters beyond the max length + // The command will be injected when EOL is reached } else if (serial_char == '\\') { // Handle escapes - if (MYSERIAL.available() > 0 && commands_in_queue < BUFSIZE) { + if (MYSERIAL.available() > 0) { // if we have one more character, copy it over serial_char = MYSERIAL.read(); - command_queue[cmd_queue_index_w][serial_count++] = serial_char; + serial_line_buffer[serial_count++] = serial_char; } // otherwise do nothing } - else { // its not a newline, carriage return or escape char - if (serial_char == ';') comment_mode = true; - if (!comment_mode) command_queue[cmd_queue_index_w][serial_count++] = serial_char; + else { // it's not a newline, carriage return or escape char + if (serial_char == ';') serial_comment_mode = true; + if (!serial_comment_mode) serial_line_buffer[serial_count++] = serial_char; } - } + + } // queue has space, serial has data #if ENABLED(SDSUPPORT) - if (!card.sdprinting || serial_count) return; + static bool stop_buffering = false, + sd_comment_mode = false; + + if (!card.sdprinting) return; // '#' stops reading from SD to the buffer prematurely, so procedural macro calls are possible - // if it occurs, stop_buffering is triggered and the buffer is ran dry. + // if it occurs, stop_buffering is triggered and the buffer is run dry. // this character _can_ occur in serial com, due to checksums. however, no checksums are used in SD printing - static bool stop_buffering = false; if (commands_in_queue == 0) stop_buffering = false; - while (!card.eof() && commands_in_queue < BUFSIZE && !stop_buffering) { + uint16_t sd_count = 0; + bool card_eof = card.eof(); + while (commands_in_queue < BUFSIZE && !card_eof && !stop_buffering) { int16_t n = card.get(); - serial_char = (char)n; - if (serial_char == '\n' || serial_char == '\r' || - ((serial_char == '#' || serial_char == ':') && !comment_mode) || - serial_count >= (MAX_CMD_SIZE - 1) || n == -1 + char sd_char = (char)n; + card_eof = card.eof(); + if (card_eof || n == -1 + || sd_char == '\n' || sd_char == '\r' + || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode) ) { - if (card.eof()) { + if (card_eof) { SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); - print_job_stop_ms = millis(); + print_job_stop(true); char time[30]; - millis_t t = (print_job_stop_ms - print_job_start_ms) / 1000; + millis_t t = print_job_timer(); int hours = t / 60 / 60, minutes = (t / 60) % 60; sprintf_P(time, PSTR("%i " MSG_END_HOUR " %i " MSG_END_MINUTE), hours, minutes); SERIAL_ECHO_START; @@ -947,24 +1018,24 @@ void get_command() { card.printingHasFinished(); card.checkautostart(true); } - if (serial_char == '#') stop_buffering = true; + if (sd_char == '#') stop_buffering = true; - if (!serial_count) { - comment_mode = false; //for new command - return; //if empty line - } - command_queue[cmd_queue_index_w][serial_count] = 0; //terminate string - // if (!comment_mode) { - fromsd[cmd_queue_index_w] = true; - commands_in_queue += 1; - cmd_queue_index_w = (cmd_queue_index_w + 1) % BUFSIZE; - // } - comment_mode = false; //for new command - serial_count = 0; //clear buffer + sd_comment_mode = false; //for new command + + if (!sd_count) continue; //skip empty lines + + command_queue[cmd_queue_index_w][sd_count] = '\0'; //terminate string + sd_count = 0; //clear buffer + + _commit_command(false); + } + else if (sd_count >= MAX_CMD_SIZE - 1) { + // Keep fetching, but ignore normal characters beyond the max length + // The command will be injected when EOL is reached } else { - if (serial_char == ';') comment_mode = true; - if (!comment_mode) command_queue[cmd_queue_index_w][serial_count++] = serial_char; + if (sd_char == ';') sd_comment_mode = true; + if (!sd_comment_mode) command_queue[cmd_queue_index_w][sd_count++] = sd_char; } } @@ -974,6 +1045,7 @@ void get_command() { bool code_has_value() { int i = 1; char c = seen_pointer[i]; + while (c == ' ') c = seen_pointer[++i]; if (c == '-' || c == '+') c = seen_pointer[++i]; if (c == '.') c = seen_pointer[++i]; return (c >= '0' && c <= '9'); @@ -1280,6 +1352,8 @@ static void setup_for_endstop_move() { static void run_z_probe() { + refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out and EXTRUDER_RUNOUT_PREVENT from extruding + #if ENABLED(DELTA) float start_z = current_position[Z_AXIS]; @@ -1322,7 +1396,7 @@ static void setup_for_endstop_move() { st_synchronize(); // Tell the planner where we ended up - Get this from the stepper handler - zPosition = st_get_position_mm(Z_AXIS); + zPosition = st_get_axis_position_mm(Z_AXIS); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS]); // move up the retract distance @@ -1340,7 +1414,7 @@ static void setup_for_endstop_move() { endstops_hit_on_purpose(); // clear endstop hit flags // Get the current stepper position after bumping an endstop - current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); + current_position[Z_AXIS] = st_get_axis_position_mm(Z_AXIS); sync_plan_position(); #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -1401,19 +1475,19 @@ static void setup_for_endstop_move() { inline void raise_z_after_probing() { do_blocking_move_to_z(current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING); } static void clean_up_after_endstop_move() { - #if ENABLED(ENDSTOPS_ONLY_FOR_HOMING) - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (marlin_debug_flags & DEBUG_LEVELING) { - SERIAL_ECHOLNPGM("clean_up_after_endstop_move > ENDSTOPS_ONLY_FOR_HOMING > enable_endstops(false)"); - } - #endif - enable_endstops(false); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (marlin_debug_flags & DEBUG_LEVELING) { + SERIAL_ECHOLNPGM("clean_up_after_endstop_move > ENDSTOPS_ONLY_FOR_HOMING > endstops_not_homing()"); + } #endif + endstops_not_homing(); feedrate = saved_feedrate; feedrate_multiplier = saved_feedrate_multiplier; refresh_cmd_timeout(); } + #if ENABLED(HAS_Z_MIN_PROBE) + static void deploy_z_probe() { #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -1422,6 +1496,8 @@ static void setup_for_endstop_move() { } #endif + if (z_probe_is_active) return; + #if HAS_SERVO_ENDSTOPS // Engage Z Servo endstop if enabled @@ -1461,20 +1537,19 @@ static void setup_for_endstop_move() { if (Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE != Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE) feedrate = Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE; - // Move to trigger deployment - if (Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE != Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE) - feedrate = Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE; - if (Z_PROBE_ALLEN_KEY_DEPLOY_3_X != Z_PROBE_ALLEN_KEY_DEPLOY_2_X) - destination[X_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_X; - if (Z_PROBE_ALLEN_KEY_DEPLOY_3_Y != Z_PROBE_ALLEN_KEY_DEPLOY_2_Y) - destination[Y_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_Y; - if (Z_PROBE_ALLEN_KEY_DEPLOY_3_Z != Z_PROBE_ALLEN_KEY_DEPLOY_2_Z) - destination[Z_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_Z; - - prepare_move_raw(); - - #endif - } + // Move to trigger deployment + if (Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE != Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE) + feedrate = Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE; + if (Z_PROBE_ALLEN_KEY_DEPLOY_3_X != Z_PROBE_ALLEN_KEY_DEPLOY_2_X) + destination[X_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_X; + if (Z_PROBE_ALLEN_KEY_DEPLOY_3_Y != Z_PROBE_ALLEN_KEY_DEPLOY_2_Y) + destination[Y_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_Y; + if (Z_PROBE_ALLEN_KEY_DEPLOY_3_Z != Z_PROBE_ALLEN_KEY_DEPLOY_2_Z) + destination[Z_AXIS] = Z_PROBE_ALLEN_KEY_DEPLOY_3_Z; + + prepare_move_raw(); + #endif + } // Partially Home X,Y for safety destination[X_AXIS] = destination[X_AXIS] * 0.75; @@ -1501,6 +1576,12 @@ static void setup_for_endstop_move() { #endif // Z_PROBE_ALLEN_KEY + #if ENABLED(FIX_MOUNTED_PROBE) + // Noting to be done. Just set z_probe_is_active + #endif + + z_probe_is_active = true; + } static void stow_z_probe(bool doRaise = true) { @@ -1510,6 +1591,8 @@ static void setup_for_endstop_move() { } #endif + if (!z_probe_is_active) return; + #if HAS_SERVO_ENDSTOPS // Retract Z Servo endstop if enabled @@ -1594,12 +1677,19 @@ static void setup_for_endstop_move() { Stop(); } #endif // Z_PROBE_ALLEN_KEY + + #if ENABLED(FIX_MOUNTED_PROBE) + // Noting to be done. Just set z_probe_is_active + #endif + + z_probe_is_active = false; } + #endif // HAS_Z_MIN_PROBE enum ProbeAction { ProbeStay = 0, - ProbeDeploy = BIT(0), - ProbeStow = BIT(1), + ProbeDeploy = _BV(0), + ProbeStow = _BV(1), ProbeDeployAndStow = (ProbeDeploy | ProbeStow) }; @@ -1628,13 +1718,13 @@ static void setup_for_endstop_move() { #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { - SERIAL_ECHOPAIR("> do_blocking_move_to_xy ", x - X_PROBE_OFFSET_FROM_EXTRUDER); - SERIAL_ECHOPAIR(", ", y - Y_PROBE_OFFSET_FROM_EXTRUDER); + SERIAL_ECHOPAIR("> do_blocking_move_to_xy ", x - (X_PROBE_OFFSET_FROM_EXTRUDER)); + SERIAL_ECHOPAIR(", ", y - (Y_PROBE_OFFSET_FROM_EXTRUDER)); SERIAL_EOL; } #endif - do_blocking_move_to_xy(x - X_PROBE_OFFSET_FROM_EXTRUDER, y - Y_PROBE_OFFSET_FROM_EXTRUDER); // this also updates current_position + do_blocking_move_to_xy(x - (X_PROBE_OFFSET_FROM_EXTRUDER), y - (Y_PROBE_OFFSET_FROM_EXTRUDER)); // this also updates current_position #if DISABLED(Z_PROBE_SLED) && DISABLED(Z_PROBE_ALLEN_KEY) if (probe_action & ProbeDeploy) { @@ -1751,7 +1841,9 @@ static void setup_for_endstop_move() { void raise_z_for_servo() { float zpos = current_position[Z_AXIS], z_dest = Z_RAISE_BEFORE_PROBING; - z_dest += axis_known_position[Z_AXIS] ? zprobe_zoffset : zpos; + // The zprobe_zoffset is negative any switch below the nozzle, so + // multiply by Z_HOME_DIR (-1) to move enough away from bed for the probe + z_dest += axis_known_position[Z_AXIS] ? zprobe_zoffset * Z_HOME_DIR : zpos; if (zpos < z_dest) do_blocking_move_to_z(z_dest); // also updates current_position } @@ -1759,6 +1851,11 @@ static void setup_for_endstop_move() { #endif // AUTO_BED_LEVELING_FEATURE +static void unknown_position_error() { + LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); +} #if ENABLED(Z_PROBE_SLED) @@ -1779,10 +1876,11 @@ static void setup_for_endstop_move() { SERIAL_EOL; } #endif + + if (z_probe_is_active == dock) return; + if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) { - LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); + unknown_position_error(); return; } @@ -1801,6 +1899,8 @@ static void setup_for_endstop_move() { digitalWrite(SLED_PIN, HIGH); // turn on magnet } do_blocking_move_to_x(oldXpos); // return to position before docking + + z_probe_is_active = dock; } #endif // Z_PROBE_SLED @@ -1841,9 +1941,7 @@ static void homeaxis(AxisEnum axis) { if (axis == Z_AXIS) { if (axis_home_dir < 0) dock_sled(false); } - #endif - - #if SERVO_LEVELING && DISABLED(Z_PROBE_SLED) + #elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) // Deploy a Z probe if there is one, and homing towards the bed if (axis == Z_AXIS) { @@ -1854,8 +1952,10 @@ static void homeaxis(AxisEnum axis) { #if HAS_SERVO_ENDSTOPS // Engage Servo endstop if enabled - if (axis != Z_AXIS && servo_endstop_id[axis] >= 0) + if (axis != Z_AXIS && servo_endstop_id[axis] >= 0) { servo[servo_endstop_id[axis]].move(servo_endstop_angle[axis][0]); + z_probe_is_active = true; + } #endif // Set a flag for Z motor locking @@ -1981,15 +2081,14 @@ static void homeaxis(AxisEnum axis) { feedrate = 0.0; endstops_hit_on_purpose(); // clear endstop hit flags axis_known_position[axis] = true; + axis_homed[axis] = true; #if ENABLED(Z_PROBE_SLED) // bring Z probe back if (axis == Z_AXIS) { if (axis_home_dir < 0) dock_sled(true); } - #endif - - #if SERVO_LEVELING && DISABLED(Z_PROBE_SLED) + #elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) // Deploy a Z probe if there is one, and homing towards the bed if (axis == Z_AXIS) { @@ -2016,6 +2115,7 @@ static void homeaxis(AxisEnum axis) { } #endif servo[servo_endstop_id[axis]].move(servo_endstop_angle[axis][1]); + z_probe_is_active = false; } #endif } @@ -2117,6 +2217,35 @@ void unknown_command_error() { SERIAL_ECHOPGM("\"\n"); } +#if ENABLED(HOST_KEEPALIVE_FEATURE) + + void host_keepalive() { + millis_t ms = millis(); + if (busy_state != NOT_BUSY) { + if (ms < next_busy_signal_ms) return; + switch (busy_state) { + case NOT_BUSY: + break; + case IN_HANDLER: + case IN_PROCESS: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM(MSG_BUSY_PROCESSING); + break; + case PAUSED_FOR_USER: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_USER); + break; + case PAUSED_FOR_INPUT: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_INPUT); + break; + } + } + next_busy_signal_ms = ms + 2000UL; + } + +#endif //HOST_KEEPALIVE_FEATURE + /** * G0, G1: Coordinated movement of X Y Z E axes */ @@ -2255,7 +2384,7 @@ inline void gcode_G28() { setup_for_endstop_move(); - set_destination_to_current(); + set_destination_to_current(); // Directly after a reset this is all 0. Later we get a hint if we have to raise z or not. feedrate = 0.0; @@ -2268,7 +2397,7 @@ inline void gcode_G28() { sync_plan_position(); // Move all carriages up together until the first endstop is hit. - for (int i = X_AXIS; i <= Z_AXIS; i++) destination[i] = 3 * Z_MAX_LENGTH; + for (int i = X_AXIS; i <= Z_AXIS; i++) destination[i] = 3 * (Z_MAX_LENGTH); feedrate = 1.732 * homing_feedrate[X_AXIS]; line_to_destination(); st_synchronize(); @@ -2298,36 +2427,40 @@ inline void gcode_G28() { home_all_axis = (!homeX && !homeY && !homeZ) || (homeX && homeY && homeZ); - if (home_all_axis || homeZ) { - - #if Z_HOME_DIR > 0 // If homing away from BED do Z first + #if Z_HOME_DIR > 0 // If homing away from BED do Z first + if (home_all_axis || homeZ) { HOMEAXIS(Z); #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { print_xyz("> HOMEAXIS(Z) > current_position", current_position); } #endif + } - #elif DISABLED(Z_SAFE_HOMING) && defined(Z_RAISE_BEFORE_HOMING) && Z_RAISE_BEFORE_HOMING > 0 + #elif defined(MIN_Z_HEIGHT_FOR_HOMING) && MIN_Z_HEIGHT_FOR_HOMING > 0 - // Raise Z before homing any other axes - // (Does this need to be "negative home direction?" Why not just use Z_RAISE_BEFORE_HOMING?) - destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); + // Raise Z before homing any other axes and z is not already high enough (never lower z) + if (current_position[Z_AXIS] <= MIN_Z_HEIGHT_FOR_HOMING) { + destination[Z_AXIS] = MIN_Z_HEIGHT_FOR_HOMING; + feedrate = max_feedrate[Z_AXIS] * 60; // feedrate (mm/m) = max_feedrate (mm/s) #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { - SERIAL_ECHOPAIR("Raise Z (before homing) by ", (float)Z_RAISE_BEFORE_HOMING); + SERIAL_ECHOPAIR("Raise Z (before homing) to ", (float)(MIN_Z_HEIGHT_FOR_HOMING)); SERIAL_EOL; + print_xyz("> (home_all_axis || homeZ) > current_position", current_position); print_xyz("> (home_all_axis || homeZ) > destination", destination); } #endif - feedrate = max_feedrate[Z_AXIS] * 60; line_to_destination(); st_synchronize(); - #endif - - } // home_all_axis || homeZ + // Update the current Z position even if it currently not real from Z-home + // otherwise each call to line_to_destination() will want to move Z-axis + // by MIN_Z_HEIGHT_FOR_HOMING. + current_position[Z_AXIS] = destination[Z_AXIS]; + } + #endif #if ENABLED(QUICK_HOME) @@ -2441,33 +2574,33 @@ inline void gcode_G28() { if (home_all_axis) { - current_position[Z_AXIS] = 0; + // At this point we already have Z at MIN_Z_HEIGHT_FOR_HOMING height + // No need to move Z any more as this height should already be safe + // enough to reach Z_SAFE_HOMING XY positions. + // Just make sure the planner is in sync. sync_plan_position(); // // Set the Z probe (or just the nozzle) destination to the safe homing point // - // NOTE: If current_position[X_AXIS] or current_position[Y_AXIS] were set above - // then this may not work as expected. - destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER); - destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER); - destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); // Set destination away from bed + destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - (X_PROBE_OFFSET_FROM_EXTRUDER)); + destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - (Y_PROBE_OFFSET_FROM_EXTRUDER)); + destination[Z_AXIS] = current_position[Z_AXIS]; //z is already at the right height feedrate = XY_TRAVEL_SPEED; #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { - SERIAL_ECHOPAIR("Raise Z (before homing) by ", (float)Z_RAISE_BEFORE_HOMING); - SERIAL_EOL; - print_xyz("> home_all_axis > current_position", current_position); - print_xyz("> home_all_axis > destination", destination); + print_xyz("> Z_SAFE_HOMING > home_all_axis > current_position", current_position); + print_xyz("> Z_SAFE_HOMING > home_all_axis > destination", destination); } #endif - // This could potentially move X, Y, Z all together + // Move in the XY plane line_to_destination(); st_synchronize(); - // Set current X, Y is the Z_SAFE_HOMING_POINT minus PROBE_OFFSET_FROM_EXTRUDER + // Update the current positions for XY, Z is still at least at + // MIN_Z_HEIGHT_FOR_HOMING height, no changes there. current_position[X_AXIS] = destination[X_AXIS]; current_position[Y_AXIS] = destination[Y_AXIS]; @@ -2483,30 +2616,10 @@ inline void gcode_G28() { // Make sure the Z probe is within the physical limits // NOTE: This doesn't necessarily ensure the Z probe is also within the bed! float cpx = current_position[X_AXIS], cpy = current_position[Y_AXIS]; - if ( cpx >= X_MIN_POS - X_PROBE_OFFSET_FROM_EXTRUDER - && cpx <= X_MAX_POS - X_PROBE_OFFSET_FROM_EXTRUDER - && cpy >= Y_MIN_POS - Y_PROBE_OFFSET_FROM_EXTRUDER - && cpy <= Y_MAX_POS - Y_PROBE_OFFSET_FROM_EXTRUDER) { - // Set the plan current position to X, Y, 0 - current_position[Z_AXIS] = 0; - plan_set_position(cpx, cpy, 0, current_position[E_AXIS]); // = sync_plan_position - - // Set Z destination away from bed and raise the axis - // NOTE: This should always just be Z_RAISE_BEFORE_HOMING unless...??? - destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); - feedrate = max_feedrate[Z_AXIS] * 60; // feedrate (mm/m) = max_feedrate (mm/s) - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (marlin_debug_flags & DEBUG_LEVELING) { - SERIAL_ECHOPAIR("Raise Z (before homing) by ", (float)Z_RAISE_BEFORE_HOMING); - SERIAL_EOL; - print_xyz("> homeZ > current_position", current_position); - print_xyz("> homeZ > destination", destination); - } - #endif - - line_to_destination(); - st_synchronize(); + if ( cpx >= X_MIN_POS - (X_PROBE_OFFSET_FROM_EXTRUDER) + && cpx <= X_MAX_POS - (X_PROBE_OFFSET_FROM_EXTRUDER) + && cpy >= Y_MIN_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER) + && cpy <= Y_MAX_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER)) { // Home the Z axis HOMEAXIS(Z); @@ -2518,9 +2631,7 @@ inline void gcode_G28() { } } else { - LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); + unknown_position_error(); } } // !home_all_axes && homeZ @@ -2595,6 +2706,8 @@ inline void gcode_G28() { } #endif + gcode_M114(); // Send end position to RepetierHost + } #if ENABLED(MESH_BED_LEVELING) @@ -2657,7 +2770,7 @@ inline void gcode_G28() { case MeshStart: mbl.reset(); probe_point = 0; - enqueuecommands_P(PSTR("G28\nG29 S2")); + enqueue_and_echo_commands_P(PSTR("G28\nG29 S2")); break; case MeshNext: @@ -2672,8 +2785,8 @@ inline void gcode_G28() { } else { // For others, save the Z of the previous point, then raise Z again. - ix = (probe_point - 1) % MESH_NUM_X_POINTS; - iy = (probe_point - 1) / MESH_NUM_X_POINTS; + ix = (probe_point - 1) % (MESH_NUM_X_POINTS); + iy = (probe_point - 1) / (MESH_NUM_X_POINTS); if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag mbl.set_z(ix, iy, current_position[Z_AXIS]); current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; @@ -2681,9 +2794,9 @@ inline void gcode_G28() { st_synchronize(); } // Is there another point to sample? Move there. - if (probe_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { - ix = probe_point % MESH_NUM_X_POINTS; - iy = probe_point / MESH_NUM_X_POINTS; + if (probe_point < (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) { + ix = probe_point % (MESH_NUM_X_POINTS); + iy = probe_point / (MESH_NUM_X_POINTS); if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag current_position[X_AXIS] = mbl.get_x(ix); current_position[Y_AXIS] = mbl.get_y(iy); @@ -2696,7 +2809,7 @@ inline void gcode_G28() { SERIAL_PROTOCOLLNPGM("Mesh probing done."); probe_point = -1; mbl.active = 1; - enqueuecommands_P(PSTR("G28")); + enqueue_and_echo_commands_P(PSTR("G28")); } break; @@ -2791,9 +2904,7 @@ inline void gcode_G28() { // Don't allow auto-leveling without homing first if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) { - LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); + unknown_position_error(); return; } @@ -2835,18 +2946,18 @@ inline void gcode_G28() { back_probe_bed_position = code_seen('B') ? code_value_short() : BACK_PROBE_BED_POSITION; bool left_out_l = left_probe_bed_position < MIN_PROBE_X, - left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - MIN_PROBE_EDGE, + left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - (MIN_PROBE_EDGE), right_out_r = right_probe_bed_position > MAX_PROBE_X, right_out = right_out_r || right_probe_bed_position < left_probe_bed_position + MIN_PROBE_EDGE, front_out_f = front_probe_bed_position < MIN_PROBE_Y, - front_out = front_out_f || front_probe_bed_position > back_probe_bed_position - MIN_PROBE_EDGE, + front_out = front_out_f || front_probe_bed_position > back_probe_bed_position - (MIN_PROBE_EDGE), back_out_b = back_probe_bed_position > MAX_PROBE_Y, back_out = back_out_b || back_probe_bed_position < front_probe_bed_position + MIN_PROBE_EDGE; if (left_out || right_out || front_out || back_out) { if (left_out) { out_of_range_error(PSTR("(L)eft")); - left_probe_bed_position = left_out_l ? MIN_PROBE_X : right_probe_bed_position - MIN_PROBE_EDGE; + left_probe_bed_position = left_out_l ? MIN_PROBE_X : right_probe_bed_position - (MIN_PROBE_EDGE); } if (right_out) { out_of_range_error(PSTR("(R)ight")); @@ -2854,7 +2965,7 @@ inline void gcode_G28() { } if (front_out) { out_of_range_error(PSTR("(F)ront")); - front_probe_bed_position = front_out_f ? MIN_PROBE_Y : back_probe_bed_position - MIN_PROBE_EDGE; + front_probe_bed_position = front_out_f ? MIN_PROBE_Y : back_probe_bed_position - (MIN_PROBE_EDGE); } if (back_out) { out_of_range_error(PSTR("(B)ack")); @@ -3044,11 +3155,16 @@ inline void gcode_G28() { if (do_topography_map) { SERIAL_PROTOCOLPGM(" \nBed Height Topography: \n"); - SERIAL_PROTOCOLPGM("+-----------+\n"); - SERIAL_PROTOCOLPGM("|...Back....|\n"); - SERIAL_PROTOCOLPGM("|Left..Right|\n"); - SERIAL_PROTOCOLPGM("|...Front...|\n"); - SERIAL_PROTOCOLPGM("+-----------+\n"); + SERIAL_PROTOCOLPGM(" +--- BACK --+\n"); + SERIAL_PROTOCOLPGM(" | |\n"); + SERIAL_PROTOCOLPGM(" L | (+) | R\n"); + SERIAL_PROTOCOLPGM(" E | | I\n"); + SERIAL_PROTOCOLPGM(" F | (-) N (+) | G\n"); + SERIAL_PROTOCOLPGM(" T | | H\n"); + SERIAL_PROTOCOLPGM(" | (-) | T\n"); + SERIAL_PROTOCOLPGM(" | |\n"); + SERIAL_PROTOCOLPGM(" O-- FRONT --+\n"); + SERIAL_PROTOCOLPGM(" (0,0)\n"); float min_diff = 999; @@ -3063,8 +3179,7 @@ inline void gcode_G28() { apply_rotation_xyz(plan_bed_level_matrix, x_tmp, y_tmp, z_tmp); - if (eqnBVector[ind] - z_tmp < min_diff) - min_diff = eqnBVector[ind] - z_tmp; + NOMORE(min_diff, eqnBVector[ind] - z_tmp); if (diff >= 0.0) SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment @@ -3131,7 +3246,7 @@ inline void gcode_G28() { #if ENABLED(Z_PROBE_ALLEN_KEY) stow_z_probe(); #elif Z_RAISE_AFTER_PROBING > 0 - raise_z_after_probing(); + raise_z_after_probing(); // ??? #endif #else // !DELTA if (verbose_level > 0) @@ -3144,7 +3259,7 @@ inline void gcode_G28() { float x_tmp = current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER, y_tmp = current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER, z_tmp = current_position[Z_AXIS], - real_z = st_get_position_mm(Z_AXIS); //get the real Z (since plan_get_position is now correcting the plane) + real_z = st_get_axis_position_mm(Z_AXIS); //get the real Z (since plan_get_position is now correcting the plane) #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { @@ -3198,6 +3313,11 @@ inline void gcode_G28() { // Sled assembly for Cartesian bots #if ENABLED(Z_PROBE_SLED) dock_sled(true); // dock the sled + #elif Z_RAISE_AFTER_PROBING > 0 + // Raise Z axis for non-delta and non servo based probes + #if !defined(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_ALLEN_KEY) && DISABLED(Z_PROBE_SLED) + raise_z_after_probing(); + #endif #endif #endif // !DELTA @@ -3209,19 +3329,26 @@ inline void gcode_G28() { SERIAL_ECHOLNPGM(Z_PROBE_END_SCRIPT); } #endif - enqueuecommands_P(PSTR(Z_PROBE_END_SCRIPT)); + enqueue_and_echo_commands_P(PSTR(Z_PROBE_END_SCRIPT)); + #if ENABLED(HAS_Z_MIN_PROBE) + z_probe_is_active = false; + #endif st_synchronize(); #endif + KEEPALIVE_STATE(IN_HANDLER); + #if ENABLED(DEBUG_LEVELING_FEATURE) if (marlin_debug_flags & DEBUG_LEVELING) { SERIAL_ECHOLNPGM("<<< gcode_G29"); } #endif + gcode_M114(); // Send end position to RepetierHost + } - #if DISABLED(Z_PROBE_SLED) + #if DISABLED(Z_PROBE_SLED) // could be avoided /** * G30: Do a single Z probe at the current XY @@ -3230,11 +3357,11 @@ inline void gcode_G28() { #if HAS_SERVO_ENDSTOPS raise_z_for_servo(); #endif - deploy_z_probe(); // Engage Z Servo endstop if available + deploy_z_probe(); // Engage Z Servo endstop if available. Z_PROBE_SLED is missed her. st_synchronize(); // TODO: clear the leveling matrix or the planner will be set incorrectly - setup_for_endstop_move(); + setup_for_endstop_move(); // to late. Must be done before deploying. feedrate = homing_feedrate[Z_AXIS]; @@ -3247,12 +3374,14 @@ inline void gcode_G28() { SERIAL_PROTOCOL(current_position[Z_AXIS] + 0.0001); SERIAL_EOL; - clean_up_after_endstop_move(); + clean_up_after_endstop_move(); // to early. must be done after the stowing. #if HAS_SERVO_ENDSTOPS raise_z_for_servo(); #endif - stow_z_probe(false); // Retract Z Servo endstop if available + stow_z_probe(false); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed her. + + gcode_M114(); // Send end position to RepetierHost } #endif //!Z_PROBE_SLED @@ -3319,12 +3448,16 @@ inline void gcode_G92() { refresh_cmd_timeout(); if (codenum > 0) { codenum += previous_cmd_ms; // wait until this time for a click + KEEPALIVE_STATE(PAUSED_FOR_USER); while (millis() < codenum && !lcd_clicked()) idle(); + KEEPALIVE_STATE(IN_HANDLER); lcd_ignore_click(false); } else { if (!lcd_detected()) return; + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) idle(); + KEEPALIVE_STATE(IN_HANDLER); } if (IS_SD_PRINTING) LCD_MESSAGEPGM(MSG_RESUMING); @@ -3368,7 +3501,7 @@ inline void gcode_M17() { } /** - * M23: Select a file + * M23: Open a file */ inline void gcode_M23() { card.openFile(current_command_args, true); @@ -3379,7 +3512,7 @@ inline void gcode_M17() { */ inline void gcode_M24() { card.startFileprint(); - print_job_start_ms = millis(); + print_job_start(); } /** @@ -3435,8 +3568,7 @@ inline void gcode_M17() { * M31: Get the time since the start of SD Print (or last M109) */ inline void gcode_M31() { - print_job_stop_ms = millis(); - millis_t t = (print_job_stop_ms - print_job_start_ms) / 1000; + millis_t t = print_job_timer(); int min = t / 60, sec = t % 60; char time[30]; sprintf_P(time, PSTR("%i min, %i sec"), min, sec); @@ -3470,8 +3602,9 @@ inline void gcode_M31() { card.setIndex(code_value_short()); card.startFileprint(); - if (!call_procedure) - print_job_start_ms = millis(); //procedure calls count as normal print time. + + // Procedure calls count as normal print time. + if (!call_procedure) print_job_start(); } } @@ -3506,31 +3639,39 @@ inline void gcode_M31() { /** * M42: Change pin status via GCode + * + * P<pin> Pin number (LED if omitted) + * S<byte> Pin status from 0 - 255 */ inline void gcode_M42() { if (code_seen('S')) { - int pin_status = code_value_short(), - pin_number = LED_PIN; + int pin_status = code_value_short(); + if (pin_status < 0 || pin_status > 255) return; - if (code_seen('P') && pin_status >= 0 && pin_status <= 255) - pin_number = code_value_short(); + int pin_number = code_seen('P') ? code_value_short() : LED_PIN; + if (pin_number < 0) return; - for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) { - if (sensitive_pins[i] == pin_number) { - pin_number = -1; - break; - } - } + for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) + if (pin_number == sensitive_pins[i]) return; - #if HAS_FAN - if (pin_number == FAN_PIN) fanSpeed = pin_status; + pinMode(pin_number, OUTPUT); + digitalWrite(pin_number, pin_status); + analogWrite(pin_number, pin_status); + + #if FAN_COUNT > 0 + switch (pin_number) { + #if HAS_FAN0 + case FAN_PIN: fanSpeeds[0] = pin_status; break; + #endif + #if HAS_FAN1 + case FAN1_PIN: fanSpeeds[1] = pin_status; break; + #endif + #if HAS_FAN2 + case FAN2_PIN: fanSpeeds[2] = pin_status; break; + #endif + } #endif - if (pin_number > -1) { - pinMode(pin_number, OUTPUT); - digitalWrite(pin_number, pin_status); - analogWrite(pin_number, pin_status); - } } // code_seen('S') } @@ -3556,6 +3697,7 @@ inline void gcode_M42() { * V = Verbose level (0-4, default=1) * E = Engage Z probe for each reading * L = Number of legs of movement before probe + * S = Schizoid (Or Star if you prefer) * * This function assumes the bed has been homed. Specifically, that a G28 command * as been issued prior to invoking the M48 Z probe repeatability measurement function. @@ -3564,8 +3706,13 @@ inline void gcode_M42() { */ inline void gcode_M48() { + if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS] || !axis_known_position[Z_AXIS]) { + unknown_position_error(); + return; + } + double sum = 0.0, mean = 0.0, sigma = 0.0, sample_set[50]; - uint8_t verbose_level = 1, n_samples = 10, n_legs = 0; + uint8_t verbose_level = 1, n_samples = 10, n_legs = 0, schizoid_flag = 0; if (code_seen('V')) { verbose_level = code_value_short(); @@ -3586,50 +3733,57 @@ inline void gcode_M42() { } } - double X_current = st_get_position_mm(X_AXIS), - Y_current = st_get_position_mm(Y_AXIS), - Z_current = st_get_position_mm(Z_AXIS), - E_current = st_get_position_mm(E_AXIS), - X_probe_location = X_current, Y_probe_location = Y_current, + float X_current = current_position[X_AXIS], + Y_current = current_position[Y_AXIS], + Z_current = current_position[Z_AXIS], + X_probe_location = X_current + X_PROBE_OFFSET_FROM_EXTRUDER, + Y_probe_location = Y_current + Y_PROBE_OFFSET_FROM_EXTRUDER, Z_start_location = Z_current + Z_RAISE_BEFORE_PROBING; - bool deploy_probe_for_each_reading = code_seen('E'); if (code_seen('X')) { - X_probe_location = code_value() - X_PROBE_OFFSET_FROM_EXTRUDER; - if (X_probe_location < X_MIN_POS || X_probe_location > X_MAX_POS) { - out_of_range_error(PSTR("X")); - return; - } + X_probe_location = code_value(); + #if DISABLED(DELTA) + if (X_probe_location < MIN_PROBE_X || X_probe_location > MAX_PROBE_X) { + out_of_range_error(PSTR("X")); + return; + } + #endif } if (code_seen('Y')) { - Y_probe_location = code_value() - Y_PROBE_OFFSET_FROM_EXTRUDER; - if (Y_probe_location < Y_MIN_POS || Y_probe_location > Y_MAX_POS) { - out_of_range_error(PSTR("Y")); + Y_probe_location = code_value(); + #if DISABLED(DELTA) + if (Y_probe_location < MIN_PROBE_Y || Y_probe_location > MAX_PROBE_Y) { + out_of_range_error(PSTR("Y")); + return; + } + #endif + } + + #if ENABLED(DELTA) + if (sqrt(X_probe_location * X_probe_location + Y_probe_location * Y_probe_location) > DELTA_PROBEABLE_RADIUS) { + SERIAL_PROTOCOLPGM("? (X,Y) location outside of probeable radius.\n"); return; } - } + #endif - if (code_seen('L')) { + bool seen_L = code_seen('L'); + + if (seen_L) { n_legs = code_value_short(); - if (n_legs == 1) n_legs = 2; if (n_legs < 0 || n_legs > 15) { SERIAL_PROTOCOLPGM("?Number of legs in movement not plausible (0-15).\n"); return; } + if (n_legs == 1) n_legs = 2; } - // - // Do all the preliminary setup work. First raise the Z probe. - // - - st_synchronize(); - plan_bed_level_matrix.set_to_identity(); - plan_buffer_line(X_current, Y_current, Z_start_location, E_current, homing_feedrate[Z_AXIS] / 60, active_extruder); - st_synchronize(); + if (code_seen('S')) { + schizoid_flag++; + if (!seen_L) n_legs = 7; + } - // // Now get everything to the specified probe point So we can safely do a probe to // get us close to the bed. If the Z-Axis is far from the bed, we don't want to // use that as a starting point for each probe. @@ -3637,90 +3791,112 @@ inline void gcode_M42() { if (verbose_level > 2) SERIAL_PROTOCOLPGM("Positioning the probe...\n"); - plan_buffer_line(X_probe_location, Y_probe_location, Z_start_location, - E_current, - homing_feedrate[X_AXIS] / 60, - active_extruder); - st_synchronize(); + #if ENABLED(DELTA) + reset_bed_level(); // we don't do bed level correction in M48 because we want the raw data when we probe + #else + plan_bed_level_matrix.set_to_identity(); // we don't do bed level correction in M48 because we wantthe raw data when we probe + #endif + + if (Z_start_location < Z_RAISE_BEFORE_PROBING * 2.0) + do_blocking_move_to_z(Z_start_location); - current_position[X_AXIS] = X_current = st_get_position_mm(X_AXIS); - current_position[Y_AXIS] = Y_current = st_get_position_mm(Y_AXIS); - current_position[Z_AXIS] = Z_current = st_get_position_mm(Z_AXIS); - current_position[E_AXIS] = E_current = st_get_position_mm(E_AXIS); + do_blocking_move_to_xy(X_probe_location - X_PROBE_OFFSET_FROM_EXTRUDER, Y_probe_location - Y_PROBE_OFFSET_FROM_EXTRUDER); // // OK, do the initial probe to get us close to the bed. // Then retrace the right amount and use that in subsequent probes // - - deploy_z_probe(); - setup_for_endstop_move(); - run_z_probe(); - current_position[Z_AXIS] = Z_current = st_get_position_mm(Z_AXIS); - Z_start_location = st_get_position_mm(Z_AXIS) + Z_RAISE_BEFORE_PROBING; + probe_pt(X_probe_location, Y_probe_location, Z_RAISE_BEFORE_PROBING, + deploy_probe_for_each_reading ? ProbeDeployAndStow : ProbeDeploy, + verbose_level); - plan_buffer_line(X_probe_location, Y_probe_location, Z_start_location, - E_current, - homing_feedrate[X_AXIS] / 60, - active_extruder); - st_synchronize(); - current_position[Z_AXIS] = Z_current = st_get_position_mm(Z_AXIS); - - if (deploy_probe_for_each_reading) stow_z_probe(); + raise_z_after_probing(); for (uint8_t n = 0; n < n_samples; n++) { - // Make sure we are at the probe location - do_blocking_move_to(X_probe_location, Y_probe_location, Z_start_location); // this also updates current_position - + randomSeed(millis()); + delay(500); if (n_legs) { - millis_t ms = millis(); - double radius = ms % (X_MAX_LENGTH / 4), // limit how far out to go - theta = RADIANS(ms % 360L); - float dir = (ms & 0x0001) ? 1 : -1; // clockwise or counter clockwise + float radius, angle = random(0.0, 360.0); + int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise - //SERIAL_ECHOPAIR("starting radius: ",radius); - //SERIAL_ECHOPAIR(" theta: ",theta); - //SERIAL_ECHOPAIR(" direction: ",dir); - //SERIAL_EOL; + radius = random( + #if ENABLED(DELTA) + DELTA_PROBEABLE_RADIUS / 8, DELTA_PROBEABLE_RADIUS / 3 + #else + 5, X_MAX_LENGTH / 8 + #endif + ); + + if (verbose_level > 3) { + SERIAL_ECHOPAIR("Starting radius: ", radius); + SERIAL_ECHOPAIR(" angle: ", angle); + delay(100); + if (dir > 0) + SERIAL_ECHO(" Direction: Counter Clockwise \n"); + else + SERIAL_ECHO(" Direction: Clockwise \n"); + delay(100); + } for (uint8_t l = 0; l < n_legs - 1; l++) { - ms = millis(); - theta += RADIANS(dir * (ms % 20L)); - radius += (ms % 10L) - 5L; - if (radius < 0.0) radius = -radius; - - X_current = X_probe_location + cos(theta) * radius; - X_current = constrain(X_current, X_MIN_POS, X_MAX_POS); - Y_current = Y_probe_location + sin(theta) * radius; - Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS); - + double delta_angle; + if (schizoid_flag) + delta_angle = dir * 2.0 * 72.0; // The points of a 5 point star are 72 degrees apart. We need to + // skip a point and go to the next one on the star. + else + delta_angle = dir * (float) random(25, 45); // If we do this line, we are just trying to move further + // around the circle. + angle += delta_angle; + while (angle > 360.0) // We probably do not need to keep the angle between 0 and 2*PI, but the + angle -= 360.0; // Arduino documentation says the trig functions should not be given values + while (angle < 0.0) // outside of this range. It looks like they behave correctly with + angle += 360.0; // numbers outside of the range, but just to be safe we clamp them. + X_current = X_probe_location - X_PROBE_OFFSET_FROM_EXTRUDER + cos(RADIANS(angle)) * radius; + Y_current = Y_probe_location - Y_PROBE_OFFSET_FROM_EXTRUDER + sin(RADIANS(angle)) * radius; + #if DISABLED(DELTA) + X_current = constrain(X_current, X_MIN_POS, X_MAX_POS); + Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS); + #else + // If we have gone out too far, we can do a simple fix and scale the numbers + // back in closer to the origin. + while (sqrt(X_current * X_current + Y_current * Y_current) > DELTA_PROBEABLE_RADIUS) { + X_current /= 1.25; + Y_current /= 1.25; + if (verbose_level > 3) { + SERIAL_ECHOPAIR("Pulling point towards center:", X_current); + SERIAL_ECHOPAIR(", ", Y_current); + SERIAL_EOL; + delay(50); + } + } + #endif if (verbose_level > 3) { + SERIAL_PROTOCOL("Going to:"); SERIAL_ECHOPAIR("x: ", X_current); SERIAL_ECHOPAIR("y: ", Y_current); + SERIAL_ECHOPAIR(" z: ", current_position[Z_AXIS]); SERIAL_EOL; + delay(55); } - - do_blocking_move_to(X_current, Y_current, Z_current); // this also updates current_position - + do_blocking_move_to_xy(X_current, Y_current); } // n_legs loop - - // Go back to the probe location - do_blocking_move_to(X_probe_location, Y_probe_location, Z_start_location); // this also updates current_position - } // n_legs - if (deploy_probe_for_each_reading) { - deploy_z_probe(); - delay(1000); + // We don't really have to do this move, but if we don't we can see a funny shift in the Z Height + // Because the user might not have the Z_RAISE_BEFORE_PROBING height identical to the + // Z_RAISE_BETWEEN_PROBING height. This gets us back to the probe location at the same height that + // we have been running around the circle at. + do_blocking_move_to_xy(X_probe_location - X_PROBE_OFFSET_FROM_EXTRUDER, Y_probe_location - Y_PROBE_OFFSET_FROM_EXTRUDER); + if (deploy_probe_for_each_reading) + sample_set[n] = probe_pt(X_probe_location, Y_probe_location, Z_RAISE_BEFORE_PROBING, ProbeDeployAndStow, verbose_level); + else { + if (n == n_samples - 1) + sample_set[n] = probe_pt(X_probe_location, Y_probe_location, Z_RAISE_BEFORE_PROBING, ProbeStow, verbose_level); else + sample_set[n] = probe_pt(X_probe_location, Y_probe_location, Z_RAISE_BEFORE_PROBING, ProbeStay, verbose_level); } - setup_for_endstop_move(); - run_z_probe(); - - sample_set[n] = current_position[Z_AXIS]; - // // Get the current mean for the data points we have so far // @@ -3738,13 +3914,13 @@ inline void gcode_M42() { sum += ss * ss; } sigma = sqrt(sum / (n + 1)); - if (verbose_level > 1) { SERIAL_PROTOCOL(n + 1); SERIAL_PROTOCOLPGM(" of "); SERIAL_PROTOCOL((int)n_samples); SERIAL_PROTOCOLPGM(" z: "); SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6); + delay(50); if (verbose_level > 2) { SERIAL_PROTOCOLPGM(" mean: "); SERIAL_PROTOCOL_F(mean, 6); @@ -3752,36 +3928,28 @@ inline void gcode_M42() { SERIAL_PROTOCOL_F(sigma, 6); } } - if (verbose_level > 0) SERIAL_EOL; + delay(50); + do_blocking_move_to_z(current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS); + } // End of probe loop code - plan_buffer_line(X_probe_location, Y_probe_location, Z_start_location, current_position[E_AXIS], homing_feedrate[Z_AXIS] / 60, active_extruder); - st_synchronize(); - - // Stow between - if (deploy_probe_for_each_reading) { - stow_z_probe(); - delay(1000); - } - } - - // Stow after - if (!deploy_probe_for_each_reading) { - stow_z_probe(); - delay(1000); - } - - clean_up_after_endstop_move(); + // raise_z_after_probing(); if (verbose_level > 0) { SERIAL_PROTOCOLPGM("Mean: "); SERIAL_PROTOCOL_F(mean, 6); SERIAL_EOL; + delay(25); } SERIAL_PROTOCOLPGM("Standard Deviation: "); SERIAL_PROTOCOL_F(sigma, 6); SERIAL_EOL; SERIAL_EOL; + delay(25); + + clean_up_after_endstop_move(); + + gcode_M114(); // Send end position to RepetierHost } #endif // AUTO_BED_LEVELING_FEATURE && Z_MIN_PROBE_REPEATABILITY_TEST @@ -3801,16 +3969,13 @@ inline void gcode_M104() { setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset); #endif } + + print_job_stop(); } -/** - * M105: Read hot end and bed temperature - */ -inline void gcode_M105() { - if (setTargetedHotend(105)) return; +#if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) - #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) - SERIAL_PROTOCOLPGM(MSG_OK); + void print_heaterstates() { #if HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675) SERIAL_PROTOCOLPGM(" T:"); SERIAL_PROTOCOL_F(degHotend(target_extruder), 1); @@ -3823,78 +3988,119 @@ inline void gcode_M105() { SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOL_F(degTargetBed(), 1); #endif - for (int8_t e = 0; e < EXTRUDERS; ++e) { - SERIAL_PROTOCOLPGM(" T"); - SERIAL_PROTOCOL(e); - SERIAL_PROTOCOLCHAR(':'); - SERIAL_PROTOCOL_F(degHotend(e), 1); - SERIAL_PROTOCOLPGM(" /"); - SERIAL_PROTOCOL_F(degTargetHotend(e), 1); - } + #if EXTRUDERS > 1 + for (int8_t e = 0; e < EXTRUDERS; ++e) { + SERIAL_PROTOCOLPGM(" T"); + SERIAL_PROTOCOL(e); + SERIAL_PROTOCOLCHAR(':'); + SERIAL_PROTOCOL_F(degHotend(e), 1); + SERIAL_PROTOCOLPGM(" /"); + SERIAL_PROTOCOL_F(degTargetHotend(e), 1); + } + #endif + #if HAS_TEMP_BED + SERIAL_PROTOCOLPGM(" B@:"); + #ifdef BED_WATTS + SERIAL_PROTOCOL(((BED_WATTS) * getHeaterPower(-1)) / 127); + SERIAL_PROTOCOLCHAR('W'); + #else + SERIAL_PROTOCOL(getHeaterPower(-1)); + #endif + #endif + SERIAL_PROTOCOLPGM(" @:"); + #ifdef EXTRUDER_WATTS + SERIAL_PROTOCOL(((EXTRUDER_WATTS) * getHeaterPower(target_extruder)) / 127); + SERIAL_PROTOCOLCHAR('W'); + #else + SERIAL_PROTOCOL(getHeaterPower(target_extruder)); + #endif + #if EXTRUDERS > 1 + for (int8_t e = 0; e < EXTRUDERS; ++e) { + SERIAL_PROTOCOLPGM(" @"); + SERIAL_PROTOCOL(e); + SERIAL_PROTOCOLCHAR(':'); + #ifdef EXTRUDER_WATTS + SERIAL_PROTOCOL(((EXTRUDER_WATTS) * getHeaterPower(e)) / 127); + SERIAL_PROTOCOLCHAR('W'); + #else + SERIAL_PROTOCOL(getHeaterPower(e)); + #endif + } + #endif + #if ENABLED(SHOW_TEMP_ADC_VALUES) + #if HAS_TEMP_BED + SERIAL_PROTOCOLPGM(" ADC B:"); + SERIAL_PROTOCOL_F(degBed(), 1); + SERIAL_PROTOCOLPGM("C->"); + SERIAL_PROTOCOL_F(rawBedTemp() / OVERSAMPLENR, 0); + #endif + for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { + SERIAL_PROTOCOLPGM(" T"); + SERIAL_PROTOCOL(cur_extruder); + SERIAL_PROTOCOLCHAR(':'); + SERIAL_PROTOCOL_F(degHotend(cur_extruder), 1); + SERIAL_PROTOCOLPGM("C->"); + SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder) / OVERSAMPLENR, 0); + } + #endif + } +#endif + +/** + * M105: Read hot end and bed temperature + */ +inline void gcode_M105() { + if (setTargetedHotend(105)) return; + + #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) + SERIAL_PROTOCOLPGM(MSG_OK); + print_heaterstates(); #else // !HAS_TEMP_0 && !HAS_TEMP_BED SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS); #endif - SERIAL_PROTOCOLPGM(" @:"); - #ifdef EXTRUDER_WATTS - SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(target_extruder)) / 127); - SERIAL_PROTOCOLCHAR('W'); - #else - SERIAL_PROTOCOL(getHeaterPower(target_extruder)); - #endif - - SERIAL_PROTOCOLPGM(" B@:"); - #ifdef BED_WATTS - SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1)) / 127); - SERIAL_PROTOCOLCHAR('W'); - #else - SERIAL_PROTOCOL(getHeaterPower(-1)); - #endif - - #if ENABLED(SHOW_TEMP_ADC_VALUES) - #if HAS_TEMP_BED - SERIAL_PROTOCOLPGM(" ADC B:"); - SERIAL_PROTOCOL_F(degBed(), 1); - SERIAL_PROTOCOLPGM("C->"); - SERIAL_PROTOCOL_F(rawBedTemp() / OVERSAMPLENR, 0); - #endif - for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { - SERIAL_PROTOCOLPGM(" T"); - SERIAL_PROTOCOL(cur_extruder); - SERIAL_PROTOCOLCHAR(':'); - SERIAL_PROTOCOL_F(degHotend(cur_extruder), 1); - SERIAL_PROTOCOLPGM("C->"); - SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder) / OVERSAMPLENR, 0); - } - #endif - SERIAL_EOL; } -#if HAS_FAN +#if FAN_COUNT > 0 /** * M106: Set Fan Speed + * + * S<int> Speed between 0-255 + * P<index> Fan index, if more than one fan */ - inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value_short(), 0, 255) : 255; } + inline void gcode_M106() { + uint16_t s = code_seen('S') ? code_value_short() : 255, + p = code_seen('P') ? code_value_short() : 0; + NOMORE(s, 255); + if (p < FAN_COUNT) fanSpeeds[p] = s; + } /** * M107: Fan Off */ - inline void gcode_M107() { fanSpeed = 0; } + inline void gcode_M107() { + uint16_t p = code_seen('P') ? code_value_short() : 0; + if (p < FAN_COUNT) fanSpeeds[p] = 0; + } -#endif // HAS_FAN +#endif // FAN_COUNT > 0 /** - * M109: Wait for extruder(s) to reach temperature + * M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating. + * Rxxx Wait for extruder(s) to reach temperature. Waits when heating and cooling. */ inline void gcode_M109() { + bool no_wait_for_cooling = true; + + // Start hook must happen before setTargetHotend() + print_job_start(); + if (setTargetedHotend(109)) return; if (marlin_debug_flags & DEBUG_DRYRUN) return; - LCD_MESSAGEPGM(MSG_HEATING); - no_wait_for_cooling = code_seen('S'); if (no_wait_for_cooling || code_seen('R')) { float temp = code_value(); @@ -3903,8 +4109,12 @@ inline void gcode_M109() { if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset); #endif + + if (temp > degHotend(target_extruder)) LCD_MESSAGEPGM(MSG_HEATING); } + if (print_job_stop()) LCD_MESSAGEPGM(WELCOME_MSG); + #if ENABLED(AUTOTEMP) autotemp_enabled = code_seen('F'); if (autotemp_enabled) autotemp_factor = code_value(); @@ -3912,34 +4122,36 @@ inline void gcode_M109() { if (code_seen('B')) autotemp_max = code_value(); #endif - millis_t temp_ms = millis(); - - /* See if we are heating up or cooling down */ - target_direction = isHeatingHotend(target_extruder); // true if heating, false if cooling + // Exit if the temperature is above target and not waiting for cooling + if (no_wait_for_cooling && !isHeatingHotend(target_extruder)) return; - cancel_heatup = false; + // Prevents a wait-forever situation if R is misused i.e. M109 R0 + // Try to calculate a ballpark safe margin by halving EXTRUDE_MINTEMP + if (degTargetHotend(target_extruder) < (EXTRUDE_MINTEMP/2)) return; #ifdef TEMP_RESIDENCY_TIME long residency_start_ms = -1; - /* continue to loop until we have reached the target temp - _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ - while ((!cancel_heatup) && ((residency_start_ms == -1) || - (residency_start_ms >= 0 && (((unsigned int)(millis() - residency_start_ms)) < (TEMP_RESIDENCY_TIME * 1000UL))))) + // Loop until the temperature has stabilized + #define TEMP_CONDITIONS (residency_start_ms < 0 || now < residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL) #else - while (target_direction ? (isHeatingHotend(target_extruder)) : (isCoolingHotend(target_extruder) && (no_wait_for_cooling == false))) + // Loop until the temperature is very close target + #define TEMP_CONDITIONS (fabs(degHotend(target_extruder) - degTargetHotend(target_extruder)) < 0.75f) #endif //TEMP_RESIDENCY_TIME - { // while loop - if (millis() > temp_ms + 1000UL) { //Print temp & remaining time every 1s while waiting - SERIAL_PROTOCOLPGM("T:"); - SERIAL_PROTOCOL_F(degHotend(target_extruder), 1); - SERIAL_PROTOCOLPGM(" E:"); - SERIAL_PROTOCOL((int)target_extruder); + cancel_heatup = false; + millis_t now = millis(), next_temp_ms = now + 1000UL; + while (!cancel_heatup && TEMP_CONDITIONS) { + now = millis(); + if (now > next_temp_ms) { //Print temp & remaining time every 1s while waiting + next_temp_ms = now + 1000UL; + #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) + print_heaterstates(); + #endif #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); - if (residency_start_ms > -1) { - temp_ms = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residency_start_ms)) / 1000UL; - SERIAL_PROTOCOLLN(temp_ms); + if (residency_start_ms >= 0) { + long rem = (((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL; + SERIAL_PROTOCOLLN(rem); } else { SERIAL_PROTOCOLLNPGM("?"); @@ -3947,26 +4159,21 @@ inline void gcode_M109() { #else SERIAL_EOL; #endif - temp_ms = millis(); } idle(); + refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out #ifdef TEMP_RESIDENCY_TIME - // start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time - // or when current temp falls outside the hysteresis after target temp was reached - if ((residency_start_ms == -1 && target_direction && (degHotend(target_extruder) >= (degTargetHotend(target_extruder) - TEMP_WINDOW))) || - (residency_start_ms == -1 && !target_direction && (degHotend(target_extruder) <= (degTargetHotend(target_extruder) + TEMP_WINDOW))) || - (residency_start_ms > -1 && labs(degHotend(target_extruder) - degTargetHotend(target_extruder)) > TEMP_HYSTERESIS) ) - { + // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. + // Restart the timer whenever the temperature falls outside the hysteresis. + if (labs(degHotend(target_extruder) - degTargetHotend(target_extruder)) > ((residency_start_ms < 0) ? TEMP_WINDOW : TEMP_HYSTERESIS)) residency_start_ms = millis(); - } #endif //TEMP_RESIDENCY_TIME - } + + } // while(!cancel_heatup && TEMP_CONDITIONS) LCD_MESSAGEPGM(MSG_HEATING_COMPLETE); - refresh_cmd_timeout(); - print_job_start_ms = previous_cmd_ms; } #if HAS_TEMP_BED @@ -3979,36 +4186,37 @@ inline void gcode_M109() { if (marlin_debug_flags & DEBUG_DRYRUN) return; LCD_MESSAGEPGM(MSG_BED_HEATING); - no_wait_for_cooling = code_seen('S'); + bool no_wait_for_cooling = code_seen('S'); if (no_wait_for_cooling || code_seen('R')) setTargetBed(code_value()); - millis_t temp_ms = millis(); + // Exit if the temperature is above target and not waiting for cooling + if (no_wait_for_cooling && !isHeatingBed()) return; cancel_heatup = false; - target_direction = isHeatingBed(); // true if heating, false if cooling - - while ((target_direction && !cancel_heatup) ? isHeatingBed() : isCoolingBed() && !no_wait_for_cooling) { - millis_t ms = millis(); - if (ms > temp_ms + 1000UL) { //Print Temp Reading every 1 second while heating up. - temp_ms = ms; - float tt = degHotend(active_extruder); - SERIAL_PROTOCOLPGM("T:"); - SERIAL_PROTOCOL(tt); - SERIAL_PROTOCOLPGM(" E:"); - SERIAL_PROTOCOL((int)active_extruder); - SERIAL_PROTOCOLPGM(" B:"); - SERIAL_PROTOCOL_F(degBed(), 1); + millis_t now = millis(), next_temp_ms = now + 1000UL; + while (!cancel_heatup && degTargetBed() != degBed()) { + millis_t now = millis(); + if (now > next_temp_ms) { //Print Temp Reading every 1 second while heating up. + next_temp_ms = now + 1000UL; + print_heaterstates(); SERIAL_EOL; } idle(); + refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out } LCD_MESSAGEPGM(MSG_BED_DONE); - refresh_cmd_timeout(); } #endif // HAS_TEMP_BED +/** + * M110: Set Current Line Number + */ +inline void gcode_M110() { + if (code_seen('N')) gcode_N = code_value_long(); +} + /** * M111: Set the debug level */ @@ -4085,7 +4293,7 @@ inline void gcode_M140() { * F<fan speed> */ inline void gcode_M145() { - uint8_t material = code_seen('S') ? code_value_short() : 0; + int8_t material = code_seen('S') ? code_value_short() : 0; if (material < 0 || material > 1) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_ERR_MATERIAL_INDEX); @@ -4163,7 +4371,13 @@ inline void gcode_M140() { inline void gcode_M81() { disable_all_heaters(); finishAndDisableSteppers(); - fanSpeed = 0; + #if FAN_COUNT > 0 + #if FAN_COUNT > 1 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #else + fanSpeeds[0] = 0; + #endif + #endif delay(1000); // Wait 1 second before switching off #if HAS_SUICIDE st_synchronize(); @@ -4264,12 +4478,33 @@ inline void gcode_M114() { SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOL(current_position[E_AXIS]); - SERIAL_PROTOCOLPGM(MSG_COUNT_X); - SERIAL_PROTOCOL(st_get_position_mm(X_AXIS)); - SERIAL_PROTOCOLPGM(" Y:"); - SERIAL_PROTOCOL(st_get_position_mm(Y_AXIS)); - SERIAL_PROTOCOLPGM(" Z:"); - SERIAL_PROTOCOL(st_get_position_mm(Z_AXIS)); + CRITICAL_SECTION_START; + extern volatile long count_position[NUM_AXIS]; + long xpos = count_position[X_AXIS], + ypos = count_position[Y_AXIS], + zpos = count_position[Z_AXIS]; + CRITICAL_SECTION_END; + + #if ENABLED(COREXY) || ENABLED(COREXZ) + SERIAL_PROTOCOLPGM(MSG_COUNT_A); + #else + SERIAL_PROTOCOLPGM(MSG_COUNT_X); + #endif + SERIAL_PROTOCOL(xpos); + + #if ENABLED(COREXY) + SERIAL_PROTOCOLPGM(" B:"); + #else + SERIAL_PROTOCOLPGM(" Y:"); + #endif + SERIAL_PROTOCOL(ypos); + + #if ENABLED(COREXZ) + SERIAL_PROTOCOLPGM(" C:"); + #else + SERIAL_PROTOCOLPGM(" Z:"); + #endif + SERIAL_PROTOCOL(zpos); SERIAL_EOL; @@ -4348,14 +4583,14 @@ inline void gcode_M119() { } /** - * M120: Enable endstops + * M120: Enable endstops and set non-homing endstop state to "enabled" */ -inline void gcode_M120() { enable_endstops(true); } +inline void gcode_M120() { enable_endstops_globally(true); } /** - * M121: Disable endstops + * M121: Disable endstops and set non-homing endstop state to "disabled" */ -inline void gcode_M121() { enable_endstops(false); } +inline void gcode_M121() { enable_endstops_globally(false); } #if ENABLED(BLINKM) @@ -4730,19 +4965,18 @@ inline void gcode_M226() { if (servo_index >= 0 && servo_index < NUM_SERVOS) servo[servo_index].move(servo_position); else { - SERIAL_ECHO_START; - SERIAL_ECHO("Servo "); - SERIAL_ECHO(servo_index); - SERIAL_ECHOLN(" out of range"); + SERIAL_ERROR_START; + SERIAL_ERROR("Servo "); + SERIAL_ERROR(servo_index); + SERIAL_ERRORLN(" out of range"); } } else if (servo_index >= 0) { - SERIAL_PROTOCOL(MSG_OK); - SERIAL_PROTOCOL(" Servo "); - SERIAL_PROTOCOL(servo_index); - SERIAL_PROTOCOL(": "); - SERIAL_PROTOCOL(servo[servo_index].read()); - SERIAL_EOL; + SERIAL_ECHO_START; + SERIAL_ECHO(" Servo "); + SERIAL_ECHO(servo_index); + SERIAL_ECHO(": "); + SERIAL_ECHOLN(servo[servo_index].read()); } } @@ -4793,27 +5027,27 @@ inline void gcode_M226() { #endif updatePID(); - SERIAL_PROTOCOL(MSG_OK); + SERIAL_ECHO_START; #if ENABLED(PID_PARAMS_PER_EXTRUDER) - SERIAL_PROTOCOL(" e:"); // specify extruder in serial output - SERIAL_PROTOCOL(e); + SERIAL_ECHO(" e:"); // specify extruder in serial output + SERIAL_ECHO(e); #endif // PID_PARAMS_PER_EXTRUDER - SERIAL_PROTOCOL(" p:"); - SERIAL_PROTOCOL(PID_PARAM(Kp, e)); - SERIAL_PROTOCOL(" i:"); - SERIAL_PROTOCOL(unscalePID_i(PID_PARAM(Ki, e))); - SERIAL_PROTOCOL(" d:"); - SERIAL_PROTOCOL(unscalePID_d(PID_PARAM(Kd, e))); + SERIAL_ECHO(" p:"); + SERIAL_ECHO(PID_PARAM(Kp, e)); + SERIAL_ECHO(" i:"); + SERIAL_ECHO(unscalePID_i(PID_PARAM(Ki, e))); + SERIAL_ECHO(" d:"); + SERIAL_ECHO(unscalePID_d(PID_PARAM(Kd, e))); #if ENABLED(PID_ADD_EXTRUSION_RATE) - SERIAL_PROTOCOL(" c:"); + SERIAL_ECHO(" c:"); //Kc does not have scaling applied above, or in resetting defaults - SERIAL_PROTOCOL(PID_PARAM(Kc, e)); + SERIAL_ECHO(PID_PARAM(Kc, e)); #endif SERIAL_EOL; } else { - SERIAL_ECHO_START; - SERIAL_ECHOLN(MSG_INVALID_EXTRUDER); + SERIAL_ERROR_START; + SERIAL_ERRORLN(MSG_INVALID_EXTRUDER); } } @@ -4827,14 +5061,13 @@ inline void gcode_M226() { if (code_seen('D')) bedKd = scalePID_d(code_value()); updatePID(); - SERIAL_PROTOCOL(MSG_OK); - SERIAL_PROTOCOL(" p:"); - SERIAL_PROTOCOL(bedKp); - SERIAL_PROTOCOL(" i:"); - SERIAL_PROTOCOL(unscalePID_i(bedKi)); - SERIAL_PROTOCOL(" d:"); - SERIAL_PROTOCOL(unscalePID_d(bedKd)); - SERIAL_EOL; + SERIAL_ECHO_START; + SERIAL_ECHO(" p:"); + SERIAL_ECHO(bedKp); + SERIAL_ECHO(" i:"); + SERIAL_ECHO(unscalePID_i(bedKi)); + SERIAL_ECHO(" d:"); + SERIAL_ECHOLN(unscalePID_d(bedKd)); } #endif // PIDTEMPBED @@ -4904,15 +5137,27 @@ inline void gcode_M226() { /** * M303: PID relay autotune - * S<temperature> sets the target temperature. (default target temperature = 150C) - * E<extruder> (-1 for the bed) + * + * S<temperature> sets the target temperature. (default 150C) + * E<extruder> (-1 for the bed) (default 0) * C<cycles> + * U<bool> with a non-zero value will apply the result to current settings */ inline void gcode_M303() { int e = code_seen('E') ? code_value_short() : 0; int c = code_seen('C') ? code_value_short() : 5; + bool u = code_seen('U') && code_value_short() != 0; + float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0); - PID_autotune(temp, e, c); + + if (e >= 0 && e < EXTRUDERS) + target_extruder = e; + + KEEPALIVE_STATE(NOT_BUSY); // don't send "busy: processing" messages during autotune output + + PID_autotune(temp, e, c, u); + + KEEPALIVE_STATE(IN_HANDLER); } #if ENABLED(SCARA) @@ -5087,7 +5332,7 @@ inline void gcode_M400() { st_synchronize(); } */ inline void gcode_M405() { if (code_seen('D')) meas_delay_cm = code_value(); - if (meas_delay_cm > MAX_MEASUREMENT_DELAY) meas_delay_cm = MAX_MEASUREMENT_DELAY; + NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); if (delay_index2 == -1) { //initialize the ring buffer if it has not been done since startup int temp_ratio = widthFil_to_size_ratio(); @@ -5193,7 +5438,7 @@ inline void gcode_M428() { SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR); LCD_ALERTMESSAGEPGM("Err: Too far!"); #if HAS_BUZZER - enqueuecommands_P(PSTR("M300 S40 P200")); + buzz(200, 40); #endif err = true; break; @@ -5207,7 +5452,8 @@ inline void gcode_M428() { sync_plan_position(); LCD_ALERTMESSAGEPGM("Offset applied."); #if HAS_BUZZER - enqueuecommands_P(PSTR("M300 S659 P200\nM300 S698 P200")); + buzz(200, 659); + buzz(200, 698); #endif } } @@ -5263,7 +5509,7 @@ inline void gcode_M503() { float value = code_value(); if (Z_PROBE_OFFSET_RANGE_MIN <= value && value <= Z_PROBE_OFFSET_RANGE_MAX) { zprobe_zoffset = value; - SERIAL_ECHOPGM(MSG_OK); + SERIAL_ECHO(zprobe_zoffset); } else { SERIAL_ECHOPGM(MSG_Z_MIN); @@ -5361,6 +5607,7 @@ inline void gcode_M503() { delay(100); LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE); millis_t next_tick = 0; + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) { #if DISABLED(AUTO_FILAMENT_CHANGE) millis_t ms = millis(); @@ -5368,9 +5615,7 @@ inline void gcode_M503() { lcd_quick_feedback(); next_tick = ms + 2500; // feedback every 2.5s while waiting } - manage_heater(); - manage_inactivity(true); - lcd_update(); + idle(true); #else current_position[E_AXIS] += AUTO_FILAMENT_CHANGE_LENGTH; destination[E_AXIS] = current_position[E_AXIS]; @@ -5378,6 +5623,7 @@ inline void gcode_M503() { st_synchronize(); #endif } // while(!lcd_clicked) + KEEPALIVE_STATE(IN_HANDLER); lcd_quick_feedback(); // click sound feedback #if ENABLED(AUTO_FILAMENT_CHANGE) @@ -5491,23 +5737,46 @@ inline void gcode_M907() { // this one uses actual amps in floating point for (int i = 0; i < NUM_AXIS; i++) if (code_seen(axis_codes[i])) digipot_i2c_set_current(i, code_value()); // for each additional extruder (named B,C,D,E..., channels 4,5,6,7...) - for (int i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (code_seen('B' + i - NUM_AXIS)) digipot_i2c_set_current(i, code_value()); + for (int i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (code_seen('B' + i - (NUM_AXIS))) digipot_i2c_set_current(i, code_value()); + #endif + #if ENABLED(DAC_STEPPER_CURRENT) + if (code_seen('S')) { + float dac_percent = code_value(); + for (uint8_t i = 0; i <= 4; i++) dac_current_percent(i, dac_percent); + } + for (uint8_t i = 0; i < NUM_AXIS; i++) if (code_seen(axis_codes[i])) dac_current_percent(i, code_value()); #endif } -#if HAS_DIGIPOTSS +#if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) /** * M908: Control digital trimpot directly (M908 P<pin> S<current>) */ inline void gcode_M908() { - digitalPotWrite( - code_seen('P') ? code_value() : 0, - code_seen('S') ? code_value() : 0 - ); + #if HAS_DIGIPOTSS + digitalPotWrite( + code_seen('P') ? code_value() : 0, + code_seen('S') ? code_value() : 0 + ); + #endif + #ifdef DAC_STEPPER_CURRENT + dac_current_raw( + code_seen('P') ? code_value_long() : -1, + code_seen('S') ? code_value_short() : 0 + ); + #endif } -#endif // HAS_DIGIPOTSS + #if ENABLED(DAC_STEPPER_CURRENT) // As with Printrbot RevF + + inline void gcode_M909() { dac_print_values(); } + + inline void gcode_M910() { dac_commit_eeprom(); } + + #endif + +#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT #if HAS_MICROSTEPS @@ -5595,12 +5864,8 @@ inline void gcode_T(uint8_t tmp_extruder) { } // apply Y & Z extruder offset (x offset is already used in determining home pos) - current_position[Y_AXIS] = current_position[Y_AXIS] - - extruder_offset[Y_AXIS][active_extruder] + - extruder_offset[Y_AXIS][tmp_extruder]; - current_position[Z_AXIS] = current_position[Z_AXIS] - - extruder_offset[Z_AXIS][active_extruder] + - extruder_offset[Z_AXIS][tmp_extruder]; + current_position[Y_AXIS] -= extruder_offset[Y_AXIS][active_extruder] - extruder_offset[Y_AXIS][tmp_extruder]; + current_position[Z_AXIS] -= extruder_offset[Z_AXIS][active_extruder] - extruder_offset[Z_AXIS][tmp_extruder]; active_extruder = tmp_extruder; // This function resets the max/min values - the current position may be overwritten below. @@ -5627,9 +5892,24 @@ inline void gcode_T(uint8_t tmp_extruder) { delayed_move_time = 0; } #else // !DUAL_X_CARRIAGE - // Offset extruder (only by XY) - for (int i = X_AXIS; i <= Y_AXIS; i++) - current_position[i] += extruder_offset[i][tmp_extruder] - extruder_offset[i][active_extruder]; + #if ENABLED(AUTO_BED_LEVELING_FEATURE) + // Offset extruder, make sure to apply the bed level rotation matrix + vector_3 tmp_offset_vec = vector_3(extruder_offset[X_AXIS][tmp_extruder], + extruder_offset[Y_AXIS][tmp_extruder], + extruder_offset[Z_AXIS][tmp_extruder]), + act_offset_vec = vector_3(extruder_offset[X_AXIS][active_extruder], + extruder_offset[Y_AXIS][active_extruder], + extruder_offset[Z_AXIS][active_extruder]), + offset_vec = tmp_offset_vec - act_offset_vec; + offset_vec.apply_rotation(plan_bed_level_matrix.transpose(plan_bed_level_matrix)); + current_position[X_AXIS] += offset_vec.x; + current_position[Y_AXIS] += offset_vec.y; + current_position[Z_AXIS] += offset_vec.z; + #else // !AUTO_BED_LEVELING_FEATURE + // Offset extruder (only by XY) + for (int i=X_AXIS; i<=Y_AXIS; i++) + current_position[i] += extruder_offset[i][tmp_extruder] - extruder_offset[i][active_extruder]; + #endif // !AUTO_BED_LEVELING_FEATURE // Set the new active extruder and position active_extruder = tmp_extruder; #endif // !DUAL_X_CARRIAGE @@ -5669,7 +5949,7 @@ void process_next_command() { // Sanitize the current command: // - Skip leading spaces - // - Bypass N[0-9][0-9]*[ ]* + // - Bypass N[-0-9][0-9]*[ ]* // - Overwrite * with nul to mark the end while (*current_command == ' ') ++current_command; if (*current_command == 'N' && ((current_command[1] >= '0' && current_command[1] <= '9') || current_command[1] == '-')) { @@ -5683,8 +5963,12 @@ void process_next_command() { // Get the command code, which must be G, M, or T char command_code = *current_command; + // Skip the letter-code and spaces to get the numeric part + current_command_args = current_command + 1; + while (*current_command_args == ' ') ++current_command_args; + // The code must have a numeric value - bool code_is_good = (current_command[1] >= '0' && current_command[1] <= '9'); + bool code_is_good = (*current_command_args >= '0' && *current_command_args <= '9'); int codenum; // define ahead of goto @@ -5693,14 +5977,14 @@ void process_next_command() { // Args pointer optimizes code_seen, especially those taking XYZEF // This wastes a little cpu on commands that expect no arguments. - current_command_args = current_command; - while (*current_command_args && *current_command_args != ' ') ++current_command_args; - while (*current_command_args == ' ') ++current_command_args; + while (*current_command_args == ' ' || (*current_command_args >= '0' && *current_command_args <= '9')) ++current_command_args; // Interpret the code int seen_pointer = current_command; codenum = code_value_short(); + KEEPALIVE_STATE(IN_HANDLER); + // Handle a known G, M, or T switch (command_code) { case 'G': switch (codenum) { @@ -5848,6 +6132,10 @@ void process_next_command() { gcode_M104(); break; + case 110: // M110: Set Current Line Number + gcode_M110(); + break; + case 111: // M111: Set debug level gcode_M111(); break; @@ -5862,6 +6150,7 @@ void process_next_command() { case 105: // M105: Read current temperature gcode_M105(); + KEEPALIVE_STATE(NOT_BUSY); return; // "ok" already printed case 109: // M109: Wait for temperature @@ -5874,14 +6163,14 @@ void process_next_command() { break; #endif // HAS_TEMP_BED - #if HAS_FAN + #if FAN_COUNT > 0 case 106: // M106: Fan On gcode_M106(); break; case 107: // M107: Fan Off gcode_M107(); break; - #endif // HAS_FAN + #endif // FAN_COUNT > 0 #if ENABLED(BARICUDA) // PWM for HEATER_1_PIN @@ -6187,11 +6476,25 @@ void process_next_command() { gcode_M907(); break; - #if HAS_DIGIPOTSS + #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) + case 908: // M908 Control digital trimpot directly. gcode_M908(); break; - #endif // HAS_DIGIPOTSS + + #if ENABLED(DAC_STEPPER_CURRENT) // As with Printrbot RevF + + case 909: // M909 Print digipot/DAC current value + gcode_M909(); + break; + + case 910: // M910 Commit digipot/DAC value to external EEPROM + gcode_M910(); + break; + + #endif + + #endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT #if HAS_MICROSTEPS @@ -6218,6 +6521,8 @@ void process_next_command() { default: code_is_good = false; } + KEEPALIVE_STATE(NOT_BUSY); + ExitUnknownCommand: // Still unknown command? Throw an error @@ -6236,12 +6541,16 @@ void FlushSerialRequestResend() { void ok_to_send() { refresh_cmd_timeout(); - #if ENABLED(SDSUPPORT) - if (fromsd[cmd_queue_index_r]) return; - #endif + if (!send_ok[cmd_queue_index_r]) return; SERIAL_PROTOCOLPGM(MSG_OK); #if ENABLED(ADVANCED_OK) - SERIAL_PROTOCOLPGM(" N"); SERIAL_PROTOCOL(gcode_LastN); + char* p = command_queue[cmd_queue_index_r]; + if (*p == 'N') { + SERIAL_PROTOCOL(' '); + SERIAL_ECHO(*p++); + while ((*p >= '0' && *p <= '9') || *p == '-') + SERIAL_ECHO(*p++); + } SERIAL_PROTOCOLPGM(" P"); SERIAL_PROTOCOL(int(BLOCK_BUFFER_SIZE - movesplanned() - 1)); SERIAL_PROTOCOLPGM(" B"); SERIAL_PROTOCOL(BUFSIZE - commands_in_queue); #endif @@ -6285,9 +6594,9 @@ void clamp_to_software_endstops(float target[3]) { delta_tower2_y = -COS_60 * (radius + DELTA_RADIUS_TRIM_TOWER_2); delta_tower3_x = 0.0; // back middle tower delta_tower3_y = (radius + DELTA_RADIUS_TRIM_TOWER_3); - delta_diagonal_rod_2_tower_1 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_1); - delta_diagonal_rod_2_tower_2 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_2); - delta_diagonal_rod_2_tower_3 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_3); + delta_diagonal_rod_2_tower_1 = sq(diagonal_rod + delta_diagonal_rod_trim_tower_1); + delta_diagonal_rod_2_tower_2 = sq(diagonal_rod + delta_diagonal_rod_trim_tower_2); + delta_diagonal_rod_2_tower_3 = sq(diagonal_rod + delta_diagonal_rod_trim_tower_3); } void calculate_delta(float cartesian[3]) { @@ -6382,34 +6691,38 @@ void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_ set_current_to_destination(); return; } - float nx, ny, ne, normalized_dist; - if (ix > pix && (x_splits) & BIT(ix)) { + float nx, ny, nz, ne, normalized_dist; + if (ix > pix && TEST(x_splits, ix)) { nx = mbl.get_x(ix); normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]); ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist; + nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist; ne = current_position[E_AXIS] + (e - current_position[E_AXIS]) * normalized_dist; - x_splits ^= BIT(ix); + CBI(x_splits, ix); } - else if (ix < pix && (x_splits) & BIT(pix)) { + else if (ix < pix && TEST(x_splits, pix)) { nx = mbl.get_x(pix); normalized_dist = (nx - current_position[X_AXIS]) / (x - current_position[X_AXIS]); ny = current_position[Y_AXIS] + (y - current_position[Y_AXIS]) * normalized_dist; + nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist; ne = current_position[E_AXIS] + (e - current_position[E_AXIS]) * normalized_dist; - x_splits ^= BIT(pix); + CBI(x_splits, pix); } - else if (iy > piy && (y_splits) & BIT(iy)) { + else if (iy > piy && TEST(y_splits, iy)) { ny = mbl.get_y(iy); normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]); nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist; + nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist; ne = current_position[E_AXIS] + (e - current_position[E_AXIS]) * normalized_dist; - y_splits ^= BIT(iy); + CBI(y_splits, iy); } - else if (iy < piy && (y_splits) & BIT(piy)) { + else if (iy < piy && TEST(y_splits, piy)) { ny = mbl.get_y(piy); normalized_dist = (ny - current_position[Y_AXIS]) / (y - current_position[Y_AXIS]); nx = current_position[X_AXIS] + (x - current_position[X_AXIS]) * normalized_dist; + nz = current_position[Z_AXIS] + (z - current_position[Z_AXIS]) * normalized_dist; ne = current_position[E_AXIS] + (e - current_position[E_AXIS]) * normalized_dist; - y_splits ^= BIT(piy); + CBI(y_splits, piy); } else { // Already split on a border @@ -6420,10 +6733,12 @@ void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_ // Do the split and look for more borders destination[X_AXIS] = nx; destination[Y_AXIS] = ny; + destination[Z_AXIS] = nz; destination[E_AXIS] = ne; - mesh_plan_buffer_line(nx, ny, z, ne, feed_rate, extruder, x_splits, y_splits); + mesh_plan_buffer_line(nx, ny, nz, ne, feed_rate, extruder, x_splits, y_splits); destination[X_AXIS] = x; destination[Y_AXIS] = y; + destination[Z_AXIS] = z; destination[E_AXIS] = e; mesh_plan_buffer_line(x, y, z, e, feed_rate, extruder, x_splits, y_splits); } @@ -6625,7 +6940,7 @@ void plan_arc( float mm_of_travel = hypot(angular_travel * radius, fabs(linear_travel)); if (mm_of_travel < 0.001) return; - uint16_t segments = floor(mm_of_travel / MM_PER_ARC_SEGMENT); + uint16_t segments = floor(mm_of_travel / (MM_PER_ARC_SEGMENT)); if (segments == 0) segments = 1; float theta_per_segment = angular_travel / segments; @@ -6734,11 +7049,11 @@ void plan_arc( #if HAS_CONTROLLERFAN void controllerFan() { - static millis_t lastMotor = 0; // Last time a motor was turned on - static millis_t lastMotorCheck = 0; // Last time the state was checked + static millis_t lastMotorOn = 0; // Last time a motor was turned on + static millis_t nextMotorCheck = 0; // Last time the state was checked millis_t ms = millis(); - if (ms >= lastMotorCheck + 2500) { // Not a time critical function, so we only check every 2500ms - lastMotorCheck = ms; + if (ms >= nextMotorCheck) { + nextMotorCheck = ms + 2500; // Not a time critical function, so only check every 2.5s if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON || soft_pwm_bed > 0 || E0_ENABLE_READ == E_ENABLE_ON // If any of the drivers are enabled... #if EXTRUDERS > 1 @@ -6754,9 +7069,12 @@ void plan_arc( #endif #endif ) { - lastMotor = ms; //... set time to NOW so the fan will turn on + lastMotorOn = ms; //... set time to NOW so the fan will turn on } - uint8_t speed = (lastMotor == 0 || ms >= lastMotor + (CONTROLLERFAN_SECS * 1000UL)) ? 0 : CONTROLLERFAN_SPEED; + + // Fan off if no steppers have been enabled for CONTROLLERFAN_SECS seconds + uint8_t speed = (lastMotorOn == 0 || ms >= lastMotorOn + (CONTROLLERFAN_SECS) * 1000UL) ? 0 : CONTROLLERFAN_SPEED; + // allows digital or PWM fan output to be used (see M42 handling) digitalWrite(CONTROLLERFAN_PIN, speed); analogWrite(CONTROLLERFAN_PIN, speed); @@ -6892,9 +7210,18 @@ void disable_all_steppers() { /** * Standard idle routine keeps the machine alive */ -void idle() { +void idle( + #if ENABLED(FILAMENTCHANGEENABLE) + bool no_stepper_sleep/*=false*/ + #endif +) { manage_heater(); - manage_inactivity(); + manage_inactivity( + #if ENABLED(FILAMENTCHANGEENABLE) + no_stepper_sleep + #endif + ); + host_keepalive(); lcd_update(); } @@ -6917,7 +7244,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { filrunout(); #endif - if (commands_in_queue < BUFSIZE - 1) get_command(); + if (commands_in_queue < BUFSIZE) get_command(); millis_t ms = millis(); @@ -6925,16 +7252,16 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { if (stepper_inactive_time && ms > previous_cmd_ms + stepper_inactive_time && !ignore_stepper_queue && !blocks_queued()) { - #if DISABLE_X == true + #if ENABLED(DISABLE_INACTIVE_X) disable_x(); #endif - #if DISABLE_Y == true + #if ENABLED(DISABLE_INACTIVE_Y) disable_y(); #endif - #if DISABLE_Z == true + #if ENABLED(DISABLE_INACTIVE_Z) disable_z(); #endif - #if DISABLE_E == true + #if ENABLED(DISABLE_INACTIVE_E) disable_e0(); disable_e1(); disable_e2(); @@ -6974,7 +7301,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { const int HOME_DEBOUNCE_DELAY = 2500; if (!READ(HOME_PIN)) { if (!homeDebounceCount) { - enqueuecommands_P(PSTR("G28")); + enqueue_and_echo_commands_P(PSTR("G28")); LCD_MESSAGEPGM(MSG_AUTO_HOME); } if (homeDebounceCount < HOME_DEBOUNCE_DELAY) @@ -6989,7 +7316,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { #endif #if ENABLED(EXTRUDER_RUNOUT_PREVENT) - if (ms > previous_cmd_ms + EXTRUDER_RUNOUT_SECONDS * 1000) + if (ms > previous_cmd_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000) if (degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP) { bool oldstatus; switch (active_extruder) { @@ -7018,8 +7345,8 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { } float oldepos = current_position[E_AXIS], oldedes = destination[E_AXIS]; plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], - destination[E_AXIS] + EXTRUDER_RUNOUT_EXTRUDE * EXTRUDER_RUNOUT_ESTEPS / axis_steps_per_unit[E_AXIS], - EXTRUDER_RUNOUT_SPEED / 60. * EXTRUDER_RUNOUT_ESTEPS / axis_steps_per_unit[E_AXIS], active_extruder); + destination[E_AXIS] + (EXTRUDER_RUNOUT_EXTRUDE) * (EXTRUDER_RUNOUT_ESTEPS) / axis_steps_per_unit[E_AXIS], + (EXTRUDER_RUNOUT_SPEED) / 60. * (EXTRUDER_RUNOUT_ESTEPS) / axis_steps_per_unit[E_AXIS], active_extruder); current_position[E_AXIS] = oldepos; destination[E_AXIS] = oldedes; plan_set_e_position(oldepos); @@ -7088,7 +7415,11 @@ void kill(const char* lcd_msg) { for (int i = 5; i--; lcd_update()) delay(200); // Wait a short time cli(); // disable interrupts suicide(); - while (1) { /* Intentionally left empty */ } // Wait for reset + while (1) { + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + } // Wait for reset } #if ENABLED(FILAMENT_RUNOUT_SENSOR) @@ -7096,7 +7427,7 @@ void kill(const char* lcd_msg) { void filrunout() { if (!filrunoutEnqueued) { filrunoutEnqueued = true; - enqueuecommands_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + enqueue_and_echo_commands_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); st_synchronize(); } } @@ -7189,7 +7520,7 @@ bool setTargetedHotend(int code) { SERIAL_CHAR('M'); SERIAL_ECHO(code); SERIAL_ECHOPGM(" " MSG_INVALID_EXTRUDER " "); - SERIAL_ECHOLN(target_extruder); + SERIAL_ECHOLN((int)target_extruder); return true; } } @@ -7206,3 +7537,50 @@ void calculate_volumetric_multipliers() { for (int i = 0; i < EXTRUDERS; i++) volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); } + +/** + * Start the print job timer + * + * The print job is only started if all extruders have their target temp at zero + * otherwise the print job timew would be reset everytime a M109 is received. + * + * @param t start timer timestamp + * + * @return true if the timer was started at function call + */ +bool print_job_start(millis_t t /* = 0 */) { + for (int i = 0; i < EXTRUDERS; i++) if (degTargetHotend(i) > 0) return false; + print_job_start_ms = (t) ? t : millis(); + print_job_stop_ms = 0; + return true; +} + +/** + * Output the print job timer in seconds + * + * @return the number of seconds + */ +millis_t print_job_timer() { + if (!print_job_start_ms) return 0; + return (((print_job_stop_ms > print_job_start_ms) + ? print_job_stop_ms : millis()) - print_job_start_ms) / 1000; +} + +/** + * Check if the running print job has finished and stop the timer + * + * When the target temperature for all extruders is zero then we assume that the + * print job has finished printing. There are some special conditions under which + * this assumption may not be valid: If during a print job for some reason the + * user decides to bring a nozzle temp down and only then heat the other afterwards. + * + * @param force stops the timer ignoring all pre-checks + * + * @return boolean true if the print job has finished printing + */ +bool print_job_stop(bool force /* = false */) { + if (!print_job_start_ms) return false; + if (!force) for (int i = 0; i < EXTRUDERS; i++) if (degTargetHotend(i) > 0) return false; + print_job_stop_ms = millis(); + return true; +} diff --git a/Marlin/SanityCheck.h b/Marlin/SanityCheck.h index 6831380bc8779bc275c7061cd0cb94a051c05bdf..e2802acc0f7ca42bace5bd43d7f0789e9a76a9c5 100644 --- a/Marlin/SanityCheck.h +++ b/Marlin/SanityCheck.h @@ -32,8 +32,8 @@ * Babystepping */ #if ENABLED(BABYSTEPPING) - #if ENABLED(COREXY) && ENABLED(BABYSTEP_XY) - #error BABYSTEPPING only implemented for Z axis on CoreXY. + #if DISABLED(ULTRA_LCD) + #error BABYSTEPPING requires an LCD controller. #endif #if ENABLED(SCARA) #error BABYSTEPPING is not implemented for SCARA yet. @@ -112,6 +112,7 @@ /** * Mesh Bed Leveling */ + #if ENABLED(MESH_BED_LEVELING) #if ENABLED(DELTA) #error MESH_BED_LEVELING does not yet support DELTA printers. @@ -122,8 +123,38 @@ #if MESH_NUM_X_POINTS > 7 || MESH_NUM_Y_POINTS > 7 #error MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS need to be less than 8. #endif +#elif ENABLED(MANUAL_BED_LEVELING) + #error MESH_BED_LEVELING is required for MANUAL_BED_LEVELING. +#endif + +/** + * Probes + */ + + /** + * A probe needs a pin + */ +#if (!((HAS_Z_MIN && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) || HAS_Z_PROBE )) && ( ENABLED(FIX_MOUNTED_PROBE) || defined(Z_ENDSTOP_SERVO_NR) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)) + #error A probe needs a pin! [Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN || HAS_Z_PROBE] +#endif + +#if ((HAS_Z_MIN && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) && HAS_Z_PROBE) && ( ENABLED(FIX_MOUNTED_PROBE) || defined(Z_ENDSTOP_SERVO_NR) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)) + #error A probe should not be connected to more then one pin! [Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN || HAS_Z_PROBE] +#endif + + /** + * Require one kind of probe + */ +#if ENABLED(AUTO_BED_LEVELING_FEATURE) && !( ENABLED(FIX_MOUNTED_PROBE) || defined(Z_ENDSTOP_SERVO_NR) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)) + #error For AUTO_BED_LEVELING_FEATURE define one kind of probe! {Servo | Z_PROBE_ALLEN_KEY | Z_PROBE_SLED | FIX_MOUNTED_PROBE] +#endif + +#if ENABLED(Z_SAFE_HOMING)&& !( ENABLED(FIX_MOUNTED_PROBE) || defined(Z_ENDSTOP_SERVO_NR) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)) + #error For Z_SAFE_HOMING define one kind of probe! {Servo | Z_PROBE_ALLEN_KEY | Z_PROBE_SLED | FIX_MOUNTED_PROBE] #endif +// To do: Fail with more then one probe defined + /** * Auto Bed Leveling */ @@ -228,10 +259,6 @@ #error You cannot use Z_PROBE_SLED with DELTA. #endif - #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - #error Z_MIN_PROBE_REPEATABILITY_TEST is not supported with DELTA yet. - #endif - #endif #endif @@ -261,22 +288,36 @@ /** * Make sure auto fan pins don't conflict with the fan pin */ -#if HAS_AUTO_FAN && HAS_FAN - #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN - #error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN. - #elif EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN - #error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN. - #elif EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN - #error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN. - #elif EXTRUDER_3_AUTO_FAN_PIN == FAN_PIN - #error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to FAN_PIN. +#if HAS_AUTO_FAN + #if HAS_FAN0 + #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN + #error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN. + #elif EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN + #error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN. + #elif EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN + #error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN. + #elif EXTRUDER_3_AUTO_FAN_PIN == FAN_PIN + #error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to FAN_PIN. + #endif #endif #endif -#if HAS_FAN && CONTROLLERFAN_PIN == FAN_PIN +#if HAS_FAN0 && CONTROLLERFAN_PIN == FAN_PIN #error You cannot set CONTROLLERFAN_PIN equal to FAN_PIN. #endif +#if HAS_CONTROLLERFAN + #if EXTRUDER_0_AUTO_FAN_PIN == CONTROLLERFAN_PIN + #error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN. + #elif EXTRUDER_1_AUTO_FAN_PIN == CONTROLLERFAN_PIN + #error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN. + #elif EXTRUDER_2_AUTO_FAN_PIN == CONTROLLERFAN_PIN + #error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN. + #elif EXTRUDER_3_AUTO_FAN_PIN == CONTROLLERFAN_PIN + #error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN. + #endif +#endif + /** * Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set. */ @@ -361,6 +402,12 @@ #error HAS_AUTOMATIC_VERSIONING deprecated - use USE_AUTOMATIC_VERSIONING instead #elif defined(ENABLE_AUTO_BED_LEVELING) #error ENABLE_AUTO_BED_LEVELING deprecated - use AUTO_BED_LEVELING_FEATURE instead +#elif defined(SDSLOW) + #error SDSLOW deprecated - set SPI_SPEED to SPI_HALF_SPEED instead +#elif defined(SDEXTRASLOW) + #error SDEXTRASLOW deprecated - set SPI_SPEED to SPI_QUARTER_SPEED instead +#elif defined(Z_RAISE_BEFORE_HOMING) + #error Z_RAISE_BEFORE_HOMING is deprecated. Use MIN_Z_HEIGHT_FOR_HOMING instead. #endif #endif //SANITYCHECK_H diff --git a/Marlin/Sd2Card.cpp b/Marlin/Sd2Card.cpp index dbb025f5d0518e3573d7a344e0e10b671f09c305..d2415a25a7d87becbc665018b590ff1c49b928eb 100644 --- a/Marlin/Sd2Card.cpp +++ b/Marlin/Sd2Card.cpp @@ -35,8 +35,8 @@ */ static void spiInit(uint8_t spiRate) { // See avr processor documentation - SPCR = BIT(SPE) | BIT(MSTR) | (spiRate >> 1); - SPSR = spiRate & 1 || spiRate == 6 ? 0 : BIT(SPI2X); + SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); + SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); } //------------------------------------------------------------------------------ /** SPI receive a byte */ @@ -498,9 +498,13 @@ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { spiRec(); #endif chipSelectHigh(); + // Send an additional dummy byte, required by Toshiba Flash Air SD Card + spiSend(0XFF); return true; fail: chipSelectHigh(); + // Send an additional dummy byte, required by Toshiba Flash Air SD Card + spiSend(0XFF); return false; } //------------------------------------------------------------------------------ diff --git a/Marlin/Sd2PinMap.h b/Marlin/Sd2PinMap.h index 94dbd6df759796e489b3b7af017859ce2f2d1d6d..2f4ceec1669f5cc6a4f9079eaaf630f6fb0c6e70 100644 --- a/Marlin/Sd2PinMap.h +++ b/Marlin/Sd2PinMap.h @@ -405,10 +405,10 @@ static inline __attribute__((always_inline)) void setPinMode(uint8_t pin, uint8_t mode) { if (__builtin_constant_p(pin) && pin < digitalPinCount) { if (mode) { - *digitalPinMap[pin].ddr |= BIT(digitalPinMap[pin].bit); + SBI(*digitalPinMap[pin].ddr, digitalPinMap[pin].bit); } else { - *digitalPinMap[pin].ddr &= ~BIT(digitalPinMap[pin].bit); + CBI(*digitalPinMap[pin].ddr, digitalPinMap[pin].bit); } } else { @@ -428,10 +428,10 @@ static inline __attribute__((always_inline)) void fastDigitalWrite(uint8_t pin, uint8_t value) { if (__builtin_constant_p(pin) && pin < digitalPinCount) { if (value) { - *digitalPinMap[pin].port |= BIT(digitalPinMap[pin].bit); + SBI(*digitalPinMap[pin].port, digitalPinMap[pin].bit); } else { - *digitalPinMap[pin].port &= ~BIT(digitalPinMap[pin].bit); + CBI(*digitalPinMap[pin].port, digitalPinMap[pin].bit); } } else { diff --git a/Marlin/SdBaseFile.cpp b/Marlin/SdBaseFile.cpp index 3806ac982c1adbadd690fe235bcb03026997f318..61deafde9f740801191d711df7a6e70632d05af4 100644 --- a/Marlin/SdBaseFile.cpp +++ b/Marlin/SdBaseFile.cpp @@ -291,7 +291,7 @@ bool SdBaseFile::getFilename(char* name) { return true; } //------------------------------------------------------------------------------ -void SdBaseFile::getpos(fpos_t* pos) { +void SdBaseFile::getpos(filepos_t* pos) { pos->position = curPosition_; pos->cluster = curCluster_; } @@ -923,7 +923,7 @@ fail: * \return The byte if no error and not at eof else -1; */ int SdBaseFile::peek() { - fpos_t pos; + filepos_t pos; getpos(&pos); int c = read(); if (c >= 0) setpos(&pos); @@ -1049,9 +1049,8 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { if (!isOpen() || !(flags_ & O_READ)) goto fail; // max bytes left in file - if (nbyte >= (fileSize_ - curPosition_)) { - nbyte = fileSize_ - curPosition_; - } + NOMORE(nbyte, fileSize_ - curPosition_); + // amount left to read toRead = nbyte; while (toRead > 0) { @@ -1077,7 +1076,7 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { uint16_t n = toRead; // amount to be read from current block - if (n > (512 - offset)) n = 512 - offset; + NOMORE(n, 512 - offset); // no buffering needed if n == 512 if (n == 512 && block != vol_->cacheBlockNumber()) { @@ -1135,7 +1134,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES) { // TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table. - n = ((VFAT->sequenceNumber & 0x1F) - 1) * FILENAME_LENGTH; + n = ((VFAT->sequenceNumber & 0x1F) - 1) * (FILENAME_LENGTH); for (uint8_t i = 0; i < FILENAME_LENGTH; i++) longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; // If this VFAT entry is the last one, add a NUL terminator at the end of the string @@ -1479,7 +1478,7 @@ fail: return false; } //------------------------------------------------------------------------------ -void SdBaseFile::setpos(fpos_t* pos) { +void SdBaseFile::setpos(filepos_t* pos) { curPosition_ = pos->position; curCluster_ = pos->cluster; } @@ -1758,7 +1757,7 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { uint16_t n = 512 - blockOffset; // lesser of space and amount to write - if (n > nToWrite) n = nToWrite; + NOMORE(n, nToWrite); // block for data write uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; diff --git a/Marlin/SdBaseFile.h b/Marlin/SdBaseFile.h index 84d72b7b4b22571d3eb45a44f0b588911694ce70..f2d2b594d852e46621f60e3994cd76ba64403087 100644 --- a/Marlin/SdBaseFile.h +++ b/Marlin/SdBaseFile.h @@ -31,16 +31,16 @@ #include "SdVolume.h" //------------------------------------------------------------------------------ /** - * \struct fpos_t + * \struct filepos_t * \brief internal type for istream * do not use in user apps */ -struct fpos_t { +struct filepos_t { /** stream position */ uint32_t position; /** cluster for position */ uint32_t cluster; - fpos_t() : position(0), cluster(0) {} + filepos_t() : position(0), cluster(0) {} }; // use the gnu style oflag in open() @@ -196,11 +196,11 @@ class SdBaseFile { /** get position for streams * \param[out] pos struct to receive position */ - void getpos(fpos_t* pos); + void getpos(filepos_t* pos); /** set position for streams * \param[out] pos struct with value for new position */ - void setpos(fpos_t* pos); + void setpos(filepos_t* pos); //---------------------------------------------------------------------------- bool close(); bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); diff --git a/Marlin/SdVolume.cpp b/Marlin/SdVolume.cpp index a9ef8ea75b49579f258a91186fbc657dd77165bc..9120d19330ff7ca9d3904369edf52ca81451703b 100644 --- a/Marlin/SdVolume.cpp +++ b/Marlin/SdVolume.cpp @@ -296,7 +296,7 @@ int32_t SdVolume::freeClusterCount() { for (uint32_t lba = fatStartBlock_; todo; todo -= n, lba++) { if (!cacheRawBlock(lba, CACHE_FOR_READ)) return -1; - if (todo < n) n = todo; + NOMORE(n, todo); if (fatType_ == 16) { for (uint16_t i = 0; i < n; i++) { if (cacheBuffer_.fat16[i] == 0) free++; @@ -364,7 +364,7 @@ bool SdVolume::init(Sd2Card* dev, uint8_t part) { blocksPerCluster_ = fbs->sectorsPerCluster; // determine shift that is same as multiply by blocksPerCluster_ clusterSizeShift_ = 0; - while (blocksPerCluster_ != BIT(clusterSizeShift_)) { + while (blocksPerCluster_ != _BV(clusterSizeShift_)) { // error if not power of 2 if (clusterSizeShift_++ > 7) goto fail; } diff --git a/Marlin/boards.h b/Marlin/boards.h index 0355dbf01740cdd968bf2eadb647e0d7f79bc40f..f364172ce5d79d4782df651a00a9c2637a01be8a 100644 --- a/Marlin/boards.h +++ b/Marlin/boards.h @@ -40,6 +40,7 @@ #define BOARD_TEENSYLU 8 // Teensylu #define BOARD_RUMBA 80 // Rumba #define BOARD_PRINTRBOARD 81 // Printrboard (AT90USB1286) +#define BOARD_PRINTRBOARD_REVF 811 // Printrboard Revision F (AT90USB1286) #define BOARD_BRAINWAVE 82 // Brainwave (AT90USB646) #define BOARD_SAV_MKI 83 // SAV Mk-I (AT90USB1286) #define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) - CLI compile: DEFINES=AT90USBxx_TEENSYPP_ASSIGNMENTS HARDWARE_MOTHERBOARD=84 make @@ -54,6 +55,7 @@ #define BOARD_OMCA 91 // Final OMCA board #define BOARD_RAMBO 301 // Rambo #define BOARD_MINIRAMBO 302 // Mini-Rambo +#define BOARD_AJ4P 303 // AJ4P #define BOARD_MEGACONTROLLER 310 // Mega controller #define BOARD_ELEFU_3 21 // Elefu Ra Board (v3) #define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board @@ -61,6 +63,7 @@ #define BOARD_MKS_BASE 40 // MKS BASE 1.0 #define BOARD_BAM_DICE 401 // 2PrintBeta BAM&DICE with STK drivers #define BOARD_BAM_DICE_DUE 402 // 2PrintBeta BAM&DICE Due with STK drivers +#define BOARD_BQ_ZUM_MEGA_3D 503 // bq ZUM Mega 3D #define BOARD_99 99 // This is in pins.h but...? diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp index 61f4a93ccf7881272b9c0e0299dccb9bc52d0bb8..c3585e31e258c66b23756c2acad348e20cddc663 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -88,7 +88,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m // close() is done automatically by destructor of SdFile } else { - char pn0 = p.name[0]; + uint8_t pn0 = p.name[0]; if (pn0 == DIR_NAME_FREE) break; if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; if (longFilename[0] == '.') continue; @@ -195,11 +195,7 @@ void CardReader::initsd() { cardOK = false; if (root.isOpen()) root.close(); - #if ENABLED(SDEXTRASLOW) - #define SPI_SPEED SPI_QUARTER_SPEED - #elif ENABLED(SDSLOW) - #define SPI_SPEED SPI_HALF_SPEED - #else + #ifndef SPI_SPEED #define SPI_SPEED SPI_FULL_SPEED #endif @@ -247,6 +243,14 @@ void CardReader::release() { cardOK = false; } +void CardReader::openAndPrintFile(const char *name) { + char cmd[4 + (FILENAME_LENGTH + 1) * MAX_DIR_DEPTH + 2]; // Room for "M23 ", names with slashes, a null, and one extra + sprintf_P(cmd, PSTR("M23 %s"), name); + for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); + enqueue_and_echo_command_now(cmd); + enqueue_and_echo_commands_P(PSTR("M24")); +} + void CardReader::startFileprint() { if (cardOK) sdprinting = true; @@ -268,7 +272,7 @@ void CardReader::getAbsFilename(char *t) { workDirParents[i].getFilename(t); //SDBaseFile.getfilename! while (*t && cnt < MAXPATHNAMELENGTH) { t++; cnt++; } //crawl counter forward. } - if (cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH) + if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH)) file.getFilename(t); else t[0] = 0; @@ -504,10 +508,7 @@ void CardReader::checkautostart(bool force) { while (root.readDir(p, NULL) > 0) { for (int8_t i = 0; i < (int8_t)strlen((char*)p.name); i++) p.name[i] = tolower(p.name[i]); if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { - char cmd[4 + (FILENAME_LENGTH + 1) * MAX_DIR_DEPTH + 2]; - sprintf_P(cmd, PSTR("M23 %s"), autoname); - enqueuecommand(cmd); - enqueuecommands_P(PSTR("M24")); + openAndPrintFile(autoname); found = true; } } @@ -593,7 +594,7 @@ void CardReader::printingHasFinished() { sdprinting = false; if (SD_FINISHED_STEPPERRELEASE) { //finishAndDisableSteppers(); - enqueuecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } autotempShutdown(); } diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h index 78f2d289ff543509f6582ac2cf5a53219f2f5dca..db68710d71ab4aebce029f9d012aae4d7fb3038c 100644 --- a/Marlin/cardreader.h +++ b/Marlin/cardreader.h @@ -23,6 +23,7 @@ public: void removeFile(char* name); void closefile(bool store_location=false); void release(); + void openAndPrintFile(const char *name); void startFileprint(); void pauseSDPrint(); void getStatus(); diff --git a/Marlin/configuration_store.cpp b/Marlin/configuration_store.cpp index 3fcd64973cf7afd4cb8f9589caf444b97954cd1b..785d4cb503874e89db6d73ebc4fe8bd1f0ec3615 100644 --- a/Marlin/configuration_store.cpp +++ b/Marlin/configuration_store.cpp @@ -14,79 +14,85 @@ * */ -#define EEPROM_VERSION "V21" +#define EEPROM_VERSION "V22" /** - * V19 EEPROM Layout: + * V21 EEPROM Layout: * - * ver - * M92 XYZE axis_steps_per_unit (x4) - * M203 XYZE max_feedrate (x4) - * M201 XYZE max_acceleration_units_per_sq_second (x4) - * M204 P acceleration - * M204 R retract_acceleration - * M204 T travel_acceleration - * M205 S minimumfeedrate - * M205 T mintravelfeedrate - * M205 B minsegmenttime - * M205 X max_xy_jerk - * M205 Z max_z_jerk - * M205 E max_e_jerk - * M206 XYZ home_offset (x3) + * 100 Version (char x4) + * + * 104 M92 XYZE axis_steps_per_unit (float x4) + * 120 M203 XYZE max_feedrate (float x4) + * 136 M201 XYZE max_acceleration_units_per_sq_second (uint32_t x4) + * 152 M204 P acceleration (float) + * 156 M204 R retract_acceleration (float) + * 160 M204 T travel_acceleration (float) + * 164 M205 S minimumfeedrate (float) + * 168 M205 T mintravelfeedrate (float) + * 172 M205 B minsegmenttime (ulong) + * 176 M205 X max_xy_jerk (float) + * 180 M205 Z max_z_jerk (float) + * 184 M205 E max_e_jerk (float) + * 188 M206 XYZ home_offset (float x3) * * Mesh bed leveling: - * M420 S active - * mesh_num_x (set in firmware) - * mesh_num_y (set in firmware) - * M421 XYZ z_values[][] - * M851 zprobe_zoffset + * 200 M420 S active (bool) + * 201 mesh_num_x (uint8 as set in firmware) + * 202 mesh_num_y (uint8 as set in firmware) + * 203 M421 XYZ z_values[][] (float x9, by default) + * 239 M851 zprobe_zoffset (float) * * DELTA: - * M666 XYZ endstop_adj (x3) - * M665 R delta_radius - * M665 L delta_diagonal_rod - * M665 S delta_segments_per_second + * 243 M666 XYZ endstop_adj (float x3) + * 255 M665 R delta_radius (float) + * 259 M665 L delta_diagonal_rod (float) + * 263 M665 S delta_segments_per_second (float) + * 267 M665 A delta_diagonal_rod_trim_tower_1 (float) + * 271 M665 B delta_diagonal_rod_trim_tower_2 (float) + * 275 M665 C delta_diagonal_rod_trim_tower_3 (float) + * + * Z_DUAL_ENDSTOPS: + * 279 M666 Z z_endstop_adj (float) * * ULTIPANEL: - * M145 S0 H plaPreheatHotendTemp - * M145 S0 B plaPreheatHPBTemp - * M145 S0 F plaPreheatFanSpeed - * M145 S1 H absPreheatHotendTemp - * M145 S1 B absPreheatHPBTemp - * M145 S1 F absPreheatFanSpeed + * 283 M145 S0 H plaPreheatHotendTemp (int) + * 285 M145 S0 B plaPreheatHPBTemp (int) + * 287 M145 S0 F plaPreheatFanSpeed (int) + * 289 M145 S1 H absPreheatHotendTemp (int) + * 291 M145 S1 B absPreheatHPBTemp (int) + * 293 M145 S1 F absPreheatFanSpeed (int) * * PIDTEMP: - * M301 E0 PIDC Kp[0], Ki[0], Kd[0], Kc[0] - * M301 E1 PIDC Kp[1], Ki[1], Kd[1], Kc[1] - * M301 E2 PIDC Kp[2], Ki[2], Kd[2], Kc[2] - * M301 E3 PIDC Kp[3], Ki[3], Kd[3], Kc[3] - * M301 L lpq_len + * 295 M301 E0 PIDC Kp[0], Ki[0], Kd[0], Kc[0] (float x4) + * 311 M301 E1 PIDC Kp[1], Ki[1], Kd[1], Kc[1] (float x4) + * 327 M301 E2 PIDC Kp[2], Ki[2], Kd[2], Kc[2] (float x4) + * 343 M301 E3 PIDC Kp[3], Ki[3], Kd[3], Kc[3] (float x4) + * 359 M301 L lpq_len (int) * * PIDTEMPBED: - * M304 PID bedKp, bedKi, bedKd + * 361 M304 PID bedKp, bedKi, bedKd (float x3) * * DOGLCD: - * M250 C lcd_contrast + * 373 M250 C lcd_contrast (int) * * SCARA: - * M365 XYZ axis_scaling (x3) + * 375 M365 XYZ axis_scaling (float x3) * * FWRETRACT: - * M209 S autoretract_enabled - * M207 S retract_length - * M207 W retract_length_swap - * M207 F retract_feedrate - * M207 Z retract_zlift - * M208 S retract_recover_length - * M208 W retract_recover_length_swap - * M208 F retract_recover_feedrate + * 387 M209 S autoretract_enabled (bool) + * 388 M207 S retract_length (float) + * 392 M207 W retract_length_swap (float) + * 396 M207 F retract_feedrate (float) + * 400 M207 Z retract_zlift (float) + * 404 M208 S retract_recover_length (float) + * 408 M208 W retract_recover_length_swap (float) + * 412 M208 F retract_recover_feedrate (float) * - * M200 D volumetric_enabled (D>0 makes this enabled) + * Volumetric Extrusion: + * 416 M200 D volumetric_enabled (bool) + * 417 M200 T D filament_size (float x4) (T0..3) * - * M200 T D filament_size (x4) (T0..3) - * - * Z_DUAL_ENDSTOPS: - * M666 Z z_endstop_adj + * 433 This Slot is Available! * */ #include "Marlin.h" @@ -133,6 +139,10 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) { #if ENABLED(EEPROM_SETTINGS) +/** + * Store Configuration Settings - M500 + */ + void Config_StoreSettings() { float dummy = 0.0f; char ver[4] = "000"; @@ -156,7 +166,7 @@ void Config_StoreSettings() { uint8_t mesh_num_y = 3; #if ENABLED(MESH_BED_LEVELING) // Compile time test that sizeof(mbl.z_values) is as expected - typedef char c_assert[(sizeof(mbl.z_values) == MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS * sizeof(dummy)) ? 1 : -1]; + typedef char c_assert[(sizeof(mbl.z_values) == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS) * sizeof(dummy)) ? 1 : -1]; mesh_num_x = MESH_NUM_X_POINTS; mesh_num_y = MESH_NUM_Y_POINTS; EEPROM_WRITE_VAR(i, mbl.active); @@ -182,13 +192,16 @@ void Config_StoreSettings() { EEPROM_WRITE_VAR(i, delta_radius); // 1 float EEPROM_WRITE_VAR(i, delta_diagonal_rod); // 1 float EEPROM_WRITE_VAR(i, delta_segments_per_second); // 1 float + EEPROM_WRITE_VAR(i, delta_diagonal_rod_trim_tower_1); // 1 float + EEPROM_WRITE_VAR(i, delta_diagonal_rod_trim_tower_2); // 1 float + EEPROM_WRITE_VAR(i, delta_diagonal_rod_trim_tower_3); // 1 float #elif ENABLED(Z_DUAL_ENDSTOPS) - EEPROM_WRITE_VAR(i, z_endstop_adj); // 1 floats + EEPROM_WRITE_VAR(i, z_endstop_adj); // 1 float dummy = 0.0f; - for (int q = 5; q--;) EEPROM_WRITE_VAR(i, dummy); + for (uint8_t q = 8; q--;) EEPROM_WRITE_VAR(i, dummy); #else dummy = 0.0f; - for (int q = 6; q--;) EEPROM_WRITE_VAR(i, dummy); + for (uint8_t q = 9; q--;) EEPROM_WRITE_VAR(i, dummy); #endif #if DISABLED(ULTIPANEL) @@ -203,7 +216,7 @@ void Config_StoreSettings() { EEPROM_WRITE_VAR(i, absPreheatHPBTemp); EEPROM_WRITE_VAR(i, absPreheatFanSpeed); - for (int e = 0; e < 4; e++) { + for (uint8_t e = 0; e < 4; e++) { #if ENABLED(PIDTEMP) if (e < EXTRUDERS) { @@ -223,7 +236,7 @@ void Config_StoreSettings() { dummy = DUMMY_PID_VALUE; // When read, will not change the existing value EEPROM_WRITE_VAR(i, dummy); dummy = 0.0f; - for (int q = 3; q--;) EEPROM_WRITE_VAR(i, dummy); + for (uint8_t q = 3; q--;) EEPROM_WRITE_VAR(i, dummy); } } // Extruders Loop @@ -277,7 +290,7 @@ void Config_StoreSettings() { EEPROM_WRITE_VAR(i, volumetric_enabled); // Save filament sizes - for (int q = 0; q < 4; q++) { + for (uint8_t q = 0; q < 4; q++) { if (q < EXTRUDERS) dummy = filament_size[q]; EEPROM_WRITE_VAR(i, dummy); } @@ -339,10 +352,10 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, mbl.z_values); } else { mbl.reset(); - for (int q = 0; q < mesh_num_x * mesh_num_y; q++) EEPROM_READ_VAR(i, dummy); + for (uint8_t q = 0; q < mesh_num_x * mesh_num_y; q++) EEPROM_READ_VAR(i, dummy); } #else - for (int q = 0; q < mesh_num_x * mesh_num_y; q++) EEPROM_READ_VAR(i, dummy); + for (uint8_t q = 0; q < mesh_num_x * mesh_num_y; q++) EEPROM_READ_VAR(i, dummy); #endif // MESH_BED_LEVELING #if DISABLED(AUTO_BED_LEVELING_FEATURE) @@ -355,13 +368,16 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, delta_radius); // 1 float EEPROM_READ_VAR(i, delta_diagonal_rod); // 1 float EEPROM_READ_VAR(i, delta_segments_per_second); // 1 float + EEPROM_READ_VAR(i, delta_diagonal_rod_trim_tower_1); // 1 float + EEPROM_READ_VAR(i, delta_diagonal_rod_trim_tower_2); // 1 float + EEPROM_READ_VAR(i, delta_diagonal_rod_trim_tower_3); // 1 float #elif ENABLED(Z_DUAL_ENDSTOPS) EEPROM_READ_VAR(i, z_endstop_adj); dummy = 0.0f; - for (int q=5; q--;) EEPROM_READ_VAR(i, dummy); + for (uint8_t q=8; q--;) EEPROM_READ_VAR(i, dummy); #else dummy = 0.0f; - for (int q=6; q--;) EEPROM_READ_VAR(i, dummy); + for (uint8_t q=9; q--;) EEPROM_READ_VAR(i, dummy); #endif #if DISABLED(ULTIPANEL) @@ -377,7 +393,7 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, absPreheatFanSpeed); #if ENABLED(PIDTEMP) - for (int e = 0; e < 4; e++) { // 4 = max extruders currently supported by Marlin + for (uint8_t e = 0; e < 4; e++) { // 4 = max extruders currently supported by Marlin EEPROM_READ_VAR(i, dummy); // Kp if (e < EXTRUDERS && dummy != DUMMY_PID_VALUE) { // do not need to scale PID values as the values in EEPROM are already scaled @@ -391,12 +407,12 @@ void Config_RetrieveSettings() { #endif } else { - for (int q=3; q--;) EEPROM_READ_VAR(i, dummy); // Ki, Kd, Kc + for (uint8_t q=3; q--;) EEPROM_READ_VAR(i, dummy); // Ki, Kd, Kc } } #else // !PIDTEMP // 4 x 4 = 16 slots for PID parameters - for (int q=16; q--;) EEPROM_READ_VAR(i, dummy); // 4x Kp, Ki, Kd, Kc + for (uint8_t q=16; q--;) EEPROM_READ_VAR(i, dummy); // 4x Kp, Ki, Kd, Kc #endif // !PIDTEMP #if DISABLED(PID_ADD_EXTRUSION_RATE) @@ -415,7 +431,7 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, bedKd); } else { - for (int q=2; q--;) EEPROM_READ_VAR(i, dummy); // bedKi, bedKd + for (uint8_t q=2; q--;) EEPROM_READ_VAR(i, dummy); // bedKi, bedKd } #if DISABLED(HAS_LCD_CONTRAST) @@ -450,7 +466,7 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, volumetric_enabled); - for (int q = 0; q < 4; q++) { + for (uint8_t q = 0; q < 4; q++) { EEPROM_READ_VAR(i, dummy); if (q < EXTRUDERS) filament_size[q] = dummy; } @@ -518,6 +534,9 @@ void Config_ResetDefault() { delta_radius = DELTA_RADIUS; delta_diagonal_rod = DELTA_DIAGONAL_ROD; delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; + delta_diagonal_rod_trim_tower_1 = DELTA_DIAGONAL_ROD_TRIM_TOWER_1; + delta_diagonal_rod_trim_tower_2 = DELTA_DIAGONAL_ROD_TRIM_TOWER_2; + delta_diagonal_rod_trim_tower_3 = DELTA_DIAGONAL_ROD_TRIM_TOWER_3; recalc_delta_settings(delta_radius, delta_diagonal_rod); #elif ENABLED(Z_DUAL_ENDSTOPS) z_endstop_adj = 0; @@ -538,7 +557,7 @@ void Config_ResetDefault() { #if ENABLED(PIDTEMP) #if ENABLED(PID_PARAMS_PER_EXTRUDER) - for (int e = 0; e < EXTRUDERS; e++) + for (uint8_t e = 0; e < EXTRUDERS; e++) #else int e = 0; UNUSED(e); // only need to write once #endif @@ -686,8 +705,8 @@ void Config_PrintSettings(bool forReplay) { SERIAL_ECHOPAIR(" X", (unsigned long)MESH_NUM_X_POINTS); SERIAL_ECHOPAIR(" Y", (unsigned long)MESH_NUM_Y_POINTS); SERIAL_EOL; - for (int y = 0; y < MESH_NUM_Y_POINTS; y++) { - for (int x = 0; x < MESH_NUM_X_POINTS; x++) { + for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) { + for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { CONFIG_ECHO_START; SERIAL_ECHOPAIR(" M421 X", mbl.get_x(x)); SERIAL_ECHOPAIR(" Y", mbl.get_y(y)); @@ -708,11 +727,16 @@ void Config_PrintSettings(bool forReplay) { SERIAL_ECHOPAIR(" Z", endstop_adj[Z_AXIS]); SERIAL_EOL; CONFIG_ECHO_START; - SERIAL_ECHOLNPGM("Delta settings: L=delta_diagonal_rod, R=delta_radius, S=delta_segments_per_second"); - CONFIG_ECHO_START; + if (!forReplay) { + SERIAL_ECHOLNPGM("Delta settings: L=diagonal_rod, R=radius, S=segments_per_second, ABC=diagonal_rod_trim_tower_[123]"); + CONFIG_ECHO_START; + } SERIAL_ECHOPAIR(" M665 L", delta_diagonal_rod); SERIAL_ECHOPAIR(" R", delta_radius); SERIAL_ECHOPAIR(" S", delta_segments_per_second); + SERIAL_ECHOPAIR(" A", delta_diagonal_rod_trim_tower_1); + SERIAL_ECHOPAIR(" B", delta_diagonal_rod_trim_tower_2); + SERIAL_ECHOPAIR(" C", delta_diagonal_rod_trim_tower_3); SERIAL_EOL; #elif ENABLED(Z_DUAL_ENDSTOPS) CONFIG_ECHO_START; @@ -730,12 +754,12 @@ void Config_PrintSettings(bool forReplay) { SERIAL_ECHOLNPGM("Material heatup parameters:"); CONFIG_ECHO_START; } - SERIAL_ECHOPAIR(" M145 M0 H", (unsigned long)plaPreheatHotendTemp); + SERIAL_ECHOPAIR(" M145 S0 H", (unsigned long)plaPreheatHotendTemp); SERIAL_ECHOPAIR(" B", (unsigned long)plaPreheatHPBTemp); SERIAL_ECHOPAIR(" F", (unsigned long)plaPreheatFanSpeed); SERIAL_EOL; CONFIG_ECHO_START; - SERIAL_ECHOPAIR(" M145 M1 H", (unsigned long)absPreheatHotendTemp); + SERIAL_ECHOPAIR(" M145 S1 H", (unsigned long)absPreheatHotendTemp); SERIAL_ECHOPAIR(" B", (unsigned long)absPreheatHPBTemp); SERIAL_ECHOPAIR(" F", (unsigned long)absPreheatFanSpeed); SERIAL_EOL; diff --git a/Marlin/configurator/config/_htaccess b/Marlin/configurator/config/_htaccess deleted file mode 100644 index f289550940da314e0c59b1995c38ed2b670f8f78..0000000000000000000000000000000000000000 --- a/Marlin/configurator/config/_htaccess +++ /dev/null @@ -1 +0,0 @@ -Header set Access-Control-Allow-Origin "*" diff --git a/Marlin/configurator/config/boards.h b/Marlin/configurator/config/boards.h deleted file mode 100644 index f6bbc9d6733856ae508bab7354960e1c2ec008aa..0000000000000000000000000000000000000000 --- a/Marlin/configurator/config/boards.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef BOARDS_H -#define BOARDS_H - -#define BOARD_UNKNOWN -1 - -#define BOARD_GEN7_CUSTOM 10 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" -#define BOARD_GEN7_12 11 // Gen7 v1.1, v1.2 -#define BOARD_GEN7_13 12 // Gen7 v1.3 -#define BOARD_GEN7_14 13 // Gen7 v1.4 -#define BOARD_CHEAPTRONIC 2 // Cheaptronic v1.0 -#define BOARD_SETHI 20 // Sethi 3D_1 -#define BOARD_RAMPS_OLD 3 // MEGA/RAMPS up to 1.2 -#define BOARD_RAMPS_13_EFB 33 // RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed) -#define BOARD_RAMPS_13_EEB 34 // RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Bed) -#define BOARD_RAMPS_13_EFF 35 // RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Fan) -#define BOARD_RAMPS_13_EEF 36 // RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Fan) -#define BOARD_RAMPS_13_SF 38 // RAMPS 1.3 / 1.4 (Power outputs: Spindle, Controller Fan) -#define BOARD_FELIX2 37 // Felix 2.0+ Electronics Board (RAMPS like) -#define BOARD_RIGIDBOARD 42 // Invent-A-Part RigidBoard -#define BOARD_GEN6 5 // Gen6 -#define BOARD_GEN6_DELUXE 51 // Gen6 deluxe -#define BOARD_SANGUINOLOLU_11 6 // Sanguinololu < 1.2 -#define BOARD_SANGUINOLOLU_12 62 // Sanguinololu 1.2 and above -#define BOARD_MELZI 63 // Melzi -#define BOARD_STB_11 64 // STB V1.1 -#define BOARD_AZTEEG_X1 65 // Azteeg X1 -#define BOARD_MELZI_MAKR3D 66 // Melzi with ATmega1284 (MaKr3d version) -#define BOARD_AZTEEG_X3 67 // Azteeg X3 -#define BOARD_AZTEEG_X3_PRO 68 // Azteeg X3 Pro -#define BOARD_ULTIMAKER 7 // Ultimaker -#define BOARD_ULTIMAKER_OLD 71 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) -#define BOARD_ULTIMAIN_2 72 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) -#define BOARD_3DRAG 77 // 3Drag Controller -#define BOARD_K8200 78 // Vellemann K8200 Controller (derived from 3Drag Controller) -#define BOARD_TEENSYLU 8 // Teensylu -#define BOARD_RUMBA 80 // Rumba -#define BOARD_PRINTRBOARD 81 // Printrboard (AT90USB1286) -#define BOARD_BRAINWAVE 82 // Brainwave (AT90USB646) -#define BOARD_SAV_MKI 83 // SAV Mk-I (AT90USB1286) -#define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) - CLI compile: DEFINES=AT90USBxx_TEENSYPP_ASSIGNMENTS HARDWARE_MOTHERBOARD=84 make -#define BOARD_BRAINWAVE_PRO 85 // Brainwave Pro (AT90USB1286) -#define BOARD_GEN3_PLUS 9 // Gen3+ -#define BOARD_GEN3_MONOLITHIC 22 // Gen3 Monolithic Electronics -#define BOARD_MEGATRONICS 70 // Megatronics -#define BOARD_MEGATRONICS_2 701 // Megatronics v2.0 -#define BOARD_MINITRONICS 702 // Minitronics v1.0/1.1 -#define BOARD_MEGATRONICS_3 703 // Megatronics v3.0 -#define BOARD_OMCA_A 90 // Alpha OMCA board -#define BOARD_OMCA 91 // Final OMCA board -#define BOARD_RAMBO 301 // Rambo -#define BOARD_MINIRAMBO 302 // Mini-Rambo -#define BOARD_MEGACONTROLLER 310 // Mega controller -#define BOARD_ELEFU_3 21 // Elefu Ra Board (v3) -#define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board -#define BOARD_LEAPFROG 999 // Leapfrog -#define BOARD_MKS_BASE 40 // MKS BASE 1.0 -#define BOARD_BAM_DICE 401 // 2PrintBeta BAM&DICE with STK drivers -#define BOARD_BAM_DICE_DUE 402 // 2PrintBeta BAM&DICE Due with STK drivers - -#define BOARD_99 99 // This is in pins.h but...? - -#define MB(board) (MOTHERBOARD==BOARD_##board) - -#endif //__BOARDS_H diff --git a/Marlin/configurator/config/language.h b/Marlin/configurator/config/language.h deleted file mode 100644 index 46a306c9a74ae7615f68e1d1b5b73d57fb81e826..0000000000000000000000000000000000000000 --- a/Marlin/configurator/config/language.h +++ /dev/null @@ -1,228 +0,0 @@ -#ifndef LANGUAGE_H -#define LANGUAGE_H - -#include "Configuration.h" - -#define LANGUAGE_CONCAT(M) #M -#define GENERATE_LANGUAGE_INCLUDE(M) LANGUAGE_CONCAT(language_##M.h) - - -// NOTE: IF YOU CHANGE LANGUAGE FILES OR MERGE A FILE WITH CHANGES -// -// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h" -// ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS -// See also documentation/LCDLanguageFont.md - -// Languages -// en English -// pl Polish -// fr French -// de German -// es Spanish -// ru Russian -// bg Bulgarian -// it Italian -// pt Portuguese -// pt-br Portuguese (Brazil) -// fi Finnish -// an Aragonese -// nl Dutch -// ca Catalan -// eu Basque-Euskera -// kana Japanese -// kana_utf Japanese -// cn Chinese - -// fallback if no language is set, don't change -#ifndef LANGUAGE_INCLUDE - #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) -#endif - -#if ENABLED(USE_AUTOMATIC_VERSIONING) - #include "_Version.h" -#else - #include "Default_Version.h" -#endif - -#define PROTOCOL_VERSION "1.0" - -#if MB(ULTIMAKER)|| MB(ULTIMAKER_OLD)|| MB(ULTIMAIN_2) - #define MACHINE_NAME "Ultimaker" - #define SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" -#elif MB(RUMBA) - #define MACHINE_NAME "Rumba" -#elif MB(3DRAG) - #define MACHINE_NAME "3Drag" - #define SOURCE_CODE_URL "http://3dprint.elettronicain.it/" -#elif MB(K8200) - #define MACHINE_NAME "K8200" - #define SOURCE_CODE_URL "https://github.com/CONSULitAS/Marlin-K8200" -#elif MB(5DPRINT) - #define MACHINE_NAME "Makibox" -#elif MB(SAV_MKI) - #define MACHINE_NAME "SAV MkI" - #define SOURCE_CODE_URL "https://github.com/fmalpartida/Marlin/tree/SAV-MkI-config" -#elif !defined(MACHINE_NAME) - #define MACHINE_NAME "3D Printer" -#endif - -#ifdef CUSTOM_MACHINE_NAME - #undef MACHINE_NAME - #define MACHINE_NAME CUSTOM_MACHINE_NAME -#endif - -#ifndef SOURCE_CODE_URL - #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" -#endif - -#ifndef DETAILED_BUILD_VERSION - #error BUILD_VERSION Information must be specified -#endif - -#ifndef MACHINE_UUID - #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" -#endif - - -#define STRINGIFY_(n) #n -#define STRINGIFY(n) STRINGIFY_(n) - - -// Common LCD messages - - /* nothing here yet */ - -// Common serial messages -#define MSG_MARLIN "Marlin" - -// Serial Console Messages (do not translate those!) - -#define MSG_Enqueueing "enqueueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_EXTERNAL_RESET " External Reset" -#define MSG_BROWNOUT_RESET " Brown out Reset" -#define MSG_WATCHDOG_RESET " Watchdog Reset" -#define MSG_SOFTWARE_RESET " Software Reset" -#define MSG_AUTHOR " | Author: " -#define MSG_CONFIGURATION_VER " Last Updated: " -#define MSG_FREE_MEMORY " Free Memory: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_WAIT "wait" -#define MSG_FILE_SAVED "Done saving file." -#define MSG_ERR_LINE_NO "Line Number is not Last Line Number+1, Last Line: " -#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM "No Line Number with checksum, Last Line: " -#define MSG_FILE_PRINTED "Done printing file" -#define MSG_BEGIN_FILE_LIST "Begin file list" -#define MSG_END_FILE_LIST "End file list" -#define MSG_INVALID_EXTRUDER "Invalid extruder" -#define MSG_INVALID_SOLENOID "Invalid solenoid" -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_COUNT_X " Count X: " -#define MSG_ERR_KILLED "Printer halted. kill() called!" -#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define MSG_RESEND "Resend: " -#define MSG_UNKNOWN_COMMAND "Unknown command: \"" -#define MSG_ACTIVE_EXTRUDER "Active Extruder: " -#define MSG_X_MIN "x_min: " -#define MSG_X_MAX "x_max: " -#define MSG_Y_MIN "y_min: " -#define MSG_Y_MAX "y_max: " -#define MSG_Z_MIN "z_min: " -#define MSG_Z_MAX "z_max: " -#define MSG_Z2_MAX "z2_max: " -#define MSG_Z_PROBE "z_probe: " -#define MSG_ERR_MATERIAL_INDEX "M145 S<index> out of range (0-1)" -#define MSG_ERR_M421_REQUIRES_XYZ "M421 requires XYZ parameters" -#define MSG_ERR_MESH_INDEX_OOB "Mesh XY index is out of bounds" -#define MSG_ERR_M428_TOO_FAR "Too far from reference point" -#define MSG_M119_REPORT "Reporting endstop status" -#define MSG_ENDSTOP_HIT "TRIGGERED" -#define MSG_ENDSTOP_OPEN "open" -#define MSG_HOTEND_OFFSET "Hotend offsets:" - -#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "File opened: " -#define MSG_SD_SIZE " Size: " -#define MSG_SD_FILE_SELECTED "File selected" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Not SD printing" -#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" -#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " - -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" -#define MSG_TOO_COLD_FOR_M600 "M600 Hotend too cold to change filament" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Babystepping Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" - -#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!" - -// temperature.cpp strings -#define MSG_PID_AUTOTUNE "PID Autotune" -#define MSG_PID_AUTOTUNE_START MSG_PID_AUTOTUNE " start" -#define MSG_PID_AUTOTUNE_FAILED MSG_PID_AUTOTUNE " failed!" -#define MSG_PID_BAD_EXTRUDER_NUM MSG_PID_AUTOTUNE_FAILED " Bad extruder number" -#define MSG_PID_TEMP_TOO_HIGH MSG_PID_AUTOTUNE_FAILED " Temperature too high" -#define MSG_PID_TIMEOUT MSG_PID_AUTOTUNE_FAILED " timeout" -#define MSG_BIAS " bias: " -#define MSG_D " d: " -#define MSG_T_MIN " min: " -#define MSG_T_MAX " max: " -#define MSG_KU " Ku: " -#define MSG_TU " Tu: " -#define MSG_CLASSIC_PID " Classic PID " -#define MSG_KP " Kp: " -#define MSG_KI " Ki: " -#define MSG_KD " Kd: " -#define MSG_B "B:" -#define MSG_T "T:" -#define MSG_AT " @:" -#define MSG_PID_AUTOTUNE_FINISHED MSG_PID_AUTOTUNE " finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" -#define MSG_PID_DEBUG " PID_DEBUG " -#define MSG_PID_DEBUG_INPUT ": Input " -#define MSG_PID_DEBUG_OUTPUT " Output " -#define MSG_PID_DEBUG_PTERM " pTerm " -#define MSG_PID_DEBUG_ITERM " iTerm " -#define MSG_PID_DEBUG_DTERM " dTerm " -#define MSG_PID_DEBUG_CTERM " cTerm " -#define MSG_INVALID_EXTRUDER_NUM " - Invalid extruder number !" - -#define MSG_HEATER_BED "bed" -#define MSG_STOPPED_HEATER ", system stopped! Heater_ID: " -#define MSG_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" -#define MSG_T_HEATING_FAILED "Heating failed" -#define MSG_T_THERMAL_RUNAWAY "Thermal Runaway" -#define MSG_T_MAXTEMP "MAXTEMP triggered" -#define MSG_T_MINTEMP "MINTEMP triggered" - -// Debug -#define MSG_DEBUG_ECHO "DEBUG ECHO ENABLED" -#define MSG_DEBUG_INFO "DEBUG INFO ENABLED" -#define MSG_DEBUG_ERRORS "DEBUG ERRORS ENABLED" -#define MSG_DEBUG_DRYRUN "DEBUG DRYRUN ENABLED" - -// LCD Menu Messages - -#if DISABLED(DISPLAY_CHARSET_HD44780_JAPAN) && DISABLED(DISPLAY_CHARSET_HD44780_WESTERN) && DISABLED(DISPLAY_CHARSET_HD44780_CYRILLIC) - #define DISPLAY_CHARSET_HD44780_JAPAN -#endif - -#include LANGUAGE_INCLUDE -#include "language_en.h" - -#endif //__LANGUAGE_H diff --git a/Marlin/configurator/css/configurator.css b/Marlin/configurator/css/configurator.css deleted file mode 100644 index 88332075fb5702581252fdcfd10b0bd2b11bd858..0000000000000000000000000000000000000000 --- a/Marlin/configurator/css/configurator.css +++ /dev/null @@ -1,344 +0,0 @@ -/* configurator.css */ -/* Styles for Marlin Configurator */ - -.clear { clear: both; } - -/* Prevent selection except PRE tags */ -* { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - } -pre { - -webkit-touch-callout: text; - -webkit-user-select: text; - -khtml-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - } - -body { margin: 0; padding: 0; background: #56A; color: #000; font-family: monospace; } -#main { - max-width: 1100px; - margin: 0 auto 10px; - padding: 0 2%; width: 96%; - } - -h1, h2, h3, h4, h5, h6 { clear: both; } - -h1, p.info { font-family: sans-serif; } -h1 { - height: 38px; - margin-bottom: -30px; - color: #FFF; - background: transparent url(logo.png) right top no-repeat; - } -p.info { padding: 0; color: #000; } -p.info span { color: #800; } - -#message { text-align: center; } -#message { width: 80%; margin: 0 auto 0.25em; color: #FF0; } -#message p { padding: 2px 0; font-weight: bold; border-radius: 0.8em; } -#message p.message { color: #080; background: #CFC; } -#message p.error { color: #F00; background: #FF4; } -#message p.warning { color: #FF0; background: #BA4; } -#message p.message span, -#message p.error span, -#message p.warning span { - color: #A00; - background: rgba(255, 255, 255, 1); - border: 1px solid rgba(0,0,0,0.5); - border-radius: 1em; - float: right; - margin-right: 0.5em; - padding: 0 3px; - font-family: sans-serif; - font-size: small; - position: relative; - top: -1px; - } - -#help strong { color: #0DD; } -img { display: none; } - -/* Forms */ - -#config_form { - display: block; - background: #EEE; - padding: 6px 20px 20px; - color: #000; - position: relative; - border-radius: 1.5em; - border-top-left-radius: 0; - } -fieldset { - height: 16.1em; - overflow-y: scroll; - overflow-x: hidden; - margin-top: 10px; - } -label, input, select, textarea { display: block; float: left; margin: 1px 0; } -label.newline, textarea, fieldset { clear: both; } -label { - width: 120px; /* label area */ - height: 1em; - padding: 10px 460px 10px 1em; - margin-right: -450px; - text-align: right; - } -label.blocked, label.added.blocked, label.added.blocked.sublabel { color: #AAA; } - -label.added.sublabel { - width: auto; - margin: 11px -2.5em 0 1em; - padding: 0 3em 0 0; - font-style: italic; - color: #444; - } -label+label.added.sublabel { - margin-left: 0; - } - -input[type="text"], select { margin: 0.75em 0 0; } -input[type="checkbox"], input[type="radio"], input[type="file"] { margin: 1em 0 0; } -input[type="checkbox"].enabler, input[type="radio"].enabler { margin-left: 1em; } - -input:disabled { color: #BBB; } - -#config_form input[type="text"].subitem { width: 4em; } -#config_form input[type="text"].subitem+.subitem { margin-left: 4px; } - -input[type="text"].added { width: 20em; } -label.added { - width: 265px; /* label area */ - height: 1em; - padding: 10px 370px 10px 1em; - margin-right: -360px; - text-align: right; - } - -ul.tabs { padding: 0; list-style: none; } -ul.tabs li { display: inline; } -ul.tabs li a, -ul.tabs li a.active:hover, -ul.tabs li a.active:active { - display: block; - float: left; - background: #1E4059; - color: #CCC; - font-size: 110%; - border-radius: 0.25em 0.25em 0 0; - margin: 0 4px 0 0; - padding: 2px 8px; - text-decoration: none; - font-family: georgia,"times new roman",times; - } -ul.tabs li a.active:link, -ul.tabs li a.active:visited { - background: #DDD; - color: #06F; - cursor: default; - margin-top: -4px; - padding-bottom: 4px; - padding-top: 4px; - } -ul.tabs li a:hover, -ul.tabs li a:active { - background: #000; - color: #FFF; - } - -fieldset { display: none; border: 1px solid #AAA; border-radius: 1em; } -fieldset legend { display: none; } - -.hilightable span { - display: block; - float: left; - width: 100%; - height: 1.3em; - background: rgba(225,255,0,1); - margin: 0 -100% -1em 0; - } - -#serial_stepper { padding-top: 0.75em; display: block; float: left; } -/*#SERIAL_PORT { display: none; }*/ - -/* Tooltips */ - -#tooltip { - display: none; - max-width: 30em; - padding: 8px; - border: 2px solid #73d699; - border-radius: 1em; - position: absolute; - z-index: 999; - font-family: sans-serif; - font-size: 85%; - color: #000; - line-height: 1.1; - background: #e2ff99; /* Old browsers */ - background: -moz-linear-gradient(top, #e2ff99 0%, #73d699 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e2ff99), color-stop(100%,#73d699)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #e2ff99 0%,#73d699 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #e2ff99 0%,#73d699 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #e2ff99 0%,#73d699 100%); /* IE10+ */ - background: linear-gradient(to bottom, #e2ff99 0%,#73d699 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e2ff99', endColorstr='#73d699',GradientType=0 ); /* IE6-9 */ - -webkit-box-shadow: 0px 6px 25px -4px rgba(0,0,0,0.75); - -moz-box-shadow: 0px 6px 25px -4px rgba(0,0,0,0.75); - box-shadow: 0px 6px 25px -4px rgba(0,0,0,0.75); - } -#tooltip>span { - position: absolute; - content: ""; - width: 0; - height: 0; - border-left: 8px solid transparent; - border-right: 8px solid transparent; - border-top: 8px solid #73d699; - z-index: 999; - bottom: -10px; - left: 20px; - } -#tooltip>strong { color: #00B; } - -/* Tooltips Checkbox */ - -#tipson { - width: auto; - height: auto; - padding: 0; - margin-right: 0; - float: right; - font-weight: bold; - font-size: 100%; - font-family: helvetica; - text-align: left; - cursor: pointer; - } -#tipson input { float: none; display: inline; cursor: pointer; } - -/* Config Text */ - -pre.config { - height: 25em; - padding: 10px; - border: 2px solid #888; - border-radius: 5px; - overflow: auto; - clear: both; - background-color: #FFF; - color: #000; - font-family: "Fira Mono", monospace; - font-size: small; - } - -/* Pre Headers */ - -h2 { - width: 100%; - margin: 12px -300px 4px 0; - padding: 0; - float: left; - } - -/* Disclosure Widget */ - -span.disclose, a.download, a.download-all {︎ - display: block; - float: right; - margin-top: 12px; - } - -span.disclose { - margin-right: -10px; /* total width */ - margin-left: 14px; - width: 0; - height: 0; - position: relative; - left: 3px; - top: 3px; - cursor: pointer; - border-left: 8px solid transparent; - border-right: 8px solid transparent; - border-top: 10px solid #000; - } -span.disclose.closed { - margin-right: -8px; /* total width */ - margin-left: 10px; - left: 0; - top: 0; - border-top: 8px solid transparent; - border-bottom: 8px solid transparent; - border-right: 10px solid #000; - } -span.disclose.almost { - -ms-transform: rotate(45deg); /* IE 9 */ - -webkit-transform: rotate(45deg); /* Chrome, Safari, Opera */ - transform: rotate(45deg); - } -span.disclose.closed.almost { - left: 1px; - top: 3px; - -ms-transform: rotate(315deg); /* IE 9 */ - -webkit-transform: rotate(315deg); /* Chrome, Safari, Opera */ - transform: rotate(315deg); - } - -/* Download Button */ - -a.download, a.download-all { - visibility: hidden; - padding: 2px; - border: 1px solid #494; - border-radius: 4px; - margin: 12px 0 0; - background: #FFF; - color: #494; - font-family: sans-serif; - font-size: small; - font-weight: bold; - text-decoration: none; - } -a.download-all { margin: 9px 2em 0; color: #449; border-color: #449; } - -input[type="text"].one_of_2 { max-width: 15%; } -input[type="text"].one_of_3 { max-width: 10%; } -input[type="text"].one_of_4 { max-width: 7%; } - -select.one_of_2 { max-width: 15%; } -select.one_of_3 { max-width: 10%; } -select.one_of_4 { max-width: 14%; } -select.one_of_4+span.label+select.one_of_4+span.label { clear: both; margin-left: 265px; padding-left: 1.75em; } -select.one_of_4+span.label+select.one_of_4+span.label+select.one_of_4+span.label { clear: none; margin-left: 1em; padding-left: 0; } - -@media all and (min-width: 1140px) { - - #main { max-width: 10000px; } - - fieldset { float: left; width: 50%; height: auto; } - - #config_text, #config_adv_text { float: right; clear: right; width: 45%; } - - pre.config { height: 20em; } - - .disclose { display: none; } - - input[type="text"].one_of_2 { max-width: 15%; } - input[type="text"].one_of_3 { max-width: 9%; } - input[type="text"].one_of_4 { max-width: 8%; } - - select.one_of_2 { max-width: 15%; } - select.one_of_3 { max-width: 10%; } - select.one_of_4 { max-width: 16%; } - -} - -/*label.blocked, .blocked { display: none; }*/ - diff --git a/Marlin/configurator/css/logo.png b/Marlin/configurator/css/logo.png deleted file mode 100644 index 0618dc17ae4ab7842475d493592e8184fd9a77e9..0000000000000000000000000000000000000000 Binary files a/Marlin/configurator/css/logo.png and /dev/null differ diff --git a/Marlin/configurator/index.html b/Marlin/configurator/index.html deleted file mode 100644 index 385109c9e1c77c0a50410645c7e760abfddc8daa..0000000000000000000000000000000000000000 --- a/Marlin/configurator/index.html +++ /dev/null @@ -1,129 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="UTF-8"> - <title>Marlin Firmware Configurator</title> - <link href='http://fonts.googleapis.com/css?family=Fira+Mono&subset=latin,latin-ext' rel='stylesheet' type='text/css' /> - <script src="js/jquery-2.1.3.min.js"></script> - <script src="js/binarystring.js"></script> - <script src="js/binaryfileuploader.js"></script> - <script src="js/FileSaver.min.js"></script> - <script src="js/jszip.min.js"></script> - <script src="js/jcanvas.js"></script> - <script src="js/jstepper.js"></script> - <script src="js/configurator.js"></script> - <link rel="stylesheet" href="css/configurator.css" type="text/css" media="all" /> - </head> - <body> - <section id="main"> - <h1>Marlin Configurator</h1> - <p class="info">Select presets (coming soon), modify, and download.</p> - - <div id="message"></div> - <div id="tabs"></div> - - <form id="config_form"> - - <div id="tooltip"></div> - - <label>Drop Files:</label><input type="file" id="file-upload" /> - <label id="tipson"><input type="checkbox" checked /> ?</label> - <a href="" class="download-all">Download Zip</a> - - <fieldset id="info"> - <legend>Info</legend> - </fieldset> - - <fieldset id="machine"> - <legend>Machine</legend> - - <label class="newline">Serial Port:</label><select name="SERIAL_PORT"></select><div id="serial_stepper"></div> - - <label>Baud Rate:</label><select name="BAUDRATE"></select> - - <label>AT90USB BT IF:</label> - <input name="BLUETOOTH" type="checkbox" value="1" checked /> - - <label class="newline">Motherboard:</label><select name="MOTHERBOARD"></select> - - <label class="newline">Custom Name:</label><input name="CUSTOM_MACHINE_NAME" type="text" size="14" maxlength="12" value="" /> - - <label class="newline">Machine UUID:</label><input name="MACHINE_UUID" type="text" size="38" maxlength="36" value="" /> - - <label class="newline">Extruders:</label><select name="EXTRUDERS"></select> - - <label class="newline">Power Supply:</label><select name="POWER_SUPPLY"></select> - - <label>PS Default Off:</label> - <input name="PS_DEFAULT_OFF" type="checkbox" value="1" checked /> - </fieldset> - - <fieldset id="homing"> - <legend>Homing</legend> - </fieldset> - - <fieldset id="temperature"> - <legend>Temperature</legend> - <label class="newline">Temp Sensor 0:</label><select name="TEMP_SENSOR_0"></select> - <label class="newline">Temp Sensor 1:</label><select name="TEMP_SENSOR_1"></select> - <label class="newline">Temp Sensor 2:</label><select name="TEMP_SENSOR_2"></select> - <label class="newline">Bed Temp Sensor:</label><select name="TEMP_SENSOR_BED"></select> - - <label>Max Diff:</label> - <input name="MAX_REDUNDANT_TEMP_SENSOR_DIFF" type="text" size="3" maxlength="2" /> - - <label>Temp Residency Time (s):</label> - <input name="TEMP_RESIDENCY_TIME" type="text" size="3" maxlength="2" /> - </fieldset> - - <fieldset id="extruder"> - <legend>Extruder</legend> - </fieldset> - - <fieldset id="lcd"> - <legend>LCD / SD</legend> - </fieldset> - - <fieldset id="bedlevel"> - <legend>Bed Leveling</legend> - </fieldset> - - <fieldset id="fwretract"> - <legend>FW Retract</legend> - </fieldset> - - <fieldset id="tmc"> - <legend>TMC</legend> - </fieldset> - - <fieldset id="l6470"> - <legend>L6470</legend> - </fieldset> - - <fieldset id="extras"> - <legend>Extras</legend> - </fieldset> - - <fieldset id="more"> - <legend>More…</legend> - </fieldset> - - <section id="config_text"> - <h2>Configuration.h</h2> - <span class="disclose"></span> - <a href="" class="download">Download</a> - <pre class="hilightable config"></pre> - </section> - - <section id="config_adv_text"> - <h2>Configuration_adv.h</h2> - <span class="disclose"></span> - <a href="" class="download">Download</a> - <pre class="hilightable config"></pre> - </section> - - <br class="clear" /> - </form> - </section> - </body> -</html> diff --git a/Marlin/configurator/js/FileSaver.min.js b/Marlin/configurator/js/FileSaver.min.js deleted file mode 100755 index f7319603d71bcd228f7306911afc897c5d260271..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/FileSaver.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ -var saveAs=saveAs||typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator)||function(view){"use strict";if(typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var doc=view.document,get_URL=function(){return view.URL||view.webkitURL||view},save_link=doc.createElementNS("http://www.w3.org/1999/xhtml","a"),can_use_save_link="download"in save_link,click=function(node){var event=doc.createEvent("MouseEvents");event.initMouseEvent("click",true,false,view,0,0,0,0,0,false,false,false,false,0,null);node.dispatchEvent(event)},webkit_req_fs=view.webkitRequestFileSystem,req_fs=view.requestFileSystem||webkit_req_fs||view.mozRequestFileSystem,throw_outside=function(ex){(view.setImmediate||view.setTimeout)(function(){throw ex},0)},force_saveable_type="application/octet-stream",fs_min_size=0,arbitrary_revoke_timeout=500,revoke=function(file){var revoker=function(){if(typeof file==="string"){get_URL().revokeObjectURL(file)}else{file.remove()}};if(view.chrome){revoker()}else{setTimeout(revoker,arbitrary_revoke_timeout)}},dispatch=function(filesaver,event_types,event){event_types=[].concat(event_types);var i=event_types.length;while(i--){var listener=filesaver["on"+event_types[i]];if(typeof listener==="function"){try{listener.call(filesaver,event||filesaver)}catch(ex){throw_outside(ex)}}}},FileSaver=function(blob,name){var filesaver=this,type=blob.type,blob_changed=false,object_url,target_view,dispatch_all=function(){dispatch(filesaver,"writestart progress write writeend".split(" "))},fs_error=function(){if(blob_changed||!object_url){object_url=get_URL().createObjectURL(blob)}if(target_view){target_view.location.href=object_url}else{var new_tab=view.open(object_url,"_blank");if(new_tab==undefined&&typeof safari!=="undefined"){view.location.href=object_url}}filesaver.readyState=filesaver.DONE;dispatch_all();revoke(object_url)},abortable=function(func){return function(){if(filesaver.readyState!==filesaver.DONE){return func.apply(this,arguments)}}},create_if_not_found={create:true,exclusive:false},slice;filesaver.readyState=filesaver.INIT;if(!name){name="download"}if(can_use_save_link){object_url=get_URL().createObjectURL(blob);save_link.href=object_url;save_link.download=name;click(save_link);filesaver.readyState=filesaver.DONE;dispatch_all();revoke(object_url);return}if(view.chrome&&type&&type!==force_saveable_type){slice=blob.slice||blob.webkitSlice;blob=slice.call(blob,0,blob.size,force_saveable_type);blob_changed=true}if(webkit_req_fs&&name!=="download"){name+=".download"}if(type===force_saveable_type||webkit_req_fs){target_view=view}if(!req_fs){fs_error();return}fs_min_size+=blob.size;req_fs(view.TEMPORARY,fs_min_size,abortable(function(fs){fs.root.getDirectory("saved",create_if_not_found,abortable(function(dir){var save=function(){dir.getFile(name,create_if_not_found,abortable(function(file){file.createWriter(abortable(function(writer){writer.onwriteend=function(event){target_view.location.href=file.toURL();filesaver.readyState=filesaver.DONE;dispatch(filesaver,"writeend",event);revoke(file)};writer.onerror=function(){var error=writer.error;if(error.code!==error.ABORT_ERR){fs_error()}};"writestart progress write abort".split(" ").forEach(function(event){writer["on"+event]=filesaver["on"+event]});writer.write(blob);filesaver.abort=function(){writer.abort();filesaver.readyState=filesaver.DONE};filesaver.readyState=filesaver.WRITING}),fs_error)}),fs_error)};dir.getFile(name,{create:false},abortable(function(file){file.remove();save()}),abortable(function(ex){if(ex.code===ex.NOT_FOUND_ERR){save()}else{fs_error()}}))}),fs_error)}),fs_error)},FS_proto=FileSaver.prototype,saveAs=function(blob,name){return new FileSaver(blob,name)};FS_proto.abort=function(){var filesaver=this;filesaver.readyState=filesaver.DONE;dispatch(filesaver,"abort")};FS_proto.readyState=FS_proto.INIT=0;FS_proto.WRITING=1;FS_proto.DONE=2;FS_proto.error=FS_proto.onwritestart=FS_proto.onprogress=FS_proto.onwrite=FS_proto.onabort=FS_proto.onerror=FS_proto.onwriteend=null;return saveAs}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!=null){define([],function(){return saveAs})} diff --git a/Marlin/configurator/js/binaryfileuploader.js b/Marlin/configurator/js/binaryfileuploader.js deleted file mode 100644 index 0a1f38f3dc2734415122432ad44aa747a81e6eb6..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/binaryfileuploader.js +++ /dev/null @@ -1,79 +0,0 @@ -function BinaryFileUploader(o) { - this.options = null; - - - this._defaultOptions = { - element: null, // HTML file element - onFileLoad: function(file) { - console.log(file.toString()); - } - }; - - - this._init = function(o) { - if (!this.hasFileUploaderSupport()) return; - - this._verifyDependencies(); - - this.options = this._mergeObjects(this._defaultOptions, o); - this._verifyOptions(); - - this.addFileChangeListener(); - } - - - this.hasFileUploaderSupport = function() { - return !!(window.File && window.FileReader && window.FileList && window.Blob); - } - - this.addFileChangeListener = function() { - this.options.element.addEventListener( - 'change', - this._bind(this, this.onFileChange) - ); - } - - this.onFileChange = function(e) { - // TODO accept multiple files - var file = e.target.files[0], - reader = new FileReader(); - - reader.onload = this._bind(this, this.onFileLoad); - reader.readAsBinaryString(file); - } - - this.onFileLoad = function(e) { - var content = e.target.result, - string = new BinaryString(content); - this.options.onFileLoad(string); - } - - - this._mergeObjects = function(starting, override) { - var merged = starting; - for (key in override) merged[key] = override[key]; - - return merged; - } - - this._verifyOptions = function() { - if (!(this.options.element && this.options.element.type && this.options.element.type === 'file')) { - throw 'Invalid element param in options. Must be a file upload DOM element'; - } - - if (typeof this.options.onFileLoad !== 'function') { - throw 'Invalid onFileLoad param in options. Must be a function'; - } - } - - this._verifyDependencies = function() { - if (!window.BinaryString) throw 'BinaryString is missing. Check that you\'ve correctly included it'; - } - - // helper function for binding methods to objects - this._bind = function(object, method) { - return function() {return method.apply(object, arguments);}; - } - - this._init(o); -} diff --git a/Marlin/configurator/js/binarystring.js b/Marlin/configurator/js/binarystring.js deleted file mode 100644 index 06af64fe2aee5c95a0b0a4612cfa2708a831ee63..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/binarystring.js +++ /dev/null @@ -1,168 +0,0 @@ -function BinaryString(source) { - this._source = null; - this._bytes = []; - this._pos = 0; - this._length = 0; - - this._init = function(source) { - this._source = source; - this._bytes = this._stringToBytes(this._source); - this._length = this._bytes.length; - } - - this.current = function() {return this._pos;} - - this.rewind = function() {return this.jump(0);} - this.end = function() {return this.jump(this.length() - 1);} - this.next = function() {return this.jump(this.current() + 1);} - this.prev = function() {return this.jump(this.current() - 1);} - - this.jump = function(pos) { - if (pos < 0 || pos >= this.length()) return false; - - this._pos = pos; - return true; - } - - this.readByte = function(pos) { - pos = (typeof pos == 'number') ? pos : this.current(); - return this.readBytes(1, pos)[0]; - } - - this.readBytes = function(length, pos) { - length = length || 1; - pos = (typeof pos == 'number') ? pos : this.current(); - - if (pos > this.length() || - pos < 0 || - length <= 0 || - pos + length > this.length() || - pos + length < 0 - ) { - return false; - } - - var bytes = []; - - for (var i = pos; i < pos + length; i++) { - bytes.push(this._bytes[i]); - } - - return bytes; - } - - this.length = function() {return this._length;} - - this.toString = function() { - var string = '', - length = this.length(); - - for (var i = 0; i < length; i++) { - string += String.fromCharCode(this.readByte(i)); - } - - return string; - } - - this.toUtf8 = function() { - var inc = 0, - string = '', - length = this.length(); - - // determine if first 3 characters are the BOM - // then skip them in output if so - if (length >= 3 && - this.readByte(0) === 0xEF && - this.readByte(1) === 0xBB && - this.readByte(2) === 0xBF - ) { - inc = 3; - } - - for (; inc < length; inc++) { - var byte1 = this.readByte(inc), - byte2 = 0, - byte3 = 0, - byte4 = 0, - code1 = 0, - code2 = 0, - point = 0; - - switch (true) { - // single byte character; same as ascii - case (byte1 < 0x80): - code1 = byte1; - break; - - // 2 byte character - case (byte1 >= 0xC2 && byte1 < 0xE0): - byte2 = this.readByte(++inc); - - code1 = ((byte1 & 0x1F) << 6) + - (byte2 & 0x3F); - break; - - // 3 byte character - case (byte1 >= 0xE0 && byte1 < 0xF0): - byte2 = this.readByte(++inc); - byte3 = this.readByte(++inc); - - code1 = ((byte1 & 0xFF) << 12) + - ((byte2 & 0x3F) << 6) + - (byte3 & 0x3F); - break; - - // 4 byte character - case (byte1 >= 0xF0 && byte1 < 0xF5): - byte2 = this.readByte(++inc); - byte3 = this.readByte(++inc); - byte4 = this.readByte(++inc); - - point = ((byte1 & 0x07) << 18) + - ((byte2 & 0x3F) << 12) + - ((byte3 & 0x3F) << 6) + - (byte4 & 0x3F) - point -= 0x10000; - - code1 = (point >> 10) + 0xD800; - code2 = (point & 0x3FF) + 0xDC00; - break; - - default: - throw 'Invalid byte ' + this._byteToString(byte1) + ' whilst converting to UTF-8'; - break; - } - - string += (code2) ? String.fromCharCode(code1, code2) - : String.fromCharCode(code1); - } - - return string; - } - - this.toArray = function() {return this.readBytes(this.length() - 1, 0);} - - - this._stringToBytes = function(str) { - var bytes = [], - chr = 0; - - for (var i = 0; i < str.length; i++) { - chr = str.charCodeAt(i); - bytes.push(chr & 0xFF); - } - - return bytes; - } - - this._byteToString = function(byte) { - var asString = byte.toString(16).toUpperCase(); - while (asString.length < 2) { - asString = '0' + asString; - } - - return '0x' + asString; - } - - this._init(source); -} diff --git a/Marlin/configurator/js/configurator.js b/Marlin/configurator/js/configurator.js deleted file mode 100644 index 1a0da92abd43f176f9040d47b496fc275aaaee67..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/configurator.js +++ /dev/null @@ -1,1432 +0,0 @@ -/** - * configurator.js - * - * Marlin Configuration Utility - * - Web form for entering configuration options - * - A reprap calculator to calculate movement values - * - Uses HTML5 to generate downloadables in Javascript - * - Reads and parses standard configuration files from local folders - * - * Supporting functions - * - Parser to read Marlin Configuration.h and Configuration_adv.h files - * - Utilities to replace values in configuration files - */ - -"use strict"; - -$(function(){ - -/** - * Github API useful GET paths. (Start with "https://api.github.com/repos/:owner/:repo/") - * - * contributors Get a list of contributors - * tags Get a list of tags - * contents/[path]?ref=branch/tag/commit Get the contents of a file - */ - - // GitHub - // Warning! Limited to 60 requests per hour! -var config = { - type: 'github', - host: 'https://api.github.com', - owner: 'MarlinFirmware', - repo: 'Marlin', - ref: 'Development', - path: 'Marlin/configurator/config' -}; -/**/ - -/* // Remote -var config = { - type: 'remote', - host: 'http://www.thinkyhead.com', - path: '_marlin/config' -}; -/**/ - -/* // Local -var config = { - type: 'local', - path: 'config' -}; -/**/ - -function github_command(conf, command, path) { - var req = conf.host+'/repos/'+conf.owner+'/'+conf.repo+'/'+command; - if (path) req += '/' + path; - return req; -} -function config_path(item) { - var path = '', ref = ''; - switch(config.type) { - case 'github': - path = github_command(config, 'contents', config.path); - if (config.ref !== undefined) ref = '?ref=' + config.ref; - break; - case 'remote': - path = config.host + '/' + config.path + '/'; - break; - case 'local': - path = config.path + '/'; - break; - } - return path + '/' + item + ref; -} - -// Extend builtins -String.prototype.lpad = function(len, chr) { - if (chr === undefined) { chr = ' '; } - var s = this+'', need = len - s.length; - if (need > 0) { s = new Array(need+1).join(chr) + s; } - return s; -}; - -String.prototype.prePad = function(len, chr) { return len ? this.lpad(len, chr) : this; }; -String.prototype.zeroPad = function(len) { return this.prePad(len, '0'); }; -String.prototype.toHTML = function() { return jQuery('<div>').text(this).html(); }; -String.prototype.regEsc = function() { return this.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); } -String.prototype.lineCount = function(ind) { var len = (ind === undefined ? this : this.substr(0,ind*1)).split(/\r?\n|\r/).length; return len > 0 ? len - 1 : 0; }; -String.prototype.line = function(num) { var arr = this.split(/\r?\n|\r/); return num < arr.length ? arr[1*num] : ''; }; -String.prototype.replaceLine = function(num,txt) { var arr = this.split(/\r?\n|\r/); if (num < arr.length) { arr[num] = txt; return arr.join('\n'); } else return this; } -String.prototype.toLabel = function() { return this.replace(/[\[\]]/g, '').replace(/_/g, ' ').toTitleCase(); } -String.prototype.toTitleCase = function() { return this.replace(/([A-Z])(\w+)/gi, function(m,p1,p2) { return p1.toUpperCase() + p2.toLowerCase(); }); } -Number.prototype.limit = function(m1, m2) { - if (m2 == null) return this > m1 ? m1 : this; - return this < m1 ? m1 : this > m2 ? m2 : this; -}; -Date.prototype.fileStamp = function(filename) { - var fs = this.getFullYear() - + ((this.getMonth()+1)+'').zeroPad(2) - + (this.getDate()+'').zeroPad(2) - + (this.getHours()+'').zeroPad(2) - + (this.getMinutes()+'').zeroPad(2) - + (this.getSeconds()+'').zeroPad(2); - - if (filename !== undefined) - return filename.replace(/^(.+)(\.\w+)$/g, '$1-['+fs+']$2'); - - return fs; -} - -/** - * selectField.addOptions takes an array or keyed object - */ -$.fn.extend({ - addOptions: function(arrObj) { - return this.each(function() { - var sel = $(this); - var isArr = Object.prototype.toString.call(arrObj) == "[object Array]"; - $.each(arrObj, function(k, v) { - sel.append( $('<option>',{value:isArr?v:k}).text(v) ); - }); - }); - }, - noSelect: function() { - return this - .attr('unselectable', 'on') - .css('user-select', 'none') - .on('selectstart', false); - }, - unblock: function(on) { - on ? this.removeClass('blocked') : this.addClass('blocked'); - return this; - } -}); - -// The app is a singleton -window.configuratorApp = (function(){ - - // private variables and functions go here - var self, - pi2 = Math.PI * 2, - has_boards = false, has_config = false, has_config_adv = false, - boards_file = 'boards.h', - config_file = 'Configuration.h', - config_adv_file = 'Configuration_adv.h', - $msgbox = $('#message'), - $form = $('#config_form'), - $tooltip = $('#tooltip'), - $cfg = $('#config_text'), $adv = $('#config_adv_text'), - $config = $cfg.find('pre'), $config_adv = $adv.find('pre'), - config_file_list = [ boards_file, config_file, config_adv_file ], - config_list = [ $config, $config_adv ], - define_info = {}, // info for all defines, by name - define_list = [[],[]], // arrays with all define names - define_occur = [{},{}], // lines where defines occur in each file - define_groups = [{},{}], // similarly-named defines that group in the form - define_section = {}, // the section of each define - dependent_groups = {}, - boards_list = {}, - therms_list = {}, - total_config_lines, - total_config_adv_lines, - hover_timer, - pulse_offset = 0; - - // Return this anonymous object as configuratorApp - return { - my_public_var: 4, - logging: 1, - - init: function() { - self = this; // a 'this' for use when 'this' is something else - - // Set up the form, creating fields and fieldsets as-needed - this.initConfigForm(); - - // Make tabs for all the fieldsets - this.makeTabsForFieldsets(); - - // No selection on errors - // $msgbox.noSelect(); - - // Make a droppable file uploader, if possible - var $uploader = $('#file-upload'); - var fileUploader = new BinaryFileUploader({ - element: $uploader[0], - onFileLoad: function(file) { self.handleFileLoad(file, $uploader); } - }); - if (!fileUploader.hasFileUploaderSupport()) - this.setMessage("Your browser doesn't support the file reading API.", 'error'); - - // Make the disclosure items work - $('.disclose').click(function(){ - var $dis = $(this), $pre = $dis.nextAll('pre:first'); - var didAnim = function() {$dis.toggleClass('closed almost');}; - $dis.addClass('almost').hasClass('closed') - ? $pre.slideDown(200, didAnim) - : $pre.slideUp(200, didAnim); - }); - - // Adjust the form layout for the window size - $(window).bind('scroll resize', this.adjustFormLayout).trigger('resize'); - - // Read boards.h, Configuration.h, Configuration_adv.h - var ajax_count = 0, success_count = 0; - var loaded_items = {}; - var isGithub = config.type == 'github'; - var rateLimit = 0; - $.each(config_file_list, function(i,fname){ - var url = config_path(fname); - $.ajax({ - url: url, - type: 'GET', - dataType: isGithub ? 'jsonp' : undefined, - async: true, - cache: false, - error: function(req, stat, err) { - self.log(req, 1); - if (req.status == 200) { - if (typeof req.responseText === 'string') { - var txt = req.responseText; - loaded_items[fname] = function(){ self.fileLoaded(fname, txt, true); }; - success_count++; - // self.setMessage('The request for "'+fname+'" may be malformed.', 'error'); - } - } - else { - self.setRequestError(req.status ? req.status : '(Access-Control-Allow-Origin?)', url); - } - }, - success: function(txt) { - if (isGithub && typeof txt.meta.status !== undefined && txt.meta.status != 200) { - self.setRequestError(txt.meta.status, url); - } - else { - // self.log(txt, 1); - if (isGithub) { - rateLimit = { - quota: 1 * txt.meta['X-RateLimit-Remaining'], - timeLeft: Math.floor(txt.meta['X-RateLimit-Reset'] - Date.now()/1000), - }; - } - loaded_items[fname] = function(){ self.fileLoaded(fname, isGithub ? decodeURIComponent(escape(atob(txt.data.content))) : txt, true); }; - success_count++; - } - }, - complete: function() { - ajax_count++; - if (ajax_count >= config_file_list.length) { - // If not all files loaded set an error - if (success_count < ajax_count) - self.setMessage('Unable to load configurations. Try the upload field.', 'error'); - - // Is the request near the rate limit? Set an error. - var r; - if (r = rateLimit) { - if (r.quota < 20) { - self.setMessage( - 'Approaching request limit (' + - r.quota + ' remaining.' + - ' Reset in ' + Math.floor(r.timeLeft/60) + ':' + (r.timeLeft%60+'').zeroPad(2) + ')', - 'warning' - ); - } - } - // Post-process all the loaded files - $.each(config_file_list, function(){ if (loaded_items[this]) loaded_items[this](); }); - } - } - }); - }); - }, - - /** - * Make a download link visible and active - */ - activateDownloadLink: function(cindex) { - var filename = config_file_list[cindex+1]; - var $c = config_list[cindex], txt = $c.text(); - $c.prevAll('.download:first') - .unbind('mouseover click') - .mouseover(function() { - var d = new Date(), fn = d.fileStamp(filename); - $(this).attr({ download:fn, href:'download:'+fn, title:'download:'+fn }); - }) - .click(function(){ - var $button = $(this); - $(this).attr({ href:'data:text/plain;charset=utf-8,' + encodeURIComponent($c.text()) }); - setTimeout(function(){ - $button.attr({ href:$button.attr('title') }); - }, 100); - return true; - }) - .css({visibility:'visible'}); - }, - - /** - * Make the download-all link visible and active - */ - activateDownloadAllLink: function() { - $('.download-all') - .unbind('mouseover click') - .mouseover(function() { - var d = new Date(), fn = d.fileStamp('MarlinConfig.zip'); - $(this).attr({ download:fn, href:'download:'+fn, title:'download:'+fn }); - }) - .click(function(){ - var $button = $(this); - var zip = new JSZip(); - for (var e in [0,1]) zip.file(config_file_list[e+1], config_list[e].text()); - var zipped = zip.generate({type:'blob'}); - saveAs(zipped, $button.attr('download')); - return false; - }) - .css({visibility:'visible'}); - }, - - /** - * Init the boards array from a boards.h file - */ - initBoardsFromText: function(txt) { - boards_list = {}; - var r, findDef = new RegExp('[ \\t]*#define[ \\t]+(BOARD_[\\w_]+)[ \\t]+(\\d+)[ \\t]*(//[ \\t]*)?(.+)?', 'gm'); - while((r = findDef.exec(txt)) !== null) { - boards_list[r[1]] = r[2].prePad(3, ' ') + " — " + r[4].replace(/\).*/, ')'); - } - this.log("Loaded boards:\n" + Object.keys(boards_list).join('\n'), 3); - has_boards = true; - }, - - /** - * Init the thermistors array from the Configuration.h file - */ - initThermistorList: function(txt) { - // Get all the thermistors and save them into an object - var r, s, findDef = new RegExp('(//.*\n)+\\s+(#define[ \\t]+TEMP_SENSOR_0)', 'g'); - r = findDef.exec(txt); - findDef = new RegExp('^//[ \\t]*([-\\d]+)[ \\t]+is[ \\t]+(.*)[ \\t]*$', 'gm'); - while((s = findDef.exec(r[0])) !== null) { - therms_list[s[1]] = s[1].prePad(4, ' ') + " — " + s[2]; - } - }, - - /** - * Get all the unique define names, building lists that will be used - * when gathering info about each define. - * - * define_list[c][j] : Define names in each config (in order of occurrence) - * define_section[name] : Section where define should appear in the form - * define_occur[c][name][i] : Lines in each config where the same define occurs - * .cindex Config file index - * .lineNum Line number of the occurrence - * .line The occurrence line - */ - initDefineList: function(cindex) { - var section = 'hidden', - leave_out_defines = ['CONFIGURATION_H', 'CONFIGURATION_ADV_H'], - define_sect = {}, - occ_list = {}, - txt = config_list[cindex].text(), - r, findDef = new RegExp('^.*(@section|#define)[ \\t]+(\\w+).*$', 'gm'); - while((r = findDef.exec(txt)) !== null) { - var name = r[2]; - if (r[1] == '@section') { - section = name; - } - else if ($.inArray(name, leave_out_defines) < 0) { - var lineNum = txt.lineCount(r.index), - inst = { cindex:cindex, lineNum:lineNum, line:r[0] }, - in_sect = (name in define_sect); - if (!in_sect) { - occ_list[name] = [ inst ]; - } - if (!(name in define_section) && !in_sect) { - define_sect[name] = section; // new first-time define - } - else { - occ_list[name].push(inst); - } - } - } - define_list[cindex] = Object.keys(define_sect); - define_occur[cindex] = occ_list; - $.extend(define_section, define_sect); - this.log(define_list[cindex], 2); - this.log(occ_list, 2); - this.log(define_sect, 2); - }, - - /** - * Find the defines in one of the configs that are just variants. - * Group them together for form-building and other uses. - * - * define_groups[c][name] - * .pattern regexp matching items in the group - * .title title substitution - * .count number of items in the group - */ - refreshDefineGroups: function(cindex) { - var findDef = /^(|.*_)(([XYZE](MAX|MIN))|(E[0-3]|[XYZE01234])|MAX|MIN|(bed)?K[pid]|HOTEND|HPB|JAPAN|WESTERN|CYRILLIC|LEFT|RIGHT|BACK|FRONT|[XYZ]_POINT)(_.*|)$/i; - var match_prev, patt, title, nameList, groups = {}, match_section; - $.each(define_list[cindex], function(i, name) { - if (match_prev) { - if (match_prev.exec(name) && define_section[name] == match_section) { - nameList.push(name); - } - else { - if (nameList.length > 1) { - $.each(nameList, function(i,n){ - groups[n] = { - pattern: patt, - title: title, - count: nameList.length - }; - }); - } - match_prev = null; - } - } - if (!match_prev) { - var r = findDef.exec(name); - if (r != null) { - title = ''; - switch(r[2].toUpperCase()) { - case '0': - patt = '([0123])'; - title = 'N'; - break; - case 'X': - patt = '([XYZE])'; - title = 'AXIS'; - break; - case 'E0': - patt = 'E([0-3])'; - title = 'E'; - break; - case 'BEDKP': - patt = 'bed(K[pid])'; - title = 'BED_PID'; - break; - case 'KP': - patt = '(K[pid])'; - title = 'PID'; - break; - case 'LEFT': - case 'RIGHT': - case 'BACK': - case 'FRONT': - patt = '([LRBF])(EFT|IGHT|ACK|RONT)'; - break; - case 'MAX': - case 'MIN': - patt = '(MAX|MIN)'; - break; - case 'HOTEND': - case 'HPB': - patt = '(HOTEND|HPB)'; - break; - case 'JAPAN': - case 'WESTERN': - case 'CYRILLIC': - patt = '(JAPAN|WESTERN|CYRILLIC)'; - break; - case 'XMIN': - case 'XMAX': - patt = '([XYZ])'+r[4]; - title = 'XYZ_'+r[4]; - break; - default: - patt = null; - break; - } - if (patt) { - patt = '^' + r[1] + patt + r[7] + '$'; - title = r[1] + title + r[7]; - match_prev = new RegExp(patt, 'i'); - match_section = define_section[name]; - nameList = [ name ]; - } - } - } - }); - define_groups[cindex] = groups; - this.log(define_groups[cindex], 2); - }, - - /** - * Get all conditional blocks and their line ranges - * and store them in the dependent_groups list. - * - * dependent_groups[condition][i] - * - * .cindex config file index - * .start starting line - * .end ending line - * - */ - initDependentGroups: function() { - var findBlock = /^[ \t]*#(ifn?def|if|else|endif)[ \t]*(.*)([ \t]*\/\/[^\n]+)?$/gm, - leave_out_defines = ['CONFIGURATION_H', 'CONFIGURATION_ADV_H']; - dependent_groups = {}; - $.each(config_list, function(i, $v) { - var ifStack = []; - var r, txt = $v.text(); - while((r = findBlock.exec(txt)) !== null) { - var lineNum = txt.lineCount(r.index); - var code = r[2].replace(/[ \t]*\/\/.*$/, ''); - switch(r[1]) { - case 'if': - var code = code - .replace(/([A-Z][A-Z0-9_]+)/g, 'self.defineValue("$1")') - .replace(/defined[ \t]*\(?[ \t]*self.defineValue\(("[A-Z][A-Z0-9_]+")\)[ \t]*\)?/g, 'self.defineIsEnabled($1)'); - ifStack.push(['('+code+')', lineNum]); // #if starts on next line - self.log("push if " + code, 4); - break; - case 'ifdef': - if ($.inArray(code, leave_out_defines) < 0) { - ifStack.push(['self.defineIsEnabled("' + code + '")', lineNum]); - self.log("push ifdef " + code, 4); - } - else { - ifStack.push(0); - } - break; - case 'ifndef': - if ($.inArray(code, leave_out_defines) < 0) { - ifStack.push(['!self.defineIsEnabled("' + code + '")', lineNum]); - self.log("push ifndef " + code, 4); - } - else { - ifStack.push(0); - } - break; - case 'else': - case 'endif': - var c = ifStack.pop(); - if (c) { - var cond = c[0], line = c[1]; - self.log("pop " + c[0], 4); - if (dependent_groups[cond] === undefined) dependent_groups[cond] = []; - dependent_groups[cond].push({cindex:i,start:line,end:lineNum}); - if (r[1] == 'else') { - // Reverse the condition - cond = (cond.indexOf('!') === 0) ? cond.substr(1) : ('!'+cond); - ifStack.push([cond, lineNum]); - self.log("push " + cond, 4); - } - } - else { - if (r[1] == 'else') ifStack.push(0); - } - break; - } - } - }); // text blobs loop - }, - - /** - * Init all the defineInfo structures after reload - * The "enabled" field may need an update for newly-loaded dependencies - */ - initDefineInfo: function() { - $.each(define_list, function(e,def_list){ - $.each(def_list, function(i, name) { - define_info[name] = self.getDefineInfo(name, e); - }); - }); - }, - - /** - * Create fields for defines in a config that have none - * Use define_groups data to group fields together - */ - createFieldsForDefines: function(cindex) { - // var n = 0; - var grouping = false, group = define_groups[cindex], - g_pattern, g_regex, g_subitem, g_section, g_class, - fail_list = []; - $.each(define_list[cindex], function(i, name) { - var section = define_section[name]; - if (section != 'hidden' && !$('#'+name).length) { - var inf = define_info[name]; - - if (inf) { - - var label_text = name, sublabel; - - // Is this field in a sequence? - // Then see if it's the second or after - if (grouping) { - if (name in group && g_pattern == group[name].pattern && g_section == section) { - g_subitem = true; - sublabel = g_regex.exec(name)[1]; - } - else - grouping = false; - } - // Start grouping? - if (!grouping && name in group) { - grouping = true; - g_subitem = false; - var grp = group[name]; - g_section = section; - g_class = 'one_of_' + grp.count; - g_pattern = grp.pattern; - g_regex = new RegExp(g_pattern, 'i'); - label_text = grp.title; - sublabel = g_regex.exec(name)[1]; - } - - var $ff = $('#'+section), $newfield, - avail = eval(inf.enabled); - - if (!(grouping && g_subitem)) { - - var $newlabel = $('<label>',{for:name,class:'added'}).text(label_text.toLabel()); - - $newlabel.unblock(avail); - - // if (!(++n % 3)) - $newlabel.addClass('newline'); - - $ff.append($newlabel); - - } - - // Multiple fields? - if (inf.type == 'list') { - for (var i=0; i<inf.size; i++) { - var fieldname = i > 0 ? name+'-'+i : name; - $newfield = $('<input>',{type:'text',size:6,maxlength:10,id:fieldname,name:fieldname,class:'subitem added',disabled:!avail}).unblock(avail); - if (grouping) $newfield.addClass(g_class); - $ff.append($newfield); - } - } - else { - // Items with options, either toggle or select - // TODO: Radio buttons for other values - if (inf.options !== undefined) { - if (inf.type == 'toggle') { - $newfield = $('<input>',{type:'checkbox'}); - } - else { - // Otherwise selectable - $newfield = $('<select>'); - } - // ...Options added when field initialized - } - else { - $newfield = inf.type == 'switch' ? $('<input>',{type:'checkbox'}) : $('<input>',{type:'text',size:10,maxlength:40}); - } - $newfield.attr({id:name,name:name,class:'added',disabled:!avail}).unblock(avail); - if (grouping) { - $newfield.addClass(g_class); - if (sublabel) { - $ff.append($('<label>',{class:'added sublabel',for:name}).text(sublabel.toTitleCase()).unblock(avail)); - } - } - // Add the new field to the form - $ff.append($newfield); - } - } - else - fail_list.push(name); - } - }); - if (fail_list.length) this.log('Unable to parse:\n' + fail_list.join('\n'), 2); - }, - - /** - * Handle a file being dropped on the file field - */ - handleFileLoad: function(txt, $uploader) { - txt += ''; - var filename = $uploader.val().replace(/.*[\/\\](.*)$/, '$1'); - if ($.inArray(filename, config_file_list)) - this.fileLoaded(filename, txt); - else - this.setMessage("Can't parse '"+filename+"'!"); - }, - - /** - * Process a file after it's been successfully loaded - */ - fileLoaded: function(filename, txt, wait) { - this.log("fileLoaded:"+filename,4); - var err, cindex; - switch(filename) { - case boards_file: - this.initBoardsFromText(txt); - $('#MOTHERBOARD').html('').addOptions(boards_list); - if (has_config) this.initField('MOTHERBOARD'); - break; - case config_file: - if (has_boards) { - $config.text(txt); - total_config_lines = txt.lineCount(); - // this.initThermistorList(txt); - if (!wait) cindex = 0; - has_config = true; - if (has_config_adv) { - this.activateDownloadAllLink(); - if (wait) cindex = 2; - } - } - else { - err = boards_file; - } - break; - case config_adv_file: - if (has_config) { - $config_adv.text(txt); - total_config_adv_lines = txt.lineCount(); - if (!wait) cindex = 1; - has_config_adv = true; - if (has_config) { - this.activateDownloadAllLink(); - if (wait) cindex = 2; - } - } - else { - err = config_file; - } - break; - } - // When a config file loads defines need update - if (cindex != null) this.prepareConfigData(cindex); - - this.setMessage(err - ? 'Please upload a "' + boards_file + '" file first!' - : '"' + filename + '" loaded successfully.', err ? 'error' : 'message' - ); - }, - - prepareConfigData: function(cindex) { - var inds = (cindex == 2) ? [ 0, 1 ] : [ cindex ]; - $.each(inds, function(i,e){ - // Purge old fields from the form, clear the define list - self.purgeAddedFields(e); - // Build the define_list - self.initDefineList(e); - // TODO: Find sequential names and group them - // Allows related settings to occupy one line in the form - self.refreshDefineGroups(e); - }); - // Build the dependent defines list - this.initDependentGroups(); // all config text - // Get define_info for all known defines - this.initDefineInfo(); // all config text - $.each(inds, function(i,e){ - // Create new fields - self.createFieldsForDefines(e); // create new fields - // Init the fields, set values, etc - self.refreshConfigForm(e); - self.activateDownloadLink(e); - }); - }, - - /** - * Add initial enhancements to the existing form - */ - initConfigForm: function() { - // Modify form fields and make the form responsive. - // As values change on the form, we could update the - // contents of text areas containing the configs, for - // example. - - // while(!$config_adv.text() == null) {} - // while(!$config.text() == null) {} - - // Go through all form items with names - $form.find('[name]').each(function() { - // Set its id to its name - var name = $(this).attr('name'); - $(this).attr({id: name}); - // Attach its label sibling - var $label = $(this).prev('label'); - if ($label.length) $label.attr('for',name); - }); - - // Get all 'switchable' class items and add a checkbox - // $form.find('.switchable').each(function(){ - // $(this).after( - // $('<input>',{type:'checkbox',value:'1',class:'enabler added'}) - // .prop('checked',true) - // .attr('id',this.id + '-switch') - // .change(self.handleSwitch) - // ); - // }); - - // Add options to the popup menus - // $('#SERIAL_PORT').addOptions([0,1,2,3,4,5,6,7]); - // $('#BAUDRATE').addOptions([2400,9600,19200,38400,57600,115200,250000]); - // $('#EXTRUDERS').addOptions([1,2,3,4]); - // $('#POWER_SUPPLY').addOptions({'1':'ATX','2':'Xbox 360'}); - - // Replace the Serial popup menu with a stepper control - /* - $('#serial_stepper').jstepper({ - min: 0, - max: 3, - val: $('#SERIAL_PORT').val(), - arrowWidth: '18px', - arrowHeight: '15px', - color: '#FFF', - acolor: '#F70', - hcolor: '#FF0', - id: 'select-me', - textStyle: {width:'1.5em',fontSize:'120%',textAlign:'center'}, - onChange: function(v) { $('#SERIAL_PORT').val(v).trigger('change'); } - }); - */ - }, - - /** - * Make tabs to switch between fieldsets - */ - makeTabsForFieldsets: function() { - // Make tabs for the fieldsets - var $fset = $form.find('fieldset'), - $tabs = $('<ul>',{class:'tabs'}), - ind = 1; - $fset.each(function(){ - var tabID = 'TAB'+ind; - $(this).addClass(tabID); - var $leg = $(this).find('legend'); - var $link = $('<a>',{href:'#'+ind,id:tabID}).text($leg.text()); - $tabs.append($('<li>').append($link)); - $link.click(function(e){ - e.preventDefault; - var ind = this.id; - $tabs.find('.active').removeClass('active'); - $(this).addClass('active'); - $fset.hide(); - $fset.filter('.'+this.id).show(); - return false; - }); - ind++; - }); - $('#tabs').html('').append($tabs); - $('<br>',{class:'clear'}).appendTo('#tabs'); - $tabs.find('a:first').trigger('click'); - }, - - /** - * Update all fields on the form after loading a configuration - */ - refreshConfigForm: function(cindex) { - - /** - * Any manually-created form elements will remain - * where they are. Unknown defines (currently most) - * are added to tabs based on section - * - * Specific exceptions can be managed by applying - * classes to the associated form fields. - * Sorting and arrangement can come from an included - * Javascript file that describes the configuration - * in JSON, or using information added to the config - * files. - * - */ - - // Refresh the motherboard menu with new options - $('#MOTHERBOARD').html('').addOptions(boards_list); - - // Init all existing fields, getting define info for those that need it - // refreshing the options and updating their current values - $.each(define_list[cindex], function(i, name) { - if ($('#'+name).length) { - self.initField(name); - self.initFieldValue(name); - } - else - self.log(name + " is not on the page yet.", 2); - }); - - // Set enabled state based on dependencies - // this.enableForDependentConditions(); - }, - - /** - * Enable / disable fields in dependent groups - * based on their dependencies. - */ - refreshDependentFields: function() { - $.each(define_list, function(e,def_list){ - $.each(def_list, function(i, name) { - var inf = define_info[name]; - if (inf && inf.enabled != 'true') { - var $elm = $('#'+name), ena = eval(inf.enabled); - var isEnabled = (inf.type == 'switch') || self.defineIsEnabled(name); - $('#'+name+'-switch').attr('disabled', !ena); - $elm.attr('disabled', !(ena && isEnabled)).unblock(ena); - $('label[for="'+name+'"]').unblock(ena); - } - }); - }); - }, - - /** - * Make a field responsive, tooltip its label(s), add enabler if needed - */ - initField: function(name) { - this.log("initField:"+name,4); - var $elm = $('#'+name), inf = define_info[name]; - $elm[0].defineInfo = inf; - - // Create a tooltip on the label if there is one - if (inf.tooltip) { - // label for the item - var $tipme = $('label[for="'+name+'"]'); - if ($tipme.length) { - $tipme.unbind('mouseenter mouseleave'); - $tipme.hover( - function() { - if ($('#tipson input').prop('checked')) { - var pos = $tipme.position(), px = $tipme.width()/2; - $tooltip.html(inf.tooltip) - .append('<span>') - .css({bottom:($tooltip.parent().outerHeight()-pos.top+10)+'px',left:(pos.left+px)+'px'}) - .show(); - if (hover_timer) { - clearTimeout(hover_timer); - hover_timer = null; - } - } - }, - function() { - hover_timer = setTimeout(function(){ - hover_timer = null; - $tooltip.fadeOut(400); - }, 400); - } - ); - } - } - - // Make the element(s) respond to events - if (inf.type == 'list') { - // Multiple fields need to respond - for (var i=0; i<inf.size; i++) { - if (i > 0) $elm = $('#'+name+'-'+i); - $elm.unbind('input'); - $elm.on('input', this.handleChange); - } - } - else { - var elmtype = $elm.attr('type'); - // Set options on single fields if there are any - if (inf.options !== undefined && elmtype === undefined) - $elm.html('').addOptions(inf.options); - $elm.unbind('input change'); - $elm.on(elmtype == 'text' ? 'input' : 'change', this.handleChange); - } - - // Add an enabler checkbox if it needs one - if (inf.switchable && $('#'+name+'-switch').length == 0) { - // $elm = the last element added - $elm.after( - $('<input>',{type:'checkbox',value:'1',class:'enabler added'}) - .prop('checked',self.defineIsEnabled(name)) - .attr({id: name+'-switch'}) - .change(self.handleSwitch) - ); - } - }, - - /** - * Handle any value field being changed - * this = the field - */ - handleChange: function() { - self.updateDefineFromField(this.id); - self.refreshDependentFields(); - }, - - /** - * Handle a switch checkbox being changed - * this = the switch checkbox - */ - handleSwitch: function() { - var $elm = $(this), - name = $elm[0].id.replace(/-.+/,''), - inf = define_info[name], - on = $elm.prop('checked') || false; - - self.setDefineEnabled(name, on); - - if (inf.type == 'list') { - // Multiple fields? - for (var i=0; i<inf.size; i++) { - $('#'+name+(i?'-'+i:'')).attr('disabled', !on); - } - } - else { - $elm.prev().attr('disabled', !on); - } - }, - - /** - * Get the current value of a #define - */ - defineValue: function(name) { - this.log('defineValue:'+name,4); - var inf = define_info[name]; - if (inf == null) return 'n/a'; - var r = inf.regex.exec(inf.line), val = r[inf.val_i]; - - this.log(r,2); - - return (inf.type == 'switch') ? (val === undefined || val.trim() != '//') : val; - }, - - /** - * Get the current enabled state of a #define - */ - defineIsEnabled: function(name) { - this.log('defineIsEnabled:'+name,4); - var inf = define_info[name]; - if (inf == null) return false; - var r = inf.regex.exec(inf.line); - - this.log(r,2); - - var on = r[1] != null ? r[1].trim() != '//' : true; - this.log(name + ' = ' + on, 2); - - return on; - }, - - /** - * Set a #define enabled or disabled by altering the config text - */ - setDefineEnabled: function(name, val) { - this.log('setDefineEnabled:'+name,4); - var inf = define_info[name]; - if (inf) { - var slash = val ? '' : '//'; - var newline = inf.line - .replace(/^([ \t]*)(\/\/)([ \t]*)/, '$1$3') // remove slashes - .replace(inf.pre+inf.define, inf.pre+slash+inf.define); // add them back - this.setDefineLine(name, newline); - } - }, - - /** - * Update a #define (from the form) by altering the config text - */ - updateDefineFromField: function(name) { - this.log('updateDefineFromField:'+name,4); - - // Drop the suffix on sub-fields - name = name.replace(/-\d+$/, ''); - - var $elm = $('#'+name), inf = define_info[name]; - if (inf == null) return; - - var isCheck = $elm.attr('type') == 'checkbox', - val = isCheck ? $elm.prop('checked') : $elm.val().trim(); - - var newline; - switch(inf.type) { - case 'switch': - var slash = val ? '' : '//'; - newline = inf.line.replace(inf.repl, '$1'+slash+'$3'); - break; - case 'list': - case 'quoted': - case 'plain': - if (isCheck) this.setMessage(name + ' should not be a checkbox!', 'error'); - case 'toggle': - if (isCheck) { - val = val ? inf.options[1] : inf.options[0]; - } - else { - if (inf.type == 'list') - for (var i=1; i<inf.size; i++) val += ', ' + $('#'+name+'-'+i).val().trim(); - } - newline = inf.line.replace(inf.repl, '$1'+(''+val).replace('$','\\$')+'$3'); - break; - } - this.setDefineLine(name, newline); - }, - - /** - * Set the define's line in the text to a new line, - * then update, highlight, and scroll to the line - */ - setDefineLine: function(name, newline) { - this.log('setDefineLine:'+name+'\n'+newline,4); - var inf = define_info[name]; - var $c = $(inf.field), txt = $c.text(); - - var hilite_token = '[HIGHLIGHTER-TOKEN]'; - - txt = txt.replaceLine(inf.lineNum, hilite_token + newline); // for override line and lineNum would be changed - inf.line = newline; - - // Convert txt into HTML before storing - var html = txt.toHTML().replace(hilite_token, '<span></span>'); - - // Set the final text including the highlighter - $c.html(html); - - // Scroll to reveal the define - if ($c.is(':visible')) this.scrollToDefine(name); - }, - - /** - * Scroll a pre box to reveal a #define - */ - scrollToDefine: function(name, always) { - this.log('scrollToDefine:'+name,4); - var inf = define_info[name], $c = $(inf.field); - - // Scroll to the altered text if it isn't visible - var halfHeight = $c.height()/2, scrollHeight = $c.prop('scrollHeight'), - lineHeight = scrollHeight/[total_config_lines, total_config_adv_lines][inf.cindex], - textScrollY = (inf.lineNum * lineHeight - halfHeight).limit(0, scrollHeight - 1); - - if (always || Math.abs($c.prop('scrollTop') - textScrollY) > halfHeight) { - $c.find('span').height(lineHeight); - $c.animate({ scrollTop: textScrollY }); - } - }, - - /** - * Set a form field to the current #define value in the config text - */ - initFieldValue: function(name) { - var $elm = $('#'+name), inf = define_info[name], - val = this.defineValue(name); - - this.log('initFieldValue:' + name + ' to ' + val, 2); - - // If the item is switchable then set enabled state too - var $cb = $('#'+name+'-switch'), avail = eval(inf.enabled), on = true; - if ($cb.length) { - on = self.defineIsEnabled(name); - $cb.prop('checked', on); - } - - if (inf.type == 'list') { - $.each(val.split(','),function(i,v){ - var $e = i > 0 ? $('#'+name+'-'+i) : $elm; - $e.val(v.trim()); - $e.attr('disabled', !(on && avail)).unblock(avail); - }); - } - else { - if (inf.type == 'toggle') val = val == inf.options[1]; - $elm.attr('type') == 'checkbox' ? $elm.prop('checked', val) : $elm.val(''+val); - $elm.attr('disabled', !(on && avail)).unblock(avail); // enable/disable the form field (could also dim it) - } - - $('label[for="'+name+'"]').unblock(avail); - }, - - /** - * Purge added fields and all their define info - */ - purgeAddedFields: function(cindex) { - $.each(define_list[cindex], function(i, name){ - $('#'+name + ",[id^='"+name+"-'],label[for='"+name+"']").filter('.added').remove(); - }); - define_list[cindex] = []; - }, - - /** - * Get information about a #define from configuration file text: - * - * - Pre-examine the #define for its prefix, value position, suffix, etc. - * - Construct RegExp's for the #define to find and replace values. - * - Store the existing #define line as a fast key to finding it later. - * - Determine the line number of the #define - * - Gather nearby comments to be used as tooltips. - * - Look for JSON in nearby comments for use as select options. - * - * define_info[name] - * .type type of define: switch, list, quoted, plain, or toggle - * .size the number of items in a "list" type - * .options select options, if any - * .cindex config index - * .field pre containing the config text (config_list[cindex][0]) - * .line the full line from the config text - * .pre any text preceding #define - * .define the "#define NAME" text (may have leading spaces) - * .post the text following the "#define NAME val" part - * .regex regexp to get the value from the line - * .repl regexp to replace the value in the line - * .val_i the value's index in the .regex result - */ - getDefineInfo: function(name, cindex) { - if (cindex === undefined) cindex = 0; - this.log('getDefineInfo:'+name,4); - var $c = config_list[cindex], txt = $c.text(), - info = { type:0, cindex:cindex, field:$c[0], val_i:2 }, post; - - // a switch line with no value - var find = new RegExp('^([ \\t]*//)?([ \\t]*#define[ \\t]+' + name + ')([ \\t]*(/[*/].*)?)$', 'm'), - r = find.exec(txt); - if (r !== null) { - post = r[3] == null ? '' : r[3]; - $.extend(info, { - type: 'switch', - val_i: 1, - regex: new RegExp('([ \\t]*//)?([ \\t]*' + r[2].regEsc() + post.regEsc() + ')', 'm'), - repl: new RegExp('([ \\t]*)(\/\/)?([ \\t]*' + r[2].regEsc() + post.regEsc() + ')', 'm') - }); - } - else { - // a define with curly braces - find = new RegExp('^(.*//)?(.*#define[ \\t]+' + name + '[ \\t]+)(\{[^\}]*\})([ \\t]*(/[*/].*)?)$', 'm'); - r = find.exec(txt); - if (r !== null) { - post = r[4] == null ? '' : r[4]; - $.extend(info, { - type: 'list', - size: r[3].split(',').length, - regex: new RegExp('([ \\t]*//)?[ \\t]*' + r[2].regEsc() + '\{([^\}]*)\}' + post.regEsc(), 'm'), - repl: new RegExp('(([ \\t]*//)?[ \\t]*' + r[2].regEsc() + '\{)[^\}]*(\}' + post.regEsc() + ')', 'm') - }); - } - else { - // a define with quotes - find = new RegExp('^(.*//)?(.*#define[ \\t]+' + name + '[ \\t]+)("[^"]*")([ \\t]*(/[*/].*)?)$', 'm'); - r = find.exec(txt); - if (r !== null) { - post = r[4] == null ? '' : r[4]; - $.extend(info, { - type: 'quoted', - regex: new RegExp('([ \\t]*//)?[ \\t]*' + r[2].regEsc() + '"([^"]*)"' + post.regEsc(), 'm'), - repl: new RegExp('(([ \\t]*//)?[ \\t]*' + r[2].regEsc() + '")[^"]*("' + post.regEsc() + ')', 'm') - }); - } - else { - // a define with no quotes - find = new RegExp('^([ \\t]*//)?([ \\t]*#define[ \\t]+' + name + '[ \\t]+)(\\S*)([ \\t]*(/[*/].*)?)$', 'm'); - r = find.exec(txt); - if (r !== null) { - post = r[4] == null ? '' : r[4]; - $.extend(info, { - type: 'plain', - regex: new RegExp('([ \\t]*//)?[ \\t]*' + r[2].regEsc() + '(\\S*)' + post.regEsc(), 'm'), - repl: new RegExp('(([ \\t]*//)?[ \\t]*' + r[2].regEsc() + ')\\S*(' + post.regEsc() + ')', 'm') - }); - if (r[3].match(/false|true/)) { - info.type = 'toggle'; - info.options = ['false','true']; - } - } - } - } - } - - // Success? - if (info.type) { - $.extend(info, { - line: r[0], - pre: r[1] == null ? '' : r[1].replace('//',''), - define: r[2], - post: post - }); - // Get the end-of-line comment, if there is one - var tooltip = '', eoltip = ''; - find = new RegExp('.*#define[ \\t].*/[/*]+[ \\t]*(.*)'); - if (info.line.search(find) >= 0) - eoltip = tooltip = info.line.replace(find, '$1'); - - // Get all the comments immediately before the item, also include #define lines preceding it - var s; - // find = new RegExp('(([ \\t]*(//|#)[^\n]+\n){1,4})' + info.line.regEsc(), 'g'); - find = new RegExp('(([ \\t]*//+[^\n]+\n)+([ \\t]*(//)?#define[^\n]+\n)*)' + info.line.regEsc(), 'g'); - if (r = find.exec(txt)) { - var temp = [], tips = []; - - // Find each line in forward order, store in reverse - find = new RegExp('^[ \\t]*//+[ \\t]*(.*)[ \\t]*$', 'gm'); - while((s = find.exec(r[1])) !== null) temp.unshift(s[1]); - - this.log(name+":\n"+temp.join('\n'), 2); - - // Go through the reversed lines and add comment lines on - $.each(temp, function(i,v) { - // @ annotation breaks the comment chain - if (v.match(/^[ \\t]*\/\/+[ \\t]*@/)) return false; - // A #define breaks the chain, after a good tip - if (v.match(/^[ \\t]*(\/\/+)?[ \\t]*#define/)) return (tips.length < 1); - // Skip unwanted lines - if (v.match(/^[ \\t]*(={5,}|#define[ \\t]+.*)/g)) return true; - tips.unshift(v); - }); - - // Build the final tooltip, extract embedded options - $.each(tips, function(i,tip) { - // if (tip.match(/^#define[ \\t]/) != null) tooltip = eoltip; - // JSON data? Save as select options - if (!info.options && tip.match(/:[\[{]/) != null) { - // TODO - // :[1-6] = value limits - var o; eval('o=' + tip.substr(1)); - info.options = o; - if (Object.prototype.toString.call(o) == "[object Array]" && o.length == 2 && !eval(''+o[0])) - info.type = 'toggle'; - } - else { - // Other lines added to the tooltip - tooltip += ' ' + tip + '\n'; - } - }); - - // Add .tooltip and .lineNum properties to the info - find = new RegExp('^'+name); // Strip the name from the tooltip - var lineNum = this.getLineNumberOfText(info.line, txt); - - // See if this define is enabled conditionally - var enable_cond = ''; - $.each(dependent_groups, function(cond,dat){ - $.each(dat, function(i,o){ - if (o.cindex == cindex && lineNum > o.start && lineNum < o.end) { - if (enable_cond != '') enable_cond += ' && '; - enable_cond += '(' + cond + ')'; - } - }); - }); - - $.extend(info, { - tooltip: '<strong>'+name+'</strong> '+tooltip.trim().replace(find,'').toHTML(), - lineNum: lineNum, - switchable: (info.type != 'switch' && info.line.match(/^[ \t]*\/\//)) || false, // Disabled? Mark as "switchable" - enabled: enable_cond ? enable_cond : 'true' - }); - - } // found comments - - } // if info.type - else - info = null; - - this.log(info, 2); - - return info; - }, - - /** - * Count the number of lines before a match, return -1 on fail - */ - getLineNumberOfText: function(line, txt) { - var pos = txt.indexOf(line); - return (pos < 0) ? pos : txt.lineCount(pos); - }, - - /** - * Add a temporary message to the page - */ - setMessage: function(msg,type) { - if (msg) { - if (type === undefined) type = 'message'; - var $err = $('<p class="'+type+'">'+msg+'<span>x</span></p>').appendTo($msgbox), err = $err[0]; - var baseColor = $err.css('color').replace(/rgba?\(([^),]+,[^),]+,[^),]+).*/, 'rgba($1,'); - err.pulse_offset = (pulse_offset += 200); - err.startTime = Date.now() + pulse_offset; - err.pulser = setInterval(function(){ - var pulse_time = Date.now() + err.pulse_offset; - var opac = 0.5+Math.sin(pulse_time/200)*0.4; - $err.css({color:baseColor+(opac)+')'}); - if (pulse_time - err.startTime > 2500 && opac > 0.899) { - clearInterval(err.pulser); - } - }, 50); - $err.click(function(e) { - $(this).remove(); - self.adjustFormLayout(); - return false; - }).css({cursor:'pointer'}); - } - else { - $msgbox.find('p.error, p.warning').each(function() { - if (this.pulser !== undefined && this.pulser) - clearInterval(this.pulser); - $(this).remove(); - }); - } - self.adjustFormLayout(); - }, - - adjustFormLayout: function() { - var wtop = $(window).scrollTop(), - ctop = $cfg.offset().top, - thresh = $form.offset().top+100; - if (ctop < thresh) { - var maxhi = $form.height(); // pad plus heights of config boxes can't be more than this - var pad = wtop > ctop ? wtop-ctop : 0; // pad the top box to stay in view - var innerpad = Math.ceil($cfg.height() - $cfg.find('pre').height()); - // height to use for the inner boxes - var hi = ($(window).height() - ($cfg.offset().top - pad) + wtop - innerpad)/2; - if (hi < 200) hi = 200; - $cfg.css({ paddingTop: pad }); - var $pre = $('pre.config'); - $pre.css({ height: Math.floor(hi) - $pre.position().top }); - } - else { - $cfg.css({ paddingTop: wtop > ctop ? wtop-ctop : 0, height: '' }); - } - }, - - setRequestError: function(stat, path) { - self.setMessage('Error '+stat+' – ' + path.replace(/^(https:\/\/[^\/]+\/)?.+(\/[^\/]+)$/, '$1...$2'), 'error'); - }, - - log: function(o,l) { - if (l === undefined) l = 0; - if (this.logging>=l*1) console.log(o); - }, - - logOnce: function(o) { - if (o.didLogThisObject === undefined) { - this.log(o); - o.didLogThisObject = true; - } - }, - - EOF: null - }; - -})(); - -// Typically the app would be in its own file, but this would be here -window.configuratorApp.init(); - -}); diff --git a/Marlin/configurator/js/jcanvas.js b/Marlin/configurator/js/jcanvas.js deleted file mode 100644 index 254d2acfbdaa421de89bfd3556ad93d4b96142f2..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/jcanvas.js +++ /dev/null @@ -1,524 +0,0 @@ -/*! - jCanvas v2.2.1 - Caleb Evans - 2.2.1 revisions by Thinkyhead -*/ - -(function($, document, Math, Number, undefined) { - -// jC global object -var jC = {}; -jC.originals = { - width: 20, - height: 20, - cornerRadius: 0, - fillStyle: 'transparent', - strokeStyle: 'transparent', - strokeWidth: 5, - strokeCap: 'butt', - strokeJoin: 'miter', - shadowX: 0, - shadowY: 0, - shadowBlur: 10, - shadowColor: 'transparent', - x: 0, y: 0, - x1: 0, y1: 0, - radius: 10, - start: 0, - end: 360, - ccw: false, - inDegrees: true, - fromCenter: true, - closed: false, - sides: 3, - angle: 0, - text: '', - font: 'normal 12pt sans-serif', - align: 'center', - baseline: 'middle', - source: '', - repeat: 'repeat' -}; -// Duplicate original defaults -jC.defaults = $.extend({}, jC.originals); - -// Set global properties -function setGlobals(context, map) { - context.fillStyle = map.fillStyle; - context.strokeStyle = map.strokeStyle; - context.lineWidth = map.strokeWidth; - context.lineCap = map.strokeCap; - context.lineJoin = map.strokeJoin; - context.shadowOffsetX = map.shadowX; - context.shadowOffsetY = map.shadowY; - context.shadowBlur = map.shadowBlur; - context.shadowColor = map.shadowColor; -} - -// Close path if chosen -function closePath(context, map) { - if (map.closed === true) { - context.closePath(); - context.fill(); - context.stroke(); - } else { - context.fill(); - context.stroke(); - context.closePath(); - } -} - -// Measure angles in degrees if chosen -function checkUnits(map) { - if (map.inDegrees === true) { - return Math.PI / 180; - } else { - return 1; - } -} - -// Set canvas defaults -$.fn.canvas = function(args) { - // Reset defaults if no value is passed - if (typeof args === 'undefined') { - jC.defaults = jC.originals; - } else { - jC.defaults = $.extend({}, jC.defaults, args); - } - return this; -}; - -// Load canvas -$.fn.loadCanvas = function(context) { - if (typeof context === 'undefined') {context = '2d';} - return this[0].getContext(context); -}; - -// Create gradient -$.fn.gradient = function(args) { - var ctx = this.loadCanvas(), - // Specify custom defaults - gDefaults = { - x1: 0, y1: 0, - x2: 0, y2: 0, - r1: 10, r2: 100 - }, - params = $.extend({}, gDefaults, args), - gradient, stops = 0, percent, i; - - // Create radial gradient if chosen - if (typeof args.r1 === 'undefined' && typeof args.r2 === 'undefined') { - gradient = ctx.createLinearGradient(params.x1, params.y1, params.x2, params.y2); - } else { - gradient = ctx.createRadialGradient(params.x1, params.y1, params.r1, params.x2, params.y2, params.r2); - } - - // Count number of color stops - for (i=1; i<=Number.MAX_VALUE; i+=1) { - if (params['c' + i]) { - stops += 1; - } else { - break; - } - } - - // Calculate color stop percentages if absent - for (i=1; i<=stops; i+=1) { - percent = Math.round((100 / (stops-1)) * (i-1)) / 100; - if (typeof params['s' + i] === 'undefined') { - params['s' + i] = percent; - } - gradient.addColorStop(params['s' + i], params['c' + i]); - } - return gradient; -}; - -// Create pattern -$.fn.pattern = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - pattern, - img = document.createElement('img'); - img.src = params.source; - - // Create pattern - function create() { - if (img.complete === true) { - // Create pattern - pattern = ctx.createPattern(img, params.repeat); - } else { - throw "The pattern has not loaded yet"; - } - } - try { - create(); - } catch(error) { - img.onload = create; - } - return pattern; -}; - -// Clear canvas -$.fn.clearCanvas = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args); - - // Draw from center if chosen - if (params.fromCenter === true) { - params.x -= params.width / 2; - params.y -= params.height / 2; - } - - // Clear entire canvas if chosen - ctx.beginPath(); - if (typeof args === 'undefined') { - ctx.clearRect(0, 0, this.width(), this.height()); - } else { - ctx.clearRect(params.x, params.y, params.width, params.height); - } - ctx.closePath(); - return this; -}; - -// Save canvas -$.fn.saveCanvas = function() { - var ctx = this.loadCanvas(); - ctx.save(); - return this; -}; - -// Restore canvas -$.fn.restoreCanvas = function() { - var ctx = this.loadCanvas(); - ctx.restore(); - return this; -}; - -// Scale canvas -$.fn.scaleCanvas = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args); - ctx.save(); - ctx.translate(params.x, params.y); - ctx.scale(params.width, params.height); - ctx.translate(-params.x, -params.y) - return this; -}; - -// Translate canvas -$.fn.translateCanvas = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args); - ctx.save(); - ctx.translate(params.x, params.y); - return this; -}; - -// Rotate canvas -$.fn.rotateCanvas = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - toRad = checkUnits(params); - - ctx.save(); - ctx.translate(params.x, params.y); - ctx.rotate(params.angle * toRad); - ctx.translate(-params.x, -params.y); - return this; -}; - -// Draw rectangle -$.fn.drawRect = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - toRad = checkUnits(params), - x1, y1, x2, y2, r; - setGlobals(ctx, params); - - // Draw from center if chosen - if (params.fromCenter === true) { - params.x -= params.width / 2; - params.y -= params.height / 2; - } - - // Draw rounded rectangle if chosen - if (params.cornerRadius > 0) { - x1 = params.x; - y1 = params.y; - x2 = params.x + params.width; - y2 = params.y + params.height; - r = params.cornerRadius; - if ((x2 - x1) - (2 * r) < 0) { - r = (x2 - x1) / 2; - } - if ((y2 - y1) - (2 * r) < 0) { - r = (y2 - y1) / 2; - } - ctx.beginPath(); - ctx.moveTo(x1+r,y1); - ctx.lineTo(x2-r,y1); - ctx.arc(x2-r, y1+r, r, 270*toRad, 360*toRad, false); - ctx.lineTo(x2,y2-r); - ctx.arc(x2-r, y2-r, r, 0, 90*toRad, false); - ctx.lineTo(x1+r,y2); - ctx.arc(x1+r, y2-r, r, 90*toRad, 180*toRad, false); - ctx.lineTo(x1,y1+r); - ctx.arc(x1+r, y1+r, r, 180*toRad, 270*toRad, false); - ctx.fill(); - ctx.stroke(); - ctx.closePath(); - } else { - ctx.fillRect(params.x, params.y, params.width, params.height); - ctx.strokeRect(params.x, params.y, params.width, params.height); - } - return this; -}; - -// Draw arc -$.fn.drawArc = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - toRad = checkUnits(params); - setGlobals(ctx, params); - - // Draw from center if chosen - if (params.fromCenter === false) { - params.x += params.radius; - params.y += params.radius; - } - - ctx.beginPath(); - ctx.arc(params.x, params.y, params.radius, (params.start*toRad)-(Math.PI/2), (params.end*toRad)-(Math.PI/2), params.ccw); - // Close path if chosen - closePath(ctx, params); - return this; -}; - -// Draw ellipse -$.fn.drawEllipse = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - controlW = params.width * (4/3); - setGlobals(ctx, params); - - // Draw from center if chosen - if (params.fromCenter === false) { - params.x += params.width / 2; - params.y += params.height / 2; - } - - // Increment coordinates to prevent negative values - params.x += 1e-10; - params.y += 1e-10; - - // Create ellipse - ctx.beginPath(); - ctx.moveTo(params.x, params.y-params.height/2); - ctx.bezierCurveTo(params.x-controlW/2,params.y-params.height/2, - params.x-controlW/2,params.y+params.height/2, - params.x,params.y+params.height/2); - ctx.bezierCurveTo(params.x+controlW/2,params.y+params.height/2, - params.x+controlW/2,params.y-params.height/2, - params.x,params.y-params.height/2); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - return this; -}; - -// Draw line -$.fn.drawLine = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - max = Number.MAX_VALUE, l, - lx, ly; - setGlobals(ctx, params); - - // Draw each point - ctx.beginPath(); - ctx.moveTo(params.x1, params.y1); - for (l=2; l<max; l+=1) { - lx = params['x' + l]; - ly = params['y' + l]; - // Stop loop when all points are drawn - if (typeof lx === 'undefined' || typeof ly === 'undefined') { - break; - } - ctx.lineTo(lx, ly); - } - // Close path if chosen - closePath(ctx, params); - return this; -}; - -// Draw quadratic curve -$.fn.drawQuad = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - max = Number.MAX_VALUE, l, - lx, ly, lcx, lcy; - setGlobals(ctx, params); - - // Draw each point - ctx.beginPath(); - ctx.moveTo(params.x1, params.y1); - for (l=2; l<max; l+=1) { - lx = params['x' + l]; - if (typeof lx === 'undefined') break; - ly = params['y' + l]; - if (typeof ly === 'undefined') break; - lcx = params['cx' + (l-1)]; - if (typeof lcx === 'undefined') break; - lcy = params['cy' + (l-1)]; - if (typeof lcy === 'undefined') break; - ctx.quadraticCurveTo(lcx, lcy, lx, ly); - } - // Close path if chosen - closePath(ctx, params); - return this; -}; - -// Draw Bezier curve -$.fn.drawBezier = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - max = Number.MAX_VALUE, - l=2, lc=1, lx, ly, lcx1, lcy1, lcx2, lcy2, i; - setGlobals(ctx, params); - - // Draw each point - ctx.beginPath(); - ctx.moveTo(params.x1, params.y1); - for (i=2; i<max; i+=1) { - lx = params['x' + l]; - if (typeof lx === 'undefined') break; - ly = params['y' + l]; - if (typeof ly === 'undefined') break; - lcx1 = params['cx' + lc]; - if (typeof lcx1 === 'undefined') break; - lcy1 = params['cy' + lc]; - if (typeof lcy1 === 'undefined') break; - lcx2 = params['cx' + (lc+1)]; - if (typeof lcx2 === 'undefined') break; - lcy2 = params['cy' + (lc+1)]; - if (typeof lcy2 === 'undefined') break; - ctx.bezierCurveTo(lcx1, lcy1, lcx2, lcy2, lx, ly); - l += 1; - lc += 2; - } - // Close path if chosen - closePath(ctx, params); - return this; -}; - -// Draw text -$.fn.drawText = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args); - setGlobals(ctx, params); - - // Set text-specific properties - ctx.textBaseline = params.baseline; - ctx.textAlign = params.align; - ctx.font = params.font; - - ctx.strokeText(params.text, params.x, params.y); - ctx.fillText(params.text, params.x, params.y); - return this; -}; - -// Draw image -$.fn.drawImage = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - // Define image source - img = document.createElement('img'); - img.src = params.source; - setGlobals(ctx, params); - - // Draw image function - function draw() { - if (img.complete) { - - var scaleFac = img.width / img.height; - - // If width/height are specified - if (typeof args.width !== 'undefined' && typeof args.height !== 'undefined') { - img.width = args.width; - img.height = args.height; - // If width is specified - } else if (typeof args.width !== 'undefined' && typeof args.height === 'undefined') { - img.width = args.width; - img.height = img.width / scaleFac; - // If height is specified - } else if (typeof args.width === 'undefined' && typeof args.height !== 'undefined') { - img.height = args.height; - img.width = img.height * scaleFac; - } - - // Draw from center if chosen - if (params.fromCenter === true) { - params.x -= img.width / 2; - params.y -= img.height / 2; - } - - // Draw image - ctx.drawImage(img, params.x, params.y, img.width, img.height); - } else { - throw "The image has not loaded yet."; - } - } - - function dodraw() { - // console.log("dodraw..."); - try { - // console.log("dodraw...try..."); - draw(); - } - catch(error) { - // console.log("dodraw...catch: " + error); - } - } - - // Draw image if already loaded - // console.log("--------------------"); - // console.log("drawImage " + img.src); - try { - // console.log("try..."); - draw(); - } catch(error) { - // console.log("catch: " + error); - img.onload = dodraw; - } - return this; -}; - -// Draw polygon -$.fn.drawPolygon = function(args) { - var ctx = this.loadCanvas(), - params = $.extend({}, jC.defaults, args), - theta, dtheta, x, y, - toRad = checkUnits(params), i; - setGlobals(ctx, params); - - if (params.sides >= 3) { - // Calculate points and draw - theta = (Math.PI/2) + (Math.PI/params.sides) + (params.angle*toRad); - dtheta = (Math.PI*2) / params.sides; - for (i=0; i<params.sides; i+=1) { - x = params.x + (params.radius * Math.cos(theta)) + 1e-10; - y = params.y + (params.radius * Math.sin(theta)) + 1e-10; - if (params.fromCenter === false) { - x += params.radius; - y += params.radius; - } - ctx.lineTo(x, y); - theta += dtheta; - } - closePath(ctx, params); - } - return this; -}; - -return window.jCanvas = jC; -}(jQuery, document, Math, Number)); \ No newline at end of file diff --git a/Marlin/configurator/js/jquery-2.1.3.min.js b/Marlin/configurator/js/jquery-2.1.3.min.js deleted file mode 100644 index c5e1bfe2f5302c9000b395f0b0b1a07bd48f09dc..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/jquery-2.1.3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) -},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b)) -},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec=/#.*$/,fc=/([?&])_=[^&]*/,gc=/^(.*?):[ \t]*([^\r\n]*)$/gm,hc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ic=/^(?:GET|HEAD)$/,jc=/^\/\//,kc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lc={},mc={},nc="*/".concat("*"),oc=a.location.href,pc=kc.exec(oc.toLowerCase())||[];function qc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rc(a,b,c,d){var e={},f=a===mc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function uc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:oc,type:"GET",isLocal:hc.test(pc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sc(sc(a,n.ajaxSettings),b):sc(n.ajaxSettings,a)},ajaxPrefilter:qc(lc),ajaxTransport:qc(mc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gc.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||oc)+"").replace(ec,"").replace(jc,pc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pc[1]&&h[2]===pc[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pc[3]||("http:"===pc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rc(lc,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ic.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fc.test(d)?d.replace(fc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rc(mc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tc(k,v,f)),u=uc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vc=/%20/g,wc=/\[\]$/,xc=/\r?\n/g,yc=/^(?:submit|button|image|reset|file)$/i,zc=/^(?:input|select|textarea|keygen)/i;function Ac(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wc.test(a)?d(a,e):Ac(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ac(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ac(c,a[c],b,e);return d.join("&").replace(vc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zc.test(this.nodeName)&&!yc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xc,"\r\n")}}):{name:b.name,value:c.replace(xc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bc=0,Cc={},Dc={0:200,1223:204},Ec=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cc)Cc[a]()}),k.cors=!!Ec&&"withCredentials"in Ec,k.ajax=Ec=!!Ec,n.ajaxTransport(function(a){var b;return k.cors||Ec&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Dc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fc=[],Gc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hc)return Hc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ic=a.document.documentElement;function Jc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ic;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ic})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kc=a.jQuery,Lc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lc),b&&a.jQuery===n&&(a.jQuery=Kc),n},typeof b===U&&(a.jQuery=a.$=n),n}); \ No newline at end of file diff --git a/Marlin/configurator/js/jstepper.js b/Marlin/configurator/js/jstepper.js deleted file mode 100644 index c26f5ff4b90105aa45864b90f5c4ec3defb82674..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/jstepper.js +++ /dev/null @@ -1,220 +0,0 @@ -/*! - * jQuery "stepper" Plugin - * version 0.0.1 - * @requires jQuery v1.3.2 or later - * @requires jCanvas - * - * Authored 2011-06-11 Scott Lahteine (thinkyhead.com) - * - * A very simple numerical stepper. - * TODO: place arrows based on div size, make 50/50 width - * - * Usage example: - * - * $('#mydiv').jstepper({ - * min: 1, - * max: 4, - * val: 1, - * arrowWidth: 15, - * arrowHeight: '22px', - * color: '#FFF', - * acolor: '#F70', - * hcolor: '#FF0', - * id: 'select-me', - * stepperClass: 'inner', - * textStyle: {width:'1.5em',fontSize:'20px',textAlign:'center'}, - * onChange: function(v) { }, - * }); - * - */ -;(function($) { - var un = 'undefined'; - - $.jstepperArrows = [ - { name:'prev', poly:[[1.0,0],[0,0.5],[1.0,1.0]] }, - { name:'next', poly:[[0,0],[1.0,0.5],[0,1.0]] } - ]; - - $.fn.jstepper = function(args) { - - return this.each(function() { - - var defaults = { - min: 1, - max: null, - val: null, - active: true, - placeholder: null, - arrowWidth: 0, - arrowHeight: 0, - color: '#FFF', - hcolor: '#FF0', - acolor: '#F80', - id: '', - stepperClass: '', - textStyle: '', - onChange: (function(v){ if (typeof console.log !== 'undefined') console.log("val="+v); }) - }; - - args = $.extend(defaults, args || {}); - - var min = args.min * 1, - max = (args.max !== null) ? args.max * 1 : min, - span = max - min + 1, - val = (args.val !== null) ? args.val * 1 : min, - active = !args.disabled, - placeholder = args.placeholder, - arrowWidth = 1 * args.arrowWidth.toString().replace(/px/,''), - arrowHeight = 1 * args.arrowHeight.toString().replace(/px/,''), - color = args.color, - hcolor = args.hcolor, - acolor = args.acolor, - $prev = $('<a href="#prev" style="cursor:w-resize;"><canvas/></a>'), - $marq = $('<div class="number"/>').css({float:'left',textAlign:'center'}), - $next = $('<a href="#next" style="cursor:e-resize;"><canvas/></a>'), - arrow = [ $prev.find('canvas')[0], $next.find('canvas')[0] ], - $stepper = $('<span class="jstepper"/>').append($prev).append($marq).append($next).append('<div style="clear:both;"/>'), - onChange = args.onChange; - - if (args.id) $stepper[0].id = args.id; - if (args.stepperClass) $stepper.addClass(args.stepperClass); - if (args.textStyle) $marq.css(args.textStyle); - - // replace a span, but embed elsewhere - if (this.tagName == 'SPAN') { - var previd = this.id; - $(this).replaceWith($stepper); - if (previd) $stepper.attr('id',previd); - } - else { - $(this).append($stepper); - } - - // hook to call functions on this object - $stepper[0].ui = { - - refresh: function() { - this.updateNumber(); - this._drawArrow(0, 1); - this._drawArrow(1, 1); - return this; - }, - - _drawArrow: function(i,state) { - var $elm = $(arrow[i]), - desc = $.jstepperArrows[i], - fillStyle = (state == 2) ? hcolor : (state == 3) ? acolor : color, - draw = { fillStyle: fillStyle }, - w = $elm.width(), h = $elm.height(); - - if (w <= 0) w = $elm.attr('width'); - if (h <= 0) h = $elm.attr('height'); - - $.each(desc.poly,function(i,v){ - ++i; - draw['x'+i] = v[0] * w; - draw['y'+i] = v[1] * h; - }); - $elm.restoreCanvas().clearCanvas().drawLine(draw); - }, - - updateNumber: function() { - $marq.html((active || placeholder === null) ? val.toString() : placeholder); - return this; - }, - - _doclick: function(i) { - this.add(i ? 1 : -1); - this._drawArrow(i, 3); - var self = this; - setTimeout(function(){ self._drawArrow(i, 2); }, 50); - }, - - add: function(x) { - val = (((val - min) + x + span) % span) + min; - this.updateNumber(); - this.didChange(val); - return this; - }, - - min: function(v) { - if (typeof v === un) return min; - this.setRange(v,max); - return this; - }, - - max: function(v) { - if (typeof v === un) return max; - this.setRange(min,v); - return this; - }, - - val: function(v) { - if (typeof v === un) return val; - val = (((v - min) + span) % span) + min; - this.updateNumber(); - return this; - }, - - setRange: function(lo, hi, ini) { - if (lo > hi) hi = (lo += hi -= lo) - hi; - min = lo; max = hi; span = hi - lo + 1; - if (typeof ini !== un) val = ini; - if (val < min) val = min; - if (val > max) val = max; - this.updateNumber(); - return this; - }, - - active: function(a) { - if (typeof a === un) return active; - (active = a) ? $marq.removeClass('inactive') : $marq.addClass('inactive'); - this.updateNumber(); - return this; - }, - - disable: function() { this.active(false); return this; }, - enable: function() { this.active(true); return this; }, - - clearPlaceholder: function() { - this.setPlaceholder(null); - return this; - }, - setPlaceholder: function(p) { - placeholder = p; - if (!active) this.updateNumber(); - return this; - }, - - didChange: onChange - - }; - - // set hover and click for each arrow - $.each($.jstepperArrows, function(i,desc) { - var $elm = $(arrow[i]), - w = arrowWidth ? arrowWidth : $elm.width() ? $elm.width() : 15, - h = arrowHeight ? arrowHeight : $elm.height() ? $elm.height() : 24; - $elm[0]._index = i; - $elm - .css({float:'left'}) - .attr({width:w,height:h,'class':desc.name}) - .hover( - function(e) { $stepper[0].ui._drawArrow(e.target._index, 2); }, - function(e) { $stepper[0].ui._drawArrow(e.target._index, 1); } - ) - .click(function(e){ - $stepper[0].ui._doclick(e.target._index); - return false; - }); - }); - - // init the visuals first time - $stepper[0].ui.refresh(); - - }); // this.each - - }; // $.fn.jstepper - -})( jQuery ); - diff --git a/Marlin/configurator/js/jszip.min.js b/Marlin/configurator/js/jszip.min.js deleted file mode 100755 index 767d8c11d272330741951ba78b0829a2ec83baf4..0000000000000000000000000000000000000000 --- a/Marlin/configurator/js/jszip.min.js +++ /dev/null @@ -1,14 +0,0 @@ -/*! - -JSZip - A Javascript class for generating and reading zip files -<http://stuartk.com/jszip> - -(c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com> -Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. - -JSZip uses the library pako released under the MIT license : -https://github.com/nodeca/pako/blob/master/LICENSE -*/ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";c.encode=function(a){for(var b,c,e,f,g,h,i,j="",k=0;k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),e=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=d.indexOf(a.charAt(k++)),g=d.indexOf(a.charAt(k++)),h=d.indexOf(a.charAt(k++)),i=d.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;g<e.length;g++)h=e[g],this.file(h.fileName,h.decompressed,{binary:!0,optimizedBinaryString:!0,date:h.date,dir:h.dir,comment:h.fileComment.length?h.fileComment:null,createFolders:b.createFolders});return f.zipComment.length&&(this.comment=f.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(a,b){(function(a){"use strict";b.exports=function(b,c){return new a(b,c)},b.exports.test=function(b){return a.isBuffer(b)}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(a,b){"use strict";function c(a){this.data=a,this.length=this.data.length,this.index=0}var d=a("./uint8ArrayReader");c.prototype=new d,c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./uint8ArrayReader":18}],13:[function(a,b){"use strict";var c=a("./support"),d=a("./utils"),e=a("./crc32"),f=a("./signature"),g=a("./defaults"),h=a("./base64"),i=a("./compressions"),j=a("./compressedObject"),k=a("./nodeBuffer"),l=a("./utf8"),m=a("./stringWriter"),n=a("./uint8ArrayWriter"),o=function(a){if(a._data instanceof j&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===d.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},p=function(a){var b=o(a),e=d.getTypeOf(b);return"string"===e?!a.options.binary&&c.nodebuffer?k(b,"utf-8"):a.asBinary():b},q=function(a){var b=o(this);return null===b||"undefined"==typeof b?"":(this.options.base64&&(b=h.decode(b)),b=a&&this.options.binary?A.utf8decode(b):d.transformTo("string",b),a||this.options.binary||(b=d.transformTo("string",A.utf8encode(b))),b)},r=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};r.prototype={asText:function(){return q.call(this,!0)},asBinary:function(){return q.call(this,!1)},asNodeBuffer:function(){var a=p(this);return d.transformTo("nodebuffer",a)},asUint8Array:function(){var a=p(this);return d.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var s=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=t(a,g),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var e,f=d.getTypeOf(b);if(c=u(c),c.createFolders&&(e=w(a))&&x.call(this,e,!0),c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=d.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof j))throw new Error("The data of '"+a+"' is in an unsupported format !");"arraybuffer"===f&&(b=d.transformTo("uint8array",b))}var g=new r(a,b,c);return this.files[a]=g,g},w=function(a){"/"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf("/");return b>0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){a=t(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null}),d.checkSupport(a.type);var b,c,e=[],g=0,j=0,k=d.transformTo("string",this.utf8encode(a.comment||this.comment||""));for(var l in this.files)if(this.files.hasOwnProperty(l)){var o=this.files[l],p=o.options.compression||a.compression.toUpperCase(),q=i[p];if(!q)throw new Error(p+" is not a valid compression method !");var r=y.call(this,o,q),u=z.call(this,l,o,r,g);g+=u.fileRecord.length+r.compressedSize,j+=u.dirRecord.length,e.push(u)}var v="";v=f.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+s(e.length,2)+s(e.length,2)+s(j,4)+s(g,4)+s(k.length,2)+k;var w=a.type.toLowerCase();for(b="uint8array"===w||"arraybuffer"===w||"blob"===w||"nodebuffer"===w?new n(g+j+v.length):new m(g+j+v.length),c=0;c<e.length;c++)b.append(e[c].fileRecord),b.append(e[c].compressedObject.compressedContent);for(c=0;c<e.length;c++)b.append(e[c].dirRecord);b.append(v);var x=b.finalize();switch(a.type.toLowerCase()){case"uint8array":case"arraybuffer":case"nodebuffer":return d.transformTo(a.type.toLowerCase(),x);case"blob":return d.arrayBuffer2Blob(d.transformTo("arraybuffer",x));case"base64":return a.base64?h.encode(x):x;default:return x}},crc32:function(a,b){return e(a,b)},utf8encode:function(a){return d.transformTo("string",l.utf8encode(a))},utf8decode:function(a){return l.utf8decode(a)}};b.exports=A},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],15:[function(a,b){"use strict";function c(a,b){this.data=a,b||(this.data=e.string2binary(this.data)),this.length=this.data.length,this.index=0}var d=a("./dataReader"),e=a("./utils");c.prototype=new d,c.prototype.byteAt=function(a){return this.data.charCodeAt(a)},c.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)},c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5,"./utils":21}],16:[function(a,b){"use strict";var c=a("./utils"),d=function(){this.data=[]};d.prototype={append:function(a){a=c.transformTo("string",a),this.data.push(a)},finalize:function(){return this.data.join("")}},b.exports=d},{"./utils":21}],17:[function(a,b,c){(function(a){"use strict";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c.nodebuffer="undefined"!=typeof a,c.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)c.blob=!1;else{var b=new ArrayBuffer(0);try{c.blob=0===new Blob([b],{type:"application/zip"}).size}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;f.append(b),c.blob=0===f.getBlob("application/zip").size}catch(d){c.blob=!1}}}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],18:[function(a,b){"use strict";function c(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var d=a("./dataReader");c.prototype=new d,c.prototype.byteAt=function(a){return this.data[a]},c.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function f(a){var b=65536,d=[],e=a.length,f=c.getTypeOf(a),g=0,h=!0;try{switch(f){case"uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case"nodebuffer":String.fromCharCode.apply(null,j(0))}}catch(i){h=!1}if(!h){for(var k="",l=0;l<a.length;l++)k+=String.fromCharCode(a[l]);return k}for(;e>g&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var h=a("./support"),i=a("./compressions"),j=a("./nodeBuffer");c.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b},c.arrayBuffer2Blob=function(a){c.checkSupport("blob");try{return new Blob([a],{type:"application/zip"})}catch(b){try{var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,e=new d;return e.append(a),e.getBlob("application/zip")}catch(b){throw new Error("Bug : can't construct the Blob.")}}},c.applyFromCharCode=f;var k={};k.string={string:d,array:function(a){return e(a,new Array(a.length))},arraybuffer:function(a){return k.string.uint8array(a).buffer},uint8array:function(a){return e(a,new Uint8Array(a.length))},nodebuffer:function(a){return e(a,j(a.length))}},k.array={string:f,array:d,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(a)}},k.arraybuffer={string:function(a){return f(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:d,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(new Uint8Array(a))}},k.uint8array={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:d,nodebuffer:function(a){return j(a)}},k.nodebuffer={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return k.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:d},c.transformTo=function(a,b){if(b||(b=""),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=k[d][a](b);return e},c.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":h.nodebuffer&&j.test(a)?"nodebuffer":h.uint8array&&a instanceof Uint8Array?"uint8array":h.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":void 0},c.checkSupport=function(a){var b=h[a.toLowerCase()];if(!b)throw new Error(a+" is not supported by this browser")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(h.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===h.CENTRAL_FILE_HEADER;)a=new i({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(h.CENTRAL_DIRECTORY_END);if(-1===a)throw new Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(h.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||j.uint8array?"nodebuffer"===b?new e(a):new f(g.transformTo("uint8array",a)):new d(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=c},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(a,b){"use strict";function c(a,b){this.options=a,this.loadOptions=b}var d=a("./stringReader"),e=a("./utils"),f=a("./compressedObject"),g=a("./object");c.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,f){return function(){var a=e.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==f)throw new Error("Bug : uncompressed data size mismatch");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");if(b=e.findCompression(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+e.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new f,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=e.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw new Error("Corrupted zip : CRC32 mismatch")},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readString(this.fileCommentLength),this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index<e+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);var b=this.findExtraFieldUnicodeComment();null!==b&&(this.fileComment=b)}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(a,b,c){"use strict";function d(a,b){var c=new s(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}function f(a,b){return b=b||{},b.gzip=!0,d(a,b)}var g=a("./zlib/deflate.js"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=0,m=4,n=0,o=1,p=-1,q=0,r=8,s=function(a){this.options=h.assign({level:p,method:r,chunkSize:16384,windowBits:15,memLevel:8,strategy:q,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header) -};s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+hb-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<hb)););}while(a.lookahead<jb&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c)),a.match_length>=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function p(a,b){for(var c,d,e;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=hb-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===S||a.match_length===hb&&a.strstart-a.match_start>4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=hb-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return sb}else if(a.match_available){if(d=D._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return sb}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=D._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ib){if(m(a),a.lookahead<=ib&&b===H)return sb;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+hb-1)/hb),i.window=new C.Buf8(2*i.w_size),i.head=new C.Buf16(i.hash_size),i.prev=new C.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new C.Buf8(i.pending_buf_size),i.d_buf=i.lit_bufsize>>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<<e.lenbits)-1,u=(1<<e.distbits)-1;a:do{15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){e.mode=d;break a}a.msg="invalid literal/length code",e.mode=c;break a}x=65535&v,w&=15,w&&(w>q&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg="invalid distance code",e.mode=c;break a}if(y=65535&v,w&=15,w>q&&(p+=B[f++]<<q,q+=8,w>q&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=g>f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new r.Buf8(f.wsize)),d>=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab=0,Bb=new r.Buf8(4),Cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return F;c=a.state,c.mode===V&&(c.mode=W),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xb=C;a:for(;;)switch(c.mode){case K:if(0===c.wrap){c.mode=W;break}for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<<wb,a.adler=c.check=1,c.mode=512&m?T:V,m=0,n=0;break;case L:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==J){a.msg="unknown compression method",c.mode=lb;break}if(57344&c.flags){a.msg="unknown header flags set",c.mode=lb;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg="header crc mismatch",c.mode=lb;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=U;case U:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,E;a.adler=c.check=1,c.mode=V;case V:if(b===A||b===B)break a;case W:if(c.last){m>>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.have<c.ncode;){for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Cb[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have<c.nlen+c.ndist;){for(;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(16>sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<<c.distbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.distcode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a; -if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?t(c.check,f,p,h-p):s(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg="incorrect data check",c.mode=lb;break}m=0,n=0}c.mode=jb;case jb:if(c.wrap&&c.flags){for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg="incorrect length check",c.mode=lb;break}m=0,n=0}c.mode=kb;case kb:xb=D;break a;case lb:xb=G;break a;case mb:return H;case nb:default:return F}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<lb&&(c.mode<ib||b!==z))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=mb,H):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?t(c.check,f,p,a.next_out-p):s(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===V?128:0)+(c.mode===bb||c.mode===Y?256:0),(0===o&&0===p||b===z)&&xb===C&&(xb=I),xb)}function n(a){if(!a||!a.state)return F;var b=a.state;return b.window&&(b.window=null),a.state=null,C}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?F:(c.head=b,b.done=!1,C)):F}var p,q,r=a("../utils/common"),s=a("./adler32"),t=a("./crc32"),u=a("./inffast"),v=a("./inftrees"),w=0,x=1,y=2,z=4,A=5,B=6,C=0,D=1,E=2,F=-2,G=-3,H=-4,I=-5,J=8,K=1,L=2,M=3,N=4,O=5,P=6,Q=7,R=8,S=9,T=10,U=11,V=12,W=13,X=14,Y=15,Z=16,$=17,_=18,ab=19,bb=20,cb=21,db=22,eb=23,fb=24,gb=25,hb=26,ib=27,jb=28,kb=29,lb=30,mb=31,nb=32,ob=852,pb=592,qb=15,rb=qb,sb=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(a,b){"use strict";var c=a("../utils/common"),d=15,e=852,f=592,g=0,h=1,i=2,j=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],k=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],m=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,n,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new c.Buf16(d+1),Q=new c.Buf16(d+1),R=null,S=0;for(D=0;d>=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===h&&L>e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;G>I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<<I,a===h&&L>e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<<a.bi_valid&65535,f(a,a.bi_buf),a.bi_buf=b>>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function h(a,b,c){g(a,c[2*b],c[2*b+1])}function i(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<<ab[d];a++)gb[e++]=d;for(e>>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<<ab[d]-7;a++)gb[256+e++]=d;for(b=0;U>=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function r(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&q(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!q(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function s(a,b,c){var d,f,i,j,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],f=a.pending_buf[a.l_buf+k],k++,0===d?h(a,f,b):(i=hb[f],h(a,i+P+1,b),j=_[i],0!==j&&(f-=ib[i],g(a,f,j)),d--,i=e(d),h(a,i,c),j=ab[i],0!==j&&(d-=jb[i],g(a,d,j)));while(k<a.last_lit);h(a,X,b)}function t(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=T,c=0;i>c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(j>h?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++j<k&&e===i)){if(l>j){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)}); \ No newline at end of file diff --git a/Marlin/dac_mcp4728.cpp b/Marlin/dac_mcp4728.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b7035bfc738822b3279203e0618c26fd841f9cb4 --- /dev/null +++ b/Marlin/dac_mcp4728.cpp @@ -0,0 +1,115 @@ +/* + + mcp4728.cpp - Arduino library for MicroChip MCP4728 I2C D/A converter + For implementation details, please take a look at the datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf + For discussion and feedback, please go to http://arduino.cc/forum/index.php/topic,51842.0.html +*/ + + +/* _____PROJECT INCLUDES_____________________________________________________ */ +#include "dac_mcp4728.h" + +#if ENABLED(DAC_STEPPER_CURRENT) + +// Used Global variables +uint16_t mcp4728_values[4]; + +/* +Begin I2C, get current values (input register and eeprom) of mcp4728 +*/ +void mcp4728_init() { + Wire.begin(); + Wire.requestFrom(int(DAC_DEV_ADDRESS), 24); + while(Wire.available()) { + int deviceID = Wire.receive(); + int hiByte = Wire.receive(); + int loByte = Wire.receive(); + + int isEEPROM = (deviceID & 0B00001000) >> 3; + int channel = (deviceID & 0B00110000) >> 4; + if (isEEPROM != 1) { + mcp4728_values[channel] = word((hiByte & 0B00001111), loByte); + } + } +} + +/* +Write input resister value to specified channel using fastwrite method. +Channel : 0-3, Values : 0-4095 +*/ +uint8_t mcp4728_analogWrite(uint8_t channel, uint16_t value) { + mcp4728_values[channel] = value; + return mcp4728_fastWrite(); +} +/* +Write all input resistor values to EEPROM using SequencialWrite method. +This will update both input register and EEPROM value +This will also write current Vref, PowerDown, Gain settings to EEPROM +*/ +uint8_t mcp4728_eepromWrite() { + Wire.beginTransmission(DAC_DEV_ADDRESS); + Wire.send(SEQWRITE); + for (uint8_t channel=0; channel <= 3; channel++) { + Wire.send(DAC_STEPPER_VREF << 7 | 0 << 5 | DAC_STEPPER_GAIN << 4 | highByte(mcp4728_values[channel])); + Wire.send(lowByte(mcp4728_values[channel])); + } + return Wire.endTransmission(); +} + +/* + Write Voltage reference setting to all input regiters +*/ +uint8_t mcp4728_setVref_all(uint8_t value) { + Wire.beginTransmission(DAC_DEV_ADDRESS); + Wire.send(VREFWRITE | value << 3 | value << 2 | value << 1 | value); + return Wire.endTransmission(); +} +/* + Write Gain setting to all input regiters +*/ +uint8_t mcp4728_setGain_all(uint8_t value) { + Wire.beginTransmission(DAC_DEV_ADDRESS); + Wire.send(GAINWRITE | value << 3 | value << 2 | value << 1 | value); + return Wire.endTransmission(); +} + +/* + Return Input Regiter value +*/ +uint16_t mcp4728_getValue(uint8_t channel) { return mcp4728_values[channel]; } + +/* +// Steph: Might be useful in the future +// Return Vout +uint16_t mcp4728_getVout(uint8_t channel) { + uint32_t vref = 2048; + uint32_t vOut = (vref * mcp4728_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; + if (vOut > defaultVDD) vOut = defaultVDD; + return vOut; +} +*/ + +/* +FastWrite input register values - All DAC ouput update. refer to DATASHEET 5.6.1 +DAC Input and PowerDown bits update. +No EEPROM update +*/ +uint8_t mcp4728_fastWrite() { + Wire.beginTransmission(DAC_DEV_ADDRESS); + for (uint8_t channel=0; channel <= 3; channel++) { + Wire.send(highByte(mcp4728_values[channel])); + Wire.send(lowByte(mcp4728_values[channel])); + } + return Wire.endTransmission(); +} + +/* +Common function for simple general commands +*/ +uint8_t mcp4728_simpleCommand(byte simpleCommand) { + Wire.beginTransmission(GENERALCALL); + Wire.send(simpleCommand); + return Wire.endTransmission(); +} + +#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/dac_mcp4728.h b/Marlin/dac_mcp4728.h new file mode 100644 index 0000000000000000000000000000000000000000..53664d4d6a45075c559b38dda9d8d1e445d32063 --- /dev/null +++ b/Marlin/dac_mcp4728.h @@ -0,0 +1,44 @@ +/** +Arduino library for MicroChip MCP4728 I2C D/A converter. +*/ + +#ifndef mcp4728_h +#define mcp4728_h + +#include "Configuration.h" +#include "Configuration_adv.h" + +#if ENABLED(DAC_STEPPER_CURRENT) +#include "WProgram.h" +#include "Wire.h" +//#include <Wire.h> + +#define defaultVDD 5000 +#define BASE_ADDR 0x60 +#define RESET 0B00000110 +#define WAKE 0B00001001 +#define UPDATE 0B00001000 +#define MULTIWRITE 0B01000000 +#define SINGLEWRITE 0B01011000 +#define SEQWRITE 0B01010000 +#define VREFWRITE 0B10000000 +#define GAINWRITE 0B11000000 +#define POWERDOWNWRITE 0B10100000 +#define GENERALCALL 0B0000000 +#define GAINWRITE 0B11000000 + +// This is taken from the original lib, makes it easy to edit if needed +#define DAC_DEV_ADDRESS (BASE_ADDR | 0x00) + +void mcp4728_init(); +uint8_t mcp4728_analogWrite(uint8_t channel, uint16_t value); +uint8_t mcp4728_eepromWrite(); +uint8_t mcp4728_setVref_all(uint8_t value); +uint8_t mcp4728_setGain_all(uint8_t value); +uint16_t mcp4728_getValue(uint8_t channel); +uint8_t mcp4728_fastWrite(); +uint8_t mcp4728_simpleCommand(byte simpleCommand); + +#endif +#endif + diff --git a/Marlin/dogm_lcd_implementation.h b/Marlin/dogm_lcd_implementation.h index 4e2cbf9ef52e989df065fa3f10ab93e728e52fec..9cb52b75d1d14394db2b77fdff1cd8e77bc7e80a 100644 --- a/Marlin/dogm_lcd_implementation.h +++ b/Marlin/dogm_lcd_implementation.h @@ -22,9 +22,9 @@ #define BLEN_A 0 #define BLEN_B 1 #define BLEN_C 2 - #define EN_A BIT(BLEN_A) - #define EN_B BIT(BLEN_B) - #define EN_C BIT(BLEN_C) + #define EN_A (_BV(BLEN_A)) + #define EN_B (_BV(BLEN_B)) + #define EN_C (_BV(BLEN_C)) #define LCD_CLICKED (buttons&EN_C) #endif @@ -146,7 +146,6 @@ #include "utf_mapper.h" int lcd_contrast; -static unsigned char blink = 0; // Variable for visualization of fan rotation in GLCD static char currentfont = 0; static void lcd_setFont(char font_nr) { @@ -170,7 +169,7 @@ char lcd_print(char c) { } } -char lcd_print(char* str) { +char lcd_print(const char* str) { char c; int i = 0; char n = 0; @@ -225,14 +224,14 @@ static void lcd_implementation_init() { #endif #if ENABLED(SHOW_BOOTSCREEN) - int offx = (u8g.getWidth() - START_BMPWIDTH) / 2; + int offx = (u8g.getWidth() - (START_BMPWIDTH)) / 2; #if ENABLED(START_BMPHIGH) int offy = 0; #else int offy = DOG_CHAR_HEIGHT; #endif - int txt1X = (u8g.getWidth() - (sizeof(STRING_SPLASH_LINE1) - 1) * DOG_CHAR_WIDTH) / 2; + int txt1X = (u8g.getWidth() - (sizeof(STRING_SPLASH_LINE1) - 1) * (DOG_CHAR_WIDTH)) / 2; u8g.firstPage(); do { @@ -240,11 +239,11 @@ static void lcd_implementation_init() { u8g.drawBitmapP(offx, offy, START_BMPBYTEWIDTH, START_BMPHEIGHT, start_bmp); lcd_setFont(FONT_MENU); #ifndef STRING_SPLASH_LINE2 - u8g.drawStr(txt1X, u8g.getHeight() - DOG_CHAR_HEIGHT, STRING_SPLASH_LINE1); + u8g.drawStr(txt1X, u8g.getHeight() - (DOG_CHAR_HEIGHT), STRING_SPLASH_LINE1); #else - int txt2X = (u8g.getWidth() - (sizeof(STRING_SPLASH_LINE2) - 1) * DOG_CHAR_WIDTH) / 2; - u8g.drawStr(txt1X, u8g.getHeight() - DOG_CHAR_HEIGHT * 3 / 2, STRING_SPLASH_LINE1); - u8g.drawStr(txt2X, u8g.getHeight() - DOG_CHAR_HEIGHT * 1 / 2, STRING_SPLASH_LINE2); + int txt2X = (u8g.getWidth() - (sizeof(STRING_SPLASH_LINE2) - 1) * (DOG_CHAR_WIDTH)) / 2; + u8g.drawStr(txt1X, u8g.getHeight() - (DOG_CHAR_HEIGHT) * 3 / 2, STRING_SPLASH_LINE1); + u8g.drawStr(txt2X, u8g.getHeight() - (DOG_CHAR_HEIGHT) * 1 / 2, STRING_SPLASH_LINE2); #endif } } while (u8g.nextPage()); @@ -270,7 +269,7 @@ static void _draw_heater_status(int x, int heater) { lcd_print(itostr3(int(heater >= 0 ? degHotend(heater) : degBed()) + 0.5)); lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); - if (!isHeatingHotend(0)) { + if (heater >= 0 ? !isHeatingHotend(heater) : !isHeatingBed()) { u8g.drawBox(x+7,y,2,2); } else { @@ -284,29 +283,30 @@ static void lcd_implementation_status_screen() { u8g.setColorIndex(1); // black on white // Symbols menu graphics, animated fan - u8g.drawBitmapP(9,1,STATUS_SCREENBYTEWIDTH,STATUS_SCREENHEIGHT, (blink % 2) && fanSpeed ? status_screen0_bmp : status_screen1_bmp); + u8g.drawBitmapP(9,1,STATUS_SCREENBYTEWIDTH,STATUS_SCREENHEIGHT, (blink % 2) && fanSpeeds[0] ? status_screen0_bmp : status_screen1_bmp); #if ENABLED(SDSUPPORT) // SD Card Symbol - u8g.drawBox(42, 42 - TALL_FONT_CORRECTION, 8, 7); - u8g.drawBox(50, 44 - TALL_FONT_CORRECTION, 2, 5); - u8g.drawFrame(42, 49 - TALL_FONT_CORRECTION, 10, 4); - u8g.drawPixel(50, 43 - TALL_FONT_CORRECTION); + u8g.drawBox(42, 42 - (TALL_FONT_CORRECTION), 8, 7); + u8g.drawBox(50, 44 - (TALL_FONT_CORRECTION), 2, 5); + u8g.drawFrame(42, 49 - (TALL_FONT_CORRECTION), 10, 4); + u8g.drawPixel(50, 43 - (TALL_FONT_CORRECTION)); // Progress bar frame - u8g.drawFrame(54, 49, 73, 4 - TALL_FONT_CORRECTION); + u8g.drawFrame(54, 49, 73, 4 - (TALL_FONT_CORRECTION)); // SD Card Progress bar and clock lcd_setFont(FONT_STATUSMENU); if (IS_SD_PRINTING) { // Progress bar solid part - u8g.drawBox(55, 50, (unsigned int)(71.f * card.percentDone() / 100.f), 2 - TALL_FONT_CORRECTION); + u8g.drawBox(55, 50, (unsigned int)(71.f * card.percentDone() / 100.f), 2 - (TALL_FONT_CORRECTION)); } u8g.setPrintPos(80,48); if (print_job_start_ms != 0) { - uint16_t time = (millis() - print_job_start_ms) / 60000; + uint16_t time = (((print_job_stop_ms > print_job_start_ms) + ? print_job_stop_ms : millis()) - print_job_start_ms) / 60000; lcd_print(itostr2(time/60)); lcd_print(':'); lcd_print(itostr2(time%60)); @@ -325,8 +325,8 @@ static void lcd_implementation_status_screen() { // Fan lcd_setFont(FONT_STATUSMENU); u8g.setPrintPos(104, 27); - #if HAS_FAN - int per = ((fanSpeed + 1) * 100) / 256; + #if HAS_FAN0 + int per = ((fanSpeeds[0] + 1) * 100) / 256; if (per) { lcd_print(itostr3(per)); lcd_print('%'); @@ -338,6 +338,9 @@ static void lcd_implementation_status_screen() { } // X, Y, Z-Coordinates + // Before homing the axis letters are blinking 'X' <-> '?'. + // When axis is homed but axis_known_position is false the axis letters are blinking 'X' <-> ' '. + // When everything is ok you see a constant 'X'. #define XYZ_BASELINE 38 lcd_setFont(FONT_STATUSMENU); @@ -348,32 +351,61 @@ static void lcd_implementation_status_screen() { #endif u8g.setColorIndex(0); // white on black u8g.setPrintPos(2, XYZ_BASELINE); - lcd_print('X'); + if (blink & 1) + lcd_printPGM(PSTR("X")); + else { + if (!axis_homed[X_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[X_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("X")); + } u8g.drawPixel(8, XYZ_BASELINE - 5); u8g.drawPixel(8, XYZ_BASELINE - 3); u8g.setPrintPos(10, XYZ_BASELINE); - if (axis_known_position[X_AXIS]) - lcd_print(ftostr31ns(current_position[X_AXIS])); - else - lcd_printPGM(PSTR("---")); + lcd_print(ftostr31ns(current_position[X_AXIS])); + u8g.setPrintPos(43, XYZ_BASELINE); - lcd_print('Y'); + if (blink & 1) + lcd_printPGM(PSTR("Y")); + else { + if (!axis_homed[Y_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[Y_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("Y")); + } u8g.drawPixel(49, XYZ_BASELINE - 5); u8g.drawPixel(49, XYZ_BASELINE - 3); u8g.setPrintPos(51, XYZ_BASELINE); - if (axis_known_position[Y_AXIS]) - lcd_print(ftostr31ns(current_position[Y_AXIS])); - else - lcd_printPGM(PSTR("---")); + lcd_print(ftostr31ns(current_position[Y_AXIS])); + u8g.setPrintPos(83, XYZ_BASELINE); - lcd_print('Z'); + if (blink & 1) + lcd_printPGM(PSTR("Z")); + else { + if (!axis_homed[Z_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[Z_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("Z")); + } u8g.drawPixel(89, XYZ_BASELINE - 5); u8g.drawPixel(89, XYZ_BASELINE - 3); u8g.setPrintPos(91, XYZ_BASELINE); - if (axis_known_position[Z_AXIS]) - lcd_print(ftostr32sp(current_position[Z_AXIS])); - else - lcd_printPGM(PSTR("---.--")); + lcd_print(ftostr32sp(current_position[Z_AXIS])); u8g.setColorIndex(1); // black on white // Feedrate @@ -411,13 +443,13 @@ static void lcd_implementation_status_screen() { static void lcd_implementation_mark_as_selected(uint8_t row, bool isSelected) { if (isSelected) { u8g.setColorIndex(1); // black on white - u8g.drawBox(0, row * DOG_CHAR_HEIGHT + 3 - TALL_FONT_CORRECTION, LCD_PIXEL_WIDTH, DOG_CHAR_HEIGHT); + u8g.drawBox(0, row * (DOG_CHAR_HEIGHT) + 3 - (TALL_FONT_CORRECTION), LCD_PIXEL_WIDTH, DOG_CHAR_HEIGHT); u8g.setColorIndex(0); // following text must be white on black } else { u8g.setColorIndex(1); // unmarked text is black on white } - u8g.setPrintPos(START_ROW * DOG_CHAR_WIDTH, (row + 1) * DOG_CHAR_HEIGHT); + u8g.setPrintPos((START_ROW) * (DOG_CHAR_WIDTH), (row + 1) * (DOG_CHAR_HEIGHT)); } static void lcd_implementation_drawmenu_generic(bool isSelected, uint8_t row, const char* pstr, char pre_char, char post_char) { @@ -431,7 +463,7 @@ static void lcd_implementation_drawmenu_generic(bool isSelected, uint8_t row, co pstr++; } while (n--) lcd_print(' '); - u8g.setPrintPos(LCD_PIXEL_WIDTH - DOG_CHAR_WIDTH, (row + 1) * DOG_CHAR_HEIGHT); + u8g.setPrintPos(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH), (row + 1) * (DOG_CHAR_HEIGHT)); lcd_print(post_char); lcd_print(' '); } @@ -449,7 +481,7 @@ static void _drawmenu_setting_edit_generic(bool isSelected, uint8_t row, const c } lcd_print(':'); while (n--) lcd_print(' '); - u8g.setPrintPos(LCD_PIXEL_WIDTH - DOG_CHAR_WIDTH * vallen, (row + 1) * DOG_CHAR_HEIGHT); + u8g.setPrintPos(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * vallen, (row + 1) * (DOG_CHAR_HEIGHT)); if (pgm) lcd_printPGM(data); else lcd_print((char*)data); } @@ -477,7 +509,7 @@ static void _drawmenu_setting_edit_generic(bool isSelected, uint8_t row, const c #define lcd_implementation_drawmenu_setting_edit_callback_long5(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr5(*(data))) #define lcd_implementation_drawmenu_setting_edit_callback_bool(sel, row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) -void lcd_implementation_drawedit(const char* pstr, char* value) { +void lcd_implementation_drawedit(const char* pstr, const char* value) { uint8_t rows = 1; uint8_t lcd_width = LCD_WIDTH, char_width = DOG_CHAR_WIDTH; uint8_t vallen = lcd_strlen(value); @@ -496,7 +528,7 @@ void lcd_implementation_drawedit(const char* pstr, char* value) { if (lcd_strlen_P(pstr) > LCD_WIDTH - 2 - vallen) rows = 2; - const float kHalfChar = DOG_CHAR_HEIGHT_EDIT / 2; + const float kHalfChar = (DOG_CHAR_HEIGHT_EDIT) / 2; float rowHeight = u8g.getHeight() / (rows + 1); // 1/(rows+1) = 1/2 or 1/3 u8g.setPrintPos(0, rowHeight + kHalfChar); diff --git a/Marlin/example_configurations/Felix/Configuration.h b/Marlin/example_configurations/Felix/Configuration.h index a3ffe2903982ef6cccfea34fd79316c604af14ff..d8576be8f31b482e81c26e65394dd012b615adb0 100644 --- a/Marlin/example_configurations/Felix/Configuration.h +++ b/Marlin/example_configurations/Felix/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -266,16 +263,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -323,10 +319,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -336,11 +374,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -363,6 +403,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -398,24 +440,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -426,7 +470,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -438,7 +482,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -452,7 +496,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 180 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -460,25 +504,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -486,16 +542,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -509,37 +578,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -571,10 +609,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // default steps per unit for Felix 2.0/3.0: 0.00249mm x/y rounding error with 3mm pitch HTD belt and 14 tooth pulleys. 0 z error. #define DEFAULT_AXIS_STEPS_PER_UNIT {76.190476, 76.190476, 1600, 164} #define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {5000,5000,100,80000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {5000,5000,100,80000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 1750 //1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves -#define DEFAULT_RETRACT_ACCELERATION 5000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration in mm/s^2 for retracts #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves // The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) @@ -614,6 +652,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -634,13 +680,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -648,12 +694,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -670,13 +716,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -691,7 +737,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -714,6 +760,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -727,7 +775,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -739,7 +787,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino #define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -821,19 +869,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/Felix/Configuration_DUAL.h b/Marlin/example_configurations/Felix/Configuration_DUAL.h index 09adeae13c562f3ee2aed1f5f1477ef9add07f15..6c96bafaa8b608a56da83365dee27677fedca474 100644 --- a/Marlin/example_configurations/Felix/Configuration_DUAL.h +++ b/Marlin/example_configurations/Felix/Configuration_DUAL.h @@ -61,6 +61,7 @@ Here are some standard links for getting your machine calibrated: #define SERIAL_PORT 0 // This determines the communication speed of the printer +// :[2400,9600,19200,38400,57600,115200,250000] #define BAUDRATE 250000 // Enable the Bluetooth serial interface on AT90USB devices @@ -81,17 +82,27 @@ Here are some standard links for getting your machine calibrated: //#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" // This defines the number of extruders +// :[1,2,3,4] #define EXTRUDERS 2 +// 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 EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + //// The following define selects which power supply you have. Please choose the one that matches your setup // 1 = ATX // 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) +// :{1:'ATX',2:'X-Box 360'} #define POWER_SUPPLY 1 // Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it. #define PS_DEFAULT_OFF +// @section temperature + //=========================================================================== //============================= Thermal Settings ============================ //=========================================================================== @@ -99,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -118,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -133,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 1 #define TEMP_SENSOR_2 0 @@ -167,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -228,14 +236,15 @@ Here are some standard links for getting your machine calibrated: //#define PID_BED_DEBUG // Sends debug data to the serial port. #if ENABLED(PIDTEMPBED) -// Felix Foil Heater - #define DEFAULT_bedKp 103.37 - #define DEFAULT_bedKi 2.79 - #define DEFAULT_bedKd 956.94 + // Felix Foil Heater + #define DEFAULT_bedKp 103.37 + #define DEFAULT_bedKi 2.79 + #define DEFAULT_bedKd 956.94 -// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED +// @section extruder //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit //can be software-disabled for whatever purposes by @@ -251,16 +260,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -308,37 +316,96 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // 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 -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + #define DISABLE_E false // For all extruders #define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled +// @section machine + // 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 + +// @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 true #define INVERT_E2_DIR false #define INVERT_E3_DIR false +// @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + // ENDSTOP SETTINGS: // Sets 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 @@ -346,6 +413,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS. #define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. +// @section machine + // Travel limits after homing (units are in mm) #define X_MIN_POS 0 #define Y_MIN_POS 0 @@ -368,24 +437,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -394,10 +465,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -409,7 +479,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -423,7 +493,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 180 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -431,25 +501,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -457,16 +539,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -480,40 +575,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE +// @section homing + // The position of the homing switches //#define MANUAL_HOME_POSITIONS // If defined, MANUAL_*_HOME_POS below will be used //#define BED_CENTER_AT_0_0 // If defined, the center of the bed is at (X=0, Y=0) @@ -527,6 +593,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing. #endif +// @section movement + /** * MOVEMENT SETTINGS */ @@ -538,18 +606,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // default steps per unit for Felix 2.0/3.0: 0.00249mm x/y rounding error with 3mm pitch HTD belt and 14 tooth pulleys. 0 z error. #define DEFAULT_AXIS_STEPS_PER_UNIT {76.190476, 76.190476, 1600, 164} #define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {5000,5000,100,80000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {5000,5000,100,80000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 1750 //1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves -#define DEFAULT_RETRACT_ACCELERATION 5000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration in mm/s^2 for retracts #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves -// 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 EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis -//#define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis - // The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) #define DEFAULT_XYJERK 10 // (mm/sec) #define DEFAULT_ZJERK 0.3 //0.4 // (mm/sec) @@ -560,6 +622,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //============================= Additional Features =========================== //============================================================================= +// @section more + // Custom M code points #define CUSTOM_M_CODES #if ENABLED(CUSTOM_M_CODES) @@ -570,6 +634,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif #endif +// @section extras // EEPROM // The microcontroller can store settings in the EEPROM, e.g. max velocity... @@ -581,9 +646,17 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #if ENABLED(EEPROM_SETTINGS) // To disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: - #define EEPROM_CHITCHAT // please keep turned on if you can. + #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -601,15 +674,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define ABS_PREHEAT_FAN_SPEED 255 // Insert Value between 0 and 255 //==============================LCD and SD support============================= +// @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -617,19 +691,18 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. //#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click //#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click // 0 to disable buzzer feedback. Test with M300 S<frequency Hz> P<duration ms> - // PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) // http://reprap.org/wiki/PanelOne //#define PANEL_ONE @@ -640,13 +713,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -661,7 +734,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -684,6 +757,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -696,14 +771,20 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs //#define LCD_I2C_VIKI +// SSD1306 OLED generic display support +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino +//#define U8GLIB_SSD1306 + // Shift register panels // --------------------- // 2 wire Non-latching LCD SR from: // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection - +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD //#define SAV_3DLCD -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino #define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -726,7 +807,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ //#define PHOTOGRAPH_PIN 23 -// SF send wrong arc g-codes when using Arc Point as fillet procedure +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure //#define SF_ARC_FIX // Support for the BariCUDA Paste Extruder. @@ -785,19 +866,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/Felix/Configuration_adv.h b/Marlin/example_configurations/Felix/Configuration_adv.h index 5e9c5ea8c8db5e24ebb2ba0d33f3c75b40e2cdb5..6d57a890da78ea5604b50b6464f5a3a2445aa820 100644 --- a/Marlin/example_configurations/Felix/Configuration_adv.h +++ b/Marlin/example_configurations/Felix/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -349,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -370,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -397,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -462,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/Hephestos/Configuration.h b/Marlin/example_configurations/Hephestos/Configuration.h index 519f3c7899a924e84933d28832eee5e1b2e4f398..a0de263fef2ca4575c895535ca7d84c127df8fbb 100644 --- a/Marlin/example_configurations/Hephestos/Configuration.h +++ b/Marlin/example_configurations/Hephestos/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -113,6 +113,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -132,6 +133,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -147,7 +149,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -181,14 +183,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 260 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -245,13 +242,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -276,16 +273,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -333,10 +329,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -346,11 +384,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -373,6 +413,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -408,24 +450,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -434,10 +478,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -449,7 +492,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -463,7 +506,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -471,25 +514,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -497,16 +552,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -520,37 +588,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -624,6 +661,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -644,13 +689,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -658,11 +703,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -679,13 +725,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -700,7 +746,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -717,12 +763,17 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // http://reprap.org/wiki/Mini_panel //#define MINIPANEL +// BQ SMART FULL GRAPHIC CONTROLLER +//#define BQ_LCD_SMART_CONTROLLER + /** * I2C Panels */ //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -736,7 +787,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -748,7 +799,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -830,19 +881,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/Hephestos/Configuration_adv.h b/Marlin/example_configurations/Hephestos/Configuration_adv.h index 13f402c63d4ee5bb0e60907b2bc9cebb1dc961f1..3c46c95519367dc0b72344f74606e2620eb5790b 100644 --- a/Marlin/example_configurations/Hephestos/Configuration_adv.h +++ b/Marlin/example_configurations/Hephestos/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -349,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -370,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 1.75 - #define STEPS_MM_E 100.47095761381482 #endif // @section extras @@ -397,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -446,11 +468,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt #define RETRACT_LENGTH 3 //default retract length (positive mm) #define RETRACT_LENGTH_SWAP 13 //default swap retract length (positive mm), for extruder change - #define RETRACT_FEEDRATE 80*60 //default feedrate for retracting (mm/s) + #define RETRACT_FEEDRATE 80 //default feedrate for retracting (mm/s) #define RETRACT_ZLIFT 0 //default retract Z-lift #define RETRACT_RECOVER_LENGTH 0 //default additional recover length (mm, added to retract length when recovering) //#define RETRACT_RECOVER_LENGTH_SWAP 0 //default additional swap recover length (mm, added to retract length when recovering from extruder change) - #define RETRACT_RECOVER_FEEDRATE 8*60 //default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE 8 //default feedrate for recovering from retraction (mm/s) #endif // Add support for experimental filament exchange support M600; requires display @@ -462,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/configurator/config/Configuration.h b/Marlin/example_configurations/Hephestos_2/Configuration.h similarity index 72% rename from Marlin/configurator/config/Configuration.h rename to Marlin/example_configurations/Hephestos_2/Configuration.h index 3d00134fb0d359aca6bad10dc70c0dbc564c04d2..cb844befd119a7c0e8d1e6f370d07d89418dc6d7 100644 --- a/Marlin/configurator/config/Configuration.h +++ b/Marlin/example_configurations/Hephestos_2/Configuration.h @@ -47,7 +47,7 @@ Here are some standard links for getting your machine calibrated: // User-specified version info of this build to display in [Pronterface, etc] terminal window during // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this // build by the user have been successfully uploaded into firmware. -#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define STRING_CONFIG_H_AUTHOR "@jbrazio" // Who made the changes. #define SHOW_BOOTSCREEN #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 //#define STRING_SPLASH_LINE2 STRING_DISTRIBUTION_DATE // will be shown during bootup in line 2 @@ -70,16 +70,16 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D #endif // Optional custom name for your RepStrap or other custom machine // Displayed in the LCD "Ready" message -//#define CUSTOM_MACHINE_NAME "3D Printer" +#define CUSTOM_MACHINE_NAME "BQ Hephestos 2" // Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) // You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) -//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" +#define MACHINE_UUID "8d083632-40c5-4649-85b8-43d9ae6c5d55" // BQ Hephestos 2 standard config // This defines the number of extruders // :[1,2,3,4] @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,8 +146,8 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } -#define TEMP_SENSOR_0 1 +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +#define TEMP_SENSOR_0 70 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 @@ -172,20 +174,15 @@ Here are some standard links for getting your machine calibrated: // When temperature exceeds max temp, your heater will be switched off. // This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! // You should use MINTEMP for thermistor short/failure protection. -#define HEATER_0_MAXTEMP 275 +#define HEATER_0_MAXTEMP 250 #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -202,26 +199,20 @@ Here are some standard links for getting your machine calibrated: //#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_PARAMS_PER_EXTRUDER // Uses separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with gcode: M301 E[extruder number, 0-2] - #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature - // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + #define PID_FUNCTIONAL_RANGE 250 // If the temperature difference between the target temperature and the actual temperature + // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term #define K1 0.95 //smoothing factor within the PID - // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it - // Ultimaker - #define DEFAULT_Kp 22.2 - #define DEFAULT_Ki 1.08 - #define DEFAULT_Kd 114 - - // MakerGear - //#define DEFAULT_Kp 7.0 - //#define DEFAULT_Ki 0.1 - //#define DEFAULT_Kd 12 + // Tuned PID values using M303 + #define DEFAULT_Kp 19.18 + #define DEFAULT_Ki 1.36 + #define DEFAULT_Kd 67.42 - // Mendel Parts V9 on 12V - //#define DEFAULT_Kp 63.0 - //#define DEFAULT_Ki 2.25 - //#define DEFAULT_Kd 440 + // BQ firmware stock PID values + //#define DEFAULT_Kp 10.7 + //#define DEFAULT_Ki 0.45 + //#define DEFAULT_Kd 3 #endif // PIDTEMP @@ -253,13 +244,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +275,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -331,20 +321,62 @@ Here are some standard links for getting your machine calibrated: #endif // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). -const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Y_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool X_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -//#define DISABLE_MAX_ENDSTOPS +#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -354,11 +386,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -368,19 +402,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section machine // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. -#define INVERT_X_DIR false +#define INVERT_X_DIR true #define INVERT_Y_DIR true -#define INVERT_Z_DIR false +#define INVERT_Z_DIR true // @section extruder // For direct drive extruder v9 set to true, for geared extruder set to false. -#define INVERT_E0_DIR false +#define INVERT_E0_DIR true #define INVERT_E1_DIR false #define INVERT_E2_DIR false #define INVERT_E3_DIR false // @section homing +#define MIN_Z_HEIGHT_FOR_HOMING 5 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -389,8 +425,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Y_HOME_DIR -1 #define Z_HOME_DIR -1 -#define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS. -#define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. +#define min_software_endstops false // If true, axis won't move to coordinates less than HOME_POS. +#define max_software_endstops false // If true, axis won't move to coordinates greater than the defined lengths below. // @section machine @@ -398,9 +434,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define X_MIN_POS 0 #define Y_MIN_POS 0 #define Z_MIN_POS 0 -#define X_MAX_POS 200 -#define Y_MAX_POS 200 -#define Z_MAX_POS 200 +#define X_MAX_POS 210 +#define Y_MAX_POS 297 +#define Z_MAX_POS 210 //=========================================================================== //========================= Filament Runout Sensor ========================== @@ -416,16 +452,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) @@ -434,6 +465,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -442,9 +480,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel -//#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) +#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -456,7 +494,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -465,12 +503,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #if ENABLED(AUTO_BED_LEVELING_GRID) - #define LEFT_PROBE_BED_POSITION 15 - #define RIGHT_PROBE_BED_POSITION 170 - #define FRONT_PROBE_BED_POSITION 20 - #define BACK_PROBE_BED_POSITION 170 + #define LEFT_PROBE_BED_POSITION X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER + #define RIGHT_PROBE_BED_POSITION X_MAX_POS - X_PROBE_OFFSET_FROM_EXTRUDER + #define FRONT_PROBE_BED_POSITION Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER + #define BACK_PROBE_BED_POSITION Y_MAX_POS - Y_PROBE_OFFSET_FROM_EXTRUDER - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -478,42 +516,67 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER + #define ABL_PROBE_PT_1_Y Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER + #define ABL_PROBE_PT_2_X X_MAX_POS - X_PROBE_OFFSET_FROM_EXTRUDER + #define ABL_PROBE_PT_2_Y Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER + #define ABL_PROBE_PT_3_X ((X_MIN_POS + X_MAX_POS) / 2) + #define ABL_PROBE_PT_3_Y Y_MAX_POS - Y_PROBE_OFFSET_FROM_EXTRUDER #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 34 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER 15 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. - #define Z_RAISE_BEFORE_PROBING 15 // How much the Z axis will be raised before traveling to the first probing point. - #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. - #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. + #define Z_RAISE_BEFORE_PROBING 5 // How much the Z axis will be raised before traveling to the first probing point. + #define Z_RAISE_BETWEEN_PROBINGS 2 // How much the Z axis will be raised when traveling from between next probing points. + #define Z_RAISE_AFTER_PROBING 5 // How much the Z axis will be raised after the last probing point. + + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + #define FIX_MOUNTED_PROBE -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -527,37 +590,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -582,22 +614,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l * MOVEMENT SETTINGS */ -#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min) +#define HOMING_FEEDRATE {150*60, 150*60, 3.3*60, 0} // set the homing speeds (mm/min) // default settings -#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,4000,500} // default steps per unit for Ultimaker -#define DEFAULT_MAX_FEEDRATE {300, 300, 5, 25} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {3000,3000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_AXIS_STEPS_PER_UNIT {160, 160, 8000, 204.146} // default steps per unit for Ultimaker +#define DEFAULT_MAX_FEEDRATE {200, 200, 3.3, 200} // (mm/sec) +#define DEFAULT_MAX_ACCELERATION {1000, 1000, 100, 3000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. -#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts -#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves // The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) -#define DEFAULT_XYJERK 20.0 // (mm/sec) +#define DEFAULT_XYJERK 15.0 // (mm/sec) #define DEFAULT_ZJERK 0.4 // (mm/sec) -#define DEFAULT_EJERK 5.0 // (mm/sec) +#define DEFAULT_EJERK 2.0 // (mm/sec) //============================================================================= @@ -611,8 +643,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #if ENABLED(CUSTOM_M_CODES) #if ENABLED(AUTO_BED_LEVELING_FEATURE) #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 - #define Z_PROBE_OFFSET_RANGE_MIN -20 - #define Z_PROBE_OFFSET_RANGE_MAX 20 + #define Z_PROBE_OFFSET_RANGE_MIN -5 + #define Z_PROBE_OFFSET_RANGE_MAX 0 #endif #endif @@ -624,13 +656,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. //define this to enable EEPROM support -//#define EEPROM_SETTINGS +#define EEPROM_SETTINGS #if ENABLED(EEPROM_SETTINGS) // To disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -639,38 +679,38 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section temperature // Preheat Constants -#define PLA_PREHEAT_HOTEND_TEMP 180 -#define PLA_PREHEAT_HPB_TEMP 70 -#define PLA_PREHEAT_FAN_SPEED 0 // Insert Value between 0 and 255 +#define PLA_PREHEAT_HOTEND_TEMP 210 +#define PLA_PREHEAT_HPB_TEMP 70 +#define PLA_PREHEAT_FAN_SPEED 0 // Insert Value between 0 and 255 #define ABS_PREHEAT_HOTEND_TEMP 240 -#define ABS_PREHEAT_HPB_TEMP 110 -#define ABS_PREHEAT_FAN_SPEED 0 // Insert Value between 0 and 255 +#define ABS_PREHEAT_HPB_TEMP 110 +#define ABS_PREHEAT_FAN_SPEED 0 // Insert Value between 0 and 255 //==============================LCD and SD support============================= // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) -//#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) +#define SDSUPPORT // Enable SD Card Support in Hardware Console + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -687,13 +727,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -708,7 +748,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -725,12 +765,17 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // http://reprap.org/wiki/Mini_panel //#define MINIPANEL +// BQ SMART FULL GRAPHIC CONTROLLER +#define BQ_LCD_SMART_CONTROLLER + /** * I2C Panels */ //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -742,9 +787,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs //#define LCD_I2C_VIKI - + // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -756,13 +801,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // 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 +#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. @@ -838,19 +883,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + #define MEASURED_UPPER_LIMIT 2.00 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.60 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/Hephestos_2/Configuration_adv.h b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h new file mode 100644 index 0000000000000000000000000000000000000000..39a3d8ac454571d042031410b9d2d52b5a8657d8 --- /dev/null +++ b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h @@ -0,0 +1,630 @@ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H + +#include "Conditionals.h" + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +#if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS +#endif +#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control + +/** + * Thermal Protection parameters + */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius + + /** + * Whenever an M104 or M109 increases the target temperature the firmware will wait for the + * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE + * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, + * 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 below 2. + */ + #define WATCH_TEMP_PERIOD 16 // Seconds + #define WATCH_TEMP_INCREASE 4 // Degrees Celsius +#endif + + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + #define PID_ADD_EXTRUSION_RATE + #if ENABLED(PID_ADD_EXTRUSION_RATE) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +//Show Temperature ADC value +//The M105 command return, besides traditional information, the ADC value read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +// @section extruder + +// extruder run-out prevention. +//if the machine is idle, and the temperature over MINTEMP, every couple of SECONDS some filament is extruded +//#define EXTRUDER_RUNOUT_PREVENT +#define EXTRUDER_RUNOUT_MINTEMP 190 +#define EXTRUDER_RUNOUT_SECONDS 30. +#define EXTRUDER_RUNOUT_ESTEPS 14. //mm filament +#define EXTRUDER_RUNOUT_SPEED 1500. //extrusion speed +#define EXTRUDER_RUNOUT_EXTRUDE 100 + +// @section temperature + +//These defines help to calibrate the AD595 sensor in case you get wrong temperature measurements. +//The measured temperature is defined as "actualTemp = (measuredTemp * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET" +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 + +//This is for controlling a fan to cool down the stepper drivers +//it will turn on when any driver is enabled +//and turn off after the set amount of seconds from last driver being disabled again +#define CONTROLLERFAN_PIN -1 //Pin used for the fan to cool controller (-1 to disable) +#define CONTROLLERFAN_SECS 60 //How many seconds, after all motors were disabled, the fan should run +#define CONTROLLERFAN_SPEED 255 // == full speed + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +// This defines the minimal speed for the main fan, run in PWM mode +// to enable uncomment and set minimal PWM speed for reliable running (1-255) +// if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM +//#define FAN_MIN_PWM 50 + +// @section extruder + +// Extruder cooling fans +// Configure fan pin outputs to automatically turn on/off when the associated +// extruder temperature is above/below EXTRUDER_AUTO_FAN_TEMPERATURE. +// 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 EXTRUDER_0_AUTO_FAN_PIN 11 +#define EXTRUDER_1_AUTO_FAN_PIN 6 +#define EXTRUDER_2_AUTO_FAN_PIN -1 +#define EXTRUDER_3_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + + +//=========================================================================== +//=============================Mechanical Settings=========================== +//=========================================================================== + +// @section homing + +#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// A single Z stepper driver is usually used to drive 2 stepper motors. +// Uncomment this define to utilize a separate stepper driver for each Z axis motor. +// Only a few motherboards support this, like RAMPS, which have dual extruder support (the 2nd, often unused, extruder driver is used +// to control the 2nd Z axis stepper motor). The pins are currently only defined for a RAMPS motherboards. +// On a RAMPS (or other 5 driver) motherboard, using this feature will limit you to using 1 extruder. +//#define Z_DUAL_STEPPER_DRIVERS + +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + + // Z_DUAL_ENDSTOPS is a feature to enable the use of 2 endstops for both Z steppers - Let's call them Z stepper and Z2 stepper. + // That way the machine is capable to align the bed during home, since both Z steppers are homed. + // There is also an implementation of M666 (software endstops adjustment) to this feature. + // After Z homing, this adjustment is applied to just one of the steppers in order to align the bed. + // One just need to home the Z axis and measure the distance difference between both Z axis and apply the math: Z adjust = Z - Z2. + // If the Z stepper axis is closer to the bed, the measure Z > Z2 (yes, it is.. think about it) and the Z adjust would be positive. + // Play a little bit with small adjustments (0.5mm) and check the behaviour. + // The M119 (endstops report) will start reporting the Z2 Endstop as well. + + //#define Z_DUAL_ENDSTOPS + + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36) + const bool Z2_MAX_ENDSTOP_INVERTING = false; + #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis. + #endif + +#endif // Z_DUAL_STEPPER_DRIVERS + +// Same again but for Y Axis. +//#define Y_DUAL_STEPPER_DRIVERS + +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + // Define if the two Y drives need to rotate in opposite directions + #define INVERT_Y2_VS_Y_DIR true +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the EXTRUDER_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // Pins for second x-carriage stepper driver (defined here to avoid further complicating pins.h) + #define X2_ENABLE_PIN 29 + #define X2_STEP_PIN 25 + #define X2_DIR_PIN 23 + + // There are a few selectable movement modes for dual x-carriages using M605 S<mode> + // Mode 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) + // Mode 1: Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2: Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE 0 + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif //DUAL_X_CARRIAGE + +// @section homing + +//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again: +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR {2, 2, 4} // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially. + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// @section machine + +//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_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// 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/sec) + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES {16,16,16,16,16} // [1,2,4,8,16] + +// Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) +#define DIGIPOT_MOTOR_CURRENT {150, 170, 180, 190, 180} // Values 0-255 (bq ZUM Mega 3D (default): X = 150 [~1.17A]; Y = 170 [~1.33A]; Z = 180 [~1.41A]; E0 = 190 [~1.49A]) + +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + +// uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro +//#define DIGIPOT_I2C +// Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 +#define DIGIPOT_I2C_NUM_CHANNELS 8 +// actual motor currents in Amps, need as many here as DIGIPOT_I2C_NUM_CHANNELS +#define DIGIPOT_I2C_MOTOR_CURRENTS {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0} + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers? + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + #define SDCARD_RATHERRECENTFIRST //reverse file order of sd card menu display. Its sorted practically after the file system block order. + // if a file is deleted, it frees a block. hence, the order is not purely chronological. To still have auto0.g accessible, there is again the option to do that. + // using: + #define MENU_ADDAUTOSTART + + // Show a progress bar on HD44780 LCDs for SD printing + //#define LCD_PROGRESS_BAR + + #if ENABLED(LCD_PROGRESS_BAR) + // Amount of time (ms) to show the bar + #define PROGRESS_BAR_BAR_TIME 2000 + // Amount of time (ms) to show the status message + #define PROGRESS_BAR_MSG_TIME 3000 + // Amount of time (ms) to retain the status message (0=forever) + #define PROGRESS_MSG_EXPIRE 0 + // Enable this to show messages for MSG_TIME then hide them + //#define PROGRESS_MSG_ONCE + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // This option allows you to abort SD printing when any endstop is triggered. + // This feature must be enabled with "M540 S1" or from the LCD menu. + // To have any effect, endstops must be enabled during SD printing. + // With ENDSTOPS_ONLY_FOR_HOMING you must send "M120" to enable endstops. + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + +#endif // SDSUPPORT + +// for dogm lcd displays you can choose some additional fonts: +#if ENABLED(DOGLCD) + // save 3120 bytes of PROGMEM by commenting out #define USE_BIG_EDIT_FONT + // we don't have a big font for Cyrillic, Kana + //#define USE_BIG_EDIT_FONT + + // If you have spare 2300Byte of progmem and want to use a + // smaller font on the Info-screen uncomment the next line. + #define USE_SMALL_INFOFONT +#endif // DOGLCD + +// @section more + +// The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +// Babystepping enables the user to control the axis in tiny amounts, independently from the normal printing process +// it can e.g. be used to change z-positions in the print startup phase in real-time +// does not respect endstops! +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! + #define BABYSTEP_INVERT_Z false //true for inverse movements in Z + #define BABYSTEP_MULTIPLICATOR 1 //faster movements +#endif + +// @section extruder + +// extruder advance constant (s2/mm3) +// +// advance (steps) = STEPS_PER_CUBIC_MM_E * EXTRUDER_ADVANCE_K * cubic mm per second ^ 2 +// +// Hooke's law says: force = k * distance +// Bernoulli's principle says: v ^ 2 / 2 + g . h + pressure / density = constant +// so: v ^ 2 is proportional to number of steps we advance the extruder +//#define ADVANCE + +#if ENABLED(ADVANCE) + #define EXTRUDER_ADVANCE_K .0 + #define D_FILAMENT 2.85 +#endif + +// @section extras + +// Arc interpretation settings: +#define MM_PER_ARC_SEGMENT 1 +#define N_ARC_CORRECTION 25 + +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2, i.g. 8,16,32 because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section more + +//The ASCII buffer for receiving from the serial: +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// 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 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section fwretract + +// Firmware based and LCD controlled retract +// M207 and M208 can be used to define parameters for the retraction. +// The retraction can be called by the slicer using G10 and G11 +// until then, intended retractions can be detected by moves that only extrude and the direction. +// the moves are than replaced by the firmware controlled ones. + +//#define FWRETRACT //ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt + #define RETRACT_LENGTH 3 //default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 //default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 //default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 //default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 //default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 //default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 //default feedrate for recovering from retraction (mm/s) +#endif + +// Add support for experimental filament exchange support M600; requires display +#if ENABLED(ULTIPANEL) + //#define FILAMENTCHANGEENABLE + #if ENABLED(FILAMENTCHANGEENABLE) + #define FILAMENTCHANGE_XPOS 3 + #define FILAMENTCHANGE_YPOS 3 + #define FILAMENTCHANGE_ZADD 10 + #define FILAMENTCHANGE_FIRSTRETRACT -2 + #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop + #endif +#endif + +/******************************************************************************\ + * enable this section if you have TMC26X motor drivers. + * you need to import the TMC26XStepper library into the Arduino IDE for this + ******************************************************************************/ + +// @section tmc + +//#define HAVE_TMCDRIVER +#if ENABLED(HAVE_TMCDRIVER) + + //#define X_IS_TMC + #define X_MAX_CURRENT 1000 //in mA + #define X_SENSE_RESISTOR 91 //in mOhms + #define X_MICROSTEPS 16 //number of microsteps + + //#define X2_IS_TMC + #define X2_MAX_CURRENT 1000 //in mA + #define X2_SENSE_RESISTOR 91 //in mOhms + #define X2_MICROSTEPS 16 //number of microsteps + + //#define Y_IS_TMC + #define Y_MAX_CURRENT 1000 //in mA + #define Y_SENSE_RESISTOR 91 //in mOhms + #define Y_MICROSTEPS 16 //number of microsteps + + //#define Y2_IS_TMC + #define Y2_MAX_CURRENT 1000 //in mA + #define Y2_SENSE_RESISTOR 91 //in mOhms + #define Y2_MICROSTEPS 16 //number of microsteps + + //#define Z_IS_TMC + #define Z_MAX_CURRENT 1000 //in mA + #define Z_SENSE_RESISTOR 91 //in mOhms + #define Z_MICROSTEPS 16 //number of microsteps + + //#define Z2_IS_TMC + #define Z2_MAX_CURRENT 1000 //in mA + #define Z2_SENSE_RESISTOR 91 //in mOhms + #define Z2_MICROSTEPS 16 //number of microsteps + + //#define E0_IS_TMC + #define E0_MAX_CURRENT 1000 //in mA + #define E0_SENSE_RESISTOR 91 //in mOhms + #define E0_MICROSTEPS 16 //number of microsteps + + //#define E1_IS_TMC + #define E1_MAX_CURRENT 1000 //in mA + #define E1_SENSE_RESISTOR 91 //in mOhms + #define E1_MICROSTEPS 16 //number of microsteps + + //#define E2_IS_TMC + #define E2_MAX_CURRENT 1000 //in mA + #define E2_SENSE_RESISTOR 91 //in mOhms + #define E2_MICROSTEPS 16 //number of microsteps + + //#define E3_IS_TMC + #define E3_MAX_CURRENT 1000 //in mA + #define E3_SENSE_RESISTOR 91 //in mOhms + #define E3_MICROSTEPS 16 //number of microsteps + +#endif + +/******************************************************************************\ + * enable this section if you have L6470 motor drivers. + * you need to import the L6470 library into the Arduino IDE for this + ******************************************************************************/ + +// @section l6470 + +//#define HAVE_L6470DRIVER +#if ENABLED(HAVE_L6470DRIVER) + + //#define X_IS_L6470 + #define X_MICROSTEPS 16 //number of microsteps + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define X2_IS_L6470 + #define X2_MICROSTEPS 16 //number of microsteps + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Y_IS_L6470 + #define Y_MICROSTEPS 16 //number of microsteps + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Y2_IS_L6470 + #define Y2_MICROSTEPS 16 //number of microsteps + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Z_IS_L6470 + #define Z_MICROSTEPS 16 //number of microsteps + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Z2_IS_L6470 + #define Z2_MICROSTEPS 16 //number of microsteps + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define E0_IS_L6470 + #define E0_MICROSTEPS 16 //number of microsteps + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define E1_IS_L6470 + #define E1_MICROSTEPS 16 //number of microsteps + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define E2_IS_L6470 + #define E2_MICROSTEPS 16 //number of microsteps + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define E3_IS_L6470 + #define E3_MICROSTEPS 16 //number of microsteps + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high + #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off + #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall + +#endif + +#include "Conditionals.h" +#include "SanityCheck.h" + +#endif //CONFIGURATION_ADV_H diff --git a/Marlin/example_configurations/Hephestos_2/readme.md b/Marlin/example_configurations/Hephestos_2/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..19521705fe02e8b2b3bcd30077ef2aa8e00d6ebb --- /dev/null +++ b/Marlin/example_configurations/Hephestos_2/readme.md @@ -0,0 +1,8 @@ +# Example Configuration for BQ [Hephestos 2](http://www.bq.com/uk/hephestos-2) +This configuration file is based on the original configuration file shipped with the heavily modified Marlin fork by BQ. The original firmware and configuration file can be found at [BQ Github repository](https://github.com/bq/Marlin). + +NOTE: The look and feel of the Hephestos 2 while navigating the LCD menu will change by using the original Marlin firmware. + +## Changelog + * 2016/03/01 - Initial release + * 2016/03/21 - Activated four point auto leveling by default; updated miscellaneous z-probe values diff --git a/Marlin/example_configurations/K8200/Configuration.h b/Marlin/example_configurations/K8200/Configuration.h index 66af2bbe92cfb6970e3804741b29a64947be9301..90a38d949ae3ecc96fd54d0454ca68d37babcdeb 100644 --- a/Marlin/example_configurations/K8200/Configuration.h +++ b/Marlin/example_configurations/K8200/Configuration.h @@ -1,7 +1,7 @@ -// Example configuration file for Vellemann K8200 +// Sample configuration file for Vellemann K8200 // tested on K8200 with VM8201 (Display) -// and Arduino 1.6.1 (Win) by @CONSULitAS, 2015-04-14 -// https://github.com/CONSULitAS/Marlin-K8200/archive/K8200_stable_2015-04-14.zip +// and Arduino 1.6.8 (Mac) by @CONSULitAS, 2016-02-21 +// https://github.com/CONSULitAS/Marlin-K8200/archive/K8200_stable_2016-02-21.zip #ifndef CONFIGURATION_H #define CONFIGURATION_H @@ -52,7 +52,7 @@ Here are some standard links for getting your machine calibrated: // User-specified version info of this build to display in [Pronterface, etc] terminal window during // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this // build by the user have been successfully uploaded into firmware. -#define STRING_CONFIG_H_AUTHOR "(K8200, CONSULitAS)" // Who made the changes. +#define STRING_CONFIG_H_AUTHOR "(K8200, @CONSULitAS)" // Who made the changes. #define SHOW_BOOTSCREEN #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 //#define STRING_SPLASH_LINE2 STRING_DISTRIBUTION_DATE // will be shown during bootup in line 2 @@ -80,11 +80,11 @@ Here are some standard links for getting your machine calibrated: // Optional custom name for your RepStrap or other custom machine // Displayed in the LCD "Ready" message -//#define CUSTOM_MACHINE_NAME "3D Printer" +#define CUSTOM_MACHINE_NAME "K8200" // Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) // You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) -//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" +#define MACHINE_UUID "2b7dea3b-844e-4ab1-aa96-bb6406607d6e" // K8200 standard config with VM8201 (Display) // This defines the number of extruders // :[1,2,3,4] @@ -115,6 +115,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -134,6 +135,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -149,7 +151,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -183,14 +185,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -212,11 +209,26 @@ Here are some standard links for getting your machine calibrated: #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term #define K1 0.95 //smoothing factor within the PID + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + // Vellemann K8200 Extruder - calculated with PID Autotune and tested #define DEFAULT_Kp 24.29 #define DEFAULT_Ki 1.58 #define DEFAULT_Kd 93.51 - #endif // PIDTEMP //=========================================================================== @@ -231,7 +243,7 @@ Here are some standard links for getting your machine calibrated: // If your configuration is significantly different than this and you don't understand the issues involved, you probably // shouldn't use bed PID until someone else verifies your hardware works. // If this is enabled, find your own PID constants below. -//#define PIDTEMPBED +#define PIDTEMPBED //#define BED_LIMIT_SWITCHING @@ -247,13 +259,25 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //Vellemann K8200 PCB heatbed with standard PCU at 60 degreesC - calculated with PID Autotune and tested + //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 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. + + // Vellemann K8200 PCB heatbed with standard PCU at 60 degreesC - calculated with PID Autotune and tested + // from pidautotune #define DEFAULT_bedKp 341.88 #define DEFAULT_bedKi 25.32 #define DEFAULT_bedKd 1153.89 - - // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED // @section extruder @@ -272,16 +296,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -329,10 +352,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -342,11 +407,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false -#define DISABLE_Z true +#define DISABLE_Z false // not for K8200 -> looses Steps +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -357,7 +424,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. #define INVERT_X_DIR false -#define INVERT_Y_DIR false +#define INVERT_Y_DIR false // was true -> why for K8200? #define INVERT_Z_DIR false // @section extruder @@ -369,6 +436,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR true // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -404,24 +473,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -432,7 +503,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -444,7 +515,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -458,7 +529,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -466,25 +537,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -492,16 +575,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -515,37 +611,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -579,7 +644,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration in mm/s^2 for printing moves -#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration in mm/s^2 for retracts +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration in mm/s^2 for retracts #define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves // The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) @@ -619,6 +684,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -639,26 +712,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // K8200: for Display VM8201 // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) -//#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) +#define SDSUPPORT // Enable SD Card Support in Hardware Console + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu #define ULTIMAKERCONTROLLER // K8200: for Display VM8201 // as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -675,13 +748,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -696,7 +769,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -719,6 +792,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -732,7 +807,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -744,7 +819,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -826,19 +901,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/K8200/Configuration_adv.h b/Marlin/example_configurations/K8200/Configuration_adv.h index c0e058d5e70d237c904bc9d9a133c81c9f815352..42f9cd60bd13905472680e418cb2191e49ea72f4 100644 --- a/Marlin/example_configurations/K8200/Configuration_adv.h +++ b/Marlin/example_configurations/K8200/Configuration_adv.h @@ -1,3 +1,8 @@ +// Sample configuration file for Vellemann K8200 +// tested on K8200 with VM8201 (Display) +// and Arduino 1.6.8 (Mac) by @CONSULitAS, 2016-02-21 +// https://github.com/CONSULitAS/Marlin-K8200/archive/K8200_stable_2016-02-21.zip + #ifndef CONFIGURATION_ADV_H #define CONFIGURATION_ADV_H @@ -17,35 +22,47 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 8 // Degrees Celsius /** * Whenever an M104 or M109 increases the target temperature the firmware will wait for the * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ - #define WATCH_TEMP_PERIOD 16 // Seconds + #define WATCH_TEMP_PERIOD 30 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +73,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -101,12 +120,12 @@ // When first starting the main fan, run it at full speed for the // given number of milliseconds. This gets the fan spinning reliably // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) -//#define FAN_KICKSTART_TIME 100 +#define FAN_KICKSTART_TIME 500 // This defines the minimal speed for the main fan, run in PWM mode // to enable uncomment and set minimal PWM speed for reliable running (1-255) // if fan speed is [1 - (FAN_MIN_PWM-1)] it is set to FAN_MIN_PWM -#define FAN_MIN_PWM 50 // K8200: fan stops running at about 35 to 40 (of 255) +#define FAN_MIN_PWM 50 // @section extruder @@ -220,9 +239,9 @@ //homing hits the endstop, then retracts by this distance, before it tries to slowly bump again: #define X_HOME_BUMP_MM 5 #define Y_HOME_BUMP_MM 5 -#define Z_HOME_BUMP_MM 3 -#define HOMING_BUMP_DIVISOR {2, 2, 4} // Re-Bump Speed Divisor (Divides the Homing Feedrate) -//#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially. +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR {4, 4, 8} // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially. // When G28 is called, this option will make Y home before X //#define HOME_Y_BEFORE_X @@ -240,7 +259,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +301,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -311,10 +339,10 @@ #define SDCARD_RATHERRECENTFIRST //reverse file order of sd card menu display. Its sorted practically after the file system block order. // if a file is deleted, it frees a block. hence, the order is not purely chronological. To still have auto0.g accessible, there is again the option to do that. // using: - //#define MENU_ADDAUTOSTART + #define MENU_ADDAUTOSTART // Show a progress bar on HD44780 LCDs for SD printing - //#define LCD_PROGRESS_BAR + #define LCD_PROGRESS_BAR #if ENABLED(LCD_PROGRESS_BAR) // Amount of time (ms) to show the bar @@ -328,7 +356,7 @@ #endif // This allows hosts to request long names for files and folders with M33 - //#define LONG_FILENAME_HOST_SUPPORT + #define LONG_FILENAME_HOST_SUPPORT // This option allows you to abort SD printing when any endstop is triggered. // This feature must be enabled with "M540 S1" or from the LCD menu. @@ -349,17 +377,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -367,9 +394,10 @@ // Babystepping enables the user to control the axis in tiny amounts, independently from the normal printing process // it can e.g. be used to change z-positions in the print startup phase in real-time // does not respect endstops! -//#define BABYSTEPPING +#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +416,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -397,7 +424,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 2; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -415,7 +442,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st #if ENABLED(SDSUPPORT) #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller #else - #define BLOCK_BUFFER_SIZE 16 // maximize block buffer + #define BLOCK_BUFFER_SIZE 32 // maximize block buffer #endif // @section more @@ -462,12 +489,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +505,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +559,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +567,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h b/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h index 630830f706e0952cb8ba171a6c0ba63b740efab5..ad8742d683f6bf9d607d65fc97e8a0f0a812283e 100644 --- a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h +++ b/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -341,10 +337,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -354,11 +392,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -381,6 +421,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -416,24 +458,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -442,10 +486,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -457,7 +500,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -471,7 +514,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -479,25 +522,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -505,16 +560,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -528,37 +596,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -632,6 +669,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -652,13 +697,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -666,11 +711,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) #define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -687,13 +733,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -708,7 +754,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -731,6 +777,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -744,7 +792,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -756,7 +804,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -838,19 +886,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/RigidBot/Configuration.h b/Marlin/example_configurations/RigidBot/Configuration.h index 7cd0f005c913d3a5d228771c81a04465297ca1b2..f1b7c21b0e8c22bd7944749c260c8f409e67d4dc 100644 --- a/Marlin/example_configurations/RigidBot/Configuration.h +++ b/Marlin/example_configurations/RigidBot/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 // DGlass3D = 5; RigidBot = 1; 3DSv6 = 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -219,6 +216,11 @@ Here are some standard links for getting your machine calibrated: //#define DEFAULT_Ki 0.85 //#define DEFAULT_Kd 245 + // E3D w/ rigidbot cartridge + //#define DEFAULT_Kp 16.30 + //#define DEFAULT_Ki 0.95 + //#define DEFAULT_Kd 69.69 + #endif // PIDTEMP //=========================================================================== @@ -273,16 +275,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -297,6 +298,9 @@ Here are some standard links for getting your machine calibrated: // Uncomment this option to enable CoreXY kinematics //#define COREXY +// Uncomment this option to enable CoreXZ kinematics +//#define COREXZ + // Enable this option for Toshiba steppers //#define CONFIG_STEPPERS_TOSHIBA @@ -327,10 +331,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -340,11 +386,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -367,6 +415,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -402,24 +452,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -430,7 +482,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -442,7 +494,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -456,7 +508,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -464,25 +516,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -490,16 +554,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -513,37 +590,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -611,13 +657,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. //define this to enable EEPROM support -//#define EEPROM_SETTINGS +#define EEPROM_SETTINGS #if ENABLED(EEPROM_SETTINGS) // To disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -638,26 +692,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) -//#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) +#define SDSUPPORT // Enable SD Card Support in Hardware Console + // Changed behaviour! If you need SDSUPPORT uncomment it! +#define SPI_SPEED SPI_EIGHTH_SPEED // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -674,13 +728,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -695,7 +749,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino // // RigidBoard: To rewire this for a RigidBot see http://rigidtalk.com/wiki/index.php?title=LCD_Smart_Controller // @@ -711,6 +765,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + // RigidBot Panel V1.0 // http://www.inventapart.com/ #define RIGIDBOT_PANEL @@ -721,6 +779,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -734,7 +794,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -746,7 +806,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -828,19 +888,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/RigidBot/Configuration_adv.h b/Marlin/example_configurations/RigidBot/Configuration_adv.h index 0abad2e5df0bab4419804db25a29d5093ca9571d..a74b6337a59ddb1899b7846220a1d11677f6abf2 100644 --- a/Marlin/example_configurations/RigidBot/Configuration_adv.h +++ b/Marlin/example_configurations/RigidBot/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,11 +40,19 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius @@ -52,7 +74,7 @@ * The maximum buffered steps/sec of the extruder motor is called "se". * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* + * mintemp and maxtemp. Turn this off by executing M109 without F* * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode */ @@ -232,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -268,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -279,9 +310,9 @@ //=============================Additional Features=========================== //=========================================================================== -#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly -#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value -#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value +//#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +//#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +//#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value //#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ #define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again @@ -290,13 +321,12 @@ #if ENABLED(SDSUPPORT) - // If you are using a RAMPS board or cheap E-bay purchased boards that do not detect when an SD card is inserted - // You can get round this by connecting a push button or single throw switch to the pin defined as SD_DETECT_PIN - // in the pins.h file. When using a push button pulling the pin to ground this will need inverted. This setting should - // be commented out otherwise - #ifndef ELB_FULL_GRAPHIC_CONTROLLER - #define SD_DETECT_INVERTED - #endif + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED #define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers? #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. @@ -345,13 +375,13 @@ // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -362,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -380,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 1.75 - #define STEPS_MM_E 836 #endif // @section extras @@ -389,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -414,7 +444,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st //The ASCII buffer for receiving from the serial: #define MAX_CMD_SIZE 96 -#define BUFSIZE 4 +#define BUFSIZE 8 // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. @@ -462,7 +492,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -470,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -524,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -532,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/SCARA/Configuration.h b/Marlin/example_configurations/SCARA/Configuration.h index 50bec622411667b3ef7efb1b70ebc12a7e5d82da..4db032a93dffa43f43964591dbadcc88286a6c37 100644 --- a/Marlin/example_configurations/SCARA/Configuration.h +++ b/Marlin/example_configurations/SCARA/Configuration.h @@ -95,7 +95,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -135,6 +135,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -154,6 +155,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -169,7 +171,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -203,14 +205,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -#define EXTRUDER_WATTS (2*2/5.9) // P=I^2/R -#define BED_WATTS (5.45*5.45/2.2) // P=I^2/R +#define EXTRUDER_WATTS (2*2/5.9) // P=U^2/R +#define BED_WATTS (5.45*5.45/2.2) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -292,16 +289,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -331,9 +327,9 @@ Here are some standard links for getting your machine calibrated: // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined //#define ENDSTOPPULLUP_XMAX //#define ENDSTOPPULLUP_YMAX - #define ENDSTOPPULLUP_ZMAX // open pin, inverted - #define ENDSTOPPULLUP_XMIN // open pin, inverted - #define ENDSTOPPULLUP_YMIN // open pin, inverted + #define ENDSTOPPULLUP_ZMAX // open pin, inverted + #define ENDSTOPPULLUP_XMIN // open pin, inverted + #define ENDSTOPPULLUP_YMIN // open pin, inverted //#define ENDSTOPPULLUP_ZMIN //#define ENDSTOPPULLUP_ZMIN_PROBE #endif @@ -349,10 +345,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -362,11 +400,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -389,6 +429,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -424,24 +466,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -452,7 +496,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -464,7 +508,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -478,7 +522,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -486,25 +530,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - //#define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -512,21 +568,34 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - //#define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. - // When defined, it will: - // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. - // - If stepper drivers timeout, it will need X and Y homing again before Z homing. - // - Position the Z probe in a defined XY point before Z Homing when homing all axis (G28). - // - Block Z homing only when the Z probe is outside bed area. + //#define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. + // When defined, it will: + // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. + // - If stepper drivers timeout, it will need X and Y homing again before Z homing. + // - Position the Z probe in a defined XY point before Z Homing when homing all axis (G28). + // - Block Z homing only when the Z probe is outside bed area. #if ENABLED(Z_SAFE_HOMING) @@ -535,37 +604,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -639,6 +677,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -659,13 +705,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -673,12 +719,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -695,13 +741,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -716,7 +762,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -739,6 +785,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -752,7 +800,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -764,7 +812,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -846,19 +894,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/example_configurations/SCARA/Configuration_adv.h index eb64a0d6b311f4df360dd39fb06b6a16883200be..2803db72b7b42e74de432cd4a057ee315b0072e6 100644 --- a/Marlin/example_configurations/SCARA/Configuration_adv.h +++ b/Marlin/example_configurations/SCARA/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 240 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -349,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -370,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 1.75 - #define STEPS_MM_E 1000 #endif // @section extras @@ -397,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -462,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/TAZ4/Configuration.h b/Marlin/example_configurations/TAZ4/Configuration.h index 1c42c65795dcd0c979ac90d39be1de046e7e6152..6f72ca668b477da440644bcb7344475c09c41fcb 100644 --- a/Marlin/example_configurations/TAZ4/Configuration.h +++ b/Marlin/example_configurations/TAZ4/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 7 #define TEMP_SENSOR_1 7 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 250 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -207,7 +204,7 @@ Here are some standard links for getting your machine calibrated: #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term #define K1 0.95 //smoothing factor within the PID - // If you are using a preconfigured hotend then you can use one of the value sets by uncommenting it + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it // Buda 2.0 on 24V #define DEFAULT_Kp 6 #define DEFAULT_Ki .3 @@ -260,6 +257,7 @@ Here are some standard links for getting your machine calibrated: //#define PID_BED_DEBUG // Sends debug data to the serial port. #if ENABLED(PIDTEMPBED) + #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term //24V 360W silicone heater from NPH on 3mm borosilicate (TAZ 2.2+) @@ -273,13 +271,13 @@ Here are some standard links for getting your machine calibrated: //#define DEFAULT_bedKi 60 //#define DEFAULT_bedKd 1800 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 //#define DEFAULT_bedKi .023 //#define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -304,16 +302,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -361,10 +358,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -374,11 +413,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -401,6 +442,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR true // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -436,24 +479,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -462,10 +507,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel -//#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line). -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z probe repeatability test will be included if auto bed leveling is enabled. +//#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) +//#define DEBUG_LEVELING_FEATURE +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. -#if ENABLED(ENABLE_AUTO_BED_LEVELING) +#if ENABLED(AUTO_BED_LEVELING_FEATURE) // There are 2 different ways to specify probing locations: // @@ -475,7 +521,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -497,25 +543,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -523,16 +581,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -546,38 +617,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - -#endif // ENABLE_AUTO_BED_LEVELING +#endif // AUTO_BED_LEVELING_FEATURE // @section homing @@ -628,7 +668,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Custom M code points #define CUSTOM_M_CODES #if ENABLED(CUSTOM_M_CODES) - #if ENABLED(ENABLE_AUTO_BED_LEVELING) + #if ENABLED(AUTO_BED_LEVELING_FEATURE) #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define Z_PROBE_OFFSET_RANGE_MIN -20 #define Z_PROBE_OFFSET_RANGE_MAX 20 @@ -650,6 +690,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -670,13 +718,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -684,12 +732,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication #define ENCODER_PULSES_PER_STEP 2 // Increase if you have a high resolution encoder #define ENCODER_STEPS_PER_MENU_ITEM 1 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -706,13 +754,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -727,7 +775,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -750,6 +798,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -763,7 +813,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -775,7 +825,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino #define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -857,19 +907,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/TAZ4/Configuration_adv.h b/Marlin/example_configurations/TAZ4/Configuration_adv.h index b4e4539fe7ef5e8288d1f1bcde9a9f592057a7b0..0084786b3394029878340d1ecbfd99ae0513fb53 100644 --- a/Marlin/example_configurations/TAZ4/Configuration_adv.h +++ b/Marlin/example_configurations/TAZ4/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,11 +40,19 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius @@ -52,7 +74,7 @@ * The maximum buffered steps/sec of the extruder motor is called "se". * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* + * mintemp and maxtemp. Turn this off by executing M109 without F* * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode */ @@ -240,7 +262,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +304,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {175,175,240,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -352,13 +383,13 @@ // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -369,7 +400,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions - //not implemented for CoreXY and deltabots! + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +419,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -397,7 +427,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -470,7 +500,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -478,52 +508,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -532,7 +562,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -540,63 +570,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/WITBOX/Configuration.h b/Marlin/example_configurations/WITBOX/Configuration.h index f0666e74d2e163fa219f68ca11fedcf0e5450759..187aeeff54b4b8551306aee45472f2aab8410c64 100644 --- a/Marlin/example_configurations/WITBOX/Configuration.h +++ b/Marlin/example_configurations/WITBOX/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -113,6 +113,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -132,6 +133,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -147,7 +149,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -181,14 +183,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 260 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -245,13 +242,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -276,16 +273,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -333,10 +329,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -346,11 +384,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z true +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -373,6 +413,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -408,24 +450,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -436,7 +480,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -448,7 +492,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -462,7 +506,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -470,25 +514,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -496,16 +552,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -519,37 +588,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -623,6 +661,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -643,13 +689,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -657,11 +703,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -678,13 +725,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -699,7 +746,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -722,6 +769,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -735,7 +784,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -747,7 +796,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -829,19 +878,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/WITBOX/Configuration_adv.h b/Marlin/example_configurations/WITBOX/Configuration_adv.h index 3a006b58cf37f1137ecbc97fd426b35a5b4baf9b..3c46c95519367dc0b72344f74606e2620eb5790b 100644 --- a/Marlin/example_configurations/WITBOX/Configuration_adv.h +++ b/Marlin/example_configurations/WITBOX/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -349,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -370,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 1.75 - #define STEPS_MM_E 100.47095761381482 #endif // @section extras @@ -397,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -446,11 +468,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt #define RETRACT_LENGTH 3 //default retract length (positive mm) #define RETRACT_LENGTH_SWAP 13 //default swap retract length (positive mm), for extruder change - #define RETRACT_FEEDRATE 80*60 //default feedrate for retracting (mm/s) + #define RETRACT_FEEDRATE 80 //default feedrate for retracting (mm/s) #define RETRACT_ZLIFT 0 //default retract Z-lift #define RETRACT_RECOVER_LENGTH 0 //default additional recover length (mm, added to retract length when recovering) //#define RETRACT_RECOVER_LENGTH_SWAP 0 //default additional swap recover length (mm, added to retract length when recovering from extruder change) - #define RETRACT_RECOVER_FEEDRATE 8*60 //default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE 8 //default feedrate for recovering from retraction (mm/s) #endif // Add support for experimental filament exchange support M600; requires display @@ -462,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/adafruit/ST7565/Configuration.h b/Marlin/example_configurations/adafruit/ST7565/Configuration.h index e3cf3a3385a44afe863a7f5e8b1fbdd03c9b6d5f..25395a3360b037dbdb86dfbd5bb343588392a1f9 100644 --- a/Marlin/example_configurations/adafruit/ST7565/Configuration.h +++ b/Marlin/example_configurations/adafruit/ST7565/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -341,10 +337,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -354,11 +392,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -381,6 +421,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -416,24 +458,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -442,10 +486,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -457,7 +500,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -471,7 +514,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -479,25 +522,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -505,16 +560,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -528,37 +596,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -632,6 +669,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -652,13 +697,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -666,11 +711,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -687,13 +733,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino #define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -708,7 +754,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -731,6 +777,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -744,7 +792,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -756,7 +804,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -838,19 +886,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/delta/biv2.5/Configuration.h b/Marlin/example_configurations/delta/biv2.5/Configuration.h index 60f07b81c13c7a0076c88a652be880dc9239685b..f026dafbc9ad882ede83251160e9b0932136eef6 100644 --- a/Marlin/example_configurations/delta/biv2.5/Configuration.h +++ b/Marlin/example_configurations/delta/biv2.5/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 5 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -376,10 +372,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define DISABLE_MAX_ENDSTOPS #define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing. -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -389,11 +427,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -416,6 +456,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -451,24 +493,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -479,7 +523,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -491,7 +535,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -507,35 +551,47 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define FRONT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS #define BACK_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Non-linear bed leveling will be used. // Compensate by interpolating between the nearest four Z probe values for each point. // Useful for deltas where the print surface may appear like a bowl or dome shape. - // Works best with ACCURATE_BED_LEVELING_POINTS 5 or higher. + // Works best with AUTO_BED_LEVELING_GRID_POINTS 5 or higher. #define AUTO_BED_LEVELING_GRID_POINTS 9 #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 4000 // X and Y axis travel speed between probes, in mm/min. @@ -543,10 +599,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 50 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. // Allen key retractable Z probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe @@ -630,10 +698,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE HOMING_FEEDRATE_XYZ #endif -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -647,37 +716,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -710,7 +748,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // delta speeds must be the same on xyz #define DEFAULT_AXIS_STEPS_PER_UNIT {72.9, 72.9, 72.9, 291} // default steps per unit for BI v2.5 (cable drive) #define DEFAULT_MAX_FEEDRATE {500, 500, 500, 150} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts @@ -753,6 +791,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -773,13 +819,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -787,12 +833,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -809,13 +855,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -830,7 +876,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -843,6 +889,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + // Delta calibration menu // uncomment to add three points calibration menu option. // See http://minow.blogspot.com/index.html#4918805519571907051 @@ -856,6 +906,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -869,7 +921,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -881,7 +933,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -963,19 +1015,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h index 26ed97b22a170daaa4a4dcabd679c02dae8c50c8..c6e8844615e74dd9a40d5a318bc98c9f93e8c8ce 100644 --- a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h +++ b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 120 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 4 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 0 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -278,6 +298,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -354,13 +377,13 @@ // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -371,6 +394,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -389,7 +413,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -398,7 +421,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -447,11 +470,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt #define RETRACT_LENGTH 5 //default retract length (positive mm) #define RETRACT_LENGTH_SWAP 13 //default swap retract length (positive mm), for extruder change - #define RETRACT_FEEDRATE 100 //default feedrate for retracting (mm/s) + #define RETRACT_FEEDRATE 100 //default feedrate for retracting (mm/s) #define RETRACT_ZLIFT 0 //default retract Z-lift #define RETRACT_RECOVER_LENGTH 0 //default additional recover length (mm, added to retract length when recovering) #define RETRACT_RECOVER_LENGTH_SWAP 0 //default additional swap recover length (mm, added to retract length when recovering from extruder change) - #define RETRACT_RECOVER_FEEDRATE 100 //default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE 100 //default feedrate for recovering from retraction (mm/s) #endif // Add support for experimental filament exchange support M600; requires display @@ -463,12 +486,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -476,52 +502,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -530,7 +556,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -538,63 +564,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/delta/generic/Configuration.h b/Marlin/example_configurations/delta/generic/Configuration.h index 6776940b289e1e6b6a5b5e160aa5668f73530d2d..6aa9be56bdcc8a1aec2247e5721c668cba93cb88 100644 --- a/Marlin/example_configurations/delta/generic/Configuration.h +++ b/Marlin/example_configurations/delta/generic/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 -1 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -376,10 +372,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define DISABLE_MAX_ENDSTOPS #define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing. -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -389,11 +427,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -416,6 +456,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -451,24 +493,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -477,14 +521,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) - // There are 2 different ways to specify probing locations. + // There are 2 different ways to specify probing locations: // // - "grid" mode // Probe several points in a rectangular grid. @@ -492,7 +535,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -508,35 +551,47 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define FRONT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS #define BACK_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Non-linear bed leveling will be used. // Compensate by interpolating between the nearest four Z probe values for each point. // Useful for deltas where the print surface may appear like a bowl or dome shape. - // Works best with ACCURATE_BED_LEVELING_POINTS 5 or higher. + // Works best with AUTO_BED_LEVELING_GRID_POINTS 5 or higher. #define AUTO_BED_LEVELING_GRID_POINTS 9 #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 4000 // X and Y axis travel speed between probes, in mm/min. @@ -544,13 +599,25 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points #define Z_RAISE_AFTER_PROBING 50 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. - // Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + // Allen key retractable Z probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe // Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. //#define Z_PROBE_ALLEN_KEY @@ -631,10 +698,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE HOMING_FEEDRATE_XYZ #endif -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -648,37 +716,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -711,7 +748,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // delta speeds must be the same on xyz #define DEFAULT_AXIS_STEPS_PER_UNIT {80, 80, 80, 760*1.1} // default steps per unit for Kossel (GT2, 20 tooth) #define DEFAULT_MAX_FEEDRATE {500, 500, 500, 25} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts @@ -754,6 +791,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -774,13 +819,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -788,12 +833,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -810,13 +855,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -831,7 +876,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -844,6 +889,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + // Delta calibration menu // uncomment to add three points calibration menu option. // See http://minow.blogspot.com/index.html#4918805519571907051 @@ -851,16 +900,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // in ultralcd.cpp@lcd_delta_calibrate_menu() //#define DELTA_CALIBRATION_MENU -// The MakerLab Mini Panel with graphic controller and SD support -// http://reprap.org/wiki/Mini_panel -//#define MINIPANEL - /** * I2C Panels */ //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -874,7 +921,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -886,7 +933,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -968,19 +1015,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/delta/generic/Configuration_adv.h b/Marlin/example_configurations/delta/generic/Configuration_adv.h index dc77577480c16fa78a37220f34479703c9ba2cde..6e299e2f9168eef9a553558e44418c9742228382 100644 --- a/Marlin/example_configurations/delta/generic/Configuration_adv.h +++ b/Marlin/example_configurations/delta/generic/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -278,6 +298,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -351,17 +374,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -372,6 +394,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -390,7 +413,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -399,7 +421,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -464,12 +486,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -477,52 +502,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -531,7 +556,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -539,63 +564,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration.h b/Marlin/example_configurations/delta/kossel_mini/Configuration.h index ec96b75782d789221b270898dbbc21dbd1dfa162..a102ce973abb41b082fb97a504c9d09ed0d038a3 100644 --- a/Marlin/example_configurations/delta/kossel_mini/Configuration.h +++ b/Marlin/example_configurations/delta/kossel_mini/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_13_EFB + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Optional custom name for your RepStrap or other custom machine @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 7 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -253,13 +250,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -284,16 +281,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -376,10 +372,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing. -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -389,11 +427,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -416,6 +456,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 15// (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -451,24 +493,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -477,10 +521,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -492,7 +535,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -508,35 +551,47 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS #define BACK_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Non-linear bed leveling will be used. // Compensate by interpolating between the nearest four Z probe values for each point. // Useful for deltas where the print surface may appear like a bowl or dome shape. - // Works best with ACCURATE_BED_LEVELING_POINTS 5 or higher. + // Works best with AUTO_BED_LEVELING_GRID_POINTS 5 or higher. #define AUTO_BED_LEVELING_GRID_POINTS 9 #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 15 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 4000 // X and Y axis travel speed between probes, in mm/min. @@ -544,13 +599,25 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points #define Z_RAISE_AFTER_PROBING 50 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. - // Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + // Allen key retractable Z probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe // Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. #define Z_PROBE_ALLEN_KEY @@ -635,10 +702,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE HOMING_FEEDRATE_XYZ #endif -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -652,37 +720,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -715,7 +752,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // delta speeds must be the same on xyz #define DEFAULT_AXIS_STEPS_PER_UNIT {80, 80, 80, 760*1.1} // default steps per unit for Kossel (GT2, 20 tooth) #define DEFAULT_MAX_FEEDRATE {500, 500, 500, 25} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts @@ -758,6 +795,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -778,13 +823,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -792,12 +837,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -814,13 +859,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -835,7 +880,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -848,6 +893,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + // Delta calibration menu // uncomment to add three points calibration menu option. // See http://minow.blogspot.com/index.html#4918805519571907051 @@ -861,6 +910,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -874,7 +925,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -886,7 +937,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -968,19 +1019,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h index 95724e9e5d751b721dc714f253ac9673d9eb9ea3..333451c2be377b68a753d85870f2932a9b7b61f9 100644 --- a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -277,6 +297,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -350,17 +373,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -371,6 +393,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -389,7 +412,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -398,7 +420,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -463,12 +485,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -476,52 +501,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -530,7 +555,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -538,63 +563,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration.h b/Marlin/example_configurations/delta/kossel_pro/Configuration.h index 377b444d2863f50c6d4d6e8c1df08e4f69c5bc39..a84c5658cb1f82293dcdbc89d89a63856c1bf5c2 100644 --- a/Marlin/example_configurations/delta/kossel_pro/Configuration.h +++ b/Marlin/example_configurations/delta/kossel_pro/Configuration.h @@ -66,7 +66,7 @@ Here are some standard links for getting your machine calibrated: // This determines the communication speed of the printer // :[2400,9600,19200,38400,57600,115200,250000] -#define BAUDRATE 250000 +#define BAUDRATE 115200 // Enable the Bluetooth serial interface on AT90USB devices //#define BLUETOOTH @@ -114,6 +114,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -133,6 +134,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -148,7 +150,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -182,14 +184,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -271,16 +268,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -363,10 +359,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing. -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -376,11 +414,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -403,6 +443,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -438,24 +480,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -464,10 +508,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section bedlevel - -//#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) +#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -479,7 +522,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -495,51 +538,75 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS #define BACK_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Non-linear bed leveling will be used. // Compensate by interpolating between the nearest four Z probe values for each point. // Useful for deltas where the print surface may appear like a bowl or dome shape. - // Works best with ACCURATE_BED_LEVELING_POINTS 5 or higher. + // Works best with AUTO_BED_LEVELING_GRID_POINTS 5 or higher. #define AUTO_BED_LEVELING_GRID_POINTS 7 #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) #define X_PROBE_OFFSET_FROM_EXTRUDER -23 // KosselPro actual: -22.919 #define Y_PROBE_OFFSET_FROM_EXTRUDER -6 // KosselPro actual: -6.304 // Kossel Pro note: The correct value is likely -17.45 but I'd rather err on the side of // not giving someone a head crash. Use something like G29 Z-0.2 to adjust as needed. #define Z_PROBE_OFFSET_FROM_EXTRUDER -17.25 // Increase this if the first layer is too thin (remember: it's a negative number so increase means closer to zero). - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. - #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. #define Z_RAISE_BEFORE_PROBING 100 // How much the Z axis will be raised before traveling to the first probing point. #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. - // Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + // Allen key retractable Z probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe // Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. #define Z_PROBE_ALLEN_KEY @@ -599,20 +666,20 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE HOMING_FEEDRATE_XYZ #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X -110.00 // Move outward to position deploy pin to the left of the arm #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y -125.00 - #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z Z_PROBE_ALLEN_KEY_DEPLOY_1_Z #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE HOMING_FEEDRATE_XYZ #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X 45.00 // Move right to trigger deploy pin #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y -125.00 - #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE (HOMING_FEEDRATE_XYZ/2) #define Z_PROBE_ALLEN_KEY_STOW_1_X 36.00 // Line up with bed retaining clip - #define Z_PROBE_ALLEN_KEY_STOW_1_Y -122.00 + #define Z_PROBE_ALLEN_KEY_STOW_1_Y -125.00 #define Z_PROBE_ALLEN_KEY_STOW_1_Z 75.0 #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE HOMING_FEEDRATE_XYZ - #define Z_PROBE_ALLEN_KEY_STOW_2_X 36.00 // move down to retract probe - #define Z_PROBE_ALLEN_KEY_STOW_2_Y -122.00 - #define Z_PROBE_ALLEN_KEY_STOW_2_Z 25.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X // move down to retract probe + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z 0.0 #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (HOMING_FEEDRATE_XYZ/2) #define Z_PROBE_ALLEN_KEY_STOW_3_X 0.0 // return to 0,0,100 #define Z_PROBE_ALLEN_KEY_STOW_3_Y 0.0 @@ -620,10 +687,11 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE HOMING_FEEDRATE_XYZ #endif -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -637,37 +705,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -700,13 +737,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define XYZ_MICROSTEPS 32 #define XYZ_BELT_PITCH 2 #define XYZ_PULLEY_TEETH 20 -#define XYZ_STEPS (XYZ_FULL_STEPS_PER_ROTATION * XYZ_MICROSTEPS / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define XYZ_STEPS ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) // default settings // delta speeds must be the same on xyz #define DEFAULT_AXIS_STEPS_PER_UNIT {XYZ_STEPS, XYZ_STEPS, XYZ_STEPS, 184.8} #define DEFAULT_MAX_FEEDRATE {200, 200, 200, 200} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,9000} // X, Y, Z, E maximum start speed for accelerated moves. +#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,9000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts @@ -749,6 +786,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -769,13 +814,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -783,11 +828,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -804,13 +850,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -825,7 +871,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -838,6 +884,10 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + // Delta calibration menu // uncomment to add three points calibration menu option. // See http://minow.blogspot.com/index.html#4918805519571907051 @@ -851,6 +901,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -864,7 +916,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -876,7 +928,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -958,19 +1010,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h index f500e42482652a0b574b0b91d9b0712b451f54a9..acacfe262120e9bf7140ee81f1460fb48e3c82d3 100644 --- a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h @@ -21,6 +21,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -30,26 +44,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -60,14 +72,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -244,7 +258,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -281,6 +301,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -354,17 +377,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -375,6 +397,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -393,7 +416,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -402,7 +424,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -467,12 +489,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -480,52 +505,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -534,7 +559,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -542,63 +567,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration.h b/Marlin/example_configurations/delta/kossel_xl/Configuration.h new file mode 100644 index 0000000000000000000000000000000000000000..abd19f54fa66b208b38f1cad9fb203c2fc6a1b9a --- /dev/null +++ b/Marlin/example_configurations/delta/kossel_xl/Configuration.h @@ -0,0 +1,944 @@ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H + +#include "boards.h" +#include "macros.h" + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== +/* +Here are some standard links for getting your machine calibrated: + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 +*/ + +// This configuration file contains the basic settings. +// Advanced settings can be found in Configuration_adv.h +// BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer replace the configuration files with the files in the +// example_configurations/delta directory. +// + +#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 DELTA_SEGMENTS_PER_SECOND 160 + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 317.3 + 2.5 // mm + + // Horizontal offset from middle of printer to smooth rod center. + #define DELTA_SMOOTH_ROD_OFFSET 220.1 // mm + + // Horizontal offset of the universal joints on the end effector. + #define DELTA_EFFECTOR_OFFSET 24.0 // mm + + // Horizontal offset of the universal joints on the carriages. + #define DELTA_CARRIAGE_OFFSET 22.0 // mm + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET + 1) + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 140.0 + +#endif + +// @section info + +#if ENABLED(USE_AUTOMATIC_VERSIONING) + #include "_Version.h" +#else + #include "Default_Version.h" +#endif + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(oxivanisher)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 STRING_DISTRIBUTION_DATE // will be shown during bootup in line 2 + +// @section machine + +// SERIAL_PORT selects which serial port should be used for communication with the host. +// This allows the connection of wireless adapters (for instance) to non-default port pins. +// Serial port 0 is still used by the Arduino bootloader regardless of this setting. +// :[0,1,2,3,4,5,6,7] +#define SERIAL_PORT 0 + +// This determines the communication speed of the printer +// :[2400,9600,19200,38400,57600,115200,250000] +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Kossel k800XL" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// This defines the number of extruders +// :[1,2,3,4] +#define EXTRUDERS 1 + +// 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 EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +//#define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +//// The following define selects which power supply you have. Please choose the one that matches your setup +// 1 = ATX +// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) +// :{1:'ATX',2:'X-Box 360'} + +#define POWER_SUPPLY 2 + +// Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it. +#define PS_DEFAULT_OFF + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// +//--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table +// +//// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) +// -2 is thermocouple with MAX6675 (only for sensor 0) +// -1 is thermocouple with AD595 +// 0 is not used +// 1 is 100k thermistor - best choice for EPCOS 100k (4.7k pullup) +// 2 is 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) +// 3 is Mendel-parts thermistor (4.7k pullup) +// 4 is 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! +// 5 is 100K thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (4.7k pullup) +// 6 is 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) +// 7 is 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) +// 71 is 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) +// 8 is 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) +// 9 is 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) +// 10 is 100k RS thermistor 198-961 (4.7k pullup) +// 11 is 100k beta 3950 1% thermistor (4.7k pullup) +// 12 is 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) +// 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" +// 20 is the PT100 circuit found in the Ultimainboard V2.x +// 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 +// +// 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k +// (but gives greater accuracy and more stable PID) +// 51 is 100k thermistor - EPCOS (1k pullup) +// 52 is 200k thermistor - ATC Semitec 204GT-2 (1k pullup) +// 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) +// +// 1047 is Pt1000 with 4k7 pullup +// 1010 is Pt1000 with 1k pullup (non standard) +// 147 is Pt100 with 4k7 pullup +// 110 is Pt100 with 1k pullup (non standard) +// 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below. +// Use it for Testing or Development purposes. NEVER for production machine. +//#define DUMMY_THERMISTOR_998_VALUE 25 +//#define DUMMY_THERMISTOR_999_VALUE 100 +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_BED 5 + +// This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Actual temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should 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 BED_MAXTEMP 150 + +// If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#if ENABLED(PIDTEMP) + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // 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_PARAMS_PER_EXTRUDER // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term + #define K1 0.95 //smoothing factor within the PID + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // oXis Kossel k800 XL + #define DEFAULT_Kp 22.04 + #define DEFAULT_Ki 1.65 + #define DEFAULT_Kd 73.67 + + // Kossel k800 XL + //#define DEFAULT_Kp 22.25 + //#define DEFAULT_Ki 1.45 + //#define DEFAULT_Kd 85.30 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== +// Select PID or bang-bang with PIDTEMPBED. If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis +// +// Uncomment this to enable PID on the bed. It uses the same frequency PWM as the extruder. +// If your PID_dT is the default, and correct for your hardware/configuration, that means 7.689Hz, +// which is fine for driving a square wave into a resistive load and does not significantly impact you 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, you probably +// shouldn't use bed PID until someone else verifies your hardware works. +// If this is enabled, find your own PID constants below. +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +// This sets the max power delivered to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option. +// all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis) +// setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did, +// so you shouldn'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 + +//#define PID_BED_DEBUG // Sends debug data to the serial port. + +#if ENABLED(PIDTEMPBED) + + #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term + + //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 15.00 + #define DEFAULT_bedKi .04 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +//this prevents dangerous Extruder moves, i.e. if the temperature is under the limit +//can be software-disabled for whatever purposes by +#define PREVENT_DANGEROUS_EXTRUDE +//if PREVENT_DANGEROUS_EXTRUDE is on, you can still disable (uncomment) very long bits of extrusion separately. +#define PREVENT_LENGTHY_EXTRUDE + +#define EXTRUDE_MINTEMP 170 +#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH) //prevent extrusion of very large distances. + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment this option to enable CoreXY kinematics +//#define COREXY + +// Uncomment this option to enable CoreXZ kinematics +//#define COREXZ + +// Enable this option for Toshiba steppers +//#define CONFIG_STEPPERS_TOSHIBA + +// @section homing + +// coarse Endstop Settings +//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors + +#if DISABLED(ENDSTOPPULLUPS) + // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Y_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +//#define DISABLE_MAX_ENDSTOPS +//#define DISABLE_MIN_ENDSTOPS + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. +//#define DISABLE_Z_MIN_PROBE_ENDSTOP + +// 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 + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false + +// @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 7 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// ENDSTOP SETTINGS: +// Sets 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 min_software_endstops false // If true, axis won't move to coordinates less than HOME_POS. +#define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. + +// @section machine + +// Travel limits after homing (units are in mm) +#define X_MIN_POS -DELTA_PRINTABLE_RADIUS +#define Y_MIN_POS -DELTA_PRINTABLE_RADIUS +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +//=========================================================================== +//========================= Filament Runout Sensor ========================== +//=========================================================================== +//#define FILAMENT_RUNOUT_SENSOR // Uncomment for defining a filament runout sensor such as a mechanical or opto endstop to check the existence of filament + // In RAMPS uses servo pin 2. Can be changed in pins file. For other boards pin definition should be made. + // It is assumed that when logic high = filament available + // when logic low = filament ran out +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + const bool FIL_RUNOUT_INVERTING = true; // Should be uncommented and true or false should assigned + #define ENDSTOPPULLUP_FIL_RUNOUT // Uncomment to use internal pullup for filament runout pins if the sensor is defined. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//============================ Mesh Bed Leveling ============================ +//=========================================================================== + +//#define MESH_BED_LEVELING // Enable mesh bed leveling. + +#if ENABLED(MESH_BED_LEVELING) + #define MESH_MIN_X 10 + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) + #define MESH_MIN_Y 10 + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) + #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. + #define MESH_NUM_Y_POINTS 3 + #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + +#endif // MESH_BED_LEVELING + +//=========================================================================== +//============================ Bed Auto Leveling ============================ +//=========================================================================== + +// @section bedlevel + +#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) +//#define DEBUG_LEVELING_FEATURE +//#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. + +#if ENABLED(AUTO_BED_LEVELING_FEATURE) + + // There are 2 different ways to specify probing locations: + // + // - "grid" mode + // Probe several points in a rectangular grid. + // You specify the rectangle and the density of sample points. + // This mode is preferred because there are more measurements. + // + // - "3-point" mode + // Probe 3 arbitrary points on the bed (that aren't collinear) + // You specify the XY coordinates of all 3 points. + + // Enable this to sample the bed in a grid (least squares solution). + // Note: this feature generates 10KB extra code size. + #define AUTO_BED_LEVELING_GRID + + #if ENABLED(AUTO_BED_LEVELING_GRID) + + #define DELTA_PROBABLE_RADIUS (DELTA_PRINTABLE_RADIUS - 10) + #define LEFT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS + #define RIGHT_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS + #define FRONT_PROBE_BED_POSITION -DELTA_PROBABLE_RADIUS + #define BACK_PROBE_BED_POSITION DELTA_PROBABLE_RADIUS + + #define MIN_PROBE_EDGE 20 // The Z probe minimum square sides can be no smaller than this. + + // Non-linear bed leveling will be used. + // Compensate by interpolating between the nearest four Z probe values for each point. + // Useful for deltas where the print surface may appear like a bowl or dome shape. + // Works best with AUTO_BED_LEVELING_GRID_POINTS 5 or higher. + #define AUTO_BED_LEVELING_GRID_POINTS 7 + + #else // !AUTO_BED_LEVELING_GRID + + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 + + #endif // AUTO_BED_LEVELING_GRID + + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). + // X and Y offsets must be integers. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER 0.0 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER 0.0 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0.3 // Z offset: -below [the nozzle] (always negative!) + + #define XY_TRAVEL_SPEED 7000 // X and Y axis travel speed between probes, in mm/min. + + #define Z_RAISE_BEFORE_PROBING 20 // How much the Z axis will be raised before traveling to the first probing point. + #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. + #define Z_RAISE_AFTER_PROBING 20 // How much the Z axis will be raised after the last probing point. + + #define Z_PROBE_END_SCRIPT "G1 Z20 X0 Y0 F7000" +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. + + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. + //#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. + + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! + + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. + // When defined, it will: + // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. + // - If stepper drivers timeout, it will need X and Y homing again before Z homing. + // - Position the Z probe in a defined XY point before Z Homing when homing all axis (G28). + // - Block Z homing only when the Z probe is outside bed area. + + #if ENABLED(Z_SAFE_HOMING) + + #define Z_SAFE_HOMING_X_POINT ((X_MIN_POS + X_MAX_POS) / 2) // X point for Z homing when homing all axis (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_MIN_POS + Y_MAX_POS) / 2) // Y point for Z homing when homing all axis (G28). + + #endif + +#endif // AUTO_BED_LEVELING_FEATURE + + +// @section homing + +// The position of the homing switches +#define MANUAL_HOME_POSITIONS // If defined, MANUAL_*_HOME_POS below will be used +#define BED_CENTER_AT_0_0 // If defined, the center of the bed is at (X=0, Y=0) + +// Manual homing switch locations: +// For deltabots this means top and center of the Cartesian print volume. +#if ENABLED(MANUAL_HOME_POSITIONS) + #define MANUAL_X_HOME_POS 0 + #define MANUAL_Y_HOME_POS 0 + #define MANUAL_Z_HOME_POS 386.5 // For delta: Distance between nozzle and print surface after homing. +#endif + +// @section movement + +/** + * MOVEMENT SETTINGS + */ + +#define HOMING_FEEDRATE {60*60, 60*60, 60*60, 0} // set the homing speeds (mm/min) + +// default settings +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 +#define XYZ_STEPS ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) + +#define DEFAULT_AXIS_STEPS_PER_UNIT {XYZ_STEPS, XYZ_STEPS, XYZ_STEPS, 158} // default steps per unit for PowerWasp +#define DEFAULT_MAX_FEEDRATE {200, 200, 200, 200} // (mm/sec) +#define DEFAULT_MAX_ACCELERATION {9000,9000,9000,9000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. + +#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration in mm/s^2 for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + +// The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) +#define DEFAULT_XYJERK 20.0 // (mm/sec) +#define DEFAULT_ZJERK 20.0 // (mm/sec) +#define DEFAULT_EJERK 20.0 // (mm/sec) + + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section more + +// Custom M code points +#define CUSTOM_M_CODES +#if ENABLED(CUSTOM_M_CODES) + #if ENABLED(AUTO_BED_LEVELING_FEATURE) + #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 + #define Z_PROBE_OFFSET_RANGE_MIN -20 + #define Z_PROBE_OFFSET_RANGE_MAX 20 + #endif +#endif + +// @section extras + +// EEPROM +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +//define this to enable EEPROM support +#define EEPROM_SETTINGS + +#if ENABLED(EEPROM_SETTINGS) + // To disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: + #define EEPROM_CHITCHAT // Please keep turned on if you can. +#endif + +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // uncomment to add the M100 Free Memory Watcher for debug purpose + +// @section temperature + +// Preheat Constants +#define PLA_PREHEAT_HOTEND_TEMP 180 +#define PLA_PREHEAT_HPB_TEMP 70 +#define PLA_PREHEAT_FAN_SPEED 100 // Insert Value between 0 and 255 + +#define ABS_PREHEAT_HOTEND_TEMP 240 +#define ABS_PREHEAT_HPB_TEMP 110 +#define ABS_PREHEAT_FAN_SPEED 100 // Insert Value between 0 and 255 + +//==============================LCD and SD support============================= +// @section lcd + +// Define your display language below. Replace (en) with your language code and uncomment. +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test +// See also language.h +#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) + +// Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. +// To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language + #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware + //#define DISPLAY_CHARSET_HD44780_WESTERN + //#define DISPLAY_CHARSET_HD44780_CYRILLIC + +//#define ULTRA_LCD //general LCD support, also 16x2 +//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) +//#define SDSUPPORT // Enable SD Card Support in Hardware Console + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) +//#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication +//#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder +//#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu +//#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. +//#define ULTIPANEL //the UltiPanel as on Thingiverse +//#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click +//#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click + // 0 to disable buzzer feedback. Test with M300 S<frequency Hz> P<duration ms> +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +//#define PANEL_ONE + +// The MaKr3d Makr-Panel with graphic controller and SD support +// http://reprap.org/wiki/MaKr3d_MaKrPanel +//#define MAKRPANEL + +// The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD +// http://panucatt.com +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino +//#define VIKI2 +//#define miniVIKI + +// This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino +//#define ELB_FULL_GRAPHIC_CONTROLLER +//#define SD_DETECT_INVERTED + +// The RepRapDiscount Smart Controller (white PCB) +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// The GADGETS3D G3D LCD/SD Controller (blue PCB) +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +//#define G3D_PANEL + +// The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// The RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // how much should be moved when a key is pressed, eg 10.0 means 10mm per click + +// The Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +//#define RA_CONTROL_PANEL + +// The MakerLab Mini Panel with graphic controller and SD support +// http://reprap.org/wiki/Mini_panel +//#define MINIPANEL + +/** + * I2C Panels + */ + +//#define LCD_I2C_SAINSMART_YWROBOT + +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + +// PANELOLU2 LCD with status LEDs, separate encoder and click inputs +// +// This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) +// Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. +// (v1.2.3 no longer requires you to define PANELOLU in the LiquidTWI2.h library header file) +// 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/P buttons, separate encoder inputs +//#define LCD_I2C_VIKI + +// SSD1306 OLED generic display support +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino +//#define U8GLIB_SSD1306 + +// Shift register panels +// --------------------- +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +//#define SAV_3DLCD + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// 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. +#define SOFT_PWM_SCALE 0 + +// Temperature status LEDs that display the hotend and bet temperature. +// If all hotends and bed temperature and temperature setpoint are < 54C then the BLUE led is on. +// Otherwise the RED led is on. There is 1C hysteresis. +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder. +//#define BARICUDA + +//define BlinkM/CyzRgb Support +//#define BLINKM + +/*********************************************************************\ +* R/C SERVO support +* Sponsored by TrinityLabs, Reworked by codexmas +**********************************************************************/ + +// Number of servos +// +// If you select a configuration below, this will receive a default value and does not need to be set manually +// set it manually if you have more servos than extruders and wish to manually control some +// leaving it undefined or defining as 0 will disable the servo subsystem +// If unsure, leave commented / disabled +// +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Servo Endstops +// +// This allows for servo actuated endstops, primary usage is for the Z Axis to eliminate calibration or bed height changes. +// Use M851 to set the Z probe vertical offset from the nozzle. Store that setting with M500. +// +//#define X_ENDSTOP_SERVO_NR 1 +//#define Y_ENDSTOP_SERVO_NR 2 +//#define Z_ENDSTOP_SERVO_NR 0 +//#define SERVO_ENDSTOP_ANGLES {{0,0}, {0,0}, {70,0}} // X,Y,Z Axis Extend and Retract angles + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + // Delay (in microseconds) before turning the servo off. This depends on the servo speed. + // 300ms is a good value but you can try less delay. + // If the servo can't reach the requested position, increase it. + #define SERVO_DEACTIVATION_DELAY 300 +#endif + +/**********************************************************************\ + * Support for a filament diameter sensor + * Also allows adjustment of diameter at print time (vs at slicing) + * Single extruder only at this point (extruder 0) + * + * Motherboards + * 34 - RAMPS1.4 - uses Analog input 5 on the AUX2 connector + * 81 - Printrboard - Uses Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 - Rambo - uses Analog input 3 + * Note may require analog pins to be defined for different motherboards + **********************************************************************/ +// Uncomment below to enable +//#define FILAMENT_SENSOR + +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation + +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 2.00 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.60 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif + +#include "Configuration_adv.h" +#include "thermistortables.h" + +#endif //CONFIGURATION_H diff --git a/Marlin/configurator/config/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h similarity index 86% rename from Marlin/configurator/config/Configuration_adv.h rename to Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h index ab6502aa8489a3fb2fcee1c086bc08fe8cece126..0089eb67da6e0eb0b5a634f29b8c7fdfcd08b5c3 100644 --- a/Marlin/configurator/config/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,14 +40,22 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds - #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + #define THERMAL_PROTECTION_BED_HYSTERESIS 4 // Degrees Celsius #endif #if ENABLED(PIDTEMP) @@ -52,7 +74,7 @@ * The maximum buffered steps/sec of the extruder motor is called "se". * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* + * mintemp and maxtemp. Turn this off by executing M109 without F* * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode */ @@ -137,7 +159,7 @@ #if ENABLED(Z_DUAL_STEPPER_DRIVERS) // Z_DUAL_ENDSTOPS is a feature to enable the use of 2 endstops for both Z steppers - Let's call them Z stepper and Z2 stepper. - // That way the machine is capable to align the bed during home, since both Z steppers are homed. + // That way the machine is capable to align the bed during home, since both Z steppers are homed. // There is also an implementation of M666 (software endstops adjustment) to this feature. // After Z homing, this adjustment is applied to just one of the steppers in order to align the bed. // One just need to home the Z axis and measure the distance difference between both Z axis and apply the math: Z adjust = Z - Z2. @@ -232,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -268,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -335,8 +366,8 @@ // save 3120 bytes of PROGMEM by commenting out #define USE_BIG_EDIT_FONT // we don't have a big font for Cyrillic, Kana //#define USE_BIG_EDIT_FONT - - // If you have spare 2300Byte of progmem and want to use a + + // If you have spare 2300Byte of progmem and want to use a // smaller font on the Info-screen uncomment the next line. //#define USE_SMALL_INFOFONT #endif // DOGLCD @@ -344,13 +375,13 @@ // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -361,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -379,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -388,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -460,8 +491,8 @@ const unsigned int dropsegments=5; //everything with less than this number of st #endif /******************************************************************************\ - * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * enable this section if you have TMC26X motor drivers. + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -469,61 +500,61 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps - -//#define X2_IS_TMC + + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps - -//#define Y_IS_TMC + + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps - -//#define Y2_IS_TMC + + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms - #define Y2_MICROSTEPS 16 //number of microsteps - -//#define Z_IS_TMC + #define Y2_MICROSTEPS 16 //number of microsteps + + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps - -//#define Z2_IS_TMC + + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps - -//#define E0_IS_TMC + + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps - -//#define E1_IS_TMC + + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms - #define E1_MICROSTEPS 16 //number of microsteps - -//#define E2_IS_TMC + #define E1_MICROSTEPS 16 //number of microsteps + + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms - #define E2_MICROSTEPS 16 //number of microsteps - -//#define E3_IS_TMC + #define E2_MICROSTEPS 16 //number of microsteps + + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms - #define E3_MICROSTEPS 16 //number of microsteps + #define E3_MICROSTEPS 16 //number of microsteps #endif /******************************************************************************\ - * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * enable this section if you have L6470 motor drivers. + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -531,69 +562,66 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define X2_IS_L6470 + + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Y_IS_L6470 + + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Y2_IS_L6470 - #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + + //#define Y2_IS_L6470 + #define Y2_MICROSTEPS 16 //number of microsteps + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off - #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Z_IS_L6470 + #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall + + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define Z2_IS_L6470 + + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E0_IS_L6470 + + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E1_IS_L6470 - #define E1_MICROSTEPS 16 //number of microsteps + + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E2_IS_L6470 - #define E2_MICROSTEPS 16 //number of microsteps + + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall - -//#define E3_IS_L6470 - #define E3_MICROSTEPS 16 //number of microsteps + + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall - + #endif #include "Conditionals.h" diff --git a/Marlin/example_configurations/delta/kossel_xl/README.md b/Marlin/example_configurations/delta/kossel_xl/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cfdcab81c60c44df3f0ee47851c89cf770c66739 --- /dev/null +++ b/Marlin/example_configurations/delta/kossel_xl/README.md @@ -0,0 +1,21 @@ +# Configuration for Kossel k800 XL +This example configuration ist for a Kossel XL with a printable bed diameter of 280mm and a height of 385mm. It also has the auto bed leveling probe (with a endstop switch) and the heat bed activated. + +## Configuration +You might have/want to edit at least the following settings in Configuration.h: +* <code>MANUAL_Z_HOME_POS<code> The hight of your printing space available, auto bed leveling makes this not as important as before +* <code>DELTA_PRINTABLE_RADIUS</code> The printable radius +* <code>DEFAULT_AXIS_STEPS_PER_UNIT</code> [http://zennmaster.com/makingstuff/reprap-101-calibrating-your-extruder-part-1-e-steps](The steps for the extruder to optimize the amount of filament flow) + +### Fine tuning +* Increase <code>DELTA_RADIUS</code> when the model is convex (bulge in the middle) +* Increase <code>DELTA_DIAGONAL_ROD</code> when the model is larger then expected + +### [http://reprap.org/wiki/PID_Tuning](PID Tuning) +* <code>DEFAULT_Kp</code> (PID tuning for the hotend) +* <code>DEFAULT_Ki</code> (PID tuning for the hotend) +* <code>DEFAULT_Kd</code> (PID tuning for the hotend) + +### PSU Options +* The power supply is configured to 2 (to use a relay to switch 12V on and off) +* It is configured to be off by default diff --git a/Marlin/example_configurations/makibox/Configuration.h b/Marlin/example_configurations/makibox/Configuration.h index bc74b6dc0104d30d461eb161e3a594914d1eb681..3192da969056b27e2a363b9e811612c33a15ab06 100644 --- a/Marlin/example_configurations/makibox/Configuration.h +++ b/Marlin/example_configurations/makibox/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -256,13 +253,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -287,16 +284,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -344,10 +340,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -357,11 +395,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -384,6 +424,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -419,24 +461,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -447,7 +491,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -459,7 +503,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -473,7 +517,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -481,25 +525,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -507,16 +563,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -530,37 +599,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -591,7 +629,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define DEFAULT_AXIS_STEPS_PER_UNIT {400, 400, 400, 163} // default steps per unit for ***** MakiBox A6 ***** #define DEFAULT_MAX_FEEDRATE {60, 60, 20, 45} // (mm/sec) -#define DEFAULT_MAX_ACCELERATION {2000,2000,30,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. +#define DEFAULT_MAX_ACCELERATION {2000,2000,30,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot. #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts @@ -634,6 +672,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -654,13 +700,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -668,11 +714,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define SDSUPPORT // Enable SD Card Support in Hardware Console -#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -689,13 +736,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -710,7 +757,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -733,6 +780,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -746,7 +795,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -758,7 +807,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -840,19 +889,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/example_configurations/makibox/Configuration_adv.h index c837be88d2072c4ec455d50b20b79f5d210c47ae..5fda39193c7ad85ba5a13982443dcb79b5cc3463 100644 --- a/Marlin/example_configurations/makibox/Configuration_adv.h +++ b/Marlin/example_configurations/makibox/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -298,10 +321,11 @@ #if ENABLED(SDSUPPORT) - // If you are using a RAMPS board or cheap E-bay purchased boards that do not detect when an SD card is inserted - // You can get round this by connecting a push button or single throw switch to the pin defined as SD_DETECT_PIN - // in the pins.h file. When using a push button pulling the pin to ground this will need inverted. This setting should - // be commented out otherwise + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). //#define SD_DETECT_INVERTED #define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers? @@ -348,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -369,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -387,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -396,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -461,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -474,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -528,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -536,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration.h b/Marlin/example_configurations/tvrrug/Round2/Configuration.h index 2636192d119ea7443d4d9a7e5a39bfb5da8d5414..f3366d9b8764dba2f20d4af2f3d64ad811264201 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration.h +++ b/Marlin/example_configurations/tvrrug/Round2/Configuration.h @@ -110,6 +110,7 @@ Here are some standard links for getting your machine calibrated: //--NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table // //// Temperature sensor settings: +// -3 is thermocouple with MAX31855 (only for sensor 0) // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used @@ -129,6 +130,7 @@ Here are some standard links for getting your machine calibrated: // 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 +// 70 is the 100K thermistor found in the bq Hephestos 2 // // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // (but gives greater accuracy and more stable PID) @@ -144,7 +146,7 @@ Here are some standard links for getting your machine calibrated: // Use it for Testing or Development purposes. NEVER for production machine. //#define DUMMY_THERMISTOR_998_VALUE 25 //#define DUMMY_THERMISTOR_999_VALUE 100 -// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } +// :{ '0': "Not used", '4': "10k !! do not use for a hotend. Bad resolution at high temp. !!", '1': "100k / 4.7k - EPCOS", '51': "100k / 1k - EPCOS", '6': "100k / 4.7k EPCOS - Not as accurate as Table 1", '5': "100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '7': "100k / 4.7k Honeywell 135-104LAG-J01", '71': "100k / 4.7k Honeywell 135-104LAF-J01", '8': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9': "100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10': "100k / 4.7k RS 198-961", '11': "100k / 4.7k beta 3950 1%", '12': "100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13': "100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '60': "100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '55': "100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '2': "200k / 4.7k - ATC Semitec 204GT-2", '52': "200k / 1k - ATC Semitec 204GT-2", '-3': "Thermocouple + MAX31855 (only for sensor 0)", '-2': "Thermocouple + MAX6675 (only for sensor 0)", '-1': "Thermocouple + AD595", '3': "Mendel-parts / 4.7k", '1047': "Pt1000 / 4.7k", '1010': "Pt1000 / 1k (non standard)", '20': "PT100 (Ultimainboard V2.x)", '147': "Pt100 / 4.7k", '110': "Pt100 / 1k (non-standard)", '998': "Dummy 1", '999': "Dummy 2" } #define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 @@ -178,14 +180,9 @@ Here are some standard links for getting your machine calibrated: #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 150 -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - // If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=U^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=U^2/R //=========================================================================== //============================= PID Settings ================================ @@ -243,13 +240,13 @@ Here are some standard links for getting your machine calibrated: #define PID_BED_INTEGRAL_DRIVE_MAX MAX_BED_POWER //limit for the integral term - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //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 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 - //120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 //#define DEFAULT_bedKi 1.41 @@ -274,16 +271,15 @@ Here are some standard links for getting your machine calibrated: //=========================================================================== /** - * Thermal Runaway Protection protects your printer from damage and fire if a + * Thermal Protection protects your printer from damage and fire if a * thermistor falls out or temperature sensors fail in any way. * * The issue: If a thermistor falls out or a temperature sensor fails, * Marlin can no longer sense the actual temperature. Since a disconnected * thermistor reads as a low temperature, 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, - * the firmware will halt as a safety precaution. + * 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 @@ -331,10 +327,52 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS -// If you want to enable the Z probe pin, but disable its use, uncomment the line below. -// This only affects a Z probe endstop if you have separate Z min endstop as well and have -// activated Z_MIN_PROBE_ENDSTOP below. If you are using the Z Min endstop on your Z probe, -// this has no effect. +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== + +// Enable Z_MIN_PROBE_ENDSTOP to use _both_ a Z Probe and a Z-min-endstop on the same machine. +// With this option the Z_MIN_PROBE_PIN will only be used for probing, never for homing. +// +// *** PLEASE READ ALL INSTRUCTIONS BELOW FOR SAFETY! *** +// +// To continue using the Z-min-endstop for homing, be sure to disable Z_SAFE_HOMING. +// Example: To park the head outside the bed area when homing with G28. +// +// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. +// +// For a servo-based Z probe, you must set up servo support below, including +// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES. +// +// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. +// - Use 5V for powered (usu. inductive) sensors. +// - Otherwise connect: +// - normally-closed switches to GND and D32. +// - normally-open switches to 5V and D32. +// +// Normally-closed switches are advised and are the default. +// +// The Z_MIN_PROBE_PIN sets the Arduino pin to use. (See your board's pins file.) +// Since the RAMPS Aux4->D32 pin maps directly to the Arduino D32 pin, D32 is the +// default pin for all RAMPS-based boards. Some other boards map differently. +// To set or change the pin for your board, edit the appropriate pins_XXXXX.h file. +// +// WARNING: +// Setting the wrong pin may have unexpected and potentially disastrous consequences. +// Use with caution and do your homework. +// +//#define Z_MIN_PROBE_ENDSTOP + +// Enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use the Z_MIN_PIN for your Z_MIN_PROBE. +// The Z_MIN_PIN will then be used for both Z-homing and probing. +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// To use a probe you must enable one of the two options above! + +// This option disables the use of the Z_MIN_PROBE_PIN +// To enable the Z probe pin but disable its use, uncomment the line below. This only affects a +// Z probe switch if you have a separate Z min endstop also and have activated Z_MIN_PROBE_ENDSTOP above. +// If you're using the Z MIN endstop connector for your Z probe, this has no effect. //#define DISABLE_Z_MIN_PROBE_ENDSTOP // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -344,11 +382,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_ENABLE_ON 1 #define E_ENABLE_ON 1 // For all extruders -// Disables axis when it's not being used. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder @@ -371,6 +411,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define INVERT_E3_DIR false // @section homing +//#define MIN_Z_HEIGHT_FOR_HOMING 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // ENDSTOP SETTINGS: // Sets direction of endstops when homing; 1=MAX, -1=MIN @@ -406,24 +448,26 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif //=========================================================================== -//=========================== Manual Bed Leveling =========================== +//============================ Mesh Bed Leveling ============================ //=========================================================================== -//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. //#define MESH_BED_LEVELING // Enable mesh bed leveling. -#if ENABLED(MANUAL_BED_LEVELING) - #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. -#endif // MANUAL_BED_LEVELING - #if ENABLED(MESH_BED_LEVELING) #define MESH_MIN_X 10 - #define MESH_MAX_X (X_MAX_POS - MESH_MIN_X) + #define MESH_MAX_X (X_MAX_POS - (MESH_MIN_X)) #define MESH_MIN_Y 10 - #define MESH_MAX_Y (Y_MAX_POS - MESH_MIN_Y) + #define MESH_MAX_Y (Y_MAX_POS - (MESH_MIN_Y)) #define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited. #define MESH_NUM_Y_POINTS 3 #define MESH_HOME_SEARCH_Z 4 // Z after Home, bed somewhere below but above 0.0. + + //#define MANUAL_BED_LEVELING // Add display menu option for bed leveling. + + #if ENABLED(MANUAL_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #endif // MANUAL_BED_LEVELING + #endif // MESH_BED_LEVELING //=========================================================================== @@ -432,10 +476,9 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section bedlevel - //#define AUTO_BED_LEVELING_FEATURE // Delete the comment to enable (remove // at the start of the line) //#define DEBUG_LEVELING_FEATURE -#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +#define Z_MIN_PROBE_REPEATABILITY_TEST // If not commented out, Z Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #if ENABLED(AUTO_BED_LEVELING_FEATURE) @@ -447,7 +490,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // This mode is preferred because there are more measurements. // // - "3-point" mode - // Probe 3 arbitrary points on the bed (that aren't colinear) + // Probe 3 arbitrary points on the bed (that aren't collinear) // You specify the XY coordinates of all 3 points. // Enable this to sample the bed in a grid (least squares solution). @@ -461,7 +504,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define FRONT_PROBE_BED_POSITION 20 #define BACK_PROBE_BED_POSITION 170 - #define MIN_PROBE_EDGE 10 // The Z probe square sides can be no smaller than this. + #define MIN_PROBE_EDGE 10 // The Z probe minimum square sides can be no smaller than this. // Set the number of grid points per dimension. // You probably don't need more than 3 (squared=9). @@ -469,25 +512,37 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #else // !AUTO_BED_LEVELING_GRID - // Arbitrary points to probe. - // A simple cross-product is used to estimate the plane of the bed. - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 + // Arbitrary points to probe. + // A simple cross-product is used to estimate the plane of the bed. + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 #endif // AUTO_BED_LEVELING_GRID - // Offsets to the Z probe relative to the nozzle tip. + // Z Probe to nozzle (X,Y) offset, relative to (0, 0). // X and Y offsets must be integers. - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // Z probe to nozzle X offset: -left +right - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Z probe to nozzle Y offset: -front +behind - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z probe to nozzle Z offset: -below (always!) - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z axis before homing (G28) for Z probe clearance. - // Be sure you have this distance over your Z_MAX_POS in case. + // + // In the following example the X and Y offsets are both positive: + // #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + // #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + // + // +-- BACK ---+ + // | | + // L | (+) P | R <-- probe (20,20) + // E | | I + // F | (-) N (+) | G <-- nozzle (10,10) + // T | | H + // | (-) | T + // | | + // O-- FRONT --+ + // (0,0) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left [of the nozzle] +right + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front [of the nozzle] +behind + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below [the nozzle] (always negative!) #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min. @@ -495,16 +550,29 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points. #define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point. -//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. - // Useful to retract a deployable Z probe. + //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine. + // Useful to retract a deployable Z probe. + + // Probes are sensors/switches that need to be activated before they can be used + // and deactivated after the use. + // Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, ... . You have to activate one of these for the AUTO_BED_LEVELING_FEATURE + + // A fix mounted probe, like the normal inductive probe, must be deactivated to go below Z_PROBE_OFFSET_FROM_EXTRUDER + // when the hardware endstops are active. + //#define FIX_MOUNTED_PROBE + + // A Servo Probe can be defined in the servo section below. - //#define Z_PROBE_SLED // Turn on if you have a Z probe mounted on a sled like those designed by Charles Bell. + // An Allen Key Probe is currently predefined only in the delta example configurations. + + //#define Z_PROBE_SLED // Enable if you have a Z probe mounted on a sled like those designed by Charles Bell. //#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. -// If you have enabled the bed auto leveling and are using the same Z probe for Z homing, -// it is highly recommended you let this Z_SAFE_HOMING enabled!!! + // If you've enabled AUTO_BED_LEVELING_FEATURE and are using the Z Probe for Z Homing, + // it is highly recommended you leave Z_SAFE_HOMING enabled! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with Z probe outside the bed area. + #define Z_SAFE_HOMING // Use the z-min-probe for homing to z-min - not the z-min-endstop. + // This feature is meant to avoid Z homing with Z probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers timeout, it will need X and Y homing again before Z homing. @@ -518,37 +586,6 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #endif - // Support for a dedicated Z probe endstop separate from the Z min endstop. - // If you would like to use both a Z probe and a Z min endstop together, - // uncomment #define Z_MIN_PROBE_ENDSTOP and read the instructions below. - // If you still want to use the Z min endstop for homing, disable Z_SAFE_HOMING above. - // Example: To park the head outside the bed area when homing with G28. - // - // WARNING: - // The Z min endstop will need to set properly as it would without a Z probe - // to prevent head crashes and premature stopping during a print. - // - // To use a separate Z probe endstop, you must have a Z_MIN_PROBE_PIN - // defined in the pins_XXXXX.h file for your control board. - // If you are using a servo based Z probe, you will need to enable NUM_SERVOS, - // Z_ENDSTOP_SERVO_NR and SERVO_ENDSTOP_ANGLES in the R/C SERVO support below. - // RAMPS 1.3/1.4 boards may be able to use the 5V, Ground and the D32 pin - // in the Aux 4 section of the RAMPS board. Use 5V for powered sensors, - // otherwise connect to ground and D32 for normally closed configuration - // and 5V and D32 for normally open configurations. - // Normally closed configuration is advised and assumed. - // The D32 pin in Aux 4 on RAMPS maps to the Arduino D32 pin. - // Z_MIN_PROBE_PIN is setting the pin to use on the Arduino. - // Since the D32 pin on the RAMPS maps to D32 on Arduino, this works. - // D32 is currently selected in the RAMPS 1.3/1.4 pin file. - // All other boards will need changes to the respective pins_XXXXX.h file. - // - // WARNING: - // Setting the wrong pin may have unexpected and potentially disastrous outcomes. - // Use with caution and do your homework. - // - //#define Z_MIN_PROBE_ENDSTOP - #endif // AUTO_BED_LEVELING_FEATURE @@ -626,6 +663,14 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo #define EEPROM_CHITCHAT // Please keep turned on if you can. #endif +// +// Host Keepalive +// +// By default Marlin will send a busy status message to the host +// every 2 seconds when it can't accept commands. +// +//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages. + // // M100 Free Memory Watcher // @@ -646,13 +691,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section lcd // Define your display language below. Replace (en) with your language code and uncomment. -// en, pl, fr, de, es, ru, bg, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, cn, test +// en, pl, fr, de, es, ru, bg, it, pt, pt_utf8, pt-br, pt-br_utf8, fi, an, nl, ca, eu, kana, kana_utf8, cn, cz, test // See also language.h //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Choose ONE of these 3 charsets. This has to match your hardware. Ignored for full graphic display. // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset. -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language #define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware //#define DISPLAY_CHARSET_HD44780_WESTERN //#define DISPLAY_CHARSET_HD44780_CYRILLIC @@ -660,12 +705,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define ULTRA_LCD //general LCD support, also 16x2 //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console -// Changed behaviour! If you need SDSUPPORT uncomment it! -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -//#define SDEXTRASLOW // Use even slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) + // Changed behaviour! If you need SDSUPPORT uncomment it! +//#define SPI_SPEED SPI_HALF_SPEED // (also SPI_QUARTER_SPEED, SPI_EIGHTH_SPEED) Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder //#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define REVERSE_MENU_DIRECTION // When enabled CLOCKWISE moves UP in the LCD menu //#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. //#define ULTIPANEL //the UltiPanel as on Thingiverse //#define SPEAKER // The sound device is a speaker - not a buzzer. A buzzer resonates with his own frequency. @@ -682,13 +727,13 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The Panucatt Devices Viki 2.0 and mini Viki with Graphic LCD // http://panucatt.com -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define VIKI2 //#define miniVIKI // This is a new controller currently under development. https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define ELB_FULL_GRAPHIC_CONTROLLER //#define SD_DETECT_INVERTED @@ -703,7 +748,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER // The RepRapWorld REPRAPWORLD_KEYPAD v1.1 @@ -726,6 +771,8 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_SAINSMART_YWROBOT +//#define LCM1602 // LCM1602 Adapter for 16x2 LCD + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs // // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) @@ -739,7 +786,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo //#define LCD_I2C_VIKI // SSD1306 OLED generic display support -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: https://github.com/olikraus/U8glib_Arduino //#define U8GLIB_SSD1306 // Shift register panels @@ -751,7 +798,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // @section extras -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency @@ -833,19 +880,21 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo // Uncomment below to enable //#define FILAMENT_SENSOR -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - #define DEFAULT_NOMINAL_FILAMENT_DIA 3.00 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#if ENABLED(FILAMENT_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) + #define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + + #define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm + #define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm + #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + + //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. + //#define FILAMENT_LCD_DISPLAY +#endif #include "Configuration_adv.h" #include "thermistortables.h" diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h index 5facef82edd6e62fe2b3e870da9d69913eab5d9e..cdd4a47fad4e7baabb36f22f1350ee49c51189c7 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h +++ b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h @@ -17,6 +17,20 @@ /** * Thermal Protection parameters */ + /** + * Thermal Protection protects your printer from damage and fire if a + * thermistor falls out or temperature sensors fail in any way. + * + * The issue: If a thermistor falls out or a temperature sensor fails, + * Marlin can no longer sense the actual temperature. Since a disconnected + * thermistor reads as a low temperature, 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 // Degrees Celsius @@ -26,26 +40,24 @@ * WATCH_TEMP_PERIOD to expire, and if the temperature hasn't increased by WATCH_TEMP_INCREASE * degrees, the machine is halted, requiring a hard reset. This test restarts with any M104/M109, * 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 below 2. */ #define WATCH_TEMP_PERIOD 16 // Seconds #define WATCH_TEMP_INCREASE 4 // Degrees Celsius #endif + /** + * Thermal Protection parameters for the bed + * are like the above for the hotends. + * WATCH_TEMP_BED_PERIOD and WATCH_TEMP_BED_INCREASE are not imlemented now. + */ #if ENABLED(THERMAL_PROTECTION_BED) #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius #endif -/** - * Automatic Temperature: - * The hotend target temperature is calculated by all the buffered lines of gcode. - * The maximum buffered steps/sec of the extruder motor is called "se". - * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> - * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by - * mintemp and maxtemp. Turn this off by excuting M109 without F* - * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. - * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode - */ #if ENABLED(PIDTEMP) // this adds an experimental additional term to the heating power, proportional to the extrusion speed. // if Kc is chosen well, the additional required power due to increased melting should be compensated. @@ -56,14 +68,16 @@ #endif #endif - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S<mintemp> B<maxtemp> F<factor> -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value <mintemp, it is not changed by autotemp. -// on an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor> + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ #define AUTOTEMP #if ENABLED(AUTOTEMP) #define AUTOTEMP_OLDWEIGHT 0.98 @@ -240,7 +254,13 @@ #define INVERT_E_STEP_PIN false // Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true #define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate #define DEFAULT_MINTRAVELFEEDRATE 0.0 @@ -276,6 +296,9 @@ // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards) #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +// Motor Current controlled via PWM (Overridable on supported boards with PWM-driven motor driver current) +//#define PWM_MOTOR_CURRENT {1300, 1300, 1250} // Values in milliamps + // uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro //#define DIGIPOT_I2C // Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8 @@ -349,17 +372,16 @@ //#define USE_SMALL_INFOFONT #endif // DOGLCD - // @section more // The hardware watchdog should reset the microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. -//#define USE_WATCHDOG +#define USE_WATCHDOG #if ENABLED(USE_WATCHDOG) -// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. -// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. -// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. -//#define WATCHDOG_RESET_MANUAL + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL #endif // @section lcd @@ -370,6 +392,7 @@ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + //not implemented for deltabots! #define BABYSTEP_INVERT_Z false //true for inverse movements in Z #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif @@ -388,7 +411,6 @@ #if ENABLED(ADVANCE) #define EXTRUDER_ADVANCE_K .0 #define D_FILAMENT 2.85 - #define STEPS_MM_E 836 #endif // @section extras @@ -397,7 +419,7 @@ #define MM_PER_ARC_SEGMENT 1 #define N_ARC_CORRECTION 25 -const unsigned int dropsegments=5; //everything with less than this number of steps will be ignored as move and joined with the next movement +const unsigned int dropsegments = 5; //everything with less than this number of steps will be ignored as move and joined with the next movement // @section temperature @@ -462,12 +484,15 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_ZADD 10 #define FILAMENTCHANGE_FIRSTRETRACT -2 #define FILAMENTCHANGE_FINALRETRACT -100 + #define AUTO_FILAMENT_CHANGE //This extrude filament until you press the button on LCD + #define AUTO_FILAMENT_CHANGE_LENGTH 0.04 //Extrusion length on automatic extrusion loop + #define AUTO_FILAMENT_CHANGE_FEEDRATE 300 //Extrusion feedrate (mm/min) on automatic extrusion loop #endif #endif /******************************************************************************\ * enable this section if you have TMC26X motor drivers. - * you need to import the TMC26XStepper library into the arduino IDE for this + * you need to import the TMC26XStepper library into the Arduino IDE for this ******************************************************************************/ // @section tmc @@ -475,52 +500,52 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_TMCDRIVER #if ENABLED(HAVE_TMCDRIVER) -//#define X_IS_TMC + //#define X_IS_TMC #define X_MAX_CURRENT 1000 //in mA #define X_SENSE_RESISTOR 91 //in mOhms #define X_MICROSTEPS 16 //number of microsteps -//#define X2_IS_TMC + //#define X2_IS_TMC #define X2_MAX_CURRENT 1000 //in mA #define X2_SENSE_RESISTOR 91 //in mOhms #define X2_MICROSTEPS 16 //number of microsteps -//#define Y_IS_TMC + //#define Y_IS_TMC #define Y_MAX_CURRENT 1000 //in mA #define Y_SENSE_RESISTOR 91 //in mOhms #define Y_MICROSTEPS 16 //number of microsteps -//#define Y2_IS_TMC + //#define Y2_IS_TMC #define Y2_MAX_CURRENT 1000 //in mA #define Y2_SENSE_RESISTOR 91 //in mOhms #define Y2_MICROSTEPS 16 //number of microsteps -//#define Z_IS_TMC + //#define Z_IS_TMC #define Z_MAX_CURRENT 1000 //in mA #define Z_SENSE_RESISTOR 91 //in mOhms #define Z_MICROSTEPS 16 //number of microsteps -//#define Z2_IS_TMC + //#define Z2_IS_TMC #define Z2_MAX_CURRENT 1000 //in mA #define Z2_SENSE_RESISTOR 91 //in mOhms #define Z2_MICROSTEPS 16 //number of microsteps -//#define E0_IS_TMC + //#define E0_IS_TMC #define E0_MAX_CURRENT 1000 //in mA #define E0_SENSE_RESISTOR 91 //in mOhms #define E0_MICROSTEPS 16 //number of microsteps -//#define E1_IS_TMC + //#define E1_IS_TMC #define E1_MAX_CURRENT 1000 //in mA #define E1_SENSE_RESISTOR 91 //in mOhms #define E1_MICROSTEPS 16 //number of microsteps -//#define E2_IS_TMC + //#define E2_IS_TMC #define E2_MAX_CURRENT 1000 //in mA #define E2_SENSE_RESISTOR 91 //in mOhms #define E2_MICROSTEPS 16 //number of microsteps -//#define E3_IS_TMC + //#define E3_IS_TMC #define E3_MAX_CURRENT 1000 //in mA #define E3_SENSE_RESISTOR 91 //in mOhms #define E3_MICROSTEPS 16 //number of microsteps @@ -529,7 +554,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /******************************************************************************\ * enable this section if you have L6470 motor drivers. - * you need to import the L6470 library into the arduino IDE for this + * you need to import the L6470 library into the Arduino IDE for this ******************************************************************************/ // @section l6470 @@ -537,63 +562,63 @@ const unsigned int dropsegments=5; //everything with less than this number of st //#define HAVE_L6470DRIVER #if ENABLED(HAVE_L6470DRIVER) -//#define X_IS_L6470 + //#define X_IS_L6470 #define X_MICROSTEPS 16 //number of microsteps - #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define X2_IS_L6470 + //#define X2_IS_L6470 #define X2_MICROSTEPS 16 //number of microsteps - #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define X2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define X2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define X2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y_IS_L6470 + //#define Y_IS_L6470 #define Y_MICROSTEPS 16 //number of microsteps - #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Y2_IS_L6470 + //#define Y2_IS_L6470 #define Y2_MICROSTEPS 16 //number of microsteps - #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Y2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Y2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Y2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z_IS_L6470 + //#define Z_IS_L6470 #define Z_MICROSTEPS 16 //number of microsteps - #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define Z2_IS_L6470 + //#define Z2_IS_L6470 #define Z2_MICROSTEPS 16 //number of microsteps - #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define Z2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define Z2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define Z2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E0_IS_L6470 + //#define E0_IS_L6470 #define E0_MICROSTEPS 16 //number of microsteps - #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E0_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E0_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E0_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E1_IS_L6470 + //#define E1_IS_L6470 #define E1_MICROSTEPS 16 //number of microsteps - #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E1_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E1_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E1_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E2_IS_L6470 + //#define E2_IS_L6470 #define E2_MICROSTEPS 16 //number of microsteps - #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E2_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E2_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E2_STALLCURRENT 1500 //current in mA where the driver will detect a stall -//#define E3_IS_L6470 + //#define E3_IS_L6470 #define E3_MICROSTEPS 16 //number of microsteps - #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be carefull not to go too high + #define E3_K_VAL 50 // 0 - 255, Higher values, are higher power. Be careful not to go too high #define E3_OVERCURRENT 2000 //maxc current in mA. If the current goes over this value, the driver will switch off #define E3_STALLCURRENT 1500 //current in mA where the driver will detect a stall diff --git a/Marlin/language.h b/Marlin/language.h index e5c65a8f439b6075b04a791f9c032e6dc411916d..69bc65f9fb10d55ecb264c8aee417c498b044739 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -3,37 +3,38 @@ #include "Configuration.h" -#define LANGUAGE_CONCAT(M) #M -#define GENERATE_LANGUAGE_INCLUDE(M) LANGUAGE_CONCAT(language_##M.h) +#define GENERATE_LANGUAGE_INCLUDE(M) STRINGIFY_(language_##M.h) // NOTE: IF YOU CHANGE LANGUAGE FILES OR MERGE A FILE WITH CHANGES // // ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h" // ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS -// See also documentation/LCDLanguageFont.md +// See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language // Languages -// en English -// pl Polish -// fr French -// de German -// es Spanish -// ru Russian -// bg Bulgarian -// it Italian -// pt Portuguese -// pt-br Portuguese (Brazil) -// fi Finnish -// an Aragonese -// nl Dutch -// gl Galician -// ca Catalan -// eu Basque-Euskera -// kana Japanese -// kana_utf Japanese -// cn Chinese -// cz Czech +// en English +// pl Polish +// fr French +// de German +// es Spanish +// ru Russian +// bg Bulgarian +// it Italian +// pt Portuguese +// pt_utf8 Portuguese (UTF8) +// pt-br Portuguese (Brazilian) +// pt-br_utf8 Portuguese (Brazilian UTF8) +// fi Finnish +// an Aragonese +// nl Dutch +// gl Galician +// ca Catalan +// eu Basque-Euskera +// kana Japanese +// kana_utf8 Japanese (UTF8) +// cn Chinese +// cz Czech // fallback if no language is set, don't change #ifndef LANGUAGE_INCLUDE @@ -49,47 +50,45 @@ #define PROTOCOL_VERSION "1.0" #if MB(ULTIMAKER)|| MB(ULTIMAKER_OLD)|| MB(ULTIMAIN_2) - #define MACHINE_NAME "Ultimaker" - #define SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" + #define DEFAULT_MACHINE_NAME "Ultimaker" + #define DEFAULT_SOURCE_URL "https://github.com/Ultimaker/Marlin" #elif MB(RUMBA) - #define MACHINE_NAME "Rumba" + #define DEFAULT_MACHINE_NAME "Rumba" #elif MB(3DRAG) - #define MACHINE_NAME "3Drag" - #define SOURCE_CODE_URL "http://3dprint.elettronicain.it/" + #define DEFAULT_MACHINE_NAME "3Drag" + #define DEFAULT_SOURCE_URL "http://3dprint.elettronicain.it/" #elif MB(K8200) - #define MACHINE_NAME "K8200" - #define SOURCE_CODE_URL "https://github.com/CONSULitAS/Marlin-K8200" + #define DEFAULT_MACHINE_NAME "K8200" + #define DEFAULT_SOURCE_URL "https://github.com/CONSULitAS/Marlin-K8200" #elif MB(5DPRINT) - #define MACHINE_NAME "Makibox" + #define DEFAULT_MACHINE_NAME "Makibox" #elif MB(SAV_MKI) - #define MACHINE_NAME "SAV MkI" - #define SOURCE_CODE_URL "https://github.com/fmalpartida/Marlin/tree/SAV-MkI-config" -#elif !defined(MACHINE_NAME) - #define MACHINE_NAME "3D Printer" + #define DEFAULT_MACHINE_NAME "SAV MkI" + #define DEFAULT_SOURCE_URL "https://github.com/fmalpartida/Marlin/tree/SAV-MkI-config" +#else + #define DEFAULT_MACHINE_NAME "3D Printer" + #define DEFAULT_SOURCE_URL "https://github.com/MarlinFirmware/Marlin" #endif #ifdef CUSTOM_MACHINE_NAME - #undef MACHINE_NAME #define MACHINE_NAME CUSTOM_MACHINE_NAME +#else + #define MACHINE_NAME DEFAULT_MACHINE_NAME #endif #ifndef SOURCE_CODE_URL - #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" + #define SOURCE_CODE_URL DEFAULT_SOURCE_URL #endif #ifndef DETAILED_BUILD_VERSION #error BUILD_VERSION Information must be specified #endif -#ifndef UUID - #define UUID "00000000-0000-0000-0000-000000000000" +#ifndef MACHINE_UUID + #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" #endif -#define STRINGIFY_(n) #n -#define STRINGIFY(n) STRINGIFY_(n) - - // Common LCD messages /* nothing here yet */ @@ -122,10 +121,14 @@ #define MSG_INVALID_EXTRUDER "Invalid extruder" #define MSG_INVALID_SOLENOID "Invalid solenoid" #define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" UUID "\n" +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" #define MSG_COUNT_X " Count X: " +#define MSG_COUNT_A " Count A: " #define MSG_ERR_KILLED "Printer halted. kill() called!" #define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_BUSY_PROCESSING "busy: processing" +#define MSG_BUSY_PAUSED_FOR_USER "busy: paused for user" +#define MSG_BUSY_PAUSED_FOR_INPUT "busy: paused for input" #define MSG_RESEND "Resend: " #define MSG_UNKNOWN_COMMAND "Unknown command: \"" #define MSG_ACTIVE_EXTRUDER "Active Extruder: " diff --git a/Marlin/language_an.h b/Marlin/language_an.h index 86f9bcfd479921d8e06997f842bfecf7f121f10d..7c6dbbae5788b4609972fa2cd6d644fc7707ba51 100644 --- a/Marlin/language_an.h +++ b/Marlin/language_an.h @@ -2,7 +2,7 @@ * Aragonese * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_AN_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART " Autostart" #define MSG_DISABLE_STEPPERS "Amortar motors" #define MSG_AUTO_HOME "Levar a l'orichen" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Establir zero" #define MSG_PREHEAT_PLA "Precalentar PLA" diff --git a/Marlin/language_bg.h b/Marlin/language_bg.h index e200b67fc22e6fef6b106b76be03392810e9b571..c0eff00cd578ff20e8758ef5494d2d3882ac1418 100644 --- a/Marlin/language_bg.h +++ b/Marlin/language_bg.h @@ -2,7 +2,7 @@ * Bulgarian * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_BG_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Автостарт" #define MSG_DISABLE_STEPPERS "Изкл. двигатели" #define MSG_AUTO_HOME "Паркиране" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Задай Начало" #define MSG_SET_ORIGIN "Изходна точка" #define MSG_PREHEAT_PLA "Подгряване PLA" diff --git a/Marlin/language_ca.h b/Marlin/language_ca.h index b352adfd1cdb25996dc63641a6b71160b740f1d0..eb50c9f242babb0b950ad092d0283640263e8e5d 100644 --- a/Marlin/language_ca.h +++ b/Marlin/language_ca.h @@ -2,7 +2,7 @@ * Catalan * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_CA_H @@ -21,6 +21,7 @@ #define MSG_AUTOSTART "Inici automatic" #define MSG_DISABLE_STEPPERS "Apagar motors" #define MSG_AUTO_HOME "Home global" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Establir origen" #define MSG_PREHEAT_PLA "Preescalfar PLA" diff --git a/Marlin/language_cn.h b/Marlin/language_cn.h index 16ccc1679da36b396c86f30e7b4e829adbf397e9..a2c797acb6219539c21809a1fa64c1d1dc38c8ed 100644 --- a/Marlin/language_cn.h +++ b/Marlin/language_cn.h @@ -2,13 +2,13 @@ * Chinese * * LCD Menu Messages - * Se also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_CN_H #define LANGUAGE_CN_H -#define MAPPER_NON // For direct asci codes +#define MAPPER_NON // For direct ascii codes #define DISPLAY_CHARSET_ISO10646_CN #define WELCOME_MSG "\xa4\xa5\xa6\xa7" @@ -18,6 +18,7 @@ #define MSG_AUTOSTART "\xb1\xb2\xb3\xb4" #define MSG_DISABLE_STEPPERS "\xb5\xb6\xb7\xb8\xb9\xba" #define MSG_AUTO_HOME "\xbb\xbc\xbd" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "\xbe\xbf\xbb\xbc\xbd\xc0\xc1" #define MSG_SET_ORIGIN "\xbe\xbf\xbc\xbd" #define MSG_PREHEAT_PLA "\xc3\xc4 PLA" diff --git a/Marlin/language_cz.h b/Marlin/language_cz.h index f32ff0dcfba5a56c45f58486566fdbfb3f2a2082..3762dbb075fb7178645ac711ba74a5fc6e059804 100644 --- a/Marlin/language_cz.h +++ b/Marlin/language_cz.h @@ -2,7 +2,7 @@ * Czech * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * * Translated by Petr Zahradnik, Computer Laboratory * Blog and video blog Zahradnik se bavi @@ -24,6 +24,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Uvolnit motory" #define MSG_AUTO_HOME "Domovska pozice" +#define MSG_LEVEL_BED_HOMING "Mereni podlozky" #define MSG_SET_HOME_OFFSETS "Nastavit ofsety" #define MSG_SET_ORIGIN "Nastavit pocatek" #define MSG_PREHEAT_PLA "Zahrat PLA" diff --git a/Marlin/language_da.h b/Marlin/language_da.h index c18280ad3dbf4422a4dddd94b676a90194d00320..cc04f122244f4defcde5c34257de748e6796c628 100644 --- a/Marlin/language_da.h +++ b/Marlin/language_da.h @@ -2,7 +2,7 @@ * Danish * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_DA_H @@ -21,6 +21,7 @@ #define MSG_AUTO_HOME "Home" // G28 #define MSG_COOLDOWN "Afkøl" #define MSG_DISABLE_STEPPERS "Slå stepper fra" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Sæt home offsets" #define MSG_SET_ORIGIN "Sæt origin" #define MSG_SWITCH_PS_ON "Slå strøm til" diff --git a/Marlin/language_de.h b/Marlin/language_de.h index 823188dfe0548ff347540a38c3d28bc6f121e68d..be0b15da4de7e3cff490abf811333ac96d7063cd 100644 --- a/Marlin/language_de.h +++ b/Marlin/language_de.h @@ -2,7 +2,7 @@ * German * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_DE_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Motoren Aus" // M84 #define MSG_AUTO_HOME "Home" // G28 +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Setze Home hier" #define MSG_SET_ORIGIN "Setze Null hier" //"G92 X0 Y0 Z0" commented out in ultralcd.cpp #define MSG_PREHEAT_PLA "Vorwärmen PLA" diff --git a/Marlin/language_en.h b/Marlin/language_en.h index 361cf8a2c06f54674fd11ba4714e443910caa32d..819ae996456e749c3f79e9191889d370c80f0bb8 100644 --- a/Marlin/language_en.h +++ b/Marlin/language_en.h @@ -2,14 +2,14 @@ * English * * LCD Menu Messages - * Se also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_EN_H #define LANGUAGE_EN_H #if DISABLED(MAPPER_NON) && DISABLED(MAPPER_C2C3) && DISABLED(MAPPER_D0D1) && DISABLED(MAPPER_D0D1_MOD) && DISABLED(MAPPER_E382E383) - #define MAPPER_NON // For direct asci codes + #define MAPPER_NON // For direct ascii codes #endif //#define SIMULATE_ROMFONT //Comment in to see what is seen on the character based displays @@ -39,6 +39,9 @@ #ifndef MSG_AUTO_HOME #define MSG_AUTO_HOME "Auto home" #endif +#ifndef MSG_LEVEL_BED_HOMING + #define MSG_LEVEL_BED_HOMING "Homing" +#endif #ifndef MSG_SET_HOME_OFFSETS #define MSG_SET_HOME_OFFSETS "Set home offsets" #endif diff --git a/Marlin/language_es.h b/Marlin/language_es.h index 5f0ebae1557da7715e9b3f33d37df328d88edb15..05d4a78ce49d74cb35df98ef8af61b1d008a23c6 100644 --- a/Marlin/language_es.h +++ b/Marlin/language_es.h @@ -2,7 +2,7 @@ * Spanish * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_ES_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Apagar motores" #define MSG_AUTO_HOME "Llevar al origen" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Ajustar offsets" #define MSG_SET_ORIGIN "Establecer cero" #define MSG_PREHEAT_PLA "Precalentar PLA" @@ -38,6 +39,7 @@ #define MSG_EXTRUDE "Extruir" #define MSG_RETRACT "Retraer" #define MSG_MOVE_AXIS "Mover ejes" +#define MSG_LEVEL_BED "Nivelar cama" #define MSG_MOVE_X "Mover X" #define MSG_MOVE_Y "Mover Y" #define MSG_MOVE_Z "Mover Z" diff --git a/Marlin/language_eu.h b/Marlin/language_eu.h index 6d46fc0a349a0a06cb88b9c06fa93e95bb1c89c6..c1cc44bc4bff4eff854fdf229a5be2ac016adb32 100644 --- a/Marlin/language_eu.h +++ b/Marlin/language_eu.h @@ -2,7 +2,7 @@ * Basque-Euskera * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_EU_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Auto hasiera" #define MSG_DISABLE_STEPPERS "Itzali motoreak" #define MSG_AUTO_HOME "Hasierara joan" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Hasiera ipini" #define MSG_PREHEAT_PLA "Aurreberotu PLA" diff --git a/Marlin/language_fi.h b/Marlin/language_fi.h index 77cd50b1c5fd4fce0d03565c8276e9dabb4c17f7..41f7f5d2d2832c495ea37e36a0beb86f9a65fb35 100644 --- a/Marlin/language_fi.h +++ b/Marlin/language_fi.h @@ -2,7 +2,7 @@ * Finnish * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_FI_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Automaatti" #define MSG_DISABLE_STEPPERS "Vapauta moottorit" #define MSG_AUTO_HOME "Aja referenssiin" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Aseta origo" #define MSG_PREHEAT_PLA "Esilämmitä PLA" diff --git a/Marlin/language_fr.h b/Marlin/language_fr.h index 91903559e76db222ad893c063a053b752308950d..eda1050e68ba97811e84d0534ca5f4a8ee2cdaa8 100644 --- a/Marlin/language_fr.h +++ b/Marlin/language_fr.h @@ -2,7 +2,7 @@ * French * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_FR_H @@ -21,6 +21,7 @@ #define MSG_AUTOSTART "Demarrage auto" #define MSG_DISABLE_STEPPERS "Arreter moteurs" #define MSG_AUTO_HOME "Home auto." +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Regler origine" #define MSG_PREHEAT_PLA "Prechauffage PLA" diff --git a/Marlin/language_gl.h b/Marlin/language_gl.h index 5b7830d7a2678291183b3626ed1d92908e5adad5..fc9c8c3aa1d5dcd28d3928ab7495ffc14d1a1613 100644 --- a/Marlin/language_gl.h +++ b/Marlin/language_gl.h @@ -2,7 +2,7 @@ * Galician language (ISO "gl") * * LCD Menu Messages - * Se also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_GL_H diff --git a/Marlin/language_it.h b/Marlin/language_it.h index 46276b3d280a2c09fa2ced80636dcf17f8fddcb2..21a8aebe897fa5a88e0cc3ac4f7b61e17f1f4a1e 100644 --- a/Marlin/language_it.h +++ b/Marlin/language_it.h @@ -2,7 +2,7 @@ * Italian * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_IT_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Disabilita Motori" #define MSG_AUTO_HOME "Auto Home" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Setta offset home" #define MSG_SET_ORIGIN "Imposta Origine" #define MSG_PREHEAT_PLA "Preriscalda PLA" @@ -38,6 +39,7 @@ #define MSG_EXTRUDE "Estrudi" #define MSG_RETRACT "Ritrai" #define MSG_MOVE_AXIS "Muovi Asse" +#define MSG_LEVEL_BED "Livellamento piano" #define MSG_MOVE_X "Muovi X" #define MSG_MOVE_Y "Muovi Y" #define MSG_MOVE_Z "Muovi Z" diff --git a/Marlin/language_kana.h b/Marlin/language_kana.h index 03fa8e27eb944cf0d68e5553770306aa454863d4..52fdc276bf4d150c6c764f6f235a097baa1ff64f 100644 --- a/Marlin/language_kana.h +++ b/Marlin/language_kana.h @@ -2,7 +2,7 @@ * Japanese (Kana) * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ @@ -17,11 +17,12 @@ // 片仮名表示定義 #define WELCOME_MSG MACHINE_NAME " ready." #define MSG_SD_INSERTED "\xb6\xb0\xc4\xde\x20\xbf\xb3\xc6\xad\xb3\xbb\xda\xcf\xbc\xc0" // "Card inserted" -#define MSG_SD_REMOVED "\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "Card removed" +#define MSG_SD_REMOVED "\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "Card removed" #define MSG_MAIN "\xd2\xb2\xdd" // "Main" #define MSG_AUTOSTART "\xbc\xde\xc4\xde\xb3\xb6\xb2\xbc" // "Autostart" #define MSG_DISABLE_STEPPERS "\xd3\xb0\xc0\xb0\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "Disable steppers" #define MSG_AUTO_HOME "\xb9\xde\xdd\xc3\xdd\xc6\xb2\xc4\xde\xb3" // "Auto home" +#define MSG_LEVEL_BED_HOMING "\xb9\xde\xdd\xc3\xdd\xc6\xb2\xc4\xde\xb3" // "Homing" #define MSG_SET_HOME_OFFSETS "\xb7\xbc\xde\xad\xdd\xb5\xcc\xbe\xaf\xc4\xbe\xaf\xc3\xb2" // "Set home offsets" #define MSG_SET_ORIGIN "\xb7\xbc\xde\xad\xdd\xbe\xaf\xc4" // "Set origin" #define MSG_PREHEAT_PLA "PLA \xd6\xc8\xc2" // "Preheat PLA" @@ -38,8 +39,9 @@ #define MSG_SWITCH_PS_ON "\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xdd" // "Switch power on" #define MSG_SWITCH_PS_OFF "\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "Switch power off" #define MSG_EXTRUDE "\xb5\xbc\xc0\xde\xbc" // "Extrude" -#define MSG_RETRACT "\xd8\xc4\xd7\xb8\xc4" // "Retract" +#define MSG_RETRACT "\xcb\xb7\xba\xd0\xbe\xaf\xc3\xb2" // "Retract" #define MSG_MOVE_AXIS "\xbc\xde\xb8\xb2\xc4\xde\xb3" // "Move axis" +#define MSG_LEVEL_BED "\xcd\xde\xaf\xc4\xde\xda\xcd\xde\xd8\xdd\xb8\xde" // "Level bed" #define MSG_MOVE_X "X\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move X" #define MSG_MOVE_Y "Y\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move Y" #define MSG_MOVE_Z "Z\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move Z" @@ -53,94 +55,97 @@ #define MSG_FAN_SPEED "\xcc\xa7\xdd\xbf\xb8\xc4\xde" // "Fan speed" #define MSG_FLOW "\xb5\xb8\xd8\xd8\xae\xb3" // "Flow" #define MSG_CONTROL "\xba\xdd\xc4\xdb\xb0\xd9" // "Control" -#define MSG_MIN LCD_STR_THERMOMETER " Min" -#define MSG_MAX LCD_STR_THERMOMETER " Max" -#define MSG_FACTOR LCD_STR_THERMOMETER " Fact" +#define MSG_MIN LCD_STR_THERMOMETER " \xbb\xb2\xc3\xb2" // " Min" +#define MSG_MAX LCD_STR_THERMOMETER " \xbb\xb2\xba\xb3" // " Max" +#define MSG_FACTOR LCD_STR_THERMOMETER " \xcc\xa7\xb8\xc0\xb0" // " Fact" #define MSG_AUTOTEMP "\xbc\xde\xc4\xde\xb3\xb5\xdd\xc4\xde" // "Autotemp" -#define MSG_ON "On " -#define MSG_OFF "Off" +#define MSG_ON "\xb5\xdd " // "On " +#define MSG_OFF "\xb5\xcc " // "Off" #define MSG_PID_P "PID-P" #define MSG_PID_I "PID-I" #define MSG_PID_D "PID-D" #define MSG_PID_C "PID-C" -#define MSG_ACC "\xb6\xbf\xb8\xc4\xde" // "Accel" -#define MSG_VXY_JERK "Vxy-jerk" -#define MSG_VZ_JERK "Vz-jerk" -#define MSG_VE_JERK "Ve-jerk" -#define MSG_VMAX "Vmax " -#define MSG_X "x" -#define MSG_Y "y" -#define MSG_Z "z" -#define MSG_E "e" -#define MSG_VMIN "Vmin" -#define MSG_VTRAV_MIN "VTrav min" -#define MSG_AMAX "Amax " -#define MSG_A_RETRACT "A-retract" +#define MSG_ACC "\xb6\xbf\xb8\xc4\xde mm/s^2" // "Accel" +#define MSG_VXY_JERK "XY\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Vxy-jerk" +#define MSG_VZ_JERK "Z\xbc\xde\xb8\x20\xd4\xb8\xc4\xde mm/s" // "Vz-jerk" +#define MSG_VE_JERK "\xb4\xb8\xbd\xc4\xd9\xb0\xc0\xde\xb0\x20\xd4\xb8\xc4\xde" // "Ve-jerk" +#define MSG_VMAX "\xbb\xb2\xc0\xde\xb2\xcc\xa8\xb0\xc4\xde\xda\xb0\xc4 " // "Vmax " +#define MSG_X "X" // "x" +#define MSG_Y "Y" // "y" +#define MSG_Z "Z" // "z" +#define MSG_E "E" // "e" +#define MSG_VMIN "\xbb\xb2\xbc\xae\xb3\xcc\xa8\xb0\xc4\xde\xda\xb0\xc4" // "Vmin" +#define MSG_VTRAV_MIN "\xbb\xb2\xbc\xae\xb3\xc4\xd7\xcd\xde\xd9\xda\xb0\xc4" // "VTrav min" +#define MSG_AMAX "\xbb\xb2\xc0\xde\xb2\xb6\xbf\xb8\xc4\xde " // "Amax " +#define MSG_A_RETRACT "\xcb\xb7\xba\xd0\xb6\xbf\xb8\xc4\xde" // "A-retract" +#define MSG_A_TRAVEL "\xc4\xd7\xcd\xde\xd9\xb6\xbf\xb8\xc4\xde" // "A-travel" #define MSG_XSTEPS "Xsteps/mm" #define MSG_YSTEPS "Ysteps/mm" #define MSG_ZSTEPS "Zsteps/mm" #define MSG_ESTEPS "Esteps/mm" -#define MSG_TEMPERATURE "\xb5\xdd\xc4\xde" // "Temperature" -#define MSG_MOTION "\xb3\xba\xde\xb7\xbe\xaf\xc3\xb2" // "Motion" -#define MSG_VOLUMETRIC "\xcc\xa8\xd7\xd2\xdd\xc4" // "Filament" +#define MSG_TEMPERATURE "\xb5\xdd\xc4\xde" // "Temperature" +#define MSG_MOTION "\xb3\xba\xde\xb7\xbe\xaf\xc3\xb2" // "Motion" +#define MSG_VOLUMETRIC "\xcc\xa8\xd7\xd2\xdd\xc4" // "Filament" #define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_FILAMENT_DIAM "Fil. Dia." -#define MSG_CONTRAST "LCD\xba\xdd\xc4\xd7\xbd\xc4" // "LCD contrast" -#define MSG_STORE_EPROM "\xd2\xd3\xd8\xcd\xb6\xb8\xc9\xb3" // "Store memory" +#define MSG_FILAMENT_DIAM "\xcc\xa8\xd7\xd2\xdd\xc4\xc1\xae\xaf\xb9\xb2" // "Fil. Dia." +#define MSG_CONTRAST "LCD\xba\xdd\xc4\xd7\xbd\xc4" // "LCD contrast" +#define MSG_STORE_EPROM "\xd2\xd3\xd8\xcd\xb6\xb8\xc9\xb3" // "Store memory" #define MSG_LOAD_EPROM "\xd2\xd3\xd8\xb6\xd7\xd6\xd0\xba\xd0" // "Load memory" -#define MSG_RESTORE_FAILSAFE "\xbe\xaf\xc3\xb2\xd8\xbe\xaf\xc4" // "Restore failsafe" -#define MSG_REFRESH "\xd8\xcc\xda\xaf\xbc\xad" // "Refresh" -#define MSG_WATCH "\xb2\xdd\xcc\xab" // "Info screen" -#define MSG_PREPARE "\xbc\xde\xad\xdd\xcb\xde\xbe\xaf\xc3\xb2" // "Prepare" -#define MSG_TUNE "\xc1\xae\xb3\xbe\xb2" // "Tune" -#define MSG_PAUSE_PRINT "\xb2\xc1\xbc\xde\xc3\xb2\xbc" // "Pause print" -#define MSG_RESUME_PRINT "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resume print" -#define MSG_STOP_PRINT "\xcc\xdf\xd8\xdd\xc4\xc3\xb2\xbc" // "Stop print" -#define MSG_CARD_MENU "SD\xb6\xb0\xc4\xde\xb6\xd7\xcc\xdf\xd8\xdd\xc4" // "Print from SD" -#define MSG_NO_CARD "SD\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "No SD card" -#define MSG_DWELL "\xbd\xd8\xb0\xcc\xdf" // "Sleep..." -#define MSG_USERWAIT "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "Wait for user..." -#define MSG_RESUMING "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resuming print" -#define MSG_PRINT_ABORTED "\xcc\xdf\xd8\xdd\xc4\xc1\xad\xb3\xbc\xbb\xda\xcf\xbc\xc0" // "Print aborted" -#define MSG_NO_MOVE "\xb3\xba\xde\xb7\xcf\xbe\xdd" // "No move." -#define MSG_KILLED "\xbc\xae\xb3\xb7\xae" // "KILLED. " -#define MSG_STOPPED "\xc3\xb2\xbc\xbc\xcf\xbc\xc0" // "STOPPED. " -#define MSG_CONTROL_RETRACT "Retract mm" -#define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm" -#define MSG_CONTROL_RETRACTF "Retract V" -#define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" -#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet+mm" -#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" -#define MSG_AUTORETRACT "AutoRetr." -#define MSG_FILAMENTCHANGE "\xcc\xa8\xd7\xd2\xdd\xc4\xba\xb3\xb6\xdd" // "Change filament" -#define MSG_INIT_SDCARD "SD\xb6\xb0\xc4\xde\xbb\xb2\xd6\xd0\xba\xd0" // "Init. SD card" -#define MSG_CNG_SDCARD "SD\xb6\xb0\xc4\xde\xba\xb3\xb6\xdd" // "Change SD card" -#define MSG_ZPROBE_OUT "Z\xcc\xdf\xdb\xb0\xcc\xde \xcd\xde\xaf\xc4\xde\xb6\xde\xb2" // "Z probe out. bed" +#define MSG_RESTORE_FAILSAFE "\xbe\xaf\xc3\xb2\xd8\xbe\xaf\xc4" // "Restore failsafe" +#define MSG_REFRESH "\xd8\xcc\xda\xaf\xbc\xad" // "Refresh" +#define MSG_WATCH "\xb2\xdd\xcc\xab" // "Info screen" +#define MSG_PREPARE "\xbc\xde\xad\xdd\xcb\xde\xbe\xaf\xc3\xb2" // "Prepare" +#define MSG_TUNE "\xc1\xae\xb3\xbe\xb2" // "Tune" +#define MSG_PAUSE_PRINT "\xb2\xc1\xbc\xde\xc3\xb2\xbc" // "Pause print" +#define MSG_RESUME_PRINT "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resume print" +#define MSG_STOP_PRINT "\xcc\xdf\xd8\xdd\xc4\xc3\xb2\xbc" // "Stop print" +#define MSG_CARD_MENU "SD\xb6\xb0\xc4\xde\xb6\xd7\xcc\xdf\xd8\xdd\xc4" // "Print from SD" +#define MSG_NO_CARD "SD\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "No SD card" +#define MSG_DWELL "\xbd\xd8\xb0\xcc\xdf" // "Sleep..." +#define MSG_USERWAIT "\xbc\xca\xde\xd7\xb8\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "Wait for user..." +#define MSG_RESUMING "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resuming print" +#define MSG_PRINT_ABORTED "\xcc\xdf\xd8\xdd\xc4\xc1\xad\xb3\xbc\xbb\xda\xcf\xbc\xc0" // "Print aborted" +#define MSG_NO_MOVE "\xb3\xba\xde\xb7\xcf\xbe\xdd" // "No move." +#define MSG_KILLED "\xcb\xbc\xde\xae\xb3\xc3\xb2\xbc" // "KILLED. " +#define MSG_STOPPED "\xc3\xb2\xbc\xbc\xcf\xbc\xc0" // "STOPPED. " +#define MSG_CONTROL_RETRACT "\xcb\xb7\xba\xd0\xd8\xae\xb3 mm" // "Retract mm" +#define MSG_CONTROL_RETRACT_SWAP "\xcb\xb7\xba\xd0\xd8\xae\xb3S mm" // "Swap Re.mm" +#define MSG_CONTROL_RETRACTF "\xcb\xb7\xba\xd0\xda\xb0\xc4 mm/s" // "Retract V" +#define MSG_CONTROL_RETRACT_ZLIFT "\xc9\xbd\xde\xd9\xc0\xb2\xcb mm" // "Hop mm" +#define MSG_CONTROL_RETRACT_RECOVER "\xd8\xb6\xca\xde\xb0 +mm" // "UnRet +mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP "\xd8\xb6\xca\xde\xb0S +mm" // "S UnRet+mm" +#define MSG_CONTROL_RETRACT_RECOVERF "\xd8\xb6\xca\xde\xb0\xda\xb0\xc4 mm/s" // "UnRet V" +#define MSG_AUTORETRACT "\xbc\xde\xc4\xde\xb3\xcb\xb7\xba\xd0" // "AutoRetr." +#define MSG_FILAMENTCHANGE "\xcc\xa8\xd7\xd2\xdd\xc4\xba\xb3\xb6\xdd" // "Change filament" +#define MSG_INIT_SDCARD "SD\xb6\xb0\xc4\xde\xbb\xb2\xd6\xd0\xba\xd0" // "Init. SD card" +#define MSG_CNG_SDCARD "SD\xb6\xb0\xc4\xde\xba\xb3\xb6\xdd" // "Change SD card" +#define MSG_ZPROBE_OUT "Z\xcc\xdf\xdb\xb0\xcc\xde\x20\xcd\xde\xaf\xc4\xde\xb6\xde\xb2" // "Z probe out. bed" #define MSG_POSITION_UNKNOWN "\xb9\xde\xdd\xc3\xdd\xcaXY\xb2\xc4\xde\xb3\xba\xdeZ" // "Home X/Y before Z" -#define MSG_ZPROBE_ZOFFSET "Z\xb5\xcc\xbe\xaf\xc4" // "Z Offset" -#define MSG_BABYSTEP_X "\xcb\xde\xc4\xde\xb3 X" // "Babystep X" -#define MSG_BABYSTEP_Y "\xcb\xde\xc4\xde\xb3 Y" // "Babystep Y" -#define MSG_BABYSTEP_Z "\xcb\xde\xc4\xde\xb3 Z" // "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort" -#define MSG_END_HOUR "hours" -#define MSG_END_MINUTE "minutes" - -/* These are from language.h. PLEASE DON'T TRANSLATE! All translatable messages can be found in language_en.h -#define MSG_HEATING "\xb6\xc8\xc2\xc1\xad\xb3..." // "Heating..." -#define MSG_HEATING_COMPLETE "\xb6\xc8\xc2\xb6\xdd\xd8\xae\xb3" // "Heating done." -#define MSG_BED_HEATING "\xcd\xde\xaf\xc4\xde\xb6\xc8\xc2\xc1\xad\xb3" // "Bed Heating." -#define MSG_BED_DONE "\xcd\xde\xaf\xc4\xde\xb6\xc8\xc2\xb6\xdd\xd8\xae\xb3" // "Bed done." -#define MSG_ENDSTOPS_HIT "endstops hit: " - ^ typho -*/ +#define MSG_ZPROBE_ZOFFSET "Z\xb5\xcc\xbe\xaf\xc4" // "Z Offset" +#define MSG_BABYSTEP_X "X\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Babystep X" +#define MSG_BABYSTEP_Y "Y\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Babystep Y" +#define MSG_BABYSTEP_Z "Z\xbc\xde\xb8\x20\xcb\xde\xc4\xde\xb3" // "Babystep Z" +#define MSG_ENDSTOP_ABORT "\xb4\xdd\xc4\xde\xbd\xc4\xaf\xcc\xdf\x20\xbb\xc4\xde\xb3" // "Endstop abort" +#define MSG_HEATING_FAILED_LCD "\xb6\xc8\xc2\xbc\xaf\xca\xde\xb2" // "Heating failed" +#define MSG_ERR_REDUNDANT_TEMP "\xb4\xd7\xb0:\xbc\xde\xae\xb3\xc1\xae\xb3\xbb\xb0\xd0\xbd\xc0\xb0\xb7\xc9\xb3" // "Err: REDUNDANT TEMP ERROR" +#define MSG_THERMAL_RUNAWAY "\xc8\xc2\xce\xde\xb3\xbf\xb3" // "THERMAL RUNAWAY" +#define MSG_ERR_MAXTEMP "\xb4\xd7\xb0:\xbb\xb2\xba\xb3\xb5\xdd\xc1\xae\xb3\xb6" // "Err: MAXTEMP" +#define MSG_ERR_MINTEMP "\xb4\xd7\xb0:\xbb\xb2\xc3\xb2\xb5\xdd\xd0\xcf\xdd" // "Err: MINTEMP" +#define MSG_ERR_MAXTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xba\xb3\xb5\xdd\xc1\xae\xb3\xb6" // "Err: MAXTEMP BED" +#define MSG_ERR_MINTEMP_BED "\xb4\xd7\xb0:\xcd\xde\xaf\xc4\xde\x20\xbb\xb2\xc3\xb2\xb5\xdd\xd0\xcf\xdd" // "Err: MINTEMP BED" +#define MSG_END_HOUR "\xbc\xde\xb6\xdd" // "hours" +#define MSG_END_MINUTE "\xcc\xdd" // "minutes" +#define MSG_HEATING "\xb6\xc8\xc2\xc1\xad\xb3" // "Heating..." +#define MSG_HEATING_COMPLETE "\xb6\xc8\xc2\xb6\xdd\xd8\xae\xb3" // "Heating done." +#define MSG_BED_HEATING "\xcd\xde\xaf\xc4\xde\x20\xb6\xc8\xc2\xc1\xad\xb3" // "Bed Heating." +#define MSG_BED_DONE "\xcd\xde\xaf\xc4\xde\x20\xb6\xc8\xc2\xb6\xdd\xd8\xae\xb3" // "Bed done." #if ENABLED(DELTA_CALIBRATION_MENU) - #define MSG_DELTA_CALIBRATE "Delta Calibration" - #define MSG_DELTA_CALIBRATE_X "Calibrate X" - #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" - #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" - #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" + #define MSG_DELTA_CALIBRATE "\xc3\xde\xd9\xc0\x20\xba\xb3\xbe\xb2" // "Delta Calibration" + #define MSG_DELTA_CALIBRATE_X "X\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Calibrate X" + #define MSG_DELTA_CALIBRATE_Y "Y\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Calibrate Y" + #define MSG_DELTA_CALIBRATE_Z "Z\xbc\xde\xb8\x20\xba\xb3\xbe\xb2" // "Calibrate Z" + #define MSG_DELTA_CALIBRATE_CENTER "\xc1\xad\xb3\xbc\xdd\x20\xba\xb3\xbe\xb2" // "Calibrate Center" #endif // DELTA_CALIBRATION_MENU #endif // LANGUAGE_KANA_H diff --git a/Marlin/language_kana_utf8.h b/Marlin/language_kana_utf8.h index 1b1013554afc470eb8f83f0ddc4746fb2b7a7929..a5a102c6d7a6362e41a443adc068f91e589cc9bc 100644 --- a/Marlin/language_kana_utf8.h +++ b/Marlin/language_kana_utf8.h @@ -2,7 +2,7 @@ * Japanese (Kana UTF8 version) * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ @@ -20,82 +20,85 @@ // 片仮名表示定義 #define WELCOME_MSG MACHINE_NAME " ready." -#define MSG_SD_INSERTED "カード ソウニュウサレマシタ" // "Card inserted" +#define MSG_SD_INSERTED "カード ソウニュウサレマシタ" // "Card inserted" #define MSG_SD_REMOVED "カードガアリマセン" // "Card removed" -#define MSG_MAIN "メイン" // "Main" +#define MSG_MAIN "メイン" // "Main" #define MSG_AUTOSTART "ジドウカイシ" // "Autostart" -#define MSG_DISABLE_STEPPERS "モーターデンゲン オフ" // "Disable steppers" +#define MSG_DISABLE_STEPPERS "モーターデンゲン オフ" // "Disable steppers" #define MSG_AUTO_HOME "ゲンテンニイドウ" // "Auto home" +#define MSG_LEVEL_BED_HOMING "ゲンテンニイドウ" // "Homing" #define MSG_SET_HOME_OFFSETS "キジュンオフセットセッテイ" // "Set home offsets" #define MSG_SET_ORIGIN "キジュンセット" // "Set origin" -#define MSG_PREHEAT_PLA "PLA ヨネツ" // "Preheat PLA" +#define MSG_PREHEAT_PLA "PLA ヨネツ" // "Preheat PLA" #define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " " -#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA " スベテ" // " All" -#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA " ベッド" // "Bed" -#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA " セッテイ" // "conf" -#define MSG_PREHEAT_ABS "ABS ヨネツ" // "Preheat ABS" +#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA " スベテ" // " All" +#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA " ベッド" // "Bed" +#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA " セッテイ" // "conf" +#define MSG_PREHEAT_ABS "ABS ヨネツ" // "Preheat ABS" #define MSG_PREHEAT_ABS_N MSG_PREHEAT_ABS " " -#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS " スベテ" // " All" -#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS " ベッド" // "Bed" +#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS " スベテ" // " All" +#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS " ベッド" // "Bed" #define MSG_PREHEAT_ABS_SETTINGS MSG_PREHEAT_ABS " セッテイ" // "conf" -#define MSG_COOLDOWN "カネツテイシ" // "Cooldown" +#define MSG_COOLDOWN "カネツテイシ" // "Cooldown" #define MSG_SWITCH_PS_ON "デンゲン オン" // "Switch power on" #define MSG_SWITCH_PS_OFF "デンゲン オフ" // "Switch power off" #define MSG_EXTRUDE "オシダシ" // "Extrude" -#define MSG_RETRACT "リトラクト" // "Retract" -#define MSG_MOVE_AXIS "ジクイドウ" // "Move axis" -#define MSG_MOVE_X "Xジク イドウ" // "Move X" -#define MSG_MOVE_Y "Yジク イドウ" // "Move Y" -#define MSG_MOVE_Z "Zジク イドウ" // "Move Z" +#define MSG_RETRACT "ヒキコミセッテイ" // "Retract" +#define MSG_MOVE_AXIS "ジクイドウ" // "Move axis" +#define MSG_LEVEL_BED "ベッドレベリング" // "Level bed" +#define MSG_MOVE_X "Xジク イドウ" // "Move X" +#define MSG_MOVE_Y "Yジク イドウ" // "Move Y" +#define MSG_MOVE_Z "Zジク イドウ" // "Move Z" #define MSG_MOVE_E "エクストルーダー" // "Extruder" #define MSG_MOVE_01MM "0.1mm イドウ" // "Move 0.1mm" #define MSG_MOVE_1MM " 1mm イドウ" // "Move 1mm" #define MSG_MOVE_10MM " 10mm イドウ" // "Move 10mm" #define MSG_SPEED "スピード" // "Speed" #define MSG_NOZZLE "ノズル" // "Nozzle" -#define MSG_BED "ベッド" // "Bed" +#define MSG_BED "ベッド" // "Bed" #define MSG_FAN_SPEED "ファンソクド" // "Fan speed" #define MSG_FLOW "オクリリョウ" // "Flow" #define MSG_CONTROL "コントロール" // "Control" -#define MSG_MIN LCD_STR_THERMOMETER " Min" -#define MSG_MAX LCD_STR_THERMOMETER " Max" -#define MSG_FACTOR LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP "ジドウオンド" // "Autotemp" -#define MSG_ON "On " -#define MSG_OFF "Off" +#define MSG_MIN LCD_STR_THERMOMETER " サイテイ" // " Min" +#define MSG_MAX LCD_STR_THERMOMETER " サイコウ" // " Max" +#define MSG_FACTOR LCD_STR_THERMOMETER " ファクター" // " Fact" +#define MSG_AUTOTEMP "ジドウオンド" // "Autotemp" +#define MSG_ON "オン " // "On " +#define MSG_OFF "オフ " // "Off" #define MSG_PID_P "PID-P" #define MSG_PID_I "PID-I" #define MSG_PID_D "PID-D" #define MSG_PID_C "PID-C" -#define MSG_ACC "カソクド" // "Accel" -#define MSG_VXY_JERK "Vxy-jerk" -#define MSG_VZ_JERK "Vz-jerk" -#define MSG_VE_JERK "Ve-jerk" -#define MSG_VMAX "Vmax " -#define MSG_X "x" -#define MSG_Y "y" -#define MSG_Z "z" -#define MSG_E "e" -#define MSG_VMIN "Vmin" -#define MSG_VTRAV_MIN "VTrav min" -#define MSG_AMAX "Amax " -#define MSG_A_RETRACT "A-retract" +#define MSG_ACC "カソクド mm/s^2" // "Accel" +#define MSG_VXY_JERK "XYジク ヤクド mm/s" // "Vxy-jerk" +#define MSG_VZ_JERK "Zジク ヤクド mm/s" // "Vz-jerk" +#define MSG_VE_JERK "エクストルーダー ヤクド" // "Ve-jerk" +#define MSG_VMAX "サイダイフィードレート " // "Vmax " +#define MSG_X "X" // "x" +#define MSG_Y "Y" // "y" +#define MSG_Z "Z" // "z" +#define MSG_E "E" // "e" +#define MSG_VMIN "サイショウフィードレート" // "Vmin" +#define MSG_VTRAV_MIN "サイショウトラベルレート" // "VTrav min" +#define MSG_AMAX "サイダイカソクド " // "Amax " +#define MSG_A_RETRACT "ヒキコミカソクド" // "A-retract" +#define MSG_A_TRAVEL "トラベルカソクド" // "A-travel" #define MSG_XSTEPS "Xsteps/mm" #define MSG_YSTEPS "Ysteps/mm" #define MSG_ZSTEPS "Zsteps/mm" #define MSG_ESTEPS "Esteps/mm" #define MSG_TEMPERATURE "オンド" // "Temperature" #define MSG_MOTION "ウゴキセッテイ" // "Motion" -#define MSG_VOLUMETRIC "フィラメント" // "Filament" +#define MSG_VOLUMETRIC "フィラメント" // "Filament" #define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_FILAMENT_DIAM "Fil. Dia." -#define MSG_CONTRAST "LCDコントラスト" // "LCD contrast" -#define MSG_STORE_EPROM "メモリヘカクノウ" // "Store memory" +#define MSG_FILAMENT_DIAM "フィラメントチョッケイ" // "Fil. Dia." +#define MSG_CONTRAST "LCDコントラスト" // "LCD contrast" +#define MSG_STORE_EPROM "メモリヘカクノウ" // "Store memory" #define MSG_LOAD_EPROM "メモリカラヨミコミ" // "Load memory" #define MSG_RESTORE_FAILSAFE "セッテイリセット" // "Restore failsafe" #define MSG_REFRESH "リフレッシュ" // "Refresh" #define MSG_WATCH "インフォ" // "Info screen" -#define MSG_PREPARE "ジュンビセッテイ" //"Prepare" +#define MSG_PREPARE "ジュンビセッテイ" // "Prepare" #define MSG_TUNE "チョウセイ" // "Tune" #define MSG_PAUSE_PRINT "イチジテイシ" // "Pause print" #define MSG_RESUME_PRINT "プリントサイカイ" // "Resume print" @@ -107,35 +110,46 @@ #define MSG_RESUMING "プリントサイカイ" // "Resuming print" #define MSG_PRINT_ABORTED "プリントチュウシサレマシタ" // "Print aborted" #define MSG_NO_MOVE "ウゴキマセン" // "No move." -#define MSG_KILLED "ショウキョ" // "KILLED. " +#define MSG_KILLED "ヒジョウテイシ" // "KILLED. " #define MSG_STOPPED "テイシシマシタ" // "STOPPED. " -#define MSG_CONTROL_RETRACT "Retract mm" -#define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm" -#define MSG_CONTROL_RETRACTF "Retract V" -#define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" -#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet+mm" -#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" -#define MSG_AUTORETRACT "AutoRetr." -#define MSG_FILAMENTCHANGE "フィラメントコウカン" // "Change filament" -#define MSG_INIT_SDCARD "SDカードサイヨミコミ" // "Init. SD card" -#define MSG_CNG_SDCARD "SDカードコウカン" // "Change SD card" -#define MSG_ZPROBE_OUT "Zプローブ ベッドガイ" // "Z probe out. bed" +#define MSG_CONTROL_RETRACT "ヒキコミリョウ mm" // "Retract mm" +#define MSG_CONTROL_RETRACT_SWAP "ヒキコミリョウS mm" // "Swap Re.mm" +#define MSG_CONTROL_RETRACTF "ヒキコミレート mm/s" // "Retract V" +#define MSG_CONTROL_RETRACT_ZLIFT "ノズルタイヒ mm" // "Hop mm" +#define MSG_CONTROL_RETRACT_RECOVER "リカバー +mm" // "UnRet +mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP "リカバーS +mm" // "S UnRet+mm" +#define MSG_CONTROL_RETRACT_RECOVERF "リカバーレート mm/s" // "UnRet V" +#define MSG_AUTORETRACT "ジドウヒキコミ" // "AutoRetr." +#define MSG_FILAMENTCHANGE "フィラメントコウカン" // "Change filament" +#define MSG_INIT_SDCARD "SDカードサイヨミコミ" // "Init. SD card" +#define MSG_CNG_SDCARD "SDカードコウカン" // "Change SD card" +#define MSG_ZPROBE_OUT "Zプローブ ベッドガイ" // "Z probe out. bed" #define MSG_POSITION_UNKNOWN "ゲンテンハXYイドウゴZ" // "Home X/Y before Z" #define MSG_ZPROBE_ZOFFSET "Zオフセット" // "Z Offset" -#define MSG_BABYSTEP_X "ビドウ X" // "Babystep X" -#define MSG_BABYSTEP_Y "ビドウ Y" // "Babystep Y" -#define MSG_BABYSTEP_Z "ビドウ Z" // "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort" -#define MSG_END_HOUR "hours" -#define MSG_END_MINUTE "minutes" +#define MSG_BABYSTEP_X "Xジク ビドウ" // "Babystep X" +#define MSG_BABYSTEP_Y "Yジク ビドウ" // "Babystep Y" +#define MSG_BABYSTEP_Z "Zジク ビドウ" // "Babystep Z" +#define MSG_ENDSTOP_ABORT "エンドストップ サドウ" // "Endstop abort" +#define MSG_HEATING_FAILED_LCD "カネツシッパイ" // "Heating failed" +#define MSG_ERR_REDUNDANT_TEMP "エラー:ジョウチョウサーミスターキノウ" // "Err: REDUNDANT TEMP ERROR" +#define MSG_THERMAL_RUNAWAY "ネツボウソウ" // "THERMAL RUNAWAY" +#define MSG_ERR_MAXTEMP "エラー:サイコウオンチョウカ" // "Err: MAXTEMP" +#define MSG_ERR_MINTEMP "エラー:サイテイオンミマン" // "Err: MINTEMP" +#define MSG_ERR_MAXTEMP_BED "エラー:ベッド サイコウオンチョウカ" // "Err: MAXTEMP BED" +#define MSG_ERR_MINTEMP_BED "エラー:ベッド サイテイオンミマン" // "Err: MINTEMP BED" +#define MSG_END_HOUR "ジカン" // "hours" +#define MSG_END_MINUTE "フン" // "minutes" +#define MSG_HEATING "カネツチュウ" // "Heating..." +#define MSG_HEATING_COMPLETE "カネツカンリョウ" // "Heating done." +#define MSG_BED_HEATING "ベッド カネツチュウ" // "Bed Heating." +#define MSG_BED_DONE "ベッド カネツカンリョウ" // "Bed done." #if ENABLED(DELTA_CALIBRATION_MENU) - #define MSG_DELTA_CALIBRATE "Delta Calibration" - #define MSG_DELTA_CALIBRATE_X "Calibrate X" - #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" - #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" - #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" + #define MSG_DELTA_CALIBRATE "デルタ コウセイ" // "Delta Calibration" + #define MSG_DELTA_CALIBRATE_X "Xジク コウセイ" // "Calibrate X" + #define MSG_DELTA_CALIBRATE_Y "Yジク コウセイ" // "Calibrate Y" + #define MSG_DELTA_CALIBRATE_Z "Zジク コウセイ" // "Calibrate Z" + #define MSG_DELTA_CALIBRATE_CENTER "チュウシン コウセイ" // "Calibrate Center" #endif // DELTA_CALIBRATION_MENU #endif // LANGUAGE_KANA_UTF_H diff --git a/Marlin/language_nl.h b/Marlin/language_nl.h index bd6b86b0927c7247c1bb9025ac77fd1c5aa686fa..1a6440f8a8a9f55078411ae6759bd056115c0c68 100644 --- a/Marlin/language_nl.h +++ b/Marlin/language_nl.h @@ -2,7 +2,7 @@ * Dutch * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_NL_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Motoren uit" #define MSG_AUTO_HOME "Auto home" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Nulpunt instellen" #define MSG_PREHEAT_PLA "PLA voorverwarmen" @@ -121,8 +122,8 @@ #define MSG_BABYSTEP_Y "Babystap Y" #define MSG_BABYSTEP_Z "Babystap Z" #define MSG_ENDSTOP_ABORT "Endstop afbr." -#define MSG_END_HOUR "hours" -#define MSG_END_MINUTE "minutes" +#define MSG_END_HOUR "uur" +#define MSG_END_MINUTE "minuten" #if ENABLED(DELTA_CALIBRATION_MENU) #define MSG_DELTA_CALIBRATE "Delta Calibratie" diff --git a/Marlin/language_pl.h b/Marlin/language_pl.h index 9c761176d0cdcfbc2967ec47601d6f1996b280b0..5862abe48f342693e1ec15d2a5bf47b8731c4736 100644 --- a/Marlin/language_pl.h +++ b/Marlin/language_pl.h @@ -2,7 +2,7 @@ * Polish * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_PL_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Wylacz silniki" #define MSG_AUTO_HOME "Auto. poz. zerowa" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_ORIGIN "Ustaw punkt zero" #define MSG_PREHEAT_PLA "Rozgrzej PLA" diff --git a/Marlin/language_pt-br.h b/Marlin/language_pt-br.h index 2dabfee98153a5eb29dedf816c8f3e52d1e7ae1c..31a093fcea7eaa4b8c00a817eba8e5d5f2bd7526 100644 --- a/Marlin/language_pt-br.h +++ b/Marlin/language_pt-br.h @@ -2,7 +2,7 @@ * Portuguese (Brazil) * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_PT_BR_H @@ -16,55 +16,56 @@ #define WELCOME_MSG MACHINE_NAME " pronto." #define MSG_SD_INSERTED "Cartao inserido" #define MSG_SD_REMOVED "Cartao removido" -#define MSG_MAIN " Menu principal" +#define MSG_MAIN "Menu principal" #define MSG_AUTOSTART "Autostart" -#define MSG_DISABLE_STEPPERS " Apagar motores" +#define MSG_DISABLE_STEPPERS "Desabi. motores" #define MSG_AUTO_HOME "Ir para origen" -#define MSG_SET_HOME_OFFSETS "Set home offsets" -#define MSG_SET_ORIGIN "Estabelecer orig." +#define MSG_LEVEL_BED_HOMING "Homing" +#define MSG_SET_HOME_OFFSETS "Ajustar Jogo" +#define MSG_SET_ORIGIN "Ajustar orig." #define MSG_PREHEAT_PLA "Pre-aquecer PLA" -#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA " -#define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo" +#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA" +#define MSG_PREHEAT_PLA_ALL "Pre-aq.Todo PLA" #define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base" -#define MSG_PREHEAT_PLA_SETTINGS "PLA setting" +#define MSG_PREHEAT_PLA_SETTINGS "Ajustar PLA" #define MSG_PREHEAT_ABS "Pre-aquecer ABS" -#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS " -#define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo" +#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS" +#define MSG_PREHEAT_ABS_ALL "Pre-aq.Todo ABS" #define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base" -#define MSG_PREHEAT_ABS_SETTINGS "ABS setting" +#define MSG_PREHEAT_ABS_SETTINGS "Ajustar ABS" #define MSG_COOLDOWN "Esfriar" -#define MSG_SWITCH_PS_ON "Switch Power On" -#define MSG_SWITCH_PS_OFF "Switch Power Off" +#define MSG_SWITCH_PS_ON "Ligar" +#define MSG_SWITCH_PS_OFF "Desligar" #define MSG_EXTRUDE "Extrudar" #define MSG_RETRACT "Retrair" #define MSG_MOVE_AXIS "Mover eixo" -#define MSG_MOVE_X "Move X" -#define MSG_MOVE_Y "Move Y" -#define MSG_MOVE_Z "Move Z" -#define MSG_MOVE_E "Extruder" -#define MSG_MOVE_01MM "Move 0.1mm" -#define MSG_MOVE_1MM "Move 1mm" -#define MSG_MOVE_10MM "Move 10mm" +#define MSG_MOVE_X "Mover X" +#define MSG_MOVE_Y "Mover Y" +#define MSG_MOVE_Z "Mover Z" +#define MSG_MOVE_E "Mover Extrusor" +#define MSG_MOVE_01MM "Mover 0.1mm" +#define MSG_MOVE_1MM "Mover 1mm" +#define MSG_MOVE_10MM "Mover 10mm" #define MSG_SPEED "Velocidade" -#define MSG_NOZZLE LCD_STR_THERMOMETER " Nozzle" +#define MSG_NOZZLE LCD_STR_THERMOMETER " Bocal" #define MSG_BED LCD_STR_THERMOMETER " Base" -#define MSG_FAN_SPEED "Velocidade vento." +#define MSG_FAN_SPEED "Vel. Ventoinha" #define MSG_FLOW "Fluxo" #define MSG_CONTROL "Controle" #define MSG_MIN LCD_STR_THERMOMETER " Min" #define MSG_MAX LCD_STR_THERMOMETER " Max" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP "Autotemp" -#define MSG_ON "On " -#define MSG_OFF "Off" +#define MSG_AUTOTEMP "Temp. Automatica" +#define MSG_ON "Ligado " +#define MSG_OFF "Desligado" #define MSG_PID_P "PID-P" #define MSG_PID_I "PID-I" #define MSG_PID_D "PID-D" #define MSG_PID_C "PID-C" #define MSG_ACC "Acc" -#define MSG_VXY_JERK "Vxy-jerk" -#define MSG_VZ_JERK "Vz-jerk" -#define MSG_VE_JERK "Ve-jerk" +#define MSG_VXY_JERK "jogo VXY" +#define MSG_VZ_JERK "jogo VZ" +#define MSG_VE_JERK "jogo VE" #define MSG_VMAX " Vmax " #define MSG_X "x" #define MSG_Y "y" @@ -73,63 +74,63 @@ #define MSG_VMIN "Vmin" #define MSG_VTRAV_MIN "VTrav min" #define MSG_AMAX "Amax " -#define MSG_A_RETRACT "A-retract" -#define MSG_XSTEPS "Xpasso/mm" -#define MSG_YSTEPS "Ypasso/mm" -#define MSG_ZSTEPS "Zpasso/mm" -#define MSG_ESTEPS "Epasso/mm" +#define MSG_A_RETRACT "Retrair A" +#define MSG_XSTEPS "Passo X/mm" +#define MSG_YSTEPS "Passo Y/mm" +#define MSG_ZSTEPS "Passo Z/mm" +#define MSG_ESTEPS "E/mm" #define MSG_TEMPERATURE "Temperatura" #define MSG_MOTION "Movimento" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_FILAMENT_DIAM "Fil. Dia." -#define MSG_CONTRAST "Contrast" -#define MSG_STORE_EPROM "Guardar memoria" -#define MSG_LOAD_EPROM "Carregar memoria" -#define MSG_RESTORE_FAILSAFE "Rest. de emergen." -#define MSG_REFRESH LCD_STR_REFRESH " Recarregar" +#define MSG_VOLUMETRIC "Filamento" +#define MSG_VOLUMETRIC_ENABLED "Extr. em mm3" +#define MSG_FILAMENT_DIAM "Diametro Fil." +#define MSG_CONTRAST "Contraste" +#define MSG_STORE_EPROM "Salvar" +#define MSG_LOAD_EPROM "Ler" +#define MSG_RESTORE_FAILSAFE "Rest. de emerg." +#define MSG_REFRESH LCD_STR_REFRESH " Restaurar" #define MSG_WATCH "Monitorar" #define MSG_PREPARE "Preparar" -#define MSG_TUNE "Tune" +#define MSG_TUNE "Afinar" #define MSG_PAUSE_PRINT "Pausar impressao" #define MSG_RESUME_PRINT "Resumir impressao" #define MSG_STOP_PRINT "Parar impressao" -#define MSG_CARD_MENU "Menu cartao SD" +#define MSG_CARD_MENU "Imprimir do SD" #define MSG_NO_CARD "Sem cartao SD" #define MSG_DWELL "Repouso..." #define MSG_USERWAIT "Esperando ordem" -#define MSG_RESUMING "Resuming print" -#define MSG_PRINT_ABORTED "Print aborted" +#define MSG_RESUMING "Resumindo Impres." +#define MSG_PRINT_ABORTED "Impres. Abortada." #define MSG_NO_MOVE "Sem movimento" #define MSG_KILLED "PARADA DE EMERG." #define MSG_STOPPED "PARADA. " -#define MSG_CONTROL_RETRACT " Retrair mm" -#define MSG_CONTROL_RETRACT_SWAP "Troca Retrair mm" -#define MSG_CONTROL_RETRACTF " Retrair V" -#define MSG_CONTROL_RETRACT_ZLIFT " Levantar mm" -#define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm" -#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Troca DesRet +mm" -#define MSG_CONTROL_RETRACT_RECOVERF " DesRet V" -#define MSG_AUTORETRACT " AutoRetr." -#define MSG_FILAMENTCHANGE "Change filament" -#define MSG_INIT_SDCARD "Init. SD-Card" -#define MSG_CNG_SDCARD "Change SD-Card" +#define MSG_CONTROL_RETRACT "Retrair mm" +#define MSG_CONTROL_RETRACT_SWAP "Retrair Troca mm" +#define MSG_CONTROL_RETRACTF "Retrair V" +#define MSG_CONTROL_RETRACT_ZLIFT "Levantar mm" +#define MSG_CONTROL_RETRACT_RECOVER "Des Retrair +mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Des RetTroca +mm" +#define MSG_CONTROL_RETRACT_RECOVERF "Des Retrair V" +#define MSG_AUTORETRACT "Retracao Autom." +#define MSG_FILAMENTCHANGE "Trocar Filamento" +#define MSG_INIT_SDCARD "Iniciar SD" +#define MSG_CNG_SDCARD "Trocar SD" #define MSG_ZPROBE_OUT "Son. fora da mesa" -#define MSG_POSITION_UNKNOWN "XY antes de Z" -#define MSG_ZPROBE_ZOFFSET "Z Offset" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort" -#define MSG_END_HOUR "horas" -#define MSG_END_MINUTE "minutos" +#define MSG_POSITION_UNKNOWN "Pos. Desconhecida" +#define MSG_ZPROBE_ZOFFSET "Deslocamento no Z" +#define MSG_BABYSTEP_X "Passinho X" +#define MSG_BABYSTEP_Y "Passinho Y" +#define MSG_BABYSTEP_Z "Passinho Z" +#define MSG_ENDSTOP_ABORT "Fim de Curso" +#define MSG_END_HOUR "Horas" +#define MSG_END_MINUTE "Minutos" #if ENABLED(DELTA_CALIBRATION_MENU) - #define MSG_DELTA_CALIBRATE "Delta Calibration" - #define MSG_DELTA_CALIBRATE_X "Calibrate X" - #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" - #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" - #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" + #define MSG_DELTA_CALIBRATE "Calibrar Delta" + #define MSG_DELTA_CALIBRATE_X "Calibrar X" + #define MSG_DELTA_CALIBRATE_Y "Calibrar Y" + #define MSG_DELTA_CALIBRATE_Z "Calibrar Z" + #define MSG_DELTA_CALIBRATE_CENTER "Calibrar Centro" #endif // DELTA_CALIBRATION_MENU #endif // LANGUAGE_PT_BR_H diff --git a/Marlin/language_pt-br_utf8.h b/Marlin/language_pt-br_utf8.h new file mode 100644 index 0000000000000000000000000000000000000000..49248ab045b5425da12d697596f2528090126250 --- /dev/null +++ b/Marlin/language_pt-br_utf8.h @@ -0,0 +1,136 @@ +/** + * Portuguese (Brazil) + * + * LCD Menu Messages + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language + * + */ +#ifndef LANGUAGE_PT_BR_UTF_H +#define LANGUAGE_PT_BR_UTF_H + +#define MAPPER_NON +// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h +//#define SIMULATE_ROMFONT +#define DISPLAY_CHARSET_ISO10646_1 + +#define WELCOME_MSG MACHINE_NAME " pronto." +#define MSG_SD_INSERTED "Cartão inserido" +#define MSG_SD_REMOVED "Cartão removido" +#define MSG_MAIN "Menu principal" +#define MSG_AUTOSTART "Autostart" +#define MSG_DISABLE_STEPPERS "Desabi. motores" +#define MSG_AUTO_HOME "Ir para origen" +#define MSG_LEVEL_BED_HOMING "Indo para origem" +#define MSG_SET_HOME_OFFSETS "Ajustar Jogo" +#define MSG_SET_ORIGIN "Ajustar orig." +#define MSG_PREHEAT_PLA "Pre-aquecer PLA" +#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA" +#define MSG_PREHEAT_PLA_ALL "Pre-aq.Todo PLA" +#define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base" +#define MSG_PREHEAT_PLA_SETTINGS "Ajustar PLA" +#define MSG_PREHEAT_ABS "Pre-aquecer ABS" +#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS" +#define MSG_PREHEAT_ABS_ALL "Pre-aq.Todo ABS" +#define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base" +#define MSG_PREHEAT_ABS_SETTINGS "Ajustar ABS" +#define MSG_COOLDOWN "Esfriar" +#define MSG_SWITCH_PS_ON "Ligar" +#define MSG_SWITCH_PS_OFF "Desligar" +#define MSG_EXTRUDE "Extrudar" +#define MSG_RETRACT "Retrair" +#define MSG_MOVE_AXIS "Mover eixo" +#define MSG_MOVE_X "Mover X" +#define MSG_MOVE_Y "Mover Y" +#define MSG_MOVE_Z "Mover Z" +#define MSG_MOVE_E "Mover Extrusor" +#define MSG_MOVE_01MM "Mover 0.1mm" +#define MSG_MOVE_1MM "Mover 1mm" +#define MSG_MOVE_10MM "Mover 10mm" +#define MSG_SPEED "Velocidade" +#define MSG_NOZZLE LCD_STR_THERMOMETER " Bocal" +#define MSG_BED LCD_STR_THERMOMETER " Base" +#define MSG_FAN_SPEED "Vel. Ventoinha" +#define MSG_FLOW "Fluxo" +#define MSG_CONTROL "Controle" +#define MSG_MIN LCD_STR_THERMOMETER " Min" +#define MSG_MAX LCD_STR_THERMOMETER " Max" +#define MSG_FACTOR LCD_STR_THERMOMETER " Fact" +#define MSG_AUTOTEMP "Temp. Automática" +#define MSG_ON "Ligado " +#define MSG_OFF "Desligado" +#define MSG_PID_P "PID-P" +#define MSG_PID_I "PID-I" +#define MSG_PID_D "PID-D" +#define MSG_PID_C "PID-C" +#define MSG_ACC "Acc" +#define MSG_VXY_JERK "jogo VXY" +#define MSG_VZ_JERK "jogo VZ" +#define MSG_VE_JERK "jogo VE" +#define MSG_VMAX " Vmax " +#define MSG_X "x" +#define MSG_Y "y" +#define MSG_Z "z" +#define MSG_E "e" +#define MSG_VMIN "Vmin" +#define MSG_VTRAV_MIN "VTrav min" +#define MSG_AMAX "Amax " +#define MSG_A_RETRACT "Retrair A" +#define MSG_XSTEPS "Passo X/mm" +#define MSG_YSTEPS "Passo Y/mm" +#define MSG_ZSTEPS "Passo Z/mm" +#define MSG_ESTEPS "E/mm" +#define MSG_TEMPERATURE "Temperatura" +#define MSG_MOTION "Movimento" +#define MSG_VOLUMETRIC "Filamento" +#define MSG_VOLUMETRIC_ENABLED "Extr. em mm3" +#define MSG_FILAMENT_DIAM "Diametro Fil." +#define MSG_CONTRAST "Contraste" +#define MSG_STORE_EPROM "Salvar" +#define MSG_LOAD_EPROM "Ler" +#define MSG_RESTORE_FAILSAFE "Rest. de emerg." +#define MSG_REFRESH LCD_STR_REFRESH " Restaurar" +#define MSG_WATCH "Monitorar" +#define MSG_PREPARE "Preparar" +#define MSG_TUNE "Afinar" +#define MSG_PAUSE_PRINT "Pausar impressão" +#define MSG_RESUME_PRINT "Resumir impressão" +#define MSG_STOP_PRINT "Parar impressão" +#define MSG_CARD_MENU "Imprimir do SD" +#define MSG_NO_CARD "Sem cartão SD" +#define MSG_DWELL "Repouso..." +#define MSG_USERWAIT "Esperando ordem" +#define MSG_RESUMING "Resumindo Impres." +#define MSG_PRINT_ABORTED "Impres. Abortada." +#define MSG_NO_MOVE "Sem movimento" +#define MSG_KILLED "PARADA DE EMERG." +#define MSG_STOPPED "PARADA. " +#define MSG_CONTROL_RETRACT "Retrair mm" +#define MSG_CONTROL_RETRACT_SWAP "Retrair Troca mm" +#define MSG_CONTROL_RETRACTF "Retrair V" +#define MSG_CONTROL_RETRACT_ZLIFT "Levantar mm" +#define MSG_CONTROL_RETRACT_RECOVER "Des Retrair +mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Des RetTroca +mm" +#define MSG_CONTROL_RETRACT_RECOVERF "Des Retrair V" +#define MSG_AUTORETRACT "Retração Autom." +#define MSG_FILAMENTCHANGE "Trocar Filamento" +#define MSG_INIT_SDCARD "Iniciar SD" +#define MSG_CNG_SDCARD "Trocar SD" +#define MSG_ZPROBE_OUT "Son. fora da mesa" +#define MSG_POSITION_UNKNOWN "Pos. Desconhecida" +#define MSG_ZPROBE_ZOFFSET "Deslocamento no Z" +#define MSG_BABYSTEP_X "Passinho X" +#define MSG_BABYSTEP_Y "Passinho Y" +#define MSG_BABYSTEP_Z "Passinho Z" +#define MSG_ENDSTOP_ABORT "Fim de Curso" +#define MSG_END_HOUR "Horas" +#define MSG_END_MINUTE "Minutos" + +#if ENABLED(DELTA_CALIBRATION_MENU) + #define MSG_DELTA_CALIBRATE "Calibrar Delta" + #define MSG_DELTA_CALIBRATE_X "Calibrar X" + #define MSG_DELTA_CALIBRATE_Y "Calibrar Y" + #define MSG_DELTA_CALIBRATE_Z "Calibrar Z" + #define MSG_DELTA_CALIBRATE_CENTER "Calibrar Centro" +#endif // DELTA_CALIBRATION_MENU + +#endif // LANGUAGE_PT_BR_UTF_H diff --git a/Marlin/language_pt.h b/Marlin/language_pt.h index 931ee049df3725874fde7543412a096a081e1ced..0fcfc5eae161df2c1fcb4b14991e3dc18c424039 100644 --- a/Marlin/language_pt.h +++ b/Marlin/language_pt.h @@ -2,7 +2,7 @@ * Portuguese * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_PT_H @@ -16,14 +16,15 @@ #define WELCOME_MSG MACHINE_NAME " pronto." #define MSG_SD_INSERTED "Cartao inserido" #define MSG_SD_REMOVED "Cartao removido" -#define MSG_MAIN " Menu principal" +#define MSG_MAIN "Menu principal" #define MSG_AUTOSTART "Autostart" -#define MSG_DISABLE_STEPPERS " Desactivar motores" +#define MSG_DISABLE_STEPPERS "Desactivar motores" #define MSG_AUTO_HOME "Ir para origem" -#define MSG_SET_HOME_OFFSETS "Def. desvio origem" +#define MSG_LEVEL_BED_HOMING "Indo para origem" +#define MSG_SET_HOME_OFFSETS "Definir desvio" #define MSG_SET_ORIGIN "Definir origem" #define MSG_PREHEAT_PLA "Pre-aquecer PLA" -#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA " +#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA" #define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo" #define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base" #define MSG_PREHEAT_PLA_SETTINGS "Definicoes PLA" @@ -41,26 +42,30 @@ #define MSG_MOVE_X "Mover X" #define MSG_MOVE_Y "Mover Y" #define MSG_MOVE_Z "Mover Z" -#define MSG_MOVE_E "Extrusor" +#define MSG_MOVE_E "Mover Extrusor" #define MSG_MOVE_01MM "Mover 0.1mm" #define MSG_MOVE_1MM "Mover 1mm" #define MSG_MOVE_10MM "Mover 10mm" #define MSG_SPEED "Velocidade" -#define MSG_NOZZLE LCD_STR_THERMOMETER "Bico" -#define MSG_BED LCD_STR_THERMOMETER "Base" -#define MSG_FAN_SPEED "Velocidade do ar." +#define MSG_NOZZLE LCD_STR_THERMOMETER " Bico" +#define MSG_BED LCD_STR_THERMOMETER " Base" +#define MSG_FAN_SPEED "Vel. ventoinha" #define MSG_FLOW "Fluxo" #define MSG_CONTROL "Controlo" #define MSG_MIN LCD_STR_THERMOMETER " Min" #define MSG_MAX LCD_STR_THERMOMETER " Max" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact" -#define MSG_AUTOTEMP "Autotemp:" +#define MSG_AUTOTEMP "Temp. Automatica" #define MSG_ON "On " #define MSG_OFF "Off" #define MSG_PID_P "PID-P" #define MSG_PID_I "PID-I" #define MSG_PID_D "PID-D" #define MSG_PID_C "PID-C" +#define MSG_E1 "E1" +#define MSG_E2 "E2" +#define MSG_E3 "E3" +#define MSG_E4 "E4" #define MSG_ACC "Acc" #define MSG_VXY_JERK "Vxy-jerk" #define MSG_VZ_JERK "Vz-jerk" @@ -74,34 +79,34 @@ #define MSG_VTRAV_MIN "VTrav min" #define MSG_AMAX "Amax " #define MSG_A_RETRACT "A-retract" -#define MSG_XSTEPS "Xpasso/mm" -#define MSG_YSTEPS "Ypasso/mm" -#define MSG_ZSTEPS "Zpasso/mm" -#define MSG_ESTEPS "Epasso/mm" +#define MSG_XSTEPS "X passo/mm" +#define MSG_YSTEPS "Y passo/mm" +#define MSG_ZSTEPS "Z passo/mm" +#define MSG_ESTEPS "E passo/mm" #define MSG_TEMPERATURE "Temperatura" #define MSG_MOTION "Movimento" #define MSG_VOLUMETRIC "Filamento" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_VOLUMETRIC_ENABLED "E em mm3" #define MSG_FILAMENT_DIAM "Fil. Diam." #define MSG_CONTRAST "Contraste" #define MSG_STORE_EPROM "Guardar na memoria" #define MSG_LOAD_EPROM "Carregar da memoria" #define MSG_RESTORE_FAILSAFE "Rest. de emergen." #define MSG_REFRESH LCD_STR_REFRESH " Recarregar" -#define MSG_WATCH "Monitorar" +#define MSG_WATCH "Monitorizar" #define MSG_PREPARE "Preparar" #define MSG_TUNE "Afinar" -#define MSG_PAUSE_PRINT "Pausa impressao" +#define MSG_PAUSE_PRINT "Pausar impressao" #define MSG_RESUME_PRINT "Retomar impressao" #define MSG_STOP_PRINT "Parar impressao" -#define MSG_CARD_MENU "Menu cartao SD" +#define MSG_CARD_MENU "Imprimir do SD" #define MSG_NO_CARD "Sem cartao SD" -#define MSG_DWELL "Repouso..." +#define MSG_DWELL "Em espera..." #define MSG_USERWAIT "A espera de ordem" #define MSG_RESUMING "Retomando impressao" #define MSG_PRINT_ABORTED "Impressao cancelada" #define MSG_NO_MOVE "Sem movimento" -#define MSG_KILLED "INTRRP. DE EMERG." +#define MSG_KILLED "EMERGENCIA. " #define MSG_STOPPED "PARADO. " #define MSG_CONTROL_RETRACT " Retrair mm" #define MSG_CONTROL_RETRACT_SWAP "Troca Retrair mm" @@ -112,15 +117,15 @@ #define MSG_CONTROL_RETRACT_RECOVERF " DesRet V" #define MSG_AUTORETRACT " AutoRetr." #define MSG_FILAMENTCHANGE "Trocar filamento" -#define MSG_INIT_SDCARD "Cartao SD inic." -#define MSG_CNG_SDCARD "Cartao SD trocado -#define MSG_ZPROBE_OUT "Sensor fora d base" +#define MSG_INIT_SDCARD "Inici. cartao SD" +#define MSG_CNG_SDCARD "Trocar cartao SD" +#define MSG_ZPROBE_OUT "Sensor fora/base" #define MSG_POSITION_UNKNOWN "XY antes de Z" #define MSG_ZPROBE_ZOFFSET "Desvio Z" #define MSG_BABYSTEP_X "Babystep X" #define MSG_BABYSTEP_Y "Babystep Y" #define MSG_BABYSTEP_Z "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort." +#define MSG_ENDSTOP_ABORT "Fim de curso" #define MSG_END_HOUR "horas" #define MSG_END_MINUTE "minutos" diff --git a/Marlin/language_pt_utf8.h b/Marlin/language_pt_utf8.h new file mode 100644 index 0000000000000000000000000000000000000000..f1c8de02fddc1f68233afafc02e9445fe9c7bcc9 --- /dev/null +++ b/Marlin/language_pt_utf8.h @@ -0,0 +1,140 @@ +/** + * Portuguese + * + * LCD Menu Messages + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language + * + */ +#ifndef LANGUAGE_PT_UTF_H +#define LANGUAGE_PT_UTF_H + +#define MAPPER_NON +// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h +//#define SIMULATE_ROMFONT +#define DISPLAY_CHARSET_ISO10646_1 + +#define WELCOME_MSG MACHINE_NAME " pronto." +#define MSG_SD_INSERTED "Cartão inserido" +#define MSG_SD_REMOVED "Cartão removido" +#define MSG_MAIN "Menu principal" +#define MSG_AUTOSTART "Autostart" +#define MSG_DISABLE_STEPPERS "Desactivar motores" +#define MSG_AUTO_HOME "Ir para origem" +#define MSG_LEVEL_BED_HOMING "Indo para origem" +#define MSG_SET_HOME_OFFSETS "Definir desvio" +#define MSG_SET_ORIGIN "Definir origem" +#define MSG_PREHEAT_PLA "Pre-aquecer PLA" +#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA" +#define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo" +#define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base" +#define MSG_PREHEAT_PLA_SETTINGS "Definições PLA" +#define MSG_PREHEAT_ABS "Pre-aquecer ABS" +#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS " +#define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo" +#define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base" +#define MSG_PREHEAT_ABS_SETTINGS "Definições ABS" +#define MSG_COOLDOWN "Arrefecer" +#define MSG_SWITCH_PS_ON "Ligar" +#define MSG_SWITCH_PS_OFF "Desligar" +#define MSG_EXTRUDE "Extrudir" +#define MSG_RETRACT "Retrair" +#define MSG_MOVE_AXIS "Mover eixo" +#define MSG_MOVE_X "Mover X" +#define MSG_MOVE_Y "Mover Y" +#define MSG_MOVE_Z "Mover Z" +#define MSG_MOVE_E "Mover Extrusor" +#define MSG_MOVE_01MM "Mover 0.1mm" +#define MSG_MOVE_1MM "Mover 1mm" +#define MSG_MOVE_10MM "Mover 10mm" +#define MSG_SPEED "Velocidade" +#define MSG_NOZZLE LCD_STR_THERMOMETER " Bico" +#define MSG_BED LCD_STR_THERMOMETER " Base" +#define MSG_FAN_SPEED "Vel. ventoinha" +#define MSG_FLOW "Fluxo" +#define MSG_CONTROL "Controlo" +#define MSG_MIN LCD_STR_THERMOMETER " Min" +#define MSG_MAX LCD_STR_THERMOMETER " Max" +#define MSG_FACTOR LCD_STR_THERMOMETER " Fact" +#define MSG_AUTOTEMP "Temp. Automática" +#define MSG_ON "On " +#define MSG_OFF "Off" +#define MSG_PID_P "PID-P" +#define MSG_PID_I "PID-I" +#define MSG_PID_D "PID-D" +#define MSG_PID_C "PID-C" +#define MSG_E1 "E1" +#define MSG_E2 "E2" +#define MSG_E3 "E3" +#define MSG_E4 "E4" +#define MSG_ACC "Acc" +#define MSG_VXY_JERK "Vxy-jerk" +#define MSG_VZ_JERK "Vz-jerk" +#define MSG_VE_JERK "Ve-jerk" +#define MSG_VMAX " Vmax " +#define MSG_X "x" +#define MSG_Y "y" +#define MSG_Z "z" +#define MSG_E "e" +#define MSG_VMIN "Vmin" +#define MSG_VTRAV_MIN "VTrav min" +#define MSG_AMAX "Amax " +#define MSG_A_RETRACT "A-retract" +#define MSG_XSTEPS "X passo/mm" +#define MSG_YSTEPS "Y passo/mm" +#define MSG_ZSTEPS "Z passo/mm" +#define MSG_ESTEPS "E passo/mm" +#define MSG_TEMPERATURE "Temperatura" +#define MSG_MOTION "Movimento" +#define MSG_VOLUMETRIC "Filamento" +#define MSG_VOLUMETRIC_ENABLED "E em mm3" +#define MSG_FILAMENT_DIAM "Fil. Diam." +#define MSG_CONTRAST "Contraste" +#define MSG_STORE_EPROM "Guardar na memoria" +#define MSG_LOAD_EPROM "Carregar da memoria" +#define MSG_RESTORE_FAILSAFE "Rest. de emergen." +#define MSG_REFRESH LCD_STR_REFRESH " Recarregar" +#define MSG_WATCH "Monitorizar" +#define MSG_PREPARE "Preparar" +#define MSG_TUNE "Afinar" +#define MSG_PAUSE_PRINT "Pausar impressão" +#define MSG_RESUME_PRINT "Retomar impressão" +#define MSG_STOP_PRINT "Parar impressão" +#define MSG_CARD_MENU "Imprimir do SD" +#define MSG_NO_CARD "Sem cartão SD" +#define MSG_DWELL "Em espera..." +#define MSG_USERWAIT "A espera de ordem" +#define MSG_RESUMING "Retomando impressão" +#define MSG_PRINT_ABORTED "Impressão cancelada" +#define MSG_NO_MOVE "Sem movimento" +#define MSG_KILLED "EMERGÊNCIA. " +#define MSG_STOPPED "PARADO. " +#define MSG_CONTROL_RETRACT " Retrair mm" +#define MSG_CONTROL_RETRACT_SWAP "Troca Retrair mm" +#define MSG_CONTROL_RETRACTF " Retrair V" +#define MSG_CONTROL_RETRACT_ZLIFT " Levantar mm" +#define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Troca DesRet +mm" +#define MSG_CONTROL_RETRACT_RECOVERF " DesRet V" +#define MSG_AUTORETRACT " AutoRetr." +#define MSG_FILAMENTCHANGE "Trocar filamento" +#define MSG_INIT_SDCARD "Inici. cartão SD" +#define MSG_CNG_SDCARD "Trocar cartão SD" +#define MSG_ZPROBE_OUT "Sensor fora/base" +#define MSG_POSITION_UNKNOWN "XY antes de Z" +#define MSG_ZPROBE_ZOFFSET "Desvio Z" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_BABYSTEP_Z "Babystep Z" +#define MSG_ENDSTOP_ABORT "Fim de curso" +#define MSG_END_HOUR "horas" +#define MSG_END_MINUTE "minutos" + +#if ENABLED(DELTA_CALIBRATION_MENU) + #define MSG_DELTA_CALIBRATE "Calibração Delta" + #define MSG_DELTA_CALIBRATE_X "Calibrar X" + #define MSG_DELTA_CALIBRATE_Y "Calibrar Y" + #define MSG_DELTA_CALIBRATE_Z "Calibrar Z" + #define MSG_DELTA_CALIBRATE_CENTER "Calibrar Centro" +#endif // DELTA_CALIBRATION_MENU + +#endif // LANGUAGE_PT_UTF_H diff --git a/Marlin/language_ru.h b/Marlin/language_ru.h index a5228e2bc241645ea92e633d45956d9ee0460973..98c5b7976f0c94b91032d39c267278f9d1326896 100644 --- a/Marlin/language_ru.h +++ b/Marlin/language_ru.h @@ -2,7 +2,7 @@ * Russian * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_RU_H @@ -20,6 +20,7 @@ #define MSG_AUTOSTART "Автостарт" #define MSG_DISABLE_STEPPERS "Выкл. двигатели" #define MSG_AUTO_HOME "Парковка" +#define MSG_LEVEL_BED_HOMING "Homing" #define MSG_SET_HOME_OFFSETS "Запомнить парковку" #define MSG_SET_ORIGIN "Запомнить ноль" #define MSG_PREHEAT_PLA "Преднагрев PLA" diff --git a/Marlin/language_test.h b/Marlin/language_test.h index 0135a5d95794106e7235f69585a8ac680df01af7..08ac1986be4b343de61018b490b468f8c76e61d3 100644 --- a/Marlin/language_test.h +++ b/Marlin/language_test.h @@ -2,7 +2,7 @@ * TEST * * LCD Menu Messages - * See also documentation/LCDLanguageFont.md + * See also https://github.com/MarlinFirmware/Marlin/wiki/LCD-Language * */ #ifndef LANGUAGE_TEST_H @@ -25,7 +25,7 @@ // impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system). -#define MAPPER_NON // For direct asci codes ( until now all languages except ru, de, fi, kana_utf8, ... ) +#define MAPPER_NON // For direct ascii codes ( until now all languages except ru, de, fi, kana_utf8, ... ) //#define MAPPER_C2C3 // For most European languages when language file is in utf8 //#define MAPPER_D0D1 // For Cyrillic //#define MAPPER_E382E383 // For Katakana diff --git a/Marlin/macros.h b/Marlin/macros.h index 09b6f1933fc3e778cedfc8bc62b751ea4dd4e7fb..f3c96de898fe07e5eb87e54a1a85d1562072e1f6 100644 --- a/Marlin/macros.h +++ b/Marlin/macros.h @@ -1,10 +1,15 @@ #ifndef MACROS_H #define MACROS_H +// Macros to make a string from a macro +#define STRINGIFY_(n) #n +#define STRINGIFY(n) STRINGIFY_(n) + // Macros for bit masks -#define BIT(b) (1<<(b)) -#define TEST(n,b) (((n)&BIT(b))!=0) -#define SET_BIT(n,b,value) (n) ^= ((-value)^(n)) & (BIT(b)) +#define TEST(n,b) (((n)&_BV(b))!=0) +#define SBI(n,b) (n |= _BV(b)) +#define CBI(n,b) (n &= ~_BV(b)) +#define SET_BIT(n,b,value) (n) ^= ((-value)^(n)) & (_BV(b)) // Macros for maths shortcuts #define RADIANS(d) ((d)*M_PI/180.0) @@ -16,9 +21,11 @@ // Macros to support option testing #define _CAT(a, ...) a ## __VA_ARGS__ -#define SWITCH_ENABLED_0 0 -#define SWITCH_ENABLED_1 1 -#define SWITCH_ENABLED_ 1 +#define SWITCH_ENABLED_false 0 +#define SWITCH_ENABLED_true 1 +#define SWITCH_ENABLED_0 0 +#define SWITCH_ENABLED_1 1 +#define SWITCH_ENABLED_ 1 #define ENABLED(b) _CAT(SWITCH_ENABLED_, b) #define DISABLED(b) (!_CAT(SWITCH_ENABLED_, b)) diff --git a/Marlin/mesh_bed_leveling.h b/Marlin/mesh_bed_leveling.h index cb02655ea67a17b20679f62ab7fff8f039d7afb8..b18d346db3fc1090cac84a84bb4d833f2831ed03 100644 --- a/Marlin/mesh_bed_leveling.h +++ b/Marlin/mesh_bed_leveling.h @@ -2,8 +2,8 @@ #if ENABLED(MESH_BED_LEVELING) - #define MESH_X_DIST ((MESH_MAX_X - MESH_MIN_X)/(MESH_NUM_X_POINTS - 1)) - #define MESH_Y_DIST ((MESH_MAX_Y - MESH_MIN_Y)/(MESH_NUM_Y_POINTS - 1)) + #define MESH_X_DIST ((MESH_MAX_X - (MESH_MIN_X))/(MESH_NUM_X_POINTS - 1)) + #define MESH_Y_DIST ((MESH_MAX_Y - (MESH_MIN_Y))/(MESH_NUM_Y_POINTS - 1)) class mesh_bed_leveling { public: @@ -14,8 +14,8 @@ void reset(); - float get_x(int i) { return MESH_MIN_X + MESH_X_DIST * i; } - float get_y(int i) { return MESH_MIN_Y + MESH_Y_DIST * i; } + float get_x(int i) { return MESH_MIN_X + (MESH_X_DIST) * i; } + float get_y(int i) { return MESH_MIN_Y + (MESH_Y_DIST) * i; } void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; } int select_x_index(float x) { diff --git a/Marlin/pins.h b/Marlin/pins.h index 8846b428f08c6478d845ec30f56ab7222668f86f..9df3caba1dce827df794165cdedb303494796d77 100644 --- a/Marlin/pins.h +++ b/Marlin/pins.h @@ -16,7 +16,6 @@ #define E0_MS2_PIN -1 #define E1_MS1_PIN -1 #define E1_MS2_PIN -1 -#define DIGIPOTSS_PIN -1 #define HEATER_3_PIN -1 #define TEMP_3_PIN -1 @@ -39,11 +38,9 @@ #elif MB(RAMPS_13_EEB) || MB(RAMPS_13_EFF) || MB(RAMPS_13_EEF) || MB(RAMPS_13_SF) #include "pins_RAMPS_13.h" #elif MB(RAMPS_14_EFB) - #define IS_RAMPS_14 - #include "pins_RAMPS_13_EFB.h" + #include "pins_RAMPS_14_EFB.h" #elif MB(RAMPS_14_EEB) || MB(RAMPS_14_EFF) || MB(RAMPS_14_EEF) || MB(RAMPS_14_SF) - #define IS_RAMPS_14 - #include "pins_RAMPS_13.h" + #include "pins_RAMPS_14.h" #elif MB(GEN6) #include "pins_GEN6.h" #elif MB(GEN6_DELUXE) @@ -80,6 +77,8 @@ #include "pins_RUMBA.h" #elif MB(PRINTRBOARD) #include "pins_PRINTRBOARD.h" +#elif MB(PRINTRBOARD_REVF) + #include "pins_PRINTRBOARD_REVF.h" #elif MB(BRAINWAVE) #include "pins_BRAINWAVE.h" #elif MB(BRAINWAVE_PRO) @@ -115,7 +114,7 @@ #elif MB(LEAPFROG) #include "pins_LEAPFROG.h" #elif MB(BAM_DICE) - #include "pins_RAMPS_13.h" + #include "pins_RAMPS_14.h" #elif MB(BAM_DICE_DUE) #include "pins_BAM_DICE_DUE.h" #elif MB(FELIX2) @@ -126,8 +125,12 @@ #include "pins_RIGIDBOARD.h" #elif MB(MEGACONTROLLER) #include "pins_MEGACONTROLLER.h" +#elif MB(BQ_ZUM_MEGA_3D) + #include "pins_BQ_ZUM_MEGA_3D.h" #elif MB(99) #include "pins_99.h" +#elif MB(AJ4P) + #include "pins_AJ4P.h" #else #error Unknown MOTHERBOARD value set in Configuration.h #endif @@ -218,6 +221,7 @@ #endif #if ENABLED(DISABLE_YMAX_ENDSTOP) + #undef Y_MAX_PIN #define Y_MAX_PIN -1 #endif @@ -236,16 +240,26 @@ #define Z_MIN_PIN -1 #endif +// +// Dual Y and Dual Z support +// These options are mutually-exclusive +// + +#define __EPIN(p,q) E##p##_##q##_PIN +#define _EPIN(p,q) __EPIN(p,q) + +// The Y2 axis, if any, should be the next open extruder port #ifndef Y2_STEP_PIN - #define Y2_STEP_PIN E1_STEP_PIN - #define Y2_DIR_PIN E1_DIR_PIN - #define Y2_ENABLE_PIN E1_ENABLE_PIN + #define Y2_STEP_PIN _EPIN(EXTRUDERS, STEP) + #define Y2_DIR_PIN _EPIN(EXTRUDERS, DIR) + #define Y2_ENABLE_PIN _EPIN(EXTRUDERS, ENABLE) #endif +// The Z2 axis, if any, should be the next open extruder port #ifndef Z2_STEP_PIN - #define Z2_STEP_PIN E1_STEP_PIN - #define Z2_DIR_PIN E1_DIR_PIN - #define Z2_ENABLE_PIN E1_ENABLE_PIN + #define Z2_STEP_PIN _EPIN(EXTRUDERS, STEP) + #define Z2_DIR_PIN _EPIN(EXTRUDERS, DIR) + #define Z2_ENABLE_PIN _EPIN(EXTRUDERS, ENABLE) #endif #define SENSITIVE_PINS { 0, 1, \ @@ -257,7 +271,7 @@ analogInputToDigitalPin(TEMP_BED_PIN) \ } -#define HAS_DIGIPOTSS (DIGIPOTSS_PIN >= 0) +#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) #endif //__PINS_H diff --git a/Marlin/pins_3DRAG.h b/Marlin/pins_3DRAG.h index 26764720c4ae44db947e2185be52af20ce3945d1..3d22a248c9c9d902a806988f2a037c3e51c976e2 100644 --- a/Marlin/pins_3DRAG.h +++ b/Marlin/pins_3DRAG.h @@ -1,8 +1,8 @@ /** - * 3DRAG (and K8200) Arduino Mega with RAMPS v1.3 pin assignments + * 3DRAG (and K8200) Arduino Mega with RAMPS v1.4 pin assignments */ -#include "pins_RAMPS_13.h" +#include "pins_RAMPS_14.h" #undef Z_ENABLE_PIN #define Z_ENABLE_PIN 63 diff --git a/Marlin/pins_5DPRINT.h b/Marlin/pins_5DPRINT.h index 56281ea21ac73c775e1cc2e64837ce3cedd3d450..43b4a9f09be7a215a8a28c7bca561fa33584fe2f 100644 --- a/Marlin/pins_5DPRINT.h +++ b/Marlin/pins_5DPRINT.h @@ -47,7 +47,6 @@ #define LED_PIN -1 #define PS_ON_PIN -1 #define KILL_PIN -1 -#define ALARM_PIN -1 // The SDSS pin uses a different pin mapping from file Sd2PinMap.h #define SDSS 20 diff --git a/Marlin/pins_A4JP.h b/Marlin/pins_A4JP.h new file mode 100644 index 0000000000000000000000000000000000000000..d45b315594b2083186af886fbc3e235bc75f8af1 --- /dev/null +++ b/Marlin/pins_A4JP.h @@ -0,0 +1,138 @@ +/************************************************ + * Rambo pin assignments MODIFIED FOR A4JP + ************************************************/ + +#ifndef __AVR_ATmega2560__ + #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. +#endif + +// Servo support +#define SERVO0_PIN 22 // Motor header MX1 +#define SERVO1_PIN 23 // Motor header MX2 +#define SERVO2_PIN 24 // Motor header MX3 +#define SERVO3_PIN 5 // PWM header pin 5 + +#if ENABLED(Z_PROBE_SLED) + #define SLED_PIN -1 +#endif + +#undef X_MS1_PIN +#undef X_MS2_PIN +#undef Y_MS1_PIN +#undef Y_MS2_PIN +#undef Z_MS1_PIN +#undef Z_MS2_PIN +#undef E0_MS1_PIN +#undef E0_MS2_PIN +#undef E1_MS1_PIN +#undef E1_MS2_PIN + +#undef DIGIPOTSS_PIN +//Fan_2 2 + +/***************** +#if ENABLED(ULTRA_LCD) + + #define KILL_PIN -1 //was 80 Glen maybe a mistake + +#endif // ULTRA_LCD */ + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 44 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 70 + #define DOGLCD_CS 71 + #define LCD_SCREEN_ROT_180 + + #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board + + #if ENABLED(TEMP_STAT_LEDS) + #define STAT_LED_RED 22 + #define STAT_LED_BLUE 32 + #endif +#endif // VIKI2/miniVIKI + +#if ENABLED(FILAMENT_SENSOR) + //Filip added pin for Filament sensor analog input + #define FILWIDTH_PIN 3 +#endif + +/************************************************ + * Rambo pin assignments old + ************************************************/ + +#define LARGE_FLASH true +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_MIN_PIN 12 +#define X_MAX_PIN 24 +#define X_ENABLE_PIN 29 +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 23 +#define Y_ENABLE_PIN 28 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 30 +#define Z_ENABLE_PIN 27 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 + +#define HEATER_BED_PIN 3 +#define TEMP_BED_PIN 7 //2014/02/04 0:T0 / 1:T1 / 2:T2 / 7:T3 +#define HEATER_0_PIN 9 +#define TEMP_0_PIN 0 +#define HEATER_1_PIN 7 +#define TEMP_1_PIN -1 +#define HEATER_2_PIN -1 +#define TEMP_2_PIN -1 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 42 +#define E1_ENABLE_PIN 25 +#define E1_MS1_PIN 63 +#define E1_MS2_PIN 64 + +#define DIGIPOTSS_PIN 38 +#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping + +#define SDPOWER -1 +#define SDSS 53 +#define LED_PIN 13 +#define FAN_PIN 8 +#define PS_ON_PIN 4 +#define KILL_PIN -1 +#define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. +#define FAN_0_PIN 6 //Glen +#define FAN_1_PIN 2 //Glen + +// 2015/12/23 + +#define LCD_PINS_RS 70 //ext2_5 +#define LCD_PINS_ENABLE 71 //ext2_7 +#define LCD_PINS_D4 72 ///////Ext2 9 ? +#define LCD_PINS_D5 73 ///////Ext2 11 ? +#define LCD_PINS_D6 74 //ext2_13 +#define LCD_PINS_D7 75 ///////Ext2 15 ? +#define BEEPER_PIN -1 + +#define BTN_HOME 80 //ext_16 +#define BTN_CENTER 81 //ext_14 +#define BTN_ENC BTN_CENTER +#define BTN_RIGHT 82 //ext_12 +#define BTN_LEFT 83 //ext_10 +#define BTN_UP 84 //ext2_8 +#define BTN_DOWN 85 //ext2_6 + +#define HOME_PIN BTN_HOME diff --git a/Marlin/pins_AZTEEG_X3.h b/Marlin/pins_AZTEEG_X3.h index ca236066064f479d484a36230238e47cd41b902f..a41797b39a58172a6efb974e1a4c49a52570caab 100644 --- a/Marlin/pins_AZTEEG_X3.h +++ b/Marlin/pins_AZTEEG_X3.h @@ -1,8 +1,8 @@ /** - * AZTEEG_X3 Arduino Mega with RAMPS v1.3 pin assignments + * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments */ -#include "pins_RAMPS_13_EFB.h" +#include "pins_RAMPS_14_EFB.h" //LCD Pins// diff --git a/Marlin/pins_AZTEEG_X3_PRO.h b/Marlin/pins_AZTEEG_X3_PRO.h index 3e7c911a81cb8d4e73974371f8cbc2e267c0e292..6675ab3d32a8d568b562cbe571dc177ec4c28166 100644 --- a/Marlin/pins_AZTEEG_X3_PRO.h +++ b/Marlin/pins_AZTEEG_X3_PRO.h @@ -2,7 +2,7 @@ * AZTEEG_X3_PRO (Arduino Mega) pin assignments */ -#include "pins_RAMPS_13.h" +#include "pins_RAMPS_14.h" #undef FAN_PIN #define FAN_PIN 6 //Part Cooling System diff --git a/Marlin/pins_BAM_DICE_DUE.h b/Marlin/pins_BAM_DICE_DUE.h index 29d6109ae696dbe1a0ae9ef14e38ec0e46088078..2abe3248700cca4dcfff5697d69f6d7121d95257 100644 --- a/Marlin/pins_BAM_DICE_DUE.h +++ b/Marlin/pins_BAM_DICE_DUE.h @@ -2,7 +2,7 @@ * BAM&DICE Due (Arduino Mega) pin assignments */ -#include "pins_RAMPS_13_EFB.h" +#include "pins_RAMPS_14_EFB.h" #undef TEMP_0_PIN #undef TEMP_1_PIN diff --git a/Marlin/pins_BQ_ZUM_MEGA_3D.h b/Marlin/pins_BQ_ZUM_MEGA_3D.h new file mode 100644 index 0000000000000000000000000000000000000000..c6604fcd9efe2fecc74228d5143a65a5246564c7 --- /dev/null +++ b/Marlin/pins_BQ_ZUM_MEGA_3D.h @@ -0,0 +1,62 @@ +/** + * bq ZUM Mega 3D board definition + */ + +#ifndef __AVR_ATmega2560__ + #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. +#endif + +#include "pins_RAMPS_13.h" + +#undef X_MAX_PIN +#define X_MAX_PIN 79 // 2 + +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 77 // 62 + +#undef FAN_PIN +#define FAN_PIN 12 // 4 + +#undef HEATER_0_PIN +#define HEATER_0_PIN 9 // 10 + +#undef HEATER_1_PIN +#define HEATER_1_PIN 10 // 9 + +#undef TEMP_1_PIN +#define TEMP_1_PIN 14 // 15 + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 15 // 14 + +#define DIGIPOTSS_PIN 22 +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } + +#define FAN1_PIN 7 + +#undef PS_ON_PIN // 12 +#define PS_ON_PIN 81 // External Power Supply + +#if ENABLED(BQ_LCD_SMART_CONTROLLER) // Most similar to REPRAP_DISCOUNT_SMART_CONTROLLER + #define KILL_PIN 41 + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define LCD_PIN_BL 39 + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + + #define SD_DETECT_PIN 49 +#endif + +#if ENABLED(AUTO_BED_LEVELING_FEATURE) + #undef Z_MIN_PIN + #undef Z_MAX_PIN + #define Z_MIN_PIN 19 // IND_S_5V + #define Z_MAX_PIN 18 // Z-MIN Label +#endif diff --git a/Marlin/pins_BRAINWAVE.h b/Marlin/pins_BRAINWAVE.h index c95a2b07c5699eb838d1bc1dee6c22a266030e2e..34360a909a792f06300f00dbe3c236cad65c107d 100644 --- a/Marlin/pins_BRAINWAVE.h +++ b/Marlin/pins_BRAINWAVE.h @@ -48,7 +48,6 @@ #define LED_PIN 39 #define PS_ON_PIN -1 #define KILL_PIN -1 -#define ALARM_PIN -1 #if DISABLED(SDSUPPORT) // these pins are defined in the SD library if building with SD support diff --git a/Marlin/pins_BRAINWAVE_PRO.h b/Marlin/pins_BRAINWAVE_PRO.h index 4f954b6b1c4bfdb2937ae281d9f8545c97accf6b..42eafb460fa88e00358c8be0dd58dfcf6081a84a 100644 --- a/Marlin/pins_BRAINWAVE_PRO.h +++ b/Marlin/pins_BRAINWAVE_PRO.h @@ -31,7 +31,7 @@ #define Z_DIR_PIN 28 #define Z_ENABLE_PIN 37 #define Z_MAX_PIN 36 -#define Z_MIN_PIN 17 // Bed Z probe +#define Z_MIN_PROBE_PIN 17 // Bed Z probe #define E0_STEP_PIN 35 #define E0_DIR_PIN 34 @@ -53,7 +53,6 @@ #define LED_PIN 19 #define PS_ON_PIN -1 #define KILL_PIN -1 -#define ALARM_PIN -1 #define SD_DETECT_PIN 12 #if DISABLED(SDSUPPORT) diff --git a/Marlin/pins_FELIX2.h b/Marlin/pins_FELIX2.h index f0e9942a7516f0b727ad18b391ec4483b9737760..466b7391326490b4201dc78a201421105a9169b8 100644 --- a/Marlin/pins_FELIX2.h +++ b/Marlin/pins_FELIX2.h @@ -1,8 +1,8 @@ /** - * FELIXprinters v2.0/3.0 (RAMPS v1.3) pin assignments + * FELIXprinters v2.0/3.0 (RAMPS v1.4) pin assignments */ -#include "pins_RAMPS_13_EFB.h" +#include "pins_RAMPS_14_EFB.h" #undef HEATER_1_PIN #define HEATER_1_PIN 7 // EXTRUDER 2 diff --git a/Marlin/pins_MEGACONTROLLER.h b/Marlin/pins_MEGACONTROLLER.h index c595a88b83b06fb54905d4c230a3a7d3072eb5f8..ce4a8b0da5dfda4c8f1bd58a17a92a53200e5bcd 100644 --- a/Marlin/pins_MEGACONTROLLER.h +++ b/Marlin/pins_MEGACONTROLLER.h @@ -49,7 +49,7 @@ #define FAN1_PIN 35 #define FAN2_PIN 36 #define FAN_SOFT_PWM -#define CONTROLLERFAN_PIN 36 +#define CONTROLLERFAN_PIN FAN2_PIN #define PS_ON_PIN -1 #define KILL_PIN -1 diff --git a/Marlin/pins_MELZI_MAKR3D.h b/Marlin/pins_MELZI_MAKR3D.h index dad313fdfaf9267a5be67ace6fc7f7ab76b05e27..e750d3f830fa5d23b9349c2f60cf8aadd9150ec2 100644 --- a/Marlin/pins_MELZI_MAKR3D.h +++ b/Marlin/pins_MELZI_MAKR3D.h @@ -3,7 +3,7 @@ */ #undef MOTHERBOARD -#define MOTHERBOARD MELZI +#define MOTHERBOARD BOARD_MELZI #define SANGUINOLOLU_V_1_2 #if defined(__AVR_ATmega1284P__) diff --git a/Marlin/pins_MKS_BASE.h b/Marlin/pins_MKS_BASE.h index 3cf5be13a901d2fa368c7f66d52f8d95855d7dd1..cbb454d865dc1068b9079ab34e1f0b3cbb3b44a5 100644 --- a/Marlin/pins_MKS_BASE.h +++ b/Marlin/pins_MKS_BASE.h @@ -2,7 +2,7 @@ * MKS BASE 1.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments */ -#include "pins_RAMPS_13_EFB.h" +#include "pins_RAMPS_14_EFB.h" #undef HEATER_1_PIN #define HEATER_1_PIN 7 diff --git a/Marlin/pins_PRINTRBOARD.h b/Marlin/pins_PRINTRBOARD.h index 2b178aa33035affdb4d77600e23d55ae4d9c501b..8197d76181a0991a1b786dc7ac5e61a18463e1d8 100644 --- a/Marlin/pins_PRINTRBOARD.h +++ b/Marlin/pins_PRINTRBOARD.h @@ -15,6 +15,9 @@ #define LARGE_FLASH true +// Disable JTAG pins so they can be used for the Extrudrboard +#define DISABLE_JTAG true + #define X_STEP_PIN 0 #define X_DIR_PIN 1 #define X_ENABLE_PIN 39 @@ -64,11 +67,10 @@ ////LCD Pin Setup//// #define SDPOWER -1 -#define SDSS 8 +#define SDSS 26 #define LED_PIN -1 #define PS_ON_PIN -1 #define KILL_PIN -1 -#define ALARM_PIN -1 #if DISABLED(SDSUPPORT) // these pins are defined in the SD library if building with SD support @@ -80,15 +82,29 @@ #if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) //we have no buzzer installed #define BEEPER_PIN -1 + //LCD Pins #if ENABLED(LCD_I2C_PANELOLU2) #define BTN_EN1 27 //RX1 - fastio.h pin mapping 27 #define BTN_EN2 26 //TX1 - fastio.h pin mapping 26 #define BTN_ENC 43 //A3 - fastio.h pin mapping 43 #define SDSS 40 //use SD card on Panelolu2 (Teensyduino pin mapping) + #else + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 18//the click #endif // LCD_I2C_PANELOLU2 + //not connected to a pin #define SD_DETECT_PIN -1 + + #define LCD_PINS_RS 9 + #define LCD_PINS_ENABLE 8 + #define LCD_PINS_D4 7 + #define LCD_PINS_D5 6 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 4 + #endif // ULTRA_LCD && NEWPANEL #if ENABLED(VIKI2) || ENABLED(miniVIKI) @@ -105,7 +121,6 @@ #define SDSS 45 #define SD_DETECT_PIN -1 // FastIO (Manual says 72 I'm not certain cause I can't test) - #if ENABLED(TEMP_STAT_LEDS) #define STAT_LED_RED 12 //Non-FastIO #define STAT_LED_BLUE 10 //Non-FastIO diff --git a/Marlin/pins_PRINTRBOARD_REVF.h b/Marlin/pins_PRINTRBOARD_REVF.h new file mode 100644 index 0000000000000000000000000000000000000000..976ea505f570d1d1e22ae42e05fb2276c70caf7e --- /dev/null +++ b/Marlin/pins_PRINTRBOARD_REVF.h @@ -0,0 +1,134 @@ +/** + * Printrboard pin assignments (AT90USB1286) + * Requires the Teensyduino software with Teensy++ 2.0 selected in Arduino IDE! + * http://www.pjrc.com/teensy/teensyduino.html + * See http://reprap.org/wiki/Printrboard for more info + */ + +#ifndef __AVR_AT90USB1286__ + #error Oops! Make sure you have 'Teensy++ 2.0' selected from the 'Tools -> Boards' menu. +#endif + +#if ENABLED(AT90USBxx_TEENSYPP_ASSIGNMENTS) // use Teensyduino Teensy++2.0 pin assignments instead of Marlin traditional. + #error These Printrboard assignments depend on traditional Marlin assignments, not AT90USBxx_TEENSYPP_ASSIGNMENTS in fastio.h +#endif + +#define LARGE_FLASH true + +#define X_STEP_PIN 0 +#define X_DIR_PIN 1 +#define X_ENABLE_PIN 39 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 38 + +#define Z_STEP_PIN 4 +#define Z_DIR_PIN 5 +#define Z_ENABLE_PIN 23 + +#define E0_STEP_PIN 6 +#define E0_DIR_PIN 7 +#define E0_ENABLE_PIN 19 + +#define HEATER_0_PIN 21 // Extruder +#define HEATER_1_PIN 46 +#define HEATER_2_PIN 47 +#define HEATER_BED_PIN 20 + +// If soft or fast PWM is off then use Teensyduino pin numbering, Marlin +// fastio pin numbering otherwise +#if ENABLED(FAN_SOFT_PWM) || ENABLED(FAST_PWM_FAN) + #define FAN_PIN 22 +#else + #define FAN_PIN 16 +#endif + +#define X_STOP_PIN 35 +#define Y_STOP_PIN 12 +#define Z_STOP_PIN 36 + +#define TEMP_0_PIN 1 // Extruder / Analog pin numbering +#define TEMP_BED_PIN 0 // Bed / Analog pin numbering + +#if ENABLED(FILAMENT_SENSOR) + #define FILWIDTH_PIN 2 +#endif + +#define TEMP_1_PIN -1 +#define TEMP_2_PIN -1 + +////LCD Pin Setup//// + +#define SDPOWER -1 +#define SDSS 20 // Teensylu pin mapping +#define LED_PIN -1 +#define PS_ON_PIN -1 +#define KILL_PIN -1 +#define ALARM_PIN -1 + +// uncomment to enable an I2C based DAC like on the Printrboard REVF +#define DAC_STEPPER_CURRENT +// Number of channels available for DAC, For Printrboar REVF there are 4 +#define DAC_STEPPER_ORDER {3,2,1,0} + +#define DAC_STEPPER_SENSE 0.11 +#define DAC_STEPPER_ADDRESS 0 +#define DAC_STEPPER_MAX 3520 +#define DAC_STEPPER_VREF 1 //internal Vref, gain 1x = 2.048V +#define DAC_STEPPER_GAIN 0 + +#if DISABLED(SDSUPPORT) + // these pins are defined in the SD library if building with SD support + #define SCK_PIN 9 + #define MISO_PIN 11 + #define MOSI_PIN 10 +#endif + +#if ENABLED(ULTRA_LCD) + #define BEEPER_PIN -1 + + #define LCD_PINS_RS 9 + #define LCD_PINS_ENABLE 8 + #define LCD_PINS_D4 7 + #define LCD_PINS_D5 6 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 4 + + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 18//the click + + #define BLEN_C 2 + #define BLEN_B 1 + #define BLEN_A 0 + + #define SD_DETECT_PIN -1 + + //encoder rotation values + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 +#endif + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 32 //FastIO + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 42 //Non-FastIO + #define DOGLCD_CS 43 //Non-FastIO + #define LCD_SCREEN_ROT_180 + + //The encoder and click button (FastIO Pins) + #define BTN_EN1 26 + #define BTN_EN2 27 + #define BTN_ENC 47 //the click switch + + #define SDSS 45 + #define SD_DETECT_PIN -1 // FastIO (Manual says 72 I'm not certain cause I can't test) + + #if ENABLED(TEMP_STAT_LEDS) + #define STAT_LED_RED 12 //Non-FastIO + #define STAT_LED_BLUE 10 //Non-FastIO + #endif +#endif diff --git a/Marlin/pins_RAMBO.h b/Marlin/pins_RAMBO.h index 9cdf2f7bfbb07a4b340212048e2ec2ea2672897e..b70c74a2516278fccf19b763d8a49f18549ef177 100644 --- a/Marlin/pins_RAMBO.h +++ b/Marlin/pins_RAMBO.h @@ -12,7 +12,7 @@ #define SERVO0_PIN 22 // Motor header MX1 #define SERVO1_PIN 23 // Motor header MX2 #define SERVO2_PIN 24 // Motor header MX3 -#define SERVO2_PIN 5 // PWM header pin 5 +#define SERVO3_PIN 5 // PWM header pin 5 #if ENABLED(Z_PROBE_SLED) #define SLED_PIN -1 @@ -82,7 +82,6 @@ #define E1_MS1_PIN 63 #define E1_MS2_PIN 64 -#undef DIGIPOTSS_PIN #define DIGIPOTSS_PIN 38 #define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping diff --git a/Marlin/pins_RAMPS_13.h b/Marlin/pins_RAMPS_13.h index dde95a2ede325aa74941f8559474097932e20cd6..fafb32db3e988ae2096ce55ff9fd05f17905e6eb 100644 --- a/Marlin/pins_RAMPS_13.h +++ b/Marlin/pins_RAMPS_13.h @@ -1,5 +1,5 @@ /** - * Arduino Mega with RAMPS v1.3 v1.4 pin assignments + * Arduino Mega with RAMPS v1.3 pin assignments * * Applies to the following boards: * @@ -9,265 +9,8 @@ * RAMPS_13_EEF (Extruder, Extruder, Fan) * RAMPS_13_SF (Spindle, Controller Fan) * - * RAMPS_14_EFB (Extruder, Fan, Bed) - * RAMPS_14_EEB (Extruder, Extruder, Bed) - * RAMPS_14_EFF (Extruder, Fan, Fan) - * RAMPS_14_EEF (Extruder, Extruder, Fan) - * RAMPS_14_SF (Spindle, Controller Fan) - * - * Other pins_MYBOARD.h files may override these defaults - * - * Differences between - * RAMPS_13 | RAMPS_14 - * 7 | 11 */ -#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) - #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. -#endif - -#define LARGE_FLASH true - -#ifdef IS_RAMPS_14 - #define SERVO0_PIN 11 -#else - #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI -#endif -#define SERVO1_PIN 6 -#define SERVO2_PIN 5 -#define SERVO3_PIN 4 - -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#define X_MIN_PIN 3 -#define X_MAX_PIN 2 - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 - -#define SDPOWER -1 -#define SDSS 53 -#define LED_PIN 13 - -#if ENABLED(FILAMENT_SENSOR) // FMM added for Filament Extruder - // define analog pin for the filament width sensor input - // Use the RAMPS 1.4 Analog input 5 on the AUX2 connector - #define FILWIDTH_PIN 5 -#endif - -#if ENABLED(Z_MIN_PROBE_ENDSTOP) - // Define a pin to use as the signal pin on Arduino for the Z_PROBE endstop. - #define Z_MIN_PROBE_PIN 32 -#endif - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - // define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector - #define FILRUNOUT_PIN 4 -#endif - -#if MB(RAMPS_13_EFF) || ENABLED(IS_RAMPS_EFB) - #define FAN_PIN 9 // (Sprinter config) - #if MB(RAMPS_13_EFF) - #define CONTROLLERFAN_PIN -1 // Pin used for the fan to cool controller - #endif -#elif MB(RAMPS_13_EEF) || MB(RAMPS_13_SF) - #define FAN_PIN 8 -#else - #define FAN_PIN 4 // IO pin. Buffer needed -#endif - -#define PS_ON_PIN 12 - -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) || ENABLED(G3D_PANEL) - #define KILL_PIN 41 -#else - #define KILL_PIN -1 -#endif - -#if MB(RAMPS_13_EFF) - #define HEATER_0_PIN 8 -#else - #define HEATER_0_PIN 10 // EXTRUDER 1 -#endif - -#if MB(RAMPS_13_SF) || ENABLED(IS_RAMPS_EFB) - #define HEATER_1_PIN -1 -#else - #define HEATER_1_PIN 9 // EXTRUDER 2 (FAN On Sprinter) -#endif - -#define HEATER_2_PIN -1 - -#define TEMP_0_PIN 13 // ANALOG NUMBERING -#define TEMP_1_PIN 15 // ANALOG NUMBERING -#define TEMP_2_PIN -1 // ANALOG NUMBERING - -#if MB(RAMPS_13_EFF) || MB(RAMPS_13_EEF) || MB(RAMPS_13_SF) - #define HEATER_BED_PIN -1 // NO BED -#else - #define HEATER_BED_PIN 8 // BED -#endif - -#define TEMP_BED_PIN 14 // ANALOG NUMBERING - -#if ENABLED(Z_PROBE_SLED) - #define SLED_PIN -1 -#endif - -#if ENABLED(ULTRA_LCD) - - #if ENABLED(NEWPANEL) - #if ENABLED(PANEL_ONE) - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 65 - #define LCD_PINS_D5 66 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 64 - #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - #endif - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 // reverse if the encoder turns the wrong way. - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // reverse if the encoder turns the wrong way. - #define BTN_EN2 7 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf - // tells about 40/42. - // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 // reverse if the encoder turns the wrong way. - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_PIN_BL 33 - #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_PIN_BL 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - //#define LCD_CONTRAST 190 - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - //The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 //the click switch - //not connected to a pin - #define SD_DETECT_PIN 49 - - #else - - #define BEEPER_PIN 33 // Beeper on AUX-4 - - // buttons are directly attached using AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 // encoder - #define BTN_EN2 59 // encoder - #define BTN_ENC 63 // enter button - #define SHIFT_OUT 40 // shift register - #define SHIFT_CLK 44 // shift register - #define SHIFT_LD 42 // shift register - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 // the click - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #else - #define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - - #endif - #else // !NEWPANEL (Old-style panel with shift register) - - #define BEEPER_PIN 33 // No Beeper added - - // Buttons are attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #endif // !NEWPANEL - -#endif // ULTRA_LCD - -// SPI for Max6675 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card -#else - #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present -#endif +#define IS_RAMPS_13 -#if DISABLED(SDSUPPORT) - // these pins are defined in the SD library if building with SD support - #define SCK_PIN 52 - #define MISO_PIN 50 - #define MOSI_PIN 51 -#endif +#include "pins_RAMPS_14.h" diff --git a/Marlin/pins_RAMPS_13_EFB.h b/Marlin/pins_RAMPS_13_EFB.h index c75acd8d99553d0aa1f493c19238f2553b00db45..308f2999f889a224d3713f0622f1780dd24f1500 100644 --- a/Marlin/pins_RAMPS_13_EFB.h +++ b/Marlin/pins_RAMPS_13_EFB.h @@ -4,6 +4,6 @@ * RAMPS_13_EFB (Extruder, Fan, Bed) */ -#define IS_RAMPS_EFB +#define IS_RAMPS_13 -#include "pins_RAMPS_13.h" \ No newline at end of file +#include "pins_RAMPS_14_EFB.h" diff --git a/Marlin/pins_RAMPS_14.h b/Marlin/pins_RAMPS_14.h new file mode 100644 index 0000000000000000000000000000000000000000..26159b4da89e9c66236d795eae923e97491edc02 --- /dev/null +++ b/Marlin/pins_RAMPS_14.h @@ -0,0 +1,277 @@ +/** + * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Extruder, Fan, Bed) + * RAMPS_14_EEB (Extruder, Extruder, Bed) + * RAMPS_14_EFF (Extruder, Fan, Fan) + * RAMPS_14_EEF (Extruder, Extruder, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + * RAMPS_13_EFB (Extruder, Fan, Bed) + * RAMPS_13_EEB (Extruder, Extruder, Bed) + * RAMPS_13_EFF (Extruder, Fan, Fan) + * RAMPS_13_EEF (Extruder, Extruder, Fan) + * RAMPS_13_SF (Spindle, Controller Fan) + * + * Other pins_MYBOARD.h files may override these defaults + * + * Differences between + * RAMPS_13 | RAMPS_14 + * 7 | 11 + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. +#endif + +#define LARGE_FLASH true + +#ifdef IS_RAMPS_13 + #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI +#else + #define SERVO0_PIN 11 +#endif +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN 4 + +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 + +#define SDPOWER -1 +#define SDSS 53 +#define LED_PIN 13 + +#if ENABLED(FILAMENT_SENSOR) // FMM added for Filament Extruder + // define analog pin for the filament width sensor input + // Use the RAMPS 1.4 Analog input 5 on the AUX2 connector + #define FILWIDTH_PIN 5 +#endif + +#if ENABLED(Z_MIN_PROBE_ENDSTOP) + // Define a pin to use as the signal pin on Arduino for the Z_PROBE endstop. + #define Z_MIN_PROBE_PIN 32 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + // define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector + #define FILRUNOUT_PIN 4 +#endif + +#if MB(RAMPS_14_EFF) || MB(RAMPS_13_EFF) || ENABLED(IS_RAMPS_EFB) + #define FAN_PIN 9 // (Sprinter config) + #if MB(RAMPS_14_EFF) || MB(RAMPS_13_EFF) + #define CONTROLLERFAN_PIN -1 // Pin used for the fan to cool controller + #endif +#elif MB(RAMPS_14_EEF) || MB(RAMPS_14_SF) || MB(RAMPS_13_EEF) || MB(RAMPS_13_SF) + #define FAN_PIN 8 +#else + #define FAN_PIN 4 // IO pin. Buffer needed +#endif + +#define PS_ON_PIN 12 + +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) || ENABLED(G3D_PANEL) + #define KILL_PIN 41 +#endif + +#if MB(RAMPS_14_EFF) || MB(RAMPS_13_EFF) + #define HEATER_0_PIN 8 +#else + #define HEATER_0_PIN 10 // EXTRUDER 1 +#endif + +#if MB(RAMPS_14_SF) || MB(RAMPS_13_SF) || ENABLED(IS_RAMPS_EFB) + #define HEATER_1_PIN -1 +#else + #define HEATER_1_PIN 9 // EXTRUDER 2 (FAN On Sprinter) +#endif + +#define HEATER_2_PIN -1 + +#define TEMP_0_PIN 13 // ANALOG NUMBERING +#define TEMP_1_PIN 15 // ANALOG NUMBERING +#define TEMP_2_PIN -1 // ANALOG NUMBERING + +#if MB(RAMPS_14_EFF) || MB(RAMPS_14_EEF) || MB(RAMPS_14_SF) || MB(RAMPS_13_EFF) || MB(RAMPS_13_EEF) || MB(RAMPS_13_SF) + #define HEATER_BED_PIN -1 // NO BED +#else + #define HEATER_BED_PIN 8 // BED +#endif + +#define TEMP_BED_PIN 14 // ANALOG NUMBERING + +#if ENABLED(Z_PROBE_SLED) + #define SLED_PIN -1 +#endif + +#if ENABLED(ULTRA_LCD) + + #if ENABLED(NEWPANEL) + #if ENABLED(PANEL_ONE) + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + #else + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #endif + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #elif ENABLED(LCD_I2C_PANELOLU2) + #define BTN_EN1 47 // reverse if the encoder turns the wrong way. + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + #elif ENABLED(LCD_I2C_VIKI) + #define BTN_EN1 22 // reverse if the encoder turns the wrong way. + #define BTN_EN2 7 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf + // tells about 40/42. + // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 // reverse if the encoder turns the wrong way. + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_PIN_BL 33 + #elif ENABLED(MINIPANEL) + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_PIN_BL 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + //The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 //the click switch + //not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + #define BEEPER_PIN 33 // Beeper on AUX-4 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 // encoder + #define BTN_EN2 59 // encoder + #define BTN_ENC 63 // enter button + #define SHIFT_OUT 40 // shift register + #define SHIFT_CLK 44 // shift register + #define SHIFT_LD 42 // shift register + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 // the click + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #else + // #define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #else // !NEWPANEL (Old-style panel with shift register) + + #define BEEPER_PIN 33 // No Beeper added + + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + + #endif // !NEWPANEL + +#endif // ULTRA_LCD + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +#if DISABLED(SDSUPPORT) + // these pins are defined in the SD library if building with SD support + #define SCK_PIN 52 + #define MISO_PIN 50 + #define MOSI_PIN 51 +#endif + +#ifndef KILL_PIN + // #define KILL_PIN -1 +#endif diff --git a/Marlin/pins_RAMPS_14_EFB.h b/Marlin/pins_RAMPS_14_EFB.h new file mode 100644 index 0000000000000000000000000000000000000000..66666d033e527b04b8f2214e6f1e8182b4ce46bb --- /dev/null +++ b/Marlin/pins_RAMPS_14_EFB.h @@ -0,0 +1,9 @@ +/** + * Arduino Mega with RAMPS v1.4 pin assignments + * + * RAMPS_14_EFB (Extruder, Fan, Bed) + */ + +#define IS_RAMPS_EFB + +#include "pins_RAMPS_14.h" \ No newline at end of file diff --git a/Marlin/pins_RAMPS_OLD.h b/Marlin/pins_RAMPS_OLD.h index 6acf56154e7b0182d5320e8a0e84291cea9edc50..c6b52b9296519fe2c8e905841cdd1d515aba5368 100644 --- a/Marlin/pins_RAMPS_OLD.h +++ b/Marlin/pins_RAMPS_OLD.h @@ -54,7 +54,7 @@ #define TEMP_2_PIN -1 #define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! -// SPI for Max6675 Thermocouple +// SPI for Max6675 or Max31855 Thermocouple #if DISABLED(SDSUPPORT) #define MAX6675_SS 66// Do not use pin 53 if there is even the remote possibility of using Display/SD card #else diff --git a/Marlin/pins_RIGIDBOARD.h b/Marlin/pins_RIGIDBOARD.h index 4f8abc12665d260b5ebae3707c01af322ae3a38c..1525e440bd69e22dbfa240532857958d19cd3930 100644 --- a/Marlin/pins_RIGIDBOARD.h +++ b/Marlin/pins_RIGIDBOARD.h @@ -1,11 +1,14 @@ /** - * RIGIDBOARD Arduino Mega with RAMPS v1.3 pin assignments + * RIGIDBOARD Arduino Mega with RAMPS v1.4 pin assignments */ -#include "pins_RAMPS_13.h" +#include "pins_RAMPS_14.h" #if ENABLED(Z_MIN_PROBE_ENDSTOP) - #define Z_MIN_PROBE_PIN 19 + #undef Z_MAX_PIN + #define Z_MAX_PIN -1 + #undef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 // Z-MAX pin J14 End Stops #endif #undef HEATER_0_PIN @@ -25,24 +28,22 @@ #undef BEEPER_PIN #define BEEPER_PIN -1 - #undef SD_DETECT_PIN - #define SD_DETECT_PIN 22 - - // Extra button definitions, substitute for EN1 / EN2 - #define BTN_UP 37 // BTN_EN1 - #define BTN_DWN 35 // BTN_EN2 - #define BTN_LFT 33 - #define BTN_RT 32 - - // Marlin can respond to UP/DOWN by default - // #undef BTN_EN1 - // #undef BTN_EN2 - //#define BTN_EN1 -1 - //#define BTN_EN2 -1 + // Direction buttons + #define BTN_UP 37 + #define BTN_DWN 35 + #define BTN_LFT 33 + #define BTN_RT 32 + // 'R' button #undef BTN_ENC #define BTN_ENC 31 + // Disable encoder + #undef BTN_EN1 + #define BTN_EN1 -1 + #undef BTN_EN2 + #define BTN_EN2 -1 + #undef SD_DETECT_PIN #define SD_DETECT_PIN 22 @@ -59,7 +60,7 @@ #endif -// SPI for Max6675 Thermocouple +// SPI for Max6675 or Max31855 Thermocouple #undef MAX6675_SS #if ENABLED(SDSUPPORT) #define MAX6675_SS 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present diff --git a/Marlin/pins_SAV_MKI.h b/Marlin/pins_SAV_MKI.h index 2bd1ef3e28389d848408918c8633764f8d9e4ef7..d09320f84677a4d6546145b4feca63f182fa77dd 100644 --- a/Marlin/pins_SAV_MKI.h +++ b/Marlin/pins_SAV_MKI.h @@ -82,7 +82,6 @@ #define SDPOWER -1 #define LED_PIN -1 #define PS_ON_PIN -1 -#define ALARM_PIN -1 #define SD_DETECT_PIN -1 #define BEEPER_PIN -1 diff --git a/Marlin/pins_TEENSY2.h b/Marlin/pins_TEENSY2.h index a7adf2641a307a7970491ea3f3a875ad3799a4be..c54edc5cd9ee16c2a2de7df3201e4f70162d4149 100644 --- a/Marlin/pins_TEENSY2.h +++ b/Marlin/pins_TEENSY2.h @@ -91,7 +91,6 @@ #define LED_PIN 6 #define PS_ON_PIN 27 #define KILL_PIN -1 -#define ALARM_PIN -1 #if DISABLED(SDSUPPORT) // these pins are defined in the SD library if building with SD support diff --git a/Marlin/pins_TEENSYLU.h b/Marlin/pins_TEENSYLU.h index 34fd986fddcc6be72a9f671748337367b0c89b92..8bae79bdde4628d6f5ee51aff48703c43667ab99 100644 --- a/Marlin/pins_TEENSYLU.h +++ b/Marlin/pins_TEENSYLU.h @@ -58,7 +58,6 @@ #define LED_PIN -1 #define PS_ON_PIN -1 #define KILL_PIN -1 -#define ALARM_PIN -1 #if DISABLED(SDSUPPORT) // these pins are defined in the SD library if building with SD support diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index b2d91606d5a43a6c88496a94912229a104f5c417..fd8269ddf3310968efabc37788a4e2b6f6dfade8 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -93,6 +93,10 @@ unsigned long axis_steps_per_sqr_second[NUM_AXIS]; bool autotemp_enabled = false; #endif +#if ENABLED(FAN_SOFT_PWM) + extern unsigned char fanSpeedSoftPwm[FAN_COUNT]; +#endif + //=========================================================================== //============ semi-private variables, used in inline functions ============= //=========================================================================== @@ -227,16 +231,17 @@ void planner_reverse_pass_kernel(block_t* previous, block_t* current, block_t* n // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and // check for maximum allowable speed reductions to ensure maximum possible planned speed. - if (current->entry_speed != current->max_entry_speed) { + float max_entry_speed = current->max_entry_speed; + if (current->entry_speed != max_entry_speed) { // If nominal length true, max junction speed is guaranteed to be reached. Only compute // for max allowable speed if block is decelerating and nominal length is false. - if (!current->nominal_length_flag && current->max_entry_speed > next->entry_speed) { - current->entry_speed = min(current->max_entry_speed, + if (!current->nominal_length_flag && max_entry_speed > next->entry_speed) { + current->entry_speed = min(max_entry_speed, max_allowable_speed(-current->acceleration, next->entry_speed, current->millimeters)); } else { - current->entry_speed = current->max_entry_speed; + current->entry_speed = max_entry_speed; } current->recalculate_flag = true; @@ -330,7 +335,7 @@ void planner_recalculate_trapezoids() { // Last/newest block in buffer. Exit speed is set with MINIMUM_PLANNER_SPEED. Always recalculated. if (next) { float nom = next->nominal_speed; - calculate_trapezoid_for_block(next, next->entry_speed / nom, MINIMUM_PLANNER_SPEED / nom); + calculate_trapezoid_for_block(next, next->entry_speed / nom, (MINIMUM_PLANNER_SPEED) / nom); next->recalculate_flag = false; } } @@ -380,7 +385,7 @@ void plan_init() { block_t* block = &block_buffer[block_index]; if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) { float se = (float)block->steps[E_AXIS] / block->step_event_count * block->nominal_speed; // mm/sec; - if (se > high) high = se; + NOLESS(high, se); } block_index = next_block_index(block_index); } @@ -388,8 +393,8 @@ void plan_init() { float t = autotemp_min + high * autotemp_factor; t = constrain(t, autotemp_min, autotemp_max); if (oldt > t) { - t *= (1 - AUTOTEMP_OLDWEIGHT); - t += AUTOTEMP_OLDWEIGHT * oldt; + t *= (1 - (AUTOTEMP_OLDWEIGHT)); + t += (AUTOTEMP_OLDWEIGHT) * oldt; } oldt = t; setTargetHotend0(t); @@ -398,7 +403,12 @@ void plan_init() { void check_axes_activity() { unsigned char axis_active[NUM_AXIS] = { 0 }, - tail_fan_speed = fanSpeed; + tail_fan_speed[FAN_COUNT]; + + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = fanSpeeds[i]; + #endif + #if ENABLED(BARICUDA) unsigned char tail_valve_pressure = ValvePressure, tail_e_to_p_pressure = EtoPPressure; @@ -407,58 +417,105 @@ void check_axes_activity() { block_t* block; if (blocks_queued()) { + uint8_t block_index = block_buffer_tail; - tail_fan_speed = block_buffer[block_index].fan_speed; + + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = block_buffer[block_index].fan_speed[i]; + #endif + #if ENABLED(BARICUDA) block = &block_buffer[block_index]; tail_valve_pressure = block->valve_pressure; tail_e_to_p_pressure = block->e_to_p_pressure; #endif + while (block_index != block_buffer_head) { block = &block_buffer[block_index]; for (int i = 0; i < NUM_AXIS; i++) if (block->steps[i]) axis_active[i]++; block_index = next_block_index(block_index); } } - if (DISABLE_X && !axis_active[X_AXIS]) disable_x(); - if (DISABLE_Y && !axis_active[Y_AXIS]) disable_y(); - if (DISABLE_Z && !axis_active[Z_AXIS]) disable_z(); - if (DISABLE_E && !axis_active[E_AXIS]) { - disable_e0(); - disable_e1(); - disable_e2(); - disable_e3(); - } + #if ENABLED(DISABLE_X) + if (!axis_active[X_AXIS]) disable_x(); + #endif + #if ENABLED(DISABLE_Y) + if (!axis_active[Y_AXIS]) disable_y(); + #endif + #if ENABLED(DISABLE_Z) + if (!axis_active[Z_AXIS]) disable_z(); + #endif + #if ENABLED(DISABLE_E) + if (!axis_active[E_AXIS]) { + disable_e0(); + disable_e1(); + disable_e2(); + disable_e3(); + } + #endif + + #if FAN_COUNT > 0 + + #if defined(FAN_MIN_PWM) + #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? ( FAN_MIN_PWM + (tail_fan_speed[f] * (255 - FAN_MIN_PWM)) / 255 ) : 0) + #else + #define CALC_FAN_SPEED(f) tail_fan_speed[f] + #endif - #if HAS_FAN #ifdef FAN_KICKSTART_TIME - static millis_t fan_kick_end; - if (tail_fan_speed) { - millis_t ms = millis(); - if (fan_kick_end == 0) { - // Just starting up fan - run at full power. - fan_kick_end = ms + FAN_KICKSTART_TIME; - tail_fan_speed = 255; - } - else if (fan_kick_end > ms) - // Fan still spinning up. - tail_fan_speed = 255; - } - else { - fan_kick_end = 0; + + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + + #define KICKSTART_FAN(f) \ + if (tail_fan_speed[f]) { \ + millis_t ms = millis(); \ + if (fan_kick_end[f] == 0) { \ + fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ + tail_fan_speed[f] = 255; \ + } else { \ + if (fan_kick_end[f] > ms) { \ + tail_fan_speed[f] = 255; \ + } \ + } \ + } else { \ + fan_kick_end[f] = 0; \ } + + #if HAS_FAN0 + KICKSTART_FAN(0); + #endif + #if HAS_FAN1 + KICKSTART_FAN(1); + #endif + #if HAS_FAN2 + KICKSTART_FAN(2); + #endif + #endif //FAN_KICKSTART_TIME - #if ENABLED(FAN_MIN_PWM) - #define CALC_FAN_SPEED (tail_fan_speed ? ( FAN_MIN_PWM + (tail_fan_speed * (255 - FAN_MIN_PWM)) / 255 ) : 0) - #else - #define CALC_FAN_SPEED tail_fan_speed - #endif // FAN_MIN_PWM + #if ENABLED(FAN_SOFT_PWM) - fanSpeedSoftPwm = CALC_FAN_SPEED; + #if HAS_FAN0 + fanSpeedSoftPwm[0] = CALC_FAN_SPEED(0); + #endif + #if HAS_FAN1 + fanSpeedSoftPwm[1] = CALC_FAN_SPEED(1); + #endif + #if HAS_FAN2 + fanSpeedSoftPwm[2] = CALC_FAN_SPEED(2); + #endif #else - analogWrite(FAN_PIN, CALC_FAN_SPEED); - #endif // FAN_SOFT_PWM - #endif // HAS_FAN + #if HAS_FAN0 + analogWrite(FAN_PIN, CALC_FAN_SPEED(0)); + #endif + #if HAS_FAN1 + analogWrite(FAN1_PIN, CALC_FAN_SPEED(1)); + #endif + #if HAS_FAN2 + analogWrite(FAN2_PIN, CALC_FAN_SPEED(2)); + #endif + #endif + + #endif // FAN_COUNT > 0 #if ENABLED(AUTOTEMP) getHighESpeed(); @@ -507,15 +564,15 @@ float junction_deviation = 0.1; target[Z_AXIS] = lround(z * axis_steps_per_unit[Z_AXIS]); target[E_AXIS] = lround(e * axis_steps_per_unit[E_AXIS]); - float dx = target[X_AXIS] - position[X_AXIS], - dy = target[Y_AXIS] - position[Y_AXIS], - dz = target[Z_AXIS] - position[Z_AXIS]; + long dx = target[X_AXIS] - position[X_AXIS], + dy = target[Y_AXIS] - position[Y_AXIS], + dz = target[Z_AXIS] - position[Z_AXIS]; // DRYRUN ignores all temperature constraints and assures that the extruder is instantly satisfied if (marlin_debug_flags & DEBUG_DRYRUN) position[E_AXIS] = target[E_AXIS]; - float de = target[E_AXIS] - position[E_AXIS]; + long de = target[E_AXIS] - position[E_AXIS]; #if ENABLED(PREVENT_DANGEROUS_EXTRUDE) if (de) { @@ -526,7 +583,7 @@ float junction_deviation = 0.1; SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); } #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - if (labs(de) > axis_steps_per_unit[E_AXIS] * EXTRUDE_MAXLENGTH) { + if (labs(de) > axis_steps_per_unit[E_AXIS] * (EXTRUDE_MAXLENGTH)) { position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part de = 0; // no difference SERIAL_ECHO_START; @@ -570,7 +627,10 @@ float junction_deviation = 0.1; // Bail if this is a zero-length block if (block->step_event_count <= dropsegments) return; - block->fan_speed = fanSpeed; + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) block->fan_speed[i] = fanSpeeds[i]; + #endif + #if ENABLED(BARICUDA) block->valve_pressure = ValvePressure; block->e_to_p_pressure = EtoPPressure; @@ -579,23 +639,23 @@ float junction_deviation = 0.1; // Compute direction bits for this block uint8_t db = 0; #if ENABLED(COREXY) - if (dx < 0) db |= BIT(X_HEAD); // Save the real Extruder (head) direction in X Axis - if (dy < 0) db |= BIT(Y_HEAD); // ...and Y - if (dz < 0) db |= BIT(Z_AXIS); - if (dx + dy < 0) db |= BIT(A_AXIS); // Motor A direction - if (dx - dy < 0) db |= BIT(B_AXIS); // Motor B direction + if (dx < 0) SBI(db, X_HEAD); // Save the real Extruder (head) direction in X Axis + if (dy < 0) SBI(db, Y_HEAD); // ...and Y + if (dz < 0) SBI(db, Z_AXIS); + if (dx + dy < 0) SBI(db, A_AXIS); // Motor A direction + if (dx - dy < 0) SBI(db, B_AXIS); // Motor B direction #elif ENABLED(COREXZ) - if (dx < 0) db |= BIT(X_HEAD); // Save the real Extruder (head) direction in X Axis - if (dy < 0) db |= BIT(Y_AXIS); - if (dz < 0) db |= BIT(Z_HEAD); // ...and Z - if (dx + dz < 0) db |= BIT(A_AXIS); // Motor A direction - if (dx - dz < 0) db |= BIT(C_AXIS); // Motor B direction + if (dx < 0) SBI(db, X_HEAD); // Save the real Extruder (head) direction in X Axis + if (dy < 0) SBI(db, Y_AXIS); + if (dz < 0) SBI(db, Z_HEAD); // ...and Z + if (dx + dz < 0) SBI(db, A_AXIS); // Motor A direction + if (dx - dz < 0) SBI(db, C_AXIS); // Motor B direction #else - if (dx < 0) db |= BIT(X_AXIS); - if (dy < 0) db |= BIT(Y_AXIS); - if (dz < 0) db |= BIT(Z_AXIS); + if (dx < 0) SBI(db, X_AXIS); + if (dy < 0) SBI(db, Y_AXIS); + if (dz < 0) SBI(db, Z_AXIS); #endif - if (de < 0) db |= BIT(E_AXIS); + if (de < 0) SBI(db, E_AXIS); block->direction_bits = db; block->active_extruder = extruder; @@ -636,10 +696,10 @@ float junction_deviation = 0.1; #if ENABLED(DUAL_X_CARRIAGE) if (extruder_duplication_enabled) { enable_e1(); - g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE * 2; + g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; } #endif - g_uc_extruder_last_move[0] = BLOCK_BUFFER_SIZE * 2; + g_uc_extruder_last_move[0] = (BLOCK_BUFFER_SIZE) * 2; #if EXTRUDERS > 1 if (g_uc_extruder_last_move[1] == 0) disable_e1(); #if EXTRUDERS > 2 @@ -653,7 +713,7 @@ float junction_deviation = 0.1; #if EXTRUDERS > 1 case 1: enable_e1(); - g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE * 2; + g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; if (g_uc_extruder_last_move[0] == 0) disable_e0(); #if EXTRUDERS > 2 if (g_uc_extruder_last_move[2] == 0) disable_e2(); @@ -665,7 +725,7 @@ float junction_deviation = 0.1; #if EXTRUDERS > 2 case 2: enable_e2(); - g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE * 2; + g_uc_extruder_last_move[2] = (BLOCK_BUFFER_SIZE) * 2; if (g_uc_extruder_last_move[0] == 0) disable_e0(); if (g_uc_extruder_last_move[1] == 0) disable_e1(); #if EXTRUDERS > 3 @@ -675,7 +735,7 @@ float junction_deviation = 0.1; #if EXTRUDERS > 3 case 3: enable_e3(); - g_uc_extruder_last_move[3] = BLOCK_BUFFER_SIZE * 2; + g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2; if (g_uc_extruder_last_move[0] == 0) disable_e0(); if (g_uc_extruder_last_move[1] == 0) disable_e1(); if (g_uc_extruder_last_move[2] == 0) disable_e2(); @@ -744,16 +804,16 @@ float junction_deviation = 0.1; } float inverse_millimeters = 1.0 / block->millimeters; // Inverse millimeters to remove multiple divides - // Calculate speed in mm/second for each axis. No divide by zero due to previous checks. + // Calculate moves/second for this move. No divide by zero due to previous checks. float inverse_second = feed_rate * inverse_millimeters; int moves_queued = movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill #if ENABLED(OLD_SLOWDOWN) || ENABLED(SLOWDOWN) - bool mq = moves_queued > 1 && moves_queued < BLOCK_BUFFER_SIZE / 2; + bool mq = moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE) / 2; #if ENABLED(OLD_SLOWDOWN) - if (mq) feed_rate *= 2.0 * moves_queued / BLOCK_BUFFER_SIZE; + if (mq) feed_rate *= 2.0 * moves_queued / (BLOCK_BUFFER_SIZE); #endif #if ENABLED(SLOWDOWN) // segment time im micro seconds @@ -823,14 +883,14 @@ float junction_deviation = 0.1; ys1 = axis_segment_time[Y_AXIS][1], ys2 = axis_segment_time[Y_AXIS][2]; - if ((direction_change & BIT(X_AXIS)) != 0) { + if (TEST(direction_change, X_AXIS)) { xs2 = axis_segment_time[X_AXIS][2] = xs1; xs1 = axis_segment_time[X_AXIS][1] = xs0; xs0 = 0; } xs0 = axis_segment_time[X_AXIS][0] = xs0 + segment_time; - if ((direction_change & BIT(Y_AXIS)) != 0) { + if (TEST(direction_change, Y_AXIS)) { ys2 = axis_segment_time[Y_AXIS][2] = axis_segment_time[Y_AXIS][1]; ys1 = axis_segment_time[Y_AXIS][1] = axis_segment_time[Y_AXIS][0]; ys0 = 0; @@ -841,7 +901,7 @@ float junction_deviation = 0.1; max_y_segment_time = max(ys0, max(ys1, ys2)), min_xy_segment_time = min(max_x_segment_time, max_y_segment_time); if (min_xy_segment_time < MAX_FREQ_TIME) { - float low_sf = speed_factor * min_xy_segment_time / MAX_FREQ_TIME; + float low_sf = speed_factor * min_xy_segment_time / (MAX_FREQ_TIME); speed_factor = min(speed_factor, low_sf); } #endif // XY_FREQUENCY_LIMIT @@ -855,7 +915,7 @@ float junction_deviation = 0.1; // Compute and limit the acceleration rate for the trapezoid generator. float steps_per_mm = block->step_event_count / block->millimeters; - long bsx = block->steps[X_AXIS], bsy = block->steps[Y_AXIS], bsz = block->steps[Z_AXIS], bse = block->steps[E_AXIS]; + unsigned long bsx = block->steps[X_AXIS], bsy = block->steps[Y_AXIS], bsz = block->steps[Z_AXIS], bse = block->steps[E_AXIS]; if (bsx == 0 && bsy == 0 && bsz == 0) { block->acceleration_st = ceil(retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 } @@ -870,11 +930,12 @@ float junction_deviation = 0.1; xsteps = axis_steps_per_sqr_second[X_AXIS], ysteps = axis_steps_per_sqr_second[Y_AXIS], zsteps = axis_steps_per_sqr_second[Z_AXIS], - esteps = axis_steps_per_sqr_second[E_AXIS]; - if ((float)acc_st * bsx / block->step_event_count > xsteps) acc_st = xsteps; - if ((float)acc_st * bsy / block->step_event_count > ysteps) acc_st = ysteps; - if ((float)acc_st * bsz / block->step_event_count > zsteps) acc_st = zsteps; - if ((float)acc_st * bse / block->step_event_count > esteps) acc_st = esteps; + esteps = axis_steps_per_sqr_second[E_AXIS], + allsteps = block->step_event_count; + if (xsteps < (acc_st * bsx) / allsteps) acc_st = (xsteps * allsteps) / bsx; + if (ysteps < (acc_st * bsy) / allsteps) acc_st = (ysteps * allsteps) / bsy; + if (zsteps < (acc_st * bsz) / allsteps) acc_st = (zsteps * allsteps) / bsz; + if (esteps < (acc_st * bse) / allsteps) acc_st = (esteps * allsteps) / bse; block->acceleration_st = acc_st; block->acceleration = acc_st / steps_per_mm; @@ -891,7 +952,7 @@ float junction_deviation = 0.1; // Compute maximum allowable entry speed at junction by centripetal acceleration approximation. // Let a circle be tangent to both previous and current path line segments, where the junction // deviation is defined as the distance from the junction to the closest edge of the circle, - // colinear with the circle center. The circular segment joining the two paths represents the + // collinear with the circle center. The circular segment joining the two paths represents the // path of centripetal acceleration. Solve for max velocity based on max acceleration about the // radius of the circle, defined indirectly by junction deviation. This may be also viewed as // path width or max_jerk in the previous grbl version. This approach does not actually deviate @@ -931,18 +992,18 @@ float junction_deviation = 0.1; float safe_speed = vmax_junction; if ((moves_queued > 1) && (previous_nominal_speed > 0.0001)) { - float dx = current_speed[X_AXIS] - previous_speed[X_AXIS], - dy = current_speed[Y_AXIS] - previous_speed[Y_AXIS], - dz = fabs(csz - previous_speed[Z_AXIS]), - de = fabs(cse - previous_speed[E_AXIS]), - jerk = sqrt(dx * dx + dy * dy); + float dsx = current_speed[X_AXIS] - previous_speed[X_AXIS], + dsy = current_speed[Y_AXIS] - previous_speed[Y_AXIS], + dsz = fabs(csz - previous_speed[Z_AXIS]), + dse = fabs(cse - previous_speed[E_AXIS]), + jerk = sqrt(dsx * dsx + dsy * dsy); // if ((fabs(previous_speed[X_AXIS]) > 0.0001) || (fabs(previous_speed[Y_AXIS]) > 0.0001)) { vmax_junction = block->nominal_speed; // } if (jerk > max_xy_jerk) vmax_junction_factor = max_xy_jerk / jerk; - if (dz > max_z_jerk) vmax_junction_factor = min(vmax_junction_factor, max_z_jerk / dz); - if (de > max_e_jerk) vmax_junction_factor = min(vmax_junction_factor, max_e_jerk / de); + if (dsz > max_z_jerk) vmax_junction_factor = min(vmax_junction_factor, max_z_jerk / dsz); + if (dse > max_e_jerk) vmax_junction_factor = min(vmax_junction_factor, max_e_jerk / dse); vmax_junction = min(previous_nominal_speed, vmax_junction * vmax_junction_factor); // Limit speed to max previous speed } @@ -975,7 +1036,7 @@ float junction_deviation = 0.1; } else { long acc_dist = estimate_acceleration_distance(0, block->nominal_rate, block->acceleration_st); - float advance = (STEPS_PER_CUBIC_MM_E * EXTRUDER_ADVANCE_K) * (cse * cse * EXTRUSION_AREA * EXTRUSION_AREA) * 256; + float advance = ((STEPS_PER_CUBIC_MM_E) * (EXTRUDER_ADVANCE_K)) * (cse * cse * (EXTRUSION_AREA) * (EXTRUSION_AREA)) * 256; block->advance = advance; block->advance_rate = acc_dist ? advance / (float)acc_dist : 0; } @@ -1004,7 +1065,7 @@ float junction_deviation = 0.1; #if ENABLED(AUTO_BED_LEVELING_FEATURE) && DISABLED(DELTA) vector_3 plan_get_position() { - vector_3 position = vector_3(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS), st_get_position_mm(Z_AXIS)); + vector_3 position = vector_3(st_get_axis_position_mm(X_AXIS), st_get_axis_position_mm(Y_AXIS), st_get_axis_position_mm(Z_AXIS)); //position.debug("in plan_get position"); //plan_bed_level_matrix.debug("in plan_get_position"); @@ -1029,10 +1090,10 @@ float junction_deviation = 0.1; apply_rotation_xyz(plan_bed_level_matrix, x, y, z); #endif - float nx = position[X_AXIS] = lround(x * axis_steps_per_unit[X_AXIS]), - ny = position[Y_AXIS] = lround(y * axis_steps_per_unit[Y_AXIS]), - nz = position[Z_AXIS] = lround(z * axis_steps_per_unit[Z_AXIS]), - ne = position[E_AXIS] = lround(e * axis_steps_per_unit[E_AXIS]); + long nx = position[X_AXIS] = lround(x * axis_steps_per_unit[X_AXIS]), + ny = position[Y_AXIS] = lround(y * axis_steps_per_unit[Y_AXIS]), + nz = position[Z_AXIS] = lround(z * axis_steps_per_unit[Z_AXIS]), + ne = position[E_AXIS] = lround(e * axis_steps_per_unit[E_AXIS]); st_set_position(nx, ny, nz, ne); previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. diff --git a/Marlin/planner.h b/Marlin/planner.h index 0427b7bdee5bbd8b72e35e3d2b4fb22c5134d7fd..125075f7eee66ba0e000e64884f783e3e030d822 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -59,12 +59,18 @@ typedef struct { unsigned long initial_rate; // The jerk-adjusted step rate at start of block unsigned long final_rate; // The minimal rate at exit unsigned long acceleration_st; // acceleration steps/sec^2 - unsigned long fan_speed; + + #if FAN_COUNT > 0 + unsigned long fan_speed[FAN_COUNT]; + #endif + #if ENABLED(BARICUDA) unsigned long valve_pressure; unsigned long e_to_p_pressure; #endif + volatile char busy; + } block_t; #define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1)) diff --git a/Marlin/qr_solve.cpp b/Marlin/qr_solve.cpp index 1e085c95be97703d6f93f7a603fc100cb01e9695..c038ba111d7bc22c6aee050db14519c481fea1ee 100644 --- a/Marlin/qr_solve.cpp +++ b/Marlin/qr_solve.cpp @@ -203,8 +203,7 @@ double r8mat_amax(int m, int n, double a[]) double value = r8_abs(a[0 + 0 * m]); for (int j = 0; j < n; j++) { for (int i = 0; i < m; i++) { - if (value < r8_abs(a[i + j * m])) - value = r8_abs(a[i + j * m]); + NOLESS(value, r8_abs(a[i + j * m])); } } return value; diff --git a/Marlin/scripts/createTemperatureLookupMarlin.py b/Marlin/scripts/createTemperatureLookupMarlin.py index 4f54c2833de6bdfa8119c92dee8e354f4a802afc..3a3ed91a335ec77845d3c29ece40c546369841e5 100755 --- a/Marlin/scripts/createTemperatureLookupMarlin.py +++ b/Marlin/scripts/createTemperatureLookupMarlin.py @@ -1,7 +1,7 @@ #!/usr/bin/python """Thermistor Value Lookup Table Generator -Generates lookup to temperature values for use in a microcontroller in C format based on: +Generates lookup to temperature values for use in a microcontroller in C format based on: http://en.wikipedia.org/wiki/Steinhart-Hart_equation The main use is for Arduino programs that read data from the circuit board described here: @@ -26,7 +26,7 @@ import getopt ZERO = 273.15 # zero point of Kelvin scale VADC = 5 # ADC voltage VCC = 5 # supply voltage -ARES = 2**10 # 10 Bit ADC resolution +ARES = pow(2,10) # 10 Bit ADC resolution VSTEP = VADC / ARES # ADC voltage resolution TMIN = 0 # lowest temperature in table TMAX = 350 # highest temperature in table @@ -45,7 +45,7 @@ class Thermistor: c = (y - x) / ((l3 - l2) * (l1 + l2 + l3)) b = x - c * (l1**2 + l2**2 + l1*l2) a = y1 - (b + l1**2 *c)*l1 - + if c < 0: print "//////////////////////////////////////////////////////////////////////////////////////" print "// WARNING: negative coefficient 'c'! Something may be wrong with the measurements! //" @@ -73,13 +73,13 @@ class Thermistor: def temp(self, adc): "Convert ADC reading into a temperature in Celcius" l = log(self.resist(adc)) - Tinv = self.c1 + self.c2*l + self.c3* l**3) # inverse temperature + Tinv = self.c1 + self.c2*l + self.c3* l**3 # inverse temperature return (1/Tinv) - ZERO # temperature def adc(self, temp): "Convert temperature into a ADC reading" x = (self.c1 - (1.0 / (temp+ZERO))) / (2*self.c3) - y = sqrt((self.c2 / (3*self.c3)**3 + x**2) + y = sqrt((self.c2 / (3*self.c3))**3 + x**2) r = exp((y-x)**(1.0/3) - (y+x)**(1.0/3)) return (r / (self.rp + r)) * ARES @@ -93,7 +93,7 @@ def main(argv): r3 = 226.15 # resistance at high temperature (226.15 Ohm) rp = 4700; # pull-up resistor (4.7 kOhm) num_temps = 36; # number of entries for look-up table - + try: opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="]) except getopt.GetoptError as err: diff --git a/Marlin/servo.cpp b/Marlin/servo.cpp index c66fdc9d37f192ba37c14436d57a97877ce91f64..67e7acf09120f871141cd0c2c272b55f181229fc 100644 --- a/Marlin/servo.cpp +++ b/Marlin/servo.cpp @@ -57,7 +57,7 @@ #define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays // 12 August 2009 -//#define NBR_TIMERS (MAX_SERVOS / SERVOS_PER_TIMER) +//#define NBR_TIMERS ((MAX_SERVOS) / (SERVOS_PER_TIMER)) static ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) @@ -66,9 +66,9 @@ uint8_t ServoCount = 0; // the total number // convenience macros -#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo -#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer -#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / (SERVOS_PER_TIMER))) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % (SERVOS_PER_TIMER)) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*(SERVOS_PER_TIMER)) + _channel) // macro to access servo index by timer and channel #define SERVO(_timer,_channel) (servo_info[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel #define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo @@ -139,12 +139,12 @@ static void initISR(timer16_Sequence_t timer) { TCCR1B = _BV(CS11); // set prescaler of 8 TCNT1 = 0; // clear the timer count #if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) - TIFR |= _BV(OCF1A); // clear any pending interrupts; - TIMSK |= _BV(OCIE1A); // enable the output compare interrupt + SBI(TIFR, OCF1A); // clear any pending interrupts; + SBI(TIMSK, OCIE1A); // enable the output compare interrupt #else // here if not ATmega8 or ATmega128 - TIFR1 |= _BV(OCF1A); // clear any pending interrupts; - TIMSK1 |= _BV(OCIE1A); // enable the output compare interrupt + SBI(TIFR1, OCF1A); // clear any pending interrupts; + SBI(TIMSK1, OCIE1A); // enable the output compare interrupt #endif #ifdef WIRING timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); @@ -158,8 +158,8 @@ static void initISR(timer16_Sequence_t timer) { TCCR3B = _BV(CS31); // set prescaler of 8 TCNT3 = 0; // clear the timer count #ifdef __AVR_ATmega128__ - TIFR |= _BV(OCF3A); // clear any pending interrupts; - ETIMSK |= _BV(OCIE3A); // enable the output compare interrupt + SBI(TIFR, OCF3A); // clear any pending interrupts; + SBI(ETIMSK, OCIE3A); // enable the output compare interrupt #else TIFR3 = _BV(OCF3A); // clear any pending interrupts; TIMSK3 = _BV(OCIE3A) ; // enable the output compare interrupt @@ -195,21 +195,23 @@ static void finISR(timer16_Sequence_t timer) { // Disable use of the given timer #ifdef WIRING if (timer == _timer1) { + CBI( #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) TIMSK1 #else TIMSK #endif - &= ~_BV(OCIE1A); // disable timer 1 output compare interrupt + , OCIE1A); // disable timer 1 output compare interrupt timerDetach(TIMER1OUTCOMPAREA_INT); } else if (timer == _timer3) { + CBI( #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) TIMSK3 #else ETIMSK #endif - &= ~_BV(OCIE3A); // disable the timer3 output compare A interrupt + , OCIE3A); // disable the timer3 output compare A interrupt timerDetach(TIMER3OUTCOMPAREA_INT); } #else //!WIRING @@ -269,9 +271,7 @@ void Servo::detach() { void Servo::write(int value) { if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) - if (value < 0) value = 0; - if (value > 180) value = 180; - value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); } this->writeMicroseconds(value); } @@ -280,18 +280,13 @@ void Servo::writeMicroseconds(int value) { // calculate and store the values for the given channel byte channel = this->servoIndex; if (channel < MAX_SERVOS) { // ensure channel is valid - if (value < SERVO_MIN()) // ensure pulse width is valid - value = SERVO_MIN(); - else if (value > SERVO_MAX()) - value = SERVO_MAX(); - - value = value - TRIM_DURATION; + // ensure pulse width is valid + value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 - uint8_t oldSREG = SREG; - cli(); + CRITICAL_SECTION_START; servo_info[channel].ticks = value; - SREG = oldSREG; + CRITICAL_SECTION_END; } } diff --git a/Marlin/servo.h b/Marlin/servo.h index 9c7906dcd4db38fd08f1ee761d9e25806faab381..01b7654b3c51c49d20426971443a15f22ad0c84c 100644 --- a/Marlin/servo.h +++ b/Marlin/servo.h @@ -60,12 +60,17 @@ // Say which 16 bit timers can be used and in what order #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - #define _useTimer5 //#define _useTimer1 #define _useTimer3 #define _useTimer4 - //typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; - typedef enum { _timer5, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; + #ifndef MOTOR_CURRENT_PWM_XY_PIN + //Timer 5 is used for motor current PWM and can't be used for servos. + #define _useTimer5 + //typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; + typedef enum { _timer5, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; + #else + typedef enum {_timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; + #endif #elif defined(__AVR_ATmega32U4__) //#define _useTimer1 diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 327b6449afecebe57099a154bac2800f5d8d873d..069c7f26f141c5851ce9f05cc3e54c500b5b3b89 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -30,6 +30,7 @@ #include "language.h" #include "cardreader.h" #include "speed_lookuptable.h" + #if HAS_DIGIPOTSS #include <SPI.h> #endif @@ -39,6 +40,9 @@ //=========================================================================== block_t* current_block; // A pointer to the block currently being traced +#if ENABLED(HAS_Z_MIN_PROBE) + volatile bool z_probe_is_active = false; +#endif //=========================================================================== //============================= private variables =========================== @@ -68,9 +72,9 @@ volatile static unsigned long step_events_completed; // The number of step event static long acceleration_time, deceleration_time; //static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate; static unsigned short acc_step_rate; // needed for deceleration start point -static char step_loops; +static uint8_t step_loops; +static uint8_t step_loops_nominal; static unsigned short OCR1A_nominal; -static unsigned short step_loops_nominal; volatile long endstops_trigsteps[3] = { 0 }; volatile long endstops_stepsTotal, endstops_stepsDone; @@ -88,13 +92,23 @@ static volatile char endstop_hit_bits = 0; // use X_MIN, Y_MIN, Z_MIN and Z_MIN_ #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - int motor_current_setting[3] = DEFAULT_PWM_MOTOR_CURRENT; + #ifndef PWM_MOTOR_CURRENT + #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT + #endif + const int motor_current_setting[3] = PWM_MOTOR_CURRENT; #endif static bool check_endstops = true; +static bool check_endstops_global = + #if ENABLED(ENDSTOPS_ONLY_FOR_HOMING) + false + #else + true + #endif +; -volatile long count_position[NUM_AXIS] = { 0 }; -volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; +volatile long count_position[NUM_AXIS] = { 0 }; // Positions of stepper motors, in step units +volatile signed char count_direction[NUM_AXIS] = { 1 }; //=========================================================================== @@ -242,31 +256,35 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; // Some useful constants -#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= BIT(OCIE1A) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~BIT(OCIE1A) +#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) -void endstops_hit_on_purpose() { - endstop_hit_bits = 0; -} +void enable_endstops(bool check) { check_endstops = check; } + +void enable_endstops_globally(bool check) { check_endstops_global = check_endstops = check; } + +void endstops_not_homing() { check_endstops = check_endstops_global; } + +void endstops_hit_on_purpose() { endstop_hit_bits = 0; } void checkHitEndstops() { if (endstop_hit_bits) { SERIAL_ECHO_START; SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT); - if (endstop_hit_bits & BIT(X_MIN)) { + if (TEST(endstop_hit_bits, X_MIN)) { SERIAL_ECHOPAIR(" X:", (float)endstops_trigsteps[X_AXIS] / axis_steps_per_unit[X_AXIS]); LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "X"); } - if (endstop_hit_bits & BIT(Y_MIN)) { + if (TEST(endstop_hit_bits, Y_MIN)) { SERIAL_ECHOPAIR(" Y:", (float)endstops_trigsteps[Y_AXIS] / axis_steps_per_unit[Y_AXIS]); LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Y"); } - if (endstop_hit_bits & BIT(Z_MIN)) { + if (TEST(endstop_hit_bits, Z_MIN)) { SERIAL_ECHOPAIR(" Z:", (float)endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]); LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Z"); } #if ENABLED(Z_MIN_PROBE_ENDSTOP) - if (endstop_hit_bits & BIT(Z_MIN_PROBE)) { + if (TEST(endstop_hit_bits, Z_MIN_PROBE)) { SERIAL_ECHOPAIR(" Z_MIN_PROBE:", (float)endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]); LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "ZP"); } @@ -286,9 +304,7 @@ void checkHitEndstops() { } } -void enable_endstops(bool check) { check_endstops = check; } - -// Check endstops +// Check endstops - Called from ISR! inline void update_endstops() { #if ENABLED(Z_DUAL_ENDSTOPS) @@ -301,7 +317,7 @@ inline void update_endstops() { #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING #define _AXIS(AXIS) AXIS ##_AXIS - #define _ENDSTOP_HIT(AXIS) endstop_hit_bits |= BIT(_ENDSTOP(AXIS, MIN)) + #define _ENDSTOP_HIT(AXIS) SBI(endstop_hit_bits, _ENDSTOP(AXIS, MIN)) #define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX // SET_ENDSTOP_BIT: set the current endstop bits for an endstop to its status @@ -311,23 +327,36 @@ inline void update_endstops() { // TEST_ENDSTOP: test the old and the current status of an endstop #define TEST_ENDSTOP(ENDSTOP) (TEST(current_endstop_bits, ENDSTOP) && TEST(old_endstop_bits, ENDSTOP)) - #define UPDATE_ENDSTOP(AXIS,MINMAX) \ - SET_ENDSTOP_BIT(AXIS, MINMAX); \ - if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && (current_block->steps[_AXIS(AXIS)] > 0)) { \ - endstops_trigsteps[_AXIS(AXIS)] = count_position[_AXIS(AXIS)]; \ - _ENDSTOP_HIT(AXIS); \ - step_events_completed = current_block->step_event_count; \ - } + #if ENABLED(COREXY) || ENABLED(COREXZ) - #if ENABLED(COREXY) - // Head direction in -X axis for CoreXY bots. - // If DeltaX == -DeltaY, the movement is only in Y axis - if ((current_block->steps[A_AXIS] != current_block->steps[B_AXIS]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, B_AXIS))) { - if (TEST(out_bits, X_HEAD)) - #elif ENABLED(COREXZ) - // Head direction in -X axis for CoreXZ bots. - // If DeltaX == -DeltaZ, the movement is only in Z axis - if ((current_block->steps[A_AXIS] != current_block->steps[C_AXIS]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, C_AXIS))) { + #define _SET_TRIGSTEPS(AXIS) do { \ + float axis_pos = count_position[_AXIS(AXIS)]; \ + if (_AXIS(AXIS) == A_AXIS) \ + axis_pos = (axis_pos + count_position[CORE_AXIS_2]) / 2; \ + else if (_AXIS(AXIS) == CORE_AXIS_2) \ + axis_pos = (count_position[A_AXIS] - axis_pos) / 2; \ + endstops_trigsteps[_AXIS(AXIS)] = axis_pos; \ + } while(0) + + #else + + #define _SET_TRIGSTEPS(AXIS) endstops_trigsteps[_AXIS(AXIS)] = count_position[_AXIS(AXIS)] + + #endif // COREXY || COREXZ + + #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ + SET_ENDSTOP_BIT(AXIS, MINMAX); \ + if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && current_block->steps[_AXIS(AXIS)] > 0) { \ + _SET_TRIGSTEPS(AXIS); \ + _ENDSTOP_HIT(AXIS); \ + step_events_completed = current_block->step_event_count; \ + } \ + } while(0) + + #if ENABLED(COREXY) || ENABLED(COREXZ) + // Head direction in -X axis for CoreXY and CoreXZ bots. + // If Delta1 == -Delta2, the movement is only in Y or Z axis + if ((current_block->steps[A_AXIS] != current_block->steps[CORE_AXIS_2]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, CORE_AXIS_2))) { if (TEST(out_bits, X_HEAD)) #else if (TEST(out_bits, X_AXIS)) // stepping along -X axis (regular Cartesian bot) @@ -403,23 +432,24 @@ inline void update_endstops() { if (z_test && current_block->steps[Z_AXIS] > 0) { // z_test = Z_MIN || Z2_MIN endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; - endstop_hit_bits |= BIT(Z_MIN); + SBI(endstop_hit_bits, Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } #else // !Z_DUAL_ENDSTOPS - UPDATE_ENDSTOP(Z, MIN); - + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && ENABLED(HAS_Z_MIN_PROBE) + if (z_probe_is_active) UPDATE_ENDSTOP(Z, MIN); + #else + UPDATE_ENDSTOP(Z, MIN); + #endif #endif // !Z_DUAL_ENDSTOPS - #endif // Z_MIN_PIN - - #if ENABLED(Z_MIN_PROBE_ENDSTOP) - UPDATE_ENDSTOP(Z, MIN_PROBE); + #endif - if (TEST_ENDSTOP(Z_MIN_PROBE)) { - endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; - endstop_hit_bits |= BIT(Z_MIN_PROBE); + #if ENABLED(Z_MIN_PROBE_ENDSTOP) && DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && ENABLED(HAS_Z_MIN_PROBE) + if (z_probe_is_active) { + UPDATE_ENDSTOP(Z, MIN_PROBE); + if (TEST_ENDSTOP(Z_MIN_PROBE)) endstop_hit_bits |= _BV(Z_MIN_PROBE); } #endif } @@ -439,7 +469,7 @@ inline void update_endstops() { if (z_test && current_block->steps[Z_AXIS] > 0) { // t_test = Z_MAX || Z2_MAX endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; - endstop_hit_bits |= BIT(Z_MIN); + SBI(endstop_hit_bits, Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } @@ -480,7 +510,8 @@ void st_wake_up() { FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { unsigned short timer; - if (step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; + + NOMORE(step_rate, MAX_STEP_FREQUENCY); if (step_rate > 20000) { // If steprate > 20kHz >> step 4 times step_rate = (step_rate >> 2) & 0x3fff; @@ -494,8 +525,8 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { step_loops = 1; } - if (step_rate < (F_CPU / 500000)) step_rate = (F_CPU / 500000); - step_rate -= (F_CPU / 500000); // Correct for minimal speed + NOLESS(step_rate, F_CPU / 500000); + step_rate -= F_CPU / 500000; // Correct for minimal speed if (step_rate >= (8 * 256)) { // higher step rate unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate >> 8)][0]; unsigned char tmp_step_rate = (step_rate & 0x00ff); @@ -521,32 +552,19 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { */ void set_stepper_direction() { - if (TEST(out_bits, X_AXIS)) { // A_AXIS - X_APPLY_DIR(INVERT_X_DIR, 0); - count_direction[X_AXIS] = -1; - } - else { - X_APPLY_DIR(!INVERT_X_DIR, 0); - count_direction[X_AXIS] = 1; - } - - if (TEST(out_bits, Y_AXIS)) { // B_AXIS - Y_APPLY_DIR(INVERT_Y_DIR, 0); - count_direction[Y_AXIS] = -1; - } - else { - Y_APPLY_DIR(!INVERT_Y_DIR, 0); - count_direction[Y_AXIS] = 1; - } + #define SET_STEP_DIR(AXIS) \ + if (TEST(out_bits, AXIS ##_AXIS)) { \ + AXIS ##_APPLY_DIR(INVERT_## AXIS ##_DIR, false); \ + count_direction[AXIS ##_AXIS] = -1; \ + } \ + else { \ + AXIS ##_APPLY_DIR(!INVERT_## AXIS ##_DIR, false); \ + count_direction[AXIS ##_AXIS] = 1; \ + } - if (TEST(out_bits, Z_AXIS)) { // C_AXIS - Z_APPLY_DIR(INVERT_Z_DIR, 0); - count_direction[Z_AXIS] = -1; - } - else { - Z_APPLY_DIR(!INVERT_Z_DIR, 0); - count_direction[Z_AXIS] = 1; - } + SET_STEP_DIR(X); // A + SET_STEP_DIR(Y); // B + SET_STEP_DIR(Z); // C #if DISABLED(ADVANCE) if (TEST(out_bits, E_AXIS)) { @@ -564,8 +582,11 @@ void set_stepper_direction() { // block begins. FORCE_INLINE void trapezoid_generator_reset() { - if (current_block->direction_bits != out_bits) { + static int8_t last_extruder = -1; + + if (current_block->direction_bits != out_bits || current_block->active_extruder != last_extruder) { out_bits = current_block->direction_bits; + last_extruder = current_block->active_extruder; set_stepper_direction(); } @@ -604,7 +625,7 @@ ISR(TIMER1_COMPA_vect) { current_block = NULL; plan_discard_current_block(); #ifdef SD_FINISHED_RELEASECOMMAND - if ((cleaning_buffer_counter == 1) && (SD_FINISHED_STEPPERRELEASE)) enqueuecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + if ((cleaning_buffer_counter == 1) && (SD_FINISHED_STEPPERRELEASE)) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); #endif cleaning_buffer_counter--; OCR1A = 200; @@ -642,7 +663,11 @@ ISR(TIMER1_COMPA_vect) { if (current_block != NULL) { // Update endstops state, if enabled - if (check_endstops) update_endstops(); + #if ENABLED(HAS_Z_MIN_PROBE) + if (check_endstops || z_probe_is_active) update_endstops(); + #else + if (check_endstops) update_endstops(); + #endif // Take multiple steps per interrupt (For high speed moves) for (int8_t i = 0; i < step_loops; i++) { @@ -699,8 +724,7 @@ ISR(TIMER1_COMPA_vect) { acc_step_rate += current_block->initial_rate; // upper limit - if (acc_step_rate > current_block->nominal_rate) - acc_step_rate = current_block->nominal_rate; + NOMORE(acc_step_rate, current_block->nominal_rate); // step_rate to timer interval timer = calc_timer(acc_step_rate); @@ -709,10 +733,9 @@ ISR(TIMER1_COMPA_vect) { #if ENABLED(ADVANCE) - for (int8_t i = 0; i < step_loops; i++) { - advance += advance_rate; - } - //if (advance > current_block->advance) advance = current_block->advance; + advance += advance_rate * step_loops; + //NOLESS(advance, current_block->advance); + // Do E steps + advance steps e_steps[current_block->active_extruder] += ((advance >> 8) - old_advance); old_advance = advance >> 8; @@ -722,29 +745,26 @@ ISR(TIMER1_COMPA_vect) { else if (step_events_completed > (unsigned long)current_block->decelerate_after) { MultiU24X32toH16(step_rate, deceleration_time, current_block->acceleration_rate); - if (step_rate > acc_step_rate) { // Check step_rate stays positive - step_rate = current_block->final_rate; - } - else { - step_rate = acc_step_rate - step_rate; // Decelerate from aceleration end point. + if (step_rate <= acc_step_rate) { // Still decelerating? + step_rate = acc_step_rate - step_rate; + NOLESS(step_rate, current_block->final_rate); } - - // lower limit - if (step_rate < current_block->final_rate) + else step_rate = current_block->final_rate; // step_rate to timer interval timer = calc_timer(step_rate); OCR1A = timer; deceleration_time += timer; + #if ENABLED(ADVANCE) - for (int8_t i = 0; i < step_loops; i++) { - advance -= advance_rate; - } - if (advance < final_advance) advance = final_advance; + advance -= advance_rate * step_loops; + NOLESS(advance, final_advance); + // Do E steps + advance steps - e_steps[current_block->active_extruder] += ((advance >> 8) - old_advance); - old_advance = advance >> 8; + uint32_t advance_whole = advance >> 8; + e_steps[current_block->active_extruder] += advance_whole - old_advance; + old_advance = advance_whole; #endif //ADVANCE } else { @@ -770,65 +790,32 @@ ISR(TIMER1_COMPA_vect) { ISR(TIMER0_COMPA_vect) { old_OCR0A += 52; // ~10kHz interrupt (250000 / 26 = 9615kHz) OCR0A = old_OCR0A; - // Set E direction (Depends on E direction + advance) - for (unsigned char i = 0; i < 4; i++) { - if (e_steps[0] != 0) { - E0_STEP_WRITE(INVERT_E_STEP_PIN); - if (e_steps[0] < 0) { - E0_DIR_WRITE(INVERT_E0_DIR); - e_steps[0]++; - E0_STEP_WRITE(!INVERT_E_STEP_PIN); - } - else if (e_steps[0] > 0) { - E0_DIR_WRITE(!INVERT_E0_DIR); - e_steps[0]--; - E0_STEP_WRITE(!INVERT_E_STEP_PIN); - } + + #define STEP_E_ONCE(INDEX) \ + if (e_steps[INDEX] != 0) { \ + E## INDEX ##_STEP_WRITE(INVERT_E_STEP_PIN); \ + if (e_steps[INDEX] < 0) { \ + E## INDEX ##_DIR_WRITE(INVERT_E## INDEX ##_DIR); \ + e_steps[INDEX]++; \ + } \ + else if (e_steps[INDEX] > 0) { \ + E## INDEX ##_DIR_WRITE(!INVERT_E## INDEX ##_DIR); \ + e_steps[INDEX]--; \ + } \ + E## INDEX ##_STEP_WRITE(!INVERT_E_STEP_PIN); \ } + + // Step all E steppers that have steps, up to 4 steps per interrupt + for (unsigned char i = 0; i < 4; i++) { + STEP_E_ONCE(0); #if EXTRUDERS > 1 - if (e_steps[1] != 0) { - E1_STEP_WRITE(INVERT_E_STEP_PIN); - if (e_steps[1] < 0) { - E1_DIR_WRITE(INVERT_E1_DIR); - e_steps[1]++; - E1_STEP_WRITE(!INVERT_E_STEP_PIN); - } - else if (e_steps[1] > 0) { - E1_DIR_WRITE(!INVERT_E1_DIR); - e_steps[1]--; - E1_STEP_WRITE(!INVERT_E_STEP_PIN); - } - } - #endif - #if EXTRUDERS > 2 - if (e_steps[2] != 0) { - E2_STEP_WRITE(INVERT_E_STEP_PIN); - if (e_steps[2] < 0) { - E2_DIR_WRITE(INVERT_E2_DIR); - e_steps[2]++; - E2_STEP_WRITE(!INVERT_E_STEP_PIN); - } - else if (e_steps[2] > 0) { - E2_DIR_WRITE(!INVERT_E2_DIR); - e_steps[2]--; - E2_STEP_WRITE(!INVERT_E_STEP_PIN); - } - } - #endif - #if EXTRUDERS > 3 - if (e_steps[3] != 0) { - E3_STEP_WRITE(INVERT_E_STEP_PIN); - if (e_steps[3] < 0) { - E3_DIR_WRITE(INVERT_E3_DIR); - e_steps[3]++; - E3_STEP_WRITE(!INVERT_E_STEP_PIN); - } - else if (e_steps[3] > 0) { - E3_DIR_WRITE(!INVERT_E3_DIR); - e_steps[3]--; - E3_STEP_WRITE(!INVERT_E_STEP_PIN); - } - } + STEP_E_ONCE(1); + #if EXTRUDERS > 2 + STEP_E_ONCE(2); + #if EXTRUDERS > 3 + STEP_E_ONCE(3); + #endif + #endif #endif } } @@ -947,6 +934,13 @@ void st_init() { #endif #endif + #if HAS_Z2_MIN + SET_INPUT(Z2_MIN_PIN); + #if ENABLED(ENDSTOPPULLUP_ZMIN) + WRITE(Z2_MIN_PIN,HIGH); + #endif + #endif + #if HAS_X_MAX SET_INPUT(X_MAX_PIN); #if ENABLED(ENDSTOPPULLUP_XMAX) @@ -1028,10 +1022,10 @@ void st_init() { #endif // waveform generation = 0100 = CTC - TCCR1B &= ~BIT(WGM13); - TCCR1B |= BIT(WGM12); - TCCR1A &= ~BIT(WGM11); - TCCR1A &= ~BIT(WGM10); + CBI(TCCR1B, WGM13); + SBI(TCCR1B, WGM12); + CBI(TCCR1A, WGM11); + CBI(TCCR1A, WGM10); // output mode = 00 (disconnected) TCCR1A &= ~(3 << COM1A0); @@ -1049,11 +1043,11 @@ void st_init() { #if ENABLED(ADVANCE) #if defined(TCCR0A) && defined(WGM01) - TCCR0A &= ~BIT(WGM01); - TCCR0A &= ~BIT(WGM00); + CBI(TCCR0A, WGM01); + CBI(TCCR0A, WGM00); #endif e_steps[0] = e_steps[1] = e_steps[2] = e_steps[3] = 0; - TIMSK0 |= BIT(OCIE0A); + SBI(TIMSK0, OCIE0A); #endif //ADVANCE enable_endstops(true); // Start with endstops active. After homing they can be disabled @@ -1084,14 +1078,31 @@ void st_set_e_position(const long& e) { } long st_get_position(uint8_t axis) { - long count_pos; CRITICAL_SECTION_START; - count_pos = count_position[axis]; + long count_pos = count_position[axis]; CRITICAL_SECTION_END; return count_pos; } -float st_get_position_mm(AxisEnum axis) { return st_get_position(axis) / axis_steps_per_unit[axis]; } +float st_get_axis_position_mm(AxisEnum axis) { + float axis_pos; + #if ENABLED(COREXY) | ENABLED(COREXZ) + if (axis == X_AXIS || axis == CORE_AXIS_2) { + CRITICAL_SECTION_START; + long pos1 = count_position[A_AXIS], + pos2 = count_position[CORE_AXIS_2]; + CRITICAL_SECTION_END; + // ((a1+a2)+(a1-a2))/2 -> (a1+a2+a1-a2)/2 -> (a1+a1)/2 -> a1 + // ((a1+a2)-(a1-a2))/2 -> (a1+a2-a1+a2)/2 -> (a2+a2)/2 -> a2 + axis_pos = (pos1 + ((axis == X_AXIS) ? pos2 : -pos2)) / 2.0f; + } + else + axis_pos = st_get_position(axis); + #else + axis_pos = st_get_position(axis); + #endif + return axis_pos / axis_steps_per_unit[axis]; +} void finishAndDisableSteppers() { st_synchronize(); @@ -1180,19 +1191,18 @@ void quickStop() { #endif //BABYSTEPPING -// From Arduino DigitalPotControl example -void digitalPotWrite(int address, int value) { - #if HAS_DIGIPOTSS +#if HAS_DIGIPOTSS + + // From Arduino DigitalPotControl example + void digitalPotWrite(int address, int value) { digitalWrite(DIGIPOTSS_PIN, LOW); // take the SS pin low to select the chip SPI.transfer(address); // send in the address and value via SPI: SPI.transfer(value); digitalWrite(DIGIPOTSS_PIN, HIGH); // take the SS pin high to de-select the chip: //delay(10); - #else - UNUSED(address); - UNUSED(value); - #endif -} + } + +#endif //HAS_DIGIPOTSS // Initialize Digipot Motor Current void digipot_init() { @@ -1201,7 +1211,7 @@ void digipot_init() { SPI.begin(); pinMode(DIGIPOTSS_PIN, OUTPUT); - for (int i = 0; i <= 4; i++) { + for (int i = 0; i < COUNT(digipot_motor_current); i++) { //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); digipot_current(i, digipot_motor_current[i]); } @@ -1224,14 +1234,14 @@ void digipot_current(uint8_t driver, int current) { digitalPotWrite(digipot_ch[driver], current); #elif defined(MOTOR_CURRENT_PWM_XY_PIN) switch (driver) { - case 0: analogWrite(MOTOR_CURRENT_PWM_XY_PIN, 255L * current / MOTOR_CURRENT_PWM_RANGE); break; - case 1: analogWrite(MOTOR_CURRENT_PWM_Z_PIN, 255L * current / MOTOR_CURRENT_PWM_RANGE); break; - case 2: analogWrite(MOTOR_CURRENT_PWM_E_PIN, 255L * current / MOTOR_CURRENT_PWM_RANGE); break; + case 0: analogWrite(MOTOR_CURRENT_PWM_XY_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)); break; + case 1: analogWrite(MOTOR_CURRENT_PWM_Z_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)); break; + case 2: analogWrite(MOTOR_CURRENT_PWM_E_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)); break; } #else UNUSED(driver); UNUSED(current); -#endif + #endif } void microstep_init() { diff --git a/Marlin/stepper.h b/Marlin/stepper.h index 46211948e56cf2a0fc2dc34b3b7bdb40f0d9e9dc..60c1c8fb3253f0bd7023073c7d558a3f7696def8 100644 --- a/Marlin/stepper.h +++ b/Marlin/stepper.h @@ -24,31 +24,6 @@ #include "planner.h" #include "stepper_indirection.h" -#if EXTRUDERS > 3 - #define E_STEP_WRITE(v) { if(current_block->active_extruder == 3) { E3_STEP_WRITE(v); } else { if(current_block->active_extruder == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_extruder == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}}} - #define NORM_E_DIR() { if(current_block->active_extruder == 3) { E3_DIR_WRITE( !INVERT_E3_DIR); } else { if(current_block->active_extruder == 2) { E2_DIR_WRITE(!INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}}} - #define REV_E_DIR() { if(current_block->active_extruder == 3) { E3_DIR_WRITE(INVERT_E3_DIR); } else { if(current_block->active_extruder == 2) { E2_DIR_WRITE(INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}}} -#elif EXTRUDERS > 2 - #define E_STEP_WRITE(v) { if(current_block->active_extruder == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_extruder == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}} - #define NORM_E_DIR() { if(current_block->active_extruder == 2) { E2_DIR_WRITE(!INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}} - #define REV_E_DIR() { if(current_block->active_extruder == 2) { E2_DIR_WRITE(INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}} -#elif EXTRUDERS > 1 - #if DISABLED(DUAL_X_CARRIAGE) - #define E_STEP_WRITE(v) { if(current_block->active_extruder == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }} - #define NORM_E_DIR() { if(current_block->active_extruder == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }} - #define REV_E_DIR() { if(current_block->active_extruder == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }} - #else - extern bool extruder_duplication_enabled; - #define E_STEP_WRITE(v) { if(extruder_duplication_enabled) { E0_STEP_WRITE(v); E1_STEP_WRITE(v); } else if(current_block->active_extruder == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }} - #define NORM_E_DIR() { if(extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if(current_block->active_extruder == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }} - #define REV_E_DIR() { if(extruder_duplication_enabled) { E0_DIR_WRITE(INVERT_E0_DIR); E1_DIR_WRITE(INVERT_E1_DIR); } else if(current_block->active_extruder == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }} - #endif -#else - #define E_STEP_WRITE(v) E0_STEP_WRITE(v) - #define NORM_E_DIR() E0_DIR_WRITE(!INVERT_E0_DIR) - #define REV_E_DIR() E0_DIR_WRITE(INVERT_E0_DIR) -#endif - #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) extern bool abort_on_endstop_hit; #endif @@ -66,8 +41,8 @@ void st_set_e_position(const long& e); // Get current position in steps long st_get_position(uint8_t axis); -// Get current position in mm -float st_get_position_mm(AxisEnum axis); +// Get current axis position in mm +float st_get_axis_position_mm(AxisEnum axis); // The stepper subsystem goes to sleep when it runs out of things to execute. Call this // to notify the subsystem that it is time to go to work. @@ -79,6 +54,9 @@ void endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homi void enable_endstops(bool check); // Enable/disable endstop checking +void enable_endstops_globally(bool check); +void endstops_not_homing(); + void checkStepperErrors(); //Print errors detected by the stepper void finishAndDisableSteppers(); @@ -87,7 +65,9 @@ extern block_t* current_block; // A pointer to the block currently being traced void quickStop(); -void digitalPotWrite(int address, int value); +#if HAS_DIGIPOTSS + void digitalPotWrite(int address, int value); +#endif void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2); void microstep_mode(uint8_t driver, uint8_t stepping); void digipot_init(); diff --git a/Marlin/stepper_dac.cpp b/Marlin/stepper_dac.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6b8ae8f3c2f983b908600bc2ca240df25c0c19f2 --- /dev/null +++ b/Marlin/stepper_dac.cpp @@ -0,0 +1,87 @@ +/* + stepper_dac.cpp - To set stepper current via DAC + + Part of Marlin + + Copyright (c) 2016 MarlinFirmware + + Marlin 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. + + Marlin 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 Marlin. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "Marlin.h" + +#if ENABLED(DAC_STEPPER_CURRENT) + + #include "stepper_dac.h" + + bool dac_present = false; + const uint8_t dac_order[NUM_AXIS] = DAC_STEPPER_ORDER; + + int dac_init() { + mcp4728_init(); + + if (mcp4728_simpleCommand(RESET)) return -1; + + dac_present = true; + + mcp4728_setVref_all(DAC_STEPPER_VREF); + mcp4728_setGain_all(DAC_STEPPER_GAIN); + + return 0; + } + + void dac_current_percent(uint8_t channel, float val) { + if (!dac_present) return; + + NOMORE(val, 100); + + mcp4728_analogWrite(dac_order[channel], val * DAC_STEPPER_MAX / 100); + mcp4728_simpleCommand(UPDATE); + } + + void dac_current_raw(uint8_t channel, uint16_t val) { + if (!dac_present) return; + + NOMORE(val, DAC_STEPPER_MAX); + + mcp4728_analogWrite(dac_order[channel], val); + mcp4728_simpleCommand(UPDATE); + } + + static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) / DAC_STEPPER_MAX; } + static float dac_amps(int8_t n) { return ((2.048 * mcp4728_getValue(dac_order[n])) / 4096.0) / (8.0 * DAC_STEPPER_SENSE); } + + void dac_print_values() { + if (!dac_present) return; + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Stepper current values in % (Amps):"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" X:", dac_perc(0)); + SERIAL_ECHOPAIR(" (", dac_amps(0)); + SERIAL_ECHOPAIR(") Y:", dac_perc(1)); + SERIAL_ECHOPAIR(" (", dac_amps(1)); + SERIAL_ECHOPAIR(") Z:", dac_perc(2)); + SERIAL_ECHOPAIR(" (", dac_amps(2)); + SERIAL_ECHOPAIR(") E:", dac_perc(3)); + SERIAL_ECHOPAIR(" (", dac_amps(3)); + SERIAL_ECHOLN(")"); + } + + void dac_commit_eeprom() { + if (!dac_present) return; + mcp4728_eepromWrite(); + } + +#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/stepper_dac.h b/Marlin/stepper_dac.h new file mode 100644 index 0000000000000000000000000000000000000000..9fcf97c60917087f3f5c66db9dcfd268ad1c3a90 --- /dev/null +++ b/Marlin/stepper_dac.h @@ -0,0 +1,33 @@ +/* + stepper_dac.h - To set stepper current via DAC + + Part of Marlin + + Copyright (c) 2016 MarlinFirmware + + Marlin 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. + + Marlin 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 Marlin. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef STEPPER_DAC_H +#define STEPPER_DAC_H + +#include "dac_mcp4728.h" + +int dac_init(); +void dac_current_percent(uint8_t channel, float val); +void dac_current_raw(uint8_t channel, uint16_t val); +void dac_print_values(); +void dac_commit_eeprom(); + +#endif // STEPPER_DAC_H diff --git a/Marlin/stepper_indirection.h b/Marlin/stepper_indirection.h index 8341aa04024e66bb7645f402ce56be4a0853228e..f719fecc3fee9a25d83088f1f3d625d854782582 100644 --- a/Marlin/stepper_indirection.h +++ b/Marlin/stepper_indirection.h @@ -154,6 +154,34 @@ #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) #define E3_ENABLE_READ READ(E3_ENABLE_PIN) +#if EXTRUDERS > 3 + #define E_STEP_WRITE(v) {switch(current_block->active_extruder){case 3:E3_STEP_WRITE(v);break;case 2:E2_STEP_WRITE(v);break;case 1:E1_STEP_WRITE(v);break;default:E0_STEP_WRITE(v);}} + #define NORM_E_DIR() {switch(current_block->active_extruder){case 3:E3_DIR_WRITE(!INVERT_E3_DIR);break;case 2:E2_DIR_WRITE(!INVERT_E2_DIR);break;case 1:E1_DIR_WRITE(!INVERT_E1_DIR);break;default:E0_DIR_WRITE(!INVERT_E0_DIR);}} + #define REV_E_DIR() {switch(current_block->active_extruder){case 3:E3_DIR_WRITE(INVERT_E3_DIR);break;case 2:E2_DIR_WRITE(INVERT_E2_DIR);break;case 1:E1_DIR_WRITE(INVERT_E1_DIR);break;default:E0_DIR_WRITE(INVERT_E0_DIR);}} +#elif EXTRUDERS > 2 + #define E_STEP_WRITE(v) {switch(current_block->active_extruder){case 2:E2_STEP_WRITE(v);break;case 1:E1_STEP_WRITE(v);break;default:E0_STEP_WRITE(v);}} + #define NORM_E_DIR() {switch(current_block->active_extruder){case 2:E2_DIR_WRITE(!INVERT_E2_DIR);break;case 1:E1_DIR_WRITE(!INVERT_E1_DIR);break;default:E0_DIR_WRITE(!INVERT_E0_DIR);}} + #define REV_E_DIR() {switch(current_block->active_extruder){case 2:E2_DIR_WRITE(INVERT_E2_DIR);break;case 1:E1_DIR_WRITE(INVERT_E1_DIR);break;default:E0_DIR_WRITE(INVERT_E0_DIR);}} +#elif EXTRUDERS > 1 + #define _E_STEP_WRITE(v) {if(current_block->active_extruder==1){E1_STEP_WRITE(v);}else{E0_STEP_WRITE(v);}} + #define _NORM_E_DIR() {if(current_block->active_extruder==1){E1_DIR_WRITE(!INVERT_E1_DIR);}else{E0_DIR_WRITE(!INVERT_E0_DIR);}} + #define _REV_E_DIR() {if(current_block->active_extruder==1){E1_DIR_WRITE(INVERT_E1_DIR);}else{E0_DIR_WRITE(INVERT_E0_DIR);}} + #if DISABLED(DUAL_X_CARRIAGE) + #define E_STEP_WRITE(v) _E_STEP_WRITE(v) + #define NORM_E_DIR() _NORM_E_DIR() + #define REV_E_DIR() _REV_E_DIR() + #else + extern bool extruder_duplication_enabled; + #define E_STEP_WRITE(v) {if(extruder_duplication_enabled){E0_STEP_WRITE(v);E1_STEP_WRITE(v);}else _E_STEP_WRITE(v);} + #define NORM_E_DIR() {if(extruder_duplication_enabled){E0_DIR_WRITE(!INVERT_E0_DIR);E1_DIR_WRITE(!INVERT_E1_DIR);}else _NORM_E_DIR();} + #define REV_E_DIR() {if(extruder_duplication_enabled){E0_DIR_WRITE(INVERT_E0_DIR);E1_DIR_WRITE(INVERT_E1_DIR);}else _REV_E_DIR();} + #endif +#else + #define E_STEP_WRITE(v) E0_STEP_WRITE(v) + #define NORM_E_DIR() E0_DIR_WRITE(!INVERT_E0_DIR) + #define REV_E_DIR() E0_DIR_WRITE(INVERT_E0_DIR) +#endif + ////////////////////////////////// // Pin redefines for TMC drivers. // TMC26X drivers have step and dir on normal pins, but everything else via SPI diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 99cd2afd409a2fafb5e3ef233fb60102c3567b53..4df22333d92f4230ef18baf1db8cff0bc6ee7fab 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -62,7 +62,7 @@ float current_temperature_bed = 0.0; #endif //PIDTEMPBED #if ENABLED(FAN_SOFT_PWM) - unsigned char fanSpeedSoftPwm; + unsigned char fanSpeedSoftPwm[FAN_COUNT]; #endif unsigned char soft_pwm_bed; @@ -130,7 +130,7 @@ static volatile bool temp_meas_ready = false; static unsigned char soft_pwm[EXTRUDERS]; #if ENABLED(FAN_SOFT_PWM) - static unsigned char soft_pwm_fan; + static unsigned char soft_pwm_fan[FAN_COUNT]; #endif #if HAS_AUTO_FAN static millis_t next_auto_fan_check_ms; @@ -139,15 +139,15 @@ static unsigned char soft_pwm[EXTRUDERS]; #if ENABLED(PIDTEMP) #if ENABLED(PID_PARAMS_PER_EXTRUDER) float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Kp); - float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Ki* PID_dT); - float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Kd / PID_dT); + float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS1((DEFAULT_Ki) * (PID_dT)); + float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS1((DEFAULT_Kd) / (PID_dT)); #if ENABLED(PID_ADD_EXTRUSION_RATE) float Kc[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Kc); #endif // PID_ADD_EXTRUSION_RATE #else //PID_PARAMS_PER_EXTRUDER float Kp = DEFAULT_Kp; - float Ki = DEFAULT_Ki * PID_dT; - float Kd = DEFAULT_Kd / PID_dT; + float Ki = (DEFAULT_Ki) * (PID_dT); + float Kd = (DEFAULT_Kd) / (PID_dT); #if ENABLED(PID_ADD_EXTRUSION_RATE) float Kc = DEFAULT_Kc; #endif // PID_ADD_EXTRUSION_RATE @@ -199,7 +199,7 @@ static void updateTemperaturesFromRawValues(); //================================ Functions ================================ //=========================================================================== -void PID_autotune(float temp, int extruder, int ncycles) { +void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false*/) { float input = 0.0; int cycles = 0; bool heating = true; @@ -230,9 +230,9 @@ void PID_autotune(float temp, int extruder, int ncycles) { disable_all_heaters(); // switch off all heaters. if (extruder < 0) - soft_pwm_bed = bias = d = MAX_BED_POWER / 2; + soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2; else - soft_pwm[extruder] = bias = d = PID_MAX / 2; + soft_pwm[extruder] = bias = d = (PID_MAX) / 2; // PID Tuning loop for (;;) { @@ -328,19 +328,10 @@ void PID_autotune(float temp, int extruder, int ncycles) { } // Every 2 seconds... if (ms > temp_ms + 2000) { - int p; - if (extruder < 0) { - p = soft_pwm_bed; - SERIAL_PROTOCOLPGM(MSG_B); - } - else { - p = soft_pwm[extruder]; - SERIAL_PROTOCOLPGM(MSG_T); - } - - SERIAL_PROTOCOL(input); - SERIAL_PROTOCOLPGM(MSG_AT); - SERIAL_PROTOCOLLN(p); + #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675) + print_heaterstates(); + SERIAL_EOL; + #endif temp_ms = ms; } // every 2 seconds @@ -355,6 +346,24 @@ void PID_autotune(float temp, int extruder, int ncycles) { SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(Kp); SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(Ki); SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(Kd); + + // Use the result? (As with "M303 U1") + if (set_result) { + if (extruder < 0) { + #if ENABLED(PIDTEMPBED) + bedKp = Kp; + bedKi = scalePID_i(Ki); + bedKd = scalePID_d(Kd); + updatePID(); + #endif + } + else { + PID_PARAM(Kp, extruder) = Kp; + PID_PARAM(Ki, e) = scalePID_i(Ki); + PID_PARAM(Kd, e) = scalePID_d(Kd); + updatePID(); + } + } return; } lcd_update(); @@ -364,14 +373,14 @@ void PID_autotune(float temp, int extruder, int ncycles) { void updatePID() { #if ENABLED(PIDTEMP) for (int e = 0; e < EXTRUDERS; e++) { - temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki,e); + temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki,e); #if ENABLED(PID_ADD_EXTRUSION_RATE) last_position[e] = 0; #endif } #endif #if ENABLED(PIDTEMPBED) - temp_iState_max_bed = PID_BED_INTEGRAL_DRIVE_MAX / bedKi; + temp_iState_max_bed = (PID_BED_INTEGRAL_DRIVE_MAX) / bedKi; #endif } @@ -490,7 +499,7 @@ float get_pid_output(int e) { pid_output = BANG_MAX; pid_reset[e] = true; } - else if (pid_error[e] < -PID_FUNCTIONAL_RANGE || target_temperature[e] == 0) { + else if (pid_error[e] < -(PID_FUNCTIONAL_RANGE) || target_temperature[e] == 0) { pid_output = 0; pid_reset[e] = true; } @@ -681,7 +690,7 @@ void manage_heater() { // the nominal filament diameter then square it to get an area meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY); float vm = pow((measurement_delay[meas_shift_index] + 100.0) / 100.0, 2); - if (vm < 0.01) vm = 0.01; + NOLESS(vm, 0.01); volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = vm; } #endif //FILAMENT_SENSOR @@ -707,7 +716,7 @@ void manage_heater() { if (current_temperature_bed > BED_MINTEMP && current_temperature_bed < BED_MAXTEMP) { if (current_temperature_bed >= target_temperature_bed + BED_HYSTERESIS) soft_pwm_bed = 0; - else if (current_temperature_bed <= target_temperature_bed - BED_HYSTERESIS) + else if (current_temperature_bed <= target_temperature_bed - (BED_HYSTERESIS)) soft_pwm_bed = MAX_BED_POWER >> 1; } else { @@ -768,7 +777,7 @@ static float analog2temp(int raw, uint8_t e) { return celsius; } - return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET; + return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN)) + TEMP_SENSOR_AD595_OFFSET; } // Derived from RepRap FiveD extruder::getTemperature() @@ -795,7 +804,7 @@ static float analog2tempBed(int raw) { #elif defined(BED_USES_AD595) - return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET; + return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN)) + TEMP_SENSOR_AD595_OFFSET; #else @@ -845,7 +854,7 @@ static void updateTemperaturesFromRawValues() { int widthFil_to_size_ratio() { float temp = filament_width_meas; if (temp < MEASURED_LOWER_LIMIT) temp = filament_width_nominal; //assume sensor cut out - else if (temp > MEASURED_UPPER_LIMIT) temp = MEASURED_UPPER_LIMIT; + else NOMORE(temp, MEASURED_UPPER_LIMIT); return filament_width_nominal / temp * 100; } @@ -859,8 +868,8 @@ static void updateTemperaturesFromRawValues() { void tp_init() { #if MB(RUMBA) && ((TEMP_SENSOR_0==-1)||(TEMP_SENSOR_1==-1)||(TEMP_SENSOR_2==-1)||(TEMP_SENSOR_BED==-1)) //disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector - MCUCR = BIT(JTD); - MCUCR = BIT(JTD); + MCUCR = _BV(JTD); + MCUCR = _BV(JTD); #endif // Finish init of mult extruder arrays @@ -869,14 +878,14 @@ void tp_init() { maxttemp[e] = maxttemp[0]; #if ENABLED(PIDTEMP) temp_iState_min[e] = 0.0; - temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki, e); + temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki, e); #if ENABLED(PID_ADD_EXTRUSION_RATE) last_position[e] = 0; #endif #endif //PIDTEMP #if ENABLED(PIDTEMPBED) temp_iState_min_bed = 0.0; - temp_iState_max_bed = PID_BED_INTEGRAL_DRIVE_MAX / bedKi; + temp_iState_max_bed = (PID_BED_INTEGRAL_DRIVE_MAX) / bedKi; #endif //PIDTEMPBED } @@ -895,15 +904,40 @@ void tp_init() { #if HAS_HEATER_BED SET_OUTPUT(HEATER_BED_PIN); #endif - #if HAS_FAN - SET_OUTPUT(FAN_PIN); - #if ENABLED(FAST_PWM_FAN) - setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + + #if ENABLED(FAST_PWM_FAN) || ENABLED(FAN_SOFT_PWM) + + #if HAS_FAN0 + SET_OUTPUT(FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #if ENABLED(FAN_SOFT_PWM) + soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2; + #endif #endif - #if ENABLED(FAN_SOFT_PWM) - soft_pwm_fan = fanSpeedSoftPwm / 2; + + #if HAS_FAN1 + SET_OUTPUT(FAN1_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN1_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #if ENABLED(FAN_SOFT_PWM) + soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2; + #endif #endif - #endif + + #if HAS_FAN2 + SET_OUTPUT(FAN2_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN2_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #if ENABLED(FAN_SOFT_PWM) + soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2; + #endif + #endif + + #endif // FAST_PWM_FAN || FAN_SOFT_PWM #if ENABLED(HEATER_0_USES_MAX6675) @@ -921,13 +955,13 @@ void tp_init() { #endif //HEATER_0_USES_MAX6675 #ifdef DIDR2 - #define ANALOG_SELECT(pin) do{ if (pin < 8) DIDR0 |= BIT(pin); else DIDR2 |= BIT(pin - 8); }while(0) + #define ANALOG_SELECT(pin) do{ if (pin < 8) SBI(DIDR0, pin); else SBI(DIDR2, pin - 8); }while(0) #else - #define ANALOG_SELECT(pin) do{ DIDR0 |= BIT(pin); }while(0) + #define ANALOG_SELECT(pin) do{ SBI(DIDR0, pin); }while(0) #endif // Set analog inputs - ADCSRA = BIT(ADEN) | BIT(ADSC) | BIT(ADIF) | 0x07; + ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07; DIDR0 = 0; #ifdef DIDR2 DIDR2 = 0; @@ -967,7 +1001,7 @@ void tp_init() { // Use timer0 for temperature measurement // Interleave temperature interrupt with millies interrupt OCR0B = 128; - TIMSK0 |= BIT(OCIE0B); + SBI(TIMSK0, OCIE0B); // Wait for temperature measurement to settle delay(250); @@ -1049,7 +1083,7 @@ void tp_init() { void start_watching_heater(int e) { if (degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1)) { watch_target_temp[e] = degHotend(e) + WATCH_TEMP_INCREASE; - watch_heater_next_ms[e] = millis() + WATCH_TEMP_PERIOD * 1000UL; + watch_heater_next_ms[e] = millis() + (WATCH_TEMP_PERIOD) * 1000UL; } else watch_heater_next_ms[e] = 0; @@ -1118,14 +1152,17 @@ void disable_all_heaters() { for (int i = 0; i < EXTRUDERS; i++) setTargetHotend(0, i); setTargetBed(0); + // If all heaters go down then for sure our print job has stopped + print_job_stop(true); + #define DISABLE_HEATER(NR) { \ - target_temperature[NR] = 0; \ + setTargetHotend(NR, 0); \ soft_pwm[NR] = 0; \ WRITE_HEATER_ ## NR (LOW); \ } - #if HAS_TEMP_0 - target_temperature[0] = 0; + #if HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675) + setTargetHotend(0, 0); soft_pwm[0] = 0; WRITE_HEATER_0P(LOW); // Should HEATERS_PARALLEL apply here? Then change to DISABLE_HEATER(0) #endif @@ -1152,59 +1189,63 @@ void disable_all_heaters() { } #if ENABLED(HEATER_0_USES_MAX6675) + #define MAX6675_HEAT_INTERVAL 250u + + #if ENABLED(MAX6675_IS_MAX31855) + unsigned long max6675_temp = 2000; + #define MAX6675_READ_BYTES 4 + #define MAX6675_ERROR_MASK 7 + #define MAX6675_DISCARD_BITS 18 + #else + unsigned int max6675_temp = 2000; + #define MAX6675_READ_BYTES 2 + #define MAX6675_ERROR_MASK 4 + #define MAX6675_DISCARD_BITS 3 + #endif + static millis_t next_max6675_ms = 0; - int max6675_temp = 2000; static int read_max6675() { millis_t ms = millis(); - if (ms < next_max6675_ms) - return max6675_temp; + if (ms < next_max6675_ms) return (int)max6675_temp; next_max6675_ms = ms + MAX6675_HEAT_INTERVAL; - max6675_temp = 0; - - #ifdef PRR - PRR &= ~BIT(PRSPI); - #elif defined(PRR0) - PRR0 &= ~BIT(PRSPI); - #endif - - SPCR = BIT(MSTR) | BIT(SPE) | BIT(SPR0); + CBI( + #ifdef PRR + PRR + #elif defined(PRR0) + PRR0 + #endif + , PRSPI); + SPCR = _BV(MSTR) | _BV(SPE) | _BV(SPR0); - // enable TT_MAX6675 - WRITE(MAX6675_SS, 0); + WRITE(MAX6675_SS, 0); // enable TT_MAX6675 // ensure 100ns delay - a bit extra is fine asm("nop");//50ns on 20Mhz, 62.5ns on 16Mhz asm("nop");//50ns on 20Mhz, 62.5ns on 16Mhz - // read MSB - SPDR = 0; - for (; (SPSR & BIT(SPIF)) == 0;); - max6675_temp = SPDR; - max6675_temp <<= 8; - - // read LSB - SPDR = 0; - for (; (SPSR & BIT(SPIF)) == 0;); - max6675_temp |= SPDR; + // Read a big-endian temperature value + max6675_temp = 0; + for (uint8_t i = MAX6675_READ_BYTES; i--;) { + SPDR = 0; + for (;!TEST(SPSR, SPIF);); + max6675_temp |= SPDR; + if (i > 0) max6675_temp <<= 8; // shift left if not the last byte + } - // disable TT_MAX6675 - WRITE(MAX6675_SS, 1); + WRITE(MAX6675_SS, 1); // disable TT_MAX6675 - if (max6675_temp & 4) { - // thermocouple open - max6675_temp = 4000; - } - else { - max6675_temp = max6675_temp >> 3; - } + if (max6675_temp & MAX6675_ERROR_MASK) + max6675_temp = 4000; // thermocouple open + else + max6675_temp >>= MAX6675_DISCARD_BITS; - return max6675_temp; + return (int)max6675_temp; } #endif //HEATER_0_USES_MAX6675 @@ -1263,7 +1304,7 @@ ISR(TIMER0_COMPB_vect) { static unsigned char temp_count = 0; static TempState temp_state = StartupDelay; - static unsigned char pwm_count = BIT(SOFT_PWM_SCALE); + static unsigned char pwm_count = _BV(SOFT_PWM_SCALE); // Static members for each heater #if ENABLED(SLOW_PWM_HEATERS) @@ -1323,9 +1364,20 @@ ISR(TIMER0_COMPB_vect) { soft_pwm_BED = soft_pwm_bed; WRITE_HEATER_BED(soft_pwm_BED > 0 ? 1 : 0); #endif + #if ENABLED(FAN_SOFT_PWM) - soft_pwm_fan = fanSpeedSoftPwm / 2; - WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0); + #if HAS_FAN0 + soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2; + WRITE_FAN(soft_pwm_fan[0] > 0 ? 1 : 0); + #endif + #if HAS_FAN1 + soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2; + WRITE_FAN1(soft_pwm_fan[1] > 0 ? 1 : 0); + #endif + #if HAS_FAN2 + soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2; + WRITE_FAN2(soft_pwm_fan[2] > 0 ? 1 : 0); + #endif #endif } @@ -1345,10 +1397,18 @@ ISR(TIMER0_COMPB_vect) { #endif #if ENABLED(FAN_SOFT_PWM) - if (soft_pwm_fan < pwm_count) WRITE_FAN(0); + #if HAS_FAN0 + if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0); + #endif + #if HAS_FAN1 + if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0); + #endif + #if HAS_FAN2 + if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0); + #endif #endif - pwm_count += BIT(SOFT_PWM_SCALE); + pwm_count += _BV(SOFT_PWM_SCALE); pwm_count &= 0x7f; #else // SLOW_PWM_HEATERS @@ -1424,13 +1484,31 @@ ISR(TIMER0_COMPB_vect) { #if ENABLED(FAN_SOFT_PWM) if (pwm_count == 0) { - soft_pwm_fan = fanSpeedSoftPwm / 2; - WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0); + #if HAS_FAN0 + soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2; + WRITE_FAN(soft_pwm_fan[0] > 0 ? 1 : 0); + #endif + #if HAS_FAN1 + soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2; + WRITE_FAN1(soft_pwm_fan[1] > 0 ? 1 : 0); + #endif + #if HAS_FAN2 + soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2; + WRITE_FAN2(soft_pwm_fan[2] > 0 ? 1 : 0); + #endif } - if (soft_pwm_fan < pwm_count) WRITE_FAN(0); + #if HAS_FAN0 + if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0); + #endif + #if HAS_FAN1 + if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0); + #endif + #if HAS_FAN2 + if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0); + #endif #endif //FAN_SOFT_PWM - pwm_count += BIT(SOFT_PWM_SCALE); + pwm_count += _BV(SOFT_PWM_SCALE); pwm_count &= 0x7f; // increment slow_pwm_count only every 64 pwm_count circa 65.5ms @@ -1456,9 +1534,9 @@ ISR(TIMER0_COMPB_vect) { #endif // SLOW_PWM_HEATERS - #define SET_ADMUX_ADCSRA(pin) ADMUX = BIT(REFS0) | (pin & 0x07); ADCSRA |= BIT(ADSC) + #define SET_ADMUX_ADCSRA(pin) ADMUX = _BV(REFS0) | (pin & 0x07); SBI(ADCSRA, ADSC) #ifdef MUX5 - #define START_ADC(pin) if (pin > 7) ADCSRB = BIT(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) + #define START_ADC(pin) if (pin > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) #else #define START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) #endif diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 29a6920ce925303512bc768cafba7d451bb1a194..1a4d648f31533c67f837d9037eb1b27e5299eca9 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -141,7 +141,7 @@ int getHeaterPower(int heater); void disable_all_heaters(); void updatePID(); -void PID_autotune(float temp, int extruder, int ncycles); +void PID_autotune(float temp, int extruder, int ncycles, bool set_result=false); void setExtruderAutoFanState(int pin, bool state); void checkExtruderAutoFans(); diff --git a/Marlin/thermistortables.h b/Marlin/thermistortables.h index 425cc8968eb6a2a36a9cc2e9faad97823e5aca3a..23d2ab372f8eb1faefd46d856ba521c4932b4c78 100644 --- a/Marlin/thermistortables.h +++ b/Marlin/thermistortables.h @@ -873,7 +873,7 @@ const short temptable_55[][2] PROGMEM = { }; #endif -#if (THERMISTORHEATER_0 == 60) || (THERMISTORHEATER_1 == 60) || (THERMISTORHEATER_2 == 60) || (THERMISTORHEATER_3 == 60) || (THERMISTORBED == 60) // Maker's Tool Works Kapton Bed Thermister +#if (THERMISTORHEATER_0 == 60) || (THERMISTORHEATER_1 == 60) || (THERMISTORHEATER_2 == 60) || (THERMISTORHEATER_3 == 60) || (THERMISTORBED == 60) // Maker's Tool Works Kapton Bed Thermistor // ./createTemperatureLookup.py --r0=100000 --t0=25 --r1=0 --r2=4700 --beta=3950 // r0: 100000 // t0: 25 @@ -957,7 +957,7 @@ const short temptable_60[][2] PROGMEM = { {1008 * OVERSAMPLENR, 0}, }; #endif -#if (THERMISTORBED == 12) +#if (THERMISTORHEATER_0 == 12) || (THERMISTORHEATER_1 == 12) || (THERMISTORHEATER_2 == 12) || (THERMISTORHEATER_3 == 12) || (THERMISTORBED == 12) //100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) const short temptable_12[][2] PROGMEM = { {35 * OVERSAMPLENR, 180}, //top rating 180C @@ -993,6 +993,72 @@ const short temptable_12[][2] PROGMEM = { }; #endif +#if (THERMISTORHEATER_0 == 70) || (THERMISTORHEATER_1 == 70) || (THERMISTORHEATER_2 == 70) || (THERMISTORHEATER_3 == 70) || (THERMISTORBED == 70) // bqh2 stock thermistor +const short temptable_70[][2] PROGMEM = { + { 22 * OVERSAMPLENR , 300 }, + { 24 * OVERSAMPLENR , 295 }, + { 25 * OVERSAMPLENR , 290 }, + { 27 * OVERSAMPLENR , 285 }, + { 29 * OVERSAMPLENR , 280 }, + { 32 * OVERSAMPLENR , 275 }, + { 34 * OVERSAMPLENR , 270 }, + { 37 * OVERSAMPLENR , 265 }, + { 40 * OVERSAMPLENR , 260 }, + { 43 * OVERSAMPLENR , 255 }, + { 46 * OVERSAMPLENR , 250 }, + { 50 * OVERSAMPLENR , 245 }, + { 54 * OVERSAMPLENR , 240 }, + { 59 * OVERSAMPLENR , 235 }, + { 64 * OVERSAMPLENR , 230 }, + { 70 * OVERSAMPLENR , 225 }, + { 76 * OVERSAMPLENR , 220 }, + { 83 * OVERSAMPLENR , 215 }, + { 90 * OVERSAMPLENR , 210 }, + { 99 * OVERSAMPLENR , 205 }, + { 108 * OVERSAMPLENR , 200 }, + { 118 * OVERSAMPLENR , 195 }, + { 129 * OVERSAMPLENR , 190 }, + { 141 * OVERSAMPLENR , 185 }, + { 154 * OVERSAMPLENR , 180 }, + { 169 * OVERSAMPLENR , 175 }, + { 185 * OVERSAMPLENR , 170 }, + { 203 * OVERSAMPLENR , 165 }, + { 222 * OVERSAMPLENR , 160 }, + { 243 * OVERSAMPLENR , 155 }, + { 266 * OVERSAMPLENR , 150 }, + { 290 * OVERSAMPLENR , 145 }, + { 317 * OVERSAMPLENR , 140 }, + { 346 * OVERSAMPLENR , 135 }, + { 376 * OVERSAMPLENR , 130 }, + { 408 * OVERSAMPLENR , 125 }, + { 442 * OVERSAMPLENR , 120 }, + { 477 * OVERSAMPLENR , 115 }, + { 513 * OVERSAMPLENR , 110 }, + { 551 * OVERSAMPLENR , 105 }, + { 588 * OVERSAMPLENR , 100 }, + { 626 * OVERSAMPLENR , 95 }, + { 663 * OVERSAMPLENR , 90 }, + { 699 * OVERSAMPLENR , 85 }, + { 735 * OVERSAMPLENR , 80 }, + { 768 * OVERSAMPLENR , 75 }, + { 800 * OVERSAMPLENR , 70 }, + { 829 * OVERSAMPLENR , 65 }, + { 856 * OVERSAMPLENR , 60 }, + { 881 * OVERSAMPLENR , 55 }, + { 903 * OVERSAMPLENR , 50 }, + { 922 * OVERSAMPLENR , 45 }, + { 939 * OVERSAMPLENR , 40 }, + { 954 * OVERSAMPLENR , 35 }, + { 966 * OVERSAMPLENR , 30 }, + { 977 * OVERSAMPLENR , 25 }, + { 986 * OVERSAMPLENR , 20 }, + { 994 * OVERSAMPLENR , 15 }, + { 1000 * OVERSAMPLENR , 10 }, + { 1005 * OVERSAMPLENR , 5 }, + { 1009 * OVERSAMPLENR , 0 } //safety +}; +#endif + // Pt1000 and Pt100 handling // // Rt=R0*(1+a*T+b*T*T) [for T>0] diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 05af60b6f4cdb2aae5864088eb8187bb6b364a5b..43f112e8c88374ede1c970f8dedbef9553d0132d 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -7,6 +7,27 @@ #include "stepper.h" #include "configuration_store.h" +/** + * REVERSE_MENU_DIRECTION + * + * To reverse the menu direction we need a general way to reverse + * the direction of the encoder everywhere. So encoderDirection is + * added to allow the encoder to go the other way. + * + * This behavior is limited to scrolling Menus and SD card listings, + * and is disabled in other contexts. + */ +#if ENABLED(REVERSE_MENU_DIRECTION) + int8_t encoderDirection = 1; + #define ENCODER_DIRECTION_NORMAL() (encoderDirection = 1) + #define ENCODER_DIRECTION_MENUS() (encoderDirection = -1) +#else + #define ENCODER_DIRECTION_NORMAL() ; + #define ENCODER_DIRECTION_MENUS() ; +#endif + +uint8_t blink = 0; // Variable for animation + int8_t encoderDiff; // updated from interrupt context and added to encoderPosition every LCD update bool encoderRateMultiplierEnabled; @@ -28,7 +49,7 @@ int absPreheatFanSpeed; typedef void (*menuFunc_t)(); uint8_t lcd_status_message_level; -char lcd_status_message[3 * LCD_WIDTH + 1] = WELCOME_MSG; // worst case is kana with up to 3*LCD_WIDTH+1 +char lcd_status_message[3 * (LCD_WIDTH) + 1] = WELCOME_MSG; // worst case is kana with up to 3*LCD_WIDTH+1 #if ENABLED(DOGLCD) #include "dogm_lcd_implementation.h" @@ -130,10 +151,11 @@ static void lcd_status_screen(); * START_MENU generates the init code for a menu function */ #define START_MENU() do { \ + ENCODER_DIRECTION_MENUS(); \ encoderRateMultiplierEnabled = false; \ if (encoderPosition > 0x8000) encoderPosition = 0; \ uint8_t encoderLine = encoderPosition / ENCODER_STEPS_PER_MENU_ITEM; \ - if (encoderLine < currentMenuViewOffset) currentMenuViewOffset = encoderLine; \ + NOMORE(currentMenuViewOffset, encoderLine); \ uint8_t _lineNr = currentMenuViewOffset, _menuItemNr; \ bool wasClicked = LCD_CLICKED, itemSelected; \ for (uint8_t _drawLineNr = 0; _drawLineNr < LCD_HEIGHT; _drawLineNr++, _lineNr++) { \ @@ -209,8 +231,8 @@ static void lcd_status_screen(); #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(type, label, args...) MENU_ITEM(setting_edit_callback_ ## type, label, PSTR(label), ## args) #endif //!ENCODER_RATE_MULTIPLIER #define END_MENU() \ - if (encoderLine >= _menuItemNr) { encoderPosition = _menuItemNr * ENCODER_STEPS_PER_MENU_ITEM - 1; encoderLine = encoderPosition / ENCODER_STEPS_PER_MENU_ITEM; }\ - if (encoderLine >= currentMenuViewOffset + LCD_HEIGHT) { currentMenuViewOffset = encoderLine - LCD_HEIGHT + 1; lcdDrawUpdate = 1; _lineNr = currentMenuViewOffset - 1; _drawLineNr = -1; } \ + if (encoderLine >= _menuItemNr) { encoderPosition = _menuItemNr * (ENCODER_STEPS_PER_MENU_ITEM) - 1; encoderLine = _menuItemNr - 1; }\ + if (encoderLine >= currentMenuViewOffset + LCD_HEIGHT) { currentMenuViewOffset = encoderLine - (LCD_HEIGHT) + 1; lcdDrawUpdate = 1; _lineNr = currentMenuViewOffset - 1; _drawLineNr = -1; } \ } } while(0) /** Used variables to keep track of the menu */ @@ -268,6 +290,10 @@ static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const ui } } +inline void lcd_save_previous_menu() { prevMenu = currentMenu; prevEncoderPosition = encoderPosition; } + +static void lcd_goto_previous_menu() { lcd_goto_menu(prevMenu, true, prevEncoderPosition); } + /** * * "Info Screen" @@ -276,6 +302,7 @@ static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const ui */ static void lcd_status_screen() { + ENCODER_DIRECTION_NORMAL(); encoderRateMultiplierEnabled = false; #if ENABLED(LCD_PROGRESS_BAR) @@ -352,7 +379,7 @@ static void lcd_status_screen() { } if (feedrate_multiplier == 100) { if (int(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) { - feedrate_multiplier += int(encoderPosition) - ENCODER_FEEDRATE_DEADZONE; + feedrate_multiplier += int(encoderPosition) - (ENCODER_FEEDRATE_DEADZONE); encoderPosition = 0; } else if (int(encoderPosition) < -ENCODER_FEEDRATE_DEADZONE) { @@ -452,24 +479,51 @@ static void lcd_main_menu() { */ void lcd_set_home_offsets() { // M428 Command - enqueuecommands_P(PSTR("M428")); + enqueue_and_echo_commands_P(PSTR("M428")); lcd_return_to_status(); } - #if ENABLED(BABYSTEPPING) - static void _lcd_babystep(int axis, const char* msg) { + static void _lcd_babystep(const int axis, const char* msg) { + ENCODER_DIRECTION_NORMAL(); if (encoderPosition != 0) { - babystepsTodo[axis] += BABYSTEP_MULTIPLICATOR * (int)encoderPosition; encoderPosition = 0; lcdDrawUpdate = 1; + int distance = (int)encoderPosition * BABYSTEP_MULTIPLICATOR; + #if ENABLED(COREXY) || ENABLED(COREXZ) + #if ENABLED(BABYSTEP_XY) + switch(axis) { + case X_AXIS: // X on CoreXY and CoreXZ + babystepsTodo[A_AXIS] += distance * 2; + babystepsTodo[CORE_AXIS_2] += distance * 2; + break; + case CORE_AXIS_2: // Y on CoreXY, Z on CoreXZ + babystepsTodo[A_AXIS] += distance * 2; + babystepsTodo[CORE_AXIS_2] -= distance * 2; + break; + case CORE_AXIS_3: // Z on CoreXY, Y on CoreXZ + babystepsTodo[CORE_AXIS_3] += distance; + break; + } + #elif ENABLED(COREXZ) + babystepsTodo[A_AXIS] += distance * 2; + babystepsTodo[C_AXIS] -= distance * 2; + #else + babystepsTodo[Z_AXIS] += distance; + #endif + #else + babystepsTodo[axis] += distance; + #endif } - if (lcdDrawUpdate) lcd_implementation_drawedit(msg, ""); - if (LCD_CLICKED) lcd_goto_menu(lcd_tune_menu); + if (lcdDrawUpdate) lcd_implementation_drawedit(msg, PSTR("")); + if (LCD_CLICKED) lcd_goto_previous_menu(); } - static void lcd_babystep_x() { _lcd_babystep(X_AXIS, PSTR(MSG_BABYSTEPPING_X)); } - static void lcd_babystep_y() { _lcd_babystep(Y_AXIS, PSTR(MSG_BABYSTEPPING_Y)); } + + #if ENABLED(BABYSTEP_XY) + static void lcd_babystep_x() { _lcd_babystep(X_AXIS, PSTR(MSG_BABYSTEPPING_X)); } + static void lcd_babystep_y() { _lcd_babystep(Y_AXIS, PSTR(MSG_BABYSTEPPING_Y)); } + #endif static void lcd_babystep_z() { _lcd_babystep(Z_AXIS, PSTR(MSG_BABYSTEPPING_Z)); } #endif //BABYSTEPPING @@ -504,10 +558,25 @@ void lcd_set_home_offsets() { void watch_temp_callback_E3() {} #endif // EXTRUDERS > 3 #endif + /** - * Items shared between Tune and Temperature menus + * + * "Tune" submenu + * */ -static void nozzle_bed_fan_menu_items(uint8_t &encoderLine, uint8_t &_lineNr, uint8_t &_drawLineNr, uint8_t &_menuItemNr, bool &wasClicked, bool &itemSelected) { +static void lcd_tune_menu() { + START_MENU(); + + // + // ^ Main + // + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + + // + // Speed: + // + MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_multiplier, 10, 999); + // // Nozzle: // Nozzle [1-4]: @@ -545,30 +614,22 @@ static void nozzle_bed_fan_menu_items(uint8_t &encoderLine, uint8_t &_lineNr, ui // // Fan Speed: // - MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); -} - - -/** - * - * "Tune" submenu - * - */ -static void lcd_tune_menu() { - START_MENU(); - - // - // ^ Main - // - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); - - // - // Speed: - // - MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_multiplier, 10, 999); - - // Nozzle, Bed, and Fan Control - nozzle_bed_fan_menu_items(encoderLine, _lineNr, _drawLineNr, _menuItemNr, wasClicked, itemSelected); + #if FAN_COUNT > 0 + #if HAS_FAN0 + #if FAN_COUNT > 1 + #define MSG_1ST_FAN_SPEED MSG_FAN_SPEED " 1" + #else + #define MSG_1ST_FAN_SPEED MSG_FAN_SPEED + #endif + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_1ST_FAN_SPEED, &fanSpeeds[0], 0, 255); + #endif + #if HAS_FAN1 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); + #endif + #if HAS_FAN2 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); + #endif + #endif // FAN_COUNT > 0 // // Flow: @@ -619,7 +680,13 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa #if TEMP_SENSOR_BED != 0 setTargetBed(tempb); #endif - fanSpeed = fan; + #if FAN_COUNT > 0 + #if FAN_COUNT > 1 + fanSpeeds[active_extruder < FAN_COUNT ? active_extruder : 0] = fan; + #else + fanSpeeds[0] = fan; + #endif + #endif lcd_return_to_status(); } @@ -709,8 +776,10 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa #endif // TEMP_SENSOR_0 && (TEMP_SENSOR_1 || TEMP_SENSOR_2 || TEMP_SENSOR_3 || TEMP_SENSOR_BED) void lcd_cooldown() { + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #endif disable_all_heaters(); - fanSpeed = 0; lcd_return_to_status(); } @@ -832,31 +901,40 @@ float move_menu_scale; static void lcd_move_menu_axis(); static void _lcd_move(const char* name, AxisEnum axis, int min, int max) { - if (encoderPosition != 0) { + ENCODER_DIRECTION_NORMAL(); + if ((encoderPosition != 0) && (movesplanned() <= 3)) { refresh_cmd_timeout(); current_position[axis] += float((int)encoderPosition) * move_menu_scale; - if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; - if (max_software_endstops && current_position[axis] > max) current_position[axis] = max; + if (min_software_endstops) NOLESS(current_position[axis], min); + if (max_software_endstops) NOMORE(current_position[axis], max); encoderPosition = 0; line_to_current(axis); lcdDrawUpdate = 1; } if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis])); - if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); + if (LCD_CLICKED) lcd_goto_previous_menu(); } -static void lcd_move_x() { _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, X_MIN_POS, X_MAX_POS); } -static void lcd_move_y() { _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, Y_MIN_POS, Y_MAX_POS); } +#if ENABLED(DELTA) + static float delta_clip_radius_2 = (DELTA_PRINTABLE_RADIUS) * (DELTA_PRINTABLE_RADIUS); + static int delta_clip( float a ) { return sqrt(delta_clip_radius_2 - a*a); } + static void lcd_move_x() { int clip = delta_clip(current_position[Y_AXIS]); _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, max(X_MIN_POS, -clip), min(X_MAX_POS, clip)); } + static void lcd_move_y() { int clip = delta_clip(current_position[X_AXIS]); _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, max(X_MIN_POS, -clip), min(X_MAX_POS, clip)); } +#else + static void lcd_move_x() { _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, X_MIN_POS, X_MAX_POS); } + static void lcd_move_y() { _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, Y_MIN_POS, Y_MAX_POS); } +#endif static void lcd_move_z() { _lcd_move(PSTR(MSG_MOVE_Z), Z_AXIS, Z_MIN_POS, Z_MAX_POS); } static void lcd_move_e( #if EXTRUDERS > 1 uint8_t e #endif ) { + ENCODER_DIRECTION_NORMAL(); #if EXTRUDERS > 1 unsigned short original_active_extruder = active_extruder; active_extruder = e; #endif - if (encoderPosition != 0) { + if ((encoderPosition != 0) && (movesplanned() <= 3)) { current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale; encoderPosition = 0; line_to_current(E_AXIS); @@ -880,7 +958,7 @@ static void lcd_move_e( #endif //EXTRUDERS > 1 lcd_implementation_drawedit(pos_label, ftostr31(current_position[E_AXIS])); } - if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); + if (LCD_CLICKED) lcd_goto_previous_menu(); #if EXTRUDERS > 1 active_extruder = original_active_extruder; #endif @@ -989,6 +1067,33 @@ static void lcd_control_menu() { * */ +#if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED) + + #if ENABLED(PIDTEMP) + int autotune_temp[EXTRUDERS] = { 150 }; + const int heater_maxtemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP); + #endif + + #if ENABLED(PIDTEMPBED) + int autotune_temp_bed = 70; + #endif + + static void _lcd_autotune(int e) { + char cmd[30]; + sprintf_P(cmd, PSTR("M303 U1 E%d S%d"), e, + #if ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED) + e < 0 ? autotune_temp_bed : autotune_temp[e] + #elif ENABLED(PIDTEMPBED) + autotune_temp_bed + #else + autotune_temp[e] + #endif + ); + enqueue_and_echo_command_now(cmd); + } + +#endif PIDTEMP || PIDTEMPBED + #if ENABLED(PIDTEMP) // Helpers for editing PID Ki & Kd values @@ -1001,18 +1106,19 @@ static void lcd_control_menu() { PID_PARAM(Kd, e) = scalePID_d(raw_Kd); updatePID(); } - #define COPY_AND_SCALE(eindex) \ + #define _PIDTEMP_FUNCTIONS(eindex) \ void copy_and_scalePID_i_E ## eindex() { copy_and_scalePID_i(eindex); } \ - void copy_and_scalePID_d_E ## eindex() { copy_and_scalePID_d(eindex); } + void copy_and_scalePID_d_E ## eindex() { copy_and_scalePID_d(eindex); } \ + void lcd_autotune_callback_E ## eindex() { _lcd_autotune(eindex); } - COPY_AND_SCALE(0); + _PIDTEMP_FUNCTIONS(0); #if ENABLED(PID_PARAMS_PER_EXTRUDER) #if EXTRUDERS > 1 - COPY_AND_SCALE(1); + _PIDTEMP_FUNCTIONS(1); #if EXTRUDERS > 2 - COPY_AND_SCALE(2); + _PIDTEMP_FUNCTIONS(2); #if EXTRUDERS > 3 - COPY_AND_SCALE(3); + _PIDTEMP_FUNCTIONS(3); #endif //EXTRUDERS > 3 #endif //EXTRUDERS > 2 #endif //EXTRUDERS > 1 @@ -1033,8 +1139,59 @@ static void lcd_control_temperature_menu() { // MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); - // Nozzle, Bed, and Fan Control - nozzle_bed_fan_menu_items(encoderLine, _lineNr, _drawLineNr, _menuItemNr, wasClicked, itemSelected); + // + // Nozzle: + // Nozzle [1-4]: + // + #if EXTRUDERS == 1 + #if TEMP_SENSOR_0 != 0 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + #endif + #else //EXTRUDERS > 1 + #if TEMP_SENSOR_0 != 0 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N1, &target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + #endif + #if TEMP_SENSOR_1 != 0 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N2, &target_temperature[1], 0, HEATER_1_MAXTEMP - 15, watch_temp_callback_E1); + #endif + #if EXTRUDERS > 2 + #if TEMP_SENSOR_2 != 0 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N3, &target_temperature[2], 0, HEATER_2_MAXTEMP - 15, watch_temp_callback_E2); + #endif + #if EXTRUDERS > 3 + #if TEMP_SENSOR_3 != 0 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3); + #endif + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + // + // Bed: + // + #if TEMP_SENSOR_BED != 0 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 15); + #endif + + // + // Fan Speed: + // + #if FAN_COUNT > 0 + #if HAS_FAN0 + #if FAN_COUNT > 1 + #define MSG_1ST_FAN_SPEED MSG_FAN_SPEED " 1" + #else + #define MSG_1ST_FAN_SPEED MSG_FAN_SPEED + #endif + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_1ST_FAN_SPEED, &fanSpeeds[0], 0, 255); + #endif + #if HAS_FAN1 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); + #endif + #if HAS_FAN2 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); + #endif + #endif // FAN_COUNT > 0 // // Autotemp, Min, Max, Fact @@ -1047,15 +1204,15 @@ static void lcd_control_temperature_menu() { #endif // - // PID-P, PID-I, PID-D, PID-C - // PID-P E1, PID-I E1, PID-D E1, PID-C E1 - // PID-P E2, PID-I E2, PID-D E2, PID-C E2 - // PID-P E3, PID-I E3, PID-D E3, PID-C E3 - // PID-P E4, PID-I E4, PID-D E4, PID-C E4 + // PID-P, PID-I, PID-D, PID-C, PID Autotune + // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1 + // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2 + // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3 + // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4 // #if ENABLED(PIDTEMP) - #define _PID_MENU_ITEMS(ELABEL, eindex) \ + #define _PID_BASE_MENU_ITEMS(ELABEL, eindex) \ raw_Ki = unscalePID_i(PID_PARAM(Ki, eindex)); \ raw_Kd = unscalePID_d(PID_PARAM(Kd, eindex)); \ MENU_ITEM_EDIT(float52, MSG_PID_P ELABEL, &PID_PARAM(Kp, eindex), 1, 9990); \ @@ -1063,13 +1220,17 @@ static void lcd_control_temperature_menu() { MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D ELABEL, &raw_Kd, 1, 9990, copy_and_scalePID_d_E ## eindex) #if ENABLED(PID_ADD_EXTRUSION_RATE) - #define PID_MENU_ITEMS(ELABEL, eindex) \ - _PID_MENU_ITEMS(ELABEL, eindex); \ + #define _PID_MENU_ITEMS(ELABEL, eindex) \ + _PID_BASE_MENU_ITEMS(ELABEL, eindex); \ MENU_ITEM_EDIT(float3, MSG_PID_C ELABEL, &PID_PARAM(Kc, eindex), 1, 9990) #else - #define PID_MENU_ITEMS(ELABEL, eindex) _PID_MENU_ITEMS(ELABEL, eindex) + #define _PID_MENU_ITEMS(ELABEL, eindex) _PID_BASE_MENU_ITEMS(ELABEL, eindex) #endif + #define PID_MENU_ITEMS(ELABEL, eindex) \ + _PID_MENU_ITEMS(ELABEL, eindex); \ + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PID_AUTOTUNE ELABEL, &autotune_temp[eindex], 150, heater_maxtemp[eindex] - 15, lcd_autotune_callback_E ## eindex) + #if ENABLED(PID_PARAMS_PER_EXTRUDER) && EXTRUDERS > 1 PID_MENU_ITEMS(MSG_E1, 0); PID_MENU_ITEMS(MSG_E2, 1); @@ -1152,7 +1313,11 @@ static void lcd_control_motion_menu() { #endif MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 10, 99000); MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990); - MENU_ITEM_EDIT(float52, MSG_VZ_JERK, &max_z_jerk, 0.1, 990); + #if ENABLED(DELTA) + MENU_ITEM_EDIT(float3, MSG_VZ_JERK, &max_z_jerk, 1, 990); + #else + MENU_ITEM_EDIT(float52, MSG_VZ_JERK, &max_z_jerk, 0.1, 990); + #endif MENU_ITEM_EDIT(float3, MSG_VE_JERK, &max_e_jerk, 1, 990); MENU_ITEM_EDIT(float3, MSG_VMAX MSG_X, &max_feedrate[X_AXIS], 1, 999); MENU_ITEM_EDIT(float3, MSG_VMAX MSG_Y, &max_feedrate[Y_AXIS], 1, 999); @@ -1168,7 +1333,11 @@ static void lcd_control_motion_menu() { MENU_ITEM_EDIT(float5, MSG_A_TRAVEL, &travel_acceleration, 100, 99000); MENU_ITEM_EDIT(float52, MSG_XSTEPS, &axis_steps_per_unit[X_AXIS], 5, 9999); MENU_ITEM_EDIT(float52, MSG_YSTEPS, &axis_steps_per_unit[Y_AXIS], 5, 9999); - MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); + #if ENABLED(DELTA) + MENU_ITEM_EDIT(float52, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); + #else + MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); + #endif MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &abort_on_endstop_hit); @@ -1216,6 +1385,7 @@ static void lcd_control_volumetric_menu() { */ #if ENABLED(HAS_LCD_CONTRAST) static void lcd_set_contrast() { + ENCODER_DIRECTION_NORMAL(); if (encoderPosition != 0) { #if ENABLED(U8GLIB_LM6059_AF) lcd_contrast += encoderPosition; @@ -1235,7 +1405,7 @@ static void lcd_control_volumetric_menu() { lcd_implementation_drawedit(PSTR(MSG_CONTRAST), itostr2(lcd_contrast)); #endif } - if (LCD_CLICKED) lcd_goto_menu(lcd_control_menu); + if (LCD_CLICKED) lcd_goto_previous_menu(); } #endif // HAS_LCD_CONTRAST @@ -1284,6 +1454,7 @@ static void lcd_control_volumetric_menu() { * */ void lcd_sdcard_menu() { + ENCODER_DIRECTION_MENUS(); if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return; // nothing to do (so don't thrash the SD card) uint16_t fileCnt = card.getnrfilenames(); START_MENU(); @@ -1324,9 +1495,31 @@ static void lcd_control_volumetric_menu() { * * Functions for editing single values * + * The "menu_edit_type" macro generates the functions needed to edit a numerical value. + * + * For example, menu_edit_type(int, int3, itostr3, 1) expands into these functions: + * + * bool _menu_edit_int3(); + * void menu_edit_int3(); // edit int (interactively) + * void menu_edit_callback_int3(); // edit int (interactively) with callback on completion + * static void _menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); + * static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); + * static void menu_action_setting_edit_callback_int3(const char* pstr, int* ptr, int minValue, int maxValue, menuFunc_t callback); // edit int with callback + * + * You can then use one of the menu macros to present the edit interface: + * MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_multiplier, 10, 999) + * + * This expands into a more primitive menu item: + * MENU_ITEM(setting_edit_int3, MSG_SPEED, PSTR(MSG_SPEED), &feedrate_multiplier, 10, 999) + * + * + * Also: MENU_MULTIPLIER_ITEM_EDIT, MENU_ITEM_EDIT_CALLBACK, and MENU_MULTIPLIER_ITEM_EDIT_CALLBACK + * + * menu_action_setting_edit_int3(PSTR(MSG_SPEED), &feedrate_multiplier, 10, 999) */ #define menu_edit_type(_type, _name, _strFunc, scale) \ bool _menu_edit_ ## _name () { \ + ENCODER_DIRECTION_NORMAL(); \ bool isClicked = LCD_CLICKED; \ if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ @@ -1334,15 +1527,14 @@ static void lcd_control_volumetric_menu() { lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \ if (isClicked) { \ *((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \ - lcd_goto_menu(prevMenu, prevEncoderPosition); \ + lcd_goto_previous_menu(); \ } \ return isClicked; \ } \ void menu_edit_ ## _name () { _menu_edit_ ## _name(); } \ void menu_edit_callback_ ## _name () { if (_menu_edit_ ## _name ()) (*callbackFunc)(); } \ static void _menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) { \ - prevMenu = currentMenu; \ - prevEncoderPosition = encoderPosition; \ + lcd_save_previous_menu(); \ \ lcdDrawUpdate = 2; \ currentMenu = menu_edit_ ## _name; \ @@ -1408,7 +1600,7 @@ menu_edit_type(unsigned long, long5, ftostr5, 0.01) lcd_move_y(); } static void reprapworld_keypad_move_home() { - enqueuecommands_P((PSTR("G28"))); // move all axis home + enqueue_and_echo_commands_P((PSTR("G28"))); // move all axis home } #endif // REPRAPWORLD_KEYPAD @@ -1459,19 +1651,14 @@ void lcd_quick_feedback() { * */ static void menu_action_back(menuFunc_t func) { lcd_goto_menu(func); } -static void menu_action_submenu(menuFunc_t func) { lcd_goto_menu(func); } -static void menu_action_gcode(const char* pgcode) { enqueuecommands_P(pgcode); } +static void menu_action_submenu(menuFunc_t func) { lcd_save_previous_menu(); lcd_goto_menu(func); } +static void menu_action_gcode(const char* pgcode) { enqueue_and_echo_commands_P(pgcode); } static void menu_action_function(menuFunc_t func) { (*func)(); } #if ENABLED(SDSUPPORT) static void menu_action_sdfile(const char* filename, char* longFilename) { - char cmd[30]; - char* c; - sprintf_P(cmd, PSTR("M23 %s"), filename); - for (c = &cmd[4]; *c; c++) *c = tolower(*c); - enqueuecommand(cmd); - enqueuecommands_P(PSTR("M24")); + card.openAndPrintFile(filename); lcd_return_to_status(); } @@ -1496,11 +1683,15 @@ void lcd_init() { lcd_implementation_init(); #if ENABLED(NEWPANEL) + #if BTN_EN1 > 0 + SET_INPUT(BTN_EN1); + WRITE(BTN_EN1, HIGH); + #endif - SET_INPUT(BTN_EN1); - SET_INPUT(BTN_EN2); - WRITE(BTN_EN1, HIGH); - WRITE(BTN_EN2, HIGH); + #if BTN_EN2 > 0 + SET_INPUT(BTN_EN2); + WRITE(BTN_EN2, HIGH); + #endif #if BTN_ENC > 0 SET_INPUT(BTN_ENC); @@ -1515,6 +1706,13 @@ void lcd_init() { WRITE(SHIFT_LD, HIGH); #endif + #ifdef RIGIDBOT_PANEL + SET_INPUT(BTN_UP); + SET_INPUT(BTN_DWN); + SET_INPUT(BTN_LFT); + SET_INPUT(BTN_RT); + #endif + #else // Not NEWPANEL #if ENABLED(SR_LCD_2W_NL) // Non latching 2 wire shift register @@ -1533,7 +1731,7 @@ void lcd_init() { #endif//!NEWPANEL #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - pinMode(SD_DETECT_PIN, INPUT); + SET_INPUT(SD_DETECT_PIN); WRITE(SD_DETECT_PIN, HIGH); lcd_sd_status = 2; // UNKNOWN #endif @@ -1549,7 +1747,7 @@ void lcd_init() { #endif } -int lcd_strlen(char* s) { +int lcd_strlen(const char* s) { int i = 0, j = 0; while (s[i]) { if ((s[i] & 0xc0) != 0x80) j++; @@ -1642,7 +1840,7 @@ void lcd_update() { int32_t encoderMovementSteps = abs(encoderDiff) / ENCODER_PULSES_PER_STEP; if (lastEncoderMovementMillis != 0) { - // Note that the rate is always calculated between to passes through the + // Note that the rate is always calculated between to passes through the // loop and that the abs of the encoderDiff value is tracked. float encoderStepRate = (float)(encoderMovementSteps) / ((float)(ms - lastEncoderMovementMillis)) * 1000.0; @@ -1685,20 +1883,22 @@ void lcd_update() { } #if ENABLED(DOGLCD) // Changes due to different driver architecture of the DOGM display if (lcdDrawUpdate) { - blink++; // Variable for fan animation and alive dot + blink++; // Variable for animation and alive dot u8g.firstPage(); do { lcd_setFont(FONT_MENU); u8g.setPrintPos(125, 0); - if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot + if (blink & 1) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot u8g.drawPixel(127, 63); // draw alive dot u8g.setColorIndex(1); // black on white (*currentMenu)(); } while (u8g.nextPage()); } #else - if (lcdDrawUpdate) + if (lcdDrawUpdate) { + blink++; // Variable for animation (*currentMenu)(); + } #endif #if ENABLED(LCD_HAS_STATUS_INDICATORS) @@ -1764,14 +1964,14 @@ bool lcd_hasstatus() { return (lcd_status_message[0] != '\0'); } void lcd_setstatus(const char* message, bool persist) { if (lcd_status_message_level > 0) return; - strncpy(lcd_status_message, message, 3 * LCD_WIDTH); + strncpy(lcd_status_message, message, 3 * (LCD_WIDTH)); set_utf_strlen(lcd_status_message, LCD_WIDTH); lcd_finishstatus(persist); } void lcd_setstatuspgm(const char* message, uint8_t level) { if (level >= lcd_status_message_level) { - strncpy_P(lcd_status_message, message, 3 * LCD_WIDTH); + strncpy_P(lcd_status_message, message, 3 * (LCD_WIDTH)); set_utf_strlen(lcd_status_message, LCD_WIDTH); lcd_status_message_level = level; lcd_finishstatus(level > 0); @@ -1815,10 +2015,37 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } void lcd_buttons_update() { #if ENABLED(NEWPANEL) uint8_t newbutton = 0; - if (READ(BTN_EN1) == 0) newbutton |= EN_A; - if (READ(BTN_EN2) == 0) newbutton |= EN_B; + #if BTN_EN1 > 0 + if (READ(BTN_EN1) == 0) newbutton |= EN_A; + #endif + #if BTN_EN2 > 0 + if (READ(BTN_EN2) == 0) newbutton |= EN_B; + #endif + #if ENABLED(RIGIDBOT_PANEL) || BTN_ENC > 0 + millis_t now = millis(); + #endif + #if ENABLED(RIGIDBOT_PANEL) + if (now > next_button_update_ms) { + if (READ(BTN_UP) == 0) { + encoderDiff = -1 * (ENCODER_STEPS_PER_MENU_ITEM); + next_button_update_ms = now + 300; + } + else if (READ(BTN_DWN) == 0) { + encoderDiff = ENCODER_STEPS_PER_MENU_ITEM; + next_button_update_ms = now + 300; + } + else if (READ(BTN_LFT) == 0) { + encoderDiff = -1 * (ENCODER_PULSES_PER_STEP); + next_button_update_ms = now + 300; + } + else if (READ(BTN_RT) == 0) { + encoderDiff = ENCODER_PULSES_PER_STEP; + next_button_update_ms = now + 300; + } + } + #endif #if BTN_ENC > 0 - if (millis() > next_button_update_ms && READ(BTN_ENC) == 0) newbutton |= EN_C; + if (now > next_button_update_ms && READ(BTN_ENC) == 0) newbutton |= EN_C; #endif buttons = newbutton; #if ENABLED(LCD_HAS_SLOW_BUTTONS) @@ -1831,7 +2058,7 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } WRITE(SHIFT_LD, HIGH); for (int8_t i = 0; i < 8; i++) { newbutton_reprapworld_keypad >>= 1; - if (READ(SHIFT_OUT)) newbutton_reprapworld_keypad |= BIT(7); + if (READ(SHIFT_OUT)) SBI(newbutton_reprapworld_keypad, 7); WRITE(SHIFT_CLK, HIGH); WRITE(SHIFT_CLK, LOW); } @@ -1844,35 +2071,32 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } unsigned char tmp_buttons = 0; for (int8_t i = 0; i < 8; i++) { newbutton >>= 1; - if (READ(SHIFT_OUT)) newbutton |= BIT(7); + if (READ(SHIFT_OUT)) SBI(newbutton, 7); WRITE(SHIFT_CLK, HIGH); WRITE(SHIFT_CLK, LOW); } buttons = ~newbutton; //invert it, because a pressed switch produces a logical 0 #endif //!NEWPANEL + #if ENABLED(REVERSE_MENU_DIRECTION) + #define ENCODER_DIFF_CW (encoderDiff += encoderDirection) + #define ENCODER_DIFF_CCW (encoderDiff -= encoderDirection) + #else + #define ENCODER_DIFF_CW (encoderDiff++) + #define ENCODER_DIFF_CCW (encoderDiff--) + #endif + #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: ENCODER_DIFF_CW; break; case _E2: ENCODER_DIFF_CCW; } + //manage encoder rotation uint8_t enc = 0; if (buttons & EN_A) enc |= B01; if (buttons & EN_B) enc |= B10; if (enc != lastEncoderBits) { switch (enc) { - case encrot0: - if (lastEncoderBits == encrot3) encoderDiff++; - else if (lastEncoderBits == encrot1) encoderDiff--; - break; - case encrot1: - if (lastEncoderBits == encrot0) encoderDiff++; - else if (lastEncoderBits == encrot2) encoderDiff--; - break; - case encrot2: - if (lastEncoderBits == encrot1) encoderDiff++; - else if (lastEncoderBits == encrot3) encoderDiff--; - break; - case encrot3: - if (lastEncoderBits == encrot2) encoderDiff++; - else if (lastEncoderBits == encrot0) encoderDiff--; - break; + case encrot0: ENCODER_SPIN(encrot3, encrot1); break; + case encrot1: ENCODER_SPIN(encrot0, encrot2); break; + case encrot2: ENCODER_SPIN(encrot1, encrot3); break; + case encrot3: ENCODER_SPIN(encrot2, encrot0); break; } } lastEncoderBits = enc; @@ -2156,11 +2380,12 @@ char* ftostr52(const float& x) { * - Click saves the Z and goes to the next mesh point */ static void _lcd_level_bed() { - if (encoderPosition != 0) { + ENCODER_DIRECTION_NORMAL(); + if ((encoderPosition != 0) && (movesplanned() <= 3)) { refresh_cmd_timeout(); - current_position[Z_AXIS] += float((int)encoderPosition) * MBL_Z_STEP; - if (min_software_endstops && current_position[Z_AXIS] < Z_MIN_POS) current_position[Z_AXIS] = Z_MIN_POS; - if (max_software_endstops && current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS; + current_position[Z_AXIS] += float((int)encoderPosition) * (MBL_Z_STEP); + if (min_software_endstops) NOLESS(current_position[Z_AXIS], Z_MIN_POS); + if (max_software_endstops) NOMORE(current_position[Z_AXIS], Z_MAX_POS); encoderPosition = 0; line_to_current(Z_AXIS); lcdDrawUpdate = 2; @@ -2170,23 +2395,23 @@ char* ftostr52(const float& x) { if (LCD_CLICKED) { if (!debounce_click) { debounce_click = true; - int ix = _lcd_level_bed_position % MESH_NUM_X_POINTS, - iy = _lcd_level_bed_position / MESH_NUM_X_POINTS; + int ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS), + iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS); if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag mbl.set_z(ix, iy, current_position[Z_AXIS]); _lcd_level_bed_position++; - if (_lcd_level_bed_position == MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { + if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) { current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; line_to_current(Z_AXIS); mbl.active = 1; - enqueuecommands_P(PSTR("G28")); + enqueue_and_echo_commands_P(PSTR("G28")); lcd_return_to_status(); } else { current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; line_to_current(Z_AXIS); - ix = _lcd_level_bed_position % MESH_NUM_X_POINTS; - iy = _lcd_level_bed_position / MESH_NUM_X_POINTS; + ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS); + iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS); if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag current_position[X_AXIS] = mbl.get_x(ix); current_position[Y_AXIS] = mbl.get_y(iy); @@ -2204,7 +2429,7 @@ char* ftostr52(const float& x) { * MBL Move to mesh starting point */ static void _lcd_level_bed_homing() { - if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR("XYZ"), "Homing"); + if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR("XYZ"), PSTR(MSG_LEVEL_BED_HOMING)); if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS]) { current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); @@ -2223,7 +2448,7 @@ char* ftostr52(const float& x) { static void lcd_level_bed() { axis_known_position[X_AXIS] = axis_known_position[Y_AXIS] = axis_known_position[Z_AXIS] = false; mbl.reset(); - enqueuecommands_P(PSTR("G28")); + enqueue_and_echo_commands_P(PSTR("G28")); lcdDrawUpdate = 2; lcd_goto_menu(_lcd_level_bed_homing); } diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h index 23df71cc44240a78c0310a3e88bc555c99dffe15..30e07f0fa99ad163d987eed5d6256a0bde0abf0a 100644 --- a/Marlin/ultralcd.h +++ b/Marlin/ultralcd.h @@ -5,7 +5,7 @@ #if ENABLED(ULTRA_LCD) #include "buzzer.h" - int lcd_strlen(char* s); + int lcd_strlen(const char* s); int lcd_strlen_P(const char* s); void lcd_update(); void lcd_init(); @@ -54,6 +54,8 @@ extern bool cancel_heatup; + extern uint8_t blink; // Variable for animation + #if ENABLED(FILAMENT_LCD_DISPLAY) extern millis_t previous_lcd_status_ms; #endif @@ -63,20 +65,19 @@ void lcd_ignore_click(bool b=true); #if ENABLED(NEWPANEL) - #define EN_C BIT(BLEN_C) - #define EN_B BIT(BLEN_B) - #define EN_A BIT(BLEN_A) + #define EN_C (_BV(BLEN_C)) + #define EN_B (_BV(BLEN_B)) + #define EN_A (_BV(BLEN_A)) - #define LCD_CLICKED (buttons&EN_C) #if ENABLED(REPRAPWORLD_KEYPAD) - #define EN_REPRAPWORLD_KEYPAD_F3 (BIT(BLEN_REPRAPWORLD_KEYPAD_F3)) - #define EN_REPRAPWORLD_KEYPAD_F2 (BIT(BLEN_REPRAPWORLD_KEYPAD_F2)) - #define EN_REPRAPWORLD_KEYPAD_F1 (BIT(BLEN_REPRAPWORLD_KEYPAD_F1)) - #define EN_REPRAPWORLD_KEYPAD_UP (BIT(BLEN_REPRAPWORLD_KEYPAD_UP)) - #define EN_REPRAPWORLD_KEYPAD_RIGHT (BIT(BLEN_REPRAPWORLD_KEYPAD_RIGHT)) - #define EN_REPRAPWORLD_KEYPAD_MIDDLE (BIT(BLEN_REPRAPWORLD_KEYPAD_MIDDLE)) - #define EN_REPRAPWORLD_KEYPAD_DOWN (BIT(BLEN_REPRAPWORLD_KEYPAD_DOWN)) - #define EN_REPRAPWORLD_KEYPAD_LEFT (BIT(BLEN_REPRAPWORLD_KEYPAD_LEFT)) + #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(BLEN_REPRAPWORLD_KEYPAD_F3)) + #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(BLEN_REPRAPWORLD_KEYPAD_F2)) + #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(BLEN_REPRAPWORLD_KEYPAD_F1)) + #define EN_REPRAPWORLD_KEYPAD_UP (_BV(BLEN_REPRAPWORLD_KEYPAD_UP)) + #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(BLEN_REPRAPWORLD_KEYPAD_RIGHT)) + #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(BLEN_REPRAPWORLD_KEYPAD_MIDDLE)) + #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(BLEN_REPRAPWORLD_KEYPAD_DOWN)) + #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(BLEN_REPRAPWORLD_KEYPAD_LEFT)) #define LCD_CLICKED ((buttons&EN_C) || (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_F1)) #define REPRAPWORLD_KEYPAD_MOVE_Z_UP (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_F2) @@ -86,17 +87,19 @@ #define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_DOWN) #define REPRAPWORLD_KEYPAD_MOVE_Y_UP (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_UP) #define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_MIDDLE) + #else + #define LCD_CLICKED (buttons&EN_C) #endif //REPRAPWORLD_KEYPAD #else //atomic, do not change - #define B_LE BIT(BL_LE) - #define B_UP BIT(BL_UP) - #define B_MI BIT(BL_MI) - #define B_DW BIT(BL_DW) - #define B_RI BIT(BL_RI) - #define B_ST BIT(BL_ST) - #define EN_B BIT(BLEN_B) - #define EN_A BIT(BLEN_A) + #define B_LE (_BV(BL_LE)) + #define B_UP (_BV(BL_UP)) + #define B_MI (_BV(BL_MI)) + #define B_DW (_BV(BL_DW)) + #define B_RI (_BV(BL_RI)) + #define B_ST (_BV(BL_ST)) + #define EN_B (_BV(BLEN_B)) + #define EN_A (_BV(BLEN_A)) #define LCD_CLICKED ((buttons&B_MI)||(buttons&B_ST)) #endif//NEWPANEL diff --git a/Marlin/ultralcd_implementation_hitachi_HD44780.h b/Marlin/ultralcd_implementation_hitachi_HD44780.h index b2178b804363a0115af105d7d1b61156403ce235..12acdf0f255e7eebbbfe3f192fa6340f4bc7888a 100644 --- a/Marlin/ultralcd_implementation_hitachi_HD44780.h +++ b/Marlin/ultralcd_implementation_hitachi_HD44780.h @@ -3,14 +3,9 @@ /** * Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays. -* When selecting the Russian language, a slightly different LCD implementation is used to handle UTF8 characters. **/ -//#if DISABLED(REPRAPWORLD_KEYPAD) -// extern volatile uint8_t buttons; //the last checked buttons in a bit array. -//#else - extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. -//#endif +extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. //////////////////////////////////// // Setup button and encode mappings for each panel (into 'buttons' variable @@ -24,13 +19,13 @@ #define BLEN_B 1 #define BLEN_A 0 - #define EN_B BIT(BLEN_B) // The two encoder pins are connected through BTN_EN1 and BTN_EN2 - #define EN_A BIT(BLEN_A) + #define EN_B (_BV(BLEN_B)) // The two encoder pins are connected through BTN_EN1 and BTN_EN2 + #define EN_A (_BV(BLEN_A)) #if defined(BTN_ENC) && BTN_ENC > -1 // encoder click is directly connected #define BLEN_C 2 - #define EN_C BIT(BLEN_C) + #define EN_C (_BV(BLEN_C)) #endif // @@ -49,8 +44,10 @@ #if defined(BTN_ENC) && BTN_ENC > -1 // the pause/stop/restart button is connected to BTN_ENC when used #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #undef LCD_CLICKED #define LCD_CLICKED (buttons&(B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop. #else + #undef LCD_CLICKED #define LCD_CLICKED (buttons&(B_MI|B_RI)) #endif @@ -64,11 +61,13 @@ #define B_MI (PANELOLU2_ENCODER_C<<B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + #undef LCD_CLICKED #define LCD_CLICKED (buttons&B_MI) // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update #define LCD_HAS_SLOW_BUTTONS #else + #undef LCD_CLICKED #define LCD_CLICKED (buttons&EN_C) #endif @@ -85,14 +84,14 @@ #define REPRAPWORLD_BTN_OFFSET 0 // bit offset into buttons for shift register values - #define EN_REPRAPWORLD_KEYPAD_F3 BIT((BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_F2 BIT((BLEN_REPRAPWORLD_KEYPAD_F2+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_F1 BIT((BLEN_REPRAPWORLD_KEYPAD_F1+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_UP BIT((BLEN_REPRAPWORLD_KEYPAD_UP+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_RIGHT BIT((BLEN_REPRAPWORLD_KEYPAD_RIGHT+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_MIDDLE BIT((BLEN_REPRAPWORLD_KEYPAD_MIDDLE+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_DOWN BIT((BLEN_REPRAPWORLD_KEYPAD_DOWN+REPRAPWORLD_BTN_OFFSET)) - #define EN_REPRAPWORLD_KEYPAD_LEFT BIT((BLEN_REPRAPWORLD_KEYPAD_LEFT+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(BLEN_REPRAPWORLD_KEYPAD_F2+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(BLEN_REPRAPWORLD_KEYPAD_F1+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_UP (_BV(BLEN_REPRAPWORLD_KEYPAD_UP+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(BLEN_REPRAPWORLD_KEYPAD_RIGHT+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(BLEN_REPRAPWORLD_KEYPAD_MIDDLE+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(BLEN_REPRAPWORLD_KEYPAD_DOWN+REPRAPWORLD_BTN_OFFSET)) + #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(BLEN_REPRAPWORLD_KEYPAD_LEFT+REPRAPWORLD_BTN_OFFSET)) //#define LCD_CLICKED ((buttons&EN_C) || (buttons&EN_REPRAPWORLD_KEYPAD_F1)) //#define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons&EN_REPRAPWORLD_KEYPAD_DOWN) @@ -113,12 +112,12 @@ #define BL_ST 2 //automatic, do not change - #define B_LE BIT(BL_LE) - #define B_UP BIT(BL_UP) - #define B_MI BIT(BL_MI) - #define B_DW BIT(BL_DW) - #define B_RI BIT(BL_RI) - #define B_ST BIT(BL_ST) + #define B_LE (_BV(BL_LE)) + #define B_UP (_BV(BL_UP)) + #define B_MI (_BV(BL_MI)) + #define B_DW (_BV(BL_DW)) + #define B_RI (_BV(BL_RI)) + #define B_ST (_BV(BL_ST)) #define LCD_CLICKED (buttons&(B_MI|B_ST)) #endif @@ -137,7 +136,7 @@ #define LCD_I2C_PIN_D5 5 #define LCD_I2C_PIN_D6 6 #define LCD_I2C_PIN_D7 7 - + #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> @@ -184,6 +183,12 @@ #include <LiquidCrystal_SR.h> #define LCD_CLASS LiquidCrystal_SR LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); +#elif ENABLED(LCM1602) + #include <Wire.h> + #include <LCD.h> + #include <LiquidCrystal_I2C.h> + #define LCD_CLASS LiquidCrystal_I2C + LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #else // Standard directly connected LCD implementations #include <LiquidCrystal.h> @@ -206,6 +211,10 @@ #define LCD_STR_PROGRESS "\x03\x04\x05" #endif +#if ENABLED(LCD_HAS_STATUS_INDICATORS) + static void lcd_implementation_update_indicators(); +#endif + static void lcd_set_custom_characters( #if ENABLED(LCD_PROGRESS_BAR) bool progress_bar_set = true @@ -362,13 +371,13 @@ static void lcd_implementation_init( lcd.begin(LCD_WIDTH, LCD_HEIGHT); #ifdef LCD_I2C_PIN_BL lcd.setBacklightPin(LCD_I2C_PIN_BL, POSITIVE); - lcd.setBacklight(HIGH); + lcd_implementation_update_indicators(); #endif #elif ENABLED(LCD_I2C_TYPE_MCP23017) lcd.setMCPType(LTI_TYPE_MCP23017); lcd.begin(LCD_WIDTH, LCD_HEIGHT); - lcd.setBacklight(0); //set all the LEDs off to begin with + lcd_implementation_update_indicators(); #elif ENABLED(LCD_I2C_TYPE_MCP23008) lcd.setMCPType(LTI_TYPE_MCP23008); @@ -404,7 +413,7 @@ char lcd_printPGM(const char* str) { return n; } -char lcd_print(char* str) { +char lcd_print(const char* str) { char c, n = 0; unsigned char i = 0; while ((c = str[i++])) n += charset_mapper(c); @@ -414,8 +423,9 @@ char lcd_print(char* str) { unsigned lcd_print(char c) { return charset_mapper(c); } #if ENABLED(SHOW_BOOTSCREEN) + void lcd_erase_line(int line) { - lcd.setCursor(0, 3); + lcd.setCursor(0, line); for (int i = 0; i < LCD_WIDTH; i++) lcd_print(' '); } @@ -486,18 +496,21 @@ unsigned lcd_print(char c) { return charset_mapper(c); } lcd.setCursor(TEXT_SCREEN_LOGO_SHIFT, 1); lcd_printPGM(PSTR("|Marlin|")); lcd.setCursor(TEXT_SCREEN_LOGO_SHIFT, 2); lcd.print('\x02'); lcd_printPGM(PSTR( "------" )); lcd.print('\x03'); - lcd_scroll(0, 3, PSTR("marlinfirmware.org"), LCD_WIDTH, 3000); + delay(2000); #ifdef STRING_SPLASH_LINE1 lcd_erase_line(3); lcd_scroll(0, 3, PSTR(STRING_SPLASH_LINE1), LCD_WIDTH, 1000); #endif + #ifdef STRING_SPLASH_LINE2 lcd_erase_line(3); lcd_scroll(0, 3, PSTR(STRING_SPLASH_LINE2), LCD_WIDTH, 1000); #endif } + #endif // SHOW_BOOTSCREEN + /* Possible status screens: 16x2 |000/000 B000/000| @@ -615,29 +628,61 @@ static void lcd_implementation_status_screen() { LCD_TEMP(degBed(), degTargetBed(), LCD_STR_BEDTEMP[0]); #else + // Before homing the axis letters are blinking 'X' <-> '?'. + // When axis is homed but axis_known_position is false the axis letters are blinking 'X' <-> ' '. + // When everything is ok you see a constant 'X'. + + if (blink & 1) + lcd_printPGM(PSTR("X")); + else { + if (!axis_homed[X_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[X_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("X")); + } - lcd.print('X'); - if (axis_known_position[X_AXIS]) - lcd.print(ftostr4sign(current_position[X_AXIS])); - else - lcd_printPGM(PSTR(" ---")); - - lcd_printPGM(PSTR(" Y")); - if (axis_known_position[Y_AXIS]) - lcd.print(ftostr4sign(current_position[Y_AXIS])); - else - lcd_printPGM(PSTR(" ---")); + lcd.print(ftostr4sign(current_position[X_AXIS])); + + lcd_printPGM(PSTR(" ")); + if (blink & 1) + lcd_printPGM(PSTR("Y")); + else { + if (!axis_homed[Y_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[Y_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("Y")); + } + lcd.print(ftostr4sign(current_position[Y_AXIS])); #endif // EXTRUDERS > 1 || TEMP_SENSOR_BED != 0 #endif // LCD_WIDTH >= 20 lcd.setCursor(LCD_WIDTH - 8, 1); - lcd_printPGM(PSTR("Z ")); - if (axis_known_position[Z_AXIS]) - lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001)); - else - lcd_printPGM(PSTR("---.--")); + if (blink & 1) + lcd_printPGM(PSTR("Z")); + else { + if (!axis_homed[Z_AXIS]) + lcd_printPGM(PSTR("?")); + else + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!axis_known_position[Z_AXIS]) + lcd_printPGM(PSTR(" ")); + else + #endif + lcd_printPGM(PSTR("Z")); + } + lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001)); #endif // LCD_HEIGHT > 2 @@ -667,7 +712,8 @@ static void lcd_implementation_status_screen() { lcd.setCursor(LCD_WIDTH - 6, 2); lcd.print(LCD_STR_CLOCK[0]); if (print_job_start_ms != 0) { - uint16_t time = millis() / 60000 - print_job_start_ms / 60000; + uint16_t time = (((print_job_stop_ms > print_job_start_ms) + ? print_job_stop_ms : millis()) - print_job_start_ms) / 60000; lcd.print(itostr2(time / 60)); lcd.print(':'); lcd.print(itostr2(time % 60)); @@ -691,7 +737,7 @@ static void lcd_implementation_status_screen() { // Draw the progress bar if the message has shown long enough // or if there is no message set. if (millis() >= progress_bar_ms + PROGRESS_BAR_MSG_TIME || !lcd_status_message[0]) { - int tix = (int)(card.percentDone() * LCD_WIDTH * 3) / 100, + int tix = (int)(card.percentDone() * (LCD_WIDTH) * 3) / 100, cel = tix / 3, rem = tix % 3, i = LCD_WIDTH; char msg[LCD_WIDTH + 1], b = ' '; msg[i] = '\0'; @@ -786,7 +832,7 @@ static void lcd_implementation_drawmenu_setting_edit_generic_P(bool sel, uint8_t #define lcd_implementation_drawmenu_setting_edit_callback_long5(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', ftostr5(*(data))) #define lcd_implementation_drawmenu_setting_edit_callback_bool(sel, row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) -void lcd_implementation_drawedit(const char* pstr, char* value) { +void lcd_implementation_drawedit(const char* pstr, const char* value) { lcd.setCursor(1, 1); lcd_printPGM(pstr); lcd.print(':'); @@ -831,21 +877,37 @@ void lcd_implementation_drawedit(const char* pstr, char* value) { #if ENABLED(LCD_HAS_STATUS_INDICATORS) static void lcd_implementation_update_indicators() { - #if ENABLED(LCD_I2C_PANELOLU2) || ENABLED(LCD_I2C_VIKI) - // Set the LEDS - referred to as backlights by the LiquidTWI2 library - static uint8_t ledsprev = 0; - uint8_t leds = 0; - if (target_temperature_bed > 0) leds |= LED_A; - if (target_temperature[0] > 0) leds |= LED_B; - if (fanSpeed) leds |= LED_C; - #if EXTRUDERS > 1 - if (target_temperature[1] > 0) leds |= LED_C; - #endif - if (leds != ledsprev) { - lcd.setBacklight(leds); - ledsprev = leds; - } + // Set the LEDS - referred to as backlights by the LiquidTWI2 library + static uint8_t ledsprev = 0; + uint8_t leds = 0; + + if (target_temperature_bed > 0) leds |= LED_A; + + if (target_temperature[0] > 0) leds |= LED_B; + + #if FAN_COUNT > 0 + if (0 + #if HAS_FAN0 + || fanSpeeds[0] + #endif + #if HAS_FAN1 + || fanSpeeds[1] + #endif + #if HAS_FAN2 + || fanSpeeds[2] + #endif + ) leds |= LED_C; + #endif // FAN_COUNT > 0 + + #if EXTRUDERS > 1 + if (target_temperature[1] > 0) leds |= LED_C; #endif + + if (leds != ledsprev) { + lcd.setBacklight(leds); + ledsprev = leds; + } + } #endif // LCD_HAS_STATUS_INDICATORS diff --git a/Marlin/ultralcd_st7920_u8glib_rrd.h b/Marlin/ultralcd_st7920_u8glib_rrd.h index 5d5f8306467e50e97a56b887d4c1719f238583ab..8b00fcd3de374d732df7bf39dee716c92b3dc490 100644 --- a/Marlin/ultralcd_st7920_u8glib_rrd.h +++ b/Marlin/ultralcd_st7920_u8glib_rrd.h @@ -59,11 +59,11 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo ST7920_WRITE_BYTE(0x01); //clear CGRAM ram u8g_Delay(15); //delay for CGRAM clear ST7920_WRITE_BYTE(0x3E); //extended mode + GDRAM active - for (y = 0; y < LCD_PIXEL_HEIGHT / 2; y++) { //clear GDRAM + for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM ST7920_WRITE_BYTE(0x80 | y); //set y ST7920_WRITE_BYTE(0x80); //set x = 0 ST7920_SET_DAT(); - for (i = 0; i < 2 * LCD_PIXEL_WIDTH / 8; i++) //2x width clears both segments + for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments ST7920_WRITE_BYTE(0); ST7920_SET_CMD(); } @@ -91,7 +91,7 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo ST7920_WRITE_BYTE(0x80 | 8); //x=64 } ST7920_SET_DAT(); - ST7920_WRITE_BYTES(ptr, LCD_PIXEL_WIDTH / 8); //ptr is incremented inside of macro + ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro y++; } ST7920_NCS(); @@ -107,7 +107,7 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo #endif } -uint8_t u8g_dev_st7920_128x64_rrd_buf[LCD_PIXEL_WIDTH * (PAGE_HEIGHT / 8)] U8G_NOCOMMON; +uint8_t u8g_dev_st7920_128x64_rrd_buf[(LCD_PIXEL_WIDTH) * (PAGE_HEIGHT) / 8] U8G_NOCOMMON; u8g_pb_t u8g_dev_st7920_128x64_rrd_pb = {{PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0}, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf}; u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = {u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn};