tl;dr: a prototype of new kind of 3D printer shows promise.
SkyDelta is a new style of open-source RepRap 3D printer. Similar to deltabots like the Kossel, Rostock, Cerberus, Wolfstock, and many others, it has a triangular-prism frame. However, instead of using linear rails and rigid rods to move the print head through space, SkyDelta employs tensioned lines. Click the YouTube video below for a walkthrough of the first prototype of SkyDelta, mounted to a larger Kossel Mini frame:
This post walks through the motivations, challenges, and resulting design of SkyDelta, whose parts are available on GitHub. I find long-form blogs like those from RichRap and Terence Tam to have invaluable content for those who aspire to move from replicating others’ designs, to tweaking them, to finally, creating originals designs to share with the community. If you’re just interested in making one, skip to the bottom for instructions and the current status.
Why a Tensioned-Line Delta?
The design was inspired by a discussion on the deltabot Google group, which describes the core idea of using tensioned lines in a delta configuration. In particular, Tray first proposed Spike, a beautifully simple mechanical design where 6 motors control lines that move a rod-mounted effector (the “spike”) through space:
A month later, Anatoly Y proposed the three-motor spike, a design that retracts two lines equally to reduce the motor requirement to the more practical total of 3, yet always holds the effector in the right orientation:
These designs oozed with potential to enable a fast, easy-to-build, super-low-cost printer. Effectively, you start with a linear-rail delta, then throw away many parts that add cost and complexity, including:
- Linear motion components: the Kossel Mini specifies 3 industrial-looking ~$150 recirculating ball rails. Alternately, you can use my drop-in replacement, the Kossel Carriage Adapter, a printed part which holds and tensions Steve Graber’s Delrin wheels to yield buttery-smooth motion — for about half the price. Another option is to use pairs of precision steel rod with linear bearings like LM8UUs, as used in the Rostock and 3DR designs. These parts go away with tensioned-line designs.
- Rods w/ball joints: typically carbon-fiber tube, but sometimes wood, aluminum, injection-molded plastic, or steel threaded rod. These must all be exactly the same length, which requires a jig. They must end in ball joints, such as the common Traxxas 5347 joints. A major problem is that these joints are manufactured with about 0.003″ of intentional backlash. This is fine when controlling RC cars, but the error, which I’ve measured as large as 0.01″ using my Traxxas Backlash Tester, is unacceptable in 3d printing. You can pay more for better ball joints, over-tighten a set screw to deform the plastic and remove the backlash, or use backlash-free magnetic joints, but in all cases, you’re looking at an expense ($40 for 6) or a few hours to fabricate the rods.
- Belts: GT2 belt prices and availability have both improved lately, but still, 3 pulleys, 3 belts, and 3 idlers (typically 6 flanged bearing) to move the linear rails all add cost.
Tensioned-line designs do add the cost of 3 spools, some Spectra line (strong braided plastic line used in kites and fishing), and maybe some bearings, but it appears like a cost win overall. A tensioned-line delta has other potential advantages, too:
- Larger build volume for a given build height; on linear deltas, the height of the rods adds a significant increase to the machine height. On SkyDelta, the spacing between the lines (currently only 60 mm) adds a bit of height, as does keeping an angle on the lines for tension, but these are definitely less than before. However, this may be counteracted somewhat by a reduction in build diameter. We’ll have to see about this one.
- Easier to bootstrap. You can get 608 bearings at many hardware stores, but small ball joints and belts optimized for motion (like GT2) are more rare. Additionally, the frame can be extremely simple when you don’t need precise, rigid extrusion slots. You easily switch to Aluminum tubes or even wood dowels with this design.
Sounds great. What are the challenges?
Nobody said this would be easy. I haven’t solved them all the challenges, or even identified all the ones that will pop up. Here are some of them:
(1) Keeping the effector oriented properly
The effector, which holds the hotend, must always be orthogonal to the build plate; if the extruder tilts, it can affect print quality. Parallelogram linkages are common, as they hold the orientation of each bar parallel to its opposite bar. Linear deltas ensure that the effector stays oriented using 3 spherical-joint parallelogram linkages. SkyDelta uses the same idea, but with different parts in a different orientation. The spherical joints come from two rotational joints (filament idlers plus filament idler holder bearings). Instead of side-by-side rods, SkyDelta has vertically stacked tensioned lines. As longs as these lines are tensioned, we have parallelograms everywhere, and the effector stays parallel to the towers.
The main idea in SkyDelta is to direct two lines out from the effector, which then cross over filament idlers, go downwards. The two lines tie in a knot, which guarantees equivalent motion, and one of the lines, which is longer, goes down to a motor-driven spool.
This setup doesn’t ensure equivalent tension on its own, because tying a knot by hand in exactly the right spot is practically impossible. SkyDelta adds an adjustment screw in the effector to handle this; look for the little red pieces in the effector:
A nyloc nut holds each tensioning screw in place. Turning the screw adjusts the relative length of the upper and lower lines, as the screw moves each tiny printed red tensioner piece. By clamping the effector in place and turning the tensioners, you can adjust the lines until they strike the same note when plucked and are at the same length.
Another concern is that as the effector moves and the parts holding the filament idlers rotate in place, the lines might change length relative to the spool. This is a valid concern in theory, but I’ve tried to make sure it doesn’t matter in practice. First, the filament path is concentric with its the bearings on the filament idler holders. That is, the filament idler holders place the idlers (the black V-groove spool-shaped parts) at the right offset, so that the lines come down through the center of the bearings, resulting in the “pac-man” shape:
This filament idler assembly is the key part of SkyDelta. Originally I thought to use two single-filament-idler assemblies, like this:
… but then I realized that printing one longer part would halve the bearing requirements, ensure that the filament idlers were always pointed in the same direction, and guarantee that the space between the idlers was always the exact, designed distance.
I’m particularly proud of the ends, which snap into the bearings:
Somehow these printed perfectly on the first try. I never thought that would happen! Designing with plastic can be so nice.
The second potential issue is induced motion from the lines “walking” along the spools. When the spool is rigidly fixed on the motor shaft, as the spool rotates, the string exit will move. Doing the math: with an 18mm diameter spool, 15 in (381mm) of line motion, and 80 lb-rated Spectra (~0.5mm in diameter), you get 6.74 wraps around the spool, equaling 3.35 mm of side-to-side motion. With an 18 in (457.2 mm) motor-to-idler distance, spool walking causes 0.012 mm of induced length change across the build envelope. To put that in perspective, this is less than one microstep; each step with an 18mm spool, 16x microstepping, and 200 steps/rev motor moves 0.017 mm. If I went to smaller 15mm diameter spools, the length change would increase to 0.018mm. Going to 8mm vinyl tubing, the error goes to 0.062mm.
Hence, “string walking” does not appear to be a huge issue for SkyDelta. Plus, it’s something you could correct in the firmware, anyway, if you needed that extra 0.012mm of accuracy. This suggests the possibility of going to larger, more rigid Spectra line to minimize stretch, since the extra string walking won’t matter.
(2) Maintaining sufficient and equal tension throughout the build envelope
You lose all accuracy if a line goes even slightly slack. All 6 lines must stay tensioned. If one line has much higher tension than another, you might see the effector twist and lose positioning accuracy.
Unfortunately, Anatoly’s design ensures tension for the upper 3 lines but not the lower 3:
Think about it; what happens if I push sideways on the bottom of the spike, toward on of the motors? That line will go slack. There will be a some force from the springs trying to return the thing to centered and push down, but it’s nowhere near enough. This wasn’t obvious; I only realized this the first time I played with SkyDelta. Now the springs are mounted to the bottom of the effector, and the effector is much “stiffer”.
Now we can maintain tension, but how much tension should we maintain? At all times, the motors must resist the tension of the lines, which effectively cuts out some of their torque. About 500g of tension feels right to me, measured using a kitchen scale weighted with stepper motors, and tare’d to the weight of the motors:
As I pulled on a rubber band, I’d get a reading of the tension. Of course, the more tension, the stiffer the effector, and the more it resisted my pokes. This issues does seem like a fundamental downside of this design when using springs, rather than the weight of the extruder assembly, to maintain tension.
To get a sense of the loss of torque, take a look at the torque/speed curve for a common NEMA17 motor like the Kysan 1124090. At lower speeds, the motor torque rating is near 3 Kg-cm. Typically, you’d drop the max current to 60-70% of rated so that the motor doesn’t get hot, by using stepper driver current limiting. Assuming a 1-cm spool radius, 500g force, and motor derating by 33%, this means one-fourth of our motor torque is unavailable, because it must always overcome tension. This means the effector will slower to accelerate in the direction where it is resisting the springs.
A related but opposite issue is that accelerations must be limited to prevent the lines going slack when the effector moves toward the springs. I haven’t considered this one carefully, yet, but it’s something to consider with all designs where springs and/or gravity maintain tension.
Next, how do we maintain even tension through the build envelope? There are two issues here:
- Tension changes as the lines change length. Common springs obey Hooke’s law. Remember it from high school physics class? Spring force is proportional to distance. As the spring extends, the line tension changes.
- Tension changes as the lines change angle. When the effector is next to a spring mount, the force exerted on the effector is exactly equal to the spring tension. As the effector moves away from the spring, the angle changes and reduces its tension. As the effector moves vertically up and away from the spring mount, this angle change can get pretty significant. For example, at 45 degrees of line angle, the tension applied by one spring drops by about 30%.
This build is geared toward lower-cost parts, so I wanted to start with the lowest-cost spring option: rubber bands. From a pack of varying sizes, I picked three of the same size and length that felt about right, cut them, and then attached them to mounting screws or holes with a simple overhand knot. The rubber material has enough grab on itself with an overhand knot, once you’ve tightened it.
The three rubber bands are mounted on “outriggers” made with short lengths of OpenBeam plus OpenBeam brackets.
The outriggers expand the printable envelope by expanding the triangular region in which they can maintain tension. Linear deltas don’t have any need for outriggers; since the rods are rigid, the effector can extend beyond the printable circle. [Ignore the pulley for a second – this picture shows the latest design].
Initially, the rubber bands were tied directly to the outrigger. It was immediately clear that the change in spring force as the spring changed length was going to be a real problem. The spring needs to have some initial tension, even when it is least stretched. But the extended length relative to the shortest length is a huge ratio, resulting in 3-4x+ force changes (for my geometry) from length alone, made worse by the angle changes. This is the difference between the effector being too loose to print well and and so tight that it significantly counteracts motor torque. Ideally, you’d have a spring that maintains a constant force throughout its motion, and then only have to contend with angle change. One way is to buy constant-force (CF) springs, which work a bit differently than normal Hooke’s law springs. They’re pre-tensioned pieces of bent spring steel. As the reel unwinds, the twist from the steel applies constant force, kind of like an infinitely long slap bracelet from the 80’s. CF springs look like this:
Their downsides are expense, limited force choices, and reliability. McMaster sells these but the extended-life ones only do 50K cycles. To print a vase, every perimeter of every layer will result in a partial cycle, so the wear limit could really matter in practice. Regardless, I have some of these on order to try out; I’m not sure if this cycle life is better than that of a rubber band, anyway.
Another option is to use moving counterweights to maintain constant, but those weights would add lots of inertia and slow down the motion.
The option I chose is to use normal Hooke’s law springs, like rubber bands, but to extend their range of motion using pulleys. By pre-stretching the springs and using pulleys to enable them to stretch over a much longer length, you can reduce the force change over their motion. In fact, you can use as many pulleys as you want to get closer to constant force over the length, by wrapping them back and forth. Assume that I have one pulley, that the spring moves about half the height of the printer, and that the uncompressed spring is half the height of the printer. 1x force stretches it to the full height; 2x force stretches it to the shortest position of its motion; 3x stretches it to the furthest position. Then the force change is only between 2x and 3x, or 50% increase.
Compare this to no pulley. The string must be stretched when the effector is at the top; let’s say the length is doubled, so it starts with 1x force. Then doubling the stretched length gets us to 3x force. Now we have a 3:1 ratio, with 200% increase along length. The pulley is pretty useful, no?
Most of the time, however, we’re probably not using the full printer height, so in practice this issue won’t be quite as bad as I make it out to be; still, the less the tension change, the easier it should be to get smooth motion.
To get a stiffer effector where it’s most likely to be, I decided to flip everything. See how the motors are at the top, the opposite of most deltas? This way, the springs start nearly at their highest tension, versus my original, where they started at the lowest tension. The downside of this flip is that now the weight of the effector is reducing tension, vs before, where it added tension. The whole assembly is under 100g, so this doesn’t seem like an issue, and I could definitely reduce the weight further with more careful design and plastic screws.
How do we minimize extruder motion? This is definitely an issue, since Spectra has a bit of stretch to it. You notice this much more when the tensioned lines move closer to horizontal. There, a small force can cause a large deflection. Not surprisingly, the effector is more stable in the Z direction when the lines are longest and more stable in the XY plane when the lines are shortest.
After flipping the thing, I found that the angle of the lines was really small at the just-above-build-plate position. The J-Head hotend shown below is around 2″ long, which creates enough offset for an angle, but the filament idler assembly uses a fair amount of space from the corner brace – nearly 2″. As a direct result, the effector could move up and down way too easily.
To fix this, I added an offset to the J-Head, using a previous effector prototype (the circular piece) with the same length of standoff, 52mm, as used above in the effector. The added two inches are a quick hack to get the extruder to be more stable, by increasing the angle of the lines.
I think the right solution may be to tweak the filament idler parts to drop them closer to the frame. By removing the rounded edges in the main filament idler holder, which adds an unnecessary offset, and integrating the 608 bearing holder into the Kossel corner bracket, I should be able to drop the bearing by over 30mm, and possibly remove the offset.
Even this approach isn’t optimal, because the lower the idlers go, the more they interfere with the build envelop, turning it from a cylinder into a cone. Plus, the larger the effector offset, the more any effector twist amplifies down to the hotend tip.
Perhaps the right solution is to give the builder this choice: add more effector XY and Z offsets if you want a closer-to-cylinder build envelope; drop these offsets if you want the best print quality for wide flat parts or tall towers, but then your build envelope becomes a cone.
(3) Establishing a home position
There are few ways to do this, all discussed on the deltabot thread, including hall effect switches with a metal weight, an optical pickup with a mark on the string, and a rotational position sensor on the motor. I’ll add that you could use belts rather than spools for motion, just like in a Mini Kossel, and then you could reuse the endstop mount. You might even use the Kossel auto-leveling probe to discover the position, with no other homing switches needed.
I haven’t tried any solutions yet. I first want to be convinced that the motion platform itself is worth pursuing, then figure out homing. I’ll use manual homing to start.
(4) Computing Spool Positions
When a standard cartesian printer receives a G-Code request to move to a particular [X, Y, Z] location, it needs no complex transformation to map from world coordinates to axis positions; they’re pretty much the same thing, just with different offsets.
When a typical linear-rail delta printer receives a G-Code request to move to a particular [X, Y, Z] location, it must convert from world coordinates to tower heights. The math for this fairly straightforward to derive, using the Pythagorean theorem. However, the math requires square roots, which are fairly demanding on embedded 8-bit microcontrollers. Plus, to get smooth motion between the commanded [X, Y, Z] locations, each long g-code move must get broken into many smaller segments; otherwise straight moves become curved. The 8-bit AVR microcontrollers typically used to control steppers in RepRap printers are running near their limit with current delta firmwares, including Marlin and Repetier.
When a tensioned-line delta printer receives a G-Code request to move to a particular [X, Y, Z] location, it must convert from world coordinates to spool motion. The math is a bit harder to derive and implement; Wolfram Research has a nice page with the needed equation. Instead of using the Pythagorean theorem to find a different triangle leg, we need the tangent point on the spool where filament exits. The microcontroller would now need to do inverse trigonometry.
Does the motion on the pulley matter? Absolutely. With 10mm diameter line idlers, you’re looking at 0 mm of wrap vs 7.85 mm of wrap at the two extremes of line angle. You can’t ignore this; you need to use the more complicated equation for the tangent line.
How to implement the firmware? One solution is to pre-compute the transformation between coordinate frames beforehand, using a slicer post-processing script, with unmodified firmware. But then when you want to move the printer to a specific position, it won’t know the mapping. This sounds like an issue. Plus, your script will need to break each G-code line into lots of little lines. Sending lots of little G-code motion commands over USB tends to be a bad idea. In the worst case, the printer can print blobs if the buffer empties, and print slower if the command bandwidth is limited.
I would prefer to avoid using a microcontroller for motion equations entirely. Now, cell-phone-style System-on-Chips (SOCs) have crazy amounts of processing power for almost as little money as microcontrollers. In particular, the ARM Cortex A8 is used in the BeagleBone Black, a Raspberry Pi competitor focused more on embedded uses than kids programming. It runs at 1 Ghz, yet sells for only $45. 32 bit instructions, caches, and floating point units all provide a crazy increase in power when compared to typical 16MHz AVRs, like the one used on my Printrboard. Even better, you can develop it like it’s a desktop, with a full graphical output, the ability to run standard Linux distributions like Debian, and the ability to program in any language you choose.
In particular, I have a BeBoPr, a board that connects a BeagleBone Black to stepper motor drivers, has FETs for the driving the extruder, and connects up temperature sensors and limit switches.
Getting the BeBoPr up and running was super easy, and I was able to verify that everything worked. I just haven’t put in much time yet to try it out with a real printer.
(5) Calibrating the Printer
On a linear-rail delta, you first calibrate the tower heights, then calibrate the rod length to fix “dishing”. Minow has a nice guide with more details.
On a tensioned-line delta, the “rod length” varies, so you can’t calibrate that, but my hunch is that the same general procedure will work: get a 3-point triangle flat, then get the center to match the outer triangle height by binary-searching for the right printer width.
The second issue is small variation in the build plate height, due to a heated bed expanding as it heats, an imperfectly flat build plate, or small motions when the printer gets physically moved. I designed the SkyDelta effector to fit Johann Rocholl’s Kossel Mini mechanical probe, which automatically fixes minor bed-height variation errors when used with Johann’s auto-leveling code.
Why the name?
The name refers to Skycam, which flies over football and athletic fields to provide great camera shots, using carefully-controlled high-tension lines. This video gives a quick overview and glimpse at the spools.
The name also refers to where most of the parts were designed: the sky. Really, this came about from being on a plane with no Internet and no good movies while over the Pacific Ocean.
It also just sounds cool.
How well does it work?
The motion is extremely smooth. I can grab one or two lines and pull and the effector will make a nice smooth arc, as seen in this video (the same one as at the top):
However, the tension is pretty variable over the motion. I don’t have the right springs, a way to adjust them easily, or even have a good sense of where they should go (e.g., one big spring in the center vs three springs at the edges).
I want to get the applied tension closer to constant over the more before trying to print. Then I can add a dial test indicator and see how repeatable the motion is when controlled by cartesian firmware, as well as measure XY and Z deflections when the extruder is pushed.
How do I make one?
All the parts are available as OpenSCAD files on GitHub in the SkyDelta repository. I’m not adding STLs to the git repo until the design stabilizes and is shown to print well. Most parts have been through at least one iteration and should print well with 30% or higher infill in PLA. I printed mine on a Printrbot Jr with a 0.35mm nozzle, 0.4mm extrusion width, and 0.2mm layer height, using Ultimachine Red PLA.
Before building, definitely shoot me an email, and check the SkyDelta issue tracker – there are a bunch of manual fixes I made to get this one built (like enlarging holes for effector screw heads and drilling a straight path for the filament) that are better fixed with parts changes.
To build it, you’ll need the following parts from the SkyDelta repo:
- 6x bearing holder
- 3x double idler holder
- 3x tensioner
- 1x effector top
- 1x effector bottom
- (optional, can be bought instead) 3x 52mm m3 standoff
You’ll also need a linear delta frame. I used the corner pieces from the Kossel Mini with longer 360mm side extrusions and 600mm vertical extrusions. I would recommend these. As long as the extrusions have m3 slots, you should be ok; otherwise the parts might need a few parameter tweaks.
You’ll also need:
- 3 motors to match the delta frame: I used NEMA17.
- 3 spools: I used Steve Graber’s Kossel spools.
- Spectra line. Purchased from Cabela’s in Vermillion Red, 80 lb test.
- m3 screws, nuts, and nyloc nuts
- a Bowden extruder
- hotend, groovemount compatible, like a J-Head.
- m5 push-fit for effector
- 6x 608 bearings. Get oiled, rather than grease-packed bearings. Oil is messier but will have less resistance.
- 6x idler bearings: I used a one-off set of Delrin pulleys with dual 623 bearings inside from Steve Graber. These were an experimental set and are no available, nor will any others be made. I used them because they were lying around. Any future prototype will use something more available and standardized, like 623vv/624vv/625vv bearings that are meant for this use case.
- 3x spring bearings. Same as idler bearings for me, but mine have a wide cutout. You may want to design a small plastic spindle to mount to a bearing.
- short OpenBeam lengths and triangle or T brackets for the outriggers
- all the electronics.
If you come across a bug, please note it on the SkyDelta issue tracker on GitHub. If you have any design or build questions about SkyDelta, let me know!
I find the diversity of 3D printer designs amazing. New kinds of printers are constantly popping up that use different materials, mechanical designs, and firmware to achieve additive manufacturing. Many of these designs are only feasible because of the minimal load requirements of additive manufacturing, where you only have the weight of the extruder head or laser to deal with, rather than significant machining forces, like with a mill or lathe.
Not only are the forces much easier to handle, but when you design knowing that your parts can be 3D printed, you design differently. Adding a tiny, long internal slot for a line of cable might only add a line of code to your OpenSCAD model, yet adds no extra complexity for the human. Compare that with subtractive manufacturing, where such a slot might require skill to orient the part, calibrate the mill, and then slowly drill holes or mill a slot. Designing in plastic adds flexibility too; for example, I could easily use the flexibility of the material to add a bearing-holding peg that stays in place.
It’s really satisfying to turn a printer design from idea, to sketch, to 3d model, to printed reality, to tweaked-and-tested. It’s even more satisfying when 3d printing enables the whole cycle to take on the order of a few weeks.