GEO-DUDe Carrier PCB¶
Custom 2-layer PCB replacing the perfboard. Central interconnect for all GEO-DUDe electronics: PCA9685 PWM driver socket, SimpleFOC motor control, per-servo fusing, and servo/fan headers.
Design Summary¶
| Replaces | Perfboard fuse board |
| Tool | KiCad 10.0.0 |
| Fab target | JLCPCB |
| Layers | 2 (front: power, back: signals) |
| Copper weight | 2 oz (high-current traces) |
| Board size | 170 x 112 mm |
Power Rails (6 separate rails)¶
| Rail | Net | Source | Used For |
|---|---|---|---|
| 12V | +12V |
Toggle switch / bus | Base/shoulder servos, fan |
| 12V FOC | +12V_FOC |
Separate switch | SimpleFOC motor driver (independent from servos) |
| 7.4V | +7V4 |
Buck converter 1 | Elbow servos |
| 5V servo | +5V_SERVO |
Buck converter 3 | Wrist servos |
| 5V logic | +5V_LOGIC |
Pi 5V pin | General logic |
| 3.3V | +3V3 |
Pi 3.3V pin | PCA9685 VCC, I2C bus, IMU, encoder |
Ground (2 separate nets)¶
| Net | Used For | Returns To |
|---|---|---|
GND |
Servo power, fan, FOC motor driver | GND bus bar |
GND_LOGIC |
I2C, PCA9685, IMU, encoder | GND bus bar |
Both connect at the bus bar only — not on this PCB.
Right Edge — Power Input Terminals¶
| Terminal | Pins | Net |
|---|---|---|
| J_FOC_12V | pin1: +12V_FOC, pin2: GND | FOC motor power (separate switch) |
| J1 | 2x | +12V (both pins) |
| J2 | 2x | +12V (both pins) |
| J5 | pin1: +7V4, pin2: GND | 7.4V input |
| J6 | pin1: +5V_SERVO, pin2: GND | 5V servo input |
| J3 | 2x | GND (both pins) |
| J4 | 2x | GND (both pins) |
PCA9685 Socket (J_PCA)¶
Custom footprint matching the Adafruit PCA9685 16-channel PWM driver breakout (62×25mm). The breakout plugs directly into the carrier board.
Servo output pads (48 pins): 4 blocks of 3×4 (Signal, V+, GND per channel). Signal pads wired to PWM_CH0–CH15. V+ pads unconnected (power routed separately through fuses). GND pads wired to GND.
Control headers (2× 1×6): Left and right side headers — VCC (+3V3), SDA, SCL, GND_LOGIC connected. OE and V+ left NC.
Terminal block (2 pins): NC (servo power supplied through fuses).
Mounting holes (4×): M2.5 for standoffs.
Middle — Fuse Holders¶
10x BLX-A 5x20mm PCB-mount fuse holders (22.2mm pin pitch, 1.5mm drill). Two columns: arm 1 (left), arm 2 (right). Silkscreen labeled with servo name.
| Fuse | Label | Rating | Rail | Servo |
|---|---|---|---|---|
| F1 | B1 | 8A | +12V | Arm 1 Base |
| F2 | S1 | 8A | +12V | Arm 1 Shoulder |
| F3 | E1 | 5A | +7V4 | Arm 1 Elbow |
| F4 | W1A | 3A | +5V_SERVO | Arm 1 Wrist Rotate |
| F5 | W1B | 3A | +5V_SERVO | Arm 1 Wrist Pan |
| F6 | B2 | 8A | +12V | Arm 2 Base |
| F7 | S2 | 8A | +12V | Arm 2 Shoulder |
| F8 | E2 | 5A | +7V4 | Arm 2 Elbow |
| F9 | W2A | 3A | +5V_SERVO | Arm 2 Wrist Rotate |
| F10 | W2B | 3A | +5V_SERVO | Arm 2 Wrist Pan |
Bottom Edge — Output Headers¶
Servo Headers (10x 3-pin male)¶
Pin order: Signal (PWM) | Power (fused V+) | GND
| Header | Label | PCA Ch | Fuse |
|---|---|---|---|
| SV1 | B1 | Ch 0 | F1 |
| SV2 | S1 | Ch 1 | F2 |
| SV3 | E1 | Ch 2 | F3 |
| SV4 | W1A | Ch 3 | F4 |
| SV5 | W1B | Ch 4 | F5 |
| SV6 | B2 | Ch 5 | F6 |
| SV7 | S2 | Ch 6 | F7 |
| SV8 | E2 | Ch 7 | F8 |
| SV9 | W2A | Ch 8 | F9 |
| SV10 | W2B | Ch 9 | F10 |
Fan Header (2x4 pin male)¶
Row 1 (fan connector): GND, +12V_FAN, Tach, PWM (Ch 12) Row 2 (Pi jumper): NC, NC, Tach, PWM (mirror for wiring to Pi GPIO)
SimpleFOC Motor Control¶
Replaces the old ESC. Uses Pi Pico + SimpleFOC Mini v1.0 driver (DRV8313) + 2804 hollow shaft BLDC motor with AS5600 encoder.
| Header | Footprint | Description |
|---|---|---|
| J_PICO | RaspberryPi_Pico_Common_THT | Pi Pico socket — runs SimpleFOC firmware |
| J_FOC | Custom (20 pads) | SimpleFOC Mini v1.0 full board socket (MCU header + motor output + power + mounting) |
| J_IMU | Custom (2×6, 19mm apart) | SparkFun ICM-20948 9DoF IMU breakout — two 1×6 headers on opposite board edges |
| J_ENC | PinHeader_1x04 | AS5600 encoder I2C cable (VCC, GND, SDA, SCL) — encoder lives on motor |
| J_SERIAL | PinHeader_1x04 | Pico ↔ Pi serial link (TX, RX, GND, 3V3) |
J_FOC pad map (SimpleFOC Mini v1.0, from EasyEDA design files):
| Pad | Signal | Net | Section |
|---|---|---|---|
| 1 | GND | GND | MCU header (2×5) |
| 2 | 3V3 out | — | MCU header |
| 3 | EN | FOC_EN | MCU header |
| 4 | GND | GND | MCU header |
| 5 | IN3 | FOC_IN3 | MCU header |
| 6 | nRESET | — | MCU header |
| 7 | IN2 | FOC_IN2 | MCU header |
| 8 | nSLEEP | — | MCU header |
| 9 | IN1 | FOC_IN1 | MCU header |
| 10 | nFAULT | — | MCU header |
| 11 | M1 (U) | — | Motor output (1×3) |
| 12 | M2 (V) | — | Motor output |
| 13 | M3 (W) | — | Motor output |
| 14 | GND | GND | Power terminal |
| 15 | VIN | +12V_FOC | Power terminal |
| 16–19 | GND | GND | Corner mounting pads |
| 20 | GND | GND | Extra GND pad |
Motor UVW order doesn't matter — SimpleFOC handles commutation direction in firmware.
Pico pin assignments (PCB version):
| Pico Pin | GPIO | Function |
|---|---|---|
| 1 | GP0 | TX → Pi serial |
| 2 | GP1 | RX ← Pi serial |
| 6 | GP4 | SDA (IMU + encoder I2C) |
| 7 | GP5 | SCL (IMU + encoder I2C) |
| 14 | GP10 | FOC EN (enable) |
| 15 | GP11 | FOC IN3 (PWM) |
| 16 | GP12 | FOC IN2 (PWM) |
| 19 | GP14 | FOC IN1 (PWM) |
| 38 | GND | Ground |
Two hardware versions
The table above is for the carrier PCB (routed layout). The perfboard prototype uses different Pico GPIO pins for the FOC signals — update this section once perfboard wiring is confirmed. Serial (GP0/1) and I2C (GP4/5) are the same on both versions.
Trace Widths¶
| Current | Width | Nets |
|---|---|---|
| 8A | 3.0 mm | +12V, GND, base/shoulder fused power |
| 5A | 2.0 mm | +7V4, elbow fused power |
| 3A | 1.5 mm | +5V_SERVO, wrist fused power |
| <1A | 0.6 mm | +5V_LOGIC, +3V3, GND_LOGIC |
| Signal | 0.4 mm | PWM, SDA, SCL |
Front copper: power traces. Back copper: signal traces. Freerouting autorouter handles 2-layer routing.
Design Workflow (headless)¶
generate_pcb.py → place components, assign nets (pcbnew Python API)
↓
route_pcb.py → export DSN → patch trace widths → Freerouting → import SES
↓
kicad-cli pcb drc → verify
↓
kicad-cli pcb export svg → visual preview
↓
kicad-cli pcb export gerbers → fab files for JLCPCB
No GUI required. Human reviews SVG/KiCad for final placement tweaks.
Components¶
| Part | Footprint | Qty |
|---|---|---|
| 2-pin 5mm screw terminal | TerminalBlock_MaiXu_MX126-5.0-02P | 7 |
| 1x3 pin header 2.54mm | PinHeader_1x03_P2.54mm_Vertical | 11 |
| 1x4 pin header 2.54mm | PinHeader_1x04_P2.54mm_Vertical | 2 |
| BLX-A 5x20mm fuse holder | Custom (22.2mm pitch, 1.5mm drill) | 10 |
| PCA9685 breakout socket | Custom (62 pads + 4 mounting) | 1 |
| SimpleFOC Mini socket | Custom (20 pads, from EasyEDA) | 1 |
| SparkFun ICM-20948 socket | Custom (12 pads, 19mm row spacing) | 1 |
| Pi Pico socket | RaspberryPi_Pico_Common_THT | 1 |
| 2x4 pin header 2.54mm | PinHeader_2x04_P2.54mm_Vertical | 1 |
Source Files¶
KiCad project: zeulewan/geodude-control → pcb/geodude-carrier/