Arcus-3D-C1 - Cable 3D printer

3D printable, Open Source Hardware, tripod kinematics, cable driven 3D printer

Similar projects worth following
This project aims to be a very low cost portable 3D printer with a scalable build diameter and reasonable accuracy.

The design as rendered (OpenSCAD source) can scale from about 200mm to 600mm build diameter with the same parts just by using different length connecting rods. The build height is approximately equal to the build diameter.

The printer can also be 'flat packed' for transport by removing the vertical rods as just the system tension holds them firmly in place.

The initial focus is still on the physical hardware task of making things move and eliminating intrinsic errors without resorting to software compensation. The software should be relatively simple as Machinekit does most of this out of the box.


I wanted to make a simple, low cost 3D printer using the available parts I had leftover from other projects, so the C1 was born.  Designed it in my head, and then modeled the parts in OpenSCAD.  

All I didn't have on-hand was the rods (driveway markers and a garden stake) which cost me a total of $12.

 I started independently on this path, but then a forum post pointed me to the Flying Skydelta.   Awww...  It's a lot like that, with cheaper hardware.

System overview

An octahedral equal length frame made from low cost fiberglass driveway markers support 3D printed corners.  The vertical components of the frame are held firmly in place by the line tension of the system, allowing them to be removed.  This facilitates flat packing of the printer for transport.

Each of the top corners house three pulleys sharing a shaft, through which cables are routed from the base mounted spool rod and steppers.  The relatively large distance from the pulleys to the spooling shaft results in a single layer of tightly wound cable.  This minimizes the error from the cable spooling up to less than 0.012mm allowing it to be ignored.

The outer two cables are wrapped in the same direction and serve to position the print head using tripod kinematics, while the center cable is wound in the opposite direction and is routed to apply tension to a central push-rod.  So as the outer cables wind up, the central cable unwinds to maintain tension.  The top of the push-rod is free to move, so as the end effector is moved right, the top of the push-rod will pivot and move left maintaining constant down-force throughout the build area.  The opposing forces on the spooling shaft also cancel each other out, resulting in the stepper motors only needing to support the weight of the end effector and not provide any actual tension on the lines.

The required cable length is not a constant however.  As the end effector is moved up, the required cable length of this system becomes shorter.  A compression spring mounted on the push-rod serves to make up this difference and maintain tension in all the lines.

Virtual pulleys

Tripod kinematics without any compensation assumes the end connections are points in space. They are not.  Pulleys can introduce significant error into the calculations: An 11mm diameter pulley can introduce up to 5mm of error into the resulting positioning.  This happens because as the angle to the pulley increases, the cable will wrap onto the pulley which will change the effective cable length and generate a horizontal and vertical offset. 


If you use two pulleys with the cables wrapping in the same direction, this error effectively cancels out.  As you wrap up onto one pulley, you unwrap from the other pulley.

Rather than adding the cost and complexity of adding actual pulleys to the end effector, I have instead modeled the curve required to duplicate the effect of having pulleys into the top surface of the end effector, aka virtual pulleys.

There was one more issue with the kinematics as designed in that the upper pulleys do not rotate to face the end effector.  This has the effect of foreshortening the cable length when the end effector moves off axis.  This can be also be compensated for physically by altering the shape of the virtual pulley.

As the cable moving off axis from the upper pulley is causing a shortening of the effective cable length, an equal and opposite effect can be modeled into the shape of the virtual pulleys.  Essentially this compensation will result in some variation on elongating or warping the virtual pulley parallel to the axis of the actual pulley.  

I lack the expertise to properly model this system to determine the ideal virtual pulley shape, so I guessed.  It's a good guess though and gets me started.

End effector with virtual pulleys

So that means the existing tripod kinematics math can now be used as is with no...

Read more »

  • 3 × 2 pack 4ft fiberglass driveway markers $9
  • 1 × 4ft steel garden stake $2.80
  • 2 × logic level power mosfets $2
  • 1 × perf board and various caps/resistors $2
  • 1 × 12inx12in granite floor tile $8

View all 13 components

  • The belly of the beast.

    Daren Schwenke2 days ago 0 comments

    Wiring is done as of last night, so here is what it looks like with my minimalist cape.  All the components are on the side you see, so nothing sticks out the back allowing it to fit in the 3/4in thickness of the MDF.

    It's simple enough it could probably be a single sided hand solderable board.

    Using the BBGW, it will have a wifi interface so it can be closed up.  It runs on the 5v VSB of the xbox 360 supply and is hooked up so it has software control over turning on the 12v portion of the supply.  

    So the majority of the printer is not under power at all until you start a print, but you can still upload your files, access the interface, etc.  By far the most energy efficient 3D printer I've ever built...

    Machinekoder is working on another Machinekit build/config to match my cape based on Debian Stretch.

    He provided a flash image, which I haven't been able to test yet.  

  • Trained beagle.

    Daren Schwenke3 days ago 0 comments

    Wiring is done and working.  Cape is done and working.  

    Well nothing caught on fire, it powers the machine up and shuts down, Machinekit starts and I can access the remote interface over wifi, but nothing will move.  I think I missed some estop logic as the normal pop of the steppers that accompanies starting up is missing.  I'm also pretty sure I didn't configure the tripod kinematics settings correctly as my starting Z position is 10,000 meters.  Now that is a big printer...

    I hollowed out the bottom of the MDF enough that the BBGW, the wiring, and my cape all fit within the 3/4in thickness of the MDF.   Invisible controller.  :)

    I could get away with totally enclosing the controller because my stepper drivers are out on my actual steppers, and the power mosfets I'm using are ridiculously over-rated.   I could run 10x as much power through them and they still wouldn't even get warm.  They are true logic level mosfets and are fully 'on' at 1.2v, so driving them to saturation at my PWM frequency directly from the 3.3v@4mA outputs of the Beaglebone easily works.

    I took the extruder back off the push-rod.  Well technically I dropped the machine on it's side and it took itself off.  I think that was a bad idea (putting it there to begin with, dropping it worked out well).

    It is super light without it, which should translate to fast/more accurate.  The end effector assembly without the hot-end was like 6 grams.  Adding the stepper just felt wrong.  It was kinda like buying a new Italian sports car with a carbon fibre composite body, and driving it around with the trunk full of lead.  

    If I allow it to pivot hanging from a rail I can get virtually the same travel with a slightly longer tube and no added end effector mass.  

  • Walking the dog.

    Daren Schwenke3 days ago 0 comments

    I'm a fan of the Beaglebone.  

    You can get down and dirty with hard-realtime assembly level control of pins if I you want, or watch from 10k feet and twiddle a pin in web browser with just Javascript.

    I sum up the Beaglebone Black to people who have never heard of them with the following blurb.

    Take a normal Linux computer running on a cell phone processor, and tie it in memory to two Arduino's running at 200Mhz with 60ish IO pins and single clock cycle operations for most of them.  There is also hardware PWM, SPI, I2C, Ethernet, etc you can enable, but the former lets you mock up pretty much any of those devices *from scratch* if you care to get your hands dirty.

    It was a beast when it came out, but it was more expensive than the Raspberries and harder to work with.  It's aging now and the fact to access the raw power of the PRU's, you needed to program them in assembly has kinda limited the adoption.

    I'm still a fan.

    The BBGW is perfect for this printer.  It has mimo (multiple in, multiple out) wifi built in so you can connect it to your normal wifi, or even connect to your normal wifi through it by using it as a gateway.

    I'll be doing that running a remote interface for Machinekit which gives me a true trajectory planner, and it also has the assembly bits needed to use the PRU to twiddle the pins.  I'll get hard-realtime control of my steppers.

    But the cape I need for this doesn't exist.

    All the later capes tended to avoid demanding the HDMI pins on the Beagles as that meant you would have to disable HDMI to use them.

    All except for one of the earliest ones, the BeBoPr cape.

    The BBGW doesn't have an HDMI chip, but it does have that neato wifi chip.  Problem there is it consumes many of the same pins which the rest of the capes used for motor control and such.

    But not the BeBoPr as it stepped on HDMI mainly, except for one pin.  

    So I'm starting with the pinout for the BeBoPr and moving that one pin. 

    Should be pretty simple.  Soldering iron in hand...

  • High precision optical alignment apparatus.

    Daren Schwenke3 days ago 0 comments

    Reassembled and ready for some fine tuning.

    Realized it was going to be difficult to properly level the end effector with the hot-end already installed so I improvised.

  • Nylon is awesome.

    Daren Schwenke4 days ago 0 comments

    Finished the extruder assembly.

    I really like printing in nylon.  It's just gorgeous.   I might try dying it later.

    So that puts the mass of the extruder stepper on the centerline of the push-rod, about 1/3 of the way up it now.

    Not being 1/2 way up means it will move some when the print head moves, but this position keeps the majority of the mass in the center of the upper rails most of the time too (when the print head moves up).

    The completed push rod assembly.

    The bowden tube is a virtually straight shot and my U joint still bends perfectly.

    My source code is getting a bit messy.  I started putting numbers directly in the code instead of using variables as I'm out of time.  I'll have to go back and clean it up later.

    New source is up on Github.

  • Paint.

    Daren Schwenke4 days ago 0 comments

    Finished all the cuts I needed to make in the MDF base.

    Instead of trying to cut the granite tile, I've recessed it into the back of the MDF.  This reduced my build area a little, but it's still 300mm so I'm happy enough with that.

    Gave it a couple coats of primer and then some hammered paint.  MDF really soaks up paint.

    Assembled the end effector.

    I didn't use the groove mount.  I just threaded the push fitting through the inside of the end effector and screwed it on.

    And I installed and wired up the homing switches.

    Once the extruder mount is done printing, I'll finally be ready to assemble this thing.

  • Thank you Machine Koder. Caution, links ahead.

    Daren Schwenke5 days ago 0 comments

    Given I have really run myself out of time here, I have enlisted the help of one of my cohorts Machine Koder from the Machinekit world to help get the tripod kinematics configuration files sorted.  

    Sorting a brand new config out in two days, while I'm still working on the hardware, probably wouldn't have happened otherwise...

    He has put to code what I have used on many an occasion as it makes my part so much easier.

    He is also a regular contributor to the Machinekit github project and I thank him for his support.

    Machinekit configuration files for this here soon.  It's like 3am in Austria right now and even machine coders need downtime.

  • A little goes a long way.

    Daren Schwenke5 days ago 0 comments

    My prints for the new upper corners are done.

    When I said the top corners were securely glued on, I wasn't joking.  Two drops of super glue per joint, and spin the rod before it sets.  I know this stuff works great on ABS, but the whatever the fiberglass rods are made of must react similarly cause this stuff is permanent.

    Tried to remove them by hand.  That was a kinda funny and made me feel bad.

    (miss) Used an angle grinder to try to weaken them.

    More demoralizing dancing with a seemingly indestructible triangle ensued. 

    Finally a channel locks and a meat cleaver were enlisted.

    Well at least I don't need to worry about them coming apart.

  • Push rod joint mods.

    Daren Schwenke5 days ago 0 comments

    I've decided to not run the bowden tube down the middle of the push-rod now.

    With moving the extruder mount so it puts it's mass on the center-line of the pushrod, I would now have to cut a slot in the pushrod to get the bowden tube back out of it.  This would weaken it excessively.

    So I redesigned the push rod joint to allow the bowden tube to track along the outside and still have a relatively straight path.  Also added some integrated wire guides so the bowden tube will be retained near the rod, but is still allowed to move.

    In case you are wondering why I'm putting the extruder on the push rod tube at all, it is so I can have a much shorter bowden tube.  

    This way I get the best of both worlds:

    • A low mass end effector for faster acceleration/printing.
    • A bowden tube short enough to still be able to print flexible filaments.

    EDIT: I decided to offset the joint towards the fitting a little to give the bowden tube a straighter path.  

    The push rod won't mind.


    In case you are about to comment about my obvious stringy issue, I disable retraction for nylon (and most structural parts actually)

    My recipe for the strongest structural parts:

    • Disable retraction and increase non-printing movement speed to maximum.  A linear delta printer helps here as my maximum is 500mm/sec.
    • Over-extrude until you have obvious surface artifacts or your extruder skips. Somewhere between 5% to up to 20% is right.  All your dimensions may need adjusting...
    • Print as hot as your material/hot end allows.
    • Disable cooling, if you can.  If your parts actually start to sag due to excessive heat, slow down instead of using a fan.  Cura does this for you.

  • Center-line extruder mount.

    Daren Schwenke6 days ago 0 comments

    I think I may move the extruder to half way up on the center-line of the push-rod.

    If I position it right, it won't move much and it's mass will actually help to stabilize the end effector.

    Mocked up the basic idea in OpenSCAD while my top corners are still busy printing.

View all 27 project logs

Enjoy this project?



Steven wrote 2 days ago point

Keep up the great work! I'm checking back daily to see how its going and I cannot wait to see it move and then print!

  Are you sure? yes | no

Daren Schwenke wrote 2 days ago point

Me too!  It's so close..

However, I'm out of time for Teen Groot so I have to switch gears for a day or two until I can wrap that up.

  Are you sure? yes | no

Idris wrote 3 days ago point

Great project.
I'm looking at your pulleys and virtual inverted pulleys and thinking about wear on the thread how smoothly they run over the surface of the plastic.

I came across ceramic thread guides for sewing machines on aliexpress, I wondered whether they might make for a smoother surface for the thread to run over?

  Are you sure? yes | no

Daren Schwenke wrote 3 days ago point

That's pretty neat.  I'd have to think about how that would affect the math due to the increased hole size unless you used a pair and put a set them after the top pulleys.  With the forces involved I imagined printing them out of nylon would have helped greatly too. Problem was when I did the entire end effector out of nylon, it wasn't stiff enough so they would have to be 'drop in' like your ceramic guides anyway.  Alternately the M2 ( could have actually printed them as a single part in a gradient blend, but I wanted to keep this project accessible. 

The existing lower virtual pulleys don't get any translation movement so I'm hoping the lubricity of the line is enough to prevent significant wear for a while.  

I'll run it until it fails and we'll see what happens.  :)

The line itself is cheap to replace and 110 yards was enough to replace them all 7x for the original $9 spent, but I imagine the top of the virtual pulleys themselves will wear as well and need replacing along with the lines.

It's gotta move on its own first.  :)

  Are you sure? yes | no

Idris wrote 2 days ago point

I was thinking you could remove the pulleys entirely and have the same geometry both at the top and bottom of the thread, I think that would eliminate the wrapping/unwrapping length changes but also remove any issues with the thread leaving the pulley at an angle when the effector isn't centred.

  Are you sure? yes | no

Walter Schreppers wrote 10/13/2017 at 15:50 point

How does moving up in z-layers work on this one? Move the entire printer up?

  Are you sure? yes | no

Florian Festi wrote 10/13/2017 at 18:57 point

It works similar to a delta printer. Pulling in string on all three winches moves the end effector up.

  Are you sure? yes | no

Hacker404 wrote 10/12/2017 at 20:33 point

Love it!

You should be able to make the effector end of the cable connection wrap around a pulley shaped contour to get a mathematical fixed point equivalent by the effects of the contour canceling out the effects of the pulley.

Also there was a very old product that is still available called "Dial cord" that would be a good replacement for the fishing line.

+10, I would like to see the code for the kinematics when it's done, if you are going to release it.

  Are you sure? yes | no

Daren Schwenke wrote 10/12/2017 at 20:51 point

Great minds.. Just did that like 2 days ago:

Tripod kinematics without pulley compensation (which I don't need anymore) is already part of Machinekit and open source:

  Are you sure? yes | no

Sancho_sk wrote 10/12/2017 at 19:03 point

This is amazing. Thanks to the construction, this might be scaled up to real-life building printer. With the "flat pack" ability it can be transported by a regular truck. WOW!

  Are you sure? yes | no

Daren Schwenke wrote 10/12/2017 at 19:49 point

With an end effector of sufficient weight, just the six cables will do and you don't need the push-rod.  That is another one of my work in progress printers already.  :)  Yes, building printing.  Plan is once the ABS part of that one is working, modify it to do super-critical CO2 foam extrusion.  Spray/fill that with concrete, and you have a building.

All the hardware is on the print head for that one.  All the parts for that one including the controller are designed, fitted, printed and done, but I haven't had the time to post anything about it or do final assembly and testing yet:

  Are you sure? yes | no

Florian Festi wrote 10/11/2017 at 19:25 point

I wonder if disassembly and assembly would be easier if you made hinges (or ball joints) at the end of every second of the vertical beams. You could then remove the other three and then just fold down to top triangle onto the bottom one without disconnecting them.

If you manage to have the other ones also with hinges at the ends but also one in the middle you could fold and unfold the printer in seconds.

Not sure if this compromises stiffness (and ease of construction) too much. But as stiffness is created by the geometrical form and not the stiffness of the corner pieces that might just work.

  Are you sure? yes | no

Daren Schwenke wrote 10/11/2017 at 19:49 point

Every other joint pivoting down may work, and you could put a pin on the other joints to fold that one down too.  I imagine it would sacrifice a lot of rigidity to do it, but it is way more rigid than it needs to be right now.  Pivoting/twisting down would line up the rails nicely.  Those joints would be under a lot of stress though if you didn't keep the top parallel to the base while doing it.

I thought about folding before, but I was removing the top rails for it. This was of course incompatible with the later requirement of screwing down the steppers.

  Are you sure? yes | no

Florian Festi wrote 10/11/2017 at 09:08 point

To avoid creating a mess when disassembling the printer you could add small sponges or silicone lips to press on the curled up string. That way it does not unwind or go on top of itself when you remove the string tension.

You could even have them snap on the winch for disassembly only.

  Are you sure? yes | no

Daren Schwenke wrote 10/11/2017 at 13:18 point

That's a good idea too.  Running them up and down tends to realign the wraps if you are careful about limits, but not having to do that at all would certainly be better.  Sounds like a project for my spool of TPU.  I was happy I got to use it for the vibration isolators in this project already.

If I had software based current control on my steppers, I could lower the current to barely moving and just run them to retract the lines fully.  The upper line would also extend all the way, and then start wrapping in the same direction as the lower lines retracting it as well, mostly.  But that would mean using AMIS-30543 or other software controllable chips at $20 each.  Probably not the target market for this level of printer.

  Are you sure? yes | no

brz.tomek wrote 10/11/2017 at 20:50 point

I am not sure I agree- it is not hard to get software controllable chips at $10/ea. The TMC2100 to start, but also just the fact you can run a filtered signal to the Vref of a SD5984 or DRV8825 also gets you software controllable current. The way many repraps do it is to use an SPI configurable digital potentiometer to set the Vref.  Is this helpful or did I misunderstand the situation?

  Are you sure? yes | no

Daren Schwenke wrote 10/11/2017 at 21:01 point

I probably just didn't look hard enough.  I'm looking for the 2 amp range of output.  I never tried feeding vref into chips.  If you can gang them, then it just adds a cap and two resistors to get a nice stable output for all.  Something to think about.

  Are you sure? yes | no

Florian Festi wrote 10/09/2017 at 09:55 point

Wrt homing:

You can press a bead on one of the strings at each winch e.g. a fishing weight. Then have a micro switch near the top idler with a hole in a lever the string runs through. The bead needs to be positioned that the switch is triggered as the very end of the movement. The distance between the idlers on top and the winch should be less than the maximum travel distance of the machine axis.

To do the actual homing I fear there is not way around jogging the machine axis manually to some extend. What ever you do automatically might move you out of the working volume if the machine starts at the wrong place. With the end stops you at least do not need to drive to a precise location to do the homing fully manually. You could have a parking position e.g. in the middle of the bed that you have to drive to and then run the homing program automatically from there. Being off at the parking position by a few milimeters is probably not problem.

  Are you sure? yes | no

Daren Schwenke wrote 10/09/2017 at 14:09 point

I like that idea.  

Homing will still have to start with the effector an approximately set distance above the bed in the center to avoid bottoming out during homing.

Then for each axis home to the opposite bottom corner, which will pull the push-rod line in to it's lower limit, and then return it to the central raised start position. 

Machinekit should do this out of the box by setting HOME_OFFSET to the homed to line position, HOME to the center raised position, and HOME_SEQUENCE to an incrementing number. That will work.

  Are you sure? yes | no

Florian Festi wrote 10/09/2017 at 14:28 point

Well it depends on whether you have the end stop at maximum or minimum length of the cable. But you can still start at the bottom as the parking position if you want to give out cable. Just move up a bit from there as part of your homing sequence. We are going to need a custom homing code anyway as you need to change the length of the other two cable pairs. Otherwise you can't reach the outer boundaries of the build volume.

  Are you sure? yes | no

Florian Festi wrote 10/09/2017 at 09:42 point

One way around the maths problem would be to just make sure the string always leaves at the same point by funnelling it through a hole only slightly bigger than the string diameter.

I built a styro foam cutter a while ago also using fishing lines. There we routed the string just through eye hooks without any problems. So there is no reason to be afraid of the friction. Especially if the bulk of the change of direction is still handled by the ball bearings.

This is not a beautiful solutions but might just work.

  Are you sure? yes | no

RigTig wrote 10/09/2017 at 11:30 point

Nice idea, Florian. Certainly been used on some 2D printers (drawing machines on strings), where motors are at the bottom of the (nearly) vertical board and run up to the top before going to the gondolier.

One question to think about is whether the error caused by the offset around a winding core is significant enough to warrant a patch. I suspect that the difference between the 'perfect' calculation and the approximate one might be less than the extruder nozzle diameter for all locations but a few extremes.

  Are you sure? yes | no

Daren Schwenke wrote 10/09/2017 at 13:53 point

Some quick math says the winding core will only introduce an error of up to 0.012mm at the extremes as designed.  However, the pulleys at the top can introduce an error of up to 6mm.  I'm ignoring the core, correcting for the pulleys.

  Are you sure? yes | no

Daren Schwenke wrote 10/09/2017 at 14:07 point

I built a prototype using zip ties, eyelets, and wooden dowels to try to find an alternate cable routing which would minimize the difference in line length between the extension of the pushrod lines and the retraction of the lower lines.  The best solution I came up with was also the simplest with just extending the pushrod a little.  It also taught me that the eyelets tended to stutter and grab when I increased the tension in the lines.  

Granted I didn't have pulleys at all for my 'prototype', which would probably reduce this tendency a lot.

Higher tension becomes more important at the extremes as the angle of influence of an axis will be reduced.  So I'm looking for the mathematical solution first.

  Are you sure? yes | no

RigTig wrote 10/05/2017 at 06:56 point

Definitely looking forward to see this design come to fruition. My own efforts have been very slow, having started several years ago (see Rigtig's Big 3D Printer here on HaD-

Another design, called HangPrinter, has the string motors on the effector: there's a link to it in comments of my HaD stuff. I found the source at I remember tobbelobb describing adjustments to calculations for string lengths depending on how full the reels are, so there might be a clue or two in there.

I haven't seen any broad-based driver for triangular printers (Cura, Repetier, etc) but as long as the GCODE interpreter handles the basics, any driver can be used. Just make sure that you are inside the triangle. 

If you'd like any hints from me, either PM or just comment here. 

  Are you sure? yes | no

Daren Schwenke wrote 10/05/2017 at 07:18 point

Using Machinekit, tripod kinematics is part of the standard stuff. Have not built that part of the config yet, but it should work fine when I do.  Homing will be interesting and I have no idea there yet.

The first battle was getting Machinekit working at all on the BBGW (for my other WIP 3D printer, the E1).  It also has everything on the print head, but is pellet fed like a Lyman extruder turned on end.  I haven't really documented it here yet, and it's mostly done, but completely untested and may very well meltdown on first power up.  3D printing a Lyman comes with issues.

Problem was only the newer kernel supported the wifi chip and the flavor of Xenomai Machinekit used would not work there.  Finally got an rt-preempt build running on the newer kernel a few weeks back and Machinekit works now..  Virtually the same config will run this, and this is more likely to work the first time, so starting here.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates