Input shaping & JunctionDeviatio wiki + improvements (#9256)

* VFA-Calibs Wiki images

* Calib Code Fixes

Improve Settings
JD Set Precision to 3
Change damp default
Recommend 0

Fixes

* IS JD Wiki

* Updated with 9234

* IS Verbose
This commit is contained in:
Ian Bassi 2025-04-13 04:17:24 -03:00 committed by GitHub
parent 9e53b079c6
commit 822de5ce29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 93 additions and 24 deletions

View file

@ -187,17 +187,31 @@ Ussualy the recommended values modes are ``MZV`` or ``EI`` for Delta printers.
```
SET_VELOCITY_LIMIT MINIMUM_CRUISE_RATIO=0
```
3. Use a high gloss filament to make the ringing more visible.
3. Use an opaque, high-gloss filament to make the ringing more visible.
2. Print the Input Shaping Frequency test with a range of frequencies.
![image](./images/InputShaping/IS_freq_menu.png)
1. Measure the X and Y heights and read the frequency set at that point in Orca Slicer.
![image](./images/InputShaping/IS_damp_klipper_print_measure.jpg)
![image](./images/InputShaping/IS_freq_klipper_slicer_measure.png)
2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value.
**Note**: There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz.
3. Print the Damping test setting your X and Y frequency to the value you found in the previous step.
![image](./images/InputShaping/IS_damp_menu.png)
1. Measure the X and Y heights and read the damping set at that point in Orca Slicer.
![image](./images/InputShaping/IS_damp_klipper_print_measure.jpg)
![image](./images/InputShaping/IS_damp_klipper_slicer_measure.png)
**Note**: Not all Resonance Compensation modes support damping
1. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.
2. Save the settings
4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.
5. Save the settings
1. You need to go to the printer settings and set the X and Y frequency and damp to the value you found in the previous step.
### Marlin
@ -213,14 +227,28 @@ ZV Input Shaping introduces an anti-vibration signal into the stepper motion for
3. Jerk
1. If using [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) use a high value (e.g., 20).
2. If using [Junction Deviation](https://marlinfw.org/docs/features/junction_deviation.html) (new Marlin default mode) this test will use 0.25 (high enough to most printers).
2. Use a high gloss filament to make the ringing more visible.
2. Print the Input Shaping Frequency test with a range of frequencies.
2. Use an opaque, high-gloss filament to make the ringing more visible.
2. Print the Input Shaping Frequency test with a range of frequencies.
![image](./images/InputShaping/IS_freq_menu.png)
1. Measure the X and Y heights and read the frequency set at that point in Orca Slicer.
![image](./images/InputShaping/IS_freq_marlin_print_measure.jpg)
![image](./images/InputShaping/IS_freq_marlin_slicer_measure.png)
2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value.
**Note**: There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz.
3. Print the Damping test setting your X and Y frequency to the value you found in the previous step.
![image](./images/InputShaping/IS_damp_menu.png)
1. Measure the X and Y heights and read the damping set at that point in Orca Slicer.
![image](./images/InputShaping/IS_damp_marlin_print_measure.jpg)
![image](./images/InputShaping/IS_damp_marlin_slicer_measure.png)
4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.
1. Reboot your printer.
2. Use the following G-code to restore your printer settings:
@ -244,7 +272,7 @@ ZV Input Shaping introduces an anti-vibration signal into the stepper motion for
#### Fixed-Time Motion
TODO This calibration test is currently under development.
TODO This calibration test is currently under development. See the [Marlin documentation](https://marlinfw.org/docs/gcode/M493.html) for more information.
### Junction Deviation
@ -257,22 +285,45 @@ The default value in Marlin is typically set to 0.08mm, which may be too high fo
2. In OrcaSlicer, set:
1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²).
2. Speed high enough to trigger ringing (e.g., 100 mm/s).
3. Use a high gloss filament to make the ringing more visible.
3. Use an opaque, high-gloss filament to make the ringing more visible.
2. You need to print the Junction Deviation test.
![image](./images/JunctionDeviation/jd_first_menu.png)
1. Measure the X and Y heights and read the frequency set at that point in Orca Slicer.
2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value.
![image](./images/JunctionDeviation/jd_first_print_measure.jpg)
![image](./images/JunctionDeviation/jd_first_slicer_measure.png)
2. Its very likely that youll need to set values lower than 0.08 mm, as shown in the previous example. To determine a more accurate maximum JD value, you can print a new calibration tower with a maximum value set at the point where the corners start losing sharpness.
3.
![image](./images/JunctionDeviation/jd_second_menu.png)
4. Measure the X and Y heights and read the frequency set at that point in Orca Slicer.
![image](./images/JunctionDeviation/jd_second_print_measure.jpg)
![image](./images/JunctionDeviation/jd_second_slicer_measure.png)
3. Save the settings
1. Use the following G-code to set the frequency:
1. Set your Maximun Junction Deviation value in [Printer settings/Motion ability/Jerk limitation].
2. Use the following G-code to set the mm:
```gcode
M205 J#JunctionDeviationValue
M500
```
Example
```gcode
M205 J0.013
M205 J0.012
M500
```
2. Set it in your Marlin Compilation.
3. Recompile four MarlinFW
1. In Configuration.h set:
```cpp
#define JUNCTION_DEVIATION_MM 0.012 // (mm) Distance from real junction edge
```
2. Check Classic Jerk is disabled (commented).
```cpp
//#define CLASSIC_JERK
```
## VFA

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -318,7 +318,7 @@ std::string GCodeWriter::set_junction_deviation(double junction_deviation){
if (FLAVOR_IS_NOT(gcfMarlinFirmware)) {
throw std::runtime_error("Junction deviation is only supported by Marlin firmware");
}
gcode << "M205 J" << junction_deviation << " ; Junction Deviation\n";
gcode << "M205 J" << std::fixed << std::setprecision(3) << junction_deviation << " ; Junction Deviation\n";
return gcode.str();
}
@ -365,7 +365,7 @@ std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) co
gcode << " SHAPER_FREQ_X=" << std::fixed << std::setprecision(2) << freq << " SHAPER_FREQ_Y=" << std::fixed << std::setprecision(2) << freq;
}
if (damp > 0.0f) {
gcode << " DAMPING_RATIO_X=" << damp << " DAMPING_RATIO_Y=" << damp;
gcode << " DAMPING_RATIO_X=" << std::fixed << std::setprecision(3) << damp << " DAMPING_RATIO_Y=" << std::fixed << std::setprecision(3) << damp;
}
}
} else {
@ -380,10 +380,13 @@ std::string GCodeWriter::set_input_shaping(char axis, float damp, float freq) co
}
if (damp > 0.0f)
{
gcode << " D" << std::fixed << std::setprecision(2) << damp;
gcode << " D" << std::fixed << std::setprecision(3) << damp;
}
}
gcode << "; Override input shaping value\n";
if (GCodeWriter::full_gcode_comment){
gcode << " ; Override input shaping";
}
gcode << "\n";
return gcode.str();
}

View file

@ -10201,7 +10201,7 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params)
if (params.mode != CalibMode::Calib_Input_shaping_freq)
return;
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_input_shaping_test.stl"));
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_tower_test.stl"));
auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config;
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
@ -10210,6 +10210,7 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params)
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats { 200 });
filament_config->set_key_value("enable_pressure_advance", new ConfigOptionBools {false });
filament_config->set_key_value("pressure_advance", new ConfigOptionFloats { 0.0 });
print_config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
print_config->set_key_value("enable_overhang_speed", new ConfigOptionBool { false });
print_config->set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
print_config->set_key_value("wall_loops", new ConfigOptionInt(1));
@ -10219,6 +10220,10 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params)
print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false));
print_config->set_key_value("spiral_mode", new ConfigOptionBool(true));
print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(true));
print_config->set_key_value("bottom_surface_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200));
print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000));
print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000));
model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));
@ -10240,7 +10245,7 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params)
if (params.mode != CalibMode::Calib_Input_shaping_damp)
return;
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_input_shaping_test.stl"));
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_tower_test.stl"));
auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config;
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
@ -10249,6 +10254,7 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params)
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats { 200 });
filament_config->set_key_value("enable_pressure_advance", new ConfigOptionBools{false});
filament_config->set_key_value("pressure_advance", new ConfigOptionFloats{0.0});
print_config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
print_config->set_key_value("enable_overhang_speed", new ConfigOptionBool{false});
print_config->set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
print_config->set_key_value("wall_loops", new ConfigOptionInt(1));
@ -10258,6 +10264,10 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params)
print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false));
print_config->set_key_value("spiral_mode", new ConfigOptionBool(true));
print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(true));
print_config->set_key_value("bottom_surface_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200));
print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000));
print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000));
model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));
@ -10279,7 +10289,7 @@ void Plater::calib_junction_deviation(const Calib_Params& params)
if (params.mode != CalibMode::Calib_Junction_Deviation)
return;
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_input_shaping_test.stl"));
add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_tower_test.stl"));
auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config;
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
@ -10288,6 +10298,7 @@ void Plater::calib_junction_deviation(const Calib_Params& params)
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats{200});
filament_config->set_key_value("enable_pressure_advance", new ConfigOptionBools{false});
filament_config->set_key_value("pressure_advance", new ConfigOptionFloats{0.0});
print_config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
print_config->set_key_value("enable_overhang_speed", new ConfigOptionBool{false});
print_config->set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
print_config->set_key_value("wall_loops", new ConfigOptionInt(1));
@ -10297,6 +10308,10 @@ void Plater::calib_junction_deviation(const Calib_Params& params)
print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false));
print_config->set_key_value("spiral_mode", new ConfigOptionBool(true));
print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(true));
print_config->set_key_value("bottom_surface_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(200));
print_config->set_key_value("default_acceleration", new ConfigOptionFloat(2000));
print_config->set_key_value("outer_wall_acceleration", new ConfigOptionFloat(2000));
model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));

View file

@ -827,7 +827,7 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin
m_tiFreqStartX = new TextInput(this, std::to_string(15), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqStartX->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
auto end_x_text = new wxStaticText(this, wxID_ANY, end_x_str, wxDefaultPosition, st_size, wxALIGN_LEFT);
m_tiFreqEndX = new TextInput(this, std::to_string(60), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqEndX = new TextInput(this, std::to_string(110), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqEndX->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
x_freq_sizer->Add(start_x_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
@ -842,7 +842,7 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin
m_tiFreqStartY = new TextInput(this, std::to_string(15), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqStartY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
auto end_y_text = new wxStaticText(this, wxID_ANY, end_y_str, wxDefaultPosition, st_size, wxALIGN_LEFT);
m_tiFreqEndY = new TextInput(this, std::to_string(60), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqEndY = new TextInput(this, std::to_string(110), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiFreqEndY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
y_freq_sizer->Add(start_y_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
@ -855,7 +855,7 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin
wxString damping_factor_str = _L("Damp: ");
auto damping_factor_sizer = new wxBoxSizer(wxHORIZONTAL);
auto damping_factor_text = new wxStaticText(this, wxID_ANY, damping_factor_str, wxDefaultPosition, st_size, wxALIGN_LEFT);
m_tiDampingFactor = new TextInput(this, wxString::Format("%.2f", 0.35), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactor = new TextInput(this, wxString::Format("%.3f", 0.15), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactor->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
damping_factor_sizer->Add(damping_factor_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
@ -863,7 +863,7 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin
settings_sizer->Add(damping_factor_sizer);
// Add a note explaining that 0 means use default value
auto note_text = new wxStaticText(this, wxID_ANY, _L("Note: 0 Damp = Printer default."), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
auto note_text = new wxStaticText(this, wxID_ANY, _L("Recommended: Set Damp to 0.\nThis will use the printer's default or the last saved value."), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
note_text->SetForegroundColour(wxColour(128, 128, 128));
settings_sizer->Add(note_text, 0, wxALL, 5);
@ -983,10 +983,10 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin
// Damping Factor Start and End
auto damp_sizer = new wxBoxSizer(wxHORIZONTAL);
auto damp_start_text = new wxStaticText(this, wxID_ANY, damp_start_str, wxDefaultPosition, st_size, wxALIGN_LEFT);
m_tiDampingFactorStart = new TextInput(this, wxString::Format("%.2f", 0.00), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactorStart = new TextInput(this, wxString::Format("%.3f", 0.00), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactorStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
auto damp_end_text = new wxStaticText(this, wxID_ANY, damp_end_str, wxDefaultPosition, st_size, wxALIGN_LEFT);
m_tiDampingFactorEnd = new TextInput(this, wxString::Format("%.2f", 0.40), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactorEnd = new TextInput(this, wxString::Format("%.3f", 0.40), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE);
m_tiDampingFactorEnd->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
damp_sizer->Add(damp_start_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);