====== 2024-06-14 - 3D printing fast ====== before we start... you need to have a decent machine. sturdy, with power to move and power to melt -- of course. there are however a ton of slicer settings, that allows you to go faster, on what you have. this is what this article is all about. why it's not the default? well -- the the faster you go, the less precise you get. you can experience underextrusions, poor overhands, poor layer adhesion, and whole lot of other artifacts... so why bother? for draft prints mostly. if the part is not functional, and you need to quickly check if this matches your expectations -- you go for speed. my old 3D printer is by no means speed or accuracy demon. yet it was enough to compare how different elements can affect the overall print time. let's cover these in separate sections. ===== tools ===== as usual i'll be using my [[https://github.com/el-bart/3d_printing_sdk|3D printing SDK]] for automated and reproducible builds, using [[https://github.com/el-bart/3d_printing_sdk/blob/master/template/config/printer/anycubic_chiron/filament/pla/mode/speed.ini|speed mode]] override. as of writing this article (3D printing SDK v2.6.0) it goes like this: fill_pattern = supportcubic perimeters = 2 top_solid_layers = 4 bottom_solid_layers = 3 fill_density = 10% # keep printing speed at maximum (for non-1st layers) external_perimeter_speed = 100% infill_speed = 120 perimeter_speed = 100 small_perimeter_speed = 60 solid_infill_speed = 100 support_material_speed = 100 top_solid_infill_speed = 100 travel_speed = 200 first_layer_speed = 60% first_layer_temperature = 200 temperature = 200 retract_before_travel = 0 retract_before_wipe = 0% retract_layer_change = 0 retract_length = 0 retract_length_toolchange = 0 retract_lift = 0.0 retract_lift_above = 0 retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 80 use_firmware_retraction = 0 only_retract_when_crossing_perimeters = 1 max_volumetric_speed = 12 max_print_speed = 150 extrusion_multiplier = 1.05 resolution = 0.2 slowdown_below_layer_time = 10 extrusion_width = 0.6 infill_extrusion_width = 0.6 external_perimeter_extrusion_width = 0.6 perimeter_extrusion_width = 0.6 solid_infill_extrusion_width = 0.6 top_infill_extrusion_width = 0.6 variable_layer_height = 0 first_layer_height = 0.3 layer_height = 0.3 cooling = 1 disable_fan_first_layers = 5 full_fan_speed_layer = 5 fan_always_on = 1 max_fan_speed = 100 min_fan_speed = 100 bridge_fan_speed = 100 ===== model ===== while printing i was testing [[https://www.3dbenchy.com/|3D benchy]] model ([[https://github.com/el-bart/external_3d_prints/tree/master/3d_benchy|3D benchy with SDK]]) and [[https://github.com/el-bart/mini/tree/master/3d_cube|3D calibration cube]]. {{:blog:2024:06:14:calibration_cube_in_openscad.png?400|3D calibration cube in OpenSCAD}} this this tests we'll just focus on 3D cube, as it's simpler to understand the presented concepts. this model, in the base settings, prints in 24m33s. this will be the reference. ===== changes ===== here all changes are covered, one by one. ==== print less ==== the less you print, the less head needs to move and the less plastic is extruded. # 3D support, to make less of it fill_pattern = supportcubic # minimal number of walls needed perimeters = 2 # minimal top and bottom layers, to make it "good enough" top_solid_layers = 4 bottom_solid_layers = 3 # as little infill as possible, while still being able to decently support top layers fill_density = 10% while these changes build time is already down to 21m58s. ==== faster movements ===== obviously the next step is to make head move faster. # that's nearly 2x the speed i use for regular / quality prints! external_perimeter_speed = 100% infill_speed = 120 perimeter_speed = 100 small_perimeter_speed = 60 solid_infill_speed = 100 support_material_speed = 100 top_solid_infill_speed = 100 travel_speed = 200 # note that it's still worth to give some extra time to the 1st layer, to make sure we have a solid base first_layer_speed = 60% we're down to 18m58s now. ==== don't waste time on retractions ==== retractions do take time. on lower-end full-metal hotends, doing loads of these can also cause jams due to heat creep. # decrease retractions to minimize risk of heat-creep (full-metal hotend) retract_before_travel = 0 retract_before_wipe = 0% retract_layer_change = 0 retract_length = 0 retract_length_toolchange = 0 retract_lift = 0.0 retract_lift_above = 0 retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 80 use_firmware_retraction = 0 only_retract_when_crossing_perimeters = 1 we're now at 18m57s... not much of a difference, right? well -- that's the problem with the model. 3D calibration cube has almost no retractions, thus the difference is minimal. the same changes for 3D benchy is 43m51s (with retractions) vs. 43m20s (w/o retractions). the more complex model, the more you gain, though definitely it's not a driving factor. ==== decrease quality ==== # decrease quality (0.2mm as a minimal detail size) resolution = 0.2 # move fast on small elements, at the cost of quality (this may need some tuning for more tricky models) slowdown_below_layer_time = 5 now we're at 11m45s. that's significant already. ==== go wide ==== in order to do less passes, make sure each pass does more by increasing extrusion width. for a typical 0.4mm nozzle, 0.6mm will do perfect. # e_w 0.4 -> 0.6 (less passes, at the expense of some extra material usage) extrusion_width = 0.6 infill_extrusion_width = 0.6 external_perimeter_extrusion_width = 0.6 perimeter_extrusion_width = 0.6 solid_infill_extrusion_width = 0.6 top_infill_extrusion_width = 0.6 while this can increase material usage (note that we use the same number of walls!), it usually pays of in speed (fixed-sized walls, many flat areas, etc.). here we're down to 11m16s. ==== aim high ==== in order to do less passes, make sure each pass does more in terms of layer height. for a typical 0.4mm nozzle, 0.3mm layer height (i.e. 150% of the default 0.2mm) is good. # higher layer == faster print variable_layer_height = 0 first_layer_height = 0.3 layer_height = 0.3 while this is a considerable loss of visual quality (comparable only to speed increase) it gets us down to 8m06s. ==== final touches ==== when printing fast, it's essential to let the plastic cool... well -- fast. # improve cooling cooling = 1 disable_fan_first_layers = 5 full_fan_speed_layer = 5 fan_always_on = 1 max_fan_speed = 100 min_fan_speed = 100 bridge_fan_speed = 100 this does not affect print speed directly, but generally allows you to go faster, while still preserving (at least rough) shape of smaller details. ==== volumetric flow rate ===== while we already bumped up speeds a lot, there's another limiting factor fir printing -- volumetric flow rate. it sets how much plastic can go through the nozzle, in cubic millimeters per second. after all what's the point in moving fast, if you cannot extrude at that paste? this often limits the speed of the print -- not the actual head movement. unless your hotend is specially designed to handle high flow rates (eg. 3D Vulcano, CHT nozzle, etc.) you'll likely top out at around 10mm^3/s, before extrusion issues starts. by lifting hotend temperature, and do a bit of an over-extrusion, this can be partially compensated for. # printing faster, with thicker layers may require a bit extra temperature for beter melting and bonding # (but not to much to avoid heat-creep on full metal hotned!) first_layer_temperature = 200 temperature = 200 # higher temperature allows for more volumetric speed max_volumetric_speed = 12 max_print_speed = 150 extrusion_multiplier = 1.05 so now we're at... 8m06s. so... no speedup? let's check the preview with '''prusa-gcodeviewer''', in a volumetric flow rate view. {{:blog:2024:06:14:volumetric_flow_rate_2x2x2_cm.png?400|volumetric flow rate on 2x2x2 cm cube}} the problem is -- the thing is small! for smaller models we cannot go too fast, as it will just become a hot blob of material. thus we need to slow down... and this is one of the magics of 3D printing -- getting bigger object does not necessary need to impl significant increase in print time! let's try the same model, but scaled up 2x (i.e. 4x4x4 cm). {{:blog:2024:06:14:volumetric_flow_rate_4x4x4_cm.png?400|volumetric flow rate on 4x4x4 cm cube}} now we can see that we're really utilizing the higher flow rates here. this would print in 31m48s, i.e. despite being 8x larger, it will only take 2.3x longer to print. for comparison, the same 4x4x4 cm cube, w/o speed profile would take 1h39m17s! ===== final result ===== here are the test prints from speed-profile of both 2x2x2 and 4x4x4 cm cubes, printed as measured. {{:blog:2024:06:14:cube_small_and_big_with_size.jpg?400|2x2x2 cm vs 4x4x4 cm cubes}} while there are definitely visible artifacts from the "speed" profile, i'm generally happy with the result. for small cube we started from 24m33s and lowered it to 8m06s (1/3 of the original value!) and for bigger one from 1h39m17s to 31m48s (again less then 1/3 of the original print time. as you can see there's a great potential for having slicer settings optimized for different qualities like "speed". in the near future i'll also describe some other common profiles are use, for special purpose prints.