Merge pull request #786 from wolfmanjm/add/M665-set-delta-configuration
Add M665 to dynamically set delta configuration
This commit is contained in:
commit
8c98690e1d
@ -37,7 +37,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size)
|
|||||||
// the default values are used whenever there is a change to the data, to prevent
|
// the default values are used whenever there is a change to the data, to prevent
|
||||||
// wrong data being written to the variables.
|
// wrong data being written to the variables.
|
||||||
// ALSO: always make sure the variables in the Store and retrieve sections are in the same order.
|
// ALSO: always make sure the variables in the Store and retrieve sections are in the same order.
|
||||||
#define EEPROM_VERSION "V10"
|
#define EEPROM_VERSION "V11"
|
||||||
|
|
||||||
#ifdef EEPROM_SETTINGS
|
#ifdef EEPROM_SETTINGS
|
||||||
void Config_StoreSettings()
|
void Config_StoreSettings()
|
||||||
@ -59,6 +59,9 @@ void Config_StoreSettings()
|
|||||||
EEPROM_WRITE_VAR(i,add_homeing);
|
EEPROM_WRITE_VAR(i,add_homeing);
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
EEPROM_WRITE_VAR(i,endstop_adj);
|
EEPROM_WRITE_VAR(i,endstop_adj);
|
||||||
|
EEPROM_WRITE_VAR(i,delta_radius);
|
||||||
|
EEPROM_WRITE_VAR(i,delta_diagonal_rod);
|
||||||
|
EEPROM_WRITE_VAR(i,delta_segments_per_second);
|
||||||
#endif
|
#endif
|
||||||
#ifndef ULTIPANEL
|
#ifndef ULTIPANEL
|
||||||
int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED;
|
int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED;
|
||||||
@ -157,6 +160,13 @@ void Config_PrintSettings()
|
|||||||
SERIAL_ECHOPAIR(" Y" ,endstop_adj[1] );
|
SERIAL_ECHOPAIR(" Y" ,endstop_adj[1] );
|
||||||
SERIAL_ECHOPAIR(" Z" ,endstop_adj[2] );
|
SERIAL_ECHOPAIR(" Z" ,endstop_adj[2] );
|
||||||
SERIAL_ECHOLN("");
|
SERIAL_ECHOLN("");
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOLNPGM("Delta settings: L=delta_diagonal_rod, R=delta_radius, S=delta_segments_per_second");
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOPAIR(" M665 L",delta_diagonal_rod );
|
||||||
|
SERIAL_ECHOPAIR(" R" ,delta_radius );
|
||||||
|
SERIAL_ECHOPAIR(" S" ,delta_segments_per_second );
|
||||||
|
SERIAL_ECHOLN("");
|
||||||
#endif
|
#endif
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
SERIAL_ECHO_START;
|
SERIAL_ECHO_START;
|
||||||
@ -200,6 +210,9 @@ void Config_RetrieveSettings()
|
|||||||
EEPROM_READ_VAR(i,add_homeing);
|
EEPROM_READ_VAR(i,add_homeing);
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
EEPROM_READ_VAR(i,endstop_adj);
|
EEPROM_READ_VAR(i,endstop_adj);
|
||||||
|
EEPROM_READ_VAR(i,delta_radius);
|
||||||
|
EEPROM_READ_VAR(i,delta_diagonal_rod);
|
||||||
|
EEPROM_READ_VAR(i,delta_segments_per_second);
|
||||||
#endif
|
#endif
|
||||||
#ifndef ULTIPANEL
|
#ifndef ULTIPANEL
|
||||||
int plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed;
|
int plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed;
|
||||||
@ -265,6 +278,10 @@ void Config_ResetDefault()
|
|||||||
add_homeing[0] = add_homeing[1] = add_homeing[2] = 0;
|
add_homeing[0] = add_homeing[1] = add_homeing[2] = 0;
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
endstop_adj[0] = endstop_adj[1] = endstop_adj[2] = 0;
|
endstop_adj[0] = endstop_adj[1] = endstop_adj[2] = 0;
|
||||||
|
delta_radius= DELTA_RADIUS;
|
||||||
|
delta_diagonal_rod= DELTA_DIAGONAL_ROD;
|
||||||
|
delta_segments_per_second= DELTA_SEGMENTS_PER_SECOND;
|
||||||
|
recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
||||||
#endif
|
#endif
|
||||||
#ifdef ULTIPANEL
|
#ifdef ULTIPANEL
|
||||||
plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP;
|
plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP;
|
||||||
|
@ -209,6 +209,10 @@ extern float current_position[NUM_AXIS] ;
|
|||||||
extern float add_homeing[3];
|
extern float add_homeing[3];
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
extern float endstop_adj[3];
|
extern float endstop_adj[3];
|
||||||
|
extern float delta_radius;
|
||||||
|
extern float delta_diagonal_rod;
|
||||||
|
extern float delta_segments_per_second;
|
||||||
|
void recalc_delta_settings(float radius, float diagonal_rod);
|
||||||
#endif
|
#endif
|
||||||
extern float min_pos[3];
|
extern float min_pos[3];
|
||||||
extern float max_pos[3];
|
extern float max_pos[3];
|
||||||
|
@ -161,6 +161,7 @@
|
|||||||
// M503 - print the current settings (from memory not from EEPROM)
|
// M503 - print the current settings (from memory not from EEPROM)
|
||||||
// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
|
// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
|
||||||
// M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
|
// M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
|
||||||
|
// M665 - set delta configurations
|
||||||
// M666 - set delta endstop adjustment
|
// M666 - set delta endstop adjustment
|
||||||
// M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ]
|
// 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.
|
// M907 - Set digital trimpot motor current using axis codes.
|
||||||
@ -249,10 +250,22 @@ int EtoPPressure=0;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
float delta[3] = {0.0, 0.0, 0.0};
|
float delta[3] = {0.0, 0.0, 0.0};
|
||||||
|
#define SIN_60 0.8660254037844386
|
||||||
|
#define COS_60 0.5
|
||||||
|
// these are the default values, can be overriden with M665
|
||||||
|
float delta_radius= DELTA_RADIUS;
|
||||||
|
float delta_tower1_x= -SIN_60*delta_radius; // front left tower
|
||||||
|
float delta_tower1_y= -COS_60*delta_radius;
|
||||||
|
float delta_tower2_x= SIN_60*delta_radius; // front right tower
|
||||||
|
float delta_tower2_y= -COS_60*delta_radius;
|
||||||
|
float delta_tower3_x= 0.0; // back middle tower
|
||||||
|
float delta_tower3_y= delta_radius;
|
||||||
|
float delta_diagonal_rod= DELTA_DIAGONAL_ROD;
|
||||||
|
float delta_diagonal_rod_2= sq(delta_diagonal_rod);
|
||||||
|
float delta_segments_per_second= DELTA_SEGMENTS_PER_SECOND;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Private Variables=============================
|
//=============================Private Variables=============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@ -2293,6 +2306,19 @@ void process_commands()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
|
case 665: // M665 set delta configurations L<diagonal_rod> R<delta_radius> S<segments_per_sec>
|
||||||
|
if(code_seen('L')) {
|
||||||
|
delta_diagonal_rod= code_value();
|
||||||
|
}
|
||||||
|
if(code_seen('R')) {
|
||||||
|
delta_radius= code_value();
|
||||||
|
}
|
||||||
|
if(code_seen('S')) {
|
||||||
|
delta_segments_per_second= code_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
||||||
|
break;
|
||||||
case 666: // M666 set delta endstop adjustemnt
|
case 666: // M666 set delta endstop adjustemnt
|
||||||
for(int8_t i=0; i < 3; i++)
|
for(int8_t i=0; i < 3; i++)
|
||||||
{
|
{
|
||||||
@ -3091,19 +3117,30 @@ void clamp_to_software_endstops(float target[3])
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
|
void recalc_delta_settings(float radius, float diagonal_rod)
|
||||||
|
{
|
||||||
|
delta_tower1_x= -SIN_60*radius; // front left tower
|
||||||
|
delta_tower1_y= -COS_60*radius;
|
||||||
|
delta_tower2_x= SIN_60*radius; // front right tower
|
||||||
|
delta_tower2_y= -COS_60*radius;
|
||||||
|
delta_tower3_x= 0.0; // back middle tower
|
||||||
|
delta_tower3_y= radius;
|
||||||
|
delta_diagonal_rod_2= sq(diagonal_rod);
|
||||||
|
}
|
||||||
|
|
||||||
void calculate_delta(float cartesian[3])
|
void calculate_delta(float cartesian[3])
|
||||||
{
|
{
|
||||||
delta[X_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
delta[X_AXIS] = sqrt(delta_diagonal_rod_2
|
||||||
- sq(DELTA_TOWER1_X-cartesian[X_AXIS])
|
- sq(delta_tower1_x-cartesian[X_AXIS])
|
||||||
- sq(DELTA_TOWER1_Y-cartesian[Y_AXIS])
|
- sq(delta_tower1_y-cartesian[Y_AXIS])
|
||||||
) + cartesian[Z_AXIS];
|
) + cartesian[Z_AXIS];
|
||||||
delta[Y_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
|
||||||
- sq(DELTA_TOWER2_X-cartesian[X_AXIS])
|
- sq(delta_tower2_x-cartesian[X_AXIS])
|
||||||
- sq(DELTA_TOWER2_Y-cartesian[Y_AXIS])
|
- sq(delta_tower2_y-cartesian[Y_AXIS])
|
||||||
) + cartesian[Z_AXIS];
|
) + cartesian[Z_AXIS];
|
||||||
delta[Z_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
|
||||||
- sq(DELTA_TOWER3_X-cartesian[X_AXIS])
|
- sq(delta_tower3_x-cartesian[X_AXIS])
|
||||||
- sq(DELTA_TOWER3_Y-cartesian[Y_AXIS])
|
- sq(delta_tower3_y-cartesian[Y_AXIS])
|
||||||
) + cartesian[Z_AXIS];
|
) + cartesian[Z_AXIS];
|
||||||
/*
|
/*
|
||||||
SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
|
SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
|
||||||
@ -3133,7 +3170,7 @@ void prepare_move()
|
|||||||
if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
|
if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
|
||||||
if (cartesian_mm < 0.000001) { return; }
|
if (cartesian_mm < 0.000001) { return; }
|
||||||
float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
|
float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
|
||||||
int steps = max(1, int(DELTA_SEGMENTS_PER_SECOND * seconds));
|
int steps = max(1, int(delta_segments_per_second * seconds));
|
||||||
// SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
|
// SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
|
||||||
// SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
|
// SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
|
||||||
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
|
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
|
||||||
|
@ -16,9 +16,9 @@ Usage: python createTemperatureLookup.py [options]
|
|||||||
Options:
|
Options:
|
||||||
-h, --help show this help
|
-h, --help show this help
|
||||||
--rp=... pull-up resistor
|
--rp=... pull-up resistor
|
||||||
--t0=ttt:rrr low temperature temperature:resistance point (around 25C)
|
--t1=ttt:rrr low temperature temperature:resistance point (around 25C)
|
||||||
--t1=ttt:rrr middle temperature temperature:resistance point (around 150C)
|
--t2=ttt:rrr middle temperature temperature:resistance point (around 150C)
|
||||||
--t2=ttt:rrr high temperature temperature:resistance point (around 250C)
|
--t3=ttt:rrr high temperature temperature:resistance point (around 250C)
|
||||||
--num-temps=... the number of temperature points to calculate (default: 20)
|
--num-temps=... the number of temperature points to calculate (default: 20)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -98,7 +98,8 @@ def main(argv):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="])
|
opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="])
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError as err:
|
||||||
|
print str(err)
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
// 65 = Azteeg X1
|
// 65 = Azteeg X1
|
||||||
// 66 = Melzi with ATmega1284 (MaKr3d version)
|
// 66 = Melzi with ATmega1284 (MaKr3d version)
|
||||||
// 67 = Azteeg X3
|
// 67 = Azteeg X3
|
||||||
|
// 68 = Azteeg X3 Pro
|
||||||
// 7 = Ultimaker
|
// 7 = Ultimaker
|
||||||
// 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
// 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
||||||
// 77 = 3Drag Controller
|
// 77 = 3Drag Controller
|
||||||
@ -119,18 +120,6 @@
|
|||||||
// Effective horizontal distance bridged by diagonal push rods.
|
// Effective horizontal distance bridged by diagonal push rods.
|
||||||
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET)
|
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET)
|
||||||
|
|
||||||
#define DELTA_DIAGONAL_ROD_2 sq(DELTA_DIAGONAL_ROD)
|
|
||||||
|
|
||||||
// Effective X/Y positions of the three vertical towers.
|
|
||||||
#define SIN_60 0.8660254037844386
|
|
||||||
#define COS_60 0.5
|
|
||||||
#define DELTA_TOWER1_X -SIN_60*DELTA_RADIUS // front left tower
|
|
||||||
#define DELTA_TOWER1_Y -COS_60*DELTA_RADIUS
|
|
||||||
#define DELTA_TOWER2_X SIN_60*DELTA_RADIUS // front right tower
|
|
||||||
#define DELTA_TOWER2_Y -COS_60*DELTA_RADIUS
|
|
||||||
#define DELTA_TOWER3_X 0.0 // back middle tower
|
|
||||||
#define DELTA_TOWER3_Y DELTA_RADIUS
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Thermal Settings ============================
|
//=============================Thermal Settings ============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -270,6 +270,12 @@
|
|||||||
// Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards)
|
// 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)
|
#define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
|
||||||
|
|
||||||
|
// 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===========================
|
//=============================Additional Features===========================
|
||||||
|
Loading…
Reference in New Issue
Block a user