Zeroing tells your CNC router where the workpiece is. Get it right and the cut lands exactly where you drew it. Get it wrong and the bit plunges into the spoilboard, cuts air, or carves the design half off the edge of the board. This guide covers zeroing on a hobby router running GRBL or FluidNC, such as a 3018, a Shapeoko-style, WorkBee-style or other hobby machine, from homing through to re-zeroing after a tool change.
Machine Zero vs Work Zero
Your router keeps track of two kinds of zero at once.
- Machine zero is a fixed point on the machine itself. On a machine with homing switches, you find it by homing: each axis moves until it touches its switch. The controller then knows exactly where the spindle is, every time.
- Work zero (also called part zero or the work coordinate system) is the point on your workpiece that matches X0 Y0 Z0 in your CAM program. You set it, usually at a corner or the centre of the stock, and on the top surface.
The controller stores work zero as an offset from machine zero, in a slot called G54 (with G55 to G59 as spares). When you "zero" X, Y or Z, you are really saving that offset. The Work Coordinates Guide explains G54 to G59 in more depth.
Why homing matters
Because G54 is stored relative to machine zero, it only means something if machine zero is the same each time. If your machine has homing switches, home it ($H in GRBL) every time you power on, before you zero anything. Then your saved work zero is still valid after a restart, and you can recover a job after a crash or power cut.
Many entry-level machines, such as a lot of 3018 kits, have no homing switches. On those, "machine zero" is simply wherever the spindle was when you powered on. Work zero is lost whenever the controller restarts, so you must re-zero X, Y and Z after any power cycle, reset or alarm. Adding limit switches is one of the most useful upgrades for these machines, and homing is worth looking for when you buy (see Best Hobby CNC Router Under £1,000).
Step 1: Match Your Zero to Your CAM File
The zero you set on the machine must be the same point you chose in your CAM software. Check two things before you start:
- X/Y origin: is the CAM origin at the front-left corner, another corner, or the centre of the stock?
- Z origin: is Z0 the top of the stock or the bottom (the spoilboard)? Top of stock is the most common choice for hobby work.
A mismatch here is the single most common zeroing mistake. If CAM expects Z0 on the spoilboard and you zero on top of an 18 mm board, every cut starts 18 mm too high. The other way round, the first move plunges 18 mm too deep.
Step 2: Set X and Y Zero
Corner or centre?
Zero on a corner when the stock is square and you need the design a set distance from an edge. Zero on the centre when the design must be centred on the board, or when the stock edge is rough or uneven. For a centre zero, find the two edges in X, move halfway between them, then do the same in Y.
Method 1: Eye and a pointed bit
Fit a V-bit or an engraving bit, jog it down close to the surface over the corner, and line the point up with both edges by eye. With a magnifier and slow jogging you can get within a few tenths of a millimetre. This is fine for signs and decorative work.
Method 2: Edge finding
For better accuracy, find each edge with a known reference. A simple method on a router is to use a straight bit or a dowel pin of known diameter: jog up to the edge until a sheet of paper between the bit and the stock just drags, then move half the bit diameter (plus the paper thickness) further in and set zero. A mechanical edge finder in a collet works the same way at low rpm; the Edge Finder Guide explains the technique.
Method 3: An XYZ touch probe
A corner touch probe (often sold as an XYZ probe block) sits on the corner of the stock. The controller lowers the bit onto it, then moves sideways to touch each inside face, and sets X, Y and Z in one go, allowing for the block's dimensions and the bit diameter. Your sender software (Universal G-code Sender, gSender, Carbide Motion, the FluidNC WebUI and others) runs the probe routine; you tell it the bit diameter.
Method 4: Laser crosshair
Some machines have a small laser crosshair pointer clamped beside the spindle. You line the crosshair up with the corner and the sender applies the offset between the crosshair and the spindle centre. It is quick, but it is only as good as that offset. Check it by zeroing with the crosshair, then lowering a pointed bit onto the same spot and seeing how far off it is. Re-check if the pointer gets knocked.
Step 3: Set Z Zero
The paper method
- Fit the bit you will cut with and tighten the collet.
- Jog the bit over the stock, away from the edge.
- Slide a sheet of paper under the bit and jog down in small steps (0.1 mm, then 0.01 mm).
- Stop when the paper just starts to drag.
- Set Z zero. Ordinary printer paper is about 0.1 mm thick, so the true surface is roughly that far below; for most woodwork that is close enough.
Do this with the spindle off. Never put your fingers near a spinning bit.
A touch plate
A touch plate is a metal block of known thickness wired to the controller's probe input, with a crocodile clip or magnet that connects to the bit. The controller lowers the bit slowly until it touches the plate, which completes the circuit.
- Measure the plate thickness with calipers and enter it in your sender, or use it in the command below.
- Put the plate on the stock, under the bit. Clip the lead onto the bit shank.
- Test the circuit first: touch the plate to the bit by hand and check the sender shows the probe triggered.
- Run the probe. The bit comes down, touches, and Z zero is set at the plate thickness above.
- Retract, remove the plate and the clip.
Touch plate failures
- If the circuit does not complete, the bit drives straight into the plate. Always test the probe before probing.
- Some bit coatings do not conduct well. Clip onto a bare part of the shank.
- Probing with a V-bit point or a very small bit can damage the tip. Probe slowly.
- Forgetting to remove the plate before starting the job is common. Make it a habit to put the plate back in the same place every time.
The GRBL Commands Behind the Buttons
Your sender's "Zero X" and "Probe Z" buttons send G-code to the controller. Knowing the commands helps when something goes wrong. These work on GRBL 1.1 and on FluidNC, which uses the same G-code dialect.
| Command | What it does |
|---|---|
$H | Home all axes (needs homing enabled and switches fitted). |
G10 L20 P1 X0 Y0 | Make the current spindle position X0 Y0 in G54. |
G10 L20 P1 Z0 | Make the current position Z0 in G54 (paper method). |
G10 L20 P1 Z15 | Make the current position Z15 in G54, for example when the bit sits on a 15 mm touch plate. |
G10 L2 P1 X… Y… Z… | Type the G54 offset directly, measured from machine zero. |
G38.2 Z-20 F100 | Probe down up to 20 mm at 100 mm/min, stopping on contact. |
$# | Show the stored offsets (G54 to G59, G92 and the last probe point). |
G53 G0 Z-5 | Move in machine coordinates, ignoring work zero. On a typical GRBL setup that homes Z at the top as Z0, this lifts to 5 mm below the top. Only safe after homing. |
A manual touch plate probe on GRBL looks like this, with a 15 mm plate:
G21 G90 ; millimetres, absolute
G38.2 Z-20 F100 ; probe down until the bit touches the plate
G10 L20 P1 Z15 ; this point is 15 mm above the stock
G91 G0 Z5 ; lift 5 mm
G90 ; back to absolute
Change the Z15 to your plate's measured thickness. If the probe does not touch within the distance given, GRBL stops with an alarm rather than continuing.
On GRBL, G54 to G59 offsets set with G10 are saved in the controller's memory, so they survive a reset or power cycle. On FluidNC or another controller, check with $# after a restart before you rely on it.
The G92 caveats
G92 X0 Y0 Z0 also makes the current point zero, and some older guides and senders use it. It works differently, and that causes confusion:
- G92 is a temporary offset applied on top of G54. Your G54 value stays the same, and the two add together.
- On GRBL 1.1, G92 is not saved: it is cleared by a reset or power cycle. If you zeroed with G92, your zero is gone after a restart.
- A leftover G92 offset makes every later G54 zero look wrong. If positions seem shifted for no reason, check
$#for a non-zero G92 line and clear it withG92.1.
For everyday zeroing, G10 L20 into G54 is the clearer choice. Leave G92 alone unless you know why you need it.
Tool Changes and Re-Zeroing
When a job uses more than one bit, such as a roughing end mill and then a V-bit, each bit sticks out of the collet by a different amount. X and Y stay the same, but Z must be set again.
- When the first toolpath finishes, raise Z and stop the spindle.
- Do not move X or Y zero. Do not home or re-zero X/Y unless you have to.
- Change the bit.
- Re-zero Z only, on the same surface you used before (normally the top of the stock), using the paper method or the touch plate.
- Run the next toolpath.
When the top surface has been cut away
If the first tool has machined away the top of the stock where you would probe, probe on an area that is still at full height, such as a corner left untouched by the design. Some senders and machines use a fixed tool-length sensor on the bed instead: they measure the first and second tool on the same sensor and adjust Z by the difference, so you never need to touch the work. The Tool Length Offsets Guide explains the idea.
Your bit choice and cutting data also change between tools. Use the CNC Router Feeds and Speeds Calculator for a starting rpm, feed and depth per pass for each bit and material.
Common Zeroing Mistakes
| What happens | Likely cause | Fix |
|---|---|---|
| Bit cuts air for the whole job | CAM Z0 at the spoilboard, machine zeroed on top of stock | Match the Z origin in CAM and on the machine |
| First move plunges deep | The opposite mismatch, or touch plate thickness not entered | Check the CAM Z origin and the plate thickness setting |
| Design off the edge of the board | CAM origin at centre, machine zeroed at a corner (or the reverse) | Check where X0 Y0 is in CAM |
| Zero lost after a restart | No homing switches, or zero set with G92 | Re-zero after every restart; use G10 L20 and home first |
| Second toolpath too deep or too shallow | Z not re-zeroed after a tool change | Re-zero Z only, on the same surface |
| Everything shifted by a fixed amount | A leftover G92 offset | Check $#, send G92.1 |
| Bit crashed into the touch plate | Probe circuit not completed | Test the probe before every probe move |
Before running a new job, check the toolpath in a simulator such as the G-Code Viewer and Simulator, and run the first few moves with your hand near the stop button and the feed override turned down.
Frequently Asked Questions
What is the difference between homing and zeroing?
Homing finds machine zero using the limit switches, so the controller knows where the machine is. Zeroing sets work zero, the point on your stock that matches X0 Y0 Z0 in the CAM file. You home once at power-on, and zero for each new job or tool.
Should I use G92 or G10 L20 to set zero?
Use G10 L20 P1, which saves the zero in G54. On GRBL that survives a reset. G92 is a temporary offset that stacks on top of G54 and is cleared by a reset, which often causes confusing shifts.
How accurate is the paper method?
It is usually within about the thickness of the paper, roughly 0.1 mm, which is fine for most woodwork. For more consistency, use a touch plate with its thickness measured by calipers.
Do I need to re-zero X and Y after a tool change?
No. X and Y do not change when you swap a bit. Only Z changes, because each bit sticks out of the collet by a different amount. Re-zero Z on the same surface as before.
My machine has no limit switches. What should I do?
Re-zero X, Y and Z after every power cycle, reset or alarm, because machine zero is wherever the spindle was at power-on. Adding homing switches makes zeroing and job recovery much easier.
Summary
Home first if you can, match your zero to the CAM origin, set X and Y with an edge, probe or crosshair, and set Z on the right surface with paper or a touch plate. Use G10 L20 rather than G92, re-zero only Z after a tool change, and check $# when positions do not make sense.