ip -s link show can0 python3 ~/katapult/scripts/flashtool.py -i can0 -q # with klipper stopped ls /dev/serial/by-id/
The Manta is a USB-to-CAN bridge, so both MCUs use canbus_uuid:
[mcu] canbus_uuid: <manta_uuid> [mcu EBBCan] canbus_uuid: <ebb_uuid>
| Driver | step | dir | enable | endstop | Typical Trident use |
|---|---|---|---|---|---|
| M1 | PE6 | PE5 | !PC14 | PF4 | stepper_x (A) |
| M2 | PE2 | PE1 | !PE4 | PF3 | stepper_y (B) |
| M3 | PB8 | PB7 | !PE0 | PF2 | stepper_z |
| M4 | PB4 | PB3 | !PB6 | PF1 | stepper_z1 |
| M5 | PG13 | PG12 | !PG15 | stepper_z2 | |
| M6–M8 | PG9/PD7/!PG11 · PD4/PD3/!PD6 · PC7/PC8/!PD2 | spare | |||
Assign drivers to match your wiring: Voron's convention is stepper_x = A (back left), stepper_y = B (back right). Extruder is on the EBB: step_pin: EBBCan:gpio18, dir_pin: EBBCan:gpio19, enable_pin: !EBBCan:gpio17.
If the wrong sensor rises, thermistor or heater connections are swapped.
PID_CALIBRATE HEATER=extruder TARGET=245
PID_CALIBRATE HEATER=heater_bed TARGET=100
SAVE_CONFIG
SET_FAN_SPEED FAN=<fan_name> SPEED=0.5
M106 S255 ; part cooling fan M107 ; off
QUERY_ENDSTOPS
All should read open. Press each switch by hand and re-run: that one should read TRIGGERED. Invert with ! or pull-up with ^ on endstop_pin if needed.
QUERY_PROBE
Each motor moves +1 mm and back, 10 times. Trident expectations (Voron docs):
| Command | Expected |
|---|---|
STEPPER_BUZZ STEPPER=stepper_x | Back-left (A) motor rotates clockwise first, then back |
STEPPER_BUZZ STEPPER=stepper_y | Back-right (B) motor rotates clockwise first, then back |
STEPPER_BUZZ STEPPER=stepper_z | Front-left of the bed moves down, then up |
STEPPER_BUZZ STEPPER=stepper_z1 | Back of the bed moves down, then up |
STEPPER_BUZZ STEPPER=stepper_z2 | Front-right of the bed moves down, then up |
STEPPER_BUZZ STEPPER=extruder | Extruder moves (heat to 170 °C+ or set min_extrude_temp) |
Backwards? Invert the direction pin: dir_pin: PE5 → dir_pin: !PE5 (remove the ! if already there). Wrong motor moves? Fix the cable or driver assignment.
M112 typed in the console or use Mainsail's emergency stop; or be ready to cut power.Run G28 X: bed drops slightly, toolhead should go right. If it goes anywhere else, e-stop, note the direction, FIRMWARE_RESTART, then test G28 Y: toolhead should go to the back.
| G28 X moves | G28 Y moves | Fix |
|---|---|---|
| Right ✅ | Back ✅ | Nothing, correct |
| Left | Front | Invert both stepper_x and stepper_y dir_pin |
| Front | Left | Invert stepper_x (A) dir_pin |
| Back | Right | Invert stepper_y (B) dir_pin |
| Right | Front | Swap the A and B motor connectors (or swap pins between [stepper_x]/[stepper_y]), then re-test and use the rows above |
| Left | Back | |
| Back | Left | |
| Front | Right |
G28 X G28 Y G28 Z
Emergency stop tips: M112 halts instantly (then FIRMWARE_RESTART). If Z doesn't stop, kill power. Test the probe triggers (QUERY_PROBE) before the first G28 Z.
G28 PROBE_ACCURACY
Range should be well under ~0.0125 mm (standard deviation tiny). Then set Z offset:
G28 PROBE_CALIBRATE ; probe used as Z endstop (paper test, TESTZ Z=-0.1, ACCEPT) # or, with a physical Z endstop: Z_ENDSTOP_CALIBRATE SAVE_CONFIG
Level the bed with the Trident's 3 independent Z motors:
G28 Z_TILT_ADJUST G28 Z
G28 Z_TILT_ADJUST BED_MESH_CALIBRATE SAVE_CONFIG
Check the mesh in Mainsail's Heightmap. Load it in the start macro with BED_MESH_PROFILE LOAD=default or mesh each print.
M83 G1 E100 F60
actual = 120 − remaining.new = old_rotation_distance × actual / 100, update [extruder] rotation_distance, RESTART, and repeat until within ~1 mm.The EBB SB2209 RP2040's onboard accelerometer is configured as [adxl345] in BTT's sample config:
[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] accel_chip: adxl345 probe_points: 150, 150, 20 # bed center for a 300 mm Trident
sudo apt install python3-numpy python3-matplotlib libatlas-base-dev libopenblas-dev ~/klippy-env/bin/pip install -v numpy
ACCELEROMETER_QUERY G28 SHAPER_CALIBRATE SAVE_CONFIG
Graphs (optional): ~/klipper/scripts/calibrate_shaper.py /tmp/calibration_data_x_*.csv -o /tmp/shaper_x.png
Pressure advance: print a PA tower/pattern (e.g. Ellis' or the Klipper tuning tower), then set [extruder] pressure_advance (typical 0.02–0.06 direct drive).
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500 TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005
[gcode_macro PRINT_START]
gcode:
{% set BED = params.BED|default(100)|float %}
{% set EXTRUDER = params.EXTRUDER|default(245)|float %}
M190 S{BED}
G28
Z_TILT_ADJUST
G28 Z
BED_MESH_CALIBRATE
M109 S{EXTRUDER}
G90
[gcode_macro PRINT_END]
gcode:
M400
G92 E0
G1 E-5 F1800
TURN_OFF_HEATERS
G91
G1 Z10 F3000
G90
G0 X150 Y290 F6000
M107
M84
Slicer start G-code (OrcaSlicer/PrusaSlicer/SuperSlicer):
PRINT_START BED=[first_layer_bed_temperature] EXTRUDER=[first_layer_temperature]
End G-code: PRINT_END