My adventures in CNC robotics
Copyright (C) 2013 by Michal Zalewski (lcamtuf@coredump.cx)

Introduction

I'm a computer geek by day, but I have always dreamt of something more than just writing code: I hoped to make things that interact with the physical world. To make it worse, I couldn't convince myself to take the now-popular route of buying the prefabricated robotics kits and putting them together in one of several predetermined ways. Ultimately, I just wanted to learn how to make stuff.

Of course, that pipe dream soon collided with reality: I lived in Poland at that time - a country not known for its vibrant maker community - and did not even have access to a machine shop. On top of that, I had virtually no idea about the processes involved in manufacturing everyday objects and possessed no particular manual skills. But then, few years ago, I randomly stumbled upon a simple yet fairly obscure manufacturing process - and going through heaps of trial and error, I managed to progress from the project on the left... to those on the right:

I have a fairly neat daytime job and two kids, so I can dedicate just several hours every month to this hobby; with barely ~300 hours total, I still feel very much like a novice. But there is so little little information about desktop CNC prototyping (or, really, any form of computer-aided design) available on the Internet that I suspect my adventures are worth sharing - even if just to encourage others to give it a try.

Note: if you're more interested in the practical aspects of CNC manufacturing than in a personal story, check out my guerrilla guide to CNC machining instead. I also have a photo blog showcasing the manufacturing process for one of my recent projects (dubbed Omnibot mkII).

2006: Baby steps

I'm guilty of several forays into the world of robot building, but my early projects inevitably involved cardboard, recycled milk bottles, and tons of hot-melt glue - and so even if the end result sort of worked, I still ended up throwing it away in shame. I kept hearing about the upcoming revolution in home manufacturing, and clinged to that hope - but year after year, all the promised low-cost, high-accuracy 3D printers have stubbornly failed to materialize.

Somewhere mid-2006, I ended up with some disposable income and far too much time to browse the Internet. Almost by accident, I discovered Roland MDX-15 - a small, desktop CNC mill commonly used by jewelers. The sight of a desktop-sized 3D prototyping tool planted a vague idea in my mind that I just couldn't quite get rid of: what if this little device is precisely what I need?

And so I bought it. I had absolutely no idea what I was doing: the tutorials I could find on the web usually talked about maching steels and aluminum on the factory floor, using mills that weighed several tons and packed the power of a small car. Nothing of this even made sense for the unit I ordered, or the parts I wanted to make. It was a huge leap of faith, and I fully expected that I might have just thrown away $2,700.

After unpacking the mill and playing with it for an hour, I was positively surprised: while the included software wasn't exactly intuitive, it turned out to be a lot less confusing than I thought it'd be. In the end, I could sketch things in Blender and send them to the machine in a matter of minutes - just like that.

At that point, I was cautiously optimistic, but still had no idea what to do next. Luckily, I had a very practical itch to scratch: in places such as Poland, it's extremely difficult to source useful servos or geared motors - and when you finally find them, they tend to cost arm and leg. Such devices are the lifeblood of any robot, so that's where I set my sights. In fact, this is probably the first part that I made (yes, it's pine):

Of course, pine is a pretty flimsy material for small parts; I just happened to have some. I started looking for better alternatives: I tried other woods, PVC, PETG, polycarbonate, extruded polystyrene, and several random things I could find in a hardware store or order online - but all of them machined poorly or produced low-strength parts. I had better outcomes with a blob of cured epoxy, a chunk of dental plaster, or a block of aluminum - but such materials had to be processed very slowly, and I wasn't quite sure how to turn them into arbitrary 3D shapes in an efficient way.

Increasingly desperate, I finally tried out acrylic glass. I found the material available as cut-to-size sheets at a place that sold advertising supplies. The plastic proved to be very inexpensive and machined pretty well. I bought a fancy 0.4 mm end mill for $20 or so, and quickly put it to use:

I ordered a couple of ridiculously cheap pager motors, used regular pins as axles, and quickly put together several rather sketchy acrylic gearboxes. The gearboxes were unreasonably big in proportion to the motors, but at that stage in my life, it all looked pretty rad:

The gearbox worked. Excited, I wanted to start doing things on a larger scale, right away. I spent several more hours in Blender to come up with this design - a pile of sheet plastic parts held together with glue and pins:

That's where I bumped into the second major challenge: how to machine all this in a reasonable timeframe? For my initial experiments, I played it safe; but these conservative settings meant that milling this project would require more than a day. Was it supposed to take a day? I had no clue. Should the tool be cutting 0.1 mm into the material in each pass? Or perhaps 0.5 mm? Maybe 1 mm? Should it move forward at 1 mm/s or 10 mm/s? The manufacturer of the cutting tool provided several different formulas for hard and soft steels. Acrylic is different - but how, exactly?

In the end, I had to resort to trial and error; every time I made the wrong call, I risked breaking the cutter. This would set me back two weeks - the time needed to have them delivered from Germany or the UK. Still, I realized that I simply had to work it out - and with only moderate losses, I finally determined the right settings to go by. The final product looked like this:

To be sure, it was flimsy, with crummy, low-efficiency gearboxes, and barely enough torque to support the weight of the chassis. But bot, it looked amazing - and it sure felt great to finally hold it in my hand. "Here, I made this out of practically nothing! Aren't you all impressed? Hello?... Mom?".

Ultimately, though, I had to face the facts: 2D routing in sheet material had its obvious limits. I tried several other projects, such as this faux planetary gearbox, but I realized that I need to start thinking about proper 3D. The manual for the mill mentioned a material dubbed Sanyo Sanmodur; they didn't explain what it is or what it's good for, but I searched around and it seemed like a potential answer to my needs: a slab of specialized plastic that can be cut with a saw and mounted inside the mill. The only problem? It was avaialble only in Japan.

After spending several hours online, I eventually bumped into something that seemed similar: RenShape BM 5460, a material used to machine prototypes in the automotive industry. I had to order it as a man-sized sheet weighing about 30 kg - but I was in a frisky mood. That wasn't a bad call: the wood-like polyurethane board machined with ridiculous ease, and yielded amazing results. Here's my first test:

2007: Say it with resin

The fighter jet looked pretty, but sitting inside that machined cavity and firmly attached to the remainder of the slab, it sure wasn't particularly useful. I wanted to do more with RenShape, and the logistics of that weren't quite clear. I watched several videos of people using it to make conceptual prototypes, but the process seemed unwieldy: you start with a block of material sawn roughly to the desired shape, machine away 90% of it... rotate the workpiece through the cutting process while maintaing proper registration... it was a slow, error-prone, and wasteful approach that eventually produced a flimsy, peach-colored plastic part. Bend it, and it snaps.

My first instinct was to beg the distributor for samples of other prototyping boards, such as RenShape 5169. These materials were much more expensive and harder to machine - and while they produced more durable results, all the other drawbacks stayed in place.

I had a growing suspicion that all of this can be avoided with resin casting, a process used by artists and DIYers to replicate hand-made parts. If I did this, I would have to machine a single mold cavity in an arbitrarily-shaped workpiece, and then make any number of final parts just by pouring a liquid resin into the mold, letting it cure, and pulling the cured plastic out. In theory, this would have allowed me to tweak the mechanical properties and color of the parts, too. But something wasn't quite right: nobody seemed to be using this approach in DIY CNC or 3D printing work. Perhaps there was a reason for that.

Since I had absolutely no idea how to approach this, I made the mistake of asking a local reseller for advice. The place that sold me the prototyping board sent me home with 8 liters of RenCast FC 53, a fast-curing polyurethane resin (and yup, that's the smallest package they had). I quickly put together a negative mold to try it out:

I soon realized that they recommended possibly the worst resin imaginable: it had a brutally short pot life (3 minutes), high exotherm, pretty high shrinkage, and relatively poor physical properties. Still, after trial and error, I figured out how to prevent the resin from adhering to the master; and developed a technique of cooling down the resin, mixing it quickly, and applying it with a syringe to get semi-decent parts. With only a moderate amount of swearing, I finally made this screw-actuated robot leg:

The whole process proved to be painful - and the more complex the part, the harder it was to get the cured resin out of the RenShape mold. But at least fundamentally, the direction seemed right - so I took another hint from the non-CNC moldmaking crowd. I decided to cut a positive master, use it to cast a negative mold in flexible rubber, and then pour the polyurethane resin into that.

At first, I tried to be clever and experimented with a single-component silicone sealant from the hardware store; that wasn't a good idea. I searched the web once more, found an artist store that carried two-component silicone rubber, and - based on another piece of poor advice from the distributor - bought 1 kg of MM 922, a relatively soft, tin-cured rubber with dubious resistance to resins. I used this new three-stage process to cast a bunch of connectors, motor mounts, and gears for a large four-legged bot:

What a difference! Having to deal with the FC 53 polyurethane still made the whole experience pretty miserable, but at least demolding proved to be a breeze. The deeper I went, the more it felt that I'm onto something meaningful. My wife was giving me funny looks.

Before the end of the year, I ended up with a significant and completely unexpected amount of money. To dispel any doubts that I'm losing it, I decided to use some of it to trade my MDX-15 for a much larger, faster, and more expensive CNC mill. That's not all: my son was born earlier this year, so I had to surrender an empty-room-come-workshop and move into the already-cramped bedroom. That's how our flat looked like when the MDX 540 finally arrived:

2008: Inching forward

As my descent into madness continued, I started to realize that making compact and efficient transmission systems - the essential part of almost any moving mechanism - wasn't exactly as trivial as I have previously thought. In fact, getting them right is quite a benchmark of your skills. As it turns out, you can't just draw gears that sort-of-kind-of mesh together in an off-the-shelf 3D application, and expect the result to work well. I also had an increasing disdain for my casting resin - and feared that I will never be able to get close to the performance of engineering plastics, such as ABS.

I tried one more project with FC 53, now blantantly taking advantage of my new mill's expanded working area:

Alas, after seeing the motor shear the bulky gears in my ghetto pseudo-planetary gearbox, I decided it's time to move on. I didn't know if better casting resins even existed, and the reseller was predictably unhelpful: as far as he could tell, most of their customers bought FC 53 and that's what worked for them. They suggested filled epoxies and polyesters, so I tried that - and they turned out to be brittle, aggressive toward silicone molds, or otherwise painful to work with.

One of my epoxy-based prototypes from that era - and, coincidentally, the first design sketched in a proper CAD application and incorporating custom rubber parts - looked like this:

At that point, I realized that asking the distributors for help is a waste of time and money: they catered to a narrow range of artistic and industrial users, and had very little clue about this sort of small-scale work. I decided to take a deep breath, step back, and study the specifications for a while. I figured out what properties should theoretically matter: for example, flexural strength and flexural modulus is more important than compressive strength or abrasion resistance - and compared the datasheets to the everyday materials I am familiar with. Unfortunately, the formulations that seemed like a perfect fit were impossible to get in my country - at least unless you were willing to order them by a barrel and wait a month or two.

At that point, the local distributor offered the first truly helpful tip: one of their more experienced technical consultants mentioned that RenCast 5146, a cheap and commonly available resin with a vague datasheet, is the same thing as RenPIM 5219, a high-performance resin I was looking for. As it turns out, Huntsman seels the same product to several different market segments, pricing it differently - and they tried to make it hard for people to figure it out. Good one, huh?

When it arrived, RenCast 5146 was a huge breakthrough: the resin had excellent mechanical properties, comparable to Nylon, ABS, and other engineering plastics. It also offered a very comfortable 20 minute working life and could be pigmented freely with the dry pigments I ordered online (from Kremer). My deep dive into the datasheets also yielded another gem: MM 242, a less toxic, much tougher, and more dimensionally accurate silicone rubber that I started using in lieu of the squishy, less durable, and smelly MM 922.

My next project was a leap forward in terms of the practicality of the design, the complexity of the parts, or the broad use of screws, ball bearings... and, of course, the use of color:

Around that time, I did some experiments with transmission belts and continuous tracks: in fact, you can see a rubber belt instead of gears between the motor to the round platform housing the distance sensor.

The design pictured above still wasn't particularly good, and soon ended up in the dustbin of history - but the manufacturing process now seemed so simple and powerful that I couldn't understand why so many other DIYers seemed to be blissfully unaware of the possibility, and struggling with directly machining or 3D printing their parts from materials that cost too much or come apart under load. In this spirit, I started taking rough noted for what would later become my guerrilla guide to CNC.

Meanwhile, thanks to the durable plastic and some trial and error, my projects could finally take some abuse:

In any case, the next frontier was the transmission: I wanted to make drivetrains that are quiet, precise, efficient, and small - and the only way to get there was to learn about the inner workings of involute gears. Diving into this task proved to be a real eye-opener: I had to devote several nights to reading about mechanical design, I had to fine-tune my casting process and CAM workflows, and I had to start paying attention to the dimensional accuracy and sub-millimeter geometry of the produced parts. I found out that my toaster oven is not the best tool for post-curing polyurethanes, too.

Up until this point, I was doing all the casting work by applying the resin with a syringe, trying to keep the liquid level with the top surface of the mold; and then letting the whole thing cure in open air. But that was increasingly painful and error-prone when you had to deal with intricate detail and needed dimensionally accurate parts. So, without being entirely sure that this will solve the problem - a familiar feeling by now - I bought a low-cost vacuum pump and constructed a makeshift degassing chamber. After the makeshift chamber imploded, I constructed a better one and started to wear eye protection, too.

Having a vacuum chamber enabled me to casually pour the resin in without any attention to detail, degas the mix, and then cover the mold with a sheet of plastic to get a perfectly flat top surface with excellent dimensional accuracy. I started with acrylic sheets, but soon found out that polypropylene and HDPE covers work much better, by the virtue of not sticking to polyurethanes (or much anything else).

My first prototype of an offset spur gear transmission that relied on the new process, and used dowel pins as axles, looked like this:

This prototype reached the accuracy of directly-machined acrylic, and cemented my conviction that this is the right way to go. The next iteration pushed the miniaturization even further, and used several layers of stacked gears on two shared dowel pins:

I was starting to warm up to that whole CNC thing. I hooked up the gearbox to a wheel and ended up with a creation that sure looked pretty, even if it didn't do much:

I had a plan to finally turn it into a finished robot - but the next year brought a couple of changes that interfered with the plan. As for the losses: by the end of 2008, my personal hall of shame - the collection of broken cutters - consisted of 12 pieces of conceptual art. I lost the first five in the second half of 2006; six in 2007; and just one in 2008. A costly lesson ($200), but also one that stuck.

2009: Gear, interrupted

I spent the first few weekends of 2009 refining and miniaturizing the offset gear drive. In the process, I kept learning about the inner workings of involute gears - from pressure angles to undercuts - and waded through the sea of misinformation on the Internet. I developed a suite of simple scripts to generate proper geometries for custom gears:

I also started paying closer attention to the machining process, and devised improved strategies for milling complex shapes in a reliable way. My first project this year started with this mold:

The mold, in turn, led to this handsome design:

If you look closely, you can still see several blemishes that I later learned to eliminate - for example, there are slight tool marks near the parting line - but it was one of the first things that really looked good up close, fit together well, and required no sanding, polishing, or other work.

Encouraged, I made several more and assembled them into a robot leg with three degrees of freedom and an inexplicable number of screws:

If you are hoping to see this project completed, brace yourself for an unexpected twist: in April 2009, I decided to move to the United States with my wife and son. That put the hobby on the backburner for the remainder of the year: I lost the summer simply to the logistics of the relocation; and in the fall, I struggled to find the local equivalents of the European materials I was familiar with. Meanwhile, my collection of unfinished DIY gearboxes, wheels, an legs attracted increasingly snarky remarks from random visitors.

The task of finding new resins actually proved to be painful; compared to Poland, the selection was great - but not that many products really performed well. I made several expensive missteps before finally discovering Innovative Polymers (and their IE-3075 resin in particular); Quantum Silicones (and their superb QM 262 and QM 280 molding rubbers); and Silicones Inc (and their translucent, nearly indestructible XP-592).

(I was deeply disappointed with the resins from Freeman, Smooth-On, Alumilite, and Polytek, all of which seem to be the default destinations for artists and other DIY folks.)

In any case, after sorting this out, I ended up doing a handful of experiments with bevel gears and screw-based actuators that I don't have any photos of; worked on some minor non-robot CNC stuff; and have done a bunch of tests to systematically measure and catalog the real-world strength of the resins I was working with. You know, boring things.

2010: Let's actually make robots

Early 2010, I spent several weeks wrapping a bunch of fairly interesting non-robot projects (say, this, this, or this); with this out of the way, I decided it's time to follow through on a single robotics project from start to finish. Tinybot, as I named it, was a relatively simple but featured wheeled platform with an interesting steering system. I cycled through several layouts; and perhaps for the first time ever, actually tried to design the parts to have specific mechanical properties while minimizing their size and weight:

For example, you can see that the base is very thin (~1 mm), but reinforced with a number of strategically placed ribs. This is actually more complicated than it may seem: the enthusiastic articles about 3D printing don't tell you this, but the material proved to be just a tiny part of the equation. There is a huge body of esoteric knowledge one needs to absorb to make parts that don't randomly snap in half - no matter if they are CNC machined, 3D printed, or carved in rock. I ended up writing down some of that in two articles - here and here.

In any case, back to the robot! I eventually settled on putting the entire drivetrain underneath, mostly for aesthetic reasons and to improve ground clearance. The final product looked like this:

The project page provides a more detailed discussion of the design; what isn't mentioned there is that it served as a yet another CNC learning opportunity, too. It incorporated a number of components that used multi-part molds - and while they aren't particularly complicated to cast, designing the master for these is an interesting exercise in 3D thinking. Perhaps more interestingly, I also wanted to keep the gears meshed very tightly, minimizing backlash - and with that, came some unexpected surprises.

The first moment of genuine disbelief was the realization that I had an incorrect idea of the diameter of most of the cutting tools in my collection. Sure, the manufacturer specified the size as, say, "3 mm" - but it would be obviously foolish to just expect that. The other critical piece of information is the ISO tolerance code casually mentioned in a footnote - in this case, "e8". These two letters mean that the tool is actually made to be 0.029 mm smaller than specified. It's a fascinating and obscure artifact of the pre-CNC machining practices in the industrial world - and a pretty infuriating one, too.

Getting a microscope to investigate this problem also allowed me to look at several other things up close: for example, I could see the difference between the so-called "climb" machining strategy, and the traditional one. Most of the webpages on CNC machining (and Wikipedia!) vaguely tell you that "climb" machining is better, as long as your mill is in good shape. In reality, it's better for certain types of coarse machining operations when working with large tools in metals. In plastics, with subminiature tools, climb strategy leads to dimensional inaccuracy as the tool deflects. So, the joke is on you.

I also managed to spot several toolpath generation errors in my CAM software, and improve my usual machining strategy to never see a tool mark again. Paranoid after all these lessons, I devoted the next several weekends to just experimenting with a microscope, a micrometer, and a dial indicator to avoid any future mishaps: I mapped out the mechanical characteristics of my machine (which actually turned out to be really good), double-checked all the cutters I have (found one that wasn't manufactured right), and investigated the behavior of the silicones and polyurethanes in various conditions. At one point, I had a box of about 50 nearly identical plastic cubes that I used to investigate the impact of fillers on the curing exotherm of the resin. But in the end, I ended up with accuracy routinely in the vicinity of 0.002 mm for small parts.

It wasn't the most productive period of my life, by most accounts - but it helped me embrace a more intricate project in 2011, and saved a lot of pain. And I felt a bit proud, considering that just few months back, I was getting this (missing the mark by up to 0.05 mm):

You don't have to be an expert to see that this is not a good tooth profile - and the reasons for this mishap were completely preventable, and trivial to compensate for.

Oh, and just to serve as padding, here are several snapshots of the non-robot projects I mentioned earlier on:


2011: Obsessing over the planetary

I spent much of the year wrapping up my book, with a move to a new house in between - so I had relatively little spare time. Still, I dedicated a few weekends to playing with resins, and in particular, with a variety of useful composites; some of it wasn't even relevant to the projects I had in mind - I just wanted to make sure that the aforementioned guide is as accurate and complete as it can be.

That aside, my first and only real project was a multi-stage planetary gearbox with a very small envelope; this actually made more sense than building offset gear transmissions, given the latter aren't that expensive or hard to get in the US. It had a bit of a symbolic meaning, too: planetary gears were one of the first things I have tried in 2006 and 2007, and back then, I had very little to be proud of.

Well, this time around, it worked out pretty much flawlessly:

Encouraged by this success, I to put that to use in an interesting omnidirectional design that employed three geared motors to achieve a seamlessly reorientable drivetrain:

For the morbidly curious, here's a detail of the linkage for one of the free-spinning wheels:

Once again, the project page has more detail; the project took me several attempts to complete, in no small part because I had the urge to tweak the color scheme more than once - but in the end, it turned out pretty good.

2012: A brief detour

Between work, writing a yet another book, and the arrival of our second kid, I had relatively little time for DIY robotics; random endeavours that occupied me in the meantime included completely rewriting and illustrating the guerrilla guide to CNC, making cycloid gears, building custom photo equipment, doing HV experiments, completing dozens of other projects with my older son, and hosing around with vinyl printers for fun and absolutely no profit:

The most serious CNC project that I managed to wrap up in 2012 produced this insanely tiny planetary - made partly just as a challenge in micromachining, and partly in preparation for the next project that I had planned for a while:

Speaking of that project...

2013: Omnibot mkII... and more?

My first project in 2013 leveraged the ridiculously miniature planetary to improve on the original design of Omnibot; the Omnibot mkII platform is about 1/4 the size of the original one, fitting in one hand. The mechanical design is also improved in a couple of ways:

Compared to Omnibot mkI, the manufacturing process proved to be remarkably smooth; for example, thanks to several earlier weekends spent reading about the polyurethane chemistry and measuring the precise effects of various inhibitors and catalysts, I had no problems with the shrinkage of bulkier parts or with humidity-related defects in OC-7086, a crystal-clear casting resin used to make a nice housing for the gearboxes. A closeup of the finished assembly can be seen in this photo:

...and here is a rudimentary test:

[...To be continued...]

Questions? Complaints?

You can reach me at lcamtuf@coredump.cx.

Your lucky number: 16043853