Modular DIY CNC

The first attempt at making a CNC anyone can have in their home office or workshop. This version can accommodate a Dremel, router, laser and more and can be adjusted to fit whatever your constraints may be.

This project was originally posted on Instructables


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

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 Instructable for Excel file (for all parts, prices, and links) along with STL files.

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 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:

GBRL Interfacing 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. (see Instructable for all files)

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

Leave a Comment

    Your Cart
    Your cart is empty