Store/Recall X,Y zero points

Hi, I recently purchased a Shapeoko XXL. I quickly learned that each new job requires you making a new X,Y zero point. At the same time the previous job X,Y zero is lost… My question is: How can I ‘store’ my own X,Y zero point locations and later depending on the job, then ‘recall’ it’s physical X,Y zero point position?..

I should mention that I want to use registration pins and therefore I can’t eyeball where the excact X,Y zero position for that job is supposed to be.

Thanks in advance,

I use the rapid positions. Or points known from rapid positions. Like front left corner, but +5mm in each direction.
I have the nomad though. Not sure how reliable the rapid positions are in the shapeoko XXL. I plan to do the same thing with the shapeoko

1 Like

So assuming you are using Carbide Motion for this then my recommendation would be to just use a MDI command to set the proper WCS and offsets. The real questions here are what type of workflow do you use and do you have a bit setter or touch probe? Somewhere on the forums is a post by @neilferreri with a MDI command to do just what you need. I’m not in a spot to look it up right now, but I’m sure it’s here somewhere… or someone will post on this thread with command you need. If there’s no response by the time I’m home I’ll see what I use and post it.

1 Like

Thank you. I believe you got me on the right track.
I can just drive to a rapid position, then zero the XY, then drive to an offset point where I want my initial XY zero point to be… And if I write a log that stores the XY zero point offset from the rapid position for each job, then I should always be able to find the exact XY zero point next time I do the same job.

Hi Mr. C,
Thank you. Your suggestion is also interesting… As you may have guessed, I am a beginner and now I see that it’s time for me to learn about MDI and WCS… I will start by looking for the post you suggested from @neilferreri.

Grbl (what Carbide3D Motion Board is based on) supports G10 and G92

I believe G10 is the preferred method.
I am unable to verify this on Grbl, so the following is untested code
Example of setting [default] G54 WCS (Work Coordinate System) Offset to -8.0" -8.0" MCS (Machine Coordinate System):

G90 G20 G10 L2 P1 X-8.0 Y-8.0

G90: Absolute programming XYZ
G20: Programming in inches
G10: Programmable Parameter Input

  • L2 = G10 sets Workpiece Offset
  • Tool P=1 G54 Work Offset
  • Linear motion to endpoint XYZ = -8.0000, -8.0000, 0.0000

Why negative? Machine X0 Y0 is at the top right (where it homes) so when you move the gantry towards you and to the left, it moves negatively in the coordinates. To get your current machine coordinates, I believe it is displayed in the Settings pane of Carbide Motion.


Since you are new you may not have seen posts about proximity sensors. On a stock Shapeoko with the belt Z during homing the homing switches are touched and then the axis move 6MM off from that point. The mechanical switches are not as accurate as the proximity switches so repeatability has be just a little off. Carbide 3d has been shipping the Z-Plus with proximity switches but I see no upgrades for older Shapeoko’s. The Original Beaver HDZ had proximity switches options but since that has become a part of Carbide 3d I have not seen those offered any more.

So just be careful even with the MDi interface because everything on rapid positions or absolute positioning is based on the homing cycle and because the stock switches can be off a little check your position before starting a job.

Earlier you had stated that the last Zero positions are lost. That is true if you set a new zero but just a power cycle the last zero for X,Y and Z are still retained in memory. Of course those positions are subject to the above exception about the homing accuracy with stock switches. Sometimes I run the same job a few times to make multiples and I do not reset Zero for each piece only on the first piece. However I do check periodically that zero is still maintained. The jobs I run are not affected by being off a few thousands but with pins for double sided jobs that is very different.


Hi Daniel and Guy,
Thank you for your input.

To clarify: My Shapeoko XXL has prox switches for homing. I also have the Z-Plus, zero probe and bit setter. My Carbon Motion is Build 513.

I entered Daniels code without any errors. But the Carbide Motion screen did still show the same XY location which I thought should have changed?.. Also, when I tried to jog, then any jog button made it move into the same direction (towards me and left), making the XY location on the screen more negative for both the X and Y axis.

Because my Carbide Motion is set for millimeters I also tried to enter G90 G21 G10 L2 P1 X-200.0 Y-200.0. That code also sent without any errors, but still no change of the XY location on the CM screen. However, this time I could jog normally afterwards.

I browsed to the links that Daniel provided and they are great. I just need time to study all that new stuff. I appreciate though if anyone could help me get started, suggestions for what I am missing and what I should try next?

I wrote a piece of software called “CMLauncher” where I can store as many “Zero points” as needed. You simply double click on the zero point you want and click a button to launch CM.

I gave Will a demo version, if he is ok with it I will make it available.

1 Like


I started a similar thread a few days ago and I received all sort of responses…
I reached out to Luke who is the product dev manager I believe and was kind enough to suggested that if I want more control I should look at something else other than carbide motion for the time being. - Fair enough.

The suggestion was to look at CNCJS. I did and its awesome for the more “advanced” users. This is what Carbide motion should be emulating rather than the “toy” app they provide.

You need to spend a few short moment setting things up a bit but then you will be able to do much of what you would want to do with different work offsets.

1 Like

The XY zero is stored on the controller, in EEPROM, so it will persist across power cycles and restarts. The only way you will lose your previous zero is by setting a new one. In Motion, “Clear Offsets” will also reset your previous zero. As @gdon_2003 mentioned, there is always the possibility that your reference point (homing switches) will be slightly off.
G28 and G30 are user-defined parking locations if you want a couple more locations stored in addition to your work zero. Are you planning on using multiple locations? You can always take note of the MACHINE position, but the precision of the limit switches still comes into play.
In your case of using alignment pins, the best scenario would be to not home in between operations. Alternatively, you could mill side 1 (with holes to register), and then your first operation for side 2 would be to mill the holes for the pins (wouldn’t matter where they are in relation to side 1).
If you want to reuse the same registration holes for multiple jobs, I still think you’ll need to set zero if you can’t trust the homing switches.
Carbide Motion is more than capable of all of this as it is just an interface to grbl on the controller. You do not need to use CNCjs to do any of this, and I say that as a member of CNCjs (whatever that means).
The post of mine mentioned above was, I believe, in response to a user that didn’t know how to jog using the MDI. That thread was removed for some reason just before the data loss on the forum.

1 Like

Nick and CR,
Thanks for your input. I checked articles and videos for CNCJS and feel it is promising, but still in its early stages. I also do like the CMLauncher ability to store the zero points. I wish Carbide Motion had the ability to do that by itself.

At this point however I want to fully test the method that Josh mentioned early in this thread, by just using offset from a rapid position. It means that my homing switches must repeatedly switch at the exact same physical position and I will need to keep my own log for the XY offset from the rapid position. I will post my conclusion after the testing.

@neilferreri: Thank you for your information.
I realize that any homing switch has limited precision. My XXL came with prox switches. Do you know if their repeatable accuracy has been tested and what accuracy I can expect doing several ‘Initializes’?

I don’t want to drill new registration holes each time I start a new job or flip a piece to mill the other side because then my waste board would quickly look like Swiss cheese :slight_smile:

I am planning several jobs using registration pins, each job has different zero point location. Some of the jobs are double sided. I first mill the 1st side, then treat parts of that side with epoxy (that needs curing) before I can mill the 2nd side. For practical reasons it may be few day’s before I get to mill the 2nd side and in the meantime I want to run other jobs that have different XY zero points…

If you want to try CMLauncher, you can find it here:



Nick Thanks,
I’ll give it a try.

@KHV I get sub-mm repeatability with my physical limit switches. For wood, I’ve never had an issue.

If I understand you now, you just want to be able to go back to a zero from a couple of days ago after changing zero a few times?

In that case, using G28 or G30 would be the simplest solution.
While the machine is at the XY zero you want to store, send G28.1 through the MDI. That will store your position. You can return to that position by simply sending G28 through the MDI. Note that it will move XY&Z siultaneously, so it’s a good practice to retract the Z first. Your G30 works the same way.

You can also just take note of MACHINE positions (I sometimes use a pencil on my wasteboard). Say your desired XY zero is at X-800 Y-420 (mm). You can send G53 G0 X-800 Y-420 (assuming mm mode which is default) and the machine will go to that spot. Then just set your zero there. It’s essentially the same as what @DanStory mentioned, but you’re saying “THIS is my work zero” instead of “My work zero is that far away from MACHINE zero”.
Lastly, you could use alternative work coordinate systems (G55-G59) as G54 is the default. You can store separate “work zeros” in each WCS. That can get messy if you forget to switch back to the WCS your job is in. I wouldn’t really recommend this unless you have an absolute need or you know exactly what you are doing. Apparently CM uses one of those WCS for something, but I haven’t looked into that.

Good luck!


Great info and I will try use the G28 and/or G30 for ‘my zero’ point storage…
Thanks, again :slight_smile:

…go put G28 on your code and tell me what happens. be careful with those recommendations people.

1 Like

As expected, my machine moved to my previously defined G28 position. XY and Z move simultaneously to get there. Are you having troubles with G28?

1 Like

G28 is a combo line of code, or a “two step” command. First it looks at an intermediate point (height of the spindle) then it rapid to XY. So you have to make sure that you have the correct Z height so that you don’t crash into a vise of fixture etc.

like I said, be careful how you implement that code.

1 Like