How to Make CNC Machine With Arduino
A bench-level guide to building a 3-axis router or engraver with an Arduino Uno, GRBL, and stepper drivers. You will see the wiring order, the step-per-mm math, and where a hobby build stops being accurate enough. Written for engineers who want to cut a real part this weekend, not a demo video.

In this article
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
What matters before you buy parts
What kind of machine you are actually building
The phrase make CNC machine with Arduino covers a wide range. In practice, an Arduino Uno running GRBL drives three stepper motors on a moving gantry, and a trim router or 500 W DC spindle does the cutting. The controller has no idea what the part looks like. It only counts pulses and flips direction pins.
That means the machine class is set by the mechanics. A plywood gantry with unsupported rod will flex under cutting load. A welded steel frame with linear rails and ballscrews will not. The electronics cost is nearly the same in both cases, around the price of one good spindle.
Decide the material first. Softwood, MDF, foam, and acrylic cut well on a light frame. Aluminum needs a stiffer frame, a slower feed, and a spindle with real torque. If your part is a metal bracket with a tolerance callout, the Arduino router is a prototyping tool, not the final process.
- 13-axis is enough for 2.5DPockets, profiles, holes, and V-carving all work with X, Y, and Z.
- 2Skip 4th axis on the first buildA rotary axis adds a driver, a chuck, and a lot of setup time.
- 3Budget the frame before the electronicsThe control board is the cheapest part of a build that cuts metal.
- 4Plan the work envelopeA 400 × 400 mm cut area is a practical first target for a garage build.
Parts list and how the signal chain fits together
The signal chain is short. A computer sends G-code over USB to the Arduino. GRBL parses the G-code and toggles three pins for step, three for direction, and one for enable. Each step pin goes to a stepper driver, and each driver feeds one motor coil pair.
For the drivers, a TB6600 or DM542 style module is a common choice for NEMA 23 motors. They accept 9–42 VDC and handle 1.0–4.0 A. NEMA 17 motors on a small machine can use A4988 or DRV8825 carriers, which top out near 1.5–2.0 A with cooling.
Power the logic and the motors separately. The Arduino takes 5 V from USB or a small supply. The drivers take 24–36 V from a dedicated supply rated at least 1.3 times the total motor current. Sharing one rail without filtering causes resets mid-job, which is one of the most common first-build failures.
Add limits switches on X, Y, and Z. They do two jobs: homing at startup and hard-stop protection. Wire them normally closed to ground so a broken wire reads as triggered instead of silent.
- 1Arduino Uno + CNC shieldThe classic GRBL 1.1 combination, 3 axes, USB interface.
- 2Stepper drivers sized to the motorCheck rated current on the motor label before setting the driver.
- 324–36 V supply for the motorsHigher voltage gives more torque at speed, within driver limits.
- 4Normally closed limit switchesSafer failure mode than normally open wiring.
Steps per mm, microstepping, and feed rates
Steps per mm is the number GRBL uses to convert a commanded distance into pulses. Get it from the motor, the driver, and the transmission. For a 200-step motor on a 2 mm pitch ballscrew with 8× microstepping, the math is 200 × 8 ÷ 2, or 800 steps per mm. Belt drives use pitch diameter and pulley teeth instead.
Microstepping does not add real resolution. At 8× or 16× the motor moves in smaller commanded increments, but holding torque per microstep drops. Most hobby builds run 8× on screws and 16× on belts because belt drives need smoother motion, not finer position.
Set the maximum feed rate from the machine, not the cutter. A light gantry starts ringing above roughly 2,000 mm/min. Start conservative, then raise it until the finish degrades or the motor stalls, and back off 20 percent.
Acceleration matters more than top speed on small machines. GRBL defaults near 10 mm/s² are too slow for production work and too fast for a flexy frame. Try 50–200 mm/s² on a stiff build and 20–50 mm/s² on a light one.
- 1Screw drive formulaMotor steps × microstep ÷ screw lead in mm.
- 2Belt drive formulaMotor steps × microstep ÷ (pulley teeth × belt pitch).
- 3Verify with a test cutCommand 100 mm, measure the result, and scale the setting.
- 4Keep a settings backupSend $$ in a GRBL sender and save the output to a text file.
Frame, spindle, and cutting parameters that keep the finish clean
Rigidity decides surface finish more than the controller does. A gantry that deflects 0.2 mm under a 20 N side load will chatter no matter how good the G-code is. Use the shortest possible Z axis, support the gantry on both ends, and keep the spindle nose close to the work.
For a trim router in softwood, a 6 mm two-flute upcut bit at 12,000 rpm and 1,500 mm/min with a 3 mm depth of cut is a reasonable starting point. In aluminum, drop to 1–2 mm depth, use a single-flute bit, and apply a light mist of lubricant. Climb milling usually gives a better finish on a rigid machine.
The Arduino itself has a real limit: roughly 30 kHz step frequency on an Uno. That is plenty for a router at moderate feed rates, but it caps how fast you can run a screw-driven machine with high microstepping. If you need more, move to a 32-bit controller board.
Dust and chips are the other finish killer. A shop vacuum at the cutter plus a simple shoe keeps chips from being recut, which is what causes most of the visible marks on a hobby router part.
- 1Short Z travel winsEvery millimeter of stickout adds deflection at the cutter.
- 2Start cuts shallow1 mm in aluminum, 3 mm in wood, then increase.
- 3Clear chips continuouslyRecut chips cause chatter and poor finish.
- 4Check torque on every boltA loosened gantry bolt shows up as a taper in the cut.
From CAD file to first cut on the Arduino machine
Start in CAD with the real stock size and the real cutter diameter. Model the tool as a cylinder and check every internal corner. A 6 mm cutter cannot make a 3 mm internal radius, and the CAM preview will show it as a rounded corner that does not match the drawing.
Export to CAM, set the zero point on the top of the stock, and choose a post-processor for GRBL. The post must output G21 for millimeters, G90 for absolute moves, and M3 or M4 for spindle control. If the post emits G28 or a tool change macro, delete it before running the file.
Air-cut the program first with the Z axis raised 20 mm. Watch the toolpath on the machine and on the screen at the same time. Any move that goes below zero in Z is a setup error, not a machine error, and it is much cheaper to find it in the air than in the stock.
Then cut a test part in scrap of the same material. Measure the result with calipers against the drawing, and correct steps per mm or tool diameter offset in CAM before running the real part.
- 1Model the cutterInternal radii must be at least the cutter radius.
- 2Zero on the stock topTop-of-stock Z zero is easier to re-set after a bit change.
- 3Air-cut before cuttingRaise Z 20 mm and watch the whole path once.
- 4Cut a test part firstMeasure and correct before committing the real stock.
When to stop tuning the router and order the part
There is a point where more tuning stops helping. If the drawing calls for ±0.05 mm or tighter, or the material is stainless, titanium, or a filled engineering plastic, the hobby frame will not hold it. Chasing that with more springs and slower feeds burns weeks.
A practical handoff is to send the same CAD file to a production shop and compare. The router gives you a physical part to test the design. The shop gives you the tolerances, the material properties, and the surface finish the final product needs.
Keep the router for what it does well: test fixtures, jigs, enclosures, and quick brackets that do not carry a tolerance callout. Those parts come back in hours and cost almost nothing in material.
If you already have a machined prototype that needs to move into a small run, the same file usually carries over. Send the STEP file and the drawing with the critical dimensions marked, and note which faces are cosmetic.
- 1Tolerance is the triggerTighter than ±0.05 mm means the router is out of its range.
- 2Material is the second triggerSteel, titanium, and Inconel need a production machine.
- 3Keep the router for jigsNon-critical fixtures are the sweet spot for a DIY build.
- 4Send STEP plus drawingMark critical dimensions and cosmetic surfaces clearly.
Step by step: assembling and tuning the machine
Follow this order. Skipping the electrical checks is how most first builds end up with a dead driver.
- 1Build the frame squareAssemble the base and gantry on a flat surface. Check diagonal measurements across the frame and adjust until they match within 0.5 mm. A skewed frame makes the machine cut a parallelogram instead of a rectangle.
- 2Mount rails, screws, and motorsAlign linear rails to a straight edge before tightening. Couple motors with a flexible jaw coupling, not a rigid one, so minor misalignment does not load the bearing. Leave the coupling screws loose until the axis moves freely by hand.
- 3Wire the drivers with the motors unpluggedConnect step, direction, enable, and ground first. Never unplug a stepper while the driver is powered. Set the driver current to the motor rating using the Vref formula for your board before connecting the motors.
- 4Flash GRBL and set the basicsLoad GRBL 1.1 on the Uno, open a sender, and send $$ to view settings. Set $100, $101, $102 for steps per mm, $110–$112 for max rate, and $120–$122 for acceleration. Save the output.
- 5Home and verify travel directionSend $H with limit switches wired normally closed. If an axis moves away from the switch, invert the direction pin with $3 rather than rewiring the motor.
- 6Calibrate each axis with a dial indicatorCommand a 100 mm move and measure the actual travel. If it reads 99.2 mm, multiply the current steps per mm by 100 ÷ 99.2 and rewrite the setting. Repeat until the error is under 0.05 mm over 100 mm.
- 7Tram the spindle and set Z zeroCheck spindle perpendicularity with a dial indicator on a 100 mm arm. Adjust the mount shims until the runout across the travel is under 0.05 mm. Re-zero Z after every bit change.
- 8Run a test cut and record the resultCut a 50 mm square with a 6 mm bit, then measure both the size and the squareness. Note the feed, spindle speed, and depth of cut that produced the best finish. That record becomes your starting point for the next job.
Arduino router vs production CNC: which one fits the job
Use this when a part is moving from prototype to a real specification.
| Factor | Arduino DIY router | Production CNC shop |
|---|---|---|
| Typical tolerance | About ±0.1 mm, setup dependent | ±0.005 mm on qualified features |
| Materials | Wood, foam, acrylic, thin aluminum | Aluminum, stainless, titanium, PEEK |
| Max part size | Usually under 400 × 400 mm | Up to 4,000 mm travel |
| Setup count | One part per fixture, manual zero | Multi-axis, fewer setups per part |
| Best use | Proof of concept and soft prototypes | Fit-check parts and production runs |
| Inspection | Calipers and visual check | 100% inspection before shipment |
| Repeatability | Drifts with frame wear | Documented process control |
Common questions about Arduino CNC builds
Can an Arduino Uno run a CNC machine reliably?
Yes, for a 3-axis router with moderate feed rates. GRBL 1.1 on an Uno handles look-ahead and produces a step pulse stream up to roughly 30 kHz, which is enough for most screw and belt driven hobby machines.
The limit shows up on high-microstep, high-speed machines. If you need more step frequency or more axes, move to a 32-bit controller board and keep the same drivers and motors.
Why does my machine lose steps in the middle of a job?
The usual causes are driver current set too low, acceleration set too high, or mechanical binding on one axis. Check first whether the axis moves freely by hand with the motor disconnected.
Then verify the driver current against the motor rating and reduce acceleration by half. If the problem follows a specific direction change, the coupling or the bearing preload is likely too tight.
Do I need limit switches on a small build?
They are worth the few dollars. Homing gives the machine a repeatable zero, which matters if you run the same job twice or need to re-zero after a power loss.
Wire them normally closed. A broken wire then reads as triggered and stops the machine instead of letting it drive into the frame.
What tolerance can a DIY Arduino router actually hold?
Around ±0.1 mm on a well-built machine in wood or plastic, and worse in aluminum because of tool deflection. Frame stiffness, screw quality, and spindle runout all contribute.
Measure it rather than assume it. Cut a test part, measure the critical features, and treat that number as the machine capability for that material and cutter.
Can I machine aluminum on an Arduino router?
Light cuts in 6061 are possible with a single-flute bit, a shallow depth of cut of 1–2 mm, and a lubricant mist. The finish will not match a production mill, and the cutter wears faster.
If the aluminum part has a tight bore or a flatness callout, the router is the wrong process. Use it to prove the shape, then machine the real part on a production machine.
How do I move the design from the router to a production shop?
Send the same STEP file you used for CAM, plus a drawing that marks the critical dimensions, tolerances, and surface finish. Note any cosmetic surfaces and the material grade.
A DFM review usually comes back within 12 hours and will flag features that are hard to hold, such as deep narrow pockets or thin walls. Fix those in CAD before the run starts.
Need the part in metal, not wood?
Send your STEP file and drawing. We quote with a free DFM analysis within 12 hours and start production within 24 hours, from one prototype to a 10,000+ part run.
12-hour quote±0.005 mm tolerance100% inspection before shipment