Modular DIY CNC Machine




About: I'm a Mechanical Engineering graduate from UC Davis and I love to build things and figure out how stuff works. I enjoy design work, both in the field of engineering and general graphic design as well. When...

Update: Thanks everyone for the interest and support in my design! In the year or so since this Instructable has been published I actually was able to create a second version of the machine. Check it out here!

I'm a recent college grad with a degree in Mechanical Engineering and love to build things. For my job I get to design and integrate parts of large, expensive satellite assemblies, however I don't get much hands on work with what I design due to the scale. I've always been interested in CNC machines and laser cutters/engravers, but I never really had the money or space to buy one myself. I decided to put my engineering background to the test, and build my own CNC machine with the ability to be upgraded and use the least amount of tools possible. This Instructable includes what I've designed and how to follow these steps to create your own machine.

For the first iteration and documentation of my design, refer to my original Instructable: Modular DIY CNC Machine for ~$300. I originally wrote this Instructable as I was designing and building my first rev of the machine. After two 3D printers and several design iterations later, I've finally created a machine I believe to be solid enough for others to create. You can reference the attached image for a documentation of my other revisions and the issues to see why I've designed the machine the way I have.

I've recreated the assembly process using rendered images from Inventor. This makes it easy to see what goes where and should make it easy to follow along at home. If for some reason the images in the steps are hard to read, you can reference the attached PDF of the instructions. For some steps, I do provide additional tips and tricks in this Instructable that aren't included in the PDF.

I hope you find this Instructable helpful in your own CNC build and feel free to leave any comments or questions down below! If you like what you see please vote for me in some of the contests I've entered!

Update: See the Step 11 for upgrades to the Z axis and more

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: The Design

I wanted to build this CNC machine as a proof of concept while at the same time create something I could upgrade in the future. I used Inventor to create my design until I found something that would optimize my build area while also fixing issues with my previous iterations. The area of travel for the cutting tool is 8" in the X, 14" in the Y and 2" in the Z, but this could be increased if longer aluminum extrusions were used.

The work piece itself is fixed on the wasteboard below the machine. In my first version the work piece actually moved and the gantry was stationary, however I found multiple issues with this design. The gantry moves along the Y-axis via belt drive with motors on either side of the frame. The X-axis moves perpendicular to the Y-axis along the gantry, also via belt drive. Attached to the X-axis is the Z-axis, which moves up and down via screw drive. The overall design is similar to the X-Carve mixed with the Open Builds Acro laser cutting system.

Again, the goal of the machine is to allow it to be upgraded later on. This means the extrusions can be scaled up or down to fit your needs and budget. I've also designed the Z-axis to have a basic attachment scheme, meaning multiple tools can be attached so long as an adapter is designed with matching mounting holes. For my purpose, I've created an attachment for my Dremel and 2.5W laser. You could also design an adapter for a pen or even a 3D printer head to name a few options.

The overall cost of this machine ends up being around $325, not including the Dremel or laser. I hope you find this Instructable useful if you decide to build your own CNC. There are a lot of resources out there for doing so, and I hope I've created something that helps centralize a small portion of this information.

Step 2: Bill of Materials

Since I live in an apartment and didn't have many tools when starting this project, I chose components based on their availability off the shelf or through online vendors. The project could probably be cheaper by cutting the extrusions yourself, using different suppliers, or different material completely, but I found this to be the easiest option.


The aluminum extrusions all come from, which provides services for cutting and tapping of all extrusions. This means a chop saw for cutting metal isn't necessary since everything is already ordered to length. The T-slot extrusions are also fairly standard which means the hardware for them is easy to find and not proprietary to one single vendor. The frame is assembled together using small brackets and bolts, making it easy to adjust the geometry and make it larger if I wanted to in the future.

Carriages and Drivetrain:

The X and Y axes move using carriages which reduce friction and make it easy for attaching the extrusions, motors, and other electronics. For the carriage plates, I chose to use laser cut acrylic that I ordered through Ponoko, mainly because my 3D printer doesn't fit what I had designed and I wanted the plates to be fairly strong. The carriages also use V-slot wheels with bearings, which start to get costly as you add them up. However, I've found the wheels to work very well, and they increase the overall machine effectiveness. The motors on each carriage then use a belt drive system to move along the frame.

For the Z-axis, I found it easiest to just design a carriage that would slide using the T-slots in the extrusions. The axis is also driven using a screw and nut directly attached to the motor.


Based on researching other CNC designs and machines that are sold online, I decided to go with an Arduino Uno as the brains. I found a kit on Ebay that includes an knockoff Arduino Uno, a stepper motor shield, 4 motor drivers, some limit switches and 3 stepper motors. These parts could be purchased separately to save cost, but this was convenient since I knew they were compatible with each other and there was an extensive guide online. I also purchased a fourth stepper motor, one with dual shafts so I could easily raise and lower the Z-axis. The kit included heat sinks for each stepper driver, however I found they still got pretty warm. I added on a cheap computer fan, powered by the Arduino, and this works pretty well to keep the temperature down. The laser I bought also is powered by a wall outlet, so there's no easy way to turn it on or off without unplugging it. To fix this, I added on a cheap relay controlled by the Arduino to turn on an off power going to an old extension cord. This allows me to plug in my tool and have the Arduino control when it's active.

Custom Parts:

As mentioned, I used Ponoko to custom cut my carriages. Other custom parts include the machine legs, Z-axis alignment pieces, fan and cord holders, Z-carriage and all tool adapters. Since these pieces are smaller and more complex, I decided to use my 3D printer (Monoprice Maker Select Mini v2) to make them. This allowed me to iterate through their design until I found something that would fit my machine. You can find all parts attached to this Instructable so you can print them yourself or have an online vendor print them for you.


Materials List:

-Estimated Cost: ~$325 (not including Dremel or Laser)

- See attached Excel file for all parts, prices, and links.

Step 3: Tools Needed and Parts Prep

Tools Needed

One of the main goals for this project was to create the CNC machine by using the least amount of tools possible. This does increase the cost in some places, however the majority of the tools needed are pretty basic or readily available. Here's what I used:

  1. Drill
  2. Allen wrench set (I have a cheap precision screwdriver set from Amazon and it's always helpful to have around)
  3. 3D Printer (can also have custom pieces printed via 3D Printing services)
  4. Hot glue gun
  5. Tap and die set (optional)
  6. Multimeter (optional, but helpful)

Parts Prep

A few parts will need to be prepared in order to fully fit for the machine.

  • The small bracket holes are slightly too small for the 0.25" cap screws, so you'll have to increase the size using a drill until the hardware fits. In hindsight, it might have been best to purchase the recommended bracket hardware from 80/20 but I was trying to save some money.
  • All 3D printed parts should be cleaned of all supports. Some holes may need to be enlarged/test fit to make for easy assembly later on.
  • The wasteboard will need to be prepared since it shows where the frame will attach later on. Use the attached template to drill the mount holes for the leg braces, along with the holes for workpiece clamps. I ended up tapping these holes using the 8mm threaded rod once they were drilled, which will allow for a threaded feature to be used for the clamps. Another option is to use inserts or the spare hex nuts, although this would increase cost/time required (recessed hex nuts were my original plan, however I found tapping the holes worked for my needs).
  • Make sure the ends are tapped for all Aluminum extrusions except for the 1010 x 16" ones.

Step 4: Y-Axis Slide Assembly

Note: You may want to add (2) 0.032" thick washers on each M5 x 45mm bolts between Y Plate Inner and Y Plate Outer so the slide doesn't rub against the extrusion.

Step 5: X/Z-Axis Slide Assembly

I chose to use a dual shaft stepper motor for the Z Axis. This makes it easier to raise and lower the tool manually when needed.

Note: You may want to add (2) 0.032" thick washers on each M5 x 45mm bolts between X Plate Inner and X Plate Outer so the slide doesn't rub against the extrusion. You can also add (1) 0.032" thick washers between each of the 0.25" Cap Screws and T-Slot nuts that connect X Plate Outer to the 1010 x 6" Extrusions

Step 6: Gantry Assembly

Step 7: Final Assembly

Step 8: Electronics Routing

I recommend testing all electronics first before placing them. This makes it easier to troubleshoot everything, however this can still be done if the parts have been placed.

Test the Electronics

The first part I received was actually the CNC kit, which was nice since it gave me the chance to play around with the motors and make sure I could actually get my CNC to move. You also need the power supply, otherwise there's nothing to actually make the motors move. Make sure to hook up the power supply correctly, otherwise you may short out the components and could destroy your electronics. For an extra precaution, I plugged the power supply into a surge protector.

To hook up the supply, I took an old computer power adapter and stripped down the cord so the live, negative and ground wires are showing. Make sure whatever cable you use has a ground connection. You can use a multi-meter to determine which wire is which, or you can consult online sources since most cables are the same. Once I determined which wire is which I labeled them so I didn't get them mixed up later on. I then hooked them up and plugged the power supply into the outlet and measured the output voltage using a multi-meter to ensure I was getting the 24V I needed. My power supply had a potentiometer on it so I tuned the supply to get the value I wanted.

Prepare the Arduino

The next step is to load GRBL onto the Arduino Uno as this is what communicates with the motors and transmits the G-Code to the CNC. I placed the motor shield on top of the Arduino Uno and the motor drivers on top of that. It's best to test one motor and motor driver at a time to ensure GRBL is running correctly. Once you've determined GRBL works, you can hook up the rest of the motors and play with them. I thought this step was pretty cool as it's one of the main things that makes a CNC a CNC. There are various programs online to actually send GCode to the Arduino and most of them are pretty light and self explanatory. I like Grbl-Panel the best (linked below), but there are several other programs available that you can find with a quick search. I also attached a few guides I used for installing GRBL and other electronic troubleshooting:

At this point you can also use the jumpers included with the CNC kit for configuring the 4th axis and microstepping. Configuring the 4th axis will tell the shield which axis the motor plugged into the "A" port on the board controls. For this CNC, place two jumpers across the Y pins since the two motors control the Y axis. Microstepping is discussed further in the next step.

CAUTION: Make sure the power supply is off when messing with the Arduino and CNC Shield. If you don't then you run the risk of damaging the motor drivers, the shield or even the Arduino. Trust me, I learned this the hard way and it's not fun trying to figure out what's causing the problem.

Routing Change

My initial routing scheme was to place the Arduino on the X Plate Outer and route everything to it as shown (Option A). I was never really happy with this, however, so I've changed the routes so the Arduino is placed next to the power supply on the wasteboard (Option B). This means I needed additional wires for each motor and limit switch since the original cables weren't long enough. I also added in a couple drag chains to clean everything up. The result is much more clean than before, and mimics routes similar to many other CNC machines out there.

Step 9: Configure the Electronics

Once everything's been put together your almost done to run your first test program. However, the CNC won't fully have the right settings, meaning your program won't be accurately executed. The CNC must now be calibrated so it actually goes where the Gcode tells it to. For instance, the CNC doesn't know how far one revolution of the motor actually makes the machine move. To configure this, you need to set the step/mm which tell the motors how far they need to rotate to move the amount specified in the Gcode.

You may need to iterate through the step values until you have a value that produces the most accurate results. The main formula you need is:

  • (New Step Value A) = (Old Step Value) * (Traveled Distance) / (Measured Distance)

The best way to find the step value is:

  1. Set the step value in GRBL
  2. Mark the machine starting location on each axis using tape or a marker
  3. Use the software to move the machine a specified amount
  4. Compare the actual amount moved with the desired amount and use the above formula to calculate the new step value. For example, you may tell the machine to move 1" but it really measures out to be 0.75" so use the formula to find the new step value.
  5. Repeat until you have an actual movement value that matches the desired value (i.e. you tell the machine to move 1" and it actually moves 1" in that direction)

You can also use microstepping which makes the movement smoother at a loss of torque. For this reason, it's best to minimize the overall machine friction in order to have the smoothest movement possible. To incorporate this, you need to connect the appropriate jumpers on the CNC shield and adjust the step value. The new formula you'll need is:

  • (New Step Value B) = (New Step Value A) / (Microstepping Fraction) where New Step Value A is still calculated using the formula above.

For my machine I used the following settings:

  • X-Axis: 25.417 step/mm (Microstep = 1/8)
  • Y-Axis: 40.000 step/mm (Microstep = 1/8)
  • Z-Axis: 162.538 step/mm (Microstep = 0)

I also used the following links for reference:

GBRLInterfacing Programs

The following programs can be used to set GRBL settings and send the G-Code:

If Your Stepper Motors Aren't Moving

If your motors are plugged in but they don't move when you send the commands, make sure the correct current or voltage is being sent to the stepper drivers. You can measure this with a multimeter as mentioned here, then adjust the potentiometer until the correct value is achieved. Your should run the motors per the specifications. If you go over these values you run the risk of damaging the motors or stepper drivers.

Step 10: Run the Machine!

Now comes the fun part: MAKE STUFF! For this you just need to create a design, make the Gcode, and send this to the machine. There are many different ways to create the code, but I've found success using Inkscape with the Gcodetools plugin to convert your designs. You can also use Easel which is meant for the XCarve, however you can just change the settings to match your machine and export the Gcode. The basic steps for running the machine after generating Gcode is as follows:

  1. Secure your work piece to the wasteboard.
  2. Home the machine.
  3. Move the machine to the furthest point of your work piece relative to the homed location (machine zero). Lower the Z-Axis so it just touches the work piece.
  4. Zero the machine. Your work coordinates should now be zero (work zero).
  5. Run the Gcode.

Make sure you zero the machine to set the work coordinates. If you don't do this, the machine will think zero is at the homed position, meaning it'll just run into the end stops. This is standard for most CNC machines, so there are plenty of online resources about this. I also like to use a Gcode visualizer to make sure the design actually transferred correctly and have found CAMotics to be a good program for doing so. I also run the Gcode before having any tools in to avoid damaging the tool if the Gcode isn't quite right.



There are many different types of clamps out there so it mainly depends on user preference. I like the ones made by Marius Hornberger or you can find ones on Thingiverse too. Alternatively you can also use tape but make sure the workpiece is securely fastened to the wasteboard so it doesn't fly off.

Tips and Tricks:

  • If the motors are skipping steps try adjusting the voltages. The motors may not be getting enough voltage/current. This can kinda be seen in the laser engraving video as the lines don't fully match up on each pass (one of the Y-Axis motors would lag/skip steps at times so I'll need to play with the voltages)
  • Regularly check the belts to make sure they're still tensioned
  • If you use a relay then put M3 at the beginning of your Gcode and M5 at the end to turn the power to the outlet ON or OFF respectively. This is especially useful if you're using a laser so the laser doesn't drag across the workpiece and cause unwanted burn marks.
  • If your machine isn't moving very quickly or movement seems clunky, try adjusting GRBL settings. I found success in changing the acceleration and speed until I got movement I was happy with.

Possible Improvements:

  • Use larger motors for more power
  • Switch from belt drive to threaded rods for more reliability and precision
  • Use a knob instead of a coupler on top of the Z-axis to make it more ergonomical
  • Use a carriage system with wheels for the Z-axis as well to make it more solid and stable
  • Design actual holders/permanent stops for the limit switches
  • Create a shield to keep dust away from the electronics


That's it you're all done creating and setting up your own CNC! Thanks for reading through this Instructable, and feel free to leave comments and questions below!

Step 11: Updates

Z Axis Upgrade:

After much tinkering I found the threaded rod and nut for the Z axis didn't have enough accuracy and power. When the motor would turn it would take several revolutions before the axis would move. So I've replaced the rod with an ACME threaded rod (~$20 on Amazon) similar to that used in a 3D printer. The Z axis slide was also redesigned to fit the new ACME nut that came with the rod, and I updated the sliding configuration to minimize misalignment. I originally designed a wheel carriage system but found it to be difficult to maintain alignment. The wheels are not necessary since the rod seems to take most of the forces so it's easier to use the sliding Z adapter. I also found a quick release Bosch router mount on Thingiverse and redesigned the MOUNT file so it would fit the adapter plate. All other relevant files can be found through the Thingiverse link.

Z Axis Upgrade Sliding Configuration BOM:

  • (1) ACME threaded rod and nut
  • (1) Z Slide Adapter 2 (3D printed)
  • (4) M3 x 16 bolts
  • (4) M3 lock nuts
  • (2) 2" linear glide profiles
  • (2) small screws (or glue to attach glide profiles to slide)

Z Axis Upgrade Wheel Carriage Configuration BOM:

  • (1) ACME threaded rod and nut
  • (4) Delrin wheels
  • (4) M5 x 30 bolts
  • (4) M5 lock nuts
  • (4) Spacers (3D printed)
  • (1) Z Slide Adapter Wheels (3D printed)
  • (4) M3 x 16 bolts
  • (4) M3 lock nuts

Misc Updates:

- As you can see in the images, I created an enclosure to put the CNC in. This is just build into a metal shelving unit I bought from Lowes. The wood used is a mix between particle board, 2 x 4s and some other scrap wood I had laying around. The windows are from acrylic, also bough at Lowes. This will helpfully reduce the mess created from dust and the loud noise from the router. Another upgrade in the future is to make a dust shoe and maybe line the enclosure with insulation to dampen noise even further.

- Attached STEP files for the STL files in step 2 (includes updated Dremel clamps)

- Attached STEP files for all plates. Use the Ponoko link for the already set up file to just directly order plates from them

- Created a Z-axis knob for easy adjustments

- Created an adjustable stop for the Y-axis limit switch

Arduino Contest 2017

First Prize in the
Arduino Contest 2017

Epilog Challenge 9

Runner Up in the
Epilog Challenge 9

1 Person Made This Project!


  • Made with Math Contest

    Made with Math Contest
  • Cardboard Speed Challenge

    Cardboard Speed Challenge
  • Multi-Discipline Contest

    Multi-Discipline Contest

43 Discussions


Question 5 months ago on Step 5

I am building something similar and I think the pieces you have labeled as "Linear slide bearing profile" would work for my application. Do you have those files available anywhere? Thanks. Great build!

1 answer

11 months ago

Hello! I am working on replicating your CNC machine in my garage. The last of the parts I need to order is the 8020 extruded aluminum. I see the lengths and qty for each part listed on the BOM but not the drill and tap spec. Do you have this written down somewhere in the instructable?

2 replies

Reply 7 months ago

I don't think I wrote that down anywhere but the 8020 is tapped with 1/4-20 holes. I believe these are also the default that will do but I tapped them pretty easily myself


Reply 7 months ago

Thank you! I have all the parts in my garage... Just waiting for it to get warmer!


Question 1 year ago

wow, this looks like an amazing build. Can't wait to get started on it (once i convert it to metric and find places in Aus to buy the stuff). Once question. In the videos it looks like on both the laser and dremel by the 2nd or 3rd pass there is some drift (i.e. the lines are not int he same place as the previous run). Was that a clamping issue, or by deign? Did you manage to fix it up?

2 answers

Answer 1 year ago

Thanks for the read through! The videos show my first two runs of the machine so they definitely aren't as clean as they could be. I believe for these runs the belts weren't fully tightened so over time the movement went out of alignment and the gantry was slightly skewed. If you just make sure your belts are tight there shouldn't be any issues. Also make sure the two stepper motors are running at the same voltages. One of mine was running much higher than the other so it would stall at various points. Once I adjusted the potentiometers on the stepper drivers drivers my performance increased greatly and I noticed no further motor stalling.


Answer 1 year ago

Awesome, thanks for that. I will probably end up going with acme threads for all the axis (especially if i expand to 3'x2') , but will start with the belt and see how things go. I will make sure that the voltages stay the same as well. Thanks again


1 year ago

Beautiful build! Any updates on the Z axis reinforcement/redesign?

1 reply

Reply 1 year ago

Sorry for the delay my computer crashed so I had to spend some time getting it back up and running. I just posted an updated z axis in step 11 if you want to check it out. It seems to work a lot better at holding my Bosch router compared to the original design. Let me know if you have any questions!


Question 1 year ago

This is amazing! I have been trying for years to find a build this cheap, and am planning on implementing this within the next few months.

Your original post from last year had a parts list with direct links to all the parts (extrusions, nuts, bolts, etc). Do you have an updated parts list for this one, or is it entirely the same?


1 answer

Answer 1 year ago

Oh my bad, I missed the CNC+BOM Excel sheet, got it!


1 year ago

Very nice write up and you got my vote. I am interested in CNC plasma cutting on a small scale to start, to sit on the top shelf of a 16"x 30" utility cart. On the bottom shelf below will be the 70lb plasma cutting machine I was fortunate enough to inherit, with power supply and cooling fan for the CNC to help keep the items clean and out of harms way. I like the expandability of your project but did not like the belt drive thinking it would have start/stop play which would gradually increase with wear and temperature changes from summer to winter. I do like the mention of using a screw drive for the X and Y. The pinion belt would probably be ok for the Z as working with sheet metal this would rarely change. My question to you is what alterations would I need to make to your current project to use a screw type step motor? Or if you know of another DIY CNC plasma cutter project that is acceptable with tight tolerance please suggest a link? I like the metal used with your frame as it appears to be of good quality to be true for smooth operation. Look forward to you response or suggestion from other viewers

3 replies

Reply 1 year ago

Thanks for your support! I'd agree that the belt driven system is the least stable part of the design by far. To update to a screw drive instead the biggest change would be mounting the X and Y motors on the ends parallel to the axis of motion. I'd say for the Y axis it would be best to mount the motor through the leg plates somehow and then have a nut mounted to the Y plate. A similar approach would be best for the X axis so I'd mount the motor on the top of the Y plate and have a nut on the X plate. There are a bunch of builds on Open Builds which have a mix between the two drive systems. Their C-Beam machine ( has all screw drive but is a little different style than this machine. You can also reference the Sphinx builds for something a little more like the style I have (


Reply 1 year ago

Thanks for the openbuilds link ! I like their concepts and educational approach. Seems like I need to do a lot more research to learn the bottom line total cost. What would be the minimum inch pounds of torque need to get precise start and stops out of the stepper motors?


Answer 1 year ago

All details for this CNC are included in this Instructable. If you have specific questions I'd be happy to answer but all general knowledge for getting started should already be included


1 year ago

Definitely expecting the Zaxis redesign. Hope you will post it here :)
Excellent job , it is really nice to see such instructable , shame that the site do not have a contest for CNC I will be one of the voters.
Keep the good job.
Also I agree the overheating and fuses is really a pain.
You might check for some bits for the CNC or parts - I do not have relation to those site I just use it.
Seems here are some people having experience with CNC-ing the aluminum- Do you use cooling agent (oil , water) on the bits ?
Fortunately in web now is possible to find CNC parts like stepper motors Nema 17 /23 and all those parts that are hard to obtain, so I hope other people do it.

1 reply

Reply 1 year ago

Thanks for the read and kind words! The z axis is in the works and I'll post it as an extra step don't worry! I haven't played with cooling agents too much since I've only done the two cuts (shown in the video) and still have a bit of optimization to do with the feed rates etc. but I know there are tons of resources online regarding this sort of thing