Skip to the content
PCBKitNew board
2 layers100 × 100 mmShutterClock, the printed circuit board in 3D

ShutterClock

0kam/ShutterClock

Low-power BLE interval timer for fixed-point Nikon DSLR cameras (XIAO nRF52840, Zephyr, Web Bluetooth)

Size
100 × 100 mm
Copper layers
2
Thickness
1.6 mm
Parts
61
Nets
41
Pads
170
Tracks, vias
221, 8
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
6 Oct 2026
Updated
21 Oct 2026

Overview

ShutterClock is an open-source printed circuit board by 0kam, from the 0kam/ShutterClock repository on GitHub. It is a 2-layer board of 100 × 100 mm with 61 parts on 41 nets, routed with 221 tracks and 8 vias.

It is built around the NJW4181U3-33B-TE2, 2SK4017(Q) and P4KE15A, with the CR2032 among its other parts. Its parts include 21 resistors, 7 capacitors, 6 transistors, 5 ICs and 5 diodes. It belongs with the radio and wireless boards and the nRF52 and nRF5x boards of this library.

Main components

4

README

pcb/README.md

ShutterClock PCB

  • v1.2 (2026-10-21, not ordered): v1.1 + battery-backed RTC. Board grown to 100 x 100 mm (mounting holes 93 x 93 mm); a 12 mm strip at the bottom carries U5 Akizuki AE-RX8900 (RX8900CE DTCXO RTC, I2C 0x32 on the XIAO D4 = SDA / D5 = SCL, VDD from 3V3_SYS, FOE tied to GND so FOUT stays off), BT1 CH243-2032LF vertical CR2032 holder and D7 1N4148 in series with the cell (the RX8900 has an internal VDD -> VBAT charge path; a CR2032 must not be charged). SW1 and ZD1 moved 1-2 mm right to make room for the I2C / 3V3 tracks along the left edge. DRC 0 errors / 0 unconnected. ShutterClock_v1.2_gerbers.zip, render_top.png, ../docs/assembly/placement_top_v1.2.png. Open before ordering: the holder's centre pin is assumed to be "+" (drawing CH243-0308 does not mark polarity) - check with a cell and a meter on the real part; if the outer pins are "+", swap BT1 pad nets in generate_board.py.

  • v1.1 (2026-10-21, not ordered): the three v1.0 errata fixed (C1 polarity nets, U2 hole pattern 40 x 17.5 mm, F1 clip pins along the fuse axis at 7.0 mm; ZD1 moved 3.5 mm down to make room). DRC 0 errors / 0 unconnected (40 silk warnings). Gerbers ShutterClock_v1.1_gerbers.zip, renders render_top.png / render_bottom.png, placement map ../docs/assembly/placement_top_v1.1.png. Same outline, mounting holes and connector positions as v1.0, so the v1.0 bench results apply.

  • v1.0 (ordered 2026-10-08, JLCPCB W2026100808086019 / Y14-13437881A, 5 pcs; board #1 assembled and bench-tested 2026-10-20): ShutterClock_v1.0_gerbers.zip, render_top_v1.0.png / render_bottom_v1.0.png. Build the remaining v1.0 boards with the workarounds in ../docs/02_assembly.md.

  • Board: 100 x 88 mm, 2-layer. Bottom layer is a GND pour; most signals on top, the VIN trunk and a few long signals on the bottom.

  • Mounting: 4x M3 (3.2 mm) holes, centres 3.5 mm from each edge (93 x 81 mm spacing).

  • Generated by generate_board.py (+ tracks.py) → ShutterClock.kicad_pcb (KiCad 10). Never hand-edit the .kicad_pcb. Run: /Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3 generate_board.py then kicad-cli pcb drc --severity-error --severity-warning --format json --output drc.json ShutterClock.kicad_pcb and python3 drc_report.py. Current state: DRC 0 errors, 0 unconnected (46 warnings: silkscreen overlaps, library-name notes).

  • Gerbers for JLCPCB (2 layers, 1.6 mm, HASL, defaults): see the version list above. Export: kicad-cli pcb export gerbers --layers F.Cu,B.Cu,F.Paste,B.Paste,F.Silkscreen,B.Silkscreen,F.Mask,B.Mask,Edge_Cuts --subtract-soldermask, kicad-cli pcb export drill --format excellon --excellon-units mm --generate-map --map-format gerberx2, zip the folder. kicad-cli = /Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli.

  • Circuit: spec v0.11 §6 (independent review applied). BOM: ../docs/01_parts.md. Assembly guide: ../docs/02_assembly.md (placement map generated by ../docs/assembly/draw_placement.py).

Errata v1.0 (fixed in v1.1)

  1. C1 silkscreen "+" is on the wrong pad. generate_board.py assigns C1 pad 1 (the square pad, which the KiCad CP_Radial footprint marks "+") to GND and pad 2 to VIN. Electrically the board is fine; mount C1 with its + lead in the right-hand (round) pad. v1.1: swap the nets to {"1": "VIN", "2": "GND"} and re-route the two C1 tracks. C3 is correct (pad 1 = CAM_P).
  2. U2 (MBC2596-01) hole pattern is 40.0 x 17.5 mm (measured on the real module 2026-10-19), not the 38 x 16 mm placeholder (±19.0 / ±8.0). v1.0 boards: the module is connected with bent tinned wire. v1.1: fp_buck() pads at ±20.0 / ±8.75 mm.
  3. F1 fuse clips (FUC-03A): the two pins of one clip lie ALONG the fuse axis, not across it as in fp_fuseclips() (pairs 6.7 mm apart across the axis). v1.0 boards: cut one pin per clip and solder the other into one hole (keep the outer pin on one clip and the inner pin on the other so the clip spacing stays 18 mm), or put an inline fuse holder in the battery + lead and bridge the F1 holes. v1.1: rotate the footprint; pin pitch along the axis still to be measured.

Open items (ordered before bench verification — check these when the boards arrive)

  1. U2 hole positions → wrong, see Errata 2.
  2. Bench-verify the circuit on the breadboard first (spec §6.5): LM2596 + 4700 µF with the D7500 (and D7200), keep-alive follower voltage, shot detection on A1.
  3. Independent layout review (as for SnowGauge v1.2) — not done yet.
  4. XIAO SMD-pad clearance to the KA_EN / CAM_EN tracks is at the 0.2 mm minimum; fine for JLCPCB but do not tighten.

Firmware pin map (single source of truth for the board)

XIAO pinNetFunction
A0 (D0)ADC_NODEBattery voltage: VIN × 100k/(1M+100k) (ungated divider, 100 nF). Reading × 11
A1 (D1)A1_NODECamera current: 0.1 Ω low-side shunt in the camera return (CAM_N), 10 kΩ + 100 nF. 1 A = 0.1 V
D2AF_DRVPC817 U4 (AF / half-press) via 1 kΩ. High = pressed
D7CAM_ENCamera supply: Q3 → Q2 → MBC2596-01 (9.4 V) → 1N5822 → CAM_P. High = on
D8SHUT_DRVPC817 U3 (SHUTTER / full-press) via 1 kΩ. High = pressed
D9BTNTest-shot / BLE button SW1 to GND (enable the internal pull-up)
D10KA_ENKeep-alive path: Q6 → Q5 → 10 Ω → Q7 follower (≈ 7.3–8.5 V) → CAM_P. High = on
3V33V3_SYSFrom U1 (NJW4181U3-33B) through JP1
GNDGND
D4 / D5SDA / SCLv1.2: RX8900 RTC module U5 (i2c1). Unused on v1.0 / v1.1
D3, D6, 5V—unused

Rules: never drive CAM_EN and KA_EN so that the camera is released on the keep-alive path; enter keep-alive only from CAM_EN = on; drop to CAM_EN = on if A1 shows > 50 mA during keep-alive; low-battery cutoff 11.5 V.

Connectors and jumpers

  • J1 (5.08 mm screw terminal, bottom-left): battery + / − (12 V lead-acid / LiFePO4; fuse F1 5 A, Q1 reverse protection, 2x P4KE15A TVS)
  • J2 (5.08 mm screw terminal, bottom-right): camera + / − → Nikon EP-5B cable. The − side is the sense shunt — keep it as the only camera ground.
  • J3 (3.5 mm stereo jack, right edge): tip = SHUTTER, ring = AF, sleeve = common → off-the-shelf 3.5 mm → MC-DC2 / 10-pin release cables (verify the cable's pinout with a meter)
  • JP1 (near the XIAO): shunt fitted normally; remove before connecting USB to the XIAO (same rule as SnowGauge)
  • JP2 (below Q3): shunt fitted = camera supply always on (bypasses Q3)
  • U2: 4-pin module socket positions; set the trimpot to 9.4 V and remove the module's LED before fitting

Silkscreen notes

"REMOVE JP1 BEFORE USB", "U2: SET 9.4V, REMOVE LED", "JP2=ALWAYS ON", battery and camera polarity, diode cathodes marked "K".

Parts

61
QtyValueFootprintReferences
5100kR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR2, R10, R11, R12, R13
41kR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR6, R7, R8, R9
4M3MountingHole_3.2mm_M3H1, H2, H3, H4
30.1uC_Disc_D5.0mm_W2.5mm_P5.00mmC6, C7, C8
3100R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR4, R20, R21
315VD_DO-35_SOD27_P7.62mm_HorizontalZD1, ZD2, ZD3
31MR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR1, R15, R17
21N4148D_DO-35_SOD27_P7.62mm_HorizontalD6, D7
22SK4017TO-251-3_VerticalQ3, Q6
233kR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR16, R18
2P4KE15AD_DO-41_SOD81_P10.16mm_HorizontalD1, D2
10.1R 3WR_Axial_DIN0617_L17.0mm_D6.0mm_P20.32mm_HorizontalR3
1100u/50VCP_Radial_D10.0mm_P5.00mmC1
110R 1WR_Axial_DIN0411_L9.9mm_D3.6mm_P12.70mm_HorizontalR19
110kR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR14
110uC_Disc_D5.0mm_W2.5mm_P5.00mmC2
11N5822D_DO-201AD_P15.24mm_HorizontalD4
12.2uC_Disc_D5.0mm_W2.5mm_P5.00mmC4
12SJ334 CAMTO-220-3_VerticalQ2
12SJ334 KATO-220-3_VerticalQ5
12SJ334 REVTO-220-3_VerticalQ1
12SK4017 KATO-251-3_VerticalQ7
13.5mm RELEASEShutterClock:MJ-8435J3
14700u/16VCP_Radial_D16.0mm_P7.50mmC3
147kR_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR5
15AShutterClock:FUC-03A_x2_5x20F1
19.1VD_DO-35_SOD27_P7.62mm_HorizontalZD4
1AE-RX8900ShutterClock:AE-RX8900U5
1BATTERY 12VTerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_HorizontalJ1
1CAMERA EP-5BTerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_HorizontalJ2
1CR2032ShutterClock:CH243-2032LFBT1
1JP1 3V3PinHeader_1x02_P2.54mm_VerticalJP1
1JP2 ALWAYS ONPinHeader_1x02_P2.54mm_VerticalJP2
1MBC2596-01 9.4VShutterClock:MBC2596-01U2
1NJW4181U3-33BSOT-89-3U1
1PC817 AFDIP-4_W7.62mmU4
1PC817 SHUTTERDIP-4_W7.62mmU3
1TESTSW_PUSH_6mmSW1
1XIAO nRF52840XIAO-nRF52840-DIPA1

Questions

How big is the ShutterClock PCB?

It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.

What parts does the ShutterClock use?

61 parts, built around the NJW4181U3-33B-TE2, 2SK4017(Q), P4KE15A and CR2032. 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 ShutterClock KiCad files?

From the 0kam/ShutterClock repository on GitHub, at the commit this page was made from: the board is pcb/ShutterClock.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the ShutterClock design in my own project?

Its repository states no licence, so its author keeps all rights: ask 0kam before reusing the design.

Similar boards

  • 2 layers110 × 100 mmESP32-S3-IO DEVICE, the printed circuit board in 3D

    ESP32-S3-IO DEVICE

    noritama-lab/esp32io-hw

    ESP32 ベースの I/O ボードのハードウェア設計をまとめたリポジトリです。 / Hardware designs for an ESP32‑based PLC‑compatible I/O board.

    85 parts2
  • 4 layers60 × 75 mmMotorDrive, the printed circuit board in 3D

    MotorDrive

    takushio2525/motorDrive

    127 parts
  • 2 layers99 × 75 mmTHRValveControlModule, the printed circuit board in 3D

    THRValveControlModule

    tokai-student-rocket-project/Gen6-GSE-Elec

    第6世代自動GSE電装系

    59 parts2MIT
  • 2 layers99 × 75 mmTHRValveControlModule, the printed circuit board in 3D

    THRValveControlModule

    tokai-student-rocket-project/H-62-Avionics

    H-62搭載計器 すばる1.3 | 2025年度 夏季 能代 NOGO

    54 parts
  • 2 layers68.6 × 53.3 mmShoei, the printed circuit board in 3D

    Shoei

    CALIL/openbookcamera

    高速な書影撮影システム「オープンブックカメラ」

    28 parts23MIT
  • 2 layers100 × 100 mmPico router backup, the printed circuit board in 3D

    Pico router backup

    Dudestin/tinyEtherDeveloper

    Inexpensive FPGA board-based Ethernet evaluation board project. Consists mostly of DIP components and uses Tang PriMER. It can be built for about $50.

    98 parts2
  • 2 layers60 × 45 mmDRC SLVD2025, the printed circuit board in 3D

    DRC SLVD2025

    hosh0344/CatchRobo2025_Circuits

    66 parts2
  • 2 layers56 × 65 mmOttoPi10-RPi3A HAT, the printed circuit board in 3D

    OttoPi10-RPi3A HAT

    ytani01/OttoPi

    Otto like Robot for Raspberry Pi Zero

    51 parts2