Introduction: DIY CNC Carving Machine

A few years back I attempted to build a CNC machine. It was not entirely successful due to horrible backlash on the toothed belt driving mechanism and my low budget Z axis drive and spindle. As a result of my attempt though, I had a variety of fairly long 80-20 aluminum extrusions “in inventory”. My second attempt, described here, came out much better.

The whole design was dictated by a ball screw set I found on Amazon. Ball screw shaft lengths of 350, 650, and 1050mm drove all the other design dimensions. I’m quite pleased at how it turned out. I’ve been using this machine now for a couple of years for carving projects in various wood species and acrylic.

80-20 is great stuff. I had 1x1, 2x1, and 3x1 inch pieces to work with. The 80-20 has slots where nuts can be slid in to receive ¼ bolts. Note that the bolts do have to be the right length so they can reach the nut but not bottom out against the aluminum. Also the ends of the 80-20 can be tapped to receive ¼ inch bolts.

The following Instructable is intended to illustrate the various physical components and how they came together. The details of wiring are not in the intended scope here. Also, use of a CAM program such as Vectric Aspire to work with 3d models and generate G code is not included in the scope of this Instructable.

Step 1: ​X Axis Frame

Basic Frame

I used 1 by 2 inch steel tubing bolted on top of 3x1 inch 80-20 aluminum for the underlying frame. ¼ in bolts went through holes in the steel and into nuts which slide in slots in the 80-20. The sliding allowed adjustment of width. I had to drill larger holes in the steel tube tops for screwdriver access. The steel tubes are 1100mm long, though the exact length does not have to be precise.


The linear rail guides were bolted onto the steel tubing with more ¼ inch bolts. This required tapping the steel – not fun.

Ball Screw

Pillow blocks are the pieces that hold the ball screw shafts in place. I mounted the pillow blocks on the centers of the 3x1 80-20 using ¼ inch bolts into sliding nuts. This allowed adjustment in the Y axis direction. Adjustment in the X direction was done using oversized holes (ouch). I 3d printed a piece to surround the ball nut (the part that follows the screw shaft). This was needed so later I could attach the ball nut to the gantry.

Step 2: ​Y Axis Gantry


I used ¼ inch aluminum plate for the sides. The sides are held together by three pieces of 80-20. There is a 3x1 piece of 80-20 at the bottom (the design pic shows a 2x1). This is where the gantry is attached to the X axis ball nut follower. There are two pieces of 2x1 80-20 higher on the aluminum plate to hold linear guide rails. The aluminum plate sides are attached to the 80-20 here using ¼ inch bolts into tapped holes in the 80-20 ends.

Ball Screw Shaft

Pillow blocks are mounted halfway between the guides to hold the 650mm ball shaft. There is no adjustment here, so the 80-20 has to be cut precisely and the holes in the plate have to be positioned precisely.

Ball Nut

A 3d printed part fits over the ball nut so it can be attached to the Z axis back plate.

Step 3: ​Z Axis and Spindle

Attachment to Y axis

The guides actually form the structure of the fixed part of the Z axis. I bolted them onto 1/8 inch aluminum angle pieces at the top and the bottom. The angle pieces hold the Z axis pillow blocks which hold the 350mm ball screw shaft. This fixed part of the Z axis is connected to the Y axis guides and ball nut using a piece of ¼ plate and shims. This part ain’t pretty. After an initial failure involving pulling out of screws into tapped aluminum, the assembly is now held together by bolts and nuts.

Moving part of Z axis

The moving part of the Z axis is a ¼ aluminum plate bolted onto the Z axis slider guides. The guides (from the kit) came pre-tapped for 5mm bolts so that’s what I used. Again, a 3d printed part surrounds the Z axis ball nut so it can be attached to the front plate.

Spindle and Holder

I used my Bosch Colt trim router for the spindle. It seems like good enough quality, within minimal run-out. It limits me to ¼ inch shank bits, but there always seems to be what I need available in that shank size. After a couple of years or running I needed to replace the brushes. Naturally I looked for a Youtube video to give me a leg-up. The only video I found was another guy who used his Bosch Colt for a CNC spindle. My guess is that if you only use it as a trim router (non CNC) you never have to replace the brushes. I’ve also replaced the collet a couple of times.

The spindle holder is an aluminum piece I ordered on Ebay. While it was slowly making its way to me from China, I 3d printed some temporary holders but the plastic really isn’t very strong for this use.

Step 4: ​Motors

For stepper motors I bought a kit of three Nema 23 425 oz-in steppers, their drivers, and a power supply. These have turned out to be quite satisfactory for overcoming friction and inertia in my design. For the X axis I mounted the motor on a piece of angle aluminum screwed onto the frame 1x3 80-20. For the Y axis, I used a Nema 23 steel bracket, but the attachment was less than elegant. The Nema 23 bracket worked out fine for the Z axis.

The ball screw kit came with 3 motor connectors but they were weak and two of them broke soon after deployment. I replaced all three with what I call Lovejoy connectors.

Step 5: ​Spoil Board and Attaching Work

I used ½ inch MDF (Medium Density Fiberboard) for my base and spoil board. The board is screwed into tapped holes in the tops of the 1x2 steel tubes. I drew a grid of lines on the board and I find it’s helpful in mounting work in line with the X axis.

For mounting work onto the board I’m not hesitant to screw into the MDF. I have a pair of plywood angles which can hold thin stock, sometimes assisted by double stick tape. For heavier stock I use wooden clamps which I screw down into the spoil board. For very uneven work such as a log slice, I use small hinges screwed into either end of the log and then into the MDF. I’ve replaced the MDF spoil board once already.

Step 6: ​Dust Collection

One needs a dust collection system. I tried the machine briefly without it and dust goes ALL OVER.

Dust Shoe

I designed a two part dust shoe. The upper part has a pinchable hole to grab onto the spindle (router) body, and another hole to hold the vacuum nozzle. I made the first upper on the 3d printer, then used the CNC machine to cut its replacement out of acrylic. The upper part has strong magnets pressed and screwed into the surface. The lower part consists of a 3d printed body. On top are steel screws aligned to engage with magnets on the top. Around the bottom I used flexible plastic for a skirt.


I ordered an inexpensive (~ $20) dust collection cyclone and mounted it on a 5 gallon bucket. Connected to a dedicated shop vac, it traps almost all the dust which drops to the bottom of the bucket. This way the shop vac filter doesn’t get clogged and very little dust goes into the shop vac. My only complaint is that there is no easy way to know when the bucket is getting full until there is no suction and dust goes into the vac.

Step 7: Electronics and Electrics

Power and Stepper Drivers

The power supply and the stepper drivers came in the kit with the motors. They all seem fine and work well with the motors.


This is just a cheap old slow Windows PC I dedicated to the job. Not much resource is needed to run the Planet CNC software and this machine is fine for the purpose. It does have three USB ports and I use all of them.

Control Board

Controller boards are the component that takes in G-code and translates it to the pulses needed by the driver boards to move the stepper motors. I’m rather fond of Arduinos and think they can do anything. So I tried using a Mega with GRBL software. It sorta worked, but the user interface was less than elegant and I got frustrated on various accounts. A few years back for my first attempt at a CNC machine I had bought a Planet CNC Mark I controller from Slovenia. I chose it because at the time it was the only option I could find with a USB interface. I got the old controller board out of storage, replaced the Arduino, and never looked back. The Planet CNC people are in still in business in Slovenia and have always been responsive to questions and concerns.

Spindle power Relay

After a month or so the machine seemed quite reliable. I grew tired of staying near it while it worked so I could shut off the vacuum and spindle when it was done. The G-code versions I use automatically include an M3 to start and an M5 to stop the spindle. The controller provides a pin for this so I connected this to a relay to automatically turn on the vacuum and spindle and turn them off at the end. The relay also controls a Hobbs meter to log the “on” hours.

Limit Switches

One should have limit switches to prevent the machine from trying to move past its physical limits. I opted for normally closed versus normally open. There is less wire this way since the two switches on X and on Y are in series. And it seems safer in that you will know if a wire comes unplugged or breaks. In truth, the switches have hardly ever been triggered and they may be more trouble than they’re worth.

Emergency Stop Switch

One is supposed to have one of these also. So if something horrible begins to happen, you can smack the red button and the world will be saved. I had one of these too, but the switch went bad so I bypassed it. Truth is, unless you’re standing right there, with large steppers the machine is going to do whatever the G code tells it. The disaster will be over by the time you get there.

The machine has proven quite reliable and after starting a carving run and seeing that it’s behaving as expected, I walk away. From most rooms in the house I can hear the machine running. So I can also hear when it stops, so I can go down and change a bit, or dismount from the spoil board.


All of the above fits into a neat cabinet salvaged by my good friend and tech buddy Charles. Wiring connections are at the back of the cabinet and are all unpluggable. The cabinet drawer holds my growing collection of bits.

On Amazon this is referred to as a Wireless Number Pad. I use this little box to move the machine on the X, Y, or Z axes manually. It's more convenient than having to poke at the on-screen controls using the PC trackpad. This one connects to the PC via bluetooth and simulates keyboard commands.

CNC Contest 2020

Participated in the
CNC Contest 2020