A complete Klipper configuration for the FlashForge Creator 1 dual-nozzle printer, running on a BTT SKR Pico v1.0 mainboard controlled by a BTT Pi V1.2 single-board computer.
→ For step-by-step installation, calibration, slicer setup, and troubleshooting see SETUP_GUIDE.md.
This repository provides a fully-commented Klipper printer configuration for the FlashForge Creator 1, a dual-nozzle, single-carriage Cartesian printer. The original MightyBoard electronics have been replaced with a BTT SKR Pico v1.0 running Klipper, managed by a BTT Pi V1.2 as the host computer.
Because the SKR Pico v1.0 has only four onboard TMC2209 driver slots (X, Y, Z, E0), the second extruder (T1) requires an external stepper driver module. This build uses a TMC2209 chip mounted on an A4988/DRV8825-compatible carrier board, operated in standalone mode. See SETUP_GUIDE.md §1 for full setup details.
| Component | Part | Notes |
|---|---|---|
| Printer frame | FlashForge Creator 1 | Dual nozzle, single carriage, Cartesian |
| Build volume | 225 × 145 × 150 mm | X × Y × Z |
| Mainboard | BTT SKR Pico v1.0 | RP2040 MCU, 4× onboard TMC2209 |
| Host SBC | BTT Pi V1.2 | CB1 image (Allwinner H616) |
| SBC to MCU link | BTT Pi GPIO pins 8/10 → SKR Pico RPi UART header | UART0 at 250,000 baud; RP2040 gpio0/gpio1 |
| T1 driver | TMC2209 on AgWenKui carrier board | A4988/DRV8825 Pololu footprint |
| Webcam | Logitech C270 | USB, streamed via Crowsnest/ustreamer |
| X/Y motion | GT2 belt, 20T pulley | rotation_distance = 40 |
| Z motion | 8 mm lead screw | rotation_distance = 8 |
| T0/T1 thermistors | EPCOS 100K B57560G104F | |
| Bed thermistor | ATC Semitec 104GT-2 |
| File | Purpose |
|---|---|
printer.cfg |
Main hardware config — MCU, steppers, heaters, fans, sensors |
macros.cfg |
G-code macros — toolchange, start/end print, filament load/unload, PID helpers, fan logic |
moonraker.conf |
Moonraker API config — update manager, webcam, timelapse |
PINOUT.md |
Connector and pinout reference — JST-XH types/sizes, T1 driver wiring, ADXL345 wiring, re-termination guide |
Items marked with an asterisk (*) are original FlashForge Creator 1 hardware. Everything else must be sourced before starting.
| Item | Qty | Notes |
|---|---|---|
| BTT SKR Pico v1.0 | 1 | Main controller board |
| BTT Pi V1.2 | 1 | Host SBC |
| MicroSD card (8 GB+, Class 10) | 1 | OS for BTT Pi |
| USB-C to USB-A cable | 1 | Firmware flashing only (BOOTSEL mode); the live MCU link uses UART via GPIO header |
| Dupont female-to-female jumper wires (20–30 cm) | 4 | BTT Pi GPIO header → SKR Pico RPi UART header (TX, RX, 5V, GND) |
| TMC2209 stepper driver module | 1 | T1 external driver; same Pololu footprint as A4988 |
| AgWenKui A4988/DRV8825 carrier board | 1 | Hosts the TMC2209 module |
| Logitech C270 webcam | 1 | USB, plug into BTT Pi |
| GT2 belt, 20T pulleys | 2 sets | X and Y axes * |
| 8 mm lead screw and nut | 1 | Z axis * |
| EPCOS 100K B57560G104F thermistors | 2 | T0 and T1 hotends * |
| ATC Semitec 104GT-2 thermistor | 1 | Heated bed * |
| 24 V, 30 W heater cartridges | 2 | T0 and T1 hotends * |
| 24 V PSU | 1 | * |
| Dupont female-female jumper wires | ~10 | T1 external driver signal wiring |
Every GPIO pin used in printer.cfg is listed here. Use this table as the definitive wiring reference.
| Function | GPIO | Connector on board | Notes |
|---|---|---|---|
| X step | gpio11 | MOT X | Output |
| X dir | gpio10 | MOT X | Output |
| X enable | gpio12 | MOT X | Active LOW (!gpio12) |
| X endstop | gpio4 | X-STOP | Pull-up enabled (^gpio4) |
| Y step | gpio6 | MOT Y | Output |
| Y dir | gpio5 | MOT Y | Output |
| Y enable | gpio7 | MOT Y | Active LOW (!gpio7) |
| Y endstop | gpio3 | Y-STOP | Pull-up enabled (^gpio3) |
| Z step | gpio19 | MOT Z | Output |
| Z dir | gpio28 | MOT Z | Output |
| Z enable | gpio2 | MOT Z | Active LOW (!gpio2) |
| Z endstop | gpio25 | Z-STOP | Pull-up enabled (^gpio25) |
| E0 step | gpio14 | MOT E | Output |
| E0 dir | gpio13 | MOT E | Output |
| E0 enable | gpio15 | MOT E | Active LOW (!gpio15) |
| TMC2209 UART TX | gpio8 | — | tx_pin — all four onboard drivers, UART1 TX |
| TMC2209 UART RX | gpio9 | — | uart_pin — all four onboard drivers, UART1 RX |
| T0 heater | gpio23 | HE0 | Dedicated heater MOSFET |
| T0 thermistor | gpio27 | TH0 | ADC input |
| T1 heater | gpio20 | FAN3 | Repurposed fan output (also on right-side Laser header) — see warning below |
| T1 thermistor | gpio29 | PROBE connector | ADC input — no dedicated TH1 port; wire to PROBE signal pin |
| Bed heater | gpio21 | BED | Dedicated heater MOSFET |
| Bed thermistor | gpio26 | THB | ADC input |
| FAN1 (part cooling) | gpio17 | FAN1 | M106/M107 controlled |
| FAN2 (board/heatsink) | gpio18 | FAN2 | board_fan generic fan |
| T1 step | gpio16 | E0-STOP connector | Free if no E0 endstop; wire to signal pin (pin 1) |
| T1 dir | gpio24 | RGB connector | Free if no RGB/NeoPixel strip; wire to signal pin (pin 2) |
| T1 enable | gpio22 | P_SI pad | Active LOW (!gpio22) — free if no probe; gpio9 must NOT be used here — it is the TMC2209 UART RX line |
The SKR Pico v1.0 routes separate TX and RX lines to the four onboard TMC2209 drivers:
| Signal | GPIO | RP2040 function | printer.cfg key |
|---|---|---|---|
| UART TX (write to drivers) | gpio8 | UART1_TX | tx_pin |
| UART RX (read from drivers) | gpio9 | UART1_RX | uart_pin |
Both pins must be specified in every [tmc2209] block — omitting tx_pin and using only uart_pin: gpio8 configures Klipper for single-wire half-duplex mode, which does not match the board's hardware. Klipper will fail the initial UART handshake and report a driver communication error on startup.
gpio9 must not be used for any other purpose (T1 enable, endstop, etc.) — it is permanently assigned as the TMC2209 UART RX line.
| Driver slot | Axis | uart_address |
|---|---|---|
| Driver 1 | X | 0 |
| Driver 2 | Y | 2 |
| Driver 3 | Z | 1 |
| Driver 4 | E0 (T0 extruder) | 3 |
The T1 external driver does not use UART. It runs in standalone mode — microstepping and current are set via jumpers and the Vref potentiometer. See SETUP_GUIDE.md §1.
Wire each endstop microswitch between the signal pin and GND. Klipper's ^ prefix enables the RP2040's internal pull-up, so no external resistor is needed.
| Axis | SKR Pico connector | GPIO |
|---|---|---|
| X | X-STOP | gpio4 |
| Y | Y-STOP | gpio3 |
| Z | Z-STOP | gpio25 |
If QUERY_ENDSTOPS reports an axis as TRIGGERED at rest with nothing pressed, add or remove the ! prefix on the endstop_pin in printer.cfg to invert the logic.
| Heater / Sensor | SKR Pico connector | GPIO | Notes |
|---|---|---|---|
| T0 heater cartridge | HE0 | gpio23 | Dedicated heater MOSFET |
| T0 thermistor | TH0 | gpio27 | |
| T1 heater cartridge | FAN3 | gpio20 | Repurposed fan output (also on Laser header) — see warning |
| T1 thermistor | PROBE connector | gpio29 | No dedicated TH1 port — wire to PROBE signal pin; see warning |
| Bed heater | BED | gpio21 | Dedicated heater MOSFET |
| Bed thermistor | THB | gpio26 |
WARNING — T1 Heater on FAN3 (gpio20): The T1 heater uses the FAN3 output, which shares its MOSFET with the Laser header on the right side of the board. The AO3400A MOSFET (5.7A/30V) handles the current. A 30W/24V heater draws ~1.25A continuously — within the PCB trace rating for this connector. Do NOT use a 12V heater cartridge on a 24V supply through this output.
WARNING — T1 Thermistor via PROBE Connector: The SKR Pico v1.0 has only two thermistor ports: TH0 (gpio27) and THB (gpio26). There is no dedicated TH1 connector. gpio29 (ADC3) is accessible via the signal pin of the 5-pin PROBE connector on the right side of the board. Connect the T1 thermistor to the PROBE signal pin and an adjacent GND. Do NOT insert a BLTouch/probe while the thermistor is wired here — the connector carries a 4.7kΩ pull-up to 5V that will corrupt the ADC reading and cause false temperature faults.
| Fan | SKR Pico connector | GPIO | Controlled by |
|---|---|---|---|
| Part cooling fan | FAN1 | gpio17 | M106/M107; per-tool speed stored and restored on each toolchange |
| Board and heatsink fan | FAN2 | gpio18 | board_fan — 100% at print start and during heating ops, 50% for 5 min after, then off |
| BTT Pi CPU fan | BTT Pi fan header | host:gpio211 | raspberry_pi — PID temperature fan; target 38°C |
BTT Pi CPU Fan GPIO: Confirmed from official BTT Pi V1.2 documentation. The fan GPIO is PG19 = Linux GPIO211 using H616 port numbering:
[(G=7 − 1) × 32] + 19 = 211.printer.cfguseshost:gpio211.
STATUS ; Check Klipper connection state
QUERY_ENDSTOPS ; Read current state of all endstops
G28 ; Home all axes
G28 X ; Home X axis only
G28 Y ; Home Y axis only
G28 Z ; Home Z axis only
STEPPER_BUZZ STEPPER=stepper_x ; Test X motor (no home required)
STEPPER_BUZZ STEPPER=stepper_y ; Test Y motor
STEPPER_BUZZ STEPPER=stepper_z ; Test Z motor
STEPPER_BUZZ STEPPER=extruder ; Test T0 extruder motor
STEPPER_BUZZ STEPPER=extruder1 ; Test T1 extruder motor
BED_SCREWS_ADJUST ; Start manual bed tramming
FIRMWARE_RESTART ; Reload config without full service restart
SAVE_CONFIG ; Persist calibration data to printer.cfgls /dev/ttyS0
sudo fuser /dev/ttyS0 # Should return nothingsudo systemctl restart klipper
sudo systemctl restart moonraker
sudo systemctl restart crowsnest
sudo systemctl restart klipper-mcu
sudo systemctl status klipper
sudo systemctl status klipper-mcutail -f ~/printer_data/logs/klippy.log
tail -f ~/printer_data/logs/moonraker.log
journalctl -u crowsnest -n 50-
[mcu] serial:inprinter.cfgset to/dev/ttyS0(or whichever UART device is present) - T1 external driver wired and
[extruder1]step/dir/enable pins confirmed inprinter.cfg - T1 PDN_UART (MS3 position) grounded on carrier board
- T1 MS1 and MS2 jumpers installed for 16 microsteps
- T1 heater wired to FAN3 connector (gpio20)
- T1 thermistor wired to PROBE connector signal pin (gpio29) — no dedicated TH1 port exists
- BTT Pi CPU fan wired to fan header;
printer.cfguseshost:gpio211(PG19, confirmed) - Klipper shows
Readyin Mainsail - All five temperature sensors reading plausible values
-
QUERY_ENDSTOPSshows all axes open at rest -
G28homes all three axes cleanly -
STEPPER_BUZZconfirms all five motors move - All three fans respond to commands
-
PID_TUNE_HOTENDrun andSAVE_CONFIGsaved -
PID_TUNE_HOTEND1run andSAVE_CONFIGsaved -
PID_TUNE_BEDrun andSAVE_CONFIGsaved - Bed tramming completed with
BED_SCREWS_ADJUST - Z offset calibrated and saved
- T0
rotation_distancecalibrated - T1
rotation_distancecalibrated - T1 X offset measured and
variable_t1_x_offsetupdated inmacros.cfg - Slicer start/end G-code configured (SETUP_GUIDE.md §8)
- Firmware retraction enabled in slicer and tuned (SETUP_GUIDE.md §7.8, §8.5)
- Skew correction calibrated if needed (SETUP_GUIDE.md §7.7)
- Input shaper calibrated — SPI enabled, ADXL345 wired,
SHAPER_CALIBRATErun,SAVE_CONFIGsaved (SETUP_GUIDE.md §7.6) - Webcam visible in Mainsail
- Timelapse: moonraker-timelapse installed, ffmpeg present, layer change G-code configured (SETUP_GUIDE.md §9.7, §8.6)
| File | Purpose |
|---|---|
printer.cfg |
Main Klipper hardware configuration (MCU, steppers, heaters, fans) |
macros.cfg |
G-code macros (toolchange, start/end print, load/unload, PID helpers) |
moonraker.conf |
Moonraker API server configuration (update manager, webcam, timelapse) |
PINOUT.md |
Connector and pinout reference — JST-XH types, T1 driver wiring, ADXL345, re-termination guide |
SETUP_GUIDE.md |
Step-by-step installation, calibration, slicer setup, and troubleshooting |
CALIBRATION.md |
Calibration value tracking — record measured values after each tuning session |
.gitignore |
Excludes runtime data from version control |
README.md |
This file |
Klipper: https://www.klipper3d.org — Moonraker: https://moonraker.readthedocs.io — Mainsail: https://docs.mainsail.xyz — KIAUH: https://github.com/dw-0/kiauh