Parts

FYSETC Spider Controller

Reference

Bootloader Setup

Installation of the bootloader/firmware is a little confusing and I initially thought I had a bad board. I haven't been able to install bootloader or firmware without shorting the BOOT0 pins to force DFU mode. Here's the general process:

  1. Install jumper on BT0 pins and power on
  2. Launch STM32CubeProgrammer, select USB, and Connect
  3. Click the Erasing and Programming tab, and then:
    1. Pick the Bootloader_FYSETC_SPIDER.hex bootloader from the FYSETC Spider GitHub Repo
    2. Select Verify programming and Full Chip Erase
    3. Click Start Programm..
  4. Next install the firmware (previously compiled)
    1. Uncheck the Full chip erase checkbox
    2. Choose the firmware. After compiling, it can generally be found in the <<install path>>firmware/Marlin/.pio/build/FYSETC_S6_8000
    3. IMPORTANT: Change the Start addr.. to 0x08008000. For some reason the bootloader now looks for the firmware at the 8000 location vs the default 0x08000000
    4. Click Start Programm... to write the firmware
  5. Remove the BT0 pin and restart

Firmware (Klipper) Configuration

[include mainsail.cfg] 

# This file contains common pin mappings for the Fysetc Spider board.
# To use this config, the firmware should be compiled for the STM32F446.
# When calling "menuconfig", enable "extra low-level configuration setup"
# and select the "12MHz crystal" as clock reference
# For flashing, write the compiled klipper.bin to memory location 0x08000000

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

## Voron Design VORON2 250/300/350mm Spider TMC2209 UART config 

## *** THINGS TO CHANGE/CHECK: ***
## MCU paths							[mcu] section
## Thermistor types						[extruder] and [heater_bed] sections - See 'sensor types' list at end of file
## Z Endstop Switch location			[safe_z_home] section
## Homing end position				[gcode_macro G32] section
## Z Endstop Switch  offset for Z0		[stepper_z] section
## Probe points							[quad_gantry_level] section
## Min & Max gantry corner postions		[quad_gantry_level] section
## PID tune								[extruder] and [heater_bed] sections
## Fine tune E steps					[extruder] section

[mcu]
## Uncomment below if you're using the Raspberry uart0 to communicate with Spider
#restart_method: command

##  You need to select 'Communication interface' to USB in 'make menuconfig'
##  when you compile Klipper for Spider
##	Obtain definition by "ls -l /dev/serial/by-id/" then unplug to verify
##--------------------------------------------------------------------

serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_1E0048001050563046363120-if00

##	If you want to use the Raspberry uart0 to communicate with Spider, 
##  you need to select 'Communication interface' to 'Serial (on USART1 PA10/PA9)' 
##  in 'make menuconfig' when you compile klipper and set the serial as below
##--------------------------------------------------------------------
#serial: /dev/ttyAMA0
##--------------------------------------------------------------------

[printer]
kinematics: corexy
max_velocity: 300  
max_accel: 5000			        #Max 4000
max_z_velocity: 30			#Max 15 for 12V TMC Drivers, can increase for 24V
max_z_accel: 350
square_corner_velocity: 8.0

#####################################################################
#      X/Y Stepper Settings
#####################################################################

[stepper_x]
##	Connected to X-MOT (B Motor)
step_pin: PE11
dir_pin: PE10
enable_pin: !PE9
rotation_distance: 40
microsteps: 16
full_steps_per_rotation:200  #set to 400 for 0.9 degree stepper
endstop_pin: ^PB14
position_min: 0

##--------------------------------------------------------------------

##	Uncomment below for 225050mm build
#position_endstop: 250
#position_max: 250

##	Uncomment for 300mm build
position_endstop: 300
position_max: 300

##	Uncomment for 350mm build
#position_endstop: 350
#position_max: 350

##--------------------------------------------------------------------
homing_speed: 50   #Max 100
homing_retract_dist: 5
homing_positive_dir: true

##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_x]
uart_pin: PE7
interpolate: True
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

[stepper_y]
##	Connected to Y-MOT (A Motor)
step_pin: PD8
dir_pin: PB12
enable_pin: !PD9
rotation_distance: 40
microsteps: 16
full_steps_per_rotation:200  #set to 400 for 0.9 degree stepper
endstop_pin: ^PB13
position_min: 0
##--------------------------------------------------------------------

##	Uncomment for 250mm build
#position_endstop: 250
#position_max: 250

##	Uncomment for 300mm build
position_endstop: 300
position_max: 300

##	Uncomment for 350mm build
#position_endstop: 350
#position_max: 350

##--------------------------------------------------------------------
homing_speed: 50  #Max 100
homing_retract_dist: 5
homing_positive_dir: true

##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_y]
uart_pin: PE15
interpolate: True
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

#####################################################################
#   Z Stepper Settings
#####################################################################

## In Z-MOT Position
## Z0 Stepper - Front Left
[stepper_z]
step_pin: PD14
dir_pin: PD13
enable_pin: !PD15
rotation_distance: 40
gear_ratio: 80:16
microsteps: 16
##  In Z- Position

# pretap
# endstop_pin: ^PA0 (pretap)
endstop_pin: probe:z_virtual_endstop

##  Z-position of nozzle (in mm) to z-endstop trigger point relative to print surface (Z0)
##  (+) value = endstop above Z0, (-) value = endstop below
##	Increasing position_endstop brings nozzle closer to the bed
##  After you run Z_ENDSTOP_CALIBRATE, position_endstop will be stored at the very end of your config
#position_endstop: -0.5
##--------------------------------------------------------------------

##	Uncomment below for 250mm build
position_max: 170

##	Uncomment below for 300mm build
#position_max: 290

##	Uncomment below for 350mm build
#position_max: 340

##--------------------------------------------------------------------
position_min: -5
homing_speed: 10
second_homing_speed: 3
homing_retract_dist: 3

##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z]
uart_pin: PD10
uart_address: 0
interpolate: True
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

##	In E1-MOT Position
##	Z1 Stepper - Rear Left
[stepper_z1]
step_pin: PE6
dir_pin: !PC13
enable_pin: !PE5
rotation_distance: 40
gear_ratio: 80:16
microsteps: 16

##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z1]
uart_pin: PC14
interpolate: True
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

##	In E2-MOT Position
##	Z2 Stepper - Rear Right
[stepper_z2]
step_pin: PE2
dir_pin: PE4
enable_pin: !PE3
rotation_distance: 40
gear_ratio: 80:16
microsteps: 16

##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z2]
uart_pin: PC15
interpolate: true
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

##	In E3-MOT Position
##	Z3 Stepper - Front Right
[stepper_z3]
step_pin: PD12
dir_pin: !PC4
enable_pin: !PE8
rotation_distance: 40
gear_ratio: 80:16
microsteps: 16

[tmc2209 stepper_z3]
uart_pin: PA15
interpolate: true
run_current: 0.7
hold_current: 0.4
sense_resistor: 0.110
stealthchop_threshold: 0

#####################################################################
#   Extruder
#####################################################################

##	In E0-MOT Position
[extruder]
step_pin: PD5
dir_pin: !PD6
enable_pin: !PD4


##	Update value below when you perform extruder calibration
##	If you ask for 100mm of filament, but in reality it is 98mm:
##	rotation_distance = <previous_rotation_distance> * <actual_extrude_distance> / 100
##  22.6789511 is a good starting point
rotation_distance: 22.5078095278  	#Bondtech 5mm Drive Gears
##	Update Gear Ratio depending on your Extruder Type
##	Use 50:17 for Afterburner/Clockwork (BMG Gear Ratio)
##	Use 80:20 for M4, M3.1
gear_ratio: 50:17				#BMG Gear Ratio
microsteps: 16
full_steps_per_rotation: 200	#200 for 1.8 degree, 400 for 0.9 degree
nozzle_diameter: 0.400
filament_diameter: 1.75
##      In E0 OUT Position
heater_pin: PB15
##	Validate the following thermistor type to make sure it is correct
sensor_type: ATC Semitec 104GT-2
sensor_pin: PC0 # TE0 Position
min_temp: 10
max_temp: 270
max_power: 1.0
min_extrude_temp: 170
max_extrude_cross_section: 50.0
#control = pid
#pid_kp = 26.213
#pid_ki = 1.304
#pid_kd = 131.721
##	Try to keep pressure_advance below 1.0
pressure_advance: 0.05
##	Default is 0.040, leave stock
pressure_advance_smooth_time: 0.040

##	In E0-MOT Position
##	Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 extruder]
uart_pin: PD7
interpolate: false
run_current: 0.6
# hold_current: 0.2
sense_resistor: 0.110
stealthchop_threshold: 0

#####################################################################
#   Bed Heater
#####################################################################
[heater_bed]
##	SSR Pin - In BED OUT position
heater_pin: PB4
sensor_type: Generic 3950
sensor_pin: PC3 # TB Position
##	Adjust Max Power so your heater doesn't warp your bed
max_power: 0.6
min_temp: 0
max_temp: 120
#control: pid
#pid_kp: 58.437
#pid_ki: 2.347
#pid_kd: 363.769

#####################################################################
#	Probe
#####################################################################

[probe]
##	Inductive Probe - If you use this section , please comment the [bltouch] section
##	This probe is not used for Z height, only Quad Gantry Leveling
##	In Z+ position
##	If your probe is NC instead of NO, add change pin to ^PA3
pin: ^PA3
x_offset: 0

# pretap
#y_offset: 25.0

y_offset: 0
#z_offset: 0
speed: 20.0
samples: 2
samples_result: median
sample_retract_dist: 3.0
samples_tolerance: 0.01
samples_tolerance_retries: 4

activate_gcode:
    {% set PROBE_TEMP = 150 %}
    {% set MAX_TEMP = PROBE_TEMP + 5 %}
    {% set ACTUAL_TEMP = printer.extruder.temperature %}
    {% set TARGET_TEMP = printer.extruder.target %}

    {% if TARGET_TEMP > PROBE_TEMP %}
        { action_respond_info('Extruder temperature target of %.1fC is too high, lowering to %.1fC' % (TARGET_TEMP, PROBE_TEMP)) }
        M109 S{ PROBE_TEMP }
    {% else %}
        # Temperature target is already low enough, but nozzle may still be too hot.
        {% if ACTUAL_TEMP > MAX_TEMP %}
            { action_respond_info('Extruder temperature %.1fC is still too high, waiting until below %.1fC' % (ACTUAL_TEMP, MAX_TEMP)) }
            TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={ MAX_TEMP }
        {% endif %}
    {% endif %}

#####################################################################
#	Bltouch
#####################################################################

#[bltouch]
##	Bltouch - If you use this section , please comment the [probe] section
##	More infomation at : https://www.klipper3d.org/BLTouch.html
##	This bltouch is not used for Z height, only Quad Gantry Leveling
##	In Z+ Position
#sensor_pin: PA0
##	In Y+ Position
#control_pin: PA2
#x_offset: 0
#y_offset: 25.0
#z_offset: 0
#speed: 10.0
#samples: 3
#samples_result: median
#sample_retract_dist: 3.0
#samples_tolerance: 0.006
#samples_tolerance_retries: 3

#####################################################################
#	Fan Control
#####################################################################

## bpopp: swapped PB0 for PB3 because I burned up PB0 with short
[heater_fan hotend_fan]
##	Hotend Fan - FAN0 Connector
pin: PB3
max_power: 1.0
kick_start_time: 0.5
heater: extruder
heater_temp: 50.0
##	If you are experiencing back flow, you can reduce fan_speed
#fan_speed: 1.0

[fan]
##	Print Cooling Fan - FAN1 Connector
pin: PB1
max_power: 0.4
kick_start_time: 0.5
##	Depending on your fan, you may need to increase this value
##	if your fan will not start. Can change cycle_time (increase)
##	if your fan is not able to slow down effectively
# off_below: 0.10

[heater_fan controller_fan]
##	Controller fan - FAN2 Connector
pin: PB2
kick_start_time: 0.5
heater: heater_bed
heater_temp: 45.0
fan_speed: .3

#[heater_fan exhaust_fan]
##  Exhaust fan - In E2 OUT Positon
#pin: PB3
#max_power: 1.0
#shutdown_speed: 0.0
#kick_start_time: 5.0
#heater: heater_bed
#heater_temp: 60
#fan_speed: 1.0

#####################################################################
#	LED Control
#####################################################################

#  Chamber Lighting - In 5V-RGB Position
# [neopixel caselight ]
# pin: PD3
# chain_count: 15
# color_order: RGB 
# initial_RED: 1.0
# initial_GREEN: 1.0
# initial_BLUE: 1.0

[neopixel caselight]
pin: PD3
chain_count: 35
color_order: RGB
initial_RED: 1
initial_GREEN: 1
initial_BLUE: 1


#[output_pin caselight ]
#  Chamber Lighting - In 5V-RGB Position
#pin: PD3
#pwm: true
#shutdown_value: 0
#value: 1.0
#cycle_time: 0.01

#####################################################################
#	Homing and Gantry Adjustment Routines
#####################################################################

[idle_timeout]
timeout: 1800

[safe_z_home]
##	XY Location of the Z Endstop Switch
##	Update -10,-10 to the XY coordinates of your endstop pin 
##	(such as 157,305) after going through Z Endstop Pin
##	Location Definition step.
# pretap
# home_xy_position:205,300

home_xy_position:150,150
speed:100
z_hop:10
   
[quad_gantry_level]
##	Use QUAD_GANTRY_LEVEL to level a gantry.
##	Min & Max gantry corners - measure from nozzle at MIN (0,0) and 
##	MAX (250, 250), (300,300), or (350,350) depending on your printer size
##	to respective belt positions

#--------------------------------------------------------------------
##	Gantry Corners for 250mm Build
##	Uncomment for 250mm build
#gantry_corners:
#	-60,-10
#	310, 320
#points:
#	50,25
#	50,175
#	200,175
#	200,25
	
##	Gantry Corners for 300mm Build
##	Uncomment for 300mm build
gantry_corners:
	-60,-10
	360,370
points:
	50,25
	50,275
	250,275
	250,25

##	Gantry Corners for 350mm Build
##	Uncomment for 350mm build
#gantry_corners:
#	-60,-10
#	410,420
##	Probe points
#points:
#	50,25
#	50,275
#	300,275
#	300,25

#--------------------------------------------------------------------
speed: 150
horizontal_move_z: 10
retries: 5
retry_tolerance: 0.009
max_adjust: 10

#####################################################################
#	Displays
#####################################################################

#--------------------------------------------------------------------

[display]
#	mini12864 LCD Display
lcd_type: uc1701
cs_pin: PC11
a0_pin: PD2
rst_pin: PC10
encoder_pins: ^PC6,^PC7
click_pin: ^!PA8
contrast: 63
#spi_bus: spi1
spi_software_mosi_pin: PA7
spi_software_miso_pin: PA6
spi_software_sclk_pin: PA5

[neopixel fysetc_mini12864]
#	To control Neopixel RGB in mini12864 display
pin: PC12
chain_count: 3
initial_RED: 0.1
initial_GREEN: 0.5
initial_BLUE: 0.0
color_order: RGB

#	Set RGB values on boot up for each Neopixel. 
#	Index 1 = display, Index 2 and 3 = Knob
[delayed_gcode setdisplayneopixel]
initial_duration: 1
gcode:
        SET_LED LED=fysetc_mini12864 RED=1 GREEN=1 BLUE=1 INDEX=1 TRANSMIT=0
        SET_LED LED=fysetc_mini12864 RED=1 GREEN=0 BLUE=0 INDEX=2 TRANSMIT=0
        SET_LED LED=fysetc_mini12864 RED=1 GREEN=0 BLUE=0 INDEX=3 

#--------------------------------------------------------------------

#####################################################################
#	Macros
#####################################################################

[verify_heater extruder]
#max_error: 120
#   The maximum "cumulative temperature error" before raising an
#   error. Smaller values result in stricter checking and larger
#   values allow for more time before an error is reported.
#   Specifically, the temperature is inspected once a second and if it
#   is close to the target temperature then an internal "error
#   counter" is reset; otherwise, if the temperature is below the
#   target range then the counter is increased by the amount the
#   reported temperature differs from that range. Should the counter
#   exceed this "max_error" then an error is raised. The default is
#   120.
#check_gain_time: 40
#   This controls heater verification during initial heating. Smaller
#   values result in stricter checking and larger values allow for
#   more time before an error is reported. Specifically, during
#   initial heating, as long as the heater increases in temperature
#   within this time frame (specified in seconds) then the internal
#   "error counter" is reset. The default is 20 seconds for extruders
#   and 60 seconds for heater_bed.
#hysteresis: 5
#   The maximum temperature difference (in Celsius) to a target
#   temperature that is considered in range of the target. This
#   controls the max_error range check. It is rare to customize this
#   value. The default is 5.
#heating_gain: 2
#   The minimum temperature (in Celsius) that the heater must increase
#   by during the check_gain_time check. It is rare to customize this
#   value. The default is 2.


#####################################################################
#	Macros
#####################################################################

[gcode_macro G32]
gcode:
    BED_MESH_CLEAR
    G28
    QUAD_GANTRY_LEVEL
    G28
    ##	Uncomment for for your size printer:
    #--------------------------------------------------------------------
    ##	Uncomment for 250mm build
    #G0 X125 Y125 Z30 F3600
    
    ##	Uncomment for 300 build
    # CENTER
    
    ##	Uncomment for 350mm build
    #G0 X175 Y175 Z30 F3600
    #--------------------------------------------------------------------




[gcode_macro _PRINT_START]
#   Use PRINT_START for the slicer starting script - please customise for your slicer of choice
gcode:
    {% set BED_TEMP = params.BED|default(70)|float %}
    {% set EXTRUDER_TEMP = params.EXTRUDER|default(220)|float %}

    CASELIGHT_ON

    # M104 S150
    M140 S{BED_TEMP}

    CLEAN_NOZZLE
    G32                            ; home all axes   

    M109 S{EXTRUDER_TEMP}
    M190 S{BED_TEMP}
    
    _PRIME_LINE

[gcode_macro _PRINT_END]
#   Use PRINT_END for the slicer ending script - please customise for your slicer of choice
gcode:
    M400                           ; wait for buffer to clear
    G92 E0                         ; zero the extruder
    G1 E-1.0 F3600                 ; retract filament
    G91                            ; relative positioning
    G0 Z1.00 X20.0 Y20.0 F20000    ; move nozzle to remove stringing
    TURN_OFF_HEATERS
    M107                           ; turn off fan
    G1 Z2 F3000                    ; move nozzle up 2mm
    G90                            ; absolute positioning
    G0  X150 Y300 F3600            ; park nozzle at rear
    CASELIGHT_OFF
    #BED_MESH_CLEAR

[gcode_macro CENTER]
#   Use PRINT_END for the slicer ending script - please customise for your slicer of choice
gcode:
    G0 X150 Y150 Z50 F5000

[gcode_macro _PRIME_LINE]
gcode: 
    M117 Prime Line
    G92 E0 ;Reset Extruder
    # move z axis 
    G1 Z2.0 F3000 ;Move Z Axis up
    # move to prime position 
    G1 X20 Y20 Z0.28 F5000.0 ;Move to start position
    G1 X20 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line
    G1 X22 Y200.0 Z0.28 F5000.0 ;Move to side a little
    G1 X22 Y40 Z0.28 F1500.0 E30 ;Draw the second line
    G92 E0 ;Reset Extruder
    G1 Z2.0 F3000 ;Move Z Axis up

[gcode_macro UNLOAD]
gcode:
  G28
  CENTER
  M109 S220 T0 ## heat extruder and wait
  M83
  G1 E-50 F300
  G1 E-50 F300
  TURN_OFF_HEATERS
  G92 E0 ;Reset Extruder

# Filament change
[gcode_macro M600]
gcode:
    PAUSE_MACRO
    UNLOAD

[gcode_macro CASELIGHT_OFF]
gcode = 
  _LIGHTS R=0 G=0 B=0
  {action_respond_info("Caselight off")}


[gcode_macro CASELIGHT_ON]
gcode = 
  _LIGHTS  R=1 G=1 B=0.5
  {action_respond_info("Caselight on")}

[gcode_macro CASELIGHT_DIM]
gcode = 
  _LIGHTS  R=0.25 G=0.25 B=0.1
  {action_respond_info("Caselight 50%")}

[gcode_macro _LIGHTS]
gcode:
    #	Index 1 = display, Index 2 and 3 = Knob

    {% set R = params.R|default(1) %}
    {% set G = params.R|default(1) %}
    {% set B= params.R|default(1) %}
    SET_LED LED=caselight RED={R} GREEN={G} BLUE={B}
    SET_LED LED=fysetc_mini12864 RED=0 GREEN=0 BLUE=0 INDEX=1 TRANSMIT=0
    SET_LED LED=fysetc_mini12864 RED={R} GREEN={G} BLUE={B} INDEX=2 TRANSMIT=0
    SET_LED LED=fysetc_mini12864 RED={R} GREEN={G} BLUE={B} INDEX=3 

[gcode_macro CLEAN_NOZZLE]
variable_start_x: 280
variable_start_y: 296
variable_start_z: 3
variable_wipe_dist: -50
variable_wipe_qty: 10
variable_wipe_spd: 200
variable_raise_distance: 30

gcode:
 {% if "xyz" not in printer.toolhead.homed_axes %}
   G28
 {% endif %}
 
 G90                                            ; absolute positioning
 ## Move nozzle to start position
 G1 X{start_x} Y{start_y} F6000
 G1 Z{start_z} F1500

 ## Wipe nozzle
 {% for wipes in range(1, (wipe_qty + 1)) %}
   G1 X{start_x + wipe_dist} F{wipe_spd * 60}
   G1 X{start_x} F{wipe_spd * 60}
 {% endfor %}

 ## Raise nozzle
 G1 Z{raise_distance}


[gcode_macro ZUP]
gcode:
    SET_GCODE_OFFSET Z_ADJUST=0.01 MOVE=1

[gcode_macro ZDOWN]
gcode:
    SET_GCODE_OFFSET Z_ADJUST=-0.01 MOVE=1

#####################################################################
# 	Display Menu definition                                        #
#####################################################################
[menu __main __control __caselightonoff]
type: input
enable: {'output_pin caselight' in printer}
name: Lights: {'ON ' if menu.input else 'OFF'}
input: {printer['output_pin caselight'].value}
input_min: 0
input_max: 1
input_step: 1
gcode:
    {% if menu.input %}
      _CASELIGHT_ON
    {% else %}
      _CASELIGHT_OFF
    {% endif %}

## 	Thermistor Types
##   "EPCOS 100K B57560G104F"
##   "ATC Semitec 104GT-2"
##   "NTC 100K beta 3950"
##   "Honeywell 100K 135-104LAG-J01"
##   "NTC 100K MGB18-104F39050L32" (Keenovo Heater Pad)
##   "AD595"
##   "PT100 INA826"

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [heater_bed]
#*# control = pid
#*# pid_kp = 36.483
#*# pid_ki = 1.871
#*# pid_kd = 177.854
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 26.692
#*# pid_ki = 1.648
#*# pid_kd = 108.103
#*#
#*# [probe]
#*# z_offset = -0.970