Post-Hackathon Iteration: Designing a Better Servo Driver Shield
🔍 AI Assistance Disclosure (click to expand)
This note has been lightly edited with AI assistance for clarity. All technical content and observations are my own.
Looking for polished project documentation? Check out Technical Projects.
Want my unfiltered thoughts? See Stories & Writing.
Quick Context
The moment the hackathon ended, I knew what I had to do. That hacked-together PCA9685 with tin-stacked traces worked, but it was a mess. Whether I continue developing the quadruped or start new projects, I need a proper servo driver shield.
So I used part of the prize money to buy an Arduino Uno Q (the new one with Qualcomm compute + STM32 real-time controller - huge development potential) and immediately started laying out a new board.
First Article Arrived - 02/03 Update
Boards came back from fab today!
It fits the Arduino Uno Q perfectly.
The buck module integration is clean.
Really happy with how compact this turned out –
Definitely one of the sweetest boards I’ve designed.
Design Decisions
Power Architecture - USB-PD Instead of LiPo
Old approach: 8.4V (2S) hobby LiPo batteries
New approach: USB-PD 3.1 with 140W trigger
Why? Keeping a large LiPo in my dorm felt unsafe. With PD3.1, I can power everything elegantly with a power bank and USB-C cable. Much cleaner, much safer.
Power chain:
- PD 3.1 trigger negotiates 28V @ 140W max
- SIC431-based buck: 28V → 8.4V @ 24A (servo rail)
- TPS56A37-based buck: 28V → 5V @ 10A (Arduino Uno Q + future AI modules)
The SIC431 is officially rated for 24V max input, but I’ve tested it up to 28V and it runs stable. I had already designed a 24A buck module with this chip previously, so I could mount it directly on the shield - perfect reuse.
Servo Driver - Pico Coprocessor Instead of PCA9685
Old approach: PCA9685 I2C LED driver repurposed for servos
New approach: Raspberry Pi Pico as dedicated servo coprocessor
Why abandon the PCA9685? Because it’s fundamentally an LED driver. For precise servo control, the Pico’s PIO (Programmable IO) state machines are vastly superior - more real-time, more accurate timing.
Communication with Arduino Uno Q via SPI or UART. The Pico handles all 8 servo channels independently while the main Arduino focuses on high-level control and computation.
Layout Considerations
Critical design elements:
- Servo power traces: Copper pour equivalent width >250 mil (6.35mm) to handle peak current draws
- Per-channel protection: Each servo has individual fuse + large bulk MLCC capacitors for decoupling
- Thermal management: Buck converters positioned for maximum airflow, keepout zones for heat
- Shield form factor: Standard Arduino form factor for compatibility
The shield mounts my existing SIC431 buck module perfectly - sometimes designing around parts you already have is faster than sourcing new components.
Key Takeaways
- Design the tool you wish you had - immediately after the hackathon, I knew exactly what I needed
- PD 3.1 @ 140W is a game-changer for robotics power delivery - no more sketchy LiPo charging in dorms
- Reusing proven designs (like my SIC431 buck module) accelerates development significantly
- PCA9685 is fine for prototyping but a dedicated Pico coprocessor gives much better servo control
- Copper width matters - 250+ mil traces eliminate power distribution bottlenecks
- Per-channel protection (fuses + decoupling) prevents one bad servo from killing the entire system
Next step: firmware for the Pico’s PIO blocks to implement ultra-precise servo timing. Then finally give this quadruped the control system it deserves.
References
- IEEE Robotech Hackathon Circuits - the hack that inspired this redesign
- SIC431 Datasheet
- TPS56A37 Datasheet
- RP2040 PIO Documentation
Just a quick note from my engineering journal. More detailed projects in Technical Projects.