Duet3D Logo Duet3D
    • Tags
    • Documentation
    • Order
    • Register
    • Login

    G1 H3 and M500 P31 to save multiple endstop on combined Z axis

    Scheduled Pinned Locked Moved
    Firmware wishlist
    2
    12
    529
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • KipKundefined
      KipK
      last edited by

      Thanks. I was not sure if I can still split Z axis on 3.x as with firmware 2.x
      That should clearly work if so.

      Well, Reprap 3 made this cleaner by not splitting, perhaps someday it could be interesting to add a way to save and restore leveling.

      Adding a new flag to M500 P31 for saving multiple endstop position for one axis.

      1 Reply Last reply Reply Quote 0
      • Phaedruxundefined
        Phaedrux Moderator
        last edited by

        Yes RRF3 made it simpler to use multiple endstops on a single axis, but I don't think that extends to measuring of each endstop position. Perhaps
        I'll edit your title and move this to the firmware wishlist for evaluation.

        Z-Bot CoreXY Build | Thingiverse Profile

        KipKundefined 1 Reply Last reply Reply Quote 0
        • KipKundefined
          KipK @Phaedrux
          last edited by

          Fell free to move the thread 👍

          I wonder what other interest than failure resume there is to use multiple Z max endstops instead of direct probing zMin?

          1 Reply Last reply Reply Quote 0
          • Phaedruxundefined
            Phaedrux Moderator
            last edited by

            Using Zmax endstops has the disadvantage that it doesn't actually measure the current position of the bed surface, so it's a less attractive option outside of power loss recovery where a print is still on the bed.

            Z-Bot CoreXY Build | Thingiverse Profile

            1 Reply Last reply Reply Quote 0
            • KipKundefined
              KipK
              last edited by KipK

              Here is the different procedure I imagine, can you confirm the logic is good ?

              Configure resume level macro ( macro started manually, not done at each print )

              • homeZ min with probe
              • level Z min
              • probe Z min
              • separate Z axis
              • home Z max H3 per Z axis with endstops
              • save M500 P31

              start print:

              • home Z min with probe
              • level Z min
              • probe z min
              • print start

              resume print after failure:

              • separate Z axis

              • home zmax H1 per Z axis with endstops

              • up bed 5mm

              • blind level:
                . calculate motor 2 and 3 bias ( 1 is reference ) and move accordingly
                G1 Z2 ( mz1max - mz2max );
                G1 Z3 ( mz1max - mz3max );

              • go to previous saved position

              • resume print

              1 Reply Last reply Reply Quote 0
              • Phaedruxundefined
                Phaedrux Moderator
                last edited by

                That sounds logical.

                Z-Bot CoreXY Build | Thingiverse Profile

                1 Reply Last reply Reply Quote 0
                • KipKundefined
                  KipK
                  last edited by

                  I'm on my way to try that.
                  If it was considered to improve for Reprap 3, method could be contained like this:

                  • Record zmax:
                    G1 H3 Z400 ; as we have 3 independant motor will get zmax of each leadscrew.
                    M500 P31; save those values

                  • Resume print:
                    G28 Z (home using zmax )
                    G91; relative moves
                    G1 Z-15; up bed 15mm
                    Gxx xxx ; restore saved Z bias

                  1 Reply Last reply Reply Quote 0
                  • KipKundefined
                    KipK
                    last edited by KipK

                    So how I'm doing this correcctly using conditionnal gcode ?

                    G1 U(move.axes[2].max-move.axes[3].max) ; restore U bias
                    G1 V(move.axes[2].max - move.axes[4].max) ; restore V bias
                    reports me errors

                    edit: sorry, found the information , brace were missing.

                    G1 U{move.axes[2].max-move.axes[3].max}
                    G1 V{move.axes[2].max - move.axes[4].max}

                    1 Reply Last reply Reply Quote 0
                    • KipKundefined
                      KipK
                      last edited by

                      Seems tehre's something wrong on my logic.
                      Here is wht I've made:

                      Config.g:

                      M584 X1 Y0 Z6:8:7 U8 V7 P3 E4; three Z motors connected to driver outputs 6, 8, 7
                      M350 X16 Y16 Z16 U16 V16 E16 I1                                     ; configure microstepping with interpolation
                      M92 X200.00 Y200.00 Z400.00 U400 V400 E402.00                         ; set steps per mm
                      M574 Z2 S1 P"duex.e2stop";	set endstops for Z
                      M574 U2 S1 P"duex.e6stop";	set endstops for U
                      M574 V2 S1 P"duex.e5stop";	set endstops for V
                      ; Leadscrews
                      M671 X-214:214:214 Y0:-121:118 S10 						    ; leadscrews at middle left, front right, and rear right
                      

                      HomeZ.g:

                      if (!move.axes[0].homed)
                        M98 P"homex.g" ; need to home X Y first 
                      
                      if sensors.endstops[2].triggered 
                      	G91;
                      	G1 Z-15 F1000 H2 ; move bed up a bit
                      	M400			 ; wait for move to finish
                      
                      M220 S100		; set back speed to 100%
                      G90
                      G1 X0 Y0 F10000; move head to the center
                      G30; probe Z = 0
                      G32; level bed
                      G1 X0 Y0 F10000;
                      G30; probe Z again
                      M400			; wait for move to finish
                      

                      Macro to calibrate each Zmax:

                      M208 S1 Z-3;	Allow z to be negative
                      G90; 
                      G1 X0 Y0  F10000; 		go to the center
                      G1 Z30 F1000;
                      G30		;		 probe bed and set z=0
                      G32		; 		start 3 point bed leveling
                      G1 X0 Y0 F10000;
                      G30     ;	Probe for Z=0
                      G91		; relative mode
                      G1 Z10 F800				; raise nozzle
                      M584 Z6 U8 V7 P5 ; split z axis
                      ;G92 U10 V10; set U V axis to 10 as Z
                       
                      G1 H3 Z370 U370 V370 F1000; move Z, U, V down until endstops trigger and get new z limits
                      
                      M500 P31		; save new z height
                      M584 Z6:8:7 P3 ; unsplit z axis
                      G90
                      

                      Z max values are correctly saved for each z axis:

                      M208 S0 Z341.22 U314.82 V316.30
                      

                      Then after a powerfailure I have a homeZmax.g macro :

                      
                      if sensors.endstops[2].triggered || sensors.endstops[3].triggered || sensors.endstops[4].triggered
                      	G91;
                      	G1 Z-20 F1000 H2 ; move bed up a bit
                      	M400			 ; wait for move to finish
                      
                      M220 S100						; set back speed to 100%
                      G91
                      M584 Z6 U8 V7 P5 				; split z axis
                      G1 H1 Z370 U370 V370 F1000		; move Z, U, V down until endstops trigger
                      G1 Z-10 U-10 V-10 F800      		; get back 10mm
                      G1 H1 Z15 U15 V15 F300  			; go to zmax slowly
                      
                      G1 Z-30 U-30 V-30 F1000;		 			up bed 30mm
                      
                      ; Blind leveling
                      G1 U{move.axes[2].max - move.axes[3].max} V{move.axes[2].max - move.axes[4].max}; restore U V bias
                      M584 Z6:8:7 P3 ;							unsplit z axis
                      G90
                      
                      

                      Problem here is bed is completly tiled.
                      I don't get now where I've failed 🙂

                      1 Reply Last reply Reply Quote 0
                      • KipKundefined
                        KipK
                        last edited by KipK

                        Found it.

                        Seems I have to set also U and V to 0 reference after a Z probe.

                        Now it works.

                        macro calibrate Z max for each axis:

                        M208 S1 Z-3;	Allow z to be negative
                        G90; 
                        G1 X0 Y0  F10000; 		go to the center
                        G1 Z30 F1000;
                        G30		;		 probe bed and set z=0
                        G32		; 		start 3 point bed leveling
                        G1 X0 Y0 F10000;
                        G30     ;	Probe for Z=0
                        G1 Z10 F800				; raise nozzle
                        M584 Z6 U8 V7 P5 ; split z axis
                        G92 U10 V10; set U V axis to 10 as Z
                        G91		; relative mode
                         
                        G1 H3 Z370 U370 V370 F1000; move Z, U, V down until endstops trigger and get new z limits
                        
                        M500 P31		; save new z height
                        M584 Z6:8:7 P3 ; unsplit z axis
                        G90
                        

                        Have to say, object models and conditionnal gcode is a killer feature. 🙂

                        1 Reply Last reply Reply Quote 1
                        • First post
                          Last post
                        Unless otherwise noted, all forum content is licensed under CC-BY-SA