Sunday, February 22, 2009


Pull Yourself Together, Bot!

Warning: this is gonna be a long post. Grab a hot cocoa and settle into a comfy chair.

Fresh off a month long RepRap-building workshop binge, I have many ideas to try out and many places to apply polish on the RepRap project. Doing nothing but assembling RepRap designs for the past month has taught me quite a few things, both good and bad. There are many things that we're doing really well on, and a few areas where we can improve on. In particular, the XY assembly is really nice. Skeinforge and the RepRap host software rock, as well as some of the next generation stuff (pinch wheel extruder, gen 3 electronics, etc.) The stuff that isn't quite as easy is the frame assembly, the Z axis, and the bearings (or lack thereof) on the Y axis (on the darwin design).

Anyway, this post is about some experimental work I did this past week that was inspired by those experiences. In particular, it focuses in on two questions that are very closely related:

1. How can we simplify the corner brackets to be easier to assemble as well as easier to print.
2. Is is possible for the machine to be partially self-assembling?

Question #1 was inspired because I've been having a hell of a time trying to print the corner brackets, as well as assembly troubles. Aside from warping issues, the design itself calls for lots and lots of trapped nuts to be placed inside the part. This in turn requires that you have a finely tuned machine that works exactly how it should to produce them... which is not something most people have. If you're like me, your RepRap machine is sort of hacked together and must be lovingly coaxed into printing what you want. Not only that, but even with commercially produced 3D parts, getting the nuts into the holes can best be described as a dark art.

So, follow me along my train of thought as I present a way of making this part simpler. The corner bracket has 2 main jobs: create the basic structure for a cubic frame, and to be the place for various 'accessories' to mount on, such as the XY axis assembly, z motor, etc. In doing so, the corner block has routing holes for rods going in the X, Y, and Z direction. Basically, its just a part thats full of right-angles. Looking over the rest of the RepRap design, theres a part that I really like: the diagonal tie bracket. It's simple, no-fuss, and easy to print. Not only that, but this guy is basically just a printable right-angle!

I did a bit of napkin designing on the flight over to Madrid and realized that if you took two of these things, they could substitute for a single corner block by taking two and rotating one 90 degrees. If you had 8 of these parts, then you could make an XY frame. If you had two of those, you'd have the top and bottom XY frame. Of course they will also easily work as the diagonal ties they were designed to be. The only modification you'd need to make is to add an extra hole on the end. Then when they form an x, you'd have three of the four holes you'd get with a single block. This part is pictured on the right.

Anyway, so say you get 16 of these parts: how do you turn them into the top and bottom XY frames? Good question. The XY frame is interesting because its basically just rods with corner blocks a certain distance apart. All we need to do is take our corner ties, space them a certain distance apart, and then bingo... we'll have an XY frame. The required parts to form an XY frame is pictured to the right. Astute readers will notice a flaw in this plan though: since the two ties for each corner pivot around the Z-axis it means that the whole assembly is a bit wishy-washy. Even with every single corner tie spaced exactly perfectly, you could easily get a parallelogram instead of a square. How do we make the frame square? Simple! Make a diagonal rod with two ties spaced exactly the right distance apart and attach it to the Z rods so that they form a perfect, right-angle triangle!

Now, I know what you're thinking.... holy crap that sounds awful. I'll have to measure each of these things very precisely and make sure they're exactly correct otherwise my machine will be slightly off and my children will hate me, drop out of school, and then the economy will tank. Well don't worry my friend, because I've managed to stumble onto the answer, and it involves question #2: Is is possible for the machine to be partially self-assembling?

So, is it possible? I say yes! Yes, it is! The answer is that we make the machine do the measuring and we coax it and guide it along. If you have a sharp eye, you'll notice that the XY frame parts above are constructed from THREADED rod instead of SMOOTH rod. The rod used is the same rod that we use for our Z axis, and I specifically got the crappiest rod I could find in order to really test to see if this is viable.

Okay, so how exactly do I propose we have the machine self-assemble? Easy! We use a stepper motor, some threaded rod, a python script, and a few other parts to turn the RepRap technology into a precision kebab-building machine! Here's how it works: I created a reference design in QCad. (which I totally forgot to check into subversion, sorry!) From this design, I created a python script that creates GCode instructions for building the various kebabs. The GCode consists mainly of two parts: instructions that prompt the user to do things: thread a nut on the rod, slide on kebab parts (diagonal ties, washers, etc) and actual instructions that cause the rod to rotate a nut to exactly the right position. The end result is pretty slick: it generates a wizard that serves as both a guide and a self assembly program. You the user just sit back and do what your robot overlord prompts you to do. A screenshot is shown on the right here.

Of course, all this was just a random idea in my head until a couple days ago when I sat down and actually tried to do it. Let me just say this: it works way better than I thought it would! Even with the various inaccuracies I introduced by making my own parts by hand, all the parts still managed to fit together without any jamming, bending, or forcing of parts. my reprap machine is down due to cannibalism for the workshops)

It was really cool to sit down and have a conversation with someone while occasionally following the prompts from the laptop, and ending up with 4 kebabs that were all perfectly spaced and ready for use. It was even cooler to put the diagonal ties created by the same method onto the frame and watch it be pushed into a perfect square. It was even cooler to install the Z kebabs, the second XY frame, and finally the vertical diagonals and have them all settle nicely into place without fuss. The only measuring I did was in cutting the rods and accuracy wasn't all that important there.

A picture of the rig I used to build the kebabs is on the right. Its just a stepper motor, a motor coupling for the rod, an M8 rod, and an idler to make the process easier. The stepper is hooked up to a standard driver which is hooked up to a RepRap Motherboard which is hooked up to my computer which is running the GCode on ReplicatorG. The only custom part here is the idler to make the threading process easier. Everything else is stuff you'll need to build the machine anyway!!!! I had to hack my own coupling together, but the standard RepRap Z motor coupling would work without any sort of modification. With a bit of clever coding and a re-application of the tools that we already have, it becomes simple to do this.

Now, what are the implications of this? Obviously its a very simple technique that you the builder needs to take part in, so we won't have self-copying robots that self-assemble running amok. However, there are some really cool things that are going on here:

1. the design is parameterized! the python script takes all sorts of parameters that control the gcode that is output. things like X, Y, and Z dimensions so you could build a big RepRap machine, or a small reprap machine! it also takes things like rod size, washer size, and nut size so you can easily convert the script to imperial, or use M5 hardware. it also has some cool options for the build such as leaving out washers, or using thread locking compound for those adventurous souls who never wish to take their machine apart.

2. the instructions are the design! the first 20 lines of the gcode are instructions such as the number of nuts you'll need, the number and lengths of the various rods you'll need, as well as various bits of information such as volume diagonal lengths, etc. not only that, but as its an interactive process, it makes assembly a snap: you simply follow the step-by-step instructions and the various parts go together in front of your eyes. no more digging through complicated build instructions. just connect the dots!

3. we can do lots of other cool things: dynamically generate a DXF template for the bed? sure! dynamically generate STL files for the diagonal ties? sounds awesome! one day you may be able to use the same script to generate a miniature reprap for building ant-sized things or to generate a reprap for building buildings! these things still need to be implemented, but the framework is there.

Now, what about the drawbacks? There are definitely a few issues, and it certainly isn't the technique to end all techniques. Here are a few off the top of my head.

Problem: The starting position of the nut is crucial. I eyeballed it and got good results, but it certainly is a source of error. It should be at the exact same position at the beginning of every move. My solution: create a 'nut starter' device that acts like an endstop, and then have the stepper 'home' until it hits it thus ensuring every nut starts at exactly the right place.

Problem: Once a nut is positioned, minor rotations can move it out of position. (ie: 1/2 turn on M8 rod is 0.625mm) This can happen accidentally, or to the previous nuts when you rotate the next ones on. My solution: use a bit of modeling clay (or blue-tack) to hold the nut into place until you can tighten it down. It seems to work pretty well.

Problem: If your rod is dirty, or the thread damaged then the nut can slip from your fingers as the rod is rotating, causing you to lose your position. This really sucks, because GCode doesn't have any real support for moving back or re-executing a command. It's not totally fatal however, because most assemblies have two nuts: a front one and a back one. If one of them slips, you can use the other as a datum. Its best if you don't let the nut slip. My solution: put a bit of oil on the rod before threading nuts, as well as running a wire brush just ahead of the nut on the first pass for a rod. Long-term, it would be nice to make a little carriage that holds the nut in place and allows you to do other things while its automatically placing it.

Anyway, it's probably about time to wrap this post up. This was a fun experiment and I'm very happy with how it turned out. It's still very much under development, and I'll be hacking on this quite a bit in the coming weeks. I think its a very promising path for development of the reprap project. If you'd like to play along, or just check out the work that I'm doing, I store everything in my reprap subversion folder. This particular project is codenamed 'Pythagoras' because its based on triangles and also because its generated using a Python script. The project specific scripts and drawings are located in hoeken/pythagoras. You can also check out my flickr set with a few photos. I was too excited to take more, but if this turns out to be a really good path, you can be sure I'll fully document the process.

Thanks for reading, and I look forward to your comments.

PS. the very first picture is the prototype frame i assembled. its exactly 330mm x 330mm x 330mm outside dimensions. i plan on building a much bigger one in the future as well.

This is a very long post, indeed, and there's a lot to digest, for the project and for me personally, but first, a quick reaction: I love you, and I want to have your children.

(No, not really. I'm a straight man -- not only am I incapable of bearing your children, I have no real interest in it. It's just an expression. You can stop filling out the paperwork for a restraining order now.)

The idea of building a darwin design with only parts producable by another reprap or commonly purchasable in a reasonably well-stocked hardware store *requires* parameterization. The idea of being able to use parts a reasonably well-stocked garage shop can make instead of rp parts is a very good bonus, and this design brings us a *lot* closer -- in essence, you'd probably want to buy an idler from the rrrf, but you just need the one, and it's a nice thing to have afterwards anyway (but not something big chain DIYs carry). Everything else, I can make buy from the corporate soul-sucking place, or I can make half-assed myself, and replace it with better reprapped parts when the reprap is working with the half-assed parts.

This puts the darwin design in the relm of buildable my mear mortals, without having to go buy specialized hardware from order places that require big bulk and expensive shipping.

Please, please, please release quickly!

Genius could be described by the simplicity of the best ideas are the ideas that make everyone think why didn't I think of that.

Not much else I can say Zack.
Maybe using 10mm or 12mm threaded bar to construct the main frame would provide the stiffness required for subratctive tool operations as well.
When looking at the threaded bar in the UK chains the 10mm & 12mm threaded bar was dead straight unlike some of the 8mm threaded bar.
Good work Zach, If I'm reading your post right, this should mean that the actual number of different parts the reprap needs should be reduced considerably. Something that I think will become more important in future given the new extruder design can run in parallel.

Plus this will make construction from the local hardware store much easier, something that is a big issue. We just had the first meeting of my Cities Reprap group(There will be a builders blog photo soon) and this looks like it will be perfect for people who are trying to build but don't have access to plastic parts.
I am not sure if anyone realizes this, but what Zack Smith has hit upon is one of the more interesting concepts in _post_ cutting-edge design. If I can direct your attention to the "Talking Tape" proposed by Bruce Sterling ( and "Proactive Instructions for Furniture Assembly" by Messers Antifakos, Michahelles, and Schiele (, you'll see that the concept of devices that embed their own construction details into computationally active elements isn't exactly a new idea - but it is one that is generally considered to be beyond the current reach of technology. Mr. Smith has just proven this common knowledge is wrong.

This is news. You have not only simplified the design of future RepRap machines, you have pointed the way towards making the RR unit accessable to anyone. My hat is off to you.

If you could get hold of grid beam for your repstrap (like in Timothy's experiment) then perhaps you don't even need a drill.
Fascinating! A really mind-boggling concept, and still actually do-able. That's what I liked about the RepRap anyway, and this is taking it a step further indeed.

If you bootstrap an open source machine, why not have it customized to your specific scale/needs! Or tailor it to what you have on hand or what can be sourced from a hardware store. It also merges the RepStrap with a Darwin-like design.

I was picturing a RepRap machine and its software as something that would eventually instruct the user how to use and maintain it. How to build it (or a copy) is another important part of a replicating machine's life cycle.
Great idea Zach,
Nyloc nuts might help to keep the position accurately. They would need something to hold them as they are too stiff to hold by hand, but once set on place by the stepper they would stay there.
Fascinating. I think the idler should be constructable from a couple of the bearings you will use later on in construction plus some bits of steel -- either a couple of extra corner/diagonal brackets (to minimise the number of *different* parts, if not the number of parts) and/or some spare bits of allthread & nuts.
Wow you just removed the one objection that I had to Darwin. In that the whole thing looked awful finicky to put together and get accurate.

I'd also binned the concept of internal nuts and gone kebaby for all structurals on 'the wedge' development (to be released soon). Way faster, stronger and uses widely available studding. Tick.

It's worth mentioning jigs though (the alternative) for completeness. I first saw Ian using a simple length of reference bar to match the equivelent of the kebabs. Using jigs can be quicker and just as accurate.

However, the benefits of your assisted self assembly are damn sexy, particularly the parametrics and the walk through - that makes it SERIOUSLY friendly. And damn cool. Nice idea fella.
Great idea. Love it!
OFF TOPIC, but... I saw this free software I had never heard of before that uses a relatively cheap laser ~ $19 American to scan objects in 3D. here's the URL
I don't know if it outputs to AOI or not, but it seems pretty cheap and cool. Sorry about off topic.

Using grid beam has the additional advantage that you don't need to to drill your holes exactly straight, at right angles, and exactly in the middle of the beam (which are the assumptions you have to make to get this accurate) to get this working properly, in that it should already be done for you.

I've emailed a couple of local metal companies (local being in the Netherlands) if they've got the stuff. Will report back.

For a corner, with (in general terms) one corner bracket plus 3 diagonal brackets, I think you should be able to substitute 3 2-hole sections (for diagonal brackets) and 2 3-hole sections as corner brackets, which makes a neat 12 holes per corner. At 1 inch (or so) spacing that means 8 feet worth of perforated tubing, cut up into little sections. Even at today's metal prices, that should be affordable for most people. In developed nations, the labour for the cutting will add significantly, but this is less the case where the cost matters most, ie in what we used to know as the third world.

And of course, if you're less lazy than me you could just cut it yourself. The accuracy of those cuts is irrelevant, unlike the accuracy of the holes.
thanks for the kind words, i really appreciate it!

a lot has already been said, so i'll make it short:

gridbeams is definitely a solid way of doing this as well as an inspiration. the python assumes that you are using corner ties with holes spaced on an even grid, and that the tie itself is square.

i'll be hacking on this script much more in the coming weeks. i'll try to post blog entries when i hit any sort of major milestone.

up next: printing the corner ties instead, so they're compatible with the Darwin corner bracket spacings =)
I'm going to take this and run with it. I'm working on a threaded rod drive with a gearbox, so I figure why not make the basic machine work using threaded rod drive, then print a gearbox to speed it up?

That lowers the initial build cost a treat and I can use cheap steppers for it.

Vik :v)
Wow. Simply amazing- think where we would have been at the HacDC build if we had done it this way! Thanks, Zach!
This is awesome! I really need to get my repstrap together, I've just been so busy lately. It's incredible to see what can happen when people are motivated by something other than money :-).
Gives a whole new meaning to:
$ sudo make install
re: $ sudo make install

# fablab shelltrance 2009
# startproject washingmachine
python listbom >
#brlcad/heekscad voodoo magic here
python add-dependency "metal-bending"
agx-package new -o washingmachine.skdb washingmachine

agx-get washingmachine.skdb
cd /hardware/washingmachine/
make instructable
make install
reqtools washingmachine.skdb > TOOLS
if [test -n `difftool --base=/etc/fablab/inventory TOOLS`] then
cat > /dev/checkout

mkbin toys

## diybio protocols
mkdir ~/diybio/projects/
cd ~/diybio/projects/
consumables pcr.xml > CONSUMABLES
reqtools pcr.xml > TOOLS
if [test -n `difftool --base=/etc/fablab/inventory TOOLS`] then
cat CONSUMABLES > /dev/checkout ;
difftool --base=/etc/fablab/inventory TOOLS > ORDER-REQUEST
cat ORDER-REQUEST | mail -s "Tool discrepancy alert" root@fablab
echo "Your tools will arrive shortly. Perhaps you would like to build them yourself?"

# estimated 100,000 packages by 2006
zach, where is the python script?
Post a Comment

<< Home

This page is powered by Blogger. Isn't yours?

Subscribe to
Posts [Atom]