Introduction: Make a CNC Mill With a Laser Cutter

So, you have a CNC laser cutter but you want a CNC mill? Problem solved.

This project is a small CNC mill that can be assembled from store-bought and laser-cut parts for about $800 without machine tools. (If you have access to a shop with a chop saw and a drill press that'll be helpful, but you can get by with a hacksaw and some wrenches.) As pictured it has about a 4" x 6" x 1.5" working volume, but it can easily be expanded and modified.

The killer app for this is making custom printed circuit boards. But it can also make plastic and wood machine parts (including all its own parts), mill custom aluminum instrument panels, create stencils, and make artistic etchings for print-making.

I've included both Adobe Illustrator and Autocad DXF files for the custom parts, as well as an Arduino sketch for controlling the brushless motor.

The Steps:

(1) Setting expectations, and words of caution

(2) Buy parts and find tools

(3) Laser cut the custom parts

(4) Assemble the Z-axis and spindle

(5) Assemble the X-axis carriage

(6) Assemble the Y-axis and bed

(7) Assemble the frame

(8) Wire it up

(9) Tuning, tweaking, and milling tips

(10) Software you may find useful

Step 1: Setting Expectations, and Words of Caution

Prior art:

openMill is really cool, but it's not the first or the best table-top mill out there. We're huge fans of the MTM projects at MIT (particularly the work of Jonathan Ward, Ilan Moyer, and Nadya Peek), and Othermill, which were great sources of inspiration and ideas, many of which we shamelessly duplicated. The Shapeoko is another great example, and there are tons of other people doing neat DIY CNC projects, each with their own strengths and weaknesses.

We focused on making openMill easy to source parts for, build, and modify - even at the expense of design elegance or performance. You'll almost certainly see parts of this design you want to change - that's the point! We've tried to make it easy for you to make the changes you want.

How well will openMill perform? It depends on how well you build it and how well you use it. If it's well built, lubricated, and aligned and you keep the materials feeds low you should be able to get precision in the .001" range. But if you don't make sure the frame and rails are square and try to mill hard materials too fast then you'll get backlash and chatter.

More generally, even though it may only take you a few hours to assemble the mill, this project isn't really plug and play. Machining is hard, so expect a learning curve before you go from functioning mill to quickly making useful parts. You'll probably break some bits by trying to run bad G-Code. You may not get the axes well aligned on your first try. openMill can't stop you from doing things wrong (including things that will destroy the mill). But the fact that the parts are all cheap makes this a fun way to learn and experiment.


We've also worked hard to keep the costs low and the design robust, so you can make an openMill for about $800. But you should budget some extra money for duplicate parts in case you make a mistake or break something. And once it's working you'll find that you want to buy a few more endmills and some raw material to experiment with. We've tried to make it easy to upgrade. For instance, if you want to add a fancy lead-screw and wear-compensating nut (and boost the project cost by about $200), the parts already include mounting holes for them.

openMill is a high-speed super-sharp rotary cutting tool that moves robotically by itself without regard to the presence of valuable objects (read: fingers) in its path. It can easily put a hole all the way through your iPhone and the hand holding it, throw a metal shaving (or broken bit) clear through your eye, or set material on fire with friction. It also doesn't have shields or safety interlocks. So respect the potential for injury and danger, don't let it run unattended, wear safety glasses, and keep your hands away from it while the spindle is on. Seek adult supervision if you're under, say, 40.

Step 2: Buy Parts and Find Tools

I sourced the parts from:

McMaster-Carr (T-slot framing, acrylic, linear shafts, bearings, fasteners)
SDP-SI (Rotary shaft, timing belt pulleys, rigid coupler)
Inventables (Helical couplers, stepper motors, Arduino, GRBL shield)
Hobby king (Brushless motor and controller)
Digikey (Power supplies)

MSC Direct (Endmills and drill bits)

A full parts list is attached as a CSV file.

You can cut the laser-cut parts yourself, or send them off to an online service. I've had good experiences with

Tools you'll need:

Chop saw for aluminum framing (or hack saw and some elbow grease)
Drill press or vertical mill for boring out the rotary shaft (optional, but helpful)
Bench vise for press-fitting bushings (But you can get by with a 1/4-20 bolt and some wrenches)
Imperial and metric hex wrench sets
Philips screw driver
7/32 crescent wrench
Soldering iron, wire clippers
Metric ruler

Step 3: Laser Cut the Custom Parts

Now you'll need to fabricate the custom parts from 1/4" (6 mm) acrylic. Acrylic is a fantastic material because it's cheap, it laser cuts great, and is very rigid. Most of the holes in the custom parts are clearance holes, so it doesn't really matter if they come out a little big or a little small. But many of the bushings are press-fit, so these holes need to be the right size. This is tricky, because if your laser spot is bigger, out of focus, or just very hot you'll get a slightly larger hole. I put the press-fit holes on a separate layer in each file so you can adjust their size (after cutting test-holes) until you get a nice firm press-fit. (Make sure the hole centers stay in the same place!) If you're sending the files off, error on the size of holes that are too small. It's much easier to open them up with some sandpaper than to make them smaller. (However, lining them with epoxy will work for this in a pinch.) You'll notice that the top side of the cut hole is usually a little larger than the bottom side. This can act as a wedge to help you seat your press fit parts.

All of the 1/4" thick parts can be cut from two 12"x24" sheets of acrylic. White acrylic is easy to get and looks great, but you could use clear or any other color for a custom look. There are also a small number of 1/8" thick parts (These are the captive teflon nut holders, in the layer "Thin"). These will all fit easily on a 6"x6" sheet.

If you want to try making your parts out of a different material (MDF, aluminum, delrin) then go for it. But acrylic works pretty well...

Step 4: Assemble the Z-axis and Spindle

Now you'll actually start assembling! We'll start with the Z-axis.

(1) Use 4 flanged bushings and 2 1-inch brass sleeves to join the top and bottom plate of the Z-axis. Use a bench vise to press the flanged bushing into the sleeves to clamp the acrylic in place. (This is a very firm press, but is necessary to keep the joints from rattling apart due to milling vibration.) If you don't have a vise you can make one using some washers, a 1/4-20 bolt, a 1/4-20 nut, and some wrenches. Don't over-press or you'll crack the acrylic. Once the bushings and sleeves are mounted to the plates, make sure that a 3/8" shaft will slide smoothly through each assembly. If not your bushings are probably misaligned. A little more pressing will straighten them out. If you don't get smooth sliding motion your Z-axis won't travel well, so fiddle with this until you get it right.

Pro Tip: If you've got a press-fit that won't quite go in, cool the inside part on ice to shrink it.

(2) Now add the spindle sleeve. This is clamped with a flanged bushing in the top plate, but extends through the bottom plate. Again, use a bench vise to seat the bushing into the sleeve.

(3) Mount the captive teflon nut assembly.

(4) Add the 1" stand-offs (and the 4-40 screws that hold them in place).

(5) Drill out the rotary shaft. This is optional but helpful - if you drill out the shaft you'll be able to choke up farther on your endmills and drill bits, which will reduce flex and vibration. But to do it you'll need a drill press and a vise to hold the shaft. Use a #29 bit and plenty of cutting fluid. Starting the hole with a center drill is also quite helpful.

(6) Add the ball bearings, 1/4" rotary shaft, thrust washers, rigid shaft coupler, and timing belt pulley. When you tighten the timing belt pulley onto the shaft, press down on the pulley to create preload on the shaft. You should have enough preload that the shaft can't slide up and down through the bearings, but it should still spin freely.

(7) Mount the motor to the lower plate using M3 screws, but don't tighten them down all the way. Then add the 2nd timing belt pulley and belt. Now you can tension the belt by pulling the motor away from the spindle shaft and tightening down the M3 screws. The belt doesn't need to be tight - just snug. You should now be able to spin the spindle shaft by turning the motor. If you feel resistance ease up on the shaft preload or belt tension.

Step 5: Assemble the X-axis Carriage

This X carraige holds the Z-axis assembly and allows it to move up and down, and also slides along the X-axis rails.

(1) Start by press fitting flanged bushings into the rail holes, and clamp them by press fitting them into 1/2" brass bushings. Again, a 1/4-20 bolt can function as a vise to press fit these in a pinch.

(2) Mount the 20 mm right angle brackets to the side plates (with M5 screws and locknuts), and one NEMA17 stepper motor (with helical coupler) to the top plate (with M3 screws). Also, add the captive teflon nut assembly to the side plates (4-40 screws and nuts). You only really need one captive teflon nut. But if you're clever you can probably figure out how to preload two of them to reduce backlash.

(3) Mount the 4" rails and the Z-axis parts that go on them. Don't forget the thrust bearing and shaft collars!

(4) Use M5 screws and locknuts to screw the side and top-plates together. But before you tighten them down, slide 3/8" shafts through the X-axis bearings. This will ensure that you don't tighten down the assembly in a way that's misaligned. If the bearings on each side aren't lined up, the carriage won't slide smoothly. You may need to un-tighten and re-tighten the screws holding the carriage together until you get smooth sliding from both rails. Also make sure that the Z assembly will slide smoothly along the vertical rails. This is critical to getting smooth motion - the motors will be able to push a poorly aligned carriage along the rail, but it will stick and slip and cause backlash, rather than sliding smoothly.

Step 6: Assemble the Y-axis and Bed

This part is easy, but again, don't tighten everything down until the rails are placed in the bushings in order to ensure alignment.

(1) Press fit the flanged bushings into the 1/2" sleeves on the bed face plates.

(2) Mount the teflon captive nuts to the bed face plates.

(3) Screw each bed face-plate into the 3" stand-offs using 4-40 screws.

(4) Thread 3/8" rods through the face plates and tighten everything down.

(5) The mill bed is made of two layers of 1/4" acrylic. The bottom layer has small holes that are designed to be tapped for 8-32 threads. These are super-useful for clamping to the bed, so tap these holes. (This is a little bit of a project with a hand tap - you'll be sore afterwards.) Once the holes are tapped, fit the bed over the pegs in the top of the face plates, and secure it with acrylic cement or epoxy. The top layer is a waste board, and has 8-32 clearance holes so 8-32 screws can reach the tapped holes in the bed.

Step 7: Assemble the Frame

The aluminum T-slot framing is a little expensive, but it's super easy to modify and re-use, and it's also quite rigid when assembled correctly.

(1) First, cut the 4-foot lengths of framing to size. You'll want pieces that are: [piece lengths]. A chop saw works great for this, but you can do the same job by hand with a hack saw.

(2) Now use 20 mm spacers (with M3 screws) to assemble the rail mounts, and mount them to the cut T-slot framing (with M5 screws). (This turns out to be a lot easier to do before the frame is assembled than after.) You don't need to tighten the screws down - you'll want to be able to slide the mounts around to align them. Also mount the foot plates and rubber feet.

(3) Now assemble the framing using end-feed fasteners and corner brackets. However, as you build it, you'll want to mount the rails, shaft collars, and carriage assemblies.

(4) Once everything is basically put together you'll want to ensure that the X- and Y- assemblies slide smoothly on the rails, and are perpendicular to each other. If not, loosen up the rail mounts and nudge them a little before retightening them. This is a critical stage - your mill will only be as good as the smoothness of the travel and the perpendicularity of the rails. Also make sure that the Z-rails are pointed up, rather than canted forwards or backwards.

(5) Once everything is sliding smooth and straight, add the threaded rails and couple them to the motors using helical couplers.

(6) Use standoffs to mount your Arduino to the mounting board, and end-feed fasteners to mount it to a rail.

Step 8: Wire It Up

Now it's time to wire things up! Pop the GRBL shield into the Arduino, then:

(1) Wire motors to the GRBL shield. If your motors don't have connectors on them, you can just take them straight to the screw headers. If they already have a Mate-N-Lok connector (or similar) on them it's worth the time to make an adaptor. (Mate-N-Lok to bare wire.) Check the GRBL shield documentation to make sure you wire the leads correctly.

(2) Wire a power adaptor to the GRBL shield. Again, it's worthwhile to make an adaptor so you can easily unplug power from the shield. I used a 2.1 mm barrel connector.

(3) Connect the brushless motor to its Electronic Speed Controller (ESC) using the 3 press-plugs. (Don't worry about getting the lead mapping right - if the motor spins the wrong direction when we eventually power it up you'll just need to swap two of these plugs.)

(4) Program the 2nd Arduino to control the ESC using the provided autoSpindleDriver.ino sketch. This sketch sends PWM signals to initialize the ESC (which will beep), and then slowly increases the throttle to speed up the motor. You can set both the rate and top speed by changing variables in the sketch. Don't connect the Arduino to your computer (eg. for programming) and the ESC at the same time. The ESC may overdraw current from your USB port and hurt your computer or the Arduino. Once the Arduino is programmed, disconnect it from your computer, and connect it to the ESC. On my ESC, the black wire goes to "Ground", the red wire to the Arduino's "Vin," and the white wire to a PWM pin, pin 10. The Arduino will draw power from the ESC once the ESC is powered.

(5) Fire up the ESC by plugging in the power supply. You should hear several beeps from the motor, and then it will start spinning up. If your motor starts, then suddenly stops it's probably because you ran it too fast and drew too much current for the ESC or power supply. Re-program the Arduino to drive it at a slower speed and try again. To stop the spindle, unplug the ESC from its power supply. If you notice the spindle spinning the wrong direction, turn everything off, swap two of the leads from the ESC to the motor, then try again.

(6) Power up the GRBL shield. Detailed instructions for setting motor current and configuring GRBL for your design are at: You'll need to give the shield some information about your mill, such as the amount of travel each step produces. With 200 steps/rev. motors, 20 rev./inch leadscrews, and 8x microstepping the shield will need to produce 1259.8 steps to move 1 mm.

Step 9: Tuning, Tweaking, and Milling Tips

Learning how to mill is a big job, but a few specialized hints for the openMill will help get you started.

(1) Really make sure the axes move smoothly and are parallel. Use a machinists square (or any other reliable right angle) to make sure.

(2) If you have too much vibration and noise from the spindle with the motor on, try changing the motor speed (up or down), and also check the preload on the spindle shaft. If the shaft is clamped by the pulley too tightly it won't spin smoothly - too loose and it won't rattle.

(3) It's common that the bed surface isn't totally flat relative to the tool movement. But you can fix this by using a large endmill to mill the bed (or part of it) flat. This is especially useful for doing fine etching, as with PCBs.

Step 10: Software You May Find Useful

All these tools are really cool, but sometimes they make mistakes. I always check the G-code they generate in a simulator to make sure they don't do anything crazy. Remember that GRBL can't always interpret all of the G-code that CAM programs generate, and this can cause problems too. Use at your own risk, and realize you may break some tools.

Universal G-code Sender - Cross-platform GRBL compatible software for sending G-code to the mill.

PCBgCode - This Eagle ULP generates G-code for isolation routing PCBs from EagleCAD.,803

Inkscape - Open-source vector graphics drawing.

MakerCAM - Free open-source G-code generation from uploaded SVG files.

OtherPlan - Free CAM software for G-code generation.


BruceF34 made it!(author)2016-11-05




BruceF34 made it!(author)2016-11-05


perfect combo realized.

Its on my list.. :)


J-50Break1 made it!(author)2016-06-24

I'm cleared for making parts, building the machine, and ultimately operating it. I want to build so many things just wanting for the lottery!!!

FabioF19 made it!(author)2016-06-19

How did you avoid the backlash due from the flexible shaft coupler ?

thevisad made it!(author)2015-12-17

I finally threw my OpenMill together. I had Polulu handle the laser cutting of the acrylic before I purchased my own. I added a few parts, misumi 2020 T brackets for the back side of the gantry arm and 2020 corner braces to support the upper gantry square and the lower connector on another axis. I also changed out the standard bolts to a PTFE impregnated threaded rod that cost just a couple of dollars more. I am using the latest 3.10 version of the Arduino CNC shield. This supports PWM modulated spindle speeds, meaning you only need one Arduino not two for this project from The Arduino Uno + CNC shield is just over half the cost of the one used in the article and it supports GRBL 0.9 which has the spindle speed functionality, properly.

2015-12-15 21.07.23.jpg2015-12-15 21.07.30.jpg2015-12-15 21.09.40.jpg2015-12-15 21.13.16.jpg2015-12-15 21.13.22.jpg2015-12-15 21.17.22.jpg2015-12-15 21.17.32.jpg2015-12-15 21.43.58.jpg2015-12-15 21.53.15.jpg2015-12-15 21.53.24.jpg2015-12-15 22.05.14.jpg2015-12-15 22.05.21.jpg2015-12-15 22.13.42.jpg2015-12-15 22.13.47.jpg2015-12-15 22.13.53.jpg2015-12-15 22.14.00.jpg2015-12-15 22.14.15.jpg2015-12-15 22.14.26.jpg2015-12-15 22.16.23.jpg2015-12-15 22.18.19.jpg2015-12-15 22.24.46.jpg2015-12-15 23.16.32.jpg2015-12-15 23.16.48.jpg2015-12-15 23.16.58.jpg2015-12-15 23.17.09.jpg2015-12-15 23.17.17.jpg2015-12-15 23.17.32.jpg2015-12-15 23.19.58.jpg2015-12-15 23.20.06.jpg2015-12-15 23.21.48.jpg2015-12-15 23.21.52.jpg2015-12-15 23.21.57.jpg2015-12-16 08.24.51.jpg2015-12-16 08.25.01.jpg2015-12-15 14.29.10.jpg2015-12-15 21.06.58.jpg2015-12-15 21.07.07.jpg2015-12-15 21.07.15.jpg
thevisad made it!(author)2016-01-05

I am completely gutting the build after having built the OpenMill and I am replacing all of the movement system with Openbuilds V Rails and V Wheels. Despite taking meticulous effort to ensure that everything was properly aligned during the build process. I found out that after the assembly, the Pololu acrylic cuts were not perfect and were causing an up repairable fault in the build. Some of the holes are slightly oblong on the Z axis, causing the axis to rock back and forth. One of the X axis holes was also slightly off center, causing the X Axis to stutter when moving back and forth on the rail. Considering the cost associated with building the OpenMill and the costs of replacing the movement, this build is prohibitively expensive. You can buy the entire OpenBuild CNC assembly, the spindle, controllers and upgrades forless then the cost of the original BOM. Add to this the cost of replacing a single piece of failed acrylic, the replacement parts for rebuilding it and the fiddling and the OpenBuilds is so much more cost effective. I still think it is a great project, but I would recommend anyone considering building this to steer towards something a little better designed.

bloomlj made it!(author)2016-01-02

relly a good project.


What laser you use for cut

smartDIYs made it!(author)2015-10-01

Wow, this is so cool.

thevisad made it!(author)2015-05-30

Sigh, I sourced all the parts spend several months doing so, getting everything in, buying the aluminum sheets and then asked someone to cut them using your files. They quoted me $7000 to convert and cut the pieces out of 1/4 inch aluminum. I took it to the shop at our local college today and they just scratched their heads and said it can't be done with the existing files.

florin2901 made it!(author)2015-04-13

To make laugh on myself.... I've made a sort of "wood-age-CNC mill".

My project was started in 2006 and I'm proud to see it working about 1 year for now.

So I can say "I MADE IT". My professor was the huge internet, taking for a base the basics of CNC movements and my background as a metal worker, in turning and milling operations for almost 12 years, it was simple but hard <do you get it? "simple but hard"> to start from a big nothing to my little CNC which right now is carving something religious.....

So, in other word's I MADE IT..... and I recommend to all who try to do something like this, when run into some difficulties.... DON'T STOP, GO AHEAD YOU WILL SUCCEED. That was my thought then and it will be allways.

2015-02-13 16.23.14.jpg2015-02-13 16.23.05.jpg
ravi8001 made it!(author)2015-03-22

I'm making this project according to given dimensions. please provide the videos when you were working on that...

el_peluzza made it!(author)2015-02-25

What a wonderful project! Sure it will be my next project. So I will try to improve it adding a recursive perk: a Bluray-diode engraver. Just a simple adaptation to the spindle mount and a dual mode calibration could do the trick.

Thank you so so much.

kingkhalid made it!(author)2014-12-24

i need a ardino progaram plzzzzzzzzzzzzzzzzzzzzz soon

%E9%A2%86%E8%A1%94DIY made it!(author)2014-07-09

I want to buy the where is unpowered spindle?

dronecz made it!(author)2014-07-02

Hi, I´m planning to use same brushless motor and ESC for my spindle but what I can not figure out from text and images is what power source are you using to power up ESC? Thanks for reply.

joebell made it!(author)2014-07-03

The spindle power source a 12V, 3A wall wart. (See the parts list for a part number.)

dronecz made it!(author)2014-07-03

Ok, I´m not in USA but this will help me find right power source. Are you powering just GRBL shield with this power source or whole setup? ESC is connected to power source through GRBL shield or directly? Do you have some schematic how is everithing wired together?Thanks

adexhoo made it!(author)2014-05-26

is the grblShield compatible with arduino mega?

joebell made it!(author)2014-07-03

No idea.

pasqua made it!(author)2014-05-15

Can you please explain how the carriages sliding the slide in the grooves of the aluminum bars? From the photographs is the one thing you can not see clearly. Sorry for my low quality English. Thanks

joebell made it!(author)2014-05-15

Hmm. During normal operation nothing should slide on the aluminum T-slot framing - the T-slot nuts clamp those parts in place. Instead, the parts slide along the round steel rails when the lead-screws turn.

However, during adjustment you can loosen the bolts fixed to the T-slot nuts, and then the nuts can slide along the channel. Does this answer your question?

pasqua made it!(author)2014-05-16

Yes, thank you. You've been very kind. Now I understand how it works. Great project.

ril3y made it!(author)2014-05-05

Honestly, you should just use a TinyG as this is what the othermill software uses. You could use othercam then.

joebell made it!(author)2014-05-06

Fair point. I picked the Arduino / GRBLshield config. because it gives you a little more mod. flexibility. And Othercam does a great job of making G-code paths and exporting them...

ril3y made it!(author)2014-05-06

I would have to disagree :) grbl is quite limited. That is why we made TinyG :) However I am biased!

RumBot made it!(author)2014-05-03

Don't forget about PyCAM!

joebell made it!(author)2014-05-06

Great point! I didn't include it because I haven't actually used it yet. But it's rising to the top of my queue...

RumBot made it!(author)2014-05-06

Also, as an afterthought...

You can also use LinuxCNC, which is an open source OS designed to handle G-code interpretation and communication with the motor drivers... basically it turns a partition on your HD into a MCU + GRBL.

GRBL seems really awesome, but I haven't got it to run code yet. The only thing I don't like about it is there's no tool change protocol yet (or have they added that already?).

Lastly, if you need a good motor driver shield designed to run with Arduino and GRBL, check this out! I got one, it's awesome.

liquidhandwash made it!(author)2014-05-04

Thats a great project, Im in the process of building a similar project but its a 3D printed mill, just waiting for parts to finhish it off .

joebell made it!(author)2014-05-06

That looks awesome!

pshoemaker1 made it!(author)2014-05-06

looks like a nice little mill, but I need a laser cutter - can this be modded into one? What would need to be changed out other than the tooling head?

joebell made it!(author)2014-05-06

Cool idea! But I think it's probably ill-advised for safety reasons: to make it work well you'd need an IR opaque, fire-proof, and very well ventilated enclosure, and probably also positive pressure air for lens protection.

You could mount a diode laser (1 W-ish) on the head and etch away paint, and get through paper and thin cardboard. But you probably couldn't do the kind of sturdy plastics you'd need to make more laser cutters... And I think the software mods to GRBL might actually be a little tricky, because you have to modulate laser power with travel speed.

shwp made it!(author)2014-05-04

Cool,that is an huge project!

jiajunwang made it!(author)2014-05-04


karcsika922 made it!(author)2014-05-04

That is so awesome, i like it!

Jan_Henrik made it!(author)2014-05-04

Awesome project!

ASCAS made it!(author)2014-05-03

SUPERB! A month ago I started a CNC project. I was stuck on the g-code stage, until you posted those links! Thanks bro, this is very useful!

ElectricSlim made it!(author)2014-05-03

This is fantastic! I have a feeling I will be building one in the near future.

andrea+biffi made it!(author)2014-05-03

I'm really impressed, that's an huge project! Awesome!