About this page

Last year I got the idea to make a very basic CNC router. After exploring the internet and more specifically YouTube on homemade CNC’s I started making some concept designs and cost estimates.

Having no particular goal for the CNC, I decided to build a CNC router small enough to easily fit on my desk that I can use to machine and engrave wooden parts with acceptable tolerances for wooden parts (±0,1 mm).

Machines like the Nomad 883 from Carbide3D, Carvey from Inventables and various others were definitely an inspiration, and the fact that this CNC router would cost less than 10% of these machines definitely made me exited to at least give it a try.

Very early on I decided to film my ‘workbench’ and make a video series of the build process. You can find the videos I made plus additional information on this page!

A render of the complete assembly on my table. The white block represents the machining area.

  • Budget of roughly €200,-
  • Made with basic tools, no workshop.
  • Modular design
  • 5 short videos (HD), total of 20 minutes.
  • 2 extra videos


  • Arduino (GRBL) controlled
  • Ø8 mm linear rods & M8 thread leadscrew
  • Work area of 200 x 250 x 100 mm (x,y,z)
  • 250 watt flexible shaft driven spindle
  • NEMA 17 stepper motors and drv8825 drivers

Part 1: X and Y axis

In this first part i make the Y of the desktop CNC mill. The Y axis of the mill is mostly the same construction as the x-axis with only a difference in length. For that reason i only show the build of the Y axis in the video.

The axes are built out of a simple wooden case and the linear guides (steel rods) are attached to this case with small plates that can be adjusted to make everything level and perpendicular. In the middle of the steel rods is a leadscrew made from M8 thread with a ball bearing on one end.

More information about the linear guides

Selecting which linear guides to use was difficult. There were a few options for this budget:

  • Drawer rails
  • unsupported linear rods with bearing blocks
  • improvised homemade rails

I decided to use Ø8 mm steel rods with bearing blocks. These are very easy to install (and replace) and are the cheapest option in my case.

More information about the leadscrew

The movement of the plate along the length of the axes is done using M8 threaded rod (functioning as a leadscrew) and a stepper motor. M8 has a pitch of 1,25 mm. In combination with the stepper motor's 200 steps per revolution this gives a theoretical movement of 160 steps per millimeter or 6,25 micrometer per step.  One end of the leadscrew has a ZZ608 ball bearing and the other end has a flexible coupling connected to a NEMA 17 stepper motor.

The nut is made of leftover pieces of POM plate. As can be seen in the video i have made a custom tap out of the threaded rod to tap the holes in the POM. I did this by grinding three sharp edges with my flexible shaft rotary tool.

The improvised thread tap made from M8 thread

This way the thread has a very tight fit with no backlash so far. In the third video you can see me use this tool again with great results.

Part 2: The frame

In this video i make the frame of the router that positions and secures the X and Y gantry ‘cases’ that can be seen made in the first video. Besides that, the frame also provides space for the electronics in such way that they are easy to access but stay out of sight.

I have used MDF for this part because of the low costs and the fact that it is easy to cut. The cutting is done with my homemade table router but can easily be done with a normal wood saw.

More information about the design

To make sure the important dimensions are accurate, I designed the frame in such way that all the parts that are sandwiched between two side plates. The middle parts are from the same saw cut so that they are exactly the same length. The cutting of the square and rectangular parts was done by a local hardware/DIY store under close supervision of me ;).

Part 3: Z axis and spindle

In the first part of the video you see me building the Z axis case. After finishing the case I fix the unit to the X gantry after which I do the first testing with the spindle.

The design of the X and Y axis could not be used for this axis because of the small dimensions. I chose to make sure the position of the holes for the steel rod are very accurate so that the adjustable blocks were not necessary.

More information about the clamping system

I have altered the design that is seen in the rendered image because I thought of an easier (and sturdier) way to make this assembly using aluminium profile I found in a hardware store. Using my vice and a hammer I bent aluminium profile and made a clamping system to secure the spindle handle to the Z axis plate. For now I only have one of these clamps, but in the future i am planning to add another clamp like this to keep the spindle more secure in place.

More information about the improved nut

This time I slightly improved the process of making the POM nut. By gluing the pieces together with cyanoacrylate glue i obtained a ‘solid block’ with the right thickness to make the nut with.

Then I used the tool to tap ‘perfect’ thread in the block, by screwing in the tap a few turns and removing it repeatedly until the thread was all the way through. After tapping  I attached the tool to my cordless drill to finish the tap, which is seen in the video.

More information about the spindle

The spindle used for the router is a hand piece connected to a 1/3 horsepower (250 watt) motor using a flexible shaft.

There are four reasons why I expected this to give better results than a rotary tool such as a dremel, which is commonly used in homemade CNC’s like this one:

  • Better quality and higher quantity of bearings in the hand piece
  • Smaller load on the stepper motors due to the low weight of the hand piece
  • Trans locating the vibrations of the motor away from the Z axis assembly
  • High power (torque) of the motor that exceeds rotary tools

Part 4: Electronics

In this part I show the electronics used in the router and how I connected and installed everything. The electronics for such a project were kind of unknown territory for me but ended up being really easy thanks to the Arduino platform and the people who wrote GRBL(hotlink?), which is Arduino software for CNC’s.

Show the list of electronic equipment

  • Computer power supply

I used an old computer power supply unit (PSU). I did not include it in the costs because these are practically free in second hand stores and it is likely that you have acces to a free one. Before using the PSU I made sure that the 12 volt line could deliver enough current to power my three NEMA 16 stepper motors at the stepper motor drivers's settings (see below).

  • Arduino uno V3

This is the most basic Arduino available. It is connected to the computer with an USB-B port and is also powered by this. These controllers are very cheap and if you do not know the platform, there is a lot of information available on the internet. The Arduino is flashed with GRBL version 0.9, which was done very easily by following instructions of a Youtube video.

  • CNC shield v3.00 from Protoneer
  •  3 stepper motor drivers ‘drv8825’

Potentiometer adjusted to Vref = 1 V. Current is around 2 A - only with active cooling! Microstepping at 1/16 for smooth movement. More information soon!

  • 5 limit switches

5 microswitches are used in 'NO' mode. The X axis has 2, the Y axis has 2, and the Z axis has only one, in the positive direction (up). While testing I noticed false triggers of these switches. To solve the false triggers, a 0,47 microfarad capacitor is placed over the cable that filters out the small voltage variations that are a result of the effect of a relatively large magnetic field (caused by the spindle's motor) on the cables.

  • A control panel with on/off switch, a LED power indicator and three control buttons.

Resistor to decrease brightness of LED, on/off button connected to PSU green and black, control buttons connected to the CNC shield, wich is standard in GRBL without having to costumise the code.

Part 5: Milling a jigsaw puzzle piece

In this final part you can see the router cut out a jigsaw puzzle piece.

Before the CNC could do this at 'high' speeds, the stepper motor drivers had to be put to a setting to deliver higher current to the stepper motors. Before this moment, the stepper drivers were on a low setting to prevent overheating. Because the high current increases the heat output of the drivers a fan also had to be installed.

As I did not have a caliper nearby I do not know the exact dimension of the parts yet. The fit of the two pieces however shows a very decent accuracy and exceeded my expectations.

Show information about the parameters

Unlike metals, i did not know how to determine good cutting parameters to machine MDF. For the first tests I had to figure out what parameters (speed, step depth, RPM of spindle) work for the material. Because the rotary tool has a high RPM, I bought a single flute router bit to replace the standard 4 flute dremel bit i had before.

The first test was done at 350 millimeter/minute, with a step down of 0,5 millimeter. After a good result I increased the speed to 700 millimeter/ minute with good results too. I did not try more settings, since I did not have much time, but I am planning to do a more comprehensive test to determine the optimal toolpath settings.

Extra video's

Show extra video's

This is a video where I mill a shape (a deltoidal hexecontahedron?) in green floral foam using the homemade CNC router. This is the first 'real' test I have done with this machine. The g-code file with toolpaths is made with pycam 0.5.1.

Before finishing the router I used the axes as an improvised plotter.

Budget and used tools

Show the list of costs

This is the most accurate list of costs I could make since I did not track the costs of everything to the cents.

Most parts are bought from a local (dutch) webshop and from the hardware/DIY store. Some other parts are bought from Chinese webshops.

Some parts are not included, such as the flexible shaft motor, because i already own this and it is not exclusively used for this router. A flexible shaft motor like the one used for this CNC is only about €30,- euros on Aliexpress.

Part / material QTY Costs
MDF and multiplex (Wood) N/A ±€25
Rings, screws, nuts and bolts, corners N/A ±€15
Ball bearing ZZ608 3 €1,20
(chinese) Arduino uno 1 ±€8
Arduino CNC shield 1 €9,95
dr8825 stepper driver 3 €17,85
Stepper motor cable 3 €6,00
NEMA 17 motor 3 €36,00
Microswitch 5 €15,00
M8 thread 1 m 2 €6
Ø8 mm steel rod 1m 3 €10,50
bearing blocks Ø8 mm 12 €36,00
Flexible coupling Ø8 to M8 mm 3 €12,00
(old) PSU 1 €0
Buttons, capacitors, resistors N/A ±€10
  Total:  ±€208,50

Show the list of used tools

This is a list of tools I have used for this build:

  • Homemade router table
  • Old 'cordless' drill (battery  is dead, so I used the PSU as a power supply for this drill)
  • Ø22 mm wood spade drill
  • A rusty collection of old metal drill bits
  • Hammer
  • Metal saw 
  • File
  • screw drivers
  • Clamps
  • Try square
  • A (very bad) soldering iron

Result & side notes

This chapter is about the end result and the improvements I would make if I should do a similar build again. Overall I am pretty satisfied with the machine, knowing that there is still a few things to optimise and for this price.

For about €200 I’m now capable to CNC machine wooden parts. Not at a high speed, or without any bumps along the way, but having this option is still great. I will definitely try to machine some gears, specific parts for projects and engrave signs with this in the future.

At the start of this project there were no specific  requirements (in quantities) such as spindle feed rate and accuracy/repeatability. Due to all the unknowns I chose to first select minimalistic components and build the CNC router, and adapt the tool path settings to the limitations of the hardware.

Sidenotes regarding the costs

The costs of the wood could have been lower if I made a perfect design at the start and did not waste material, but the modular built-up and therefore the flexibility to change things was worth more to me than a bit of wood.

Costs of electronics could have been decreased if I bought it on Chinese web shops, but I chose a local shop for faster and better service. Afterwards it would have been wiser to order the parts cheaper with a longer delivery time and work on the rest of the project during shipping.

Also the micro switches used are overpriced and overcomplicated for my use. This could have saved me probably €10,- since basic microswitches are really cheap.

Sidenotes regarding the design

There are a few big design choices of the machine that afterwards I would have done differently.

  • 100mm Z movement

Afterwards this much vertical movement, or room, is probably not required. The moment force on the X gantry would have been lower if I chose a lower value.

  • Ø8 mm steel rods

These are very easy to (elastically) bend for the Z and Y axis; more then I initially expected when ordering. I presume this has a big impact on my machining accuracy. Afterwards I would have made homemade rails. Perhaps I will replace the X and Y linear rails with aluminium profile and ball bearing rail in the future.

  • Noise and dust

At the very start I wanted to build a completely enclosed case (to reduce noise and dust), but soon I determined to first start with a basic open frame to prevent possibly wasting a lot of wood on something that might not even work. Afterwards, I should have built it because even this small router makes a lot of noise and produces a lot of fine dust. If I want to use this more often I will have to make some kind of enclosure.

19 thoughts on “Arduino desktop CNC router

  1. Mani Reply

    Hello, such a wonderful project this is! I’m curious though, how do you specify an arbitrary motion profile to your motor via Arduino? Would you happen to have some code?
    Thanks!

    • Thimo Post authorReply

      Thank you Mani!
      Universal g-code sender has the option to use keyboard arrows to move the axes. Check video 3 for that. This is also the software used on screen in the 5th video.

  2. Paulson K Antony Reply

    Can I use this to mill PCBs?
    If it does, It’s PERFECT for me!
    Thanks a lot✌️

    • Thimo Post authorReply

      I have no experience milling PCB’s but want to try it as soon as I have time (I’m traveling atm). Nonetheless, I do expect this cnc would be capable of milling PCB’s.. but I might be wrong.

  3. Marcohernandez Reply

    Hi can you make me one and ship it to me on USA?how much would it cost me??

    • Thimo Post authorReply

      Thanks Mark, I will try that extension when I will work with my CNC again. Does it also support a third axis? I need this to do the stepdown in the g-code.

  4. joekutz Reply

    Gratulations to your machine!
    I was wondering whether the 8mm suspension rods might be too thin for the length and then saw your sitenotes. Also: I found that stainless steel threaded rods are more precise than standard ones, yours seem to look slightly wobbly. But really neat looking design.

    p.s. Someone else mentioned gcodetools, i use that inkscape plugin as well and can actually recommend it.

    p.p.s. I love the people saying “Hey, can you make another one and sell it to me” 😀 .. had the same in the comments to my machine.

    • Thimo Post authorReply

      Thank you! I built it with the 8mm rods with the assumption I can reduce my stepdown and toolpath speed to whatever still works accurately. Sacrifice some machining speed for cheaper and easier linear guides.

      I didn’t know about the stainless steel thread. perhaps has to do with the nickel layer on the standard ones. Perhaps it will be useful information for my next build!

  5. Michael Reply

    Great build, would really love to build one myself. Only questions I have after watching all your videos is: Length of the 8mm steel rods for each axis.

    Thanks a lot!
    Michael

    • Thimo Post authorReply

      Hi Michael, you should! 🙂 Do keep in mind that the 8 mm rods are very thin and bend easily, you might want to use different linear rails.

      I do not have my drawings nearby but I believe I defined the lengths this way:

      for X:
      width of work area + width of the carriage + thickness of the wood and attachment plates = length rod

      My x-axis work area is 200 mm, the carriage is 50mm wide, the casing wood is 12mm thick and the attachment plates are 15mm thick. The casing wood and plates are on both sides and thus count twice.

      200 + 50 + 2*12 + 2*15 = 304 mm (for the x-axis)

      For Y:
      length of the work area + length table + thickness of wood and attachment plates = length rod

      The y-axis seems different because it is the moving table design. My y-axis work area is 250 mm, the table is 300 mm (extra 50mm spare room), the casing wood is 12mm thick and the attachment plates are 15mm thick. Again the casing wood and plates count twice.

      250 + 300 + 2*12 + 2*15 = 604 mm (for the y-axis)

      For Z:
      I believe you should be able to figure that out now.

  6. Larry Fraysier Reply

    Hi,
    I would like to know about the stepper motors. What voltage and current are you running and what is the torque of the motors?

    Thanks,
    Larry

    • Thimo Post authorReply

      Hi Larry,
      The motor used are: ’42BYGHW811′. I have them running on 12 volt and a v-ref of ~1V that should mean a current of 2A for the DVR8825. The rated holding torque is 4800 g-cm.

  7. Peter Reply

    Good day I would like to ask whether you can provide documentation of your project to my mail, thank you

  8. Kevin Reply

    I see no cost or listing of the “250 watt flexible shaft driven spindle”. Details?

Leave a Reply

Your email address will not be published. Required fields are marked *