2.0 IDEX Independent z offset and other fixes (#11862)

* Add Formbot Raptor board

Co-Authored-By: InsanityAutomation <insanityautomation@users.noreply.github.com>

* Add a second Z probe Z offset

Co-Authored-By: InsanityAutomation <insanityautomation@users.noreply.github.com>

* Modify method to utilize live adjustment of hotend z offset

Should probably move config option to babystepping and rename as it may now apply to all multiextruder systems

* Move config item and catchup other code to current method
This commit is contained in:
InsanityAutomation 2018-09-24 10:40:48 -04:00 committed by Roxy-3D
parent 217e0efd20
commit 1104054d73
13 changed files with 290 additions and 38 deletions

View file

@ -775,6 +775,10 @@
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
// Note: Extra time may be added to mitigate controller latency.
//#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
// Allow babystepping tool z offsets, allowing compensation for tools at different heights.
// Ignored in Independent X Carriage Duplicate mode, where tool 0 Z probe offset will be used.
//#define BABYSTEP_HOTEND_Z_OFFSET
#endif
// @section extruder

View file

@ -138,7 +138,7 @@
// 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_FORMBOT_TREX2
#define MOTHERBOARD BOARD_FORMBOT_TREX2PLUS
#endif
// Optional custom name for your RepStrap or other custom machine

View file

@ -75,8 +75,9 @@
#define BOARD_AZTEEG_X3_PRO 68 // Azteeg X3 Pro
#define BOARD_ULTIMAIN_2 72 // Ultimainboard 2.x (Uses TEMP_SENSOR 20)
#define BOARD_RUMBA 80 // Rumba
#define BOARD_FORMBOT_TREX2 81 // Formbot version 1
#define BOARD_FORMBOT_TREX3 82 // Formbot T-Rex 3 revision
#define BOARD_FORMBOT_TREX2PLUS 95 // Formbot version 1
#define BOARD_FORMBOT_TREX3 96 // Formbot T-Rex 3 revision
#define BOARD_FORMBOT_RAPTOR 97 // Formbot version 1
#define BOARD_BQ_ZUM_MEGA_3D 503 // bq ZUM Mega 3D
#define BOARD_MAKEBOARD_MINI 431 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake
#define BOARD_TRIGORILLA_13 343 // TriGorilla Anycubic version 1.3 based on RAMPS EFB

View file

@ -36,9 +36,23 @@
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
FORCE_INLINE void mod_zprobe_zoffset(const float &offs) {
zprobe_zoffset += offs;
SERIAL_ECHO_START();
SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset);
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
if (active_extruder == 0)
{
zprobe_zoffset += offs;
SERIAL_ECHO_START();
SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset);
} else {
hotend_offset[Z_AXIS][active_extruder] -= offs;
SERIAL_ECHO_START();
SERIAL_ECHOLNPAIR(MSG_IDEX_Z_OFFSET ": ", hotend_offset[Z_AXIS][active_extruder]);
}
#else
zprobe_zoffset += offs;
SERIAL_ECHO_START();
SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset);
#endif
}
#endif

View file

@ -32,7 +32,9 @@ void GcodeSuite::M851() {
if (parser.seenval('Z')) {
const float value = parser.value_linear_units();
if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX))
{
zprobe_zoffset = value;
}
else {
SERIAL_ERROR_START();
SERIAL_ERRORLNPGM("?Z out of range (" STRINGIFY(Z_PROBE_OFFSET_RANGE_MIN) " to " STRINGIFY(Z_PROBE_OFFSET_RANGE_MAX) ")");

View file

@ -1317,15 +1317,35 @@ void lcd_quick_feedback(const bool clear_buttons) {
const float new_zoffset = zprobe_zoffset + planner.steps_to_mm[Z_AXIS] * babystep_increment;
if (WITHIN(new_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
zprobe_zoffset = new_zoffset;
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
if (active_extruder == 0)
{
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
zprobe_zoffset = new_zoffset;
} else {
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
hotend_offset[Z_AXIS][active_extruder] -= (planner.steps_to_mm[Z_AXIS] * babystep_increment);
}
#else
zprobe_zoffset = new_zoffset;
#endif
lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
}
}
if (lcdDrawUpdate) {
lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset));
#if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
if (active_extruder == 0) {
lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset));
} else {
lcd_implementation_drawedit(PSTR(MSG_IDEX_Z_OFFSET), ftostr43sign(hotend_offset[Z_AXIS][active_extruder]));
}
#endif
#if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY)
_lcd_zoffset_overlay_gfx(zprobe_zoffset);
if (active_extruder == 0) {
_lcd_zoffset_overlay_gfx(zprobe_zoffset);
}
#endif
}
}

View file

@ -46,6 +46,7 @@
#include "../module/motion.h" // for active_extruder
#endif
void lcd_return_to_status();
bool lcd_hasstatus();
void lcd_setstatus(const char* message, const bool persist=false);
void lcd_setstatusPGM(const char* message, const int8_t level=0);

View file

@ -153,7 +153,8 @@ typedef struct SettingsDataStruct {
//
// HAS_BED_PROBE
//
float zprobe_zoffset; // M851 Z
float zprobe_zoffset;
//
// ABL_PLANAR
@ -494,12 +495,12 @@ void MarlinSettings::postprocess() {
for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummy);
#endif // MESH_BED_LEVELING
_FIELD_TEST(zprobe_zoffset);
#if !HAS_BED_PROBE
const float zprobe_zoffset = 0;
#endif
EEPROM_WRITE(zprobe_zoffset);
_FIELD_TEST(zprobe_zoffset);
EEPROM_WRITE(zprobe_zoffset);
//
// Planar Bed Leveling matrix
@ -1180,12 +1181,12 @@ void MarlinSettings::postprocess() {
for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummy);
#endif // MESH_BED_LEVELING
_FIELD_TEST(zprobe_zoffset);
#if !HAS_BED_PROBE
float zprobe_zoffset;
#endif
EEPROM_READ(zprobe_zoffset);
_FIELD_TEST(zprobe_zoffset);
EEPROM_READ(zprobe_zoffset);
//
// Planar Bed Leveling matrix

View file

@ -1502,15 +1502,15 @@ void homeaxis(const AxisEnum axis) {
soft_endstop_max[X_AXIS] = dual_max_x;
}
else if (dxc_is_duplicating()) {
// In Duplication Mode, T0 can move as far left as X_MIN_POS
// In Duplication Mode, T0 can move as far left as X1_MIN_POS
// but not so far to the right that T1 would move past the end
soft_endstop_min[X_AXIS] = base_min_pos(X_AXIS);
soft_endstop_max[X_AXIS] = MIN(base_max_pos(X_AXIS), dual_max_x - duplicate_extruder_x_offset);
soft_endstop_min[X_AXIS] = X1_MIN_POS;
soft_endstop_max[X_AXIS] = MIN(X1_MAX_POS, dual_max_x - duplicate_extruder_x_offset);
}
else {
// In other modes, T0 can move from X_MIN_POS to X_MAX_POS
soft_endstop_min[axis] = base_min_pos(axis);
soft_endstop_max[axis] = base_max_pos(axis);
// In other modes, T0 can move from X1_MIN_POS to X1_MAX_POS
soft_endstop_min[X_AXIS] = X1_MIN_POS;
soft_endstop_max[X_AXIS] = X1_MAX_POS;
}
}
#elif ENABLED(DELTA)

View file

@ -22,13 +22,12 @@
#include "tool_change.h"
#include "probe.h"
#include "motion.h"
#include "planner.h"
#include "../Marlin.h"
#include "../inc/MarlinConfig.h"
#if ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0
#include "../gcode/gcode.h" // for dwell()
#endif
@ -57,6 +56,10 @@
#include "../feature/fanmux.h"
#endif
#if ENABLED(ULTIPANEL)
#include "../lcd/ultralcd.h"
#endif
#if DO_SWITCH_EXTRUDER
#if EXTRUDERS > 3
@ -498,11 +501,24 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
active_extruder = tmp_extruder;
update_software_endstops(X_AXIS);
active_extruder = !tmp_extruder;
// Don't move the new extruder out of bounds
if (!WITHIN(current_position[X_AXIS], soft_endstop_min[X_AXIS], soft_endstop_max[X_AXIS]))
no_move = true;
#else
// No software endstops? Use the configured limits
if (active_extruder == 0) {
if (!WITHIN(current_position[X_AXIS], X2_MIN_POS, X2_MAX_POS))
no_move = true;
}
else if (!WITHIN(current_position[X_AXIS], X1_MIN_POS, X1_MAX_POS))
no_move = true;
#endif
// Don't move the new extruder out of bounds
if (!WITHIN(current_position[X_AXIS], soft_endstop_min[X_AXIS], soft_endstop_max[X_AXIS]))
no_move = true;
#if ENABLED(ULTIPANEL)
lcd_return_to_status();
#endif
if (!no_move) set_destination_from_current();
dualx_tool_change(tmp_extruder, no_move); // Can modify no_move
@ -569,6 +585,13 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination);
#endif
#if ENABLED(DUAL_X_CARRIAGE)
// Dual x carriage does not properly apply these to current position due to command ordering
// So we apply the offsets for y and z to the destination here. X cannot have an offset in this mode
// as it is utilized for X2 home position.
destination[Y_AXIS] -= hotend_offset[Y_AXIS][active_extruder] - hotend_offset[Y_AXIS][tmp_extruder];
destination[Z_AXIS] -= hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder];
#endif
// Move back to the original (or tweaked) position
do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]);
#if ENABLED(DUAL_X_CARRIAGE)

View file

@ -132,8 +132,10 @@
#include "pins_AZTEEG_X3_PRO.h" // ATmega2560 env:megaatmega2560
#elif MB(ULTIMAIN_2)
#include "pins_ULTIMAIN_2.h" // ATmega2560 env:megaatmega2560
#elif MB(FORMBOT_TREX2)
#include "pins_FORMBOT_TREX2.h" // ATmega2560 env:megaatmega2560
#elif MB(FORMBOT_RAPTOR)
#include "pins_FORMBOT_RAPTOR.h" // ATmega2560 env:megaatmega2560
#elif MB(FORMBOT_TREX2PLUS)
#include "pins_FORMBOT_TREX2PLUS.h" // ATmega2560 env:megaatmega2560
#elif MB(FORMBOT_TREX3)
#include "pins_FORMBOT_TREX3.h" // ATmega2560 env:megaatmega2560
#elif MB(RUMBA)

View file

@ -0,0 +1,184 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
/**
* Formbot pin assignments
*/
#ifndef __AVR_ATmega2560__
#error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu."
#endif
#if E_STEPPERS > 3 || HOTENDS > 3
#error "Formbot supports up to 3 hotends / E-steppers. Comment this line to keep going."
#endif
#define DEFAULT_MACHINE_NAME "Formbot Raptor"
#define BOARD_NAME "Formbot Raptor"
//
// Servos
//
#define SERVO0_PIN 11
#define SERVO1_PIN 6
#define SERVO2_PIN 5
#define SERVO3_PIN -1
//
// Limit Switches
//
#define X_MIN_PIN 3
#ifndef X_MAX_PIN
#define X_MAX_PIN 2
#endif
#define Y_MIN_PIN 14
#define Y_MAX_PIN 15
#define Z_MIN_PIN 18
#define Z_MAX_PIN 19
//
// Z Probe (when not Z_MIN_PIN)
//
#ifndef Z_MIN_PROBE_PIN
#define Z_MIN_PROBE_PIN 32
#endif
//
// Steppers
//
#define X_STEP_PIN 54
#define X_DIR_PIN 55
#define X_ENABLE_PIN 38
#ifndef X_CS_PIN
#define X_CS_PIN 53
#endif
#define Y_STEP_PIN 60
#define Y_DIR_PIN 61
#define Y_ENABLE_PIN 56
#ifndef Y_CS_PIN
#define Y_CS_PIN 49
#endif
#define Z_STEP_PIN 46
#define Z_DIR_PIN 48
#define Z_ENABLE_PIN 62
#ifndef Z_CS_PIN
#define Z_CS_PIN 40
#endif
#define E0_STEP_PIN 26
#define E0_DIR_PIN 28
#define E0_ENABLE_PIN 24
#ifndef E0_CS_PIN
#define E0_CS_PIN 42
#endif
#define E1_STEP_PIN 36
#define E1_DIR_PIN 34
#define E1_ENABLE_PIN 30
#ifndef E1_CS_PIN
#define E1_CS_PIN 44
#endif
#define E2_STEP_PIN 42
#define E2_DIR_PIN 43
#define E2_ENABLE_PIN 44
//
// Temperature Sensors
//
#define TEMP_0_PIN 13 // Analog Input
#define TEMP_1_PIN 15 // Analog Input
#define TEMP_BED_PIN 14 // Analog Input
// 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
//
// Augmentation for auto-assigning RAMPS plugs
//
#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D)
#if HOTENDS > 1
#if TEMP_SENSOR_BED
#define IS_RAMPS_EEB
#else
#define IS_RAMPS_EEF
#endif
#elif TEMP_SENSOR_BED
#define IS_RAMPS_EFB
#else
#define IS_RAMPS_EFF
#endif
#endif
//
// Heaters / Fans
//
#define HEATER_0_PIN 10
#define HEATER_1_PIN 7
#define HEATER_BED_PIN 8
#define LED4_PIN 5
#define FAN_PIN 9
#if DISABLED(FILAMENT_RUNOUT_SENSOR)
#define FAN1_PIN 4
#endif
//
// Misc. Functions
//
#define SDSS 53
#define LED_PIN 13
// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector
#define FILWIDTH_PIN 5 // Analog Input
#ifndef PS_ON_PIN
#define PS_ON_PIN 12
#endif
//
// LCD / Controller
//
// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
//
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
#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
#define BEEPER_PIN 37
#define BTN_EN1 31
#define BTN_EN2 33
#define BTN_ENC 35
#define SD_DETECT_PIN 49
#define KILL_PIN 41
#endif

View file

@ -143,15 +143,15 @@
#define HEATER_BED_PIN 58
#define FAN_PIN 9
//#define FAN1_PIN 4
#if(DISABLED(FILAMENT_RUNOUT_SENSOR))
// Though defined as a fan pin, it is utilized as a dedicated laser pin by Formbot. May
// swapped plug and play with a fil;ament runout sensor.
#define FAN1_PIN 4
#endif
#if DISABLED(ICSP_PORT_SWITCHES)
//#define FIL_RUNOUT_PIN 22
//#define FIL_RUNOUT2_PIN 21
#elif ENABLED(FILAMENT_RUNOUT_SENSOR)
#define FIL_RUNOUT_PIN 52
#define FIL_RUNOUT2_PIN 50
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
#define FIL_RUNOUT_PIN 4
//#define FIL_RUNOUT2_PIN -1
#endif
//