Introduction: Homebuilt (DIY) CNC Router - Arduino Based (GRBL)

Picture of Homebuilt (DIY) CNC Router - Arduino Based (GRBL)

Already for a few months or even years, I was planning to build my own CNC milling machine. Now I decided it was time to do it! I read a lot about other DIY projects and in the end I liked the design from the Arduino CNC intstructable that I found here. Although the dimensions were unclear and the programming and calibration was all in Spanish, I figured all that out by myself. In the end, I only used the design for reference.

In this instructable, I'll try to explain my steps, from the very beginning of the design, until the very end of your first gcode.

Note: I used a 3D printer to make some of the parts, but if you're working accurately, it's possible to make these parts from wood as well!


I noticed some movement in my design after the first routings. A solution might be using thicker rods than the 12mm that I used. However: This design DOES work!! I'm currently still improving the design and might update this instructable in the near future! If you have any questions, please ask and I'll try to answer them.

If you like this instructable, please vote for me in the Arduino Contest. :)

Update - December 29th:I'm really blown away by all the interest you're all showing for this project! I'll try to add some results and video's this weekend. Currently I'm routing hard foam, since it's easy to test with. For harder material speeds need to be lower, otherwise the hang-though is a bit too much. I'm looking at a way to fix this (probably thicker rails) and will update this instructable as soon as possible. I know that there are some proven ways to solve this, but it's my goal to make it as cheap as possible. :)

Update - January 3rd: I added some results and video's in step 11. I'm still figuring out the CAM functionality of Fusion 360 and didn't have much time the past days, so the final 'C' is falling of the limits of the foam. ;) However: It's clear that the machine works and that some pretty good quality can be reached!

Update - January 30th: In the past weeks, I updated this instructable for the use of 18mm steel tubes instead of 12mm rods. Also, I designed more 3D printed parts for better/easier alignment of the parts. However, because of vacation and other projects, I haven't had much time to do more tests, so these will follow soon. The design is already much stiffer than before, so I guess I can increase the feedrate, even on wood.

Update - February 3rd: Waahjoo! Although I didn't update this page so much (I AM working on the machine), I just got the news that I won the First Prize in the Arduino all the things Contest! Thanks a lot to everybody who voted! I'm very happy with this!!

Have fun building!

Step 1: Materials

Picture of Materials

To make this CNC router, I used the following parts:

  • 1 piece of hardwood plywood, thick 18mm, 2.44mx0.61m (€32) (local hardware store)
  • 2 steel rods, diameter 12mm 2 steel tubes, diameter 18x1.5mm, length 900mm (€5.50) (local hardware store)
  • 2 steel rods, diameter 12mm 2 steel tubes, diameter 18x1.5mm, length 528mm (€3.75) (local hardware store)
  • 2 steel rods, diameter 12mm, length 188mm (€1.35) (local hardware store)
  • 12x 4x nylon linear bearing 12mm (€1.50) (local hardware store)
  • 8x nylon linear bearing 18mm (€3.50) (local hardware store)
  • 2x threaded rod, M8, length 1m (€4.70) (local hardware store)
  • 1x threaded rod, M5, length 1m (€2.25) (local hardware store)
  • 2x coupler nut 5mm-M8 (€2) (local 3D print shop,
  • 1x coupler nut 5mm-M5 (€1) (local 3D print shop,
  • 2x NEMA17 (Wantai 42BYGHW811) 1.8 degree/step stepper motor (€30) (local 3D print shop,
  • 1x NEMA17 (Wantai 42BYGHW208) 1.8 degree/step stepper motor (€12) (local 3D print shop,
  • 3x TB6560 stepper driver (€16.50) Ebay
  • 1x 120W (12v, 10A) power supply (€10) Ebay
  • 3x 4pin wire of 1 meter (€6) (local 3D print shop,
  • Some 608 ball bearings (€4) AliExpress
  • 1x Chinese Arduino UNO (€2.50) AliExpress
  • 1x Old laptop / raspberry pi / your own laptop (€??)
  • Some M8 nuts, some M5 nuts and some screws

Total: Around €140,-

Note that this does not yet include the milling device. I used a Dremel 8200 series to start, but will change to add my normal router to it, or make something like a DC spindle onto it.

Step 2: The Design

Picture of The Design

As explained in the introduction, my hardware design is based on the Arduino CNC instructable, that I found here. Since no exact dimensions etc. were given in this instructable, I made the design all by myself again in Autodesk's Fusion 360.

I designed it to have a range of ±70cm in y-direction, ±40cm in x-direction and ±10cm in z-direction.

Step 3: The Y-assembly

Picture of The Y-assembly

The y-assembly is one of the easiest (and biggest) parts to make. I attached a building drawing, in which all dimensions are in mm's.


  • Where 22-7 is written, this means that you need to drill a hole with a diameter of 22mm, and only 7mm's deep. This is for the bearings.
  • Panel A-A and C-C are identical.
  • Panel B-B and D-D are almost identical: In panel B-B you need to drill 1 22mm hole for the coupler nut between the stepper motor and the threaded rod. In panel D-D you don't drill this hole.
  • The 12mm holes in panels B-B and D-D are only 9 mm deep.

Update: 12mm rods seemed to hang through too much. Therefore, the design was changed for the use of 18mm tubes. The drawing with dimensions stays the same, ONLY in case of drilling 12mm holes, 18mm holes have to be drilled!

Before screwing the 80mm and 70mm pieces together, attach the first NEMA17 42BYGHW811 stepper motor to panel B-B. Then, attach the coupling nut and the threaded rod (cut it to 750mm) to the stepper motor. Now you can screw the 70mm and 80mm pieces together but don't attach the large board yet. Otherwise we won't be able to attach the x-assembly. You'll end up with something that looks like figure 3.

Step 4: The X-assembly

Picture of The X-assembly

The x-assembly contains some 3d printed parts. You can find these all on Thingiverse. For the x-assembly, you'll need:

  • 4x XY-joint
  • 2x Y-nut-holder

You can also make these parts from wood, but then you'll have to be a bit more creative yourself. :)

Saw the wood as shown in drawing, but don't screw all parts together before the Z-Block is finished (next step).

Note: In the left side panel, the 22mm hole is only 7mm deep (bearing) and the 10mm hole goes through. In the right panel, the 22mm hole goes through (because of the coupler nut).

Update: Just like the Y-Assembly, the 12mm rods have been replaced by 18mm tubes. Also, there are now some 3d printed parts used to help aligning these tubes. They are upload to thingiverse as well. Again: If you work accurate enough, it might not be necessary to use these 3d printed parts and make it from wood.

Step 5: Z-block Assembly

Picture of Z-block Assembly

One of the most difficult part is the Z-block. Drilling of the holes has to be very precise, otherwise the friction will be too high, since the steel rods won't be perfectly aligned with the holes in the side panels of the x-assembly. My tip is to use a mitre saw to cut the wood and a drill press to make the holes! For the larger holes, I first used a drill press to make a start and then a router to make enough space.

All black parts in the design are 3d printed, since it's easier to gain high accuracy then. Those parts can be found on the thingiverse link from the previous step. The white thingies are the nylon bearings.

The wood needs to be sawn and drilled as shown in figure 2.

Step 6: Assemble All Hardware

Picture of Assemble All Hardware

Now start assembling all parts. Begin with the Z parts, then connect them to the X-frame. Then attach the bottom part of the x assembly and attach all to the Y-axises. The 3D printed Y-Nut, X-Nut and Z-Block parts have space for a nut that goes over the threaded rods. Use these!

After assembling, make sure that you can move each axis by turning the threaded rod by hand. If this is very difficult, your alignment is probably wrong, causing a lot of friction. Reassemble and realign until this is all good!

In the end, you should end up with the full assembly as shown in the second image.

Step 7: Motordrivers and Wiring

Picture of Motordrivers and Wiring

With the motor drivers I used, the wiring should be as shown in figure 1. The ground on the left of the image, is the ground from the arduino (not from the 12v power supply).

The Phase A and Phase B can be found using a simple multimeter: The resistance over a phase (A+ and A- for example) is zero. For the wiring, it doesn't matter which one is A+ or A-, as long as the resistance between both A wires, is zero. Same for the B phase.

The switches on the motor driver are not really clear to me yet, but with S3 and S4 switched in this way, the step size will be 1/8 of the normal step size, resulting is much more gentle and precise steps.

The wiring on the Arduino is as explained in the grbl wiki on Github. For the minimum basics, we only have to wire digital pins 2-7 and GND to the stepper driver boards.

Step 8: Flashing the Arduino

Picture of Flashing the Arduino

Download and extract GRBL from Github and open the Arduino IDE. Via Sketch -> Include Library -> Add zip library select the 'grbl' directory from the just extracted folder. Restart the arduino IDE and under file -> Examples, there should now be a grbl example, named grblUpload. Open it and upload it to the Arduino.

Now open the Serial monitor (under Tools) and set baudrate to 115200.

You should now get the message 'Grbl 0.9j ['$' for help]'

So enter $ and hit return. Now enter $$ and hit return. There you should see all the current settings for your grbl, which should be as default. Now, you can change everything you need. Details are explained on the grbl Github. My settings are as attached, but if your axis move in the wrong direction (because you might have B- and B+ different for example), you should switch these.

Step 9: The First Circle

Picture of The First Circle

When the building and the flashing is done, it's time to do something! Download the Universal G-Code Sender here (info on Github, here) and connect to your Arduino with a baudrate of 115200 again.

Now power up your power supply and go to 'Machine Control'. You should now be able to move your machine using the controls on this display!!

Hook up a pen to your z-axis, and save this text (using notepad) as circle.gcode:

G17 G20 G90 G94 G54
G0 Z0.25X-0.5 Y0.
G01 Z0. F5.
G02 X0. Y0.5 I0.5 J0. F2.5
X0.5 Y0. I0. J-0.5
X0. Y-0.5 I-0.5 J0.
X-0.5 Y0. I0. J0.5
G01 Z0.1 F5.
G00 X0. Y0. Z0.25

When you go to the File Mode tab in the Universal G Code Sender, you open circle.gcode and as soon as you click Send, your machine should now start painting a circles with a diameter of exact 2 inches!

Step 10: Finishing

Picture of Finishing

As soon as you know your machine is working, it's time to hook up your router of dremel to start milling! Because every router is different from others, you have to be a bit creative yourself. But when you have come this far, I'm sure you'll get your router attached!

Good luck!

If you liked this instructable, please vote for me in the Arduino Contest. :)

Step 11: Update: Seeing It Work

Picture of Update: Seeing It Work

Ok, I was lacking some time this past week, but since I promised to show you guys some results, I did my best. I'm still figuring the CAM functions of Fusion 360 out, so as you can see in the images attached: The starting point of the sample was not correct, so that the final 'C' didn't fit. This had nothing to do with the machine, but with my abilities with Fusion 360.

As you can see: The finishing of hard foam is pretty good!

Note: The wooden piece is there to press the foam down. I didn't fix it too well, so it moved up a bit.

I'm very happy with the result so far!!

Step 12: After a Few Weeks

Ok, we're now a few weeks later. I tested some more and I'm very happy with the updated design.

Some facts:

  • I can route hardwood-plywood at a federate of 400mm/min with a 6mm 4-flute router bit and a depth of 2mm per pass.
  • I also tried the same feed-rate and same router with with a depth of 4mm per pass, but this caused the wood to burn because the friction was too high. The accuracy however, stayed acceptable, but I don't recommend this setting.
  • Because I used threaded rods instead of leadscrews, I have some backlash on the y-axis. This results in flattened circles. I can probably tune this a bit by tweaking the nuts under the x-gantry, but I'll probably switch to lead screws in the future.

Like I said: I'm very happy with it! Now I need more projects to use it for. ;-)


ProfeD (author)2018-01-19

Thanks for sharing it!

bparker2 (author)2017-12-04

Hi i have almost finished my router i used 5mm sheet metal. But im still confused as to what software is required ie starting with cad what format to save in then what cam software is required and what format to save in and then do i need a sender program? I keep looking but can not find a tutorial that even goes slow enough to know what the mouse has clivked on and also most are poor quality so again not able to understand. If anybody knows of a good tutorial using free software and sending the output to grbl i would be very grateful if you could point me to it.

ΓιώργοςΚ9 (author)2017-11-09

Very interesting project !!!

thanks for sharing!

i would like to ask you if you can send me in cad format the wooden chassis from this because i have a friend who has a cnc and i want to cut the wooden panels because i can not make them by hand,

Thank you very much !

LaxmanM1 (author)2017-10-07

Thanks for sharing.

esandor2 (author)2017-09-11

More Projects to do: mill a air blade for air turbine?

Ay31415 (author)2017-09-01

Thanks for sharing!


bill1959parker (author)2017-08-17

Hi i have built mine but not sure what bit to order i want to carve wood and cut 4mm plywood but can not find any writeup on router bits for use with a dremel or equivalent to a dremel mine is from maplin. Can some kind person please advise me on what bit to order from ebay by giving the ebay order number. It would be nice to know if there are different bits for different materials what bits should be used so i can buy a selection of bits.

KrutharthC (author)2017-08-05

can some please send me the schematics.

AlphaAndrew (author)2017-05-09

Hey guys,

I am in the process of making this project, and I too found it difficult to find the 18mm linear bearings, as well as the 18mm tubing. So instead, I am using linear cupboard drawer sliders. You can pick them up from your local hardware store. I am using two 700mm long sliders for the for the y-direction and one 400mm long slider for the x-direction.

For the z-direction, I am using the 12mm rods with 3D printed 'sleeves' that will act as the linear bearings.

Of course the original design will need some tweaks but I don't see why it can't be done this way. I'll update everyone once I have finished it.

Cheers, Andrew.

kid_boy (author)2016-11-17

i am so confusing. You do not use Limit Switches, how can machine know the 0,0 position? Thanks

Emi1988 (author)kid_boy2016-11-21

Hello, how to assemble a limits to an arduino?

gustavio101 (author)Emi19882017-04-06

Easy to program and make the circuit, hard to assembly right.

You would only need 2 buttons and 2 unused digital pins on the micro-controller, one for X as well as for Y. When the machine goes to it's endpoint it will hit the buttons and know to stop. You will have to implement this right in the existing code as well.

pfred2 (author)kid_boy2017-01-26

you just home the machine. There is usually a button, or buttons in the interface. I have an X on my machine table that I set it to. Then before I shut down I send the machine G0 X0 Y0 Z0 So it is in the home position when I start it up again. Because jogging manually to home is tedious.

MaikK1 (author)2017-03-10

What do you think about routing aluminum with this one?

gustavio101 (author)MaikK12017-04-06

There's a lot of difference in cutting metal than cutting wood or plastic, you would need another router for that (instead of the dremel). Unless you go with a low feed-rate and process as little material at the time as possible (about 0,2 in depth at Z).

Also consider using a tiny bit to put as little force on the axis as possible.

loganblankk (author)2017-02-03

Has anyone been able to find proper linear bearings for this build online? I haven't been able to find any that look similar to the images and the ones I did find were Flange Bearings but weren't 18mm in diameter.. Thanks!

call8212 (author)loganblankk2017-03-04

Im struggling to find 18mm nylon linear bearings as well! seems to not be a very common size

gustavio101 (author)call82122017-04-06

The answer is right above us.

Pablos Casita (author)call82122017-03-11

check it out at:

My proposal is to use 20mm rods and SC20UU bearings. I also made this CNC with 20mm rods and nylon linear bearings but then changed to SC20UU. A little bit more expensiver but much better.,searchweb201602_4_10065_10068_433_434_10136_10137_10138_10060_10062_10141_10056_10140_10055_10054_128_10059_10099_10103_10102_10096_10052_10053_10050_10107_10142_10051_10106_10084_10083_10080_10082_10081_10110_10111_10112_10113_10114_10078_10079_10073_10070_10122_10123_10124,searchweb201603_5,afswitch_1,ppcSwitch_4_ppcChannel,single_sort_0_default&btsid=0c58fe07-4194-4e45-a57c-79e07d6f04b9&algo_expid=ebef5cc2-ad64-4063-b23e-c02ea57bb4e7-12&algo_pvid=ebef5cc2-ad64-4063-b23e-c02ea57bb4e7

Yes, actually i did at:

AnasK26 (author)2017-03-22

how can i build it without having the 3d printed parts ? and wich type of wood is used ?

gustavio101 (author)AnasK262017-04-06

Looks like he is using MDF or other plywood, plywood found in furniture (not IKEA) is the strongest, but the strength goes linear with the price (upwards). I would say you stick to MDF in this case, it's almost as good. Regarding the 3d-printer people built stuff before such machines where invented. Making these pieces out of plywood or better yet metal shouldn't be to hard. Cut the metal pieces with a grinder and drill holes in it. No welding needed.

call8212 (author)2017-03-04

Has anybody been able to find 18mm nylon linear bearings online? Im in the states and I can't find these anywhere

gustavio101 (author)call82122017-04-06

Change the diameter to something you can find in a store, not to much work to re-design it. If you're unsure if it will hold together with let's say 15mm bearings then go with 20 or 22mm.

kavtoakustika (author)call82122017-03-20

My proposal is to use 20mm rods and SC20UU bearings. I also made
this CNC with 20mm rods and nylon linear bearings but then changed to
SC20UU. A little bit more expensiver but much better.,searchweb201602_4_10065_10068_433_434_10136_10137_10138_10060_10062_10141_10056_10140_10055_10054_128_10059_10099_10103_10102_10096_10052_10053_10050_10107_10142_10051_10106_10084_10083_10080_10082_10081_10110_10111_10112_10113_10114_10078_10079_10073_10070_10122_10123_10124,searchweb201603_5,afswitch_1,ppcSwitch_4_ppcChannel,single_sort_0_default&btsid=0c58fe07-4194-4e45-a57c-79e07d6f04b9&algo_expid=ebef5cc2-ad64-4063-b23e-c02ea57bb4e7-12&algo_pvid=ebef5cc2-ad64-4063-b23e-c02ea57bb4e7

AlphaAndrew (author)2017-02-13

Hi mate, cool project!

I am wanting to make it for a high school project and have a few questions. I'm quite new to arduino and electronics so excuse my lack of knowledge. However, I have used and worked around a few CNC machines before and am familiar with programs such as autodesk inventor, solid works, catia etc.

- In your pictures, you have an attachment connected to the shafts of the stepper motors. What are they called? I can't seem to find them.

- I cannot find the specific nema 17 motors you have listed, so would similar specification nema 17 motors still work?

- Would you consider this a hard project to complete? I do have a background in arduino/ electronics and love to make things, just wouldn't want to start something that I couldn't finish.

-Finally do you or anyone who has made this project have any tips for me?

Cheers! Andrew.

call8212 (author)AlphaAndrew2017-03-04


-I think as long as the nema 17 motor has a torque of at least 45Ncm they should work fine

ElaMiK (author)2017-03-01

hi can you post a full electronic schematic

AbdullahA251 (author)2017-02-18

Hi Guys!

It would be great if someone can list all the parts links (preferably from

Thanks in Advance

MechanicalFox (author)2017-01-11

Hi! I wanted to try building this but i need some help!

Why did you use two different types of motor for this project? What motors are used for the Z-axis and X-axis? How are the 3D printed parts in the front of the Z block secured to the rod? Thanks and sorry for all the questions!

Motors are listed in the BOM. I used 2 different types because the Z motor is cheaper and I didn't need it to be as strong as the others. The parts are connected to the Z rod with nuts that fit in the 3D printed part.

pfred2 (author)Azielaan0152017-01-26

I put my strongest motor on my Z axis. There's a lot of up, and down in cutting jobs.

lars668 (author)2016-11-26


is there more information available if i get a premium account or does this page (no premium account whatsoever) contain everything?

kind regards

jgzoom (author)lars6682016-11-30

There are 12 "steps" to this instructable, hit the next page button for more pages.. Otherwise, the only benefit of being a premium account is ability to download a pdf version of instructables IMO.

pfred2 (author)jgzoom2017-01-26

Pros get the pro badge too. At least we used to?

RussellC6 (author)2016-12-14

I found a Delrin source in the UK. You can get a sample, which should be enough to make several nut segments, for £5.

pfred2 (author)RussellC62017-01-26

I make lead nuts out of plastic bottles that I melt down. For cheap, free even.

JAYM127 (author)2016-12-12

I want to ask which software are you using for it??

Can you please help me out there.

Azielaan015 (author)JAYM1272017-01-12

Fusion360 to make the gcode, Universal Gcode Sender for control of the machine.

I'm having trouble passing the G-code from Fusion360 to the universal G-code sender, did you use a third part program or the built-in post from fusion360? If so did you have to tweak any settings? If you could link me to some tutorial that worked for you it will help a lot! Thank you!

RussellC6 (author)2016-12-14

You might try Nylon or Delrin "nut segments" on your Xlator Screws. Usually a 12 thread-long nut segment gives our machines a 5um backlash, but we use precision cut 3cm dia lead screws, not threaded rods. For Big Bucks, NSK makes the finest lead screws you can find.

Azielaan015 (author)RussellC62017-01-12

I switched to lead screws too. Will try to find some time to update the introduction of the article.

goprouser1 (author)2017-01-11

how did you set zero z axis height for the cutting tool,this is a nice build,i take it ,it could cut alluminium,albeit shallow slow passes,to upgrade it's self.

Nice job.

Azielaan015 (author)goprouser12017-01-12

You could do this with some resistance measuring between the router bit and a plate which you place on the bed. I do it on sight. Got used to do it like that with my 3D printer.

RobertO139 (author)2016-12-20

If you use fine thread rods it will reduce the backlash.

AXR AMAR (author)2016-12-15


AdityaP91 (author)2016-08-17

I have 2 dc outputs in my power supply how can i connect 3 tb6560.

ilp73569PP (author)AdityaP912016-08-22

What amperage is your power supply? If it is high enough bridge them together.

Image source :

AdityaP91 (author)ilp73569PP2016-08-25

10 amps i tried and connected them in parallel and they are working. My main doubt is will it effect the performance of my stepper motors. I am trying the H-bridge.

About This Instructable




More by Azielaan015:Personalised Kinder Surprise giftHomebuilt (DIY) CNC router - Arduino based (GRBL)Arduino wireless (433MHz) Time-Control switch for multiple devices
Add instructable to: