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

    BLTouch mesh bed leveling, but first layer isn't level

    Scheduled Pinned Locked Moved
    General Discussion
    4
    5
    1.9k
    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.
    • vockleyaundefined
      vockleya
      last edited by vockleya

      I'm building a custom-designed coreXY printer with dual independent Z axis motors, and am currently running into an absolutely baffling problem with my bed leveling. I've been chasing this problem in circles for weeks, and I'm hoping that a few more knowledgeable sets of eyes might catch something I've missed.

      In short, the "level" plane calculated using a BLTouch and mesh bed leveling does not seem to match the bed. The general result is the right side of the bed being significantly further from the nozzle than the left, but also the rear right is the furthest point, and the rear left is the closest.

      I know the bed isn't particularly flat, but this issue persists regardless of any bed adjustments. In fact, the printer seems to compensate for these changes, and the high and low spots in the print are exactly the same no matter the absolute flatness or "levelness" of the bed. Also, the high and low spots in the print don't match up with high and low spots in the height map at all. Most of the bed is within about .1-.2mm of flat, with only the outer edges (50mm or so) deviating significantly from that.

      Above the 1st level, it prints nearly flawlessly. I have plenty of tweaking left to do, but levelness and distance between higher layers seems to be just fine.

      At this point, I'm not even sure where the issue lies. I'm fairly certain the mechanical design is sound. The frame is incredibly rigid, and I've spent hours adjusting the geometry of the various gantries and linear rails and rods to be running as perfectly square and/or level as possible.

      Even if something isn't quite right, shouldn't bed leveling be able to adjust for whatever offset or geometry change that introduces? If the toolhead/nozzle were lower at one end of an axis compared to the other, wouldn't the bed just move up or down to cancel that out? Or am i misunderstanding how mesh bed leveling works? It seems to me that this is a software/config issue, but I'm not sure of anything at this point.

      Any help would be greatly appreciated.

      Images and config files below. Hopefully you're able to get a decent idea of what I'm working with. I can post more config files, images, or renderings from the 3d model if any other information will help.

      Test Print.jpg

      height map.png

      Printer.jpg

      config.g

      M80 C"pson"									; power on
      
      ; Basic setup
      M575 P1 S1 B57600							; enable PanelDue
      G90											; absolute coordinates
      M83											; relative extruder moves
      M550 P"CoreXY Printer"						; printer name
      M669 K1										; CoreXY mode
      M552 S1										; enable network
      M586 P0 S1									; enable HTTP
      M586 P1 S0									; disable FTP
      M586 P2 S0									; disable Telnet
      
      ; Drives
      M569 P0 S1									; drive 0; forwards
      M569 P1 S0									; drive 1; backwards
      M569 P2 S0									; drive 2; backwards (left Z leadscrew)
      M569 P3 S1									; drive 3; forwards (extruder)
      M569 P4 S0									; drive 4; backwards (right Z leadscrew)
      M584 X0 	Y1 		Z2:4 	E3				; drive mapping
      M906 X1800	Y1800	Z1400	E1000	I40		; motor currents (mA); idle factor
      M84 S1										; idle timeout
      M350 X16 	Y16 	Z16 	E16 	I1		; 16x microstepping with interpolation
      M92  X80	Y80		Z400	E415			; steps per mm
      M566 X2100	Y2100	Z1200	E600			; jerk (mm/min)
      M203 X36000 Y36000	Z3600	E6000			; maximum speed (mm/min)
      M201 X15000 Y15000	Z1000	E3000			; acceleration (mm/s^2)
      M204 P5000 T10000							; print and travel acceleration
      
      ; Axis Limits
      M208 X-10 Y-10 Z0 S1						; axis minima
      M208 X318 Y300 Z370 S0						; axis maxima
      
      ; Endstops
      M574 X2 S1 P"xstop"							; X endstop high end; NO; pin xstop
      M574 Y1 S1 P"ystop"							; Y endstop low end; NO; pin ystop
      
      ; Z-Probe
      M950 S0 C"exp.heater3"						; servo 0; pin exp.heater3
      M558 P9 C"^zprobe.in" H5 F120 T40000		; Z probe type BLTouch; pin zprobe.in; dive height, speed
      G31 P500 X0 Y25 Z2.4						; Z probe trigger value; position offset
      M376 H3
      
      ; Z-leveling
      M671 X370:-58 Y150:150 S10					; leadscrew positions; 10mm correction limit
      
      ; Bed heater
      M308 S0 P"bedtemp" Y"thermistor" A"Bed Heat" T100000 B4138   		; sensor 0; pin bedtemp; type thermistor; name
      M950 H0 C"bedheat" T0                            					; heater 0; pin bedheat; sensor 0
      M307 H0 R0.230 K0.266:0.000 D2.74 E1.35 B0			; PID parameters; disable bang-bang
      M140 H0
      M143 H0 S120                                     					; temperature limit 120C
      
      ; Hotend
      M308 S1 P"e0temp" Y"thermistor" A"Hotend" T100000 B4138			; sensor 1; pin e0temp; type thermistor; name
      M950 H1 C"e0heat" T1											; heater 1; pin e0heat; sensor 1
      M307 H1 R3.034 K0.525:0.211 D5.88 E1.35 V23.8 B0					; PID parameters; disable bang-bang
      M143 H1 S300													; temperature limit 300C
      
      ; Fans
      M950 F0 C"fan0" Q20							; fan 0; pin fan0; 20Hz PWM
      M106 P0 C"Part Cooling"
      
      M950 F1 C"fan2"								; fan 1; pin fan2
      M106 P1 C"Hotend" S1 H1 T50					; fan 1; temperature controlled; heater 1; 50C
      
      ; Tools
      M563 P0 S"Hotend" D0 H1 F0 L0				; define tool 0
      G10 P0 X0 Y0 Z0								; set tool 0 axis offsets
      G10 P0 R180 S235							; set initial tool 0 active and standby temperatures to 0C
      M572 D0 S0.05								; linear advance
      

      bed.g

      M561							; clear stored mesh
      G28
      
      ; Bed leveling pass 1
      M558 H10						; 10mm probe dive height
      ; Define probe points
      G30 P0 X50 Y150  Z-99999
      G30 P1 X150 Y150  Z-99999
      G30 P2 X250 Y150  Z-99999 S2	; and run probe
      
      ; Home Z
      G1 X150 Y150 F40000				; move to probe point
      M558 H5 F300					; dive height, slow home speed
      G30							; home Z
      
      ; Bed leveling pass 2
      G30 P0 X50  Y50  Z-99999
      G30 P1 X150 Y50  Z-99999
      G30 P2 X250 Y50  Z-99999
      G30 P3 X250 Y150 Z-99999
      G30 P4 X150 Y150 Z-99999
      G30 P5 X50  Y150 Z-99999
      G30 P6 X50  Y250 Z-99999
      G30 P7 X150 Y250 Z-99999
      G30 P8 X250 Y250 Z-99999 S2		; and run probe
      
      ; Home Z
      G1 X150 Y150 F40000				; move to probe point
      M558 H3 F300					; dive height, slow home speed
      G30							; home Z
      
      ; Mesh bed leveling
      M557 X20:280 Y20:280 P7			; define probe grid
      G29								; run probe
      
      Norderundefined 1 Reply Last reply Reply Quote 0
      • Norderundefined
        Norder @vockleya
        last edited by Norder

        @vockleya
        Please post the homeall.g and homez.g files.

        Is the BLTouch really Y25 away from the nozzle?
        So it would then be mounted in the middle of the printhead when I look at the printhead in the photo!?

        Your bed.g is pretty messed up.
        Check out the following post by @jay_s_uk, he posted reference files for a CoreXY with two Z spindles.
        However, you should not adopt them 1:1 but adapt them for your printer.

        https://forum.duet3d.com/topic/29730/mistake-true-bed-levelling-g32/4

        Google Translate
        -- Original Text --

        Poste bitte mal die homeall.g und homez.g Datei.

        Ist der BLTouch wirklich Y25 von der Düse entfernt ?
        Er wäre dann also in der Mitte des Druckkopfes montiert, wenn ich mir den Druckkopf auf dem Foto ansehe !?

        Deine bed.g ist ziemlich durcheinander.
        Gucke Dir mal folgenden Post von @jay_s_uk an, er hat dort Referenzdateien für ein CoreXY mit zwei Z-Spindeln gepostet.
        Du solltest sie aber nicht 1:1 übernehmen sondern für Deinen Drucker anpassen.
        Link siehe oben !

        DDA5X... 0.9° Stepper... Linearrails... Duet 2 Wifi... PT100 Board... Duet IR-Probe... Dyze Pro Kit up to 500°C.. etc
        Thingiverse

        1 Reply Last reply Reply Quote 0
        • mikeabuilderundefined
          mikeabuilder
          last edited by

          @vockleya - Nice Design! It looks very solid.

          From your description, I believe you correctly understand the function of mesh bed leveling. It should adjust for the variations shown in your height map.

          The general shape and deflection of your height map looks reasonable. What looks like a bow up in the center of the bed in the X direction could be either a bow up in the bed, or a bow down in the middle of the gantry. Remember, the z probe measures the distance from the probe to the bed and there is no guarantee the probe is always on the same plane.

          Neither of my two CoreXY printers is a twin-Z, so I can't comment about the leveling part of bed.g. The rest seems OK.

          Your comment about the height map not matching you observed first layer seems correct.

          My advice - I had a similar issue with one of my CoreXY printers. In the end, my solution had three components - First was making sure the surface of the build plate was very clean. I tried both alcohol and ammonia and found ammonia worked better for me when printing PLA and alcohol was better with PETG. Second, giving the bed plenty of time to heat evenly was important. My printer has a 6mm aluminum bed and it takes about 15 minutes for the top corned to get fully up to temp. I'm in the process of adding insulation on the bottom. Third was finding a z-offset that was a good compromise across the bed. In theory, mesh compensation should make this redundant, but I made test squares like you have in each corner and used baby-stepping while each was printing to find the ideal offset. Then I adjusted my tool z offset to hit the middle of the baby steps range.

          Other things you can look for:

          • Your printhead rocking on the X rail, or the whole gantry rocking on the Y rail. If there is play, it's possible your cable chains or bowden tube could be rocking the printhead so that the probe offset is changing at different X and Y positions.

          • If the two Y rails are not super-parallel and/or you belt tensions are not close to equal, and there is play in the blocks, the belts could be torquing the gantry during movement. This might not be seen when the print head stops to probe the bed.

          vockleyaundefined 1 Reply Last reply Reply Quote 0
          • OwenDundefined
            OwenD
            last edited by

            If you have two Z drives then shouldn't you have only two probe points in your bed.g ?
            I.e one near each lead screw so you can level the bed.

            1 Reply Last reply Reply Quote 1
            • vockleyaundefined
              vockleya @mikeabuilder
              last edited by

              Thanks for all the ideas. I've got a lot more testing to do now.

              When I manually level the bed to the nozzle and then run G29, I get the mesh below, I think the entire toolhead is deflecting as it travels across the X axis. I'll need to do a bit of a redesign to stiffen it more. I also want to add 2 fixed probe points attached directly to the Z gantry, insteaf of using the bed for auto leveling. That should give a more reliable starting point.

              The homing and bed probing files seem to be working correctly, so I don't think thats the issue. Although I've cleaned them up a bit and all 3 are included below.

              mesh.png

              bed.g

              M561				; clear stored mesh
              G28				; home all
              
              ; rough bed leveling pass
              M558 H10 F1500			; dive height, speed
              G30 P0 X50  Y150  Z-99999	; probe points
              G30 P1 X150 Y150  Z-99999
              G30 P2 X250 Y150  Z-99999 S2	; and run probe
              
              ; fine bed leveling pass
              M558 H3 F300			; dive height, speed
              G30 P0 X100 Y100 Z-99999	; probe points
              G30 P1 X200 Y100 Z-99999
              G30 P2 X100 Y200 Z-99999
              G30 P3 X200 Y200 Z-99999 S2	; and run probe
              
              ; mesh bed leveling
              M557 X20:280 Y20:280 P3		; probe grid
              G29				; run probe
              

              homeall.g

              ; Home X/Y
              G91				; relative positioning
              G1 H2 Z5 F1000			; drop bed
              G1 H1 X320 Y-320 F10000		; move to X or Y endstop (fast)
              G1 H1 X320	F10000		; move to X endstop (fast)
              G1 H1 Y-320	F10000		; move to Y endstop (fast)
              G1 X-5 Y5 F10000		; go back a few mm
              G1 H1 X320 F1000		; move to X endstop (slow)
              G1 H1 Y-320	F1000		; move to Y endstop (slow)
              G90				; absolute positioning
              
              ; Home z
              M98 P"homez.g"
              

              homez.g

              G91				; relative positioning
              G1 H2 Z5 F6000			; drop bed
              G90				; absolute positioning
              G1 X150 Y150 F30000		; move to probe point
              M558 H10 F2500			; fast home
              G30				; home Z
              M558 H3 F300			; slow home
              G30				; home Z
              
              1 Reply Last reply Reply Quote 0
              • First post
                Last post
              Unless otherwise noted, all forum content is licensed under CC-BY-SA