Midair 3D Printing: Making Coil Springs Without Support

Note: If you just want to make some midair springs, skip ahead to the G-code generator.

Most 3D printable parts are designed to limit overhangs to 45 degrees or less. That's because maker-style 3D printers (technically FDM) build each layer from the bottom up, fusing the current layer onto the previous, and if there's nothing below a layer, the plastic will sag (or worse yet, form a glob and potentially ruin your part).

To get around the overhang limit, parts are often significantly modified (with chamfers to reduce overhangs) or support material is used to hold up sections that extend too far. But neither approach works all the time; sometimes you can't chamfer away the overhangs and/or rely on support material to bail you out.

Going Midair

Have you ever noticed that at the end of a print there's sometimes a small thread of plastic that seems to follow the exact path of the extruder after it finishes printing? This is often caused by a little extra filament continuing to flow/ooze as the print head pulls away. The plastic is thin enough to cool as it moves, tracing out the path in midair.

While those little threads aren't likely to be very useful, we wondered if we could apply that same approach to purposely trace out a 3D contour.

Note that this isn't something most STL/G-code slicers are going to do for you (yet). Slicers are focused on fusing layers together to create solid parts or shells and don't typically try to extrude filament in midair (with the exception of bridges that are supported on two sides).

Making Springs

We figured an extreme test of printing in midair would be to print a coil spring (specifically a helical compression spring).

Besides some high-end research using metal and lasers and a few one-off demos, midair printing seems rather underexplored -- the perfect opportunity to get hacking!

After a few quick refreshers on generating custom G-code, we made a short javascript function that traces out the desired 3D path, setting temperature, feedrate, fan speed, etc. along the way.

It took several iterations to dial in the parameters and sort out what worked/failed. Eventually we were able to consistently produce springs of various sizes and shapes.

The spring constant is admittedly tiny (i.e. it pushes back very lightly), but it's by far the springiest print we've ever made (incredibly smooth, consistent, and doesn't show any major signs of fatigue after lots of squeezes). And since the coil itself is a single strand, there's no worry of delamination along the coil (as is the case with most 3D printed springs).

Lessons Learned

Here are a few of the key observations we made along the way.

Go With the Flow.

The ideal extrusion flowrate should be pretty close to 1:1 for the distance traveled.

Not extruding enough material pulls on the part, deforms it, and sometimes gets too thin or breaks. Extruding too much material causes uncontrollable ripples, sags, or globs if it collides with previous layers.

Move Slooooowly and Evenly.

Plastic takes a significant amount of time to cool (even with the fans on) and that means the print head must move slowly to allow time for the plastic to harden in midair as it goes.

Many plastics also ooze differently as the feedrate and temperature change, so once the midair section is started (or even slightly before), keep things steady.

To give a sense for the time scale, each of the springs shown above took between 3-7 minutes to print (the first few layers are quick, then the midair coils move much more slowly).

Bubbles Break Things.

New filament should be dry and unlikely to bubble, but older filaments can have moisture trapped in the plastic that boils and sputters as it gets heated (causing uneven flowrate and weak sections).

When printing solid parts, small bubbles are usually just a cosmetic concern since other layers can share the load. But with midair printing which leverages a single continuous strand of filament, weak spots caused by bubbles can cause the part to fail.

Compensate for the Extruder's Pull.

As the filament is extruded, it tugs slightly on the existing cooled strand. Near the bottom where the part is well supported this has very little impact, but as the part grows taller the force displaces the strand more (think of it as a vertical end-loaded cantilever beam, with a growing lever arm as the print proceeds).

This means that the G-code for a cylindrical coil spring actually flares out slightly near the top to produce a spring that is straight when completed.

Note that fully modeling the extruder's pull (or even push in the case of over-extruding) is tricky. Prints that only stretch out into midair briefly probably don't need to compensate much, but others (like very tall springs) require it to produce accurate parts.

Midair Spring G-Code Generator

This is an experimental hack. Double check that it's properly sized/positioned for your printer!

To create your own spring:

Edit any of the parameters below. Click the Generate G-Code button. In your favorite slicer app (Cura, etc.), create a simple bit of G-code using the desired setup/filament. For example, load any small printable part and choose the correct filament (i.e. PLA). But before you actually tell it to print, there should be an option to save the G-code to a file. Do that and use it in the next step. Open the exported G-code and replace the main working section with the generated output (between your 3D printer's standard Start/End G-code blocks, which likely heats things up, levels the bed, etc.). For a typical printer, there are probably about 50 lines of initialization code before you see something like ";LAYER:0" which is the start of the main program. The custom spring g-code replaces all the main program layers (which goes to the end/cleanup section; usually the last ~25 lines of the file). Re-open the modified g-code file in your slicer. Make sure it looks okay (i.e. it's in the printable area of your printer) and then run/print it (watching the whole time in case anything is incorrect). Be ready to turn things off if something seems out of place!

Note: All G-code is generated in javascript on this page. Feel free to take a look under the hood and play with it yourself for further experimentation!

Midair Coil Parameters

Coil Shape: Circle Square Triangle Flower

Coil Radius: mm

Coil Pitch: mm/rev (Z axis)

Revolutions: revs

Coil Feedrate: mm/min (it's slow!)

Cantilever: (multiplier)



Center X: mm

Center Y: mm



Filament Diam: mm

Nozzle Diam: mm



ExtTemp Base: °C (~10° below)

ExtTemp Coil: °C (~15° below)









Examples (for TAZ 6)

We ran all our tests on a TAZ 6, so if you happen to have the same printer feel free to use our exact G-code to give it a try!

All prints use a 0.5mm nozzle and are printed in PLA/PLA+.

Implications

While making midair springs is fun, the real hope here is to spur on thinking about ways to print more complicated features and extreme overhangs without resorting to support material.

There are naturally some practical limitations to slowing prints down, quickly changing temperatures, and toggling fan speeds, but it seems likely that some of the techniques explored here could be useful in next generation slicers / G-code generators.

Imagine a long overhang being accomplished by momentarily slowing down a print and snaking a strand of filament away from a part and then back. Making a set of these loops could then be used as a shelf to build up subsequent layers without requiring support underneath.

If nothing else, it's handy to be able to make springs of different shapes which are otherwise hard to find. And since the code is open (just view the source of this page), we hope it can also be used as a starting point for others who wish to experiment with their own midair part designs.