I am finally reaching out as I am at my wits end and need experienced people to help me resolve my printing issue.
I have a Voxelabs Aquila (Ender 3 v2) formerly running marlin with small but manageable annoyances like overhang and manual bed leveling and thus began my journey after a year of using Aquila to start modding/upgrading the thing.
First thing i did was upgrade the fans and shroud, this improved prints slightly but was still not satisfied.
Moved to Klipper and added BLTouch and this is where all my problems started. After hours of following guides and troubleshooting of setting them both up, i still get very little bed adhesion and layers are not smooth together (gaps) with the same 3d slicing software i have been using before the switch (yes changed it to Klipper firmware in slicer)
As you can see in the picture this is after a manual bed level. Where do i go from here?
Edit 2: fully cleaned nozzle, hotend, and bed without any other changes with same results.
Edit 1: forgot to add my printer.cfg
[include mainsail.cfg]
[stepper_x]
step_pin: PC2
dir_pin: PB9
enable_pin: !PC3
microsteps: 16
rotation_distance: 40
endstop_pin: ^PA5
position_endstop: 3
position_max: 235
homing_speed: 50
[stepper_y]
step_pin: PB8
dir_pin: PB7
enable_pin: !PC3
microsteps: 16
rotation_distance: 40
endstop_pin: ^PA6
position_endstop: -17
position_max: 228
position_min: -17
homing_speed: 50
[stepper_z]
step_pin: PB6
dir_pin: !PB5
enable_pin: !PC3
microsteps: 16
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#position_endstop: 0.0
position_max: 250
position_min: -6
[extruder]
max_extrude_only_distance: 100.0
step_pin: PB4
dir_pin: PB3
enable_pin: !PC3
microsteps: 16
rotation_distance: 34.406
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PA1
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC5
#control: pid
# tuned for stock hardware with 200 degree Celsius target
#pid_Kp: 21.527
#pid_Ki: 1.063
#pid_Kd: 108.982
min_temp: 0
max_temp: 250
[bltouch]
# Can't move this configuration to include because of z-offset adjustment
sensor_pin: ^PB1
control_pin: PB0
x_offset: -28
y_offset: -15
#z_offset = 0
samples: 2
speed: 2
#pin_move_time: 0.500
#probe_with_touch_mode: False
#pin_up_reports_not_triggered: True
#pin_up_touch_mode_reports_triggered: True
#stow_on_each_sample: False
[safe_z_home]
home_xy_position: 125,125 #this should be the center of your bed
speed: 50
z_hop: 10
z_hop_speed: 5
[bed_mesh]
speed: 80
horizontal_move_z: 5
mesh_min: 3, 33 #!!min and max co-ords are based on the probes location not the nozzle!!
mesh_max: 207, 213 #needs to be calibrated for your individual printer
probe_count: 5,5 #this is the number of probing points on X then Y axis
mesh_pps: 2,2
fade_start: 1
fade_end: 10
fade_target: 0
[bed_screws]
screw1: 25, 25
screw2: 195, 25
screw3: 195, 195
screw4: 25, 195
[heater_bed]
heater_pin: PA2
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC4
#control: pid
# tuned for stock hardware with 50 degree Celsius target
#pid_Kp: 54.027
#pid_Ki: 0.770
#pid_Kd: 948.182
min_temp: 0
max_temp: 130
[fan]
pin: PA0
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 31.251
#*# pid_ki = 2.510
#*# pid_kd = 97.268
#*#
#*# [heater_bed]
#*# control = pid
#*# pid_kp = 69.577
#*# pid_ki = 1.022
#*# pid_kd = 1184.541
#*#
#*# [bltouch]
#*# z_offset = 3.609
I’m assuming you’ve done the BLTouch config checks here
https://www.klipper3d.org/BLTouch.html
Take a piece of painters tape and place it in the middle of the bed and using a fine tip pen out a small dot on it.
Now home your printer and then do the following
In the console enter the following
Now move the tool head until you have the deployed probe over the dot on the tape. Then slowly baby step it down while adjusting the X and Y to put the probe directly over the dot.
Once you’re sure it’s directly overhead baby step down until the probe triggers and then enter the following in the console.
And note the toolhead X and Y
Note the X and Y values.
Now move the toolhead so that the nozzle is over the dot and then bring it down slowly making sure it’s over the spot. When you’re sure it is do another GET_POSITION in the console.
Now you can calculate the new X and Y offset.
Your probe X offset will be nozzle_x_position - probe_x_position
Or in our hypothetical example above
Or x_offset: -5
And the probe Y offset will be
Or in our hypothetical example above
Or y_offset: 2
Remove the tape and then restart Klipper and we should now have a reliable X and Y position. So when you home it Klipper should move the probe over the center of the bed and then move the nozzle over that same spot when asked to move to the same location.
You don’t have to heat the bed for this since we’re only calculating the distance between when the probe activates and the tip of the nozzle. Well be doing the Z offset as documented here
https://www.klipper3d.org/Probe_Calibrate.html
You can test this with the nozzle heated (that’s more accurate) but you don’t need to. That’s because we’re going to get close and then use a print to get the final detail.
So home your printer and then issue the following
Then we’ll use the same method as we did for the screws with paper or a feeler gauge.
Follow the prompts and once you have the slightest grab then you have the right spot.
Since we’re using a piece of paper we aren’t actually at 0 and you can adjust it down 0.1 (or whatever the thickness of your feeler gauge is)
Then you’ll enter
Now restart Klipper.
Let’s warm the bed to your printing temps. Since we know the bed is trammed we don’t have to worry about adjusting the screws with it hot
In the console enter the following
When it’s done look at the bed mesh in the UI. What’s the range? If it’s less than your layer height you should be good. Focus more on the range and less on the visual since the scale can be confusing. It’s incredibly useful for seeing if there’s warping, or the bed is way out of tram but we’ve already physically confirmed that we have the kinematics fixed
Now save the config which will save this mesh SAVE_CONFIG
Here’s what mine looks like with a few things removed to avoid confusion
[gcode_macro START_PRINT] variable_material_printed: "" variable_material_retract: 1.2 gcode: {% set BED_TEMP = params.BED_TEMP|default(60)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(180)|float %} {% set DO_ABL = params.DO_ABL |default(1)|int %} {% set MATERIAL = params.MATERIAL|default('PLA')|string %} ;Reset state G90 ; Absolute Positioning CLEAR_PAUSE M117 Starting {MATERIAL} Print with Bed Temp of {BED_TEMP} and Extruder Temp of {EXTRUDER_TEMP}, ABL set to {DO_ABL} PLAY_START # Save material used SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=material_printed VALUE="'{MATERIAL}'" SFS_ENABLE ; Turn on filament runout G90 ; use absolute coordinates SET_PART_FAN PERCENT=20 ; Fan on approx. 20% to protect cooling ducts ;Start heating bed M117 Start > Heating Bed SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={ BED_TEMP } ; set bed temp G28 ; home all ;Move up to keep toolhead away from heating bed G1 Z75 F3000 TEMPERATURE_WAIT sensor=heater_bed minimum={BED_TEMP} ; wait for bed temp {% if DO_ABL == 1 %} ;Pre-heat the extruder while we build the mesh so it'll be ready SET_HEATER_TEMPERATURE HEATER=extruder TARGET={ EXTRUDER_TEMP-50 } ; set first layer extruder temp M117 ABL BED_MESH_CALIBRATE PROFILE=default; calibrate bed mesh leveling {% else %} ; Load the existing mesh M117 Loading Default ABL BED_MESH_PROFILE LOAD=default ; Use default mesh {% endif %} ;Turn part fan off unless otherwise requested SET_PART_FAN PERCENT=0 ;Home z after bed is heated G28 Z ;Park the head at the right location ;;Smart_Park ;Prepare M117 $MR$:Preparing to Print ;Heat extruder to final temp SET_HEATER_TEMPERATURE HEATER=extruder TARGET={ EXTRUDER_TEMP } ; set first layer extruder temp ;Turn on Nevermore filter SET_FAN_SPEED FAN=Nevermore SPEED=.8 ;Wait for everything to be ready TEMPERATURE_WAIT sensor=heater_bed minimum={BED_TEMP} ; wait for bed temp TEMPERATURE_WAIT sensor=extruder minimum={EXTRUDER_TEMP} ; wait for extruder temp M117 Start > Priming ;Draw Primer Line NOZZLE_PRIME_LINE G92 E0.0
Don’t copy this but it can be useful to see the order of how I have my mesh and heating, etc.
In your slicer of choice we just need a patch that’s the same height as your layer height (such as .2) you can find one online, create one or even download this one from Andrew Ellis’ GitHub.
https://github.com/AndrewEllis93/Print-Tuning-Guide/tree/main/test_prints
As it’s printing watch it and use the baby step ui to move it .01 up (if it’s over extruding and there’s ridges) or down (if it’s obviously too far and there’s gaps)
Then, when it’s done you hit the save icon or enter this in the console
Then save_config to save the value.
Run the print again and verify that you have a smooth solid print that matches what you see here in the phenomenal Ellis print tuning guide
https://ellis3dp.com/Print-Tuning-Guide/articles/first_layer_squish.html
Hopefully that helps and if it doesn’t there’s more that can be accounted for and adjusted but it’s always good to make sure we have the fundamentals.
The skewed and twisted X gantry took me a week of frustrating prints and tweaks before I stopped, redid the frame, etc and identified the issue.
Holy shit, you’re an absolute legend for going this far to help someone
Edit: OP is an asshat for not acknowledging you
I just felt the frustration… and having been there myself I thought I could offer a moment to just step back and establish the basics.
Hey, you’re an absolute Chad for putting this much effort into helping someone, whether they acknowledge or not. Thank you!
It can be frustrating… sometimes we just need to make sure we have a good foundation for everything else.
This needs to be posted somewhere more permanent, serious contribution right there
If I get a chance I can try and clean it up a bit and make it its own post perhaps
Please do this is great! Fills in gaps I found with other guides I’ve run into.