Hardware

OS Install

Download and install the base Klipper kernel

  1. See [1] for the BTT Pi 1 image
  2. Find the pi on the network and login to pi as root/root

Install Klipper, Moonraker and Mainsail

Install KIAUH (cannot install as root)

sudo apt-get update && sudo apt-get install git -y
cd ~ && git clone https://github.com/dw-0/kiauh.git
./kiauh/kiauh.sh

Follow prompts to install various components

Install Klipper to Octopus

See https://docs.vorondesign.com/build/software/octopus_klipper.html

cd ~/klipper
make menuconfig
# Enable extra low-level configuration options
#  Micro-controller Architecture (STMicroelectronics STM32)  --->
#  Processor model (STM32F446)  --->
#  Bootloader offset (32KiB bootloader)  --->
#  Clock Reference (12 MHz crystal)  --->
make
  1. Install firmeware to Octopus from file created at out/klipper.bin:
    • Over USB from PI via DFU
    • From memory card (recommended)
  2. Install default printer.cfg from BTT
[include mainsail.cfg]
[include ebb.cfg]

[mcu]
serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_1E0035000751313031393839-if00

[printer]
kinematics: corexy
max_velocity: 300  
max_accel: 4000			        #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
#####################################################################

##  B Stepper - Left
##  Connected to MOTOR_0
##  Endstop connected to DIAG_0
[stepper_x]
step_pin: PF13
dir_pin: !PF12
enable_pin: !PF14
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:200  #set to 400 for 0.9 degree stepper
endstop_pin: PG6
position_min: 0
##--------------------------------------------------------------------

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

##--------------------------------------------------------------------
homing_speed: 60   #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: PC4
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0

##  A Stepper - Right
##  Connected to MOTOR_1
##  Endstop connected to DIAG_1
[stepper_y]
step_pin: PG0
dir_pin: !PG1
enable_pin: !PF15
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:200  #set to 400 for 0.9 degree stepper
endstop_pin: PG9
position_min: 0
position_endstop: 300
position_max: 300

##--------------------------------------------------------------------
homing_speed: 25  #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: PD11
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0
 
#####################################################################
#   Z Stepper Settings
#####################################################################

## Z0 Stepper - Front Left
##  Connected to MOTOR_2
##  Endstop connected to DIAG_2
[stepper_z]
step_pin: PF11
dir_pin: !PG3
enable_pin: !PG5
rotation_distance: 40
gear_ratio: 80:16
microsteps: 32
endstop_pin: PG10
##  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
position_max: 260

##--------------------------------------------------------------------
position_min: -5
homing_speed: 8
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: PC6
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0

##  Z1 Stepper - Rear Left
##  Connected to MOTOR_3
[stepper_z1]
step_pin: PG4
dir_pin: PC1
## Octopus 1.0 & 1.1.  Octopus PRO 1.0
#enable_pin: !PA0
## Octopus PRO 1.1
#enable_pin: !PA2
rotation_distance: 40
gear_ratio: 80:16
microsteps: 32

##  Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z1]
uart_pin: PC7
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0

##  Z2 Stepper - Rear Right
##  Connected to MOTOR_4
[stepper_z2]
step_pin: PF9
dir_pin: !PF10
enable_pin: !PG2
rotation_distance: 40
gear_ratio: 80:16
microsteps: 32

##  Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z2]
uart_pin: PF2
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0

##  Z3 Stepper - Front Right
##  Connected to MOTOR_5
[stepper_z3]
step_pin: PC13
dir_pin: PF0
enable_pin: !PF1
rotation_distance: 40
gear_ratio: 80:16
microsteps: 32

##  Make sure to update below for your relevant driver (2208 or 2209)
[tmc2209 stepper_z3]
uart_pin: PE4
interpolate: false
run_current: 0.8
sense_resistor: 0.110
stealthchop_threshold: 0


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

##  Connected to MOTOR_6
##  Heater - HE0
##  Thermistor - T0
# [extruder]
# step_pin: PE2
# dir_pin: PE3
# 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.6789511   #Bondtech 5mm Drive Gears
# ##  Update Gear Ratio depending on your Extruder Type
# ##  Use 50:10 for Stealthburner/Clockwork 2
# ##  Use 50:17 for Afterburner/Clockwork (BMG Gear Ratio)
# ##  Use 80:20 for M4, M3.1
# gear_ratio: 50:10
# microsteps: 32
# full_steps_per_rotation: 200    #200 for 1.8 degree, 400 for 0.9 degree
# nozzle_diameter: 0.400
# filament_diameter: 1.75
# ## Octopus 1.0 & 1.1.  Octopus PRO 1.0
# heater_pin: PA2
# ## Octopus PRO 1.1
# #heater_pin: PA0
# ## Check what thermistor type you have. See https://www.klipper3d.org/Config_Reference.html#common-thermistors for common thermistor types.
# ## Use "Generic 3950" for NTC 100k 3950 thermistors
# #sensor_type:
# sensor_type: ATC Semitec 104GT-2
# sensor_pin: PF4
# min_temp: 10
# max_temp: 270
# max_power: 1.0
# min_extrude_temp: 160
# 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

# ##  E0 on MOTOR6
# ##  Make sure to update below for your relevant driver (2208 or 2209)
# [tmc2209 extruder]
# uart_pin: PE1
# interpolate: false
# run_current: 0.5
# sense_resistor: 0.110
# stealthchop_threshold: 0


#####################################################################
#   Bed Heater
#####################################################################

##  SSR Pin - HE1
##  Thermistor - TB
[heater_bed]
##  Uncomment the following line if using the default SSR wiring from the docs site
heater_pin: PA3
##  Other wiring guides may use BED_OUT to control the SSR. Uncomment the following line for those cases
#heater_pin: PA1
## Check what thermistor type you have. See https://www.klipper3d.org/Config_Reference.html#common-thermistors for common thermistor types.
## Use "Generic 3950" for Keenovo heaters
sensor_type: Generic 3950
sensor_pin: PF3
##  Adjust max_power so it doesn't exceed the SSR rating. The Omron G3NA-210B-DC5 SSR is rated at 4 amps without a heatsink.
##  The formula is "4 / (Wattage_of_bed_heater / Mains_voltage) = max_power"
##  If max_power is greater than 1.0, use 1.0
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
#####################################################################

##  Inductive Probe
##  This probe is not used for Z height, only Quad Gantry Leveling
[probe]

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

## Select the probe port by type:
## For the PROBE port. Will not work with Diode. May need pull-up resistor from signal to 24V.
pin: ~!PB7
## For the DIAG_7 port. NEEDS BAT85 DIODE! Change to !PG15 if probe is NO.
#pin: PG15
## For Octopus Pro PROBE port; NPN and PNP proximity switch types can be set by jumper
#pin: ~!PC5

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

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
#####################################################################

# ##  Print Cooling Fan - FAN0
# [fan]
# pin: PA8
# 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


# ##  Hotend Fan - FAN1
# [heater_fan hotend_fan]
# pin: PE5
# 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

##  Controller fan - FAN2
[controller_fan controller_fan]
pin: PD12
kick_start_time: 0.5
heater: heater_bed

##  Exhaust fan - FAN3
#[heater_fan exhaust_fan]
#pin: PD13
#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 - HE2 Connector (Optional)
#[output_pin caselight]
##Octopus 1.0 & 1.1, Octopus PRO 1.0
#pin: PB10
##Octopus PRO 1.1
#pin: PB0
#pwm:true
#shutdown_value: 0
#value:1
#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.
home_xy_position:-10,-10
speed:100
z_hop:10


##  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
[quad_gantry_level]

gantry_corners:
	-60,-10
	360,370
points:
	50,25
	50,275
	250,275
	250,25

speed: 100
horizontal_move_z: 10
retries: 5
retry_tolerance: 0.0075
max_adjust: 10

########################################
# EXP1 / EXP2 (display) pins
########################################

[board_pins]
aliases:
    # EXP1 header
    EXP1_1=PE8, EXP1_2=PE7,
    EXP1_3=PE9, EXP1_4=PE10,
    EXP1_5=PE12, EXP1_6=PE13,    # Slot in the socket on this side
    EXP1_7=PE14, EXP1_8=PE15,
    EXP1_9=<GND>, EXP1_10=<5V>,

    # EXP2 header
    EXP2_1=PA6, EXP2_2=PA5,
    EXP2_3=PB1, EXP2_4=PA4,
    EXP2_5=PB2, EXP2_6=PA7,      # Slot in the socket on this side
    EXP2_7=PC15, EXP2_8=<RST>,
    EXP2_9=<GND>, EXP2_10=<5V>

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

##  Uncomment the display that you have
#--------------------------------------------------------------------


##  RepRapDiscount 128x64 Full Graphic Smart Controller
#[display]
#lcd_type: st7920
#cs_pin: EXP1_4
#sclk_pin: EXP1_5
#sid_pin: EXP1_3
#menu_timeout: 40
#encoder_pins: ^EXP2_5, ^EXP2_3
#click_pin: ^!EXP1_2

#[output_pin beeper]
#pin: EXP1_1

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


##  mini12864 LCD Display
#[display]
#lcd_type: uc1701
#cs_pin: EXP1_3
#a0_pin: EXP1_4
#rst_pin: EXP1_5
#encoder_pins: ^EXP2_5, ^EXP2_3
#click_pin: ^!EXP1_2
#contrast: 63
#spi_software_miso_pin: EXP2_1
#spi_software_mosi_pin: EXP2_6
#spi_software_sclk_pin: EXP2_2

##  To control Neopixel RGB in mini12864 display
#[neopixel btt_mini12864]
#pin: EXP1_6
#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=btt_mini12864 RED=1 GREEN=1 BLUE=1 INDEX=1 TRANSMIT=0
#        SET_LED LED=btt_mini12864 RED=1 GREEN=0 BLUE=0 INDEX=2 TRANSMIT=0
#        SET_LED LED=btt_mini12864 RED=1 GREEN=0 BLUE=0 INDEX=3 

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


#####################################################################
#   Macros
#####################################################################
[gcode_macro _PARK]
gcode:
    {% set th = printer.toolhead %}
    G0 X{th.axis_maximum.x//2} Y{th.axis_maximum.y//2} Z30  

[gcode_macro G32]
gcode:
    SAVE_GCODE_STATE NAME=STATE_G32
    G90
    G28
    QUAD_GANTRY_LEVEL
    G28
    PARK
    RESTORE_GCODE_STATE NAME=STATE_G32
   
[gcode_macro _PRINT_START]
#   Use PRINT_START for the slicer starting script - please customise for your slicer of choice
gcode:
    G32                            ; home all axes
    G90                            ; absolute positioning
    G1 Z20 F3000                   ; move nozzle away from bed
   

[gcode_macro _PRINT_END]
#   Use PRINT_END for the slicer ending script - please customise for your slicer of choice
gcode:
    # safe anti-stringing move coords
    {% set th = printer.toolhead %}
    {% set x_safe = th.position.x + 20 * (1 if th.axis_maximum.x - th.position.x > 20 else -1) %}
    {% set y_safe = th.position.y + 20 * (1 if th.axis_maximum.y - th.position.y > 20 else -1) %}
    {% set z_safe = [th.position.z + 2, th.axis_maximum.z]|min %}
    
    SAVE_GCODE_STATE NAME=STATE_PRINT_END

    M400                           ; wait for buffer to clear
    G92 E0                         ; zero the extruder
    G1 E-5.0 F1800                 ; retract filament
    
    TURN_OFF_HEATERS

    G90                                      ; absolute positioning
    G0 X{x_safe} Y{y_safe} Z{z_safe} F20000  ; move nozzle to remove stringing
    G0 X{th.axis_maximum.x//2} Y{th.axis_maximum.y - 2} F3600  ; park nozzle at rear
    M107                                     ; turn off fan
    
    BED_MESH_CLEAR

    # The purpose of the SAVE_GCODE_STATE/RESTORE_GCODE_STATE
    # command pair is to restore the printer's coordinate system
    # and speed settings since the commands above change them.
    # However, to prevent any accidental, unintentional toolhead
    # moves when restoring the state, explicitly set MOVE=0.
    RESTORE_GCODE_STATE NAME=STATE_PRINT_END MOVE=0

Install Klipper to EBB

NOTE: It's important to flip the switch on the EBB card from PT -> NTC for your extruder thermistor.

cd ~/klipper
make menuconfig
#    Enable extra low-level configuration options
#    Micro-controller Architecture (Raspberry Pi RP2040/RP235x)  --->
#    Processor model (rp2040)  --->
#    Bootloader offset (No bootloader)  --->
#    Flash chip (W25Q080 with CLKDIV 2)  --->
#    Communication Interface (USBSERIAL)  --->
#    USB ids  --->
#[*] Optimize stepper code for 'step on both edges'
#()  GPIO pins to set at micro-controller startup
make

Put Canbus processor in DFU mode by pressing and holding BOOT and then the RST button breifly:

Verify we're in DFU mode by looking for this in the lsusb command:

Bus 002 Device 003: ID 2e8a:0003 Raspberry Pi RP2 Boot

Note the device ID (2e8a:0003) and type in console from the klipper directory:

make flash FLASH_DEVICE=2e8a:0003

  Flashing out/klipper.uf2 to 2e8a:0003
sudo lib/rp2040_flash/rp2040_flash out/klipper.uf2

[sudo] password for bpopp:
Loaded UF2 image with 162 pages
Found rp2040 device on USB bus 2 address 3
Flashing...
Resetting interface
Locking
Exiting XIP mode
Erasing
Flashing
Rebooting device

Verify that the device now shows up under /dev/serial/by-id:

ls /dev/serial/by-id
usb-Klipper_rp2040_50443403101D961C-if00
usb-Klipper_stm32f446xx_1E0035000751313031393839-if00

Create a config file for the EBB in Mainsail:

# This file contains common pin mappings for the BIGTREETECH EBBCan
# Canbus board. To use this config, the firmware should be compiled for the
# STM32F072 with "8 MHz crystal" and "USB (on PA11/PA12)" or "CAN bus (on PB8/PB9)".
# The "EBB Can" micro-controller will be used to control the components on the nozzle.

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

[mcu EBBCan]
serial: /dev/serial/by-id/usb-Klipper_rp2040_50443403101D961C-if00

[temperature_sensor EBB_NTC]
sensor_type: Generic 3950
sensor_pin: EBBCan:gpio27

[adxl345]
cs_pin: EBBCan:gpio1
spi_software_sclk_pin: EBBCan:gpio2
spi_software_mosi_pin: EBBCan:gpio0
spi_software_miso_pin: EBBCan:gpio3
axes_map: z,-y,x

[resonance_tester]
probe_points: 100, 100, 20
accel_chip: adxl345

[extruder]
step_pin: EBBCan:gpio18
dir_pin: !EBBCan:gpio19
enable_pin: !EBBCan:gpio17
gear_ratio: 50:10				#BMG Gear Ratio
microsteps: 16
rotation_distance: 22.5078095278
nozzle_diameter: 0.400
filament_diameter: 1.750

heater_pin: EBBCan:gpio7
sensor_type: NTC 100K MGB18-104F39050L32
pullup_resistor: 2200 # 2.2K
sensor_pin: EBBCan:gpio26
control: pid
pid_Kp: 19.939
pid_Ki: 0.636
pid_Kd: 156.259
min_temp: -50
max_temp: 250
min_extrude_temp: 150
# pressure_advance: 0.055
# pressure_advance_smooth_time: 0.040

[tmc2209 extruder]
uart_pin: EBBCan:gpio20
run_current: 0.65
stealthchop_threshold: 999999
# sense_resistor: 0.110

[fan]
pin: EBBCan:gpio4
max_power: 0.5

[heater_fan hotend_fan]
pin: EBBCan:gpio14
heater: extruder
heater_temp: 50.0

[neopixel hotend_rgb]
pin: EBBCan:gpio16

# [bltouch]
# sensor_pin: ^EBBCan:gpio21
# control_pin: EBBCan:gpio22