Skip to the content
4 layers30 × 70 mmSnips controller, the printed circuit board in 3D

The controllers built to work with Amidala

Size
30 × 70 mm
Copper layers
4
Thickness
1.6 mm
Parts
94
Nets
56
Pads
366
Tracks, vias
945, 127
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
28 Jul 2026
Updated
5 Nov 2026

Overview

Snips controller is an open-source printed circuit board by thePunderWoman, from the thePunderWoman/SnipsControllers repository on GitHub, published under the GPL-2.0 licence. It is a 4-layer board of 30 × 70 mm with 94 parts on 56 nets, routed with 945 tracks and 127 vias.

It belongs with the ESP32 boards of this library.

README

PCB/v2.x/snips/README.md

Snips Controller PCB (V2)

A wireless handheld controller for R2-D2 droid operation, designed for use at public events and conventions. Communicates with the droid over Zigbee, in a packetized state-report architecture.

The electrical design is in Stackup KDL, using the pinned Stackup library plus a local thumbstick model. The existing KiCad PCB is linked through snips_controller.stackup_sch; sync it with the Stackup KiCad plugin. Run stackup check PCB/v2.x/snips/stackup/board.kdl from the repository root before syncing.

KiCad render of the front of the Snips V2 board, with the thumbstick, macro buttons, ESP32 module and USB-C port KiCad render of the back of the Snips V2 board, with the power circuits, the carrier pads and the battery connector

A STEP model of the assembled board is in step/v2.0/snips_controller.step.

V2 board

70 x 30 mm, 4 layers: F.Cu signals, In1 solid 3V3, In2 solid GND, B.Cu signals. 1.6 mm thick. Routed, not yet fabricated.

  • Module: an ESP32-S3-MINI-1U-N8 on the top, between the macro buttons and USB, turned 270 degrees. The 19.2 mm WROOM-1U does not fit the 17.5 mm there. The turn puts the pinless GND edge on the side and the signal pins toward the stick, the OLED and the carrier; pins are assigned by position, as GPIO_table.md explains. USB runs about 15 mm as a result, which is well within full-speed limits. Bluetooth and ESP-NOW work with no other radio.
  • XBee: optional. U_XBEE1 is a row of 12 hand-solder pads on the bottom for a 22 x 17 mm castellated daughter board, which carries the XBee 3 Micro, its decoupling, the RESET pull-up and RC, and the ATTN/BOOTMODE pull-up. The link is UART with flow control, not SPI. RTS and DTR also allow XBee serial firmware recovery through the ESP32. Leave the area inside the pads free of parts; vias there stay tented. See GPIO_table.md.
  • Reflow: the bottom side goes first and the top side last, because Espressif requires a single reflow for the module (datasheet section 12.3). The XBee reflows on its own carrier and never goes upside down, which is what stopped the two modules from sharing this board before.
  • Radio link: Amidala's droids use XBee Zigbee 3.0, so a Zigbee controller needs the carrier. The firmware still has to move from the XBee's SPI interface to UART, and needs a V2 pin map.
  • Programming: USB, through the module's native USB. To force download mode, hold SW_BOOT1 while pressing the power button. RXD0's pull-up holds the latch with no firmware, so a blank board flashes after a 1 s press, with no button held during the upload.
  • No reset button: the power button turns the board on, and only firmware turns it off. PWR_HOLD is on RXD0, whose pull-up holds the latch through any reset or USB upload, so a blank or hung board stays on until USB and the battery are removed. Keep a watchdog running to recover from a hang. C_LATCH_FB1 gives the latch hysteresis, so that pull-up cannot restart the board at power-off, and R_PWR_EN_PD1 is 22 kΩ so a rising gate cannot couple through it and lift EN.
  • Buttons: all 13 connect directly to module GPIOs. See GPIO_table.md.
  • Power blocks: the buck, charger and power latch follow V1's relative placement, all on the bottom. Two charger GND vias were moved 0.1-0.75 mm in V1's layout to clear earlier button positions. C_BUCK_IN1 turned 90 degrees with its VSYS pad straight above the VIN pin. BUCK_FB runs around the input cap and hops to F.Cu past the inductor, so both planes shield it; keep it out from under L_BUCK1. The latch is too long to fit whole, so it is split at PWR_BTN_TRIGGER: the switch and PWR_LATCH_G node sit under the stick, turned 270 degrees, and the inverter sits beside the stick's lower pins. See diagrams/ for why they are arranged this way.
  • OLED cable: U_OLED1's opening faces USB, and a Qwiic plug is 7.0 mm wide with its protrusions, so keep top-side parts out of x 0.9-7.9 mm from the mouth at y 52.7 mm down to the MH3 post. Check that a real cable goes in before committing the shell.
  • BOM: the Value column carries each part's full details, including a capacitor's rated voltage, because fabs read it and the BOM has no voltage column. Keep rail names out of designators: PCBWay queried the V1.2 caps named C_3V3_* as 3.3 V parts, so V2 uses C_MCU_*.
  • Hall sensor: U_HALL1 is on the bottom at (6.5, 4.75) mm, rotated 180 degrees, forward and left of the stick, 7.8 mm from its nearest pot pin in plan view against about 15.4 mm on V1. A 2 x 2 mm N52 magnet swings up to sit directly under the package centre. Keep at least 1.8 mm from the top of the package to the magnet at full press, or the output clips at the sensor's ±44 mT range. The stick reading against trigger travel still needs a bench test.
  • Mounting: four Ø2.2 mm unplated holes, MH1-4, at (2.5, 2.6), (27.4, 2.8), (3, 62.5) and (27, 67) from the top-left corner, for M2 self-tapping screws into shell posts. MH3 sits above the power button, which holds the true corner, so a Ø4 post clears C_DBNC1 by only about 0.15 mm. The carrier has a long shallow chamfer at that corner, which also clears a Ø4 post on the bottom.
  • Battery: BT1 is a 2-pin JST PH, the common connector on pouch cells this size: pin 1 VBAT, pin 2 GND. R_TS1 ties the charger's TS pin to a fixed 10 kΩ, so there is no pack temperature monitoring. Check the polarity of the cell's lead before plugging it in.
  • USB and status LED: J_USB1 sits 2 mm right of centre, with its CC resistors and TVS moved with it. D_RGB1 sits between SW_PWR1 and J_USB1, turned 90 degrees.
  • Through-board parts: the Alps pegs, stick pins, USB stakes and BT1 pins all reach the other side.

GPIO Assignment

See GPIO_table.md for every module pin.

Hardware Overview

ComponentPartNotesLayout diagram
MCU and radioEspressif ESP32-S3-MINI-1U-N8Wi-Fi, Bluetooth LE and ESP-NOW, 8 MB flash, 15.4 x 15.4 x 2.4 mm, external antenna—
XBee (optional)Digi XB3-24Z8UM on a castellated carrierZigbee 3.0, +19 dBm, U.FL. Hand-soldered to the underside—
DisplaySSD1306 1.3" OLED128x64, monochrome, I2C—
Hall triggerDRV5055A2QDBZR (SOT-23)Ratiometric linear hall effect, 3.3V. On the bottom of the board under the trigger magnet; senses the field perpendicular to the board. Trigger calibration accepts either magnet polarity—
ThumbstickGuliKit hall effect moduleNative 3.3V, analog X/Y + click—
Macro and boot buttonsAlps SKRPABE0104.2 x 3.2 x 2.5 mm SMD tact switch, 1.57 N, 0.2 mm travel, 100,000 cycles. Footprint checked against the Alps land drawing—
RGB LEDSK6812MINI-HSStatus indicator; specified supply begins at 3.7 V, but board supplies 3.3 V—
Chargerbq25185USB/DC input, power path, 4.2V/500mAdiagram
BuckTLV625693.3V output, 2Adiagram
BatterySingle-cell pouch, 2-pin JST PHCell not chosen yet. Set R_ISET1 for it; 604 Ω charges at about 500 mA—
Power switchAO3401A + AO3400ASoft latch, hybrid hardware+firmwarediagram

Layout Diagrams

Suggested top-copper floorplans for the three sheets with real layout stakes — a switching regulator, a linear charger with a thermal pad, and the soft latch that switches the buck's enable. Each is checked against the actual component datasheet, not just the schematic. See diagrams/README.md for the full list and how the files are organized.

Passives & Support Components

Decoupling Caps

ComponentValueNotes
DRV5055 VCC100nF ceramic
GuliKit VCC100nF ceramic
SK6812 VCC100nF ceramicClose to supply pin
ICM-42670-P100nF + 2.2µF on VDD, 10nF on VDDIOClose to their pins
OLED connector1µF + 100nF ceramic
bq25185 VIN10µF + 100nF ceramic
bq25185 SYS10µF + 100nF ceramic
bq25185 BAT10µF ceramic
TLV62569 VIN10µF ceramic
TLV62569 VOUT22µF ceramicAs on V1. TI specifies 10-47 µF
ESP32-S3-MINI-1U 3V310µF + 100nF + 39pF ceramicAs on V1
ESP32-S3-MINI-1U EN1µF ceramicWith R_EN_PU1, per Espressif
XBee VCC10µF + 1µF + 47pF ceramicOn the carrier, per Digi 90001543 p.52

Resistors

SignalValueNotes
bq25185 STAT1/STAT210kΩOpen drain, pulled up to 3V3
bq25185 TS/MR10kΩ to GNDRequired with no thermistor: floating means no charging
I2C SDA/SCL4.7kΩSo the IMU works with no OLED attached
Boot button10kΩ to 3V3R_BOOT_PU1
ESP32 EN10kΩ to 3V3R_EN_PU1
USB D+/D-27Ω seriesR_USB_DP1 and R_USB_DM1, as on V1
Trigger output1kΩ + 100nFR_TRIG1 and C_TRIG1, about 1.6 kHz. The DRV5055 must not see a capacitor without a resistor
SK6812 DIN470ΩR_RGB1

Buttons

No external parts. Every button wires to GND and a module GPIO, using the internal pull-ups; see GPIO_table.md.


Communication Architecture

The droids use XBee Zigbee 3.0, so the controller joins that network through the XBee on the carrier, over UART in API mode. Each droid has its own coordinator and PAN ID, and all coordinators share one AES key. Without the carrier the ESP32 can use Bluetooth or ESP-NOW.


Bringup Sequence

Recommended bringup order:

  1. Current-limited supply on VSYS, with no carrier fitted: press power for 1 s, then check 3V3 and idle current.
  2. Flash over USB with no button held, with SW_BOOT1 held at power-on if the chip does not enumerate. Confirm PWR_HOLD reads high.
  3. Time the shortest press that stays on, at 3.3 V and 4.2 V. The simulation gives under 0.4 s at worst, so a 1 s press is well clear. Run a USB upload with no button held, then confirm a watchdog reset reboots the board. Power off at least 20 times, on USB and on battery, and scope PWR_EN and PWR_LATCH_G: the board must stay off every time, since the simulation's margin has not been measured.
  4. OLED and ICM-42670-P on I2C.
  5. SK6812 RGB LED.
  6. Buttons, using the pin table.
  7. Charge status on STAT1 and STAT2, and VSYS sense.
  8. DRV5055 and thumbstick on the ADC. Sweep the stick and the trigger together to measure how much each moves the other.
  9. Solder the carrier on. Check UART traffic, CTS, SLEEP_RQ and ON/SLEEP, then XBee reset, then join a droid's network.

Power Architecture

  • Battery → bq25185 (charger and power path, 4.2V, 500mA) → TLV62569 (3.3V buck) → 3V3 for everything, including the carrier.
  • Power switch: soft latch (AO3401A PFET + AO3400A NFET) controls the TLV62569 EN pin. USB does not hold it on.
  • Boot: press the power button for about a second → latch enables 3V3 → RXD0's pull-up holds the latch through D_OR2 as soon as the chip has power → firmware drives RXD0 high.
  • Shutdown: firmware sees a hold on IO21 → graceful shutdown → RXD0 low → the gate decays through R_LATCH_G1 → C_LATCH_FB1 kicks it clear of threshold as PWR_EN falls → power cut after about 0.8-2.6 s, counted from release if the button is still held.
  • bq25185 STAT1 and STAT2 go to IO15 and IO14 (open drain, 10kΩ pull-ups to 3V3).
  • Battery voltage: VSYS through R_VSYS1/R_VSYS2 to IO7, reading VSYS/3.
  • Below about 3.3 V on the battery the buck passes it through, and the DRV5055's minimum is 3.0 V, so the firmware cutoff should sit above that.

Power Management

Firmware implements tiered power saving:

  • Active: full brightness OLED, normal polling rate
  • Idle (short timeout): OLED dimmed via SSD1306 contrast command
  • Idle (long timeout): OLED off
  • Sleep: MCU sleep, wake on any button press via GPIO interrupt

Parts

94
QtyValueFootprintReferences
7100nF 16V X7R ±10% | CL05B104KO5NNNC | Samsung | 0402Capacitor_SMD:C_0402_1005MetricC_DBNC1, C_HALL1, C_OLED_2, C_RGB1, C_STICK1, C_SYS_2, C_VIN_2
7Tact switch 1.6N 100k cycles | SKRPABE010 | Alps | SMD 4.2x3.2x2.5mm | top actuatedSW_Alps_SKRPSW_BOOT1, SW_MACRO1, SW_MACRO2, SW_MACRO3, SW_MACRO4, SW_MACRO5, SW_MACRO6
6Fiducial_1mm_Mask2mmFiducial:Fiducial_1mm_Mask2mmFID1, FID2, FID3, FID4, FID5, FID6
6Side-push tact switch 1.6N 100k cycles | SKRTLAE010 | Alps | SMD 4.5x3.4x3.3mm | right-angleButton_Switch_SMD:SW_Push_1P1T-MP_NO_Horizontal_Alps_SKRTLAE010SW_PWR1, SW_THR_DN1, SW_THR_UP1, SW_TRIG_DIG1, SW_VOL_DN1, SW_VOL_UP1
4100nF 16V X7R ±10% | CL05B104KO5NNNC | Samsung | 0402C_0402_1005MetricC_IMU_1, C_MCU_2, C_TRIG1, C_VSYS1
410kΩ ±1% 62.5mW | 0402WGF1002TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_BOOT_PU1, R_STAT1, R_STAT2, R_TS1
410µF 25V X5R ±10% | CL21A106KAYNNNE | Samsung | 0805Capacitor_SMD:C_0805_2012MetricC_BAT1, C_BUCK_IN1, C_SYS_1, C_VIN_1
4MountingHole_2.2mm_M2_ISO14580MountingHole:MountingHole_2.2mm_M2_ISO14580MH1, MH2, MH3, MH4
3100kΩ ±1% 62.5mW | 0402WGF1003TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_BTN_PU1, R_GATE1, R_VSYS2
31µF 50V X5R ±10% | CL10A105KB8NNNC | Samsung | 0603C_0603_1608MetricC_EN1, C_LATCH_FB1, C_OLED_1
21N4148W switching diode 75V 150mA | 1N4148W | ST | SOD-123Diode_SMD:D_SOD-123D_OR1, D_OR2
2220kΩ ±1% 62.5mW | 0402WGF2203TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_INV_BASE1, R_INV_PU1
227Ω ±1% 62.5mW | RC0402FR-0727RL | Yageo | 0402R_0402_1005MetricR_USB_DM1, R_USB_DP1
24.7kΩ ±1% 62.5mW | 0402WGF4701TCE | UNI-ROYAL | 0402R_0402_1005MetricR_I2C_SCL1, R_I2C_SDA1
25.1kΩ ±1% 62.5mW | 0402WGF5101TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_CC1, R_CC2
2LOGOLOGOLOGO1, LOGO2
11-cell Li-ion charger 1A | BQ25185DLHR | TI | WSON-10BQ25185DLHR:IC_BQ25185DLHRU_CHG1
110kΩ ±1% 62.5mW | 0402WGF1002TCE | UNI-ROYAL | 0402R_0402_1005MetricR_EN_PU1
110nF 50V X7R ±10% | CL05B103KB5NNNC | Samsung | 0402C_0402_1005MetricC_IMU_3
110µF 10V X5R ±10% | CL10A106KP8NNNC | Samsung | 0603C_0603_1608MetricC_MCU_1
118kΩ ±1% 62.5mW | RC0402FR-0718KL | Yageo | 0402Resistor_SMD:R_0402_1005MetricR_VSET1
11MΩ ±1% 62.5mW | 0402WGF1004TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_LATCH_G1
11kΩ ±1% 62.5mW | 0402WGF1001TCE | UNI-ROYAL | 0402R_0402_1005MetricR_TRIG1
11µF 6.3V X5R ±10% | CL05A105KQ5NNNC | Samsung | 0402Capacitor_SMD:C_0402_1005MetricC_LATCH_G1
12.2µF 10V X7R ±10% | CL10B225KP8NNNC | Samsung | 0603C_0603_1608MetricC_IMU_2
12.2µH ±20% 2.9A 44mΩ power inductor | SRN4018-2R2M | Bourns | SMD 4x4mmInductor_SMD:L_Bourns-SRN4018L_BUCK1
1200kΩ ±1% 62.5mW | 0402WGF2003TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_VSYS1
122kΩ ±1% 62.5mW | 0402WGF2202TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_PWR_EN_PD1
122µF 25V X5R ±20% | CL21A226MAQNNNE | Samsung | 0805Capacitor_SMD:C_0805_2012MetricC_BUCK_OUT1
1255kΩ ±1% 62.5mW | RC0402FR-07255KL | Yageo | 0402Resistor_SMD:R_0402_1005MetricR_FB1
139pF 50V NP0 ±5% | CC0402JRNPO9BN390 | Yageo | 0402C_0402_1005MetricC_MCU_3
1470Ω ±1% 62.5mW | 0402WGF4700TCE | UNI-ROYAL | 0402Resistor_SMD:R_0402_1005MetricR_RGB1
156.2kΩ ±1% 62.5mW | RC0402FR-0756K2L | Yageo | 0402Resistor_SMD:R_0402_1005MetricR_FB2
16-axis IMU | ICM-42670-P | TDK InvenSense | LGA-14 2.5x3mmLGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4yU_IMU1
1604Ω ±1% 62.5mW | AC0402FR-07604RL | Yageo | 0402Resistor_SMD:R_0402_1005MetricR_ISET1
1Addressable RGB LED | SK6812MINI-HS | OPSCO | 3.5x3.5mm SMD | top-mount lens upSK6812MINI-HS-012D_RGB1
1Adjustable buck converter 2A | TLV62569DBVR | TI | SOT-23-5Package_TO_SOT_SMD:SOT-23-5U_BUCK1
1Hall thumbstick | GuliKit_Thumbstick | GuliKit | Through-hole | DNP - hand-fitted - do not assembleSnipsControllers_Custom:GuliKit_HallStickJ_STICK1
1JST PH 2-pin 2mm | S2B-PH-K(LF)(SN) | JST | Through-hole | RIGHT-ANGLE HORIZONTAL not verticalConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalBT1
1JST SH 4-pin 1mm Qwiic | SM04B-SRSS-TB(LF)(SN) | JST | SMD | side entry right-angleConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalU_OLED1
1LOGOR2Builders:R2BuildersLOGO3
1Linear hall sensor A2 ±42mT | DRV5055A2QDBZR | TI | SOT-23SOT-23U_HALL1
1N-channel MOSFET 30V 5.7A | AO3400A | AOS | SOT-23Package_TO_SOT_SMD:SOT-23Q_LATCH1
1NPN transistor 40V 200mA hFE 100-300 | MMBT3904(RANGE:100-300) | JCET | SOT-23Package_TO_SOT_SMD:SOT-23Q_INV1
1P-channel MOSFET 30V 4A | AO3401A | AOS | SOT-23Package_TO_SOT_SMD:SOT-23Q_PWR1
1Schottky diode 30V 200mA | BAT54W-7-F | Diodes Inc | SOT-323Package_TO_SOT_SMD:SOT-323_SC-70D_INV_ISO1
1TVS diode 5V bidirectional | TPPESD5V0S1BA | TECH PUBLIC | SOD-323Diode_SMD:D_SOD-323D_VBUS_TVS1
1USB-C receptacle 16-pin | TYPE-C-31-M-12 | Hroparts Elec | SMD with through-hole shell tabs | right-angleConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J_USB1
1Wi-Fi BLE module 8MB flash no PSRAM | ESP32-S3-MINI-1U-N8 | Espressif | SMD module 15.4x15.4mm | N8 variant with external antenna connectorESP32-S3-MINI-1UU_MCU1
1XBee carrier pads no part | Snips XBee carrier | Snips Controllers | Copper pads only | DNP - hand-soldered daughter board - do not assembleXBee_Carrier_CastellatedU_XBEE1

More from thePunderWoman/SnipsControllers

2
  • 4 layers35 × 99.9 mmSnips controller, the printed circuit board in 3D

    Snips controller

    thePunderWoman/SnipsControllers

    The controllers built to work with Amidala

    95 parts3GPL-2.0
  • 2 layers22 × 17 mmXbee carrier, the printed circuit board in 3D

    Xbee carrier

    thePunderWoman/SnipsControllers

    The controllers built to work with Amidala

    9 parts3GPL-2.0

Similar boards

  • 4 layers90 × 124.3 mmDuck, the printed circuit board in 3D

    Duck

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    94 parts915
  • 4 layers39 × 39 mmOneInchEye, the printed circuit board in 3D

    OneInchEye

    will127534/OneInchEye

    A One Inch CMOS sensor (IMX283) camera board designed for Raspberry Pi

    94 parts355MIT
  • 4 layers56 × 64 mmIob characterization, the printed circuit board in 3D

    Iob characterization

    azonenberg/starshipraider

    Open hardware test equipment

    94 parts193BSD-3-Clause
  • 4 layers76.5 × 110 mmGreta, the printed circuit board in 3D

    Greta

    endofexclusive/greta

    GRETA expansion board for the Amiga 500 computer with Fast RAM, microSD mass storage and Ethernet controller, powered by FPGA technology.

    94 parts107
  • 4 layers81.7 × 31.8 mmEsp32c3 fpga, the printed circuit board in 3D

    Esp32c3 fpga

    ICE-V-Wireless/ICE-V-Wireless

    Combined ESP32C3 and iCE40 FPGA board

    94 parts82MIT
  • 4 layers43.6 × 32.9 mmWii reg, the printed circuit board in 3D

    Wii reg

    Gmanmodz/RVL-Power-Management-System

    A complete battery management and custom regulator system for a Wii portable

    94 parts77
  • 4 layers190.8 × 12.1 mmWARBL2 5.1, the printed circuit board in 3D

    WARBL2 5.1

    amowry/WARBL2

    WARBL2 Code and design files

    94 parts33GPL-3.0
  • 4 layersBadge kicad, the printed circuit board in 3D

    Badge kicad

    netik/dc25_spqr_badge

    KiCad files and all component files to manufacture the IDES OF DEF CON Badge, an Unofficial Electronic Badge.

    94 parts11Apache-2.0

Questions

How big is the Snips controller PCB?

It measures 30 × 70 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Snips controller use?

94 parts. 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.

Where can I download the Snips controller KiCad files?

From the thePunderWoman/SnipsControllers repository on GitHub, at the commit this page was made from: the board is PCB/v2.x/snips/snips_controller.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Snips controller design in my own project?

Its repository publishes it under the GPL-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).