The Voron V0 has zero room for a wiring mess. This board is the purpose-built fix: palm-sized, four silent drivers already soldered on, and a one-cable Pi hookup — power and data down the same five wires — engineered for the V0's cramped skirt from day one.
The diagram no datasheet draws: every connector located on the real board to the pixel, every pin in true physical order, and the thing BTT's own pinout never shows — which wire is + and which is −. Hover any panel: the board answers. Base photo © BigTreeTech · measurements, polarity engineering & layout © Honeybadger.
2B·1B·1A·2A2B·1B·1A·2A2B·1B·1A·2A2B·1B·1A·2A2B·1B·1A·2A12/24V · IO1712/24V · IO1812/24V · IO20GND · IO24 · 5V
12/24V · GNDIO23 · 12/24VIO21 · 12/24V12/24V · GND · IO20data5V·5V·GND·RX·TXIO4 · GND · 5VIO3 · GND · 5VIO25 · GND · 5VIO16 · GND · 5VGND · IO27GND · IO265-pin blockTwo honest ways to run this board — the difference is WHERE the brain lives. Neither is wrong; the page covers both to the same depth.
OrcaSlicer / Cura turns models into G-code. Uploads over Wi-Fi.
Does the motion math. The control screen is YOUR pick:
Executes every step pulse with microsecond timing. Motors, heaters, fans, sensors.
Same slicers, same G-code — sent over Wi-Fi. (No SD slot on this board: a host feeds it.)
Marlin's classic partner — uploads, camera, the plugin universe. The brain stays on the board.
Thinks AND executes onboard — motion math, temps, safety, all on the RP2040.
Center: the real board, flat — BigTreeTech's own official top view, straight from their manual. Sides: real circuits from the schematic, macro details, and live demos as this page grows.
Why a bare switch just works — and why 5 V sensors are welcome too. Every snippet drawn from the actual schematic.
Screw terminals for power and heaters, USB-C on the corner. Macro shots for every port below.
The full connector card appears here — plain English first, engineering depth underneath. Both lanes, never mixed.
Wire the X motor, tap "jog +10" — watch a photoreal printer respond on screen. The relay-trainer engine, pointed at 3D printing. Built from real CAD, not cartoons.
Tiny footprint, silent drivers, one-cable Pi pairing. If you're building a V0, this page IS your wiring chapter.
Schematic ✓ pin map ✓ shipped firmware config ✓ — three official sources, zero disagreements. Bench run on real hardware: pending, and the page says so until it's done.
No redrawn approximations. These are print-resolution sections of the manufacturer's actual schematic — the same drawing their engineers built the board from — with our plain-English reading guide and the multimeter checks that keep hardware alive. Full sheet downloadable below.






Real board, real components, real wires — BigTreeTech's own installation photography, each cross-checked against the schematic above and our verified pin table.




The recommended Klipper path, exactly as we'd do it. Marlin and other roads below — every one verified, none assumed.
The real board, marked by BigTreeTech themselves: Boot center, Reset lower-left, and the USB-Power jumper by the USB-C corner (fit it ONLY when powering the board from USB alone on the bench). Hold Boot, plug in, release — the board becomes a USB drive. That's the whole trick. Photo © BigTreeTech, official manual.
Every file below announces exactly what it is and which hardware it belongs to. The two firmware builds are mutually exclusive — that's the #1 wrong-download on this board.
BTT's official pre-built klipper.uf2 for USB-C connection to the Pi. The simplest path — one cable does data.
⬇ Download klipper-USB.uf2The 5-wire P5 version — power and data in one lead, the classic V0 way. Pair with the wiring diagram above.
⬇ Download klipper-UART0.uf2BTT's shipped Klipper config for this board — every pin pre-mapped. Ender-3-shaped defaults; V0 users swap in the Voron config (guide below).
⬇ Download SKR-Pico-klipper.cfgBigTreeTech's complete engineering schematic — the sheet every circuit on this page was cut from. For the engineers who want it all.
⬇ Download the schematicMarlin isn't in a stable release for this board yet — so we compiled it ourselves from Marlin's own development branch and published the exact configuration we used. Honest status on every label.
Marlin's own SKR_Pico target: BOARD_BTT_SKR_PICO, four TMC2209s in UART mode (addresses identical to BTT's own map). Flash exactly like Klipper: hold BOOT, plug in, drop the .uf2.
⬇ Marlin USB .uf2 ⬇ Marlin UART0 .uf2Configuration.h + Configuration_adv.h + a build README (branch, commit, every line we changed). Rebuild it yourself or tune from a known-good base.
⬇ Download config bundleThe Voron team's official SKR Pico config for the V0.2 — the board's home-turf printer, straight from VoronDesign, mirrored with credit.
⬇ Download Voron V0.2 cfgMainsail / Fluidd / KlipperScreen: Klipper-only (they speak Moonraker). OctoPrint: the engine-agnostic one — Marlin's native partner over USB, and it runs with Klipper too via Klipper's virtual serial port.
The UART lives in a different place on different Pis, the config files moved in Raspberry Pi OS Bookworm, and BTT's manual recipe is Pi-3-era. Wrong recipe = a link that silently does nothing. Every line below is verified against the official Raspberry Pi documentation and BTT's own repos — pick your board, copy, done.
# /boot/firmware/config.txt (older images: /boot/config.txt) dtoverlay=disable-bt # headless printer (recommended) # -- OR, to keep Bluetooth: -- # dtoverlay=miniuart-bt # core_freq=250 # REQUIRED with miniuart-bt # /boot/firmware/cmdline.txt — DELETE this token: # console=serial0,115200 # after first boot, if you chose disable-bt: # sudo systemctl disable hciuart # printer.cfg [mcu] serial: /dev/ttyAMA0 restart_method: command
# /boot/firmware/config.txt (older images: /boot/config.txt) dtoverlay=disable-bt # headless printer (recommended) # -- OR, to keep Bluetooth: -- # dtoverlay=miniuart-bt # core_freq=250 # REQUIRED with miniuart-bt # /boot/firmware/cmdline.txt — DELETE this token: # console=serial0,115200 # after first boot, if you chose disable-bt: # sudo systemctl disable hciuart # printer.cfg [mcu] serial: /dev/ttyAMA0 restart_method: command
# /boot/firmware/config.txt — add BOTH lines: enable_uart=1 dtparam=uart0=on # (documented alternative: dtoverlay=uart0-pi5) # /boot/firmware/cmdline.txt — DELETE this token: # console=serial0,115200 # printer.cfg [mcu] serial: /dev/ttyAMA0 # NEVER /dev/serial0 on a Pi 5 — that restart_method: command # shortcut points at the DEBUG connector!
# BOOT partition (FAT32 — editable from Windows).
# V3.0.0 images: armbianEnv.txt (V2.3.x images: BoardEnv.txt)
# change this line:
# console=display
# to:
console=serial # yes — 'serial' FREES the UART on BTT images
# (stock-Armbian docs describe the opposite; BTT inverts it)
# printer.cfg — CB1:
[mcu]
serial: /dev/ttyS0 # header pins 8 (TX) / 10 (RX) on the PI4B Adapter
restart_method: command
# printer.cfg — CB2 instead:
# serial: /dev/ttyS2Everything above, fifteen minutes flat. Kalico fork: identical steps, same files.
Supported in Marlin's development branch — and it covers BOTH host links, just like Klipper: USB (SERIAL_PORT -1) or the 5-wire P5/UART0 link (SERIAL_PORT 0). Not in a stable release yet — our compiled dev-branch builds are in Downloads above.
Not available for this board — RRF's ports cover STM32/LPC mainboards; RP2040 isn't among them. Verified against the maintainers' own list so you don't burn an evening finding out.
Most guides pretend a board has no limits. Engineers plan around real ones. Below: the Pico completely maxed out, the printer-matchmaking math, and the verified expansion paths when your ambitions outgrow four drivers.
| Motion | X + Y + Z×2 (parallel) + E | 4 drivers · 5 motors |
| Heat | Hotend + bed, both thermistors | 2 outputs · 2 ADC |
| Air | Part fan + hotend fan + board fan | 3 PWM outputs |
| Sensing | X/Y/Z endstops + filament runout | 4 inputs (5 V capable) |
| Leveling | BLTouch or inductive probe | probe + servo |
| Light | Neopixel chain (onboard LED first) | gpio24 · 5 V fused |
| Brain link | Raspberry Pi — powered + connected | P5 · 5 V @ 3.5 A |
| Alt. duty | Laser PWM (engraver conversions) | shares gpio20 — FAN3 off |
| The hard ceiling — no 5th driver socket exists; Z's two sockets are one driver twinned. Past this point you ADD A BOARD, not wishes. | 4 drivers. Period. | |
| PRINTER | MOTORS NEEDED | ON ONE PICO? |
|---|---|---|
| Voron V0 / V0.2 | A + B + Z + E = 4 | ✔ PERFECT — the board's home turf |
| Voron Switchwire | A + B (CoreXZ) + Y + E = 4 | ◐ Fits electrically (4 drivers) — check your endstop plan |
| Voron Trident | A + B + Z×3 + E = 6 | ✕ Independent Z×3 needs 6 drivers — that's Octopus / Manta M8P territory |
| Voron 2.4 | A + B + Z×4 + E = 7 | ✕ Seven drivers — Octopus's job (hub coming) |
| + ERCF multi-material | + gear + selector | ◐ Yes — via its own MMB board (path 3 below) |
Independent Z leveling (Trident/2.4) can't use the Pico's twinned Z sockets — those move as ONE. Motor counts from the official Voron specs; when a printer outgrows this board, we'll tell you which board it grows into.
Klipper natively runs multiple controller boards in ONE printer config — a second Pico over USB gives four more drivers, more heaters, more fans, all coordinated by the same Pi. Two lines of config per extra MCU. This is Klipper's superpower and most people never learn it.
An EBB toolhead board puts the extruder driver, hotend heater, fans, probe and accelerometer AT the toolhead — your whole harness collapses to a few wires. EBB SB2209 runs USB or CAN; add BTT's U2C adapter on the Pi if you go CAN.
The Enraged Rabbit Carrot Feeder (multi-color!) brings its own controller — BTT's MMB CAN board drives the ERCF's gear and selector motors as another Klipper MCU. Your Pico keeps its four drivers; the filament factory runs itself.
Not "trust us, it works" — here is each expansion path with the actual boards, the actual connectors, and the exact config lines, all read off BigTreeTech's own files and the official Klipper docs.
| # | FROM | TO | CABLE | CARRIES |
|---|---|---|---|---|
| C1 | Pico #1 · P5 header5-pin JST | Pi · GPIO pins 2/4/6/8/105V·5V·GND·TXD·RXD | BTT's included 5-wire lead | UART data + 5 V to the Pi (TPS5450 buck, 3.5 A fuse) |
| C2–C4 | Pico #2/#3/#4 · USB-C | Pi · USB-A portsone each | USB-A → USB-C, any data-rated cable | Klipper data ONLY — USB-Power jumpers stay OFF |
| P1–P4 | V+ V− PSU DC bus | each Pico · POWER12/24V · GND screw terminals | 2-cond, 18 AWG min per board | Board + motors + heaters power — every board, no exceptions |
# ---- Board 1: the stock UART link — Klipper's timing master ---- [mcu] serial: /dev/ttyAMA0 restart_method: command # ---- Boards 2-4: one USB cable each; find IDs with ---- # ls /dev/serial/by-id/* # (each RP2040's serial number is inside its ID string) [mcu picoB] serial: /dev/serial/by-id/usb-Klipper_rp2040_E66138A512345678-if00 [mcu picoC] serial: /dev/serial/by-id/usb-Klipper_rp2040_E66138A587654321-if00 [mcu picoD] serial: /dev/serial/by-id/usb-Klipper_rp2040_E66138A511223344-if00 # ---- Then any pin, anywhere, gets a prefix ---- # step_pin: picoB:gpio11 (X socket on board 2) # uart_pin: picoB:gpio9 (that board's own TMC UART bus) # tx_pin: picoB:gpio8 # # THE ONE LAW OF SPLITTING AXES (klipper3d.org, Multi-MCU Homing): # every stepper of a homed axis stays on ONE board when its # endstop/probe lives elsewhere. Split machines by FUNCTION: # board1 = X+Y+E, board2 = all Z, board3 = tools, board4 = aux.
| # | FROM | TO | CABLE | CARRIES |
|---|---|---|---|---|
| C1 | Pico #1 · P5 header5-pin JST | Pi · GPIO pins 2/4/6/8/105V·5V·GND·TXD·RXD | BTT's included 5-wire lead | UART data + 5 V to the Pi |
| C2 | Pico #2 · USB-C | Pi · any USB-A port | USB-A → USB-C data cable | Klipper data only |
| P1, P2 | V+ V− PSU | each Pico · POWER12/24V · GND | 2-cond, 18 AWG min | All board/motor/heater power |
# ---- Pico #1 — the stock UART link (BTT README) ---- [mcu] serial: /dev/ttyAMA0 restart_method: command # ---- Pico #2 — plain USB-C to the Pi ---- # Flash klipper-USB.uf2, then find its ID: ls /dev/serial/by-id/* [mcu pico2] serial: /dev/serial/by-id/usb-Klipper_rp2040_E66094A027831922-if00 # ---- Any pin on board 2: just add the prefix ---- [manual_stepper aux_motor] # X socket on the second Pico step_pin: pico2:gpio11 dir_pin: !pico2:gpio10 enable_pin: !pico2:gpio12 microsteps: 16 rotation_distance: 8 [tmc2209 manual_stepper aux_motor] # driver UART needs the prefix too uart_pin: pico2:gpio9 tx_pin: pico2:gpio8 uart_address: 0 # X=0 · Y=2 · Z=1 · E=3 run_current: 0.580
| # | FROM | TO | CABLE | CARRIES |
|---|---|---|---|---|
| C1 | Pi · USB-A | U2C · Type-C (CAN_IN) | USB-A → USB-C | The whole can0 interface |
| P1 | PSU · V+ / V− | U2C · screw terminal VIN / GND | 2-cond 18 AWG | 12/24 V onto the U2C's power rail |
| C2 | U2C · 4-pin outVIN+ GND− CAN-H/L = data pair | EBB · VIN·GND·CANH·CANLsilkscreen order! | 4-cond toolhead umbilical, CAN pair twisted | 24 V power + CAN data to the head |
| T | 120R jumper: U2C end | 120R jumper: EBB end | — | Termination. Prove it: ~60 Ω across CAN-H/L, power off |
# ---- On the Pi: /etc/network/interfaces.d/can0 ----
allow-hotplug can0
iface can0 can static
bitrate 1000000 # must match EVERY node's firmware
up ip link set $IFACE txqueuelen 128
# ---- Find the toolhead's ID ----
# ~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0
# ---- printer.cfg ----
[mcu EBBCan]
canbus_uuid: 0e0d81e4210c # yours, from the query above
[extruder] # pins: BTT's sample-bigtreetech-ebb-canbus cfg
step_pin: EBBCan: PD0
dir_pin: !EBBCan: PD1
enable_pin: !EBBCan: PD2
heater_pin: EBBCan: PA2 # V1.2 boards: PB13
[tmc2209 extruder]
uart_pin: EBBCan: PA15
run_current: 0.650
| # | FROM | TO | CABLE | CARRIES |
|---|---|---|---|---|
| C1 | can0 busU2C out or EBB daisy-chain | MMB · XT30VIN+ GND− CAN-H/L = data pair | 4-cond, CAN pair twisted | Power + CAN in one plug |
| M1 | ERCF gear motorNEMA14 | MMB · M1 socket | 4-wire stepper lead | Filament drive |
| M2 | ERCF selector motorNEMA17 | MMB · M2 socket | 4-wire stepper lead | Lane selection |
| T | MMB mid-bus → its 120R jumper comes OFF (terminators live at the two ENDS) | — | Bus stays ~60 Ω end-to-end | |
# ---- The ERCF's own brain — same can0 bus, its own UUID ---- [mcu ercf] canbus_uuid: 245eacba2ba4 # yours, from canbus_query.py [manual_extruder_stepper gear_stepper] # M1 socket step_pin: ercf:PB15 dir_pin: ercf:PB14 enable_pin: !ercf:PA8 # V1.1 boards: !ercf:PB8 [tmc2209 manual_extruder_stepper gear_stepper] uart_pin: ercf:PA10 run_current: 0.9 # NEMA14 [manual_stepper selector_stepper] # M2 socket step_pin: ercf:PD2 dir_pin: ercf:PB13 enable_pin: !ercf:PD1 endstop_pin: ^ercf:PA3 [tmc2209 manual_stepper selector_stepper] uart_pin: ercf:PC7 run_current: 0.8 # NEMA17
Every pin above was read off BigTreeTech's own sample configs, manuals and pinout sheets, cross-checked against klipper3d.org — sources credited on each figure. EBB, MMB and Octopus each get their own full hub next.
BigTreeTech built the SKR Pico for one job: fit inside a Voron V0 and run it flawlessly — RP2040 brain, four whisper-quiet TMC2209 drivers, a footprint smaller than your palm. Add the optional cover and it even dresses the part.
BigTreeTech's own two films for this exact board, embedded the same privacy-friendly way their support hub embeds them. Watch the product run, then watch their install — then scroll back up to our schematics and do it with the pin-verified depth they didn't have room for.
What you actually do instead — all three are how real V0s run:
The screen belongs to the brain, not the reflexes: hang an HDMI/DSI/USB touchscreen off the Raspberry Pi and run KlipperScreen. Full touch control — heaters, moves, prints — and the Pico never knows it exists.
Mainsail and Fluidd are full touch interfaces already — open the printer's address on your phone or any browser. This is how most V0 owners actually drive: zero extra hardware, zero wiring.
Running Marlin on this board? There are no display pins to wire a classic LCD to — the host is your control panel: OctoPrint's web UI (plus its phone apps) carries the whole job.
The complete GPIO map, triple-verified (schematic · pin diagram · shipped config), plus the questions everyone asks — answered with sources, not vibes.
| FUNCTION | PORT / SILKSCREEN | RP2040 GPIO | NOTES |
|---|---|---|---|
| X motor | XM1 | 11 / 10 / 12 | step / dir / enable · TMC addr 0 |
| Y motor | YM1 | 6 / 5 / 7 | TMC addr 2 |
| Z motors ×2 | ZAM1 + ZBM1 | 19 / 28 / 2 | parallel, one driver · addr 1 |
| Extruder | EM1 | 14 / 13 / 15 | TMC addr 3 |
| Driver UART | — | 9 rx · 8 tx | all four drivers, one bus |
| X / Y / Z endstop | X/Y/Z-STOP | 4 · 3 · 25 | 3-pin, 5 V available, buffered |
| Filament runout | E0-STOP | 16 | pause_on_runout shipped on |
| Hotend heater / sensor | HE · TH0 | 23 · 27 | max 300 °C enforced |
| Bed heater / sensor | HB · THB | 21 · 26 | max 130 °C enforced |
| Part fan | FAN1 | 17 | M106 / slicer |
| Hotend fan | FAN2 | 18 | auto ≥ 50 °C |
| Board fan / Laser | FAN3 · Laser | 20 | shared pin — one or the other |
| Probe / servo | PROBE · SERVOS | 22 · 29 | BLTouch-ready, block in config |
| RGB / Neopixel | RGB | 24 | onboard LED first in chain |
| Pi UART | P5 | 0 tx · 1 rx | + 5 V ×2 + GND · /dev/ttyAMA0 |