Skip to the content
4 layers35 × 99.9 mmSnips controller, the printed circuit board in 3D

The controllers built to work with Amidala

Size
35 × 99.9 mm
Copper layers
4
Thickness
1.6 mm
Parts
95
Nets
57
Pads
348
Tracks, vias
1,121, 130
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 35 × 99.9 mm with 95 parts on 57 nets, routed with 1,121 tracks and 130 vias.

It is built around the ESP32-S3-WROOM-1-N8, TLV62569DBVR-TP and SKRTLAE010, with the 1N4148W, AO3400A and AO3401A among its other parts. It belongs with the ESP32 boards of this library.

Main components

9

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

95
QtyValueFootprintReferences
11100nFCapacitor_SMD:C_0402_1005MetricC_3V3_2, C_DBNC1, C_HALL1, C_LATCH_G1, C_OLED_2, C_RGB1, C_STICK1, C_SYS_2, C_VIN_2, C_XBEE_RC1, C_XBEE_VCC1
710kΩResistor_SMD:R_0402_1005MetricR_BOOT_PU1, R_EN_PU1, R_STAT1, R_STAT2, R_TS1, R_XBEE_ATTN_PU1, R_XBEE_RST1
7SKRTLAE010Button_Switch_SMD:SW_Push_1P1T-MP_NO_Horizontal_Alps_SKRTLAE010SW_PWR1, SW_THR_DN1, SW_THR_UP1, SW_TRIG_DIG1, SW_TRIG_DIG2, SW_VOL_DN1, SW_VOL_UP1
6100kΩResistor_SMD:R_0402_1005MetricR_BTN_PU1, R_GATE1, R_INV_BASE1, R_INV_PU1, R_PWR_EN_PD1, R_VSYS2
66x6x5mm SMD TactileButton_Switch_SMD:SW_Push_1TS009xxxx-xxxx-xxxx_6x6x5mmSW_MACRO1, SW_MACRO2, SW_MACRO3, SW_MACRO4, SW_MACRO5, SW_MACRO6
510µFCapacitor_SMD:C_0805_2012MetricC_BAT1, C_BUCK_IN1, C_OLED_1, C_SYS_1, C_VIN_1
5Fiducial_1mm_Mask2mmFiducial:Fiducial_1mm_Mask2mmFID1, FID2, FID3, FID4, FID5
4MountingHole_2.7mm_M2.5MountingHole:MountingHole_2.7mm_M2.5MH1, MH2, MH3, MH4
210µFCapacitor_SMD:C_0603_1608MetricC_3V3_1, C_XBEE_VCC4
21N4148WDiode_SMD:D_SOD-123D_OR1, D_OR2
227ΩResistor_SMD:R_0402_1005MetricR_USB_DM1, R_USB_DP1
25.1kΩResistor_SMD:R_0402_1005MetricR_CC1, R_CC2
2LOGOLOGOLOGO1, LOGO2
1100nFC_0402_1005MetricC_IMU_1
1100ΩResistor_SMD:R_0402_1005MetricR_XBEE_RC1
110nFC_0402_1005MetricC_IMU_3
118kΩResistor_SMD:R_0402_1005MetricR_VSET1
11MΩResistor_SMD:R_0402_1005MetricR_LATCH_G1
11µFCapacitor_SMD:C_0603_1608MetricC_XBEE_VCC2
12.2µFC_0603_1608MetricC_IMU_2
12.2µHInductor_SMD:L_Bourns-SRN4018L_BUCK1
1200kΩResistor_SMD:R_0402_1005MetricR_VSYS1
122µFCapacitor_SMD:C_0805_2012MetricC_BUCK_OUT1
1255kΩResistor_SMD:R_0402_1005MetricR_FB1
139pFCapacitor_SMD:C_0402_1005MetricC_3V3_3
1470ΩResistor_SMD:R_0402_1005MetricR_RGB1
147pFCapacitor_SMD:C_0402_1005MetricC_XBEE_VCC3
156.2kΩResistor_SMD:R_0402_1005MetricR_FB2
1604ΩResistor_SMD:R_0402_1005MetricR_ISET1
1AO3400APackage_TO_SOT_SMD:SOT-23Q_LATCH1
1AO3401APackage_TO_SOT_SMD:SOT-23Q_PWR1
1BAT54W-7-FPackage_TO_SOT_SMD:SOT-323_SC-70D_INV_ISO1
1BQ25185DLHRBQ25185DLHR:IC_BQ25185DLHRU_CHG1
1DRV5055A2QDBZRSOT-23U_HALL1
1ESP32-S3-WROOM-1-N8Espressif:ESP32-S3-WROOM-1U_MCU1
1GuliKit_ThumbstickSnipsControllers_Custom:GuliKit_HallStickJ_STICK1
1ICM-42670-PLGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4yU_IMU1
1LOGOR2Builders:R2BuildersLOGO3
1MMBT3904(RANGE:100-300)Package_TO_SOT_SMD:SOT-23Q_INV1
1PH 2-pin battery RIGHT-ANGLE HORIZONTALConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalBT1
1Panasonic_EVQP2Button_Switch_SMD:SW_SPST_EVQP2_ShortPushTravel_H2.1mmSW_BOOT1
1Qwiic connectorConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalU_OLED1
1SK6812MINI-HS-012SK6812MINI-HS-012D_RGB1
1TLV62569DBVRPackage_TO_SOT_SMD:SOT-23-5U_BUCK1
1TPPESD5V0S1BADiode_SMD:D_SOD-323D_VBUS_TVS1
1USB-CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J_USB1
1XBee3Xbee3:XB324Z8UTJU_XBEE1

More from thePunderWoman/SnipsControllers

2
  • 4 layers30 × 70 mmSnips controller, the printed circuit board in 3D

    Snips controller

    thePunderWoman/SnipsControllers

    The controllers built to work with Amidala

    94 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

  • 6 layers90.1 × 135 mmHandheld, the printed circuit board in 3D

    Handheld

    gamebub/gamebub-pcb

    PCB design files for the Game Bub project

    386 parts31CERN-OHL-S-2.0
  • 2 layers55.6 × 57.2 mmYkb skadi pcb, the printed circuit board in 3D

    Ykb skadi pcb

    YarmanKB/ykb-skadi-pcb

    KiCad project for YKB Skadi boards

    74 parts7Apache-2.0
  • 4 layers110 × 80 mmEsp32p4 extreme, the printed circuit board in 3D

    Esp32p4 extreme

    Andreuxxx1977/esp32-p4

    An open-hardware, actively cooled ESP32-P4 board for heavy multimedia work: a 2-lane MIPI camera, a 2-lane MIPI display, USB 2.0 High-Speed, 10/100 Ethernet, UHS-I microSD, 32 MB flash and 32 MB PSRAM.

    234 parts1CERN-OHL-P-2.0
  • 4 layers100 × 70 mmSEM, the printed circuit board in 3D

    SEM

    Serhio4522/SEM_hitachi-

    Digitization of a Hitachi scanning electron microscope (SEM) — hardware design, FPGA firmware, and analog frontend schematics.

    288 parts1
  • 4 layers70 × 67 mmPairing voice pcb v11 70x67, the printed circuit board in 3D

    Pairing voice pcb v11 70x67

    windmoondreamer/pairing-voice-cube

    아이가 목소리를 녹음하고, 부모가 버튼을 눌러 재생하는 장치의 회로기판 프로젝트. 80mm 큐브 케이스 · 최대 45초 녹음 · 내장 플래시 · 배터리 구동.

    48 parts
  • 4 layers35.3 × 46.2 mmProjectKicad, the printed circuit board in 3D

    ProjectKicad

    SatriyoJati/fishfeeder-schematics

    Schematic and PCB design of FishFeeder

    85 parts
  • 2 layers114.2 × 36.8 mmAirbox, the printed circuit board in 3D

    Airbox

    Alacrity-Education/AirBoxV2

    The AirBox V2 Station is an open source air quality monitoring station based on the Sensirion SEN66 sensor. It measures particulate matter, CO2, VOC and NOx, runs on a solar charged lithium cell, and reports over Wi-Fi.

    68 parts6GPL-3.0

Questions

How big is the Snips controller PCB?

It measures 35 × 99.9 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Snips controller use?

95 parts, built around the ESP32-S3-WROOM-1-N8, TLV62569DBVR-TP, SKRTLAE010 and 1N4148W. 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/v1.x/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).