Skip to main content

Upgrading the Creality Sermoon V1 3D printer

Creality Sermoon V1 motherboard
Creality Sermoon V1 internals.

We will install OpenWrt on the WiFi box, followed by Klipper with Fluidd (or another UI of your choice). After setting up Klipper, we can add a CR Touch sensor to the printer to significantly enhance its performance.

The installation of OpenWrt and Klipper with Fluidd is based on this tutorial:


Disclaimer: I am not responsible for any modifications you make to your equipment. Follow this tutorial at your own risk.

Install OpenWrt #

  1. Format a USB drive to FAT32.
  2. Download the file Firmware/OpenWrt_snapshot/openwrt-ramips-mt76x8-creality_wb-01-squashfs-sysupgrade.bin from the repo.
  3. Rename the file to root_uImage.
  4. Copy the file to the USB drive.
  5. Power off the 3D printer.
  6. Remove the side panel.
  7. Connect the USB drive:
    1. My printer came with a USB cable.
    2. Disconnect the cable from the printer board and connect the USB cable to the WiFi board.
    3. Use jumper wires to connect power from the printer board to the WiFi box (see the image below) - it’s a bit hacky, but it works.
    4. Connect the USB drive.
      WiFi Box with USB drive connected
      Hack to connect power and USB drive to Creality WiFi box.
  8. Hold the reset button on the WiFi box.
  9. Power on the printer while holding the reset button.
  10. Wait for 6-10 seconds or until the green LED turns on, then release the reset button.
  11. Wait a few minutes for the flashing process to complete.

Restore Stock Firmware - do this in case things go wrong #

  1. Download the firmware Creality__Box_Firmware-V3.03b62 from the Creality Website.
  2. Extract the contents of the archive.
  3. Format the USB drive to FAT32.
  4. Move the file root_uImage to the USB drive.
  5. Follow the steps above starting from step 5.

Configure OpenWrt #

  1. Connect to the hotspot created by OpenWrt.
  2. Go to 192.168.1.1:81.
  3. Log in with the default username root (no password).
  4. Change the subnet of the WiFi Box to avoid conflicts with your home network:
    1. Go to Network > Interfaces.
    2. Click on Edit.
    3. Change the IPv4 address to 192.168.3.1.
    4. Click Save (this closes the popup).
    5. Click on the dropdown button next to Save & Apply and select Apply unchecked.
    6. Click Apply unchecked.
    7. Reconnect to the WiFi box hotspot using the new IP 192.168.3.1:81.
  5. Connect the WiFi Box to your home WiFi:
    1. Go to Network > Wireless.
    2. On the item MediaTex..., click the button Scan.
    3. Find your home network and click on Join Network.
    4. Enter your WiFi password.
    5. Check the box Lock to BSSID.
    6. Create a new firewall zone named wwan.
    7. Click Save.
    8. Ensure the field in Interface Configuration > Mode says Client.
    9. Click Save.
    10. Click Save & Apply.
    11. Go to Network > Interfaces.
    12. Check the IP of the WiFi box in your home network and save it.
    13. Go to Network > Firewall.
    14. Change all parameters of wwan to accept and enable Masquerading.
    15. Click Save & Apply.
  6. Connect your computer back to your home network.
  7. Go to the IP you saved - remember to add the port number :81.
  8. You’re done!

Install Klipper, Moonraker, and Fluidd #

  1. Go to OpenWrt > Services > Terminal.
  2. Go to the Config tab.
  3. Change the Interface to @wwan and apply changes.
  4. Go to the Terminal tab.
  5. Log in with root (no password).
  6. Paste and run the following commands:
cd ~
wget https://github.com/ihrapsa/KlipperWrt/raw/main/scripts/1_format_extroot.sh
chmod +x 1_format_extroot.sh
./1_format_extroot.sh
  1. After the command completes, run reboot.
  2. Wait for the reboot, then go to the terminal again.
  3. Run the following commands:
opkg update
opkg install ar --force-overwrite
opkg install gcc
  1. Run: (this might take upwards of an hour or so)
cd ~
wget https://github.com/ihrapsa/KlipperWrt/raw/main/scripts/2_script_manual.sh
chmod +x 2_script_manual.sh
./2_script_manual.sh
  1. Follow the installation steps and wait.
  2. Remove the scripts using rm *.sh.
  3. Reboot.
  4. You should now be able to access Fluidd using the IP of your printer.

Flash Klipper on the Printer #

If you want to use the binary compiled by me, you can skip to step 7.

  1. On your computer’s terminal (not OpenWrt terminal), clone the repo: git clone https://github.com/Klipper3d/klipper.git.
  2. Navigate to the repo folder.
  3. Run make menuconfig.
  4. Select the following options:
    1. STM32
    2. STM32F401
    3. 64KiB bootloader
    4. Serial on USART1 PA10/PA9
  5. Save and exit.
  6. Run make.
  7. Copy out/klipper.bin to an SD Card and rename the file to firmware.bin. (download here the compiled binary)
  8. Ensure the printer is off.
  9. Insert the SD card.
  10. Turn on the printer and wait for it to install - the loading bar should be stuck.
  11. Wait a couple of minutes just to be sure. Reboot the printer. If the loading bar is frozen, you’re successful.

Setup serial communication with printer #

You can follow this tutorial, or the steps described below wich I took from there. You should be able to just skip to step 5, but I included all the steps so you can double check if you prefer.

  1. Go to OpenWrt terminal and run opkg update && opkg install usbutils.
  2. Run the command lsusb to find your mainboard ID - something like ia86:7523 (idVendor:idProduct).
  3. Do grep ia86:7523 /sys/bus/usb/devices/*/uevent - replace idVendor and idProduct accordingly.
  4. Note the values of PRODUCT: something like 1a86/7523/264.
  5. Copy and run the command block below that will create a hotplug rule:
cat << "EOF" > /etc/hotplug.d/usb/22-tty-symlink
# Description: Action executed on boot (bind) and with the system on the fly
PRODID="1a86/7523/264" #change here according to "PRODUCT=" from grep command
SYMLINK="ttyPrinter" #you can change this to whatever you want just don't use spaces. Use this inside printer.cfg as serial port path
if [ "${ACTION}" = "bind" ] ; then
  case "${PRODUCT}" in
    ${PRODID}) # mainboard product id prefix
      DEVICE_TTY="$(ls /sys/${DEVPATH}/tty*/tty/)"
      # Mainboard connected to USB1 slot
      if [ "${DEVICENAME}" = "1-1.4:1.0" ] ; then
        ln -s /dev/${DEVICE_TTY} /dev/${SYMLINK}
        logger -t hotplug "Symlink from /dev/${DEVICE_TTY} to /dev/${SYMLINK} created"

      # Mainboard connected to USB2 slot
      elif [ "${DEVICENAME}" = "1-1.2:1.0" ] ; then
        ln -s /dev/${DEVICE_TTY} /dev/${SYMLINK}
        logger -t hotplug "Symlink from /dev/${DEVICE_TTY} to /dev/${SYMLINK} created"
      fi
    ;;
  esac
fi
# Action to remove the symlinks
if [ "${ACTION}" = "remove" ]  ; then
  case "${PRODUCT}" in
    ${PRODID})  #mainboard product id prefix
     # Mainboard connected to USB1 slot
      if [ "${DEVICENAME}" = "1-1.4:1.0" ] ; then
        rm /dev/${SYMLINK}
        logger -t hotplug "Symlink /dev/${SYMLINK} removed"

      # Mainboard connected to USB2 slot
      elif [ "${DEVICENAME}" = "1-1.2:1.0" ] ; then
        rm /dev/${SYMLINK}
        logger -t hotplug "Symlink /dev/${SYMLINK} removed"
      fi
    ;;
  esac
fi
EOF
  1. Restart the printer.

Configure printer.cfg #

  • Download the printer.cfg file from: https://github.com/Klipper3d/klipper/blob/master/config/printer-creality-sermoonV1-2022.cfg.
  • Place your printer.cfg inside /root/printer_data/config/ (you can also use Fluidd to create this file).
  • Delete these blocks from your printer.cfg: [virtual_sdcard], [display_status], [pause_resume] (they’re included in fluidd.cfg/mainsail.cfg).
  • Add this line inside your printer.cfg: [include fluidd.cfg].
  • Under [mcu], change your serial port path to /dev/ttyPrinter.
  • Do a FIRMWARE RESTART inside Fluidd.
  • Invert the direction of the Z axis in Fluidd: Settings > Tools > Invert Z Control.

Install CR Touch #

The cable that comes with the CR Touch doesn’t match the port on the extruder head. The extruder head TOUCH port uses a JST ZH (2.0mm) 5-pin port. Since I didn’t have a replacement cable, I soldered the cable directly to the extruder board.

Here’s how it looks:

CR Touch connection soldered to extruder
CR Touch cable soldered directly to the extruder board.

I printed the following support: https://www.printables.com/model/351100-sprite-extruder-cr-touch-mount-sermoon-v1.

After attaching the support and CR Touch sensor, I noticed it looked tilted, so I added a screw to make it parallel to the extruder.

CR Touch sensor attached
CR Touch sensor attached to the extruder.
CR Touch sensor attached - bottom view
CR Touch bottom view.

Adjust X-Axis Limits #

Since the CR Touch is on the left side of the extruder, prevent the extruder from hitting the left wall and damaging the CR Touch.

Move the extruder to the leftmost position and record the coordinates. Subtract that from the X size of the bed.

Example for my printer and CR Touch setup:

[stepper_x]
step_pin: PA7
dir_pin: !PA4
enable_pin: !PB8
microsteps: 16
rotation_distance: 40
endstop_pin: PC4
position_endstop: 167.5
position_max: 167.5
position_min: 0
homing_speed: 50

Calibrate CR Touch #

To set up the CR Touch, I followed this video tutorial:

For Z homing using the CR Touch, modify the Z-axis settings as follows:

[stepper_z]
step_pin: PB7
dir_pin: PB6
enable_pin: !PB8
microsteps: 16
rotation_distance: 8
# Creality CR-Touch sensor:
endstop_pin: probe:z_virtual_endstop
homing_positive_dir: False
position_max: 160
position_min: -3
  • endstop_pin: Set to the probe virtual endstop.
  • homing_positive_dir: Should be False to ensure the printer homes at Z=0.
  • position_max: Adjusted to 160 to provide space for lowering the bed when the probe extends, related to the z_hop option in [safe_z_home].

Configure [safe_z_home] as follows:

[safe_z_home]
home_xy_position: 167.5,0 # XY home
z_hop: 5       # Move up 5mm
z_hop_speed: 5

Level the Bed #

To physically level the bed using the CR Touch sensor and Klipper, I recommend this video:

My Current Settings #

After extensive tweaking, here are my current [bltouch] settings:

[bltouch]
sensor_pin: ^PC2
control_pin: PC3
x_offset: -36.7
y_offset: 0
speed: 5
samples: 2
stow_on_each_sample: False
probe_with_touch_mode: True
pin_up_touch_mode_reports_triggered: False
#z_offset: 0.0 # will update

And here are my [bed_mesh] settings:

[bed_mesh]
speed: 100
horizontal_move_z: 5
mesh_min: -2.7, 0
mesh_max: 130.8, 175 # May need calibration for your specific printer
probe_count: 7,7
algorithm: bicubic
fade_start: 1
fade_end: 10
fade_target: 0

printer.cfg #

Click here to reveal the config file.
# This file contains pin mappings for the Creality Sermoon V1
# with CR-FDM-v2.4.S1.200 motherboard.

# To use this config, during "make menuconfig" select the STM32F401
# with a "64KiB bootloader" and serial (on USART1 PA10/PA9)
# communication.

# If you prefer a direct serial connection, in "make menuconfig"
# select "Enable extra low-level configuration options" and select
# Serial (on USART2 PA3/PA2), which is broken out on the 10 pin IDC
# cable used for the LCD module as follows:
# 3: Tx, 4: Rx, 9: GND, 10: VCC

# Flash this firmware by copying "out/klipper.bin" to a SD card and
# turning on the printer with the card inserted. The firmware
# filename must changed to "firmware.bin"

# See docs/Config_Reference.md for a description of parameters.

[exclude_object]

[include macros.cfg]

[include KAMP_Settings.cfg]

[stepper_x]
step_pin: PA7
dir_pin: !PA4
enable_pin: !PB8
microsteps: 16
rotation_distance: 40
endstop_pin: PC4
position_endstop: 167.5
position_max: 167.5
position_min: 0
homing_speed: 50

[stepper_y]
step_pin: PB0
dir_pin: PB10
enable_pin: !PB8
microsteps: 16
rotation_distance: 40
endstop_pin:  PB13
position_endstop: 0
position_max: 175
position_min: 0
homing_speed: 50

[stepper_z]
step_pin: PB7
dir_pin: PB6
enable_pin: !PB8
microsteps: 16
rotation_distance: 8
#endstop_pin:  PB3
# Creality CR-Touch sensor:
endstop_pin: probe:z_virtual_endstop
homing_positive_dir: False
#position_endstop: 0
position_max: 160
position_min: -3

[extruder]
step_pin: PB1
dir_pin: PB12
enable_pin: !PB8
microsteps: 16
gear_ratio: 42:12
rotation_distance: 26.359
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PC5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC1
control: pid
pid_Kp: 30.090
pid_Ki: 1.875
pid_Kd: 120.735
min_temp: 0
max_temp: 290
max_extrude_cross_section: 5
pressure_advance: 0.16

[firmware_retraction]
retract_length: 0.8
#   The length of filament (in mm) to retract when G10 is activated,
#   and to unretract when G11 is activated (but see
#   unretract_extra_length below). The default is 0 mm.
retract_speed: 40
#   The speed of retraction, in mm/s. The default is 20 mm/s.
#unretract_extra_length: 0
#   The length (in mm) of *additional* filament to add when
#   unretracting.
#unretract_speed: 10
#   The speed of unretraction, in mm/s. The default is 10 mm/s.


[heater_bed]
heater_pin: PB9
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PC0
control: pid
pid_Kp: 75.694
pid_Ki: 1.160
pid_Kd: 1234.759
min_temp: 0
max_temp: 90

[fan]
pin: PA5

[fan_generic side_fan]
pin: PC15

# [controller_fan controller_fan]
# In order to access the controller fan, the controller fan needs to be plugged
# in another location. See https://github.com/Klipper3d/klipper/pull/5621
# for more information.
# pin: PB4

[mcu]
serial: /dev/ttyPrinter
restart_method: command

[printer]
kinematics: cartesian
max_velocity: 200
max_accel: 2000
max_z_velocity: 5
max_z_accel: 100

[include fluidd.cfg]

# Uncomment to enable timelapse
#[include timelapse.cfg]

[output_pin CASE_LIGHT]
pin: PC14

[bltouch]
sensor_pin: ^PC2
control_pin: PC3
x_offset: -36.7
y_offset: 0
speed: 5
samples: 2
stow_on_each_sample: False
probe_with_touch_mode: True
pin_up_touch_mode_reports_triggered: False
#z_offset: 0.0 # will update

[safe_z_home]
home_xy_position: 167.5,0
z_hop: 5       # move up 5mm
z_hop_speed: 5

[screws_tilt_adjust]
screw1: 60.5, 35     #screw coordinates need to be measure for YOUR specific printer
screw1_name: front left screw
screw2: 167.5, 35
screw2_name: front right screw
screw3: 167.5, 145
screw3_name: rear right screw
screw4: 60.5, 145
screw4_name: rear left screw
horizontal_move_z: 10.
speed: 100.   #speed of travel moves between screws
screw_thread: CW-M4  #measure your bed screw m3=3mm / m4=4mm / m5=5mm

[bed_mesh]
speed: 100
horizontal_move_z: 5
mesh_min: -2.7, 0
mesh_max: 130.8, 175 #this may need to be calibrated for your individual printer
probe_count: 7,7
algorithm: bicubic
fade_start: 1
fade_end: 10
fade_target: 0

[delayed_gcode my_delayed_gcode]
initial_duration: 1.0
gcode:
    # Turn on the printer light
    SET_PIN PIN=CASE_LIGHT VALUE=1

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 	-1.946500, -1.984000, -2.006500, -2.031500, -2.034000, -2.036500, -2.054000
#*# 	-1.931500, -1.969000, -1.979000, -1.996500, -2.006500, -2.009000, -2.041500
#*# 	-1.911500, -1.944000, -1.971500, -1.986500, -2.016500, -2.009000, -2.036500
#*# 	-1.936500, -1.976500, -1.999000, -2.014000, -2.046500, -2.036500, -2.041500
#*# 	-1.934000, -1.956500, -1.989000, -2.001500, -2.026500, -2.014000, -2.039000
#*# 	-1.984000, -2.009000, -2.036500, -2.041500, -2.056500, -2.031500, -2.054000
#*# 	-1.984000, -2.031500, -2.056500, -2.079000, -2.081500, -2.061500, -2.071500
#*# x_count = 7
#*# y_count = 7
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = bicubic
#*# tension = 0.2
#*# min_x = -2.7
#*# max_x = 130.8
#*# min_y = 0.0
#*# max_y = 174.96
#*#
#*# [bed_mesh manual]
#*# version = 1
#*# points =
#*# 	-2.100000, -2.350000, -2.475000
#*# 	-1.925000, -2.230000, -2.450000
#*# 	-1.700000, -2.070000, -2.245000
#*# x_count = 3
#*# y_count = 3
#*# mesh_x_pps = 3
#*# mesh_y_pps = 3
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 5.0
#*# max_x = 170.0
#*# min_y = 5.0
#*# max_y = 170.0
#*#
#*# [bltouch]
#*# z_offset = 0.960