3D Printing Perfection

Ty 10 year old kids have finally caught the Gloomhaven bug. For anyone who hasn’t played this game (or doesn’t play with 10 year olds), let’s just say keeping things on the level andorganized during a scenario and across a campaign can pose a challenge. I started looking around for things I could 3D print to ease this burden. There were a few existing models for player dashboards and box organization that looked promising. I started making some rough prototypes and quickly realized that I needed 3D printing perfection if I wanted everything to be as dimensionally accurate as possible.  This was a requirement in order to make sure that everything fit back in the box perfectly.

Achieving 3D Printing Perfection

I will describe my steps in terms of my printer… a heavily customized Printrbot Simple Metal. Printrbot is sadly no longer in business.  Despite this, the reasonably open nature of this printer has allowed it to live on. Even though I’ll be describing everything in terms of this printer, I’ll summarize with high level steps that should be applicable to any printer/slicer combination.

Test Prints

I started off printing lots of test cubes of known dimensions. These guys print fast and then I measure them with a digital caliper. If the dimensions aren’t near perfect, it’s time to make some adjustments and print again. Assuming your printer isn’t completely out of whack, this model will mostly help you perfect your hot end and heated bed temperatures for the filament that you are using. The goal here is to perfect the balance of adhesion to the build surface without making the part difficult to remove or squashing things in the Z-axis.

First Layer Issues

No matter what I did, I couldn’t really get my Z height to be perfect. It was always smaller than it should be.  I kept adjusting my Z Offset using the G-code M212 ZXXX where XXX was some Z probe Offset adjusted over and over again in .1 mm increments. No matter what value I used, I could not get this perfect before reaching an offset that negatively impacted the first layer adhesion. I noticed that at a certain Z offset, where there was no possibility of the hotend smashing the first layer.  Even so, the discrepancy in the Z height always remained the same.

To see if the issue with Z dimension accuracy was an issue with every layer, I decided to print a taller model.  In theory, I should see a larger discrepancy with a larger model.  Instead, if it was purely a first layer problem, the Z height discrepancy should be about the same no matter the model height.  I moved to printing a pyramid calibration print that was taller and would also allow me to test stacking dimensional accuracy in the X/Y axes. The first print proved that the Z height dimensional problems were absolutely a first layer issue.

3D Printing Software

I recently switched my preferred slicer from Simplify3d back to Cura.  I did this due to an issue I had where Simplify3d’s overaggressive license protection scheme kept locking me out of being able to use the software.  This required me to wait on their customer support (sometimes for days) to unlock my legitimate copy so that I could use it again. When this initially happened, I was in a hurry to continue printing a project that I was working on and I breezed through the Cura setup mostly accepting the defaults for my printer.

Z Dimension Accuracy

Up until this point, extreme accuracy in the Z dimension wasn’t a high priority and I didn’t really notice any issues until diving into this project. I did some digging in Cura and noticed that a default setting was to do about an 80% extrusion on the first layer. I changed this to be 100%.  After adjusting some hotend and heated bed temperatures on a few more cubes and my Z height was perfect!

By now, I had tons of little cubes in all sorts of colors littering my printing area. They might print fast, but they’re fairly useless. I decided to look for a test print that had at least some utility. Eventually, I found a jenga block that took about 20 minutes to print and decided to go for it. I thought that since my printer was fairly dialed in now, I could use this to print when making subtle slicer changes or swapping filament to see how overall printing would be impacted. My kids saw a few of these in different colors and wanted a ‘giant’ jenga set so I scaled up the model and went to work.

Cooling Prints

Within a few minutes of printing a jenga block that pushed the limits of my build area in the X direction, I noticed some obvious warping in the corners. How could this be when everything was dialed in? Initially, I blamed the cooling fan. I felt maybe it was cooling the PLA to fast which was killing edge adhesion. I modified my slicer settings to turn the cooling fan off completely for the first two layers and then gradually ramp up to 100% over the next 5 layers. This seemed to fix the warping for the jenga blocks.

Splitting Models

I finally got back to what originally led me down this path… printing inserts to organize GloomHaven. I unfortunately couldn’t print everything in a single piece since the largest inserts needed a 285 mm print surface in one direction.  My franken bot maxed out at 250 mm in all directions 🙁 . I contemplated putting everything on hold and figuring out how to enlarge my print surface. Then I recalled what that process was like when I upgraded from my original 150 mm axes to my current 250 mm. It took forever to iron out the kinks. I decided to just split up the models to make them print using my constraints. To do this, I added tabs so they could then be glued together.  For most of my PLA based projects I use this craft adhesive.

Even by splitting the models, some of these pieces still pushed me almost to the limits of my build area in at least one direction. I continued to notice warping.  In some cases, failed adhesion in the extreme ranges of both the X and Y axis was still occurring. This was perplexing at first.  After doing some research with several additional test prints it appeared that I had an issue with my bed not being level. One of the reasons I favored the Printrbot early on was because it had an auto bed leveling capability. This was supposed to correct for minor imperfections in the bed’s levelness by modifying the gcode sent to the printer to compensate.

Bed Auto Leveling

The printrbot uses a metallic sensor to determine where the bed is. Before each print, it probes the bed in 3 places in order to get an idea of how it needs to compensate for any slant in the bed. I started by taking apart everything and recalibrating this sensor thinking that was the problem. Of course after doing this, I pretty much had to walk back through everything I had just done to dial in my printer.  A few days later, I was back in the same place.  I was still having issues in the extreme X/Y regions of my build area.

I started reading more about the auto bed leveling procedure.  This made me recall a former co-worker (who did not have an auto bed leveling feature) telling me about Simplify3d’s bed leveling wizard. I decided to give this a shot and record the results. This process basically moves the print head around to many points in the X and Y axis at a Z of 0.  It then probes the actual Z offset. It immediately became obvious that the problem was related to the 3 points probing that my auto bed level probe used. Everything within those points was fine, but there were several areas outside that were noticeably off in the Z offset compared to the probing points. These points that get probed are baked into the firmware.  I started digging around to see how I could change that.

Modern Firmware

I still use the original Printrbot firmware.  This is no longer maintained and it’s based on a fairly old version of the Marlin firmware. This version does not really support much modification in terms of how the auto leveling procedure works. While becoming knowledgable on the Marlin firmware, I discovered that newer versions of Marlin support a much more robust bed leveling procedure that arose out of the needs of SLA printers but was then modified for FDM printers. This procedure, called skewness compensation, allows you to define a ‘bed skew’ matrix that is applied before the auto bed level procedure is run. This sounded like the exact solution that I needed. Unfortunately, there isn’t an official printrbot firmware that supports this.  I did find a project to get the Printrbot Simple series running on a modern Marlin based firmware.

My initial investigation suggested that using this firmware is still experimental. I was also concerned about sacrificing other behaviors that haven’t been implemented yet in order to get bed skew compensation. Being that I have a bit of a print backlog, I didn’t want this printer to be out of commission.  Especially since it prints things that are smaller and centered on the build plate perfectly.  I decided to hold off on a firmware upgrade for now, but I am actively watching this project and plan to upgrade at some point. (Note: I have since done this and now maintain a Printrbot RevF Marlin github repository).

Hardware Bed Leveling… The Key to 3D Printing Perfection?

I needed another solution.  So I spent tons of filament and time tweaking the z-offset and generated g-code manually.  The purpose of this was to be able to print at the extremes.  Unfortunately, this resulted in a return of Z dimension accuracy issues when printing items that don’t expand beyond 75 mm from the bed center in the X or Y axis.

Custom G-Code

I treat custom G-Code and firmware changes like a software project and keep meticulous records about what I changed.  I used this changelog to define an ideal ‘profile’ for printing things within a 75 mm square centered on the build plate and another ‘profile’ for printing outside of this square. This got me close enough for just about every use case I was immediately working on. I printed for a few days swapping out firmware profiles depending on whether the model I was printing crossed this imaginary boundary or not.

All the time I was doing this, I still had this nagging item in the back of my head.  How do people who don’t have auto bed leveling deal with this issue? This led me down the path of an area I forgot all about from my early 3D printing days using home made rep raps… hardware bed leveling. To be honest, I probably more blocked this out of my mind.  It was so nightmarish in the early days.  This was one of the reasons I insisted on a printer with auto bed level feature when I upgraded.

I ultimately found someone who added hardware bed leveling to their Printrbot Simple Metal. I had to mess around a bit to get this working with my hardware modifications.  Doing this finally allowed me to dial in the printer reasonably well for the remaining part of this project.