Finally got dragging kicking and screaming into the ‘10s with a Xmas gift of a used Ender 3

What do I do? throw Klipper on it and have a month of pain.

Most things were pretty straightforward, but the pin assignments were a bit wonkey vs the off the shelf configurations.

Here is my printer.cfg for a Creality 4.2.7 silent board with BLtouch:

[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 1500
max_z_velocity: 20
max_z_accel: 250

[extruder]
rotation_distance: 32.052
nozzle_diameter: 0.400
filament_diameter: 1.750

pressure_advance: 0.30
pressure_advance_smooth_time: 0.060

max_extrude_only_distance: 100.0
step_pin: PB3
dir_pin: PB4
enable_pin: !PC3
microsteps: 16
heater_pin: PA1
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC5
min_temp: 0
max_temp: 250

[firmware_retraction]
retract_length: 5
retract_speed: 40
unretract_speed: 20
#unretract_extra_length: 0

[bltouch]
control_pin: PB0
sensor_pin: ^PB1
x_offset: -46
y_offset: -5
z_offset = 1.000

[gcode_macro PROGRAM_START]
gcode:
    {% set BED_TEMP = params.BED_TEMP %}
    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP %}

    M106 S128; Enable fans at 50%

    {% if BED_TEMP is defined %}
    SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={ BED_TEMP }
    {% endif %}

    {% if EXTRUDER_TEMP is defined %}
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET={ EXTRUDER_TEMP|int - 30 }
    {% endif %}

    M117 Homing
    G28 ; home all axes
    G90 ; absolute coords
    SCREWS_TILT_CALCULATE MAX_DEVIATION=0.10 ; check base bed alignment
    BED_MESH_PROFILE LOAD=default

    M117 Heating
    G1 Z15 ; lift z up
    G1 X0 Y0; bring nozzle left and bed back

    {% if BED_TEMP is defined %}
    M190 S{BED_TEMP};  warm up bed
    {% endif %}
    {% if EXTRUDER_TEMP is defined %}
    M109 S{EXTRUDER_TEMP}
    {% endif %}

    M117 Purging
    G92 E0     ; reset extruder
    G1 Z1.0 F3000 ; move z up little to prevent scratching of surface
    G1 X0.1 Y20 Z0.3 F5000.0 ; move to start-line position
    G1 X0.1 Y200.0 Z0.3 F1500.0 E15 ; draw 1st line
    G1 X0.4 Y200.0 Z0.3 F5000.0 ; move to side a little
    G1 X0.4 Y20 Z0.3 F1500.0 E25 ; draw 2nd line
    G92 E0     ; reset extruder
    G1 Z2.0 F3000    ; move z up little to prevent scratching of surface

    M117

[input_shaper]
shaper_freq_x: 34
shaper_freq_y: 62
shaper_type: mzv

[stepper_x]
dir_pin: PC2
enable_pin: !PC3
endstop_pin: ^PA5
step_pin: PB9

homing_speed: 50
microsteps: 16
position_endstop: 0
position_max: 235
rotation_distance: 40

[stepper_y]
dir_pin: PB8
enable_pin: !PC3
endstop_pin: ^PA6
step_pin: PB7

homing_speed: 50
microsteps: 16
position_endstop: 0
position_max: 235
rotation_distance: 40

[stepper_z]
dir_pin: !PB6
enable_pin: !PC3
endstop_pin: probe:z_virtual_endstop
step_pin: PB5

microsteps: 16
position_max: 250
position_min: -3
rotation_distance: 8

[homing_override]
gcode:
    G90 ; Use absolute position mode
    G1 Z10 ; Move up 10mm
    G28 X Y
    G1 X166 Y120 F6000 ; Change the X and Y coordinates to the center of your print bed
    G28 Z
set_position_z: 0.0

[heater_bed]
heater_pin: PA2
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC4
control: pid
pid_Kp: 54.027
pid_Ki: 0.770
pid_Kd: 948.182
min_temp: 0
max_temp: 130

[fan]
pin: PA0

[mcu]
serial: /dev/ttyUSB0

[virtual_sdcard]
path: ~/gcode_files

[gcode_macro LEVEL_BED]
gcode:
    {% set BED_TEMP = params.BED_TEMP|default(50) %}
    G28
    SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
    M190 S{BED_TEMP};  warm up bed
    BED_MESH_CALIBRATE
    BED_MESH_OUTPUT


[gcode_macro PROGRAM_END]
gcode:
    G91 ; relative positioning
    G1 Z2 ; lift z up
    G90 ; absolute positioning
    G1 X0 Y200 ; bring nozzle left and bed forward
    M106 S0 ; turn off cooling fan
    M104 S0 ; turn off extruder
    M140 S0 ; turn off bed
    M84 ; disable motors

[gcode_macro CANCEL_PRINT]
description: Cancel the actual running print
rename_existing: CANCEL_PRINT_BASE
gcode:
  M84
  TURN_OFF_HEATERS
  CANCEL_PRINT_BASE

[display_status]

[pause_resume]

[display]
lcd_type: st7920
cs_pin: PB12
sclk_pin: PB13
sid_pin: PB15
encoder_pins: ^PB14, ^PB10
click_pin: ^!PB2

[bed_mesh]
speed: 200
horizontal_move_z: 5
mesh_min: 32, 60  # add the x and y offsets for both mesh_min and max. This is set for mine.
mesh_max: 172, 210
probe_count: 5,5
mesh_pps: 2,2

[screws_tilt_adjust]
screw_thread: CW-M3
screw1_name: Rear Left
screw2_name: Rear right
screw3_name: Front right
screw4_name: Front Left
screw1: 77,215
screw2: 235,215
screw3: 235,50
screw4: 77,50
horizontal_move_z: 10
speed: 150

Few notes:

  • BLTouch offset, specificly z_offset must be set according to the bed leveling process
  • Accel and Max V show signs of ringing on external walls. Addressed in slicer by maxV.
  • Slicer should be configured to only call PROGRAM_START and PROGRAM_END start/end GCODE.
  • PROGRAM_START takes arguments of BED_TEMP and EXTRUDER_TEMP
  • screws_tilt_adjust runs into the X limit, so the right side is not quite aligned. close enough to bed level though.