Largen table, some flex

I made a pretty big cnc, the pipes are 2200mm. I have some flexion in the center of the machine. I’m thinking what can be the easiest and cheapest way to solve this. I have 25.4mm and 1.5mm thick pipes. I could change them by 3mm thick pipes but I do not know if I am going to completely solve the problem. Another option is to modify the pieces to use more pipes, two exactly as in the original design and two others above.

Can you think of any better majera to solve this?



Why is it so wide, the long axis is supposed to be the table not the rails? It is made for ~48" wide you made it 86".

No thicker walls will not do much.

the long axis are the rails, the table is 3.2 x 2.2 meters

X:3200mm, Y:2200mm

That is really big.

You’re definitely in uncharted territory here, so it would be good to look at a machine that size as a research project. It might not work the way you are hoping, and the changes might not be easy or cheap to get it to work.

You can’t solve it completely. How much flex are you having and is it just in z or when milling is it also in X and Y? Does it bounce around when just jogging?

If the sag was predictable, you could compensate for some sag with a mesh. So, when the machine was near the middle, it would raise the whole Z to compensate for the sag. X and Y flex would be harder, so you’d have to really nail the CAM.

You can get a gut feeling by moving it with your hand, but it’s hard to predict exactly what the forces will be when you’re using it. Having actual test data with measurements is going to help you get some incremental improvements.

What are you milling that is that big?

1 Like

Aswers in bold.

I'm thinking about changing the 1.6mm pipes for others of 3mm thickness, and using the 1.6mm pipes above them to add rigidity. That is, the router running on four rails, not do this I will need to modify the 4 pieces that support the router, as well as the two where the Z-axis steppers are mounted. This would add some weight, but the steppers have enougth powerful, in fact, I had to modify the XYPlate because the steppers did not fits in. Do you think this will solve the problem?. Any less complicated or cheap solution?.


If it’s just the sag in Z, then the Mesh might be just the thing. It won’t be any material cost, and it could compensate for other issues as well. I’ve been thinking about trying this myself, but I have a grbl controller ATM. I use the bed leveling with a sensor on my 3D printer, which is less work, but works the same way.

In the Marlin firmware, it can store an offset Z value for several X,Y locations, so 0,0 might be -1mm and 0,100 might be +2mm. When it’s travelling in X,Y from 0,0 to 0,100, it will gradually adjust the Z between -1mm and +2mm. Your gcode won’t be any wiser, just the firmware will make the adjustments, and store the offsets for each place in the grid.

The procedure will basically be to go through each X, Y, in a grid, and find the right Z offset to store there. Then save that grid to the EEPROM. Next time the controller starts, the grid will be loaded, and you won’t have to redo the offsets unless there is a problem with it.

The two real tricks are:

  1. Creating a pretty repeatable process for starting the machine. If X and Y or Z are off (on either motor) then the grid won’t be right, and you’ll be doing more harm than good.
  2. Setting up the firmware to allow manual probing, or mesh bed leveling, without homing, since I’m assuming you don’t have endstops.

Here’s some more details about the leveling command, which gives you an idea of how it might work:

The trouble with doubling the pipes is that you’re doubling the weight, which will also need to be supported by the gantry. I’m not a mechanical engineer, so these things aren’t natural to me. But it seems like it would sag more because of the weight, despite the increased strength. Since the pipes are a huge fraction of the weight, it doesn’t seem like increasing the number of them will help enough to cover their weight.

this is very interesting. but it is not an easy task, most of the time there will be a small piece of wood on a huge table. It should ensure that the leveling is always on the piece to be cut, and not on fixed points throughout the table. Is it possible to achieve this in a more or less automatic way?

I need end stops to do a manual mesh bed leveling? How can I do a bed leveling without homing?

about the precision:


If you add a probe, you can measure the z offset automatically. I’ve never tried to do it mamually, but the idea of a sagging gantry seems like the perfect fit for a manual approach.

Automatic Z probing is really for ridiculous accuracy, for things like pcbs, or very fine carving. I believe you can configure the area to probe with the G29 commands, but I’ve only used it on my printer which is 200mmx200mm, so I just probe the whole bed.

This looks similar, but it’s a different set of commands if you have something like bilinear leveling enabled:

I was thinking of a manual mesh every 300mm or 400mm. That would probably give you great results. Save to the firmware, and cut for weeks. That’s what I think it would be like, but like I said, this is a bit of a research project.

I’m not sure about endstops. There is a SAFE_HOME_Z parameter that if you turn off might remove that requirement. I’m also not sure what would happen if you did a G92 X0 Y0 Z0, if it would set the machine coordinates or the work coordinates. I think there’s a very good chance we can find the right thing in the config though. If not maybe we could get Marlin to add it.

I dont know if this idea would work, but attached I had an idea for an internal truss system. Its just a length of allthread that goes inside the X Axis Tubes with some spacers to go inside the tube aswell. A couple of nuts to hold spacers an a large washer at the ends. The idea would be to Tighten the outermost nuts. Im not an engineer. For all I know, it could cause the tube to bend, wrinkle, or even collapse .

I think I’ll go for the automatic solution. I’m not sure how the autolevel knows which are the points on which it has to take samples or how many are. Is there any way that just pressing a button on the display can tell to make a sample every 20 centimeters in x and 20 centimeters in y and save it in the eprom?

If I have a mesh stored in the eeprom, will it be applied at any height? That is, if I’m going to carve on a 3-centimeter wood, will it apply the mesh as if it were on the floor?


There are settings in the configuration.h for the default grid. I think the G29 command can be used to adjust it though. Something like G29 F125 B145 L1000 R1020 blah blah. You won’t be able to do that on the display. You’ll either need to add it to the starting gcode or have a separate gcode file or use a computer. You could also use octoprint.

By default it gets applied to all heights. There is an option for it to fade out, but that only makes sense for printers.

There is some code for this floating around the forum, it works with only the older Marlin firmware, I had some issues trying to map out a custom area and could only get it working with the hard coded ''bed" size. Very interested to see how you get on as I’d love to have this as a feature.


I was using a push button that could fit into the spindle of the router.

[quote="jjwharris,post:15,topic:8241"] There is some code for this floating around the forum, it works with only the older Marlin firmware, I had some issues trying to map out a custom area and could only get it working with the hard coded ”bed” size. Very interested to see how you get on as I’d love to have this as a feature.

I was using a push button that could fit into the spindle of the router.


Very good idea!.

I’m making some progress. but I still can not get it to work.

Home is : Xmin, Ymin, Zmax (thats works fine).

When I start the auto-leveling process the following happens:

  1. Home All : first Zmax, then Xmin, and finally Ymin
  2. X moves to Xmax (software max 2560 more or less).
  3. the Z axis begins to lower until the probe endstop connected in Zmin (NC) touches the table.
  4. X moves to the next position, Step 3 again, but, without clearence. that is, the z axis goes down and down more and more. never goes up up before x moves to the next position. Thats ocurrs 10 times.
  5. The Y axis moves to the next position. Steps 3 and 4 are repeated 10 times more. But this time, before X moves to his next step, every time, Z makes the clearence.
that is, in a grid of 10x10, it does the procedure of the first 10 wrong, but the other 90 do it well.

I do not finish to understand where the problem is.


My relevant configuration:

//#define USE_XMAX_PLUG
//#define USE_YMAX_PLUG







#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR 1

// @section machine

// Travel limits after homing (units are in mm)
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS 2800
#define Y_MAX_POS 2000
#define Z_MAX_POS 150


// Set the number of grid points per dimension.
#define GRID_MAX_POINTS_X 10

// Set the boundaries for probing (where the probe can reach).


Configuration.h (59.1 KB)

That is great! You’re so close. I thought the endstop logic was going to be the most difficult, but that’s already working.

It’s weird that it’s not working for the first 10, but it’s fine after that. I wonder if something is binding, so it’s skipping steps?

Some things to try:

  1. Increase the Z_CLEARANCE_BETWEEN_PROBES. This is the Z it picks between probes. So if you went to 10, it should try to go higher.
  2. Decrease the HOMING_FEEDRATE_Z. By default, I think it’s set to 6mm/s (360mm/min). Maybe slower would make it less likely to bind?
  3. Run the autolevel (G29) from a laptop pronterface or whatever’s easier. It will print out the grid at the end, which will give you a sense of what it’s measuring. If it’s skipping steps, the first X row will be crazy. This is what mine looks like from my printer:
Bilinear Leveling Grid: 0 1 2 3 4 5 6 7 8 0 +0.032 +0.077 +0.122 +0.130 +0.105 +0.017 -0.108 -0.313 -0.520 1 -0.008 +0.035 +0.070 +0.082 +0.060 -0.028 -0.150 -0.325 -0.563 2 -0.030 -0.003 +0.047 +0.070 +0.040 -0.055 -0.173 -0.365 -0.613 3 -0.048 -0.025 +0.035 +0.042 +0.012 -0.080 -0.195 -0.403 -0.633 4 -0.065 -0.033 +0.017 +0.040 +0.005 -0.090 -0.215 -0.423 -0.630 5 -0.072 -0.030 +0.000 +0.012 -0.023 -0.125 -0.235 -0.423 -0.650 6 -0.072 -0.040 -0.003 +0.010 -0.015 -0.113 -0.238 -0.438 -0.650 7 -0.065 -0.040 -0.015 -0.010 -0.038 -0.125 -0.240 -0.428 -0.618 8 -0.085 -0.072 -0.043 -0.030 -0.045 -0.130 -0.250 -0.428 -0.613

The columns in these tables are X values, with positive to the right. The Rows are Y with positive down.

Can you attach a configuration.h to compare it with mine?

I can, mine is an MP3DP with a BLTouch, and 200mm wide, but I can share it. I’m away from my computer, but I’ll try to remember after lunch.