CNC mill

CNC Mill

I first built this mill in 1993 from plans I bought via Usenet (“Robotic Woodcarver Kit #1”!) from a fellow named Andrew Cilia. I’m writing this in 2018, so, 25 years ago. The original software was DOS-based, written in pretty awful C. I quickly ported it to linux, but I never succeeded in making the code “not awful”. The controller required independent control of the individual stepper motor windings in software, and it was fairly convoluted.

Initial design

The first few pictures here were taken in 2006, just before I threw up my hands in disgust at not being able to get it working properly after a somewhat long hiatus from milling. I had by then switched to LinuxCNC as the driving software, having written a custom pin driver for my oddball controller.

The shaft couplings consisted of a 5/16” coupler locknutted to the threaded shaft, and hot-melt glued to the stepper shaft. This worked surprisingly well, if you could get everything aligned properly. That was always a big “if”.

img_1.jpg img_2.jpg img_3.jpg

Early carvings

Here are few of the more successful early carvings. (There were a lot more unsuccessful one!) I believe the three on the left were all made using my linux port of Andrew Cilia’s original software. The other two were done using LinuxCNC. (The angel was hand-drawn by my wife, photographed, converted to a high-contrast bitmap, and turned into vector format with the “autotrace” program, and run through a vector path optimizer I wrote, before being finally converted to gcode.) img_4.jpg If you look carefully at the carving on the far right, you might think that the circle isn’t round. You’d be right. The stepper on one of the axes was missing steps, and so not traveling as far as it should have been. At least it was consistent, so it usually ended up back in the same place after a round trip.

Later modifications

The rest of the pictures were taken in 2015 or later.

The original plans called for a dremel tool as the spindle. That proved insufficient fairly quickly. I replaced it with a Porter-Cable laminate trimmer, which lasted for many years. It’s since been replaced by a Makita variable speed router, which, when run slowly, is much quieter.


Here I’m using my digital caliper to figure out whether the X axis motor is dropping steps. It was – the shaft needed to be cleaned and straightened, and, eventually, replaced. img_8.jpg

The original stepper controller was swapped out with a model from SparkFun, which works better with LinuxCNC. The new controller lives in the “electronics cabinet” – actually just an old cigar box.


I used a couple of ribbon cable connectors to form sort of a patch panel for doing the interconnect from the computers parallel port to the controller inputs. The terminal strip above the cigar box is for the limit switches and probe input.

The small receiver under the monitor is for my IR keyboard. img_9.jpg

It’s handy not having wires – the (big) downside is that if you start a motion and happen not to be pointing the keyboard closely enough at the receiver when you release the key, the machine will keep on moving, since it never got the “key released” signal. That’s what prompted me to finally install limit switches!

The limit switches are small microswitches I’ve had in my junk box for years. Mounting them on little copper wire pedestals lets them “give” a little, and lets me bend them out of the way if I need to move the table a little further during maintenance. img_12.jpg

The shaft couplers (also in the photo above) are now short lengths of 1/4” braided rubber fuel line, clamped to the 1/4” stepper shaft and 5/16” threaded shaft with double twists of the same 12 guage copper wire.

The drawer slides (“Accuride”, I think?) work reasonably as transport for the X and Y axes, but they were terrible for the Z axis. The problem was that although they prevent motion well in the front-to-back direction (the Y axis), there was a lot of flex in the right-to-left (X axis) direction. img_13.jpg The Z axis has been rebuilt since this was taken. More pictures below.

The laminate trimmer is a big load for the stepper to lift. A 4 pound weight acts as a counterweight. img_16.jpg

I made a dust collector from odds and ends I had around the shop. The shop vacuum attaches to the top of the chrome tube (which is from a section of sink plumbing that I had saved).

img_39.jpg img_42.jpg

An advantage of having the Z axis fixed (rather than traveling back and forth in the Y or X direction, in addition to going up and down) is that the dust collector head also doesn’t move. So it can be mounted separately from the cutting tool. img_45.jpg

An “action” shot, actually milling, and collecting dust. Okay – not very interesting, I know. img_57.jpg

More carvings, 2015

Here are some projects from 2015, I think.

These are a couple of pieces from a project I carved from cellular PVC (i.e., Azek – the “plastic wood” that’s used a lot as exterior trim on houses these days). It’s forgiving to work with, and easy to mill, but not terribly structural. img_66.jpg img_69.jpg

Here’s another part made from cellular PVC – it’s part of the shaft mounting for the redesigned Z axis. img_72.jpg

Usually I cut with an end-mill, which produces a square cut. With an angled bit, engraving is possible, even in aluminum. Here’s a new dog tag. Please don’t telephone me. img_75.jpg

Rebuilt Axes

In 2015, it was time to replace some parts that were limiting performance quite a bit. As I mentioned, the Z axis had way too much flex, so I bought some ball rail slides to replace the drawer slides.

I used the mill itself to cut and drill pilots for all the holes in the new design, to allow accurate mounting of the new ball rail slides, and the mounting blocks for the router, the shaft coupler, and the stepper motor. It all went together really well.

img_87.jpg img_90.jpg

I’m still using the pulley and 4 pound counterweight, because the coupling from the motor to the shaft isn’t all that strong. Way better to have that joint under some compression, rather than being pulled apart.

The drawer slides work “well enough” for the X and Y axes, since they’re well supported in the direction they’re most likely to flex. But the all-thread rods used to cause motion were terribly inefficient. I upgraded to Acme threaded rod, and tripled the top speed of the axes from 18 ipm to 54 ipm. This is still very slow for a CNC mill, but a huge improvement for me. (The Z axis, which still uses all-thread, will only run reliably at about 6 ipm.)


The rod-to-motor couplings still use sections of rubber hose. They’re surprisingly accurate.

The Z-axis probe

Sometimes it’s useful to be able to measure the contour of a surface before carving it – you can then use that data to adjust the depth of the carving. This can let you do a shallow etching on a board that’s cupped or warped, for instance. My first Z-axis probe was fairly crude: img_81.jpg img_84.jpg

I’ve since rebuilt it, using a more accurate switch (and better construction!): new_z_probe.jpg

This switch gives reproducible readings that are +/- .0002”, which is far more accurate than the rest of the mill.

Game controller

Always having to pick up a PC keyboard to run the mill was a nuisance. Many times all you’re doing is getting the cutting head out of the way, or raising the router to change the bit. I picked up a cheap USB game controller, and mapped its buttons to move the axes, perform emergency stops, and few other frequent operations. It’s a big help. game_controller.jpg

(But I’m going to need to spend more for a controller. Sometimes when I ask for a positive Y motion, I get positive Z as well!)

Clamping and hold-downs

I’ve long needed a much better means of clamping workpieces to the bed of the mill. I had initially designed a bed of holes which could take pins, and had a screw clamp that could hold the piece sideways against the pins, but it never worked very well. So most of the time I used double-sided tape, which wasn’t bad for small parts, but terrible for big parts.

So in early 2018 I replaced the bed of the mill with a new piece of 3/4” MDF. I drilled holes and installed #10-24 threaded inserts in all of them. That piece is meant to be permanent. To protect it, it’s covered by a piece of 1/4” masonite, drilled with matching holes. img_101.jpg img_104.jpg

Some of those holes are used to secure the masonite to the lower piece, and others just allow screws to access the threaded inserts below. Various clamps and cam handles and stops can now be easily attached to the mill, and parts being cut are held securely. img_109.jpg img_110.jpg img_111.jpg cam_clamp.jpg

There was an amusing, and sad, side-effect of designing this new hold-down system. I quickly discovered that the X and Y rows of holes I’d drilled weren’t at right angles!! It turns out that my X and Y axes have never been quite properly mounted. For much of the time the effect was completely masked by the loss of stepper motor steps. When I fixed that problem, things were so much better that I think I didn’t do very careful measurements. They were only off by about 1%, but still…

In any case, it turns out there was a simple solution. Rather than disassembling and adjusting the X-axis drawer-slides, which would have been quite difficult, I took advantage of the fact that this is a CNC mill and fixed the problem… in software. With some pointers from the folks on the LinuxCNC forum, I was able to square up my axes in a few hours.

Yet more carvings, 2018

One of the first things I carved years ago was a Christmas angel. There’s a picture of that old version above. With improvements to the mill, and to my technique, a she looks a lot better than she did back then. Splurging for mahogany didn’t hurt. new_angel.jpg

I’m pleased with these napkin rings. The lighter ones are poplar. The darker ones are mahogany. They haven’t been oiled yet – they’ll look like the angel, above, when they are.

napkin_rings.jpg napkin_ring_design.jpg

The End (for now)