
ProPrj Driver Board to share 2026-08-01
BarbourSmith/Maslow-Mini-Control-Board
A third KiCad project that puts both existing boards on one PCB:

A third KiCad project that puts both existing boards on one PCB:
Maslow Mini Merged Board is an open-source printed circuit board by BarbourSmith, from the BarbourSmith/Maslow-Mini-Control-Board repository on GitHub. It is a 4-layer board of 153 × 111 mm with 156 parts on 154 nets.
It is built around the ESP32-S3-WROOM-1-N8, LM2596R-3.3 and ZDSD01GLGEAG, with the TCA9546AD, XT60PB-M.G.Y and B2B-PH-K-S(LF)(SN) among its other parts. Its parts include 64 capacitors, 53 resistors, 12 ICs, 11 connectors and 8 diodes. It belongs with the ESP32 boards of this library.
A third KiCad project that puts both existing boards on one PCB:
| Source | What it is | Files |
|---|---|---|
../Motor Controller Board/ | "Four Motor Control Board M5" — ESP32-S3, 4× DRV8876 belt-axis drivers, TCA9546A I²C mux, SD NAND, LM2596 3.3 V buck, XT60 inlet | PCB only, no schematic |
../KiCad Boards/ | "Driver Board 2026-08-01" — ESP32-S3, 2× MP6541A 3-phase drivers, MP2459 3.3 V buck, beam-break homing, vacuum control | schematic + PCB |
Scope: schematic, plus a partially-placed PCB. The mechanically-constrained parts are placed; the rest are staged off-board for manual placement. Nothing is routed yet.
The merge is in two parts: joining the two circuits, and then removing the redundancy that a single board makes pointless. 169 parts / 61 BOM lines → 156 parts / 53 BOM lines.
Both ESP32-S3 MCUs are retained. They are wired to each other only on the BoardCom pair,
which is exactly what the mated H1 2×5 headers used to carry:
| Merged net | Motor section | Driver section |
|---|---|---|
BOARDCOM_A | U110 pin 9 — IO16 | U12 pin 31 — IO38 |
BOARDCOM_B | U110 pin 8 — IO15 | U12 pin 32 — IO39 |
Note the crossover. On the original boards both headers carried a net called BOARDCOM1 on
pins 1/3 and BOARDCOM2 on pins 2/4 — but with the opposite assignment on each board, so
mating them swapped the pair. That swap is preserved here.
H1 is deleted from both sections. Its remaining pins were power, so:
VIN on the driver, VCC on the motor board) become one shared VIN railGNDOnce both circuits sit on one board, some parts are doing the same job twice.
The driver board's U2 was an MP2459 — 0.5 A, feeding an ESP32-S3-WROOM-1 that peaks around
355 mA on WiFi transmit. That rail had almost no margin before the merge. The motor board's
U116 is an LM2596-3.3 — 3 A. Combined 3.3 V load across both sections is roughly 530 mA
typical, ~950 mA worst case, so the LM2596 carries both with ~3× headroom.
Deleted: U2, L3 (47 µH), D2 (catch), D6 (OR-ing), C80, C81, R61, R62, R63.
D7 is kept and now ORs the driver USB port's VBUS into the shared VIN_BUCK, so either USB
port can still power the whole board. +3V3_MC and +3V3_DRV are gone; there is one +3V3.
The motor MCU had no reset button at all — just an RC on EN. Both EN pins now share one net
(RST) driven by SW2, with R28 (10 kΩ) and C134 (1 µF) as the single RC. R128 and C30
are deleted. The 1 µF is kept over the driver board's 100 nF because that is the value
Espressif's design guide asks for.
D101 + R115 deleted; the driver section's LED2 + R17 is kept (3.6 mA rather than 11 mA,
and the LED was explicitly specified for low forward voltage on a 3.3 V rail). D102/D103
change from SS14 (40 V / 1 A) to the SS36 (60 V / 3 A) already used by D7 — one BOM line
instead of two, and more margin on a 24 V rail that also carries six motor stages.
| parts | BOM lines | |
|---|---|---|
| MP2459 buck chain | 9 | 6 |
| second power-on LED | 2 | 1 |
| second EN RC | 2 | 0 |
| SS14 → SS36 | 0 | 1 |
| total | 13 | 8 |
Nothing was added.
Each section keeps its own ESP32-S3, its own USB-C programming port and its own boot button
(BOOT_MC / BOOT_DRV). Combining the two MCUs was explicitly out of scope. Combining the two
USB ports would need a hub IC — a net part increase — or flashing the driver MCU through the
motor MCU, which costs firmware work and makes recovery from a bad flash harder.
Also deliberately untouched: the VIN bulk capacitance. C140 (680 µF) and C72/C73
(2× 220 µF) were sized as two independent reservoirs because a header sat between them, and one
of the 220 µF is probably surplus now — but that is a ripple-current question, not a schematic
one. The ten 1 kΩ I2C pull-ups are also unchanged; each mux channel needs its own pair, though
1 kΩ is unusually strong (2.2–4.7 kΩ is conventional).
| Original | Merged | Why |
|---|---|---|
motor VCC | VIN | merges with the driver rail H1 used to carry |
motor 3V3, driver 3V3 | +3V3 | one regulator now, so one rail |
motor MCU_RST, driver RST | RST | one reset for both MCUs |
motor U16_1, driver VIN_BUCK | VIN_BUCK | one buck input, fed by three OR-ing diodes |
motor BOOT | BOOT_MC | each MCU keeps its own boot button |
driver BOOT | BOOT_DRV | " |
motor L2_1, U2_6… | SW_BUCK, IPROPI_TR… | the source PCB had auto-generated net names |
Motor-section reference designators are the originals + 100 (U2→U102, C7→C107,
CN3→CN103, …). The driver section keeps its own designators unchanged; its highest was
C82, so nothing collides and you can still map any part back to its source board.
Maslow Mini Merged Board.kicad_pro project
Maslow Mini Merged Board.kicad_sch root sheet — the two sections + the BoardCom link
Maslow Mini Merged Board.kicad_pcb board — 70.7 x 111 mm, 20 parts placed, 136 staged, unrouted
motor_control_section.kicad_sch page 2
driver_section.kicad_sch page 3
MaslowMerged.kicad_sym symbols authored for the motor-control parts
MaslowMerged.pretty/ footprints extracted from the motor board's PCB
ProPrj_Dri-easyedapro.kicad_sym symbols carried over from the driver board
ProPrj_Dri-easyedapro.pretty/ footprints carried over from the driver board
tools/ the scripts that generated all of the abovetools/pcb_layout.py builds the board. 20 parts keep the exact position they had on their
own board — every motor driver IC and every connector:
| parts | |
|---|---|
| motor drivers | U102 U103 U105 U106 (DRV8876), U14 U15 (MP6541A) |
| power / data | U101 (XT60), USB102, USB1 |
| motor outputs | CN101 CN103 CN104 CN110, CN3 CN4 |
| axis encoders | CN105 CN109 CN111 CN112 |
| vacuum | CN5 |
The two source boards are the same mechanical envelope. Checked, not assumed:
So neither section is translated. Both sit at their own original board coordinates and
overlay onto one PCB, which is what makes all six motor drivers land on the same outline. The
twenty position-critical parts were checked for collisions in that arrangement: zero, and
every one of them falls inside the motor outline and clear of its cutouts. Board side and
rotation are preserved throughout — the driver section's ICs and connectors are on B.Cu, as
they were.
Edge.Cuts is the motor board's outline used verbatim, cutouts included, since it is the larger
of the two. The driver board's outline is drawn on Dwgs.User; the only place the two genuinely
differ is one cutout (the motor board has a 112 mm² hole at (150, 80) that the driver board does
not, and the driver board has a 290 mm² one the motor board does not).
The remaining 136 parts are staged 63 mm to the right of the board, behind a divider line on
Cmts.User, in two labelled groups — one per section, sorted by reference, each keeping its
original rotation and board side. tools/verify_pcb.py asserts that nothing but the twenty fixed
parts touches the board area.
Staging cells are sized from each part's physical extent only — pads plus graphics and zones
on copper, silk, courtyard, fab, paste and mask layers — and each part is anchored by its own
top-left extent rather than its origin, so the rows line up regardless of where a given footprint
puts its anchor. Text field positions and the Dwgs.User / User.* documentation and 3D-shell
zones are excluded: several of these footprints park hidden fields and shell outlines a long way
from the part, and measuring those blew the grid out to 1.6 m of sheet.
Footprint instances are lifted verbatim out of the two source PCBs, so pad shapes, back-side
mirroring, custom padstacks and 3D model references all survive; only position, reference, net
names and the schematic path are rewritten. The two exceptions are D102/D103, whose footprint
changed with the SS14 → SS36 swap; those are built fresh from Diode_SMD:D_SMA.
Moving a part is not just a matter of rewriting its at. A footprint's pads and fp_* graphics
are stored relative to its anchor, but two things are stored in absolute board coordinates:
zone, and
a footprint zone's polygon is absoluterender_cache, the cached glyph outlines of textAn early version of pcb_layout.py moved only the anchor, which stranded those at the old
location and produced footprints whose bounding box spanned 400 mm. KiCad then reported a
position nowhere near what it drew, and dragging jumped. The generator now translates zone
polygons with the part (in integer nanometres, so nothing drifts) and drops render_cache for
KiCad to rebuild.
Overlaying the two boards puts the driver board's CN3 (3-pin motor phase header, back side)
on top of the motor board's U103 (DRV8876, front side). CN3's pads are through-hole, so
they punch through and short to three of U103's pads — DRC reports it as
shorting_items ×3, solder_mask_bridge ×3 and pth_inside_courtyard. Closest pad-to-pad
distance is 1.6 mm centre-to-centre.
This is a real design conflict, not a file problem, and which of the two moves is your call, so
both are left at their original coordinates and the spot is marked with a note on Cmts.User.
It is the only such conflict: an exact pad-level check across all twenty fixed parts finds no
other pair within 0.2 mm of touching.
IR1 and CGQ1 are the beam-break homing pair; their positions are as mechanically constrained
as any connector, but they are not connectors and not motor drivers, so they went to staging. Say
the word and they move to their original spots too. The indicator LEDs (LED102, LED103,
LED2) are in the same category if the enclosure has light pipes.
Driver section is the original schematic file, edited in place — same symbols, same
placement, same graphics for everything that survives. The edits are: delete the listed symbols,
convert the two surviving BoardCom labels to hierarchical pins, rename 3V3/BOOT, and retarget
the instance paths at this project. Everything the deletions leave behind — labels that sat on a
deleted pin, wires with nothing at one end, junctions in a wholly removed branch — is found by
walking the sheet's connectivity graph rather than by hard-coded position, so the script stays
correct if the source schematic moves. Two cosmetic repairs come with that: D7's reference and
value text had been parked at D2's position by whoever added those diodes, and was re-seated
next to D7 once D2 went; and the block captioned "3.3V Regulator / 200ma LDO / Power OR-ing
with PMOS" — describing an arrangement this schematic never actually contained — is retitled
"3.3 V DECOUPLING" with the stale notes removed.
Motor control section had to be reconstructed: that board exists only as a PCB. Its
connectivity here is taken pin-for-pin from Four Motor Control Board M5_*.kicad_pcb, and its
symbols were authored from the datasheet pinouts, each one cross-checked against how the PCB
actually wires the part (e.g. the 100 nF from DRV8876 pin 12 to VM identifies pin 12 as VCP,
which fixes the whole right-hand side of that package). Connectivity is drawn with a label on
every pin rather than routed wires — the same style the driver board's own EasyEDA-imported
schematic uses.
tools/verify_netlist.py compares the merged schematic's netlist against both source boards
as a partition of pins, so net naming is irrelevant — what must match is which pins end up
electrically common. Every intentional change is declared in that script and applied to the
expectation, so anything else that moved would show up as a mismatch. Current result:
declared deletions: 15 parts
expected multi-pin nets: 124 actual: 124
EXACT MATCH - every remaining source net is reproduced, and nothing beyond the
declared changes was altered.The thirteen pins the merged schematic carries that the sources do not are pads that were
simply unconnected on the source PCB and are now explicit: SW101 1/3, U109 1/7 (SD NAND
DAT1/DAT2, unused in SPI mode), USB102 A8/B8 (SBU), and seven spare ESP32 IOs on U110.
tools/verify_pcb.py then checks the board against the schematic: every component present
exactly once with the right footprint, every pad carrying the net the schematic gives it
(compared as a partition again), every footprint's schematic path pointing at the right sheet and
symbol, and every part that was supposed to keep its position sitting exactly where it was to
within its section's translation. Current result:
components: schematic 156, board 156
multi-pad nets: schematic 124, board 124
schematic paths: 156 unique across 156 footprints
fixed parts: 20 checked against their source-board coordinates
staged parts touching the board area: 0
uuids: 5113 total, 5113 distinct
footprint geometry identical to source: 154 of 154 checked
Edge.Cuts segments: 241
PASSThe geometry check is the important one: it compares every footprint's complete child-coordinate set against the same footprint on its source board, anchor-relative and in integer 0.1 µm units, with embedded zone polygons converted back to relative. Nothing can be left behind or drift without it failing.
The uuid and Edge.Cuts checks exist because both went wrong once. KiCad identifies every board
object by its uuid, and duplicates make selection and dragging misbehave — the driver source board
already ships a few (identical hidden property fields copied between parts), and an early version
of pcb_layout.py multiplied them by minting outline ids from arguments that were identical for
both outline copies. The generator now mints every id from one monotonic counter and re-mints any
duplicate it inherits; the verifier fails if a single one survives, or if the board outline is
missing.
PCB DRC reports 424 unconnected items — correct, nothing is routed — and 260 other findings, all
of which are pre-existing on the source boards: the motor board's own baseline has 106 padstack,
62 text_height and 179 silk_overlap findings from its EasyEDA import, and the driver board's
has 63 lib_footprint_mismatch. The merged board has fewer silkscreen violations than either
source because the staged parts are spread out. No clearance, copper or hole-to-hole violations
exist because there is no routing yet.
ERC over the whole project: 203 findings, all inherited from the driver board's EasyEDA import —
pin_to_pin and pin_not_driven caused by that library typing its pins Unspecified,
endpoint_off_grid on that sheet's original geometry, and one power_pin_not_driven on its
#PWR01 ground symbol. There are no dangling labels, dangling wires, unconnected wire
endpoints, unresolved symbols or missing footprint links; the driver board's own pre-merge
baseline had 8 unconnected wire endpoints and 4 dangling wires, which the deletion cleanup
removed. The motor-control sheet contributes zero off-grid endpoints.
The LM2596's TO-263 tab (U116 pad 6) was left with no net on the source PCB. The tab is
internally GND on that package, so it is bonded to GND here. This is the one place the merged
netlist intentionally differs from the source; tools/verify_netlist.py accounts for it
explicitly.
LED102 is wired anode-on-pin-1, LED103
anode-on-pin-2. That is reproduced from the source PCB (different footprints), but it is worth
confirming against the parts you actually buy.10uF / C0805 still appears as two BOM lines because both project libraries carry a C0805
footprint. Their pads differ by 0.0001 mm — they are the same EasyEDA export — so pointing all
the passives at one library would collapse that line, and several others. Not done here
because it touches every passive's footprint field.R107 (1.5 kΩ, was R7) sits directly between TRINAMICRX and TRINAMICTX — the usual
half-duplex TMC UART arrangement, carried over as-is.cd "Merged Control Board"
python3 tools/symlib.py MaslowMerged.kicad_sym
python3 tools/footprints.py
python3 tools/motor_sheet.py
python3 tools/driver_sheet.py
python3 tools/root_sheet.py
python3 tools/pcb_layout.pyand to re-check everything:
python3 tools/verify_netlist.py && python3 tools/verify_pcb.pymotor_sheet.py reads the analyzed motor PCB JSON and driver_sheet.py reads the original
driver schematic, so both regenerate from the source boards rather than from this project.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 12 | 10uF | ProPrj_Dri-easyedapro:C0805 | C44, C45, C46, C52, C56, C57, C65, C66, C67, C68, C69, C70 |
| 12 | 3.3kΩ | ProPrj_Dri-easyedapro:R0402 | R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60 |
| 10 | 1kΩ | MaslowMerged:R0402 | R106, R108, R117, R118, R119, R120, R121, R125, R126, R127 |
| 8 | 100nF | MaslowMerged:C0805 | C109, C111, C112, C115, C120, C121, C122, C123 |
| 7 | 330Ω | ProPrj_Dri-easyedapro:R0402 | R17, R22, R23, R24, R35, R36, R37 |
| 6 | 100nF | ProPrj_Dri-easyedapro:C0402 | C36, C38, C42, C43, C47, C71 |
| 6 | 1nF | ProPrj_Dri-easyedapro:C0402 | C31, C32, C33, C61, C62, C63 |
| 5 | 1.5kΩ | MaslowMerged:R0805 | R101, R107, R112, R113, R124 |
| 5 | 10kΩ | MaslowMerged:R0805 | R110, R111, R122, R123, R132 |
| 4 | 1uF | MaslowMerged:C0805 | C114, C117, C126, C127 |
| 4 | 22nF | MaslowMerged:C0805 | C108, C110, C118, C119 |
| 4 | 22uF | MaslowMerged:CAP-SMD_BD6.3-L6.6-W6.6-LS7.3-FD | C107, C113, C116, C124 |
| 4 | 5.1kΩ | ProPrj_Dri-easyedapro:R0402 | R2, R3, R25, R38 |
| 4 | B2B-PH-K-S(LF)(SN) | MaslowMerged:CONN-TH_B2B-PH-K-S | CN101, CN103, CN104, CN110 |
| 4 | B4B-PH-K-S(LF)(SN) | MaslowMerged:CONN-TH_B4B-PH-K-S | CN105, CN109, CN111, CN112 |
| 4 | DRV8876PWPR | MaslowMerged:HTSSOP-16_L5.0-W4.4-P0.65-LS6.4-BL-EP | U102, U103, U105, U106 |
| 3 | 10kΩ | ProPrj_Dri-easyedapro:R0402 | R28, R39, R47 |
| 3 | 1uF | ProPrj_Dri-easyedapro:C0402 | C37, C40, C41 |
| 3 | 5.1kΩ | MaslowMerged:R0805 | R104, R109, R114 |
| 3 | B3B-XH-2(LF)(SN) | ProPrj_Dri-easyedapro:CONN-TH_B3B-XH-2-LF-SN | CN3, CN4, CN5 |
| 3 | SS36 | Diode_SMD:D_SMA | D7, D102, D103 |
| 2 | 100nF/50V | ProPrj_Dri-easyedapro:C0603 | C75, C78 |
| 2 | 120Ω | MaslowMerged:R0603 | R102, R103 |
| 2 | 1uF/16V | ProPrj_Dri-easyedapro:C0603 | C74, C77 |
| 2 | 220uF | ProPrj_Dri-easyedapro:CAP-TH_BD8.0-P3.50-D0.6-FD | C72, C73 |
| 2 | 22pF | MaslowMerged:C0603 | C132, C133 |
| 2 | 22uF/16V | ProPrj_Dri-easyedapro:C0805 | C54, C82 |
| 2 | 4.7uF/10V | ProPrj_Dri-easyedapro:C0805 | C76, C79 |
| 2 | MP6541A | ProPrj_Dri-easyedapro:TQFN-26 (6X6MM) | U14, U15 |
| 2 | TSA002A3512A02 | ProPrj_Dri-easyedapro:SW-SMD_BZCN_TSA002A35XXX | SW2, SW3 |
| 1 | 100nF | MaslowMerged:C0603 | C130 |
| 1 | 100Ω | ProPrj_Dri-easyedapro:R0402 | R48 |
| 1 | 10K | MaslowMerged:R0603 | R130 |
| 1 | 10uF | MaslowMerged:C0805 | C131 |
| 1 | 1uF | MaslowMerged:C0603 | C134 |
| 1 | 2.4GHz | ProPrj_Dri-easyedapro:WIRELM-SMD_ESP32-S3-WROOM-1 | U12 |
| 1 | 33uH | MaslowMerged:IND-SMD_L6.0-W6.0 | L102 |
| 1 | 470uF | MaslowMerged:CAP-SMD_BD6.3-L6.6-W6.6-LS7.6-RD | C129 |
| 1 | 680uF | MaslowMerged:CAP-SMD_BD10.0-L10.3-W10.3-LS10.9-FD | C140 |
| 1 | DTSL-61N-V-T/R | MaslowMerged:SW-SMD_4P-L6.2-W6.4-P4.00-LS7.2 | SW101 |
| 1 | ESP32-S3-WROOM-1 | ProPrj_Dri-easyedapro:WIRELM-SMD_ESP32-S3-WROOM-1 | U110 |
| 1 | FC-DA1608BK-470H10 | MaslowMerged:LED0603-RD | LED103 |
| 1 | IR12-21C/TR8 | ProPrj_Dri-easyedapro:LED-SMD_IR12-21C-TR8 | CGQ1 |
| 1 | KH-TYPE-C-16P | MaslowMerged:USB-C-SMD_KH-TYPE-C-16P | USB102 |
| 1 | LED-0603_R | MaslowMerged:LED0603_RED | LED102 |
| 1 | LM2596R-3.3 | MaslowMerged:TO-263-5_L10.2-W8.6-P1.70-LS14.4-TL | U116 |
| 1 | PT12-21C/TR8 | ProPrj_Dri-easyedapro:SENSOR-SMD_L3.0-W2.0-RD | IR1 |
| 1 | RB050L-60TE25 | MaslowMerged:SMA_L4.3-W2.7-LS5.1-RD | D105 |
| 1 | SMCJ24A | ProPrj_Dri-easyedapro:SMC_L7.1-W6.2-LS8.1-R-RD | D5 |
| 1 | TCA9546A | MaslowMerged:SOP-16_L5.0-W4.4-P0.65-LS6.4-BL | U107 |
| 1 | TYPE-C 16PIN | ProPrj_Dri-easyedapro:USB-C-SMD_TYPE-C-6PIN-2MD-073 | USB1 |
| 1 | XT60PB-M.G.Y | MaslowMerged:CONN-TH_XT60PB-M | U101 |
| 1 | ZDSD01GLGEAG | MaslowMerged:LGA-8_L6.0-W8.0-P1.27-BL | U109 |
| 1 | green | ProPrj_Dri-easyedapro:LED0603-RD-YELLOW | LED2 |

BarbourSmith/Maslow-Mini-Control-Board
A third KiCad project that puts both existing boards on one PCB:

BarbourSmith/Maslow-Mini-Control-Board
A third KiCad project that puts both existing boards on one PCB:


Dschorim/esp32-minikeyboard-pcb
PCB design files for 2x2 keyboard with esp32

Tknika-SCLF/sclf-gripper
Deskargatu eta instalatu Antigravity bere webgune ofizialetik. VSCode/Windsurf-en fork bat da eta modu berean funtzionatzen du.



OpenTaxus/opentaxus
Opentaxus is a permissively licensed set of hardware, software, and tooling to help as a starting point for customized conference badges.

badgeteam/ecsc21-badge-public
Hardware design files for the ENISA ECSC21 badge (software coming later)

halbritt/fome-mc
FOME-MC integrated single-PCB motorcycle ECU (STM32H753 + 2x STM32F042 WBO)
It measures 153 × 111 mm and has 4 copper layers, 1.6 mm thick.
156 parts, built around the ESP32-S3-WROOM-1-N8, LM2596R-3.3, ZDSD01GLGEAG and TCA9546AD. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the BarbourSmith/Maslow-Mini-Control-Board repository on GitHub, at the commit this page was made from: the board is Merged Control Board/Maslow Mini Merged Board.kicad_pcb and its schematic KiCad Boards/.claude/baseline/verified.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask BarbourSmith before reusing the design.