Loads when you scroll to it. Unloads after 5 minutes in the background.
Contents

README

markdown

Ghost Hand

Rev 2 finished November 8, 2026.

The film shows how rev 1 was built: one prompt in Adom Hydrogen, AI Flow and three AI threads (two Claude, one Codex) taking Ghost Hand from idea to a priced, finished board and case; rev 2 below was built the same way. Download the film (captions).

Ghost Hand is a small battery gadget you set on the counter beside a sink with an automatic faucet. It aims infrared light at the faucet's sensor so the water keeps running while you wash your hair, do the dishes or fill a jug, then hands the faucet back when you are done. It learns each faucet's safety timeout by itself and re-arms with the shortest possible blip, so the water does not stop. There are no settings and no power button: it wakes when it is set down and sleeps when it is picked up.

This page shows rev 2: half the footprint of rev 1 so it leaves room on the counter, a 150 mAh battery that needs charging about once a month, small dot lights instead of the logo, a board silkscreen that names every light, and a 5 degree tilt worked out from a real drawing of the faucet. Rev 1's files stay at release 0.1.0 "Rev 1"; see Revisions.

Safety. Ghost Hand is for someone standing at the sink. It never runs unattended: a hard cap of 10 minutes per session, it stops the moment it is picked up or tipped, and it stops when its battery is low. It will not run while it is charging. Nothing beyond what an ordinary manual tap already allows.

Rev 2
Size on the counter 38 x 32 mm, 17 mm tall (rev 1: 54 x 44 mm, 27 mm tall)
Board Adom molecule, 30 x 22 mm, 2 layers on a 3rd party fab's rules, 4 corner machine pins
Brain ATtiny1616, asleep between faucet pulses
IR one 850 nm emitter (8.2 ohm) and one 940 nm emitter driven harder (4.7 ohm), two VEMD2023 photodiodes (750 to 1050 nm)
Aim board tilted 5 degrees nose up (rev 1: 12), from the faucet's real window height
Battery Adafruit 1317, 150 mAh 1S LiPo, USB-C charging at 77 mA in 2.4 h
Battery life 40 days at six 10-minute sessions a day, 74 at three, 170 at one
Lights five WS2812B-2020 under 1.5 mm clear-resin dots: STATUS plus a 25 / 50 / 75 / 100 % charge gauge
License MIT

How it works

An automatic faucet is an active reflective sensor. Behind its dark window an IR LED flashes for 10 to 20 us every 0.3 to 2 s, and a receiver listens only during that flash. When enough light comes back (a hand), the water turns on. Every faucet also has a safety timeout: after 10 to 60 s it shuts off even with a hand there, and ignores that still hand until it goes away.

Ghost Hand hears the faucet's own flash on two photodiodes. A TLV9062 turns the photocurrent into volts (a 150 k transimpedance stage, then gain 11), the ATtiny1616's analog comparator trips, and the event system fires two single-shot timers that light the emitters, all in hardware, under 1 us after the faucet's pulse begins. The echo therefore lands inside the faucet's own listening window and reads as a strong reflection. The CPU only decides when to echo.

Architecture flowchart in Ghost Hand Studio

Wavelengths and faucets covered

Faucet sensors work at 850 to 950 nm. One 850 nm emitter (VSMY2853SL) and one 940 nm emitter (VSMB2948SL) cover that band, and the VEMD2023 photodiodes hear 750 to 1050 nm, so one Ghost Hand works on the common brands:

Faucet Safety timeout Notes
Moen M-Power 8551/8553 30 s range 3 to 12 in, optional metering 10 to 180 s
Sloan EBF-615 30 s range 2 to 7 in; EAF-700 sets its range at power-up
American Standard Selectronic 55 s default (5 to 120 s) 1.5 s run-on after hands leave
Zurn AquaSense Z6950 30 s default (5, 10, 15, 60 s) self-calibrates to the basin
Kohler K-13460 30 s maximum run
TOTO EcoPower 10 or 60 s by model

Faucet and IR beam explainer

Learning the faucet

Just before the faucet's timeout, Ghost Hand goes quiet for a moment (a blip) so the faucet sees the hand leave and come back, and starts a fresh run. The faucet's pulse rate is the window into its state: most pulse faster while they see a user. Ghost Hand listens for 2 s, measures the faucet's idle period and pulse width, echoes until the rate drops (that is the timeout), then re-arms at the timeout minus a 1.5 s margin. Each good blip is 15 % shorter than the last, never below a floor it learns from its first miss. Faucets whose rate never changes get a blip every 8 s. What it learns is kept in EEPROM, keyed to the faucet's idle period.

Firmware state machine and the re-arm blip timeline

Where it sits and how it tilts

Rev 1 tipped its board 12 degrees nose up. That was a guess, and too steep: on the faucet this was built for, the sensor window sits only 40 mm above the counter. Rev 2 starts from a real drawing of the faucet (Moen 8551 spec sheet: column 57 mm deep and 53 mm wide, 166 mm tall, spout reach 155 mm; window centre 40 mm above the counter on pre-2017 units and 56 mm on current ones) and computes the angle.

Side view: the faucet, the counter and Ghost Hand, to scale

With the IR lens 14 mm above the counter, the window is tilt = atan((window height - lens height) / distance) above the horizon: 14.7 degrees from 100 mm away and 4.3 degrees from 350 mm (22.9 and 6.9 for the 56 mm units). The emitters' half-intensity angles are +/-28 degrees (VSMY2853SL, 850 nm) and +/-25 degrees (VSMB2948SL, 940 nm), and the VEMD2023 photodiode's is +/-35 degrees, so the beams are wide enough that the tilt only has to point them roughly. Signal falls as 1/d2, so the far placement is the one that limits: rev 2 tilts 5 degrees, which aims the beam axis at the window from the far end. The best worst-case margin over 100 to 350 mm is at 4.25 degrees for the 40 mm window; 5 degrees is within a fraction of a percent of it and a little better for the 56 mm units (5.4x a hand at 5 degrees, 5.3x flat, 5.0x at rev 1's 12; 5.2x, 5.0x and 5.1x on 56 mm units). The case is built at 5 degrees. Rev 2 has room on its front edge for two emitters, not rev 1's three, so the 940 nm one is driven harder: the 850 nm emitter sits behind 8.2 ohm and the single 940 nm emitter behind 4.7 ohm (about 0.53 A at the start of a 25 us pulse), which nearly matches what two 940 nm emitters at 8.2 ohm would send.

Window to lens Window elevation (40 mm) 940 nm beam at 0 / 5 / 12 degrees tilt Echo margin at 5 degrees Elevation (56 mm units) Margin at 5 degrees (56 mm)
100 mm 14.7 deg 0.79 / 0.9 / 0.99 48.3x 22.9 deg 27.0x
150 mm 9.9 deg 0.9 / 0.97 / 1.0 26.2x 15.7 deg 20.3x
200 mm 7.5 deg 0.94 / 0.99 / 0.98 15.7x 11.9 deg 13.7x
250 mm 6.0 deg 0.96 / 1.0 / 0.96 10.3x 9.6 deg 9.5x
300 mm 5.0 deg 0.97 / 1.0 / 0.95 7.3x 8.0 deg 6.9x
350 mm 4.3 deg 0.98 / 1.0 / 0.94 5.4x 6.9 deg 5.2x

Echo margin is Ghost Hand's echo at the faucet's receiver divided by what a hand at the default 5.5 in range returns (the faucet's own trigger level), with the battery at its low limit and 940 nm only; 2x (6 dB) is comfortable, 1x still works.

Top view: where on the counter Ghost Hand works

The faucet's window looks forward over the basin, so Ghost Hand has to sit in front of it or to the side, turned to face it. Seen from above, the best spot is the front strip in front of the basin (454 mm out, 8 degrees off axis, 3.1x margin). Beside the basin it works from about 325 mm out (315 mm and 43 degrees off axis gives 1.5x). Diagrams: side view SVG, top view SVG, numbers in aim.json.

What is assumed:

  • Faucet receiver acceptance +/-30 deg half sensitivity (cos^n), +/-45 deg shown as the wide case; its axis level and straight out over the basin.
  • Faucet emitter 50 mW/sr, +/-30 deg.
  • Hand reflectance 0.5 over 50 cm2 at the 5.5 in default range sets the faucet's trigger level.
  • Basin 17 x 14 in (432 x 356 mm) oval undermount, back lip 25 mm in front of the column.
  • Ghost Hand IR lens axis 14 mm above the counter, turned by the user to face the window.
  • Two photodiodes and the rev 1 receiver chain and threshold; 850 nm behind 8.2 ohm, one 940 nm behind 4.7 ohm (rev 1: three emitters behind 12 ohm), low battery 3.45 V.

The lights

Rev 2 has no logo light. Five WS2812B-2020 LEDs sit under small round clear-resin light pipes about 1.5 mm across, with opaque walls between them: STATUS (D4) takes over everything rev 1's logo showed, and four dots (D5 to D8) are the 25, 50, 75 and 100 % charge gauge. Each one is named on the board silkscreen and laser engraved on the case. A dot sitting right on its LED looks several times brighter than rev 1's spread-out logo at the same drive, so the firmware runs every light at about half of rev 1's level and caps all five at about 30 mA.

State STATUS dot Charge gauge (25 / 50 / 75 / 100 %)
Session start wakes dim fills to the battery level over 1.5 s (amber at 25 % or less)
Armed soft cyan-white breathing, 4 s off
Echoing the breath 50 % brighter off
Re-arm blip quick flicker off
Done (10 min) slow warm fade off
Low battery red blink first dot red
Charging off filled to the level, the next dot pulses
Full off all four green 5 s, then a dim pulse every 10 s
Unplugged off the level for 2 s

LED state guide: the STATUS dot and the gauge dots

Charging and battery life

John's bar for rev 2: smaller on the counter, and charging about once a month is fine. USB-C 5 V feeds an MCP73831 linear charger set to 77 mA by a 13k program resistor (0.51 C, inside the pack's 1 C limit, and a quarter of rev 1's charger heat): constant current, then constant voltage at 4.2 V, full in about 2.4 h. A TPS7A02 makes the 3.3 V rail on 25 nA of quiescent current.

USB-C charging sequence

The budget is built from the typical current of every part (Adafruit 1317, 150 mAh 1S LiPo, 128 mAh usable, stop at 3.45 V):

Asleep on the counter 4.7 uA (the pack's protection IC is most of it)
During a session 2.93 mA average
One 10-minute session 0.488 mAh
Sessions per charge about 261
Days per charge 40 at six sessions a day, 74 at three, 170 at one
Once a month holds up to 8.2 sessions a day for 30 days
Running time per charge about 44 h
Charge time 2.4 h at 77 mA

At the pack's minimum capacity it is still 38 days at six sessions a day. Self-discharge of the cell (3.0 %/month assumed (0.15 mAh/day), larger than the sleep current) matters more than the sleep current. The faucet's pulse rate and the light pattern are the two big unknowns.

Battery-life numbers

The battery, and which pin is +

The cell is an Adafruit 1317: a PKCell LP402025 pouch, 150 mAh 1S LiPo with its own protection board (S-8261), about 4 x 20 x 26 mm and 4.65 g, with leads ending in a JST PH plug. It is Mouser 485-1317, USD 5.95, 111 in stock when checked on 2026-11-08. It is BT1 in the BOM and lies flat under the board; it plugs into J2 and is not fitted by the fab, so the fab BOM lists it as a do-not-place line.

Polarity: PKCell's drawing for this pack (QA.S.0228) wires red and black into a reversed JST PH-2P plug, which is Adafruit's order: red (+) on JST circuit 1 and black (-) on circuit 2, as on every Adafruit and SparkFun board. J2 pin 1 is VBAT (+) and pin 2 is GND, with + and - printed beside the connector, as in rev 1. Batteries from other sellers are often wired the opposite way, so check any pack with a meter before plugging it in.

The current budget, part by part

Asleep uA
TPS7A0233 IQ 0.025
ATtiny1616 power-down, pin-change wake on PA2 and PB2 0.1
LIS2DW12 LP mode 1, 12.5 Hz, wake-up detection 1.0
MCP73831 reverse discharge (no VBUS) 0.15
VBAT monitor divider, 9.4 Mohm 0.42
WS2812B rail switched off (Q3) 0.0
TLV9062 unpowered (PA4 low) 0.0
LiPo pack protection IC S-8261AAJMD (3 uA assumed) 3.0
Total 4.7
During a session mA
ATtiny1616 standby with OSC20M at 5 MHz for AC + TCB (idle 0.6 mA at 3 V) plus wake-ups 0.8
TLV9062 two channels (538 uA each typ) 1.08
receiver bias divider 3.3 V / 110 k 0.03
IR echo pulses (850 + 940 nm emitters, 25 us at 20 Hz) 0.411
status dot: breathing at 2 % average white, 20 % rail duty 0.6
LIS2DW12 LP 50 Hz (pick-up and tilt watch) 0.004
Total 2.93

Asleep and never used, the 128 mAh would last 3.1 years; in practice the cell's own self-discharge sets the shelf life. Typical datasheet currents at 25 C. The echo's 0.93 A, 25 us pulse comes mostly from a 100 uF capacitor, so the pack only ever sees about 3 mA on average.

Components

Every part of one rev 2 Ghost Hand, with its live price, the break a build reaches and the date it was checked. The table covers the board parts, the battery, the bare PCB, the printed case parts and the case hardware.

Part Qty Refs Value Role Unit cost Line cost (1 / 100 units) Buy
ATTINY1616-MNR
ATTINY1616-MNR
Microchip Technology
1 U1 ATtiny1616-MNR MCU: hardware IR echo (AC0, event system, TCB single-shot) USD 0.900 each at 1; USD 0.873 at 100 units (buy 25+), checked 2026-11-08 USD 0.900 / USD 0.873 Mouser 556-ATTINY1616MNR
MCP73831T-2ACI/OT
MCP73831T-2ACI/OT
Microchip Technology
1 U2 MCP73831T-2ACI/OT LiPo charger, 77 mA (Rprog 13k) USD 0.760 each at 1; USD 0.750 at 100 units (buy 25+), checked 2026-11-08 USD 0.760 / USD 0.750 Mouser 579-MCP73831T-2ACIOT
TPS7A0233PDBVR
TPS7A0233PDBVR
Texas Instruments
1 U3 TPS7A0233PDBVR 3.3 V LDO, 25 nA Iq USD 0.950 each at 1; USD 0.540 at 100 units (buy 100+), checked 2026-11-08 USD 0.950 / USD 0.540 DigiKey 296-TPS7A0233PDBVRCT-ND
LIS2DW12TR
LIS2DW12TR
STMicroelectronics
component page requested
1 U4 LIS2DW12TR accelerometer: set-down, pick-up, tilt USD 1.79 each at 1; USD 1.30 at 100 units (buy 100+), checked 2026-11-08 USD 1.79 / USD 1.30 Mouser 511-LIS2DW12TR
TLV9062IDGKT
TLV9062IDGKT
Texas Instruments
1 U5 TLV9062IDGKT receiver TIA and gain USD 1.76 each at 1; USD 1.05 at 100 units (buy 100+), checked 2026-11-08 USD 1.76 / USD 1.05 Mouser 595-TLV9062IDGKT
VSMY2853SL
VSMY2853SL
Vishay
component page requested
1 D1 VSMY2853SL 850 nm emitter USD 1.01 each at 1; USD 0.532 at 100 units (buy 100+), checked 2026-11-08 USD 1.01 / USD 0.532 Mouser 78-VSMY2853SL
VSMB2948SL
VSMB2948SL
Vishay
component page requested
1 D2 VSMB2948SL 940 nm emitters USD 0.680 each at 1; USD 0.385 at 100 units (buy 100+), checked 2026-11-08 USD 0.680 / USD 0.385 Mouser 78-VSMB2948SL
VEMD2023SLX01
VEMD2023SLX01
Vishay
2 PD1 PD2 VEMD2023SLX01 IR photodiodes, 750 to 1050 nm USD 0.860 each at 1; USD 0.460 at 100 units (buy 100+), checked 2026-11-08 USD 1.72 / USD 0.920 Mouser 78-VEMD2023SLX01
WS2812B-2020
WS2812B-2020
Worldsemi
5 D4 D5 D6 D7 D8 WS2812B-2020 lights: STATUS dot + 4 gauge dots USD 0.045 each at 1; USD 0.045 at 100 units (buy 1+), checked 2026-11-08 USD 0.227 / USD 0.227 Adom stock adom/ws2812b-2020
DMN2041L-7
DMN2041L-7
Diodes Incorporated
2 Q1 Q2 DMN2041L-7 emitter switches USD 0.530 each at 1; USD 0.222 at 100 units (buy 100+), checked 2026-11-08 USD 1.06 / USD 0.444 Mouser 621-DMN2041L-7
DMG2305UX-13
DMG2305UX-13
Diodes Incorporated
1 Q3 DMG2305UX-13 LED rail switch USD 0.410 each at 1; USD 0.169 at 100 units (buy 100+), checked 2026-11-08 USD 0.410 / USD 0.169 Mouser 621-DMG2305UX-13
USB4105-GF-A
USB4105-GF-A
GCT
1 J1 USB4105-GF-A USB-C charge input USD 0.800 each at 1; USD 0.575 at 100 units (buy 100+), checked 2026-11-08 USD 0.800 / USD 0.575 Mouser 640-USB4105-GF-A
S2B-PH-K-S
S2B-PH-K-S
JST
1 J2 S2B-PH-K-S battery connector (pin 1 +) USD 0.120 each at 1; USD 0.084 at 100 units (buy 100+), checked 2026-11-08 USD 0.120 / USD 0.084 Mouser 306-S2BPHKSLFSNPP
SMF5.0A
SMF5.0A
Littelfuse
1 D10 SMF5.0A VBUS surge clamp USD 0.420 each at 1; USD 0.162 at 100 units (buy 100+), checked 2026-11-08 USD 0.420 / USD 0.162 Mouser 821-SMF5.0ARQG

1317
Adafruit
1 BT1 150mAh 1S LiPo 150 mAh LiPo (PCM, JST PH), under the board on J2 USD 5.95 each at 1; USD 5.95 at 100 units (buy 1+), checked 2026-11-08 USD 5.95 / USD 5.95 Mouser 485-1317
base
base
printed
1 PETG base, prints in PETG USD 0.105 per unit at 1; USD 0.105 at 100 units, checked 2026-11-08 (note 1) USD 0.105 / USD 0.105 Quote required
cover
cover
printed
1 PETG cover with the light pipes and engraved names (PETG) USD 0.106 per unit at 1; USD 0.106 at 100 units, checked 2026-11-08 (note 2) USD 0.106 / USD 0.106 Quote required
gasket
gasket
printed
1 TPU 95A perimeter gasket (TPU 95A) USD 0.006 per unit at 1; USD 0.006 at 100 units, checked 2026-11-08 (note 3) USD 0.006 / USD 0.006 Quote required
foot
foot
printed
1 TPU 95A non-slip foot (TPU 95A) USD 0.018 per unit at 1; USD 0.018 at 100 units, checked 2026-11-08 (note 4) USD 0.018 / USD 0.018 Quote required
usb plug
usb plug
printed
1 TPU 95A tethered USB-C seal (TPU 95A) USD 0.019 per unit at 1; USD 0.019 at 100 units, checked 2026-11-08 (note 5) USD 0.019 / USD 0.019 Quote required
ir window
ir window
printed
1 clear SLA resin IR window (clear resin) USD 0.005 per unit at 1; USD 0.005 at 100 units, checked 2026-11-08 (note 6) USD 0.005 / USD 0.005 Quote required
lightpipe status
lightpipe status
printed
1 clear SLA resin STATUS light pipe, 1.5 mm dot (clear resin) USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 7) USD 0.001 / USD 0.001 Quote required
lightpipe 25
lightpipe 25
printed
1 clear SLA resin gauge light pipe 25 % USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 8) USD 0.001 / USD 0.001 Quote required
lightpipe 50
lightpipe 50
printed
1 clear SLA resin gauge light pipe 50 % USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 9) USD 0.001 / USD 0.001 Quote required
lightpipe 75
lightpipe 75
printed
1 clear SLA resin gauge light pipe 75 % USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 10) USD 0.001 / USD 0.001 Quote required
lightpipe 100
lightpipe 100
printed
1 clear SLA resin gauge light pipe 100 % USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 11) USD 0.001 / USD 0.001 Quote required
screw seals
screw seals
printed
4 TPU 95A screw seals (TPU 95A) USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 12) USD 0.001 / USD 0.001 Quote required

screws
hardware
4 M1.6 x 14 stainless, 0.35 pitch, pan head 3.2 mm diameter and 1.42 mm high cover screws, from below USD 0.800 per unit at 1; USD 0.800 at 100 units, checked 2026-11-08 (note 13) USD 0.800 / USD 0.800 Quote required

inserts
hardware
4 PSM MINI-TECH MTEC-B-M1.6, 2.5 mm length, 2.5 mm OD, 2.15 mm pilot heat-set inserts in the cover USD 0.600 per unit at 1; USD 0.600 at 100 units, checked 2026-11-08 (note 14) USD 0.600 / USD 0.600 Quote required

adhesive coating grease
hardware
1 adhesive, conformal coating, grease USD 0.250 per unit at 1; USD 0.250 at 100 units, checked 2026-11-08 (note 15) USD 0.250 / USD 0.250 Quote required
RC0402FR-075K1L
RC0402FR-075K1L
Yageo
2 R1 R2 5.1k 5.1k (input) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.200 / USD 0.014 Mouser 603-RC0402FR-075K1L
CC0603KRX5R7BB475
CC0603KRX5R7BB475
Yageo
2 C1 C2 4.7uF 16V 4.7uF 16V (input) USD 0.240 each at 1; USD 0.085 at 100 units (buy 100+), checked 2026-11-08 USD 0.480 / USD 0.170 Mouser 603-CC603KRX5R7BB475

RC0402FR-0713KL
Yageo
1 R3 13k 13k (charger) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.100 / USD 0.007 Mouser 603-RC0402FR-0713KL
RC0402FR-0768KL
RC0402FR-0768KL
Yageo
1 R4 68k 68k (charger) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.100 / USD 0.007 Mouser 603-RC0402FR-0768KL
RC0402FR-07100KL
RC0402FR-07100KL
Yageo
8 R5 R6 R13 R16 R17 R21 R25 R26 100k 100k (charger) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.800 / USD 0.056 Mouser 603-RC0402FR-07100KL
RC0402FR-07150KL
RC0402FR-07150KL
Yageo
2 R7 R15 150k 150k (charger) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.200 / USD 0.014 Mouser 603-RC0402FR-07150KL
CL05A105KA5NQNC
CL05A105KA5NQNC
Samsung Electro-Mechanics
4 C3 C4 C8 C11 1uF 25V 1uF 25V (power) USD 0.310 each at 1; USD 0.113 at 100 units (buy 100+), checked 2026-11-08 USD 1.24 / USD 0.452 Mouser 187-CL05A105KA5NQNC
C0603C106M8PACTU
C0603C106M8PACTU
KEMET
2 C5 C21 10uF 10V 10uF 10V (power) USD 0.980 each at 1; USD 0.394 at 100 units (buy 100+), checked 2026-11-08 USD 1.96 / USD 0.788 Mouser 80-C0603C106M8PACTU
RC0402FR-074M7L
RC0402FR-074M7L
Yageo
2 R8 R9 4.7M 4.7M (power) USD 0.120 each at 1; USD 0.008 at 100 units (buy 100+), checked 2026-11-08 USD 0.240 / USD 0.016 Mouser 603-RC0402FR-074M7L
CL05B104KO5NNNC
CL05B104KO5NNNC
Samsung Electro-Mechanics
9 C6 C7 C9 C14 C16 C17 C18 C19 C20 100nF 100nF (power) USD 0.100 each at 1; USD 0.008 at 100 units (buy 500+), checked 2026-11-08 USD 0.900 / USD 0.072 Mouser 187-CL05B104KO5NNNC
RC0402FR-074K7L
RC0402FR-074K7L
Yageo
2 R11 R12 4.7k 4.7k (mcu) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.200 / USD 0.014 Mouser 603-RC0402FR-074K7L
RC0402FR-0710RL
RC0402FR-0710RL
Yageo
1 R28 10R 10R (receiver) USD 0.190 each at 1; USD 0.011 at 100 units (buy 100+), checked 2026-11-08 USD 0.190 / USD 0.011 Mouser 603-RC0402FR-0710RL
RC0402FR-0710KL
RC0402FR-0710KL
Yageo
2 R14 R18 10k 10k (receiver) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.200 / USD 0.014 Mouser 603-RC0402FR-0710KL
GRM1555C1H4R7WA01D
GRM1555C1H4R7WA01D
Murata Electronics
1 C12 4.7pF 4.7pF (receiver) USD 0.130 each at 1; USD 0.042 at 100 units (buy 100+), checked 2026-11-08 USD 0.130 / USD 0.042 Mouser 81-GRM1555C1H4R7WA1D
GRM1555C1H102JA01D
GRM1555C1H102JA01D
Murata Electronics
component page requested
1 C13 1nF 1nF (receiver) USD 0.110 each at 1; USD 0.020 at 100 units (buy 100+), checked 2026-11-08 USD 0.110 / USD 0.020 Mouser 81-GRM1555C1H102JA1D

RC0603FR-078R2L
Yageo
1 R19 8.2R 8.2R (emitter) USD 0.100 each at 1; USD 0.016 at 100 units (buy 100+), checked 2026-11-08 USD 0.100 / USD 0.016 Mouser 603-RC0603FR-078R2L

RC0603FR-074R7L
Yageo
1 R22 4.7R 4.7R (emitter) USD 0.100 each at 1; USD 0.012 at 100 units (buy 100+), checked 2026-11-08 USD 0.100 / USD 0.012 Mouser 603-RC0603FR-074R7L
RC0402FR-07100RL
RC0402FR-07100RL
Yageo
2 R20 R24 100R 100R (emitter) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.200 / USD 0.014 Mouser 603-RC0402FR-07100RL
JMK316BJ107ML-T
JMK316BJ107ML-T
Taiyo Yuden
1 C15 100uF 6.3V emitter pulse reservoir USD 1.07 each at 1; USD 0.488 at 100 units (buy 100+), checked 2026-11-08 USD 1.07 / USD 0.488 Mouser 963-JMK316BJ107ML-T
RC0402FR-0733RL
RC0402FR-0733RL
Yageo
1 R27 33R 33R (lights) USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 USD 0.100 / USD 0.007 Mouser 603-RC0402FR-0733RL

Per unit: USD 29.09 building 1, USD 18.11 each building 100 (electronics and battery USD 27.18 / 16.19).

Line cost is the quantity one unit consumes times the price break that the build quantity (1 or 100 units) reaches. Buying for one unit still means whole packs, spools and bottles; those minimum outlays are larger than the consumed cost. Excluded: bare PCB (quote from the 3rd party fab); case shipping, tax, machine time, labour, resin wash and cure consumables; assembly labour, PCB assembly fees, tax and shipping.

  1. base: 3.4904 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see case/mech_costs_sources.md
  2. cover: 3.5388 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see case/mech_costs_sources.md
  3. gasket: 0.0929 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
  4. foot: 0.2562 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
  5. usb plug: 0.2786 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
  6. ir window: 0.0997 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  7. lightpipe status: 0.0099 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  8. lightpipe 25: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  9. lightpipe 50: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  10. lightpipe 75: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  11. lightpipe 100: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
  12. screw seals: 0.0156 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
  13. screws: 4 x USD 0.2; Vital Parts TPH14583-M16-14-A2: GBP 0.13 ex VAT at 1-99; USD 0.20 conservative budget including FX variation
  14. inserts: 4 x USD 0.15; RFQ required; comparable CNC Kitchen 100-pack is USD 11.50, different pilot/minimum wall
  15. adhesive coating grease: planning allowance, compatible products require coupons

The sourcing BOM with stock checks and every price column is docs/fab/ghost-hand-rev2-sourcing-bom.csv.

Board

The rev 2 board is an Adom molecule designed with Adom AI Flow in KiCad, from a new run: schematic, placement, routing, copper pours, current and heat analysis, silkscreen and 3D, on a 3rd party fab's 2-layer rules. It is 30 x 22 mm (rev 1: 44 x 28), with its four corner machine pins on a 24 x 16 mm span (the molecule grid wants multiples of 8 mm): the same pins that seat it in an Adom workcell, and in the case they press into printed sockets that hold it. The IR parts look forward off the front edge, USB-C is on the right edge, the battery lies under the board and its lead turns up into J2 at the back.

The silkscreen is new: every reference at 0.6 mm and every value at 0.3 mm, grouped by function; every light named for what it shows (STATUS, 25%, 50%, 75%, 100%), every IR part for what it is (IR 850 TX, IR 940 TX, PD RX), test points with their nets, J2 with + and -, and the power inputs with their voltage. The back carries the name, rev 2, the date and this page's address.

The board's own page, written by AI Flow, is in board/.

The finished board

Parts 66 fitted, 35 BOM lines, every placement rotation checked
Routing 830 mm of track in 1326 segments, 77 vias, 0 DRC errors, 0 unconnected
Programming UPDI on machine contacts MC4 (UPDI), MC3 (3V3), MC1 (GND)
Battery connector J2 pin 1 = VBAT (+, red), pin 2 = GND (-, black), + and - in the silkscreen

Why an ATtiny1616 and not an STM32C0

Keep the ATtiny1616. It is the only part compared here that runs the whole echo in hardware: a comparator with a learnable DAC threshold, the event system and two single-shot timers, all while the CPU sleeps. It also sleeps at 0.1 uA, which gave rev 1 about 10 years on the counter between charges (about 3 years on rev 2's smaller pack).

  • STM32C011: about $0.38 cheaper at 1000 units. But it has no comparator: an ADC analog-watchdog workaround can trigger TIM1, but only while the chip is awake. Its Stop mode draws 80 uA, so the design would have to use Standby, with a reset on every wake. That cuts idle life from 10 years to 4, and it needs a firmware rewrite and a new layout.
  • Next-revision candidate: TI MSPM0L1306, if its two on-chip op-amps can replace the TLV9062. The MCU plus op-amp would drop from $1.77 to $0.97 at 1000 units, keeping a hardware echo path and 1 uA standby. That needs a bench test first. Rev B would change:
    • U1 becomes an MSPM0L1306 (VQFN-24).
    • The TLV9062 goes, if the bench test passes.
    • Programming moves from UPDI to SWD (SWDIO, SWCLK and NRST on machine contacts).
    • The AC0 and DAC0 threshold becomes COMP with its 8-bit DAC.
    • The two TCB single-shots become event-triggered timer one-shots.
    • The firmware is ported. Rev 2 keeps the ATtiny1616.
Chip at 1 at 100 at 1000 Sleep current Echo in hardware, CPU asleep Programming Idle years on one charge Fits the board?
ATtiny1616-MNR
VQFN-20 3x3, 16 KB / 2 KB
$0.900 $0.873 $0.873 (25+ break) 0.1 uA power-down; 0.71 uA standby with RTC (DS40002204A t.36-5, 3 V 25 C) Yes: AC0 with DAC0 threshold -> event system -> TCB0/TCB1 single-shot, runs in standby UPDI, 1 wire + GND (serialUPDI on any USB-serial adapter, pymcuprog/avrdude, avr-gcc; or PICkit 5) 10.3 rev A: fits as built (13.1 KB flash, 368 B RAM used)
ATtiny1606-MNR
VQFN-20 3x3, same pinout, 16 KB / 1 KB
$0.820 $0.796 $0.796 (25+ break) same family figures as the 1616 Partly: AC0 has only fixed references (no DAC0), so the learnt receiver threshold is lost UPDI, same tools 10.3 (no DAC) does not fit: no DAC0 for the learnt threshold
STM32C011F4U6TR
UFQFPN-20 3x3, 16 KB / 6 KB
$1.49 $0.653 $0.497 Stop 80 uA typ; Standby 7.45 uA (RAM lost, wake = reset); Shutdown about 20 nA (DS13866 t.31; ST C0 training) No comparator. Workaround: ADC at 1 Msps with analog watchdog -> TIM1 one-pulse, Run/Sleep only (about 0.5 mA: 0.32 mA Sleep at 16 MHz + 0.19 mA ADC) SWD, 2 wires + NRST + GND (ST-LINK V3 or any CMSIS-DAP; STM32CubeIDE / OpenOCD) 4.0 in Standby, 0.6 in Stop fits with a firmware rewrite and Standby-based sleep
STM32C031K4U6
UFQFPN-32 5x5, 16 KB / 12 KB
$1.06 $0.638 $0.628 (250+ break) same C0 family figures (Stop about 80 uA, Standby about 7.5 uA) No comparator; same ADC-watchdog workaround SWD, same tools about 4 in Standby fits with a rewrite; larger package
MSPM0L1306SRGER
VQFN-24 4x4, 64 KB / 4 KB
$1.85 $1.10 $0.968 STANDBY 1.0 uA with RAM kept; SHUTDOWN 61 nA (ti.com product page) Yes: COMP with 8-bit DAC (32 ns) -> event fabric -> timer one-shot; also 2 chopper op-amps (could replace the TLV9062: bandwidth not yet checked) SWD, same tools (TI XDS110 or CMSIS-DAP; Code Composer / GCC) 8.7 fits analog best; rewrite and re-layout; worth a bench test
MSPM0C1104SDDFR
SOT-23-8 / small, 16 KB / 1 KB
$0.720 $0.399 $0.355 (500+ break) STANDBY 5 uA; SHUTDOWN 200 nA (ti.com) No comparator, no event fabric listed: no hardware echo path SWD 5.1 does not fit the echo path

Prices: Mouser, live 2026-11-07. Idle years: rev 1's 425 mAh usable (rev 2: 128 mAh, about 0.3 of these), the rest of the board sleeping at 4.6 uA. Sleep figures:

  • ATtiny1616: DS40002204A, table 36-5.
  • STM32C011: DS13866, table 31, and ST's STM32C0 training.
  • MSPM0: ti.com product pages.

ATtiny806, 416 and the other 8 KB and 4 KB parts are too small for the 13.1 KB firmware.

Why ATtiny1616: price, sleep and echo path

The AI Flow run

Each board went from the prompt to fab files in one measured Adom AI Flow run: intake, requirements, sourcing, test plan, schematic, placement, routing, vias, copper pours, current, thermal, Adom Fields, silkscreen, 3D, finish and export. Rev 2 is a new run; every step left its proof, screenshots and clips in the page repo. The runs, step by step: board-claude-opus-5-5-20261106-1434, board-claude-opus-5-5-20261108-1620, ghost-hand-claude-opus-5-5-20261106-1434, ghost-hand-claude-opus-5-5-20261108-1620. Build clips: docs/clips.md.

When a tool got in the way, the board thread fixed it at the source instead of working around it quietly. These went back to AI Flow from the rev 1 build:

  • Issue #165: the router ignored trackWidth and scalar wideNets, so a 0.25 mm default track made the 0.4 mm pitch QFN unroutable
  • Issue #166: flat test-pad 3D models were flagged as upside down
  • Issue #167: nets past --rip-global were dropped without a word
  • PR #73: adds a UPDI programming interface to the molecule flow, so the finished board can be flashed on its machine contacts

How it was built: three AI threads in Hydrogen

Rev 1 was built in one day, and rev 2 the same way, by three AI threads working side by side in Adom Hydrogen, each owning its own folder and handing work to the others through files, never by editing each other's work:

Thread Owned Delivered
Board (Claude) the design, AI Flow and KiCad parts, schematic, the molecule board driven live in KiCad through Adom Bridge, Fields analysis, fab files
Case (Codex) the case the parametric case, STEP and STL, light pipes, gasket and seals, the laser engraving, a 528-pair interference check
Studio (Claude) this page and the dashboard Ghost Hand Studio, the 3D model of the whole gadget, firmware notes, battery life, this page

The board thread published the board's STEP and GLB at each milestone (placed, routed and poured, final). The case thread read the board envelope and the pin positions from it and fitted the sockets and the battery around it. The studio thread rebuilt the assembled 3D model each time either one landed, and checked that the board's outline sits exactly on the case's board envelope. Hydrogen kept all three on one screen: the chat on the left, the AI Flow dashboard, the Studio and this page in webview tabs on the right.

Case

The 3D view at the top of this page is the assembled rev 2 gadget on a bathroom counter, 330 mm from the sensor window of a Moen 8551 sensor faucet with a hand washing under the stream, all at true size: open its Layers panel to hide the sink and faucet, the hand, the case shell, the light pipes or the battery, zoom in on Ghost Hand, and press Replay to watch it assemble.

The hand is cut from the MakeHuman base mesh (CC0); the faucet is modelled from Moen's spec sheet. How the scene was made: docs/3d/size-hand.

The assembled rev 2 case Exploded: foot, base, battery, board, gasket, cover, light pipes The Adafruit 1317 and its service loops under the board The front IR window The base with the pin collets The cover from below Inside the cover: light pipe bores and USB collar UV laser engraving: the names of the lights

A compact sage pebble with a crowned roof, rounded edges and five tiny clear indicator dots. The front window separates IR transmit and receive paths. The screws enter from underneath, with a continuous perimeter seal and a recessed non-slip foot. There is no logo and no recess on the roof to collect water.

The top of the case in the 3D model, close up: the UV laser engraved light names over their light pipes

The top in the 3D model above: the UV laser engraving (STATUS, 25, 50, 75, 100 and GHOST HAND) is built straight from the engraving file and mapped onto the crowned roof, each name next to its own light pipe. Toggle it in Layers, 'Laser engraving'.

It is 38 x 32 x 17 mm overall, about half of rev 1's footprint. The board sits 5 degrees nose up, which puts the IR axis 13.6 mm above the counter; the aim above uses that height. Four cross-slotted collets squeeze the board's machine pins, the same pins that seat it in an Adom workcell, with open bottoms so the pin tips never bottom out. The Adafruit 1317 lies in its own floor pocket under the board, its leads coiled in a service loop that returns into J2 from the back. A TPU gasket seals the seam at 25 % compression, four M1.6 screws enter from below through TPU washers into heat-set inserts, a tethered TPU stopper with two sealing ribs closes the USB-C port, and a recessed TPU foot keeps it from sliding. Five 1.5 mm clear-resin pipes carry the lights to the roof, and a UV fiber laser engraves their names. A 513-pair interference check found no unexpected contact.

Design notes, print settings and assembly: case/README.md; engraving guide: case/laser_engrave.md; parametric source: case/ghost_hand_case.py.

Firmware

Plain C for the ATtiny1616, updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge) (avr-gcc, about 13.1 KB of the 16 KB flash). The echo path is pure hardware: AC0, the event system and TCB0/TCB1 single-shots. The CPU runs the state machine, the learner, the lights and the safety checks, and a 1 s watchdog guards the main loop. Full source is in firmware/, with a host test that runs the learner against simulated faucets (make test, 36 checks). Flash over UPDI on machine contacts MC4 (UPDI), MC3 (3V3) and MC1 (GND).

File What
firmware/src/main.c state machine and safety checks
firmware/src/echo.c AC0 + event system + TCB transponder
firmware/src/learn.c faucet timeout and blip learner
firmware/src/accel.c LIS2DW12 set-down, pick-up and tilt
firmware/src/leds.c WS2812B-2020 driver and light patterns
firmware/src/power.c clocks, sleep, battery, ADC, watchdog, EEPROM
firmware/build/ghost-hand.hex ready-to-flash image

Ghost Hand Studio

The build dashboard: an Adom app that shows the architecture, the faucet and its beam, the aim, the learning state machine, the lights, charging, battery life and the 3D models, live as the board and case come together.

Ghost Hand Studio 3D view

Revisions

Rev 1 (0.1.0) Rev 2 (0.2.0)
Case on the counter 54 x 44 mm, 27 mm tall 38 x 32 mm, 17 mm tall, much lower
Board 44 x 28 mm, 2 layers 30 x 22 mm, 2 layers, parts on both sides
Battery Adafruit 1578, 500 mAh, 196 mA charge in 3.2 h Adafruit 1317, 150 mAh, 77 mA charge in 2.4 h
Battery life about a year at one session a day 40 days at six sessions a day, 170 at one: charge about once a month
Lights Adom logo light pipe and four gauge pills 1.5 mm dots: STATUS and a four-dot gauge, half the drive
Tilt 12 degrees, a guess 5 degrees, from a scale drawing of the faucet
IR emitters one 850 nm and two 940 nm, all at 12 ohm one 850 nm at 8.2 ohm and one 940 nm at 4.7 ohm, for the off-axis counter spots in a smaller board
Silkscreen references only every reference 0.6 mm and value 0.3 mm, every light and IR part named, J2 + and -, test point nets

Rev 1's complete design (board KiCad files, Gerbers, BOM, CPL, case STEP and STL, firmware) is the 0.1.0 "Rev 1" release (Gerbers).

Downloads

Rev 2 release (0.2.0) design zip (board KiCad files, Gerbers, BOM, CPL, case STEP/STL/SVG, firmware hex), Gerbers
Case STEP base.step, battery_jst_plug.step, battery_lead_black.step, battery_lead_red.step, battery_pouch.step, battery_tape.step, cover.step, final_board.step, foot.step, gasket.step, ghost-hand-assembly.step, ghost-hand-exploded.step, inserts.step, ir_window.step, lightpipe_100.step, lightpipe_25.step, lightpipe_50.step, lightpipe_75.step, lightpipe_status.step, screw_seals.step, screws.step, usb_plug.step
Case STL (print) base.stl, cover.stl, foot.stl, gasket.stl, inserts.stl, ir_window.stl, lightpipe_100.stl, lightpipe_25.stl, lightpipe_50.stl, lightpipe_75.stl, lightpipe_status.stl, screw_seals.stl, screws.stl, usb_plug.stl
Laser engraving SVG laser_engrave.svg
Board fab files (Gerbers and drill, BOM, CPL, 3D) ghost-hand-rev2-gerbers.zip, ghost-hand-rev2-bom.csv, ghost-hand-rev2-cpl.csv, ghost-hand-rev2-board.glb
Sourcing BOM ghost-hand-rev2-sourcing-bom.csv
Aim drawings and numbers side-view.svg, top-view.svg, aim.json
Firmware ghost-hand.hex, source
Rev 1 design zip, Gerbers

License

MIT. Build it, change it, share it.