Using bed leveling screws with independent z motors



  • Hi everyone,

    The printer im building has 3 independently driven Z leadscrews and 3 bed leveling screws. Now i want to probe at the 3 leveling screws and then manually adjust it so the bed is parallel to the printframe. At that point i would like to do the automatic bed leveling for the fine tuning.

    However i used the tutorial on the manual leveling but because there are 3 Z-motors defined it wont show how much i have to adjust the screws but it will just do the changes automatically. Does anyone have a workaround for this issue?

    This is my manual leveling macro:

    M561
    M671 X195:400:605 Y120:380:120 P1 ; Change to the bed leveling screws positioning
    G30 P0 X195 Y120 Z-99999 ; probe near an adjusting screw
    G30 P1 X400 Y380 Z-99999 ; probe near an adjusting screw
    G30 P2 X605 Y120 Z-99999 S3 ; probe near an adjusting screw and report adjustments needed

    M671 X51.3:400:748.7 Y75:448.7:75 ; change back to the leadscrew positioning

    Thanks in advance,
    Greetings, Piet.



  • @Piet

    Hi,
    since I only know printers with screws (but someday maybe can try individual/independent-z-motor-levelling) my answer might be only of limited help:

    As far as I understand from my own questions about this (see e.g. here https://forum.duet3d.com/topic/19574/manual-bed-levelling-assistant/7) I understand it that way that if you have BOTH, screws & I-Z-M, you might only need the screws for the 1st time when you build the actual machine, or in service case.

    After that you fix them, and from there on the motors do the small precisionwork... otherwise I think, there is a chance you might create a human/machine endless-loop where it is not clear who/which is in charge of what exactly...

    If you really need the manual step for whatever reason (would be great to know why you need it?) you might just code something like this yourself and save it as a macro (Attention this is for RRF>=3.x):

    ;Manually coded manual bed levelling via screws:
    
    
    ;heat at this point tool & bed maybe to have realistic thermal expansion of all parts:
    ;...						;extruder
    ;...						;heat-plate
    ;...                                            ;chamber
    
    
    ; Conditional g-code needs RRF>=3.x ! OTHERWISE COMMENT OUT!
    ; If the printer hasn't been homed, home it
    if !move.axes[0].homed || !move.axes[1].homed || !move.axes[2].homed
      ; tell user that printer homes and have the user ok/cancel it:
      M291 R"Homing all axis in order x, y & z" P"Confirm to proceed..." S3
      G28
    
    M291 R"Approaching 1st screw: front left" P"Confirm to proceed..." S3
    ;lift head:
    ;M98 P"z-do-lift.g" 									; check for correct directory, default folder is /sys on sd-card
    G1 Z{move.axes[2].min+5} F500							; separate plate & extruder
    ;goto position:
    G1 X{move.axes[0].min+10} Y{move.axes[1].min+10} F1000 	; position above screw
    M291 R"Move plate away with screw under extruder" P"Confirm to proceed..." S3
    ;lower head again
    G1 Z{move.axes[2].min} F500								; bringtogether plate & extruder
    M291 R"Move plate to extruder to 0 distance" P"Confirm to proceed..." S3
    
    M291 R"Approaching 2nd screw: front right" P"Confirm to proceed..." S3
    ;lift head:
    ;M98 P"z-do-lift.g" 									; check for correct directory, default folder is /sys on sd-card
    G1 Z{move.axes[2].min+5} F500							; separate plate & extruder
    ;goto position:
    G1 X{move.axes[0].max-10} Y{move.axes[1].min+10} F1000 	; position above screw
    M291 R"Move plate away with screw under extruder" P"Confirm to proceed..." S3
    ;lower head again
    G1 Z{move.axes[2].min} F500								; bringtogether plate & extruder
    M291 R"Move plate to extruder to 0 distance" P"Confirm to proceed..." S3
    
    M291 R"Approaching 3rd screw: back right" P"Confirm to proceed..." S3
    ;lift head:
    ;M98 P"z-do-lift.g" 									; check for correct directory, default folder is /sys on sd-card
    G1 Z{move.axes[2].min+5} F500							; separate plate & extruder
    ;goto position:
    G1 X{move.axes[0].max-10} Y{move.axes[1].max-10} F1000 	; position above screw
    M291 R"Move plate away with screw under extruder" P"Confirm to proceed..." S3
    ;lower head again
    G1 Z{move.axes[2].min} F500								; bringtogether plate & extruder
    M291 R"Move plate to extruder to 0 distance" P"Confirm to proceed..." S3
    
    M291 R"Approaching 4th screw: back left" P"Confirm to proceed..." S3
    ;lift head:
    ;M98 P"z-do-lift.g" 									; check for correct directory, default folder is /sys on sd-card
    G1 Z{move.axes[2].min+5} F500							; separate plate & extruder
    ;goto position:
    G1 X{move.axes[0].min+10} Y{move.axes[1].max-10} F1000 	; position above screw
    M291 R"Move plate away with screw under extruder" P"Confirm to proceed..." S3
    ;lower head again
    G1 Z{move.axes[2].min} F500								; bringtogether plate & extruder
    M291 R"Move plate to extruder to 0 distance" P"Confirm to proceed..." S3
    
    G1 Z{move.axes[2].min+5} F500							; separate plate & extruder
    ;G1 X{move.axes[0].min+10} Y{move.axes[1].min+10} F1000 	; position above screw
    M291 R"Finished" P"Re-start macro if you want another pass" S1
    

    ... hope I could help a bit, but maybe someone with your setup might be better for help...



  • On my printer (3 leads screws, 4 bed screws) the bed.g looks like this and performs an automatic level:

    M561                    ; clear any bed transform
    
    ; If the printer hasn't been homed, home it
    [more code ...]
    
    ; Probe the bed and do auto calibration
    M558 H10 ; higher dive hight for yet to be levelled bed
    G30 P0 X{move.axes[0].max/2}  Y{move.axes[1].max+sensors.probes[0].offsets[1]} Z-99999
    G30 P1 X{move.axes[0].max-10} Y10                                              Z-99999
    G30 P2 X10                    Y10                                              Z-99999 S-1
    
    M558 H3 ; back to speed
    

    while this is my "bed_level.g" macro for tuning the bed level screws:

    ; Check bed level
    
    ; Probe the bed
    M558 H10
    G30 P0 X{move.axes[0].max} Y{move.axes[1].min} ; probe near an adjusting screw 
    G30 P1 X{move.axes[0].min} Y{move.axes[1].min}  
    G30 P2 X{move.axes[0].min} Y{move.axes[1].max} 
    G30 P3 X{move.axes[0].max} Y{move.axes[1].max}  S-1  ; probe near an adjusting screw and report adjustments needed
    M558 H3
    
    echo "Deviation:", move.calibration.initial.deviation ^ "mm"
    

    As you can see the commands are the same really, so I must assume the difference is that one is called from a G32 command, vs the other is a standalone macro without any special meaning.



  • Why do you want to do it manually and then get RRF to do the fine adjustments?
    Adding an S value increases the amount the levelling with compensate for.
    So for example, the default S value for M671 is 1mm. If the amount to be compensated is larger than this, nothing happens. Increase it to 10 and if your bed is 10mm out, it will compensate for that.



  • @jay_s_uk

    Great explanation: This should explicitly be added for the "newer " levelling routines and the reason and behaviour for the S-parameter should be explained here I guess:
    https://duet3d.dozuki.com/Wiki/Using_the_manual_bed_levelling_assistant



  • @Piet said in Using bed leveling screws with independent z motors:

    Hi everyone,

    The printer im building has 3 independently driven Z leadscrews and 3 bed leveling screws. Now i want to probe at the 3 leveling screws and then manually adjust it so the bed is parallel to the printframe. At that point i would like to do the automatic bed leveling for the fine tuning.

    There is no real need to have the ability to both manual level and auto level.

    Replace the leveling screws with something fixed and then rely on auto level.

    Frederick



  • @fcwilt

    Hey folks - thanks for helping me back then here https://forum.duet3d.com/topic/19574/manual-bed-levelling-assistant - I think there is a real need to add all this information here:
    https://duet3d.dozuki.com/Wiki/Using_the_manual_bed_levelling_assistant
    Can I do that or do you wanna help me or how is this working with the duet-wiki?



  • @LB said in Using bed leveling screws with independent z motors:

    @fcwilt

    Hey folks - thanks for helping me back then here https://forum.duet3d.com/topic/19574/manual-bed-levelling-assistant - I think there is a real need to add all this information here:
    https://duet3d.dozuki.com/Wiki/Using_the_manual_bed_levelling_assistant
    Can I do that or do you wanna help me or how is this working with the duet-wiki?

    I would think that all documentation about MBC, MBLA and ABL should start with an overview to put all the parts into the correct relation.

    So no matter which one you search on you are first presented with the overview.

    I have seen a good deal of confusion with folks mixing the concepts and the terms.

    Frederick



  • @jay_s_uk As im using ballscrews i want minimal adjustment on the ballscrews themselves as they, and all the parts for mounting them, are precision machined. Therefore i want the first setup to be able to level the bed as close as possible to parallel. Im not having them correct for a 10mm difference obviously?



  • @fcwilt Can you explain to me why there is no need for both? I agree with you that the manual leveling should be a one time thing and im planning on exactly that. However this is not a consumer machine (more of these will be made). So i want it integrated.



  • @ofliduet It works because you have 4 screws and 3 spindles. It apparently doesnt with 3 screws and 3 spindles unfortunately.



  • @Piet Right. I'm not a big fan of leaving bed edges unsupported with only 3 mounting points. You might be able to tell my bed isn't that stiff. I therefore actually have 2 screws and 2 fixed points. The two screws are there so I can adjust twist in the bed. One might be theoretically enough, but two allows me to make opposing adjustments that don't move the probe point in the middle near the lead screw. Probing all 4 in the script gives me the output I need to even everything out.

    All this gives us a workaround for your original question: Probe an additional dummy point in your manual test and you get the output you need for your one-off calibration.



  • @Piet said in Using bed leveling screws with independent z motors:

    @fcwilt Can you explain to me why there is no need for both? I agree with you that the manual leveling should be a one time thing and im planning on exactly that. However this is not a consumer machine (more of these will be made). So i want it integrated.

    Because having adjustment screws for the Manual Bed Leveling Assistant (MBLA) and having multiple Z steppers for Auto Bed Leveling (ABL) are two different solutions to the same problem - leveling the bed.

    The firmware probes the bed in the same matter - the only difference is MBLA outputs instructions on how to turn the adjustment screws while ABL issues commands to the steppers to move as needed to level the bed.

    Frederick



  • @fcwilt I understand the functions of either but don't you agree that manually adjusting the bed to be parallel to the print frame initially is a better way to go. For example in an extreme case where one point of the bed is 10mm off. If I were to level that initially using the ABL it would torque the entire Z-axis assembly and would put a lot of strain and resistance on the leadscrews. Now if initially the entire bed was parallel using the manual adjustment and the ABL can be called every now and then or before every print for that matter, wouldn't you think that's the better solution.

    I do understand for small adjustments this is obsolete but like I said this is for a production machine and for our assembly people and customers, who frankly most of the time aren't as technical as any of us on this forum, it would be a useful feature to fall back on because its so easy to understand.



  • I think you're thinking too much into it.
    Whether the levelling is manual or automatic, the whole bed still has to move up and down to trigger the probe at each point. Then all that's left is for the one screw that's out to be adjusted and whether you are turning it, or the motor is turning it, o don't see the difference.



  • @jay_s_uk Maybe you're right however I think its an interesting discussion. I'll draw a schematic tomorrow which will hopefully show my point more clearer. I appreciate the help nonetheless!



  • @ofliduet said in Using bed leveling screws with independent z motors:

    @Piet Right. I'm not a big fan of leaving bed edges unsupported with only 3 mounting points. You might be able to tell my bed isn't that stiff. I therefore actually have 2 screws and 2 fixed points. The two screws are there so I can adjust twist in the bed. One might be theoretically enough, but two allows me to make opposing adjustments that don't move the probe point in the middle near the lead screw. Probing all 4 in the script gives me the output I need to even everything out."

    That is the only real use-case to have both: Have the screws to "undistord" a non-planar plate you begin with (so you activly overconstrain it by purpose to make "a banana" to a "flat-toast"/"pizza". And then when that thing is flat like a pizza (or so, of which MBL can take care) you auto-level-home from there on with your I-Z-M.

    Did I get your intention right? If yes, an interesting survival-point for analog hand-dialed screws just came up here 🙂 But then I would not use them vertical but rather pull diagonal horizontal the whole metal-plate flat by pulling... just thinking for myself...



  • Hi All,

    I've skimmed over this topic a little, but having just figured out this problem I thought I would add my 2c.

    I have a very large bed - roughly 800x800, with 16 manual adjustment screws (4x4 arrangement), and 4 independent Z motors.

    In my case, I have (at some point) needed to manually level both the lead screws, and the manual adjustment screw - I have also used G32 and G29 bed levelling.

    I partially agree that there is a hierarchy to bed levelling, which needs to be done after assembly, maintenance or a component failure (like a loose screw on a Z motor coupling for example?). With so many components there's plenty of opportunity for something to go wrong, so the correct procedure helps.

    I manually adjust the Z screws with the hot end close to the screws first - this gets the nozzle within a reasonable range for G32 to work its magic. Then I run G29 to do a mesh bed levelling - now that all 4 motors are coplanar this gives me a good idea on the flatness of the bed. If the min/max deviation of the mesh bed levelling is less than 1mm (an arbitrary number I've decided to use), then I'll leave it be - otherwise, I'll adjust the manual levelling screws...

    A more thorough method would be to look for a deviation greater than Xmm (some number) between any two neighboring points in the mesh bed levelling, but for now I'm satisfied with maximum deviation...

    On smaller printers like your typical 300x300 size, then I think a similar approach is easy enough to do, so it doesn't really matter whether it's necessary - do what ever you feel works best for you.



  • @Piet said in Using bed leveling screws with independent z motors:

    @fcwilt I understand the functions of either but don't you agree that manually adjusting the bed to be parallel to the print frame initially is a better way to go.

    By "print frame" do you mean something that surrounds and supports the bed?

    If so, yes, it is best to have the bed properly aligned to that frame but the solution is to design it such that it does not need manual adjustment.

    If you mean something else by "print frame" please explain.

    Thanks.

    Frederick



  • @Piet said in Using bed leveling screws with independent z motors:

    For example in an extreme case where one point of the bed is 10mm off. If I were to level that initially using the ABL it would torque the entire Z-axis assembly and would put a lot of strain and resistance on the leadscrews.

    Whether you're using manual levelling assistant or auto bed levelling, the process is taking the measurements from probing the bed surface.

    I think your concern is that the bed is not level with the z-gantry (e.g. because one of the manual adjustment screws is way off). So you want to get the bed close to level to the z-gantry (and so level with the lead screws) so that they aren't kinked over later. The trouble is the Duet has no idea where the lead screws are as it is still only probing the bed surface. Only exception/caveat is if you are using independent endstops on them as well (and somehow worked out the offset for them all).

    One option could be to remove the bed and try probing the z-gantry to get that near level (so the leadscrew are all level) using auto bed levelling. Then put the bed back on and use the manual assistant to get the manual screw right, then use auto levelling again to actually get it all tuned in fine (assuming you didn't with manual). Might work, but probably will end in tears trying to probe aluminium extrusions....

    Alternatively, just try making sure your bed is level to your z-gantry when building the printer. Simplest way is to use fixed spacers (i.e. no manual adjustment). Or just a spirit level/your eyes? The lead screws should take a little misalignment. Unless you have a massive bed, if you build your printer 10mm out and don't see it, you're probably gonna have a bunch of other problems in there too...



  • The optimum configuration for leadscrews is 3 in a triangle configuration, a triangle being the optimum shape for stability which is why it is used, anything else is sub-optimal.

    As long a the bed plate is flat (and any frame it is mounted to) are both assembled parallel to each other then no further manual levelling is required, the 3 independently operated lead screws will do the rest, as long as the mounting points between the leadscrews and bed/bed frame are not too constrained.
    end of story.

    My bed and frame on my most recent core-xy printer is rose jointed and has short linear rails to allow full articulation for a degree of non-planer printing


  • Moderator

    There's no reason you can't use both methods right now, though it's a bit redundant.

    You'd need to modify your M671 depending on which you wanted to do at the time.

    For the manual way you'd need to include the P parameter to define the thread pitch of the screws.

    https://duet3d.dozuki.com/Wiki/Gcode?revisionid=HEAD#Section_M671_Define_positions_of_Z_leadscrews_or_bed_levelling_screws



  • @Gerrard This is basically what i was going for indeed, an initial setup and a fallback procedure if something goes wrong (in shipping for example). The bed of this printer will be 800x500 so it is quite large.



  • @engikeneer That is my concern, i do also have independent z sensors so i know where every Z-motor is before probing. I think there is something to be said that with a good construction it is most likely redundant but the printer isn't build yet so im just speculating about the best approach to take to make sure it goes well anyways. Thanks for the feedback!



  • @Phaedrux That's how i figured it worked too however i have 3 Z motors defined in my M584. When i add the P parameter it still automatically adjusts the leadscrew instead of giving feedback on how much to turn the screws. Maybe it has to do with my S parameter?


Log in to reply