MarlinFirmware / Marlin

Marlin is an optimized firmware for RepRap 3D printers based on the Arduino platform. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.
https://marlinfw.org
GNU General Public License v3.0
16.17k stars 19.21k forks source link

auto leveling issue? #6399

Closed d2crafty closed 6 years ago

d2crafty commented 7 years ago

I already set up the autoleveling and had successful prints.. however now after it levels and starts printing.. one side of my brim is showing up as "too squished down" and the other side as though it is "normal" -- seems as though the sensor is not working as intended? I am doing a 9 pt probe. is there something I can do other than adjusting the bed screws to accommodate the leveling? this is for a prusa i3 clone thank you

Roxy-3D commented 7 years ago

To say it was something simple as, uninstall and reinstall sort of pisses me off

This isn't quite what you are talking about... But Slic3r and PronterFace and others use Java and Python. And I'm not 100% those subsystems have the user's best interest in mind. There is all kinds of flakiness and just installing or uninstalling one of those Java apps affects all of the other Java apps you have installed.

This stuff all needs to work better with other app's in the 3D-Printer ecosystem.

In the Python case... You have to follow a magic check off sheet to get everything installed so it works on a Window's machine. Come on... That is BS.

d2crafty commented 7 years ago

just curious, I get the msg OpenGL: Out of Memory. I have 3gb ddr5 memory on a 16GB of ram. I don't see how this is possible?

jasoncross commented 7 years ago

You can turn the encoder wheel to adjust what should happen at that mesh point. If you have bad adheasion at the mesh point, bring the nozzle down a little bit. If the filament is squished too thin at the mesh point, bring it up 'the right' amount.

If the nozzle is too close to the bed at that point in the grid, do I raise or lower the number?

Roxy-3D commented 7 years ago

The mesh numbers say what to do to the nozzle to make it track the bed. So if the nozzle is too close to the bed... What ever the number is currently, make it bigger. Make it more positive. Make it less negative.

If the nozzle is too far from the bed... bring the mesh point number down. make the mesh point number smaller. make it more negative.

If you have any adhesion at all... don't move the number by more than .15 mm .15mm will cause a visible difference in how the lines at that point appear. You want the mesh lines to be flat on the top (because they are being squished into the bed) and a little wider than the nozzle's extrusion hole.

jasoncross commented 7 years ago

Once I make all of the adjustments, do I do a G29 S1 to save to EEPROM? And then another G26?

Roxy-3D commented 7 years ago

Yes to both questions... You should see improvement in the mesh validation pattern. But some areas will still be wrong. They will be 'less wrong'. The process converges very quickly.

You keep doing the

until your mesh is perfect. 3 or 4 iterations will have it perfect.

jasoncross commented 7 years ago

Does a G29 P 1 override the fine tuning?

And is there any way to have UBL and Bilinear auto-level co-exist without firmware reflashing and having to rework the system? Just thinking about times where my mesh might be out of whack and I just need a quick center-of-the-bed print.

Roxy-3D commented 7 years ago

Yes, G29 P1 invalidates the mesh and start the auto probing.

All of the bed leveling systems are mutually exclusive. But if your mesh is bad, You can do a G29 P0 to set the entire mesh to 0.000 And you can do a 3-Point or grid based leveling of your bed. That is G29 T or G29 J3 You won't have the corrections for a non-flat surface. But you will have the system correcting for any tilt in the bed.

(I'm working on the G29 J3 right now... It is almost done.)

jasoncross commented 7 years ago

Ok, that's good to know.

I assume after a G29 P1 I'd also need to refill in where the probe couldn't reach. Any progress on your SmartFill update? How will that be invoked (or will it be automatic)?

Ok, so let's say I get my mesh all fine tuned. After each printer reset do I run a G29 L 1 to reload it, or will it reload automatically out of EEPROM? And when I go to print, do I just do a G28 (right now with the old systems I have gcode that runs G28 then G29)? What happens if a G29 command alone gets sent?

Oh yeah, and does G29 P0 invalidate the mesh when it turns off? Does a G29 L 1 re-enable UBL?

jasoncross commented 7 years ago

Oh wait, I see, G29 P0 sets to mesh to 0, it doesn't just disable.

Does a G29 T or G29 J3 with the mesh enabled compensate for overall tilt along the mesh? So if for example I have a good mesh on my build surface but the overall tilt gets off, could one of those correct for it?

Roxy-3D commented 7 years ago

If you are willing to do a small amount of editing... Here is the Smart Fill code:

https://github.com/MarlinFirmware/Marlin/issues/6241#issuecomment-296903599

If you save your mesh with the system active... The system will be active when you power up the printer. If that is how you choose to operate (and I do!!!), you never need to give your printer a G29 command.

If you save your mesh with the system inactive, the last mesh you had will still load. But the system will be inactive until you give it a G29 A command.

The G29 T and G29 J3 are there to support bed tilt. If you have a perfect mesh defined, but you some times get a small piece of plastic underneath the glass that cause tilt... This will correct for that you will still be getting the benefit of the mesh being applied for the non-flat surface.

jasoncross commented 7 years ago

Great - that is exactly what I was hoping. So I can set a mesh based on my glass and then use the others to compensate for when the glass tilt gets slightly off. Awesome. Does a G29 T or G29 J3 then require saving as G29 S 1?

So to be clear - if I have the mesh active and reset, my saved mesh is still active without needing to explicitly load it?

I have some sliced gcode with g29 already in it (I previously leveled before every print). Will invoking it be ignored, or will it reset my mesh?

jasoncross commented 7 years ago

Does a saved mesh survive a firmware upgrade or an m502?

Roxy-3D commented 7 years ago

Does a G29 T or G29 J3 then require saving as G29 S 1?

You can do that. But it is my belief the G29 T and G29 J3 are best done right after the G28 to correct for any imperfections in how the glass is sitting on your bed. I plan on using it before each print and then just discarding the results after the print.

So to be clear - if I have the mesh active and reset, my saved mesh is still active without needing to explicitly load it?

Yes. But if you don't want the mesh active at power up... You would do a G29 D and then save the mesh. The mesh will still get loaded at power up. But it won't be active in that case.

I have some sliced gcode with g29 already in it (I previously leveled before every print). Will invoking it be ignored, or will it reset my mesh?

You may want to change the Startup Gcode section of your slicer to not have any G29 commands. And if you want to keep using your older gcode files, you can just pull them into a text editor and delete the line with the existing G29 on it.

Does a saved mesh survive a firmware upgrade or an m502?

You can do a G29 S-1 to print out the entire mesh in a form that can be reloaded. Then upgrade your firmware. And load your saved file from the G29 S-1 into PronterFace. Then Print it. Your old mesh will now be loaded. You can do a G29 O to verify it is loaded. Then do a G29 S 1 and your old mesh will be resaved across a firmware update.

In general, your mesh should survive across firmware upgrades. But things are moving around a little bit right now. And saving your mesh by doing a G29 S-1 and saving the output as a my_mesh.gcode file will insure you can easily get it back if your mesh pattern does not survive across a firmware update.

Roxy-3D commented 7 years ago

Smart Fill and Mesh tilting now in RCBugFix if anybody feels like upgrading your firmware!

Tannoo commented 7 years ago

Awwwwe yeeaaah.

jasoncross commented 7 years ago

Smart Fill and Mesh tilting now in RCBugFix if anybody feels like upgrading your firmware!

I will load it up and give it a go. What is the command to have SmartFill run and fill in non-probed areas?

jasoncross commented 7 years ago

What is the command to have SmartFill run and fill in non-probed areas?

Found it. G29 P3 O

@Roxy-3D Have you considered implementing something like babystepping to fine-tune the mesh as a G26 is running? Having the ability to tune the Z distance on a given point as it's printing the pattern by turning the knob would make the whole process of fine-tuning easier. Otherwise it feels like a bit of a shot in the dark each time I refresh as to whether I have adjusted the offset enough or too much.

Roxy-3D commented 7 years ago

That is a good idea... But that is very complicated to do... Let me think about it. AND FOR SURE: That can't happen in time for the Golden Master release this weekend!

jasoncross commented 7 years ago

Aw sure it can! ;)

jasoncross commented 7 years ago

@Roxy-3D Out of curiosity what are you using as a probe for leveling?

Roxy-3D commented 7 years ago

On my gMax 1.5+ I have a BL-Touch probe. On my FolgerTech i3-2020 I have a servo with a probe leg that kicks down and at the end of it is a micro-switch with a roller on the lever arm.

jasoncross commented 7 years ago

So what does a plain G29 do with UBL enabled? Is there a page with all of the G29 commands listed out?

Roxy-3D commented 7 years ago

It pretty much does nothing... If you look at the front end of the ubl_G29.cpp file... All of the commands are documented.

jasoncross commented 7 years ago

Good, so if I print an older file with G28, G29 it won't break anything?

I was thinking about your recommendation of doing a grid or 3-put level of the mesh more often. What if a base G29 did that?

Roxy-3D commented 7 years ago

Well... To be honest... I think you will find you don't need to do that. The UBL System was designed to have the best features from each of the previous bed leveling systems. And to allow them to be combined and used together .

As it turns out... The mesh leveling with a tuned 10x10 grid is exceptionally good... You don't need anything else. And it is for that reason it has taken so long to get the Grid leveling added to the system. Mostly, I added it just for completeness. It isn't something people are going to use very often.

d2crafty commented 7 years ago

just curious. once I have the perfect brim from 1 g29, i should never g29 it again right?

Roxy-3D commented 7 years ago

Never is the wrong way to look at. If something happens... Like after a month of printing you get some wear on your linear bearings... You may need to adjust part of your mesh. But you don't need a G29 in your start up GCode for each print any more.

jasoncross commented 7 years ago

So frustrated. After many cycles of repeating I had a g26 grid that looked good. Was replacing my tape to print something and my glass lifted up slightly. pushed it back down and did a G29 J3 and then printed. In a relatively small area, parts of layer 1 were slightly high but close to good and others actually pushed into the tape. Way off again.

Also, when babystepping, should you see the effect immediately? I adjusted the offset from -1.4 to nearly -.4 while printing the first layer and saw no difference which seems...impossible.

Roxy-3D commented 7 years ago

In a relatively small area, parts of layer 1 were slightly high but close to good and others actually pushed into the tape. Way off again.

You should be able to load your mesh, do a G29 J4 and tilt your mesh. Probably it makes sense to not destroy the original mesh until you know the new mesh is better. But that should get things much better. (All of the updates and corrections to make this feature 'correct' were only in place a few days ago.)

If you want to see exactly what the G29 J4 does to your mesh.... Load the old mesh, do a G29 J4 and then do a G29 K 1 O (assuming you have your original mesh saved in slot 1) It will subtract Slot 1's values off of the current mesh in RAM. You can see how much of a tilt got added to your print surface.

Also, when babystepping, should you see the effect immediately? I adjusted the offset from -1.4 to nearly -.4 while printing the first layer and saw no difference which seems...impossible.

You don't see the impact immediately. But you will see the difference very quickly. The steps are fed into the position over time. With the printer not busy... You can crank the encoder wheel and see how fast the new position gets updated.

jasoncross commented 7 years ago

You don't see the impact immediately. But you will see the difference very quickly. The steps are fed into the position over time. With the printer not busy... You can crank the encoder wheel and see how fast the new position gets updated.

I wonder if something is not working there? I crank the wheel and see no change, busy or not. This is what I have in my advanced config:

define BABYSTEPPING

if ENABLED(BABYSTEPPING)

define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!

define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way

define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion.

define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping

define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.

define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.

                                    // Note: Extra time may be added to mitigate controller latency.

endif

jasoncross commented 7 years ago

Here is what the G29 K 1 0 output:

0.875 0.720 0.855 0.796 0.666 0.676 0.606 0.691 0.642 0.642 0.669 0.584 0.659 0.604 0.489 0.622 0.485 0.530 0.550 0.525 0.522 0.497 0.503 0.468 0.348 0.483 0.413 0.459 0.469 0.409 0.206 0.201 0.141 0.282 0.252 0.247 0.247 0.272 0.328 0.293 0.170 0.020 0.010 0.105 0.095 0.151 0.146 0.191 0.256 0.256 -0.177 -0.136 -0.096 -0.141 0.164 0.074 -0.007 0.100 0.115 0.105 -0.343 -0.283 -0.273 -0.277 -0.207 0.043 -0.102 0.048 0.054 0.139 -0.514 -0.509 -0.334 -0.414 -0.364 -0.253 -0.113 -0.053 0.002 0.077 -0.736 -0.620 -0.615 -0.560 -0.500 -0.370 -0.364 -0.274 -0.189 -0.114 -0.857 -0.807 -0.757 -0.691 -0.526 -0.481 -0.426 -0.301 -0.215 [-0.090]

I note that when it did it's grid level, when it got to the far right side, it hit the edge of the printer.

Roxy-3D commented 7 years ago

You might try bumping up the multiplicator to make it more responsive. What happens the number on the LCD Screen? Does the entire LCD screen get taken over by the Z-BabyStepping when you enable it? Can you adjust the number up and down?

On the G29 K 1 0 <----<<< That is an 'Oh' not a Zero, right??? You may have 'maximized' your bed area too much if the probe can't safely and accurately probe the entire bed.

jasoncross commented 7 years ago

You might try bumping up the multiplicator to make it more responsive. What happens the number on the LCD Screen? Does the entire LCD screen get taken over by the Z-BabyStepping when you enable it? Can you adjust the number up and down?

The screen changes to only say Z-Offset: and the number, and as I spin the dial, the number changes. That's how I knew I changed it from -1.4 to -.4(ish) without seeing any change.

On the G29 K 1 0 <----<<< That is an 'Oh' not a Zero, right??? You may have 'maximized' your bed area too much if the probe can't safely and accurately probe the entire bed.

Yes, it was O, not 0. Mistyped in my comment. The 100-pt probe stays within the bounds (I tell it to have a mesh inset of 20). The 4x4 grid probe hits the edge - it's like it's going outside of the mesh inset.

jasoncross commented 7 years ago

Out of curiosity, how does a grid level compensate for the entire mesh being tilted if a comparable grid level isn't done prior to the first creation of the mesh to set a baseline? Wouldn't it otherwise be assuming your first mesh was always at perfectly level?

Roxy-3D commented 7 years ago

OK... The 'J' Grid Leveling code is very new. It works for me on my machine. But you probably found a bug. It will be a couple days until I can look into that. I'm trying to get the Delta functionality that @oldmcg did crossed over to the code base before the 1.1.0 version gets released.

The Grid (and 3-Point) assume you have a suitable mesh defined. But if something causes that surface to get tilted (just as a piece of filament plastic getting under the glass), it will tilt that surface. That sounds like what you have happening. Your mesh describes the surface of the glass. But now you can't get the glass back to its original position.

Its not as accurate... But you could try the three point leveling with G29 T to tilt the mesh.

jasoncross commented 7 years ago

The Grid (and 3-Point) assume you have a suitable mesh defined. But if something causes that surface to get tilted (just as a piece of filament plastic getting under the glass), it will tilt that surface. That sounds like what you have happening. Your mesh describes the surface of the glass. But now you can't get the glass back to its original position.

But isn't that the point of it - to compensate for the tilt of that surface so you don't HAVE to get back to your original exact tilt?

What I'm saying is that without a baseline grid (or 3-pt) to set the tilt for "0" prior to the mesh creation, then the 3-point or grid level later will never have a baseline to tilt the whole mesh against to fix it later (unless the 3-point or grid used existing mesh points only. Then it could extrapolate the original tilt to fix the correct offset).

jasoncross commented 7 years ago

Back to the babystepping issue - is the screen going blank and saying only "Z-Offset" and the number what I should be seeing (that's what I am seeing now). And shouldn't a change of 1 mm be noticeable? Or should I start a separate thread for this to not cross-wires with UBL?

Roxy-3D commented 7 years ago

Yes. Please start a separate thread for the Z-BabyStepping issue.

The mesh bed leveling schemes don't know about or care about 'Bed Tilt'. They know where the surface of the bed is. And they do calculations based on the surrounding mesh points from the nozzle's position. That is why mesh bed leveling is so powerful. Even funny shapes like a bowl shape can be handled by it. But with the 3 point and grid that assume the surface is flat, they can only accommodate a 'tilt' to that flat surface.

jasoncross commented 7 years ago

But isn't the point of the 3-point or grid combined with the mesh to adjust the overall mesh tilt? How does it accurately adjust the overall mesh without knowing the starting values for the same 3-point or grid?

Otherwise any time the tilt changes at all (for example something under the glass, or a printer that uses two z-steppers that get pushed slightly out of whack) you have to do a full mesh creation again which takes some time between mesh, test, adjust, test, adjust, test, etc.

Roxy-3D commented 7 years ago

How does it accurately adjust the overall mesh without knowing the starting values for the same 3-point or grid?

Oh! I understand the question now. The answer is the same as plane leveling of the print bed using the Grid base Least Squares Fit algorithm. When you sample 16 points... Each point's location is 'corrected' by the mesh height at that location. So, the G29 J Grid based Least Squares Fit algorithm has a 'flat surface' to work with. Those 16 points (or what ever you specify) get feed into the LSF algorithm and what comes out are values for the tilt in both the X & Y direction along with a Z offset of the surface.

If you turn the Verbose level up to 4 and do a G29 J4 V4, you will see all the gory details of what it is doing. And you can do a G29 P0 to create a mesh full of zeros so you can just look at the calculated tilt of your bed after the grid sampling.

d2crafty commented 7 years ago

So the issue with my board not using the RCfix is official imo. the BT7272A board rejects the software. My old board which is very similar to the board accepts RCFix with little modification and is similar to the other board.

d2crafty commented 7 years ago

This is what I got so far on my topography

03:17:50.781 : Bed Topography Report: 03:17:50.885 : (0,9) (9,9) 03:17:50.989 : (1,1) (199,199) 03:17:51.143 : . . . . . . . . . . 03:17:51.143 : 03:17:51.296 : . . . . . . . . . . 03:17:51.296 : 03:17:51.477 : 0.197 0.060 0.030 0.007 -0.010 -0.023 -0.088 -0.155 . . 03:17:51.477 : 03:17:51.633 : 0.168 0.120 0.065 0.033 0.012 -0.018 [-0.078] -0.168 . . 03:17:51.633 : 03:17:51.788 : 0.280 0.155 0.100 0.070 0.048 -0.005 -0.073 -0.163 . . 03:17:51.788 : 03:17:51.942 : 0.245 0.195 0.137 0.092 0.063 0.007 -0.067 -0.170 . . 03:17:51.942 : 03:17:52.097 : 0.362 0.242 0.195 0.117 0.063 0.005 -0.075 -0.192 . . 03:17:52.097 : 03:17:52.278 : 0.405 0.283 0.227 0.155 0.080 0.040 -0.088 -0.187 . . 03:17:52.278 : 03:17:52.433 : 0.235 0.298 0.217 0.155 0.077 0.035 -0.085 -0.218 . . 03:17:52.433 : 03:17:52.587 : 0.212 0.355 0.272 0.210 0.153 0.072 -0.055 -0.190 . . 03:17:52.692 : (1,1) (199,1) 03:17:52.797 : (0,0) (9,0)

--

Roxy-3D commented 7 years ago

Wow! Your bed is very warped. You need to fill in the unprobed areas.

d2crafty commented 7 years ago

i measured with calipers to check the height of the bed to make sure everything was the same and did a redo on the mesh. This is what I received. 14:48:22.017 : Bed Topography Report: 14:48:22.121 : (0,9) (9,9) 14:48:22.226 : (1,1) (199,199) 14:48:22.379 : . . . . . . . . . . 14:48:22.380 : 14:48:22.534 : . . . . . . . . . . 14:48:22.534 : 14:48:22.715 : -0.170 -0.250 -0.208 -0.150 -0.078 -0.033 -0.015 -0.007 . . 14:48:22.715 : 14:48:22.869 : -0.115 -0.177 -0.150 -0.103 -0.020 0.033 [ 0.012] 0.007 . . 14:48:22.870 : 14:48:23.050 : 0.005 -0.103 -0.110 -0.018 0.033 0.045 0.072 0.020 . . 14:48:23.050 : 14:48:23.205 : 0.043 -0.025 -0.020 0.040 0.085 0.092 0.085 0.065 . . 14:48:23.205 : 14:48:23.360 : 0.150 0.040 0.075 0.063 0.097 0.122 0.110 0.082 . . 14:48:23.360 : 14:48:23.514 : 0.227 0.092 0.110 0.135 0.115 0.158 0.110 0.077 . . 14:48:23.514 : 14:48:23.669 : 0.175 0.182 0.160 0.173 0.170 0.192 0.145 0.085 . . 14:48:23.669 : 14:48:23.824 : 0.195 0.255 0.227 0.245 0.260 0.250 0.177 0.112 . . 14:48:23.929 : (1,1) (199,1) 14:48:24.033 : (0,0) (9,0)

-- This is after the G29 P3 O

14:49:41.253 : Bed Topography Report: 14:49:41.358 : (0,9) (9,9) 14:49:41.462 : (1,1) (199,199) 14:49:41.615 : . . . . . . . . . . 14:49:41.615 : 14:49:41.796 : -0.170 -0.250 -0.208 -0.150 -0.078 -0.033 -0.015 -0.007 0.000 . 14:49:41.796 : 14:49:41.951 : -0.170 -0.250 -0.208 -0.150 -0.078 -0.033 -0.015 -0.007 0.000 . 14:49:41.951 : 14:49:42.106 : -0.115 -0.177 -0.150 -0.103 -0.020 0.033 [ 0.012] 0.007 0.007 . 14:49:42.106 : 14:49:42.261 : 0.005 -0.103 -0.110 -0.018 0.033 0.045 0.072 0.020 0.020 . 14:49:42.261 : 14:49:42.416 : 0.043 -0.025 -0.020 0.040 0.085 0.092 0.085 0.065 0.065 . 14:49:42.416 : 14:49:42.572 : 0.150 0.040 0.075 0.063 0.097 0.122 0.110 0.082 0.082 . 14:49:42.572 : 14:49:42.752 : 0.227 0.092 0.110 0.135 0.115 0.158 0.110 0.077 0.077 . 14:49:42.752 : 14:49:42.907 : 0.175 0.182 0.160 0.173 0.170 0.192 0.145 0.085 0.085 . 14:49:42.907 : 14:49:43.062 : 0.195 0.255 0.227 0.245 0.260 0.250 0.177 0.112 0.112 . 14:49:43.166 : (1,1) (199,1) 14:49:43.270 : (0,0) (9,0)

Roxy-3D commented 7 years ago

You still have a row of .'s One more G29 P3 O should fill those in. It doesn't matter if the values are correct. It just matters that they are reasonable enough that you don't damage your printer.

After you fill them in... You do a G26 C P O2.5 and it will print a mesh validation pattern across the entire bed. Anything that doesn't look perfect, you edit. And those filled in points will probably need to be edited. But things converge very fast after the first G26. Things will be perfect after 3 or 4 iterations. And from then on... You just print....

d2crafty commented 7 years ago

I got to the Mesh Editor part. how does this work? Thanks -- also It looks like its heating up to use PLA drop during the Priming stage? I ran out of PLA and only have ABS. anyway to edit that?

Roxy-3D commented 7 years ago

Move the nozzle to the center of an area that doesn't look perfect. Do a G29 P4 R O You can dial each mesh point up or down what ever amount is appropriate. Half a layer height up or down is fine if you have any adhesion at all. Click the wheel... And it will go to the next point. When you have edited the bad area, Press and Hold until it says it is done and repeat for the next less than perfect area.

Save the results... And do another G26. The process will converge very quickly.

d2crafty commented 7 years ago

what are the G26 sub commands? like to set the bed heat, head temp? I'm guessing it would be G26 B(temp) H(temp) then the rest of the commands? what does C, P, O2.5 mean? thanks

Roxy-3D commented 7 years ago

Ah... I don't know... If the person writing the code cared about the user... Maybe they put them as nicely organized comments at the front of the G26_Mesh_Validation_Tool.cpp file??? (Yeah... I've been drinking...)


  /**
   *   G26 Mesh Validation Tool
   *
   *   G26 is a Mesh Validation Tool intended to provide support for the Marlin Unified Bed Leveling System.
   *   In order to fully utilize and benefit from the Marlin Unified Bed Leveling System an accurate Mesh must
   *   be defined.  G29 is designed to allow the user to quickly validate the correctness of her Mesh.  It will
   *   first heat the bed and nozzle. It will then print lines and circles along the Mesh Cell boundaries and
   *   the intersections of those lines (respectively).
   *
   *   This action allows the user to immediately see where the Mesh is properly defined and where it needs to
   *   be edited.  The command will generate the Mesh lines closest to the nozzle's starting position.  Alternatively
   *   the user can specify the X and Y position of interest with command parameters.  This allows the user to
   *   focus on a particular area of the Mesh where attention is needed.
   *
   *   B #  Bed   Set the Bed Temperature.  If not specified, a default of 60 C. will be assumed.
   *
   *   C    Current   When searching for Mesh Intersection points to draw, use the current nozzle location
   *        as the base for any distance comparison.
   *
   *   D    Disable   Disable the Unified Bed Leveling System.  In the normal case the user is invoking this
   *        command to see how well a Mesh as been adjusted to match a print surface.  In order to do
   *        this the Unified Bed Leveling System is turned on by the G26 command.  The D parameter
   *        alters the command's normal behaviour and disables the Unified Bed Leveling System even if
   *        it is on.
   *
   *   H #  Hotend    Set the Nozzle Temperature.  If not specified, a default of 205 C. will be assumed.
   *
   *   F #  Filament  Used to specify the diameter of the filament being used.  If not specified
   *        1.75mm filament is assumed.  If you are not getting acceptable results by using the
   *        'correct' numbers, you can scale this number up or down a little bit to change the amount
   *        of filament that is being extruded during the printing of the various lines on the bed.
   *
   *   K    Keep-On   Keep the heaters turned on at the end of the command.
   *
   *   L #  Layer   Layer height.  (Height of nozzle above bed)  If not specified .20mm will be used.
   *
   *   Q #  Multiplier  Retraction Multiplier.  Normally not needed.  Retraction defaults to 1.0mm and
   *        un-retraction is at 1.2mm   These numbers will be scaled by the specified amount
   *
   *   N #  Nozzle    Used to control the size of nozzle diameter.  If not specified, a .4mm nozzle is assumed.
   *
   *   O #  Ooooze    How much your nozzle will Ooooze filament while getting in position to print.  This
   *        is over kill, but using this parameter will let you get the very first 'cicle' perfect
   *        so you have a trophy to peel off of the bed and hang up to show how perfectly you have your
   *        Mesh calibrated.  If not specified, a filament length of .3mm is assumed.
   *
   *   P #  Prime   Prime the nozzle with specified length of filament.  If this parameter is not
   *        given, no prime action will take place.  If the parameter specifies an amount, that much
   *        will be purged before continuing.  If no amount is specified the command will start
   *        purging filament until the user provides an LCD Click and then it will continue with
   *        printing the Mesh.  You can carefully remove the spent filament with a needle nose
   *        pliers while holding the LCD Click wheel in a depressed state.
   *
   *   R #  Random    Randomize the order that the circles are drawn on the bed.  The search for the closest
   *        undrawn cicle is still done.  But the distance to the location for each circle has a
   *        random number of the size specified added to it.  Specifying R50 will give an interesting
   *        deviation from the normal behaviour on a 10 x 10 Mesh.
   *
   *   X #  X coordinate  Specify the starting location of the drawing activity.
   *
   *   Y #  Y coordinate  Specify the starting location of the drawing activity.
   */