Open-hardware electronics for a Microduck-class robot duck, redesigned from the RevC component list.
Two 4-layer KiCad 9 projects: body/ (Core3566 carrier, power, 12 servo ports) and head/ (IMU, ToF, audio, NFC, 3 servo ports), joined by a 30-way ribbon.
Status: a first-pass design that passes KiCad's checks. It has not been built or electrically tested. Read "Before you order" below.
What is in this folder
Path
Contents
body/microduck_body.kicad_pro
Body project: schematic and routed PCB (78 x 124 mm, 4 layers)
head/microduck_head.kicad_pro
Head project: schematic and routed PCB (62 x 44 mm, 4 layers)
lib/
Project symbols and the two custom footprints (CM4-style module socket, VL53L5CX)
The scripts that generated everything, including the router (route.py, router.c)
out/
ERC/DRC reports and intermediate files
Open the .kicad_pro files with KiCad 9. The schematics are generated in a netlist style: parts are grouped by function and nets connect by global label rather than drawn wires.
Architecture
Compute: Waveshare/Luckfox Core3566 (RK3566, CM4 pinout) on two Hirose DF40HC(3.0)-100DS-0.4V connectors. The 3.0 mm stacking height leaves 1.5 mm under the module.
Battery: 2S pack on a screw terminal. Q1 blocks reverse polarity, TVS after it. Q3 switches logic power from a small external switch (J5) or a solder jumper.
Logic power: external Pololu D24V50F5 on a 3-way terminal (switched battery out, GND, 5 V in). Q4 protects against a reversed 5 V feed. Two LDOs make 3.3 V (digital) and 3.3 V (IMU/ADC); both are enabled by the module's own 3.3 V so peripherals power up after the SoC.
Servo power: the XC330-T288 is the 6.5-12 V version, so servos run from the battery. Q2 is off by default and ramps on in about 7 ms when goes high. Three 5 A PTCs feed three branches: left leg (5 ports), right leg (5 ports), spare + head (2 + 3 ports).
Servo bus: half-duplex Dynamixel TTL. 74AHCT1G126 (5 V) transmits, 74LVC1G125 (3.3 V) receives, one direction GPIO.
Monitoring: ADS1115 reads battery, servo rail and 5 V.
Head: switched 5 V (TPS22918), own 3.3 V LDO, ICM-42688-P, VL53L5CX, MAX98357A, two I2S mic connectors, two PN532 connectors on separate I2C buses, 3 servo ports.
GPIO map (RK3566 functions from the Core3566 datasheet)
Servo rail runs from the battery, not from a 5 V regulator (the T288 needs 6.5-12 V).
TVS moved behind the reverse-polarity FET (a unidirectional TVS in front of it would conduct on a reversed pack).
A third 10 V zener added (one gate clamp per battery-side FET). RevC listed two.
One 74AHCT1G126 + one 74LVC1G125 kept as in RevC; direction pull-down and idle pull-ups added.
NFC connectors are 5-pin (3V3, GND, SDA, SCL, IRQ); the two PN532 modules sit on different I2C buses because they share address 0x24.
Body IMU moved to SPI; head IMU stays on I2C.
USB VBUS does not power the board unless JP2 is closed (Schottky D5 added for bench flashing).
Board outlines and mounting holes are new. I did not have the RevC files, so nothing here is mechanically matched to the old boards.
What was checked
Check
Body
Head
KiCad ERC
0 violations
0 violations
Schematic netlist vs design data
identical (79 nets, 124 parts)
identical (24 nets, 48 parts)
KiCad DRC (clearance 0.13 mm, track 0.13 mm, via 0.6/0.3 mm)
0 violations, 0 unconnected
0 violations, 0 unconnected
KiCad schematic-parity test
0 issues
0 issues
DRC ran with silkscreen overlap/clipping and library-footprint-mismatch checks switched off. Pinouts were checked against the manufacturers' datasheets or KiCad's library symbols; the VL53L5CX land pattern was cross-checked against three independent open footprints.
Routing: the USB pair, the three CSI pairs and the module power/ground fan-out were laid out by script. Everything else was routed by the grid router in gen/ (written for this project, with rip-up and retry).
Before you order
Review it as a human. Nobody has looked at this layout in the KiCad GUI yet.
Core3566 device tree: the UART4/I2S3/SPI1/I2C3/I2C5 mux choices come from the datasheet table and need a matching DTS. Confirm CAM1 + I2C1 is the port your camera overlay expects.
microSD with eMMC modules: the datasheet indicates the on-board eMMC shares the SD bus, so the socket may only be usable on the Lite (no-eMMC) module. Leave J6 unfitted if so.
Camera FFC: check contact side and pin-1 end against your cable and camera before fitting J8.
Battery range: a 2S pack falls below the servo minimum (6.5 V) near 3.25 V per cell. Set the low-voltage cut-off accordingly.
Impedance: the pairs are sized for a 0.1 mm outer prepreg (JLCPCB JLC04161H-3313 or similar). Check with your fab's calculator; USB is 0.2 mm tracks at 0.5 mm pitch, CSI is 0.15 mm at 0.4 mm.
Servo switch: Q2 turns off slowly (tens of ms). Disable servo torque before cutting servo power.
Head I/O with head power off: keep the head GPIOs low or high-impedance while HEAD_EN is low.
Mechanics: outline, hole positions, connector positions and part heights have not been checked against the duck's body. There are no 3D models in the project.
JP2: only close it for bench flashing without the Pololu fitted.
Regenerating
Everything is generated: gen/body.py and gen/head.py hold parts and nets, gen/pl_*.py hold placement, pours and hand-routed nets. gen/all.sh body rebuilds a board end to end inside a KiCad 9 environment (paths in the scripts assume the build machine's layout).
No comments yet. Be the first to ask about this board.
No comments yet. Be the first to ask about this board.