If you want to 3D print press-fit or snap-fit project enclosures, there are a few tricks you can use to get better dimensional accuracy. Unless you print in an extremely dry climate, it helps to dry your filament. You can also calibrate your printer's motion system, filament extrusion, and X-Y hole/contour compensation.
Drying Your Filament
FDM 3D printers work by melting plastic filament and carefully extruding it layer by layer to build up the desired shapes. Filament absorbs water from the air, and manufacturing filament involves a water cooling step. Wet filament can break more easily, and it can cause bubbles and stringing. Keeping your filament dry helps to get stronger prints with a smooth surface finish.
How Dry is Dry Enough?
People have lots of opinions about drying (for example, see r/3dprinting on reddit). For me, starting prints with filament stored in a plastic cereal box at 15% relative humidity has been working great. No bubbles. No splattering. Very little stringing.
How To Dry Filament?
For filament that's relatively dry to begin with, you just can put it in an air-tight plastic box with silica gel desiccant packs. In my experience, a plastic cereal box with about 50g of silica gel packets can take a roll of PLA filament from 25% to 15% relative humidity in less than a day. Starting at 15% out of the cereal box, if I print for a few hours in a room that's about 30% to 40% relative humidity, the hygrometer in my dry box usually reads 20% to 30% when I put the roll away. Within a few hours, that goes back down to 15%. But, it's important to note that silica gel can only absorb so much water before it needs replacement or drying, so this approach might not work well in humid conditions.
For new filament, or filament that's been stored in anything other than crispy dry conditions, starting with a filament dryer may be quicker than relying on silica gel alone. Many makes and models of filament dryers are available, with new models introduced fairly often. To see what people currently recommend, you could check r/3dprinting on reddit.
For new filament, I've been using a Sunlu FilaDryer S2 that I bought. The S2 works fine as long as I prop the lid open slightly (5mm to 8mm-ish gap). Typically, in 6 hours or less, the dryer will get a new roll of PLA filament down to about 25% relative humidity, but then it stops getting drier. From there, I put the roll in a cereal box with desiccant, wait a while, and it goes down to 15%.
Upgrading Your Printer's Firmware
Upgrading your printer's firmware to the latest available version may result in improved print quality compared to the factory firmware. How to go about a firmware upgrade will depend on what type of printer you have. For example, the Bambu Lab wiki has a page, Firmware update guide for P1 Series, that explains how to update the Bambu Lab P1S.
Calibrating Tool Head and Print Bed Movement
FDM printers use stepper motors with belts or drive screws to move the tool head and the print bed on 3 axes (X, Y, and Z). The stepper motors are controlled by the printer's firmware, which takes G-code instructions from a slicer (Bambu Studio, Cura, etc.). Calibration can help the motors move accurately, repeatably, and without problematic resonant vibrations.
Typically, printers will provide some way to make sure the bed is level and to calibrate stepper motor motion. Calibrating the motion system can help to avoid problems with waves in the surface of printed parts. Bed leveling helps with good first layer adhesion, avoiding warping, spaghetti prints, and various other problems.
How motion calibration and bed leveling works depends on what kind of printer you have. My printer is a Bambu Lab P1S, which I bought. The P1S uses a Core X-Y design with automatic bed leveling. Since bed leveling is taken care of automatically, I can pretty much ignore that part.
For calibrating the motion system to avoid problems with vibration and belt tension, the P1S has a calibration feature available in the menu system on the printer's LCD control panel. I did that when I first set up the printer. It made a bunch of noise for a while, but was otherwise unremarkable.
Calibrating Filament Extrusion
To extrude the right volume of filament so that each line your printer lays down will merge smoothly into the previous lines, without gaps or bulges, you can calibrate the extrusion of your filament. Extrusion calibration is complicated. Terms people often use to talk about it include over extrusion, under extrusion, K factor, and pressure advance. Options for calibrating different aspects of the extrusion process vary according to the model of your printer and which slicer software you use.
In the Bambu Studio slicer software, the Calibration tab offers two types of extrusion calibration, Flow Dynamics Calibration and Flow Rate Calibration. According to the Bambu Lab wiki, Flow Rate calibration is typically not necessary, so I ignored that one. But, the wiki recommends doing a Flow Dynamics calibration to set the K factor for new filament. I did a Flow Dynamics calibration for the filament I've been using (Bambu PLA Basic), and came up with a K factor of 0.02. I didn't notice much difference compared to the factory settings. The top surfaces of my prints seemed pretty smooth before and after the calibration.
Calibrating X-Y Compensation
In my experience, this is the really useful part for improving dimensional accuracy. Once you know that your filament is dry, your motion system is working well, and your extrusion flow is reasonable, it's time to check your X-Y hole and contour compensation. By printing a test block, measuring it, doing a little math, then setting the X-Y compensation values, I was able to improve my dimensional accuracy from about ± 0.12mm down to about ±0.5mm. That seems to be good enough for making press-fit bearing mounts without too much of wasted test prints.
In Bambu Studio, under Prepare tab > left sidebar > Process heading, you can turn on the Advanced process settings option. When you do that, it enables input fields for "X-Y hole compensation" and "X-Y contour compensation" under Process heading > Quality tab > Precision sub-heading.
To determine X-Y compensation values, you can print a test block, measure it with calipers, then do some simple math. Note that, similar to flow rate K factor calibration, your results here will likely be specific to the particular filament you're using and how dry it is.
X-Y Contour Compensation Howto
This is for setting the amount of extra plastic that gets extruded on the outside faces (contours) of your objects.
- Print a test block with some different spans sized so you can measure them with calipers. I made a test block in OpenSCAD (see download button and code listings below) with 10, 20, and 30 mm spans in the X and Y directions.
- Measure each of the 10, 20, and 30 mm spans with calipers that have a resolution of 0.01mm (0.1mm is too coarse).
- Calculate the average of the error for each span. For example, if you measure 9.87 for 10mm, 19.83 for 20mm, and 29.90 for 30mm, the average would be ((10-9.87) + (20-19.83) + (30-29.90))/3 = 0.13mm
- Divide the average error by 2, because half of your error came from each side of the print, but you need to know the error on just one side. For example: 0.13mm / 2 = 0.06mm.
- In Bambu Studio, enter that number in the X-Y contour compensation field (e.g. 0.06).
- Print the test block again with the new settings to see if you are satisfied with the resulting accuracy.
Before X-Y Contour Compensation
This was is my very first XY compensation test block, with no XY contour compensation in Bambu Studio:
After X-Y Contour Compensation
This is the result of setting my X-Y contour compensation in Bambu Studio. Note that I set a compensation value based on averaging error for various spans in the X and Y directions. I could have made this one measurement closer, but that would affect the other measurements too. I'm happy with anything inside of ±0.05mm.
X-Y Hole Compensation Howto
This is for setting the amount of extra plastic that gets extruded on the inside faces of holes in your objects.
- Print a test block with some different sized holes so you can measure them with calipers. I made a test block in OpenSCAD (see download button and code listings below) with 3, 5, and 10 mm holes in the X and Y directions.
- Measure each of the holes with calipers that have a resolution of 0.01mm (0.1mm is too coarse).
- Calculate the average of the error for each hole. For example, if you measure 2.87 for 3mm, 4.83 for 5mm, and 9.90 for 10mm, the average would be ((3-2.87) + (5-4.83) + (10-9.90))/3 = 0.13mm. Or, you might just calculate the error for the 10mm hole, since measuring small hole diameters accurately with calipers is really tricky.
- Divide the average error by 2, because half of your error came from each side of the hole, but you need to know the error on just one side. For example: 0.13mm / 2 = 0.06mm.
- In Bambu Studio, enter that number (0.06 or whatever) in the X-Y hole compensation field.
- Print the test block again with the new settings to see if you are satisfied with the resulting accuracy.
Before X-Y Hole Compensation
This is my measurement, 9.91mm, of the 10mm hole before applying X-Y hole compensation in Bambu Studio. Note that measuring holes with calipers is tricky. You may need to wiggle it around a bit, try some different angles, and apply moderate pressure to the calipers' thumb grip.
After X-Y Hole Compensation
This is my measurement, 9.99mm, of the 10mm hole after applying X-Y hole compensation in Bambu Studio. Again, it's within ±0.05mm, so I'm happy with the result.
X-Y Test Block STL File
This is the download button for my X-Y hole/contour compensation test block:
// SPDX-License-Identifier: CC-BY-SA-4.0
// SPDX-FileCopyrightText: Copyright 2024 Sam Blenny
//
// This is a test block to calibrate X-Y hole/contour compensation.
height = 5;
module stairstep_block() {
linear_extrude(height,convexity=10)
union() {
square([10,30]);
square([20,20]);
square([30,10]);
}
}
// This makes a tool shape to cut a horizontal chamfer
module chamfer(length=32) {
translate([-1,0,0])
rotate([0,90,0])
linear_extrude(length)
polygon([[-1,0],[0,1],[1,0],[0,-1]]);
}
// This makes a tool shape to cut a vertical chamfer
module v_chamfer() {
translate([0,0,-1])
linear_extrude(height+2)
polygon([[-1,0],[0,1],[1,0],[0,-1]]);
}
// These cut the sharp squares in the inside corners
module inside_corner_wedges(height) {
union() {
translate([2,2,height+1]) rotate([180,0,270]) // top face
linear_extrude(2,scale=0.5) square(4);
translate([2,2,-1]) rotate([0,0,180]) // bottom face
linear_extrude(2,scale=0.5) square(4);
}
}
// This makes a chamfer path tracing the outline of the block
module chamfer_path() {
chamfer();
rotate([0,0,90]) chamfer();
translate([0,30,0]) chamfer(12);
translate([11,20,0]) chamfer(11);
translate([21,10,0]) chamfer(11);
translate([30,0,0]) rotate([0,0,90]) chamfer(12);
translate([20,11,0]) rotate([0,0,90]) chamfer(11);
translate([10,21,0]) rotate([0,0,90]) chamfer(11);
}
// This makes a tool shape to cut a hole with chamfered edges
module hole(height, diameter) {
h = height;
r = diameter / 2;
rotate_extrude($fn=40)
polygon([
[0, -1], [r+2, -1], [r, 1], [r, h-1], [r+2, h+1], [0, h+1]
]);
}
// This makes a stairstep shaped block having surfaces to measure 10,
// 20, and 30 mm distances in the X and Y directions, plus 3, 5, and
// 10 mm holes. This is meant to help set XY Contour Compensation and
// X-Y Hole Compensation calibration values in Bambu Studio, Cura, or
// other similar slicer software.
//
// To have OpenSCAD's preview mode show the shapes used to make the
// chamfer cuts, you can put a '#' or a '%' character at the start of
// the line for a cut. For example, you chould change `v_chamfer();`
// to `#v_chamfer();`
//
difference() {
// Start with a block that has sharp corners
stairstep_block();
// Make chamfer cuts...
// cut around the top and bottom perimeters
translate([0,0,height]) chamfer_path();
chamfer_path();
// cut off the vertical outside corners
v_chamfer();
translate([30, 0,0]) v_chamfer();
translate([30,10,0]) v_chamfer();
translate([20,20,0]) v_chamfer();
translate([10,30,0]) v_chamfer();
translate([ 0,30,0]) v_chamfer();
// remove sharp points at top and bottom of inside corners
translate([20,10,0]) inside_corner_wedges(height);
translate([10,20,0]) inside_corner_wedges(height);
// cut chamfered holes
translate([10, 10, 0]) hole(height, diameter=10);
translate([22, 5, 0]) hole(height, diameter=5);
translate([5, 22, 0]) hole(height, diameter=3);
}
Turning Down Acceleration
Bambu Studio comes with defaults tuned for printing fast. The quality is still pretty good at high speed, but it makes a fair amount of noise and vibration. I've been happy with the results from adjusting a copy of the Standard process preset in Bambu Studio to use lower acceleration.
If you want to use lower acceleration, in Bambu Studio, under Prepare tab > left sidebar > Process heading, you can turn on the Advanced process settings option. When you do that, it enables the Speed tab under the Process heading in the sidebar. In Process > Speed > Acceleration sub-heading, I turned the "Normal printing" setting down to 5000. Once I did that, the printer was quieter with a lot less vibration. I assume that probably makes at least a small contribution to improved print quality, but it's definitely nicer to be around during printing.
Setting Infill Pattern
Slicers like Bambu Studio and Cura let you control the pattern they use to fill hollow spaces inside of 3D printed shapes. The type of infill you use affects how many grams of filament get used, how much noise the printer makes, how fast your nozzle wears out, and the strength of your finished parts.
People on forums seem to strongly dislike the grid infill pattern that Bambu Studio uses for many of its default presets. Supposedly grid infill can cause nozzles to wear out faster, which can mess with your dimensional accuracy and surface finish. I've had good results so far using 15% line or cubic infill. People also like gyroid infill, but it's slower and makes more noise.
This page (Calibrate Your 3D Printer for Dimensional Accuracy) was last updated on December 10, 2024.
Text editor powered by tinymce.