project
Ghost Hand
Public Unreviewedby John Lauer
A small battery gadget that keeps an automatic sink faucet running while you use the sink: it learns the faucet's timeout, re-arms with the shortest blip, and stops after 10 minutes or when picked up.
← Commit history
Rev 2: aim, status-dot lights, Adafruit 1317 battery, rev 2 cost, revisions, firmware
20 files changed
+3391−315
README.md+174−107docs/aim/aim.json+264docs/aim/side-view-068b0058.pngdocs/aim/side-view.svg+428docs/aim/top-view-749108d6.pngdocs/aim/top-view.svg+2022docs/calcs.json+217docs/fab/ghost-hand-rev2-sourcing-bom.csv+58docs/studio/aim-1a954333.pngdocs/studio/architecture-d33ab047.pngdocs/studio/battery-d45750c5.pngdocs/studio/charging-9f179081.pngdocs/studio/lights-5f231aa2.pngfirmware/README.md+23−11firmware/build/ghost-hand.hex+172−172firmware/src/board.h+9−6firmware/src/leds.c+18−14firmware/src/leds.h+1−1firmware/src/main.c+2−2firmware/src/power.c+3−2README.md+174−107@@ -1,28 +1,40 @@ <!-- studio:begin --> # Ghost Hand -::adom-video{src="/john/ghost-hand/render/docs/videos/ghost-hand-film.video.json"}--The whole build in two minutes: 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. [Download the film](docs/videos/ghost-hand-film.mp4) ([captions](docs/videos/ghost-hand-film.vtt)).- 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"](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip); see+[Revisions](#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. -| | |+### The rev 1 build, in two minutes++::adom-video{src="/john/ghost-hand/render/docs/videos/ghost-hand-film.video.json"}++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 was built the+same way. [Download the film](docs/videos/ghost-hand-film.mp4) ([captions](docs/videos/ghost-hand-film.vtt)).++| | Rev 2 | |---|---|-| Board | Adom molecule, 44 x 28 mm, 2 layers on a 3rd party fab's rules, 4 corner machine pins |+| Size on the counter | about 38 x 32 mm (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 and two 940 nm emitters, two VEMD2023 photodiodes (750 to 1050 nm) |-| Battery | 500 mAh 1S LiPo, USB-C charging at 196 mA in 3.2 h |-| Battery life | about 897 ten-minute sessions per charge, 391 days at one a day |-| Lights | WS2812B-2020 under a clear-resin Adom logo light pipe and a 4-segment charge gauge |+| IR | one 850 nm and two 940 nm emitters behind 8.2 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 | 39 days at six 10-minute sessions a day, 73 at three, 168 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@@ -38,7 +50,7 @@ system fires two single-shot timers that light the emitters, all in hardware, un 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. -+ ### Wavelengths and faucets covered @@ -69,59 +81,128 @@ EEPROM, keyed to the faucet's idle period.  +## 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.++++With the IR lens 9 mm above the counter, the window is+tilt = atan((window height - lens height) / distance) above the horizon: 17.2 degrees from+100 mm away and 5.1 degrees from 350 mm (25.2 and 7.6 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/d<sup>2</sup>, so the far placement is the one that limits: rev 2 tilts+**5 degrees**, which aims the beam axis at the window from 350 mm and gives the best worst-case margin+over 100 to 350 mm (6.5x a hand at 5 degrees, 6.3x flat, 6.2x at rev 1's 12).+The emitter resistors also dropped from 12 to 8.2 ohm for more margin at the off-axis spots.++| 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 | 17.2 deg | 0.72 / **0.85** / 0.97 | 50.8x | 25.2 deg | 26.5x |+| 150 mm | 11.7 deg | 0.86 / **0.95** / 1.0 | 30.0x | 17.4 deg | 22.3x |+| 200 mm | 8.8 deg | 0.92 / **0.98** / 0.99 | 18.5x | 13.2 deg | 15.8x |+| 250 mm | 7.1 deg | 0.95 / **1.0** / 0.97 | 12.3x | 10.6 deg | 11.2x |+| 300 mm | 5.9 deg | 0.96 / **1.0** / 0.96 | 8.7x | 8.9 deg | 8.2x |+| 350 mm | 5.1 deg | 0.97 / **1.0** / 0.95 | 6.5x | 7.6 deg | 6.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.++++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.7x margin). Beside the basin it works+from about 309 mm out (315 mm and 43 degrees off axis gives 1.8x). Diagrams:+[side view SVG](docs/aim/side-view.svg), [top view SVG](docs/aim/top-view.svg), numbers in+[aim.json](docs/aim/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 9 mm above the counter, turned by the user to face the window.+- Two photodiodes and the rev 1 receiver chain and threshold; emitters behind 8.2 ohm (rev 1: 12), low battery 3.45 V.+++ ## The lights -| State | Logo | Charge gauge |+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 segment red |-| Charging | off | filled to the level, next segment pulses |+| 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 | -+ ## Charging and battery life -USB-C 5 V feeds an MCP73831 linear charger at 196 mA (about 0.39 C, gentle for a-cell in a sealed case): constant current, then constant voltage at 4.2 V, full in about-3.2 h. A TPS7A02 makes the 3.3 V rail on 25 nA of quiescent current.+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. -+ -The budget is built from the typical current of every part (Adafruit 1578, 500 mAh 1S LiPo, 425 mAh usable,+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.84 mA average |-| One 10-minute session | 0.474 mAh |-| Sessions per charge | about 897 |-| Days per charge | 391 at one session a day, 209 at three, 123 at six |-| Running time per charge | about 150 h |+| During a session | 2.98 mA average |+| One 10-minute session | 0.496 mAh |+| Sessions per charge | about 256 |+| Days per charge | 39 at six sessions a day, 73 at three, 168 at one |+| Once a month | holds up to 8.0 sessions a day for 30 days |+| Running time per charge | about 43 h |+| Charge time | 2.4 h at 77 mA | -Self-discharge of the cell (3.0 %/month assumed (0.5 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.+At the pack's minimum capacity it is still 37 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. -+ ### The battery, and which pin is + -The cell is an [Adafruit 1578](https://wiki.adom.inc/adom/adom-1578): a protected 500 mAh 1S LiPo pouch, 30 x 35 x 5 mm per its PKCell drawing, with 102 mm leads and a JST PH plug. It is [Mouser 485-1578](https://www.mouser.com/en/ProductDetail/Adafruit/1578?qs=GURawfaeGuBBv%2Fo5AsyERQ%3D%3D), USD 7.95, 435 in stock when checked on 2026-11-07. It is BT1 in the BOM. It plugs into J2 and is not fitted by the fab, so the fab BOM lists it as a do-not-place line.--**Polarity:** on Adafruit packs, red (+) is on JST circuit 1 and black (-) on circuit 2. Looking at the plug's mating face with the latch bump up, red is on the right. Adafruit's and SparkFun's boards use the same convention. On rev A, J2 was first laid out the other way round (pin 1 GND), which would have reverse-connected this battery. That was caught and fixed before any order: **J2 pin 1 is VBAT (+) and pin 2 is GND**, with + and - printed beside the connector. Batteries from other sellers are often wired the opposite way, so check any pack with a meter before plugging it in.+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](https://www.mouser.com/c/?q=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 -Checked against the finished board (68 fitted parts, 32 BOM lines on the board plus the battery): every part below is on the exported BOM, and a walk of the netlist finds only one resistor path that is always on, the VBAT monitor divider (R8 + R9, 9.4 Mohm, 0.39 uA at 3.7 V). The charge-status and USB sense dividers are dead without USB, and the receiver bias is powered from a pin only during a session.- | Asleep | uA | |---|---| | TPS7A0233 IQ | 0.025 |@@ -139,44 +220,39 @@ Checked against the finished board (68 fitted parts, 32 BOM lines on the board p | 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 (3 emitters, 25 us at 20 Hz) | 0.327 |-| status light: logo breathing at 2 % average white, 20 % rail duty | 0.6 |+| IR echo pulses (3 emitters, 25 us at 20 Hz) | 0.465 |+| 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.84** |+| **Total** | **2.98** | -Asleep and never used, the 425 mAh would last 10.3 years; in practice the cell's own self-discharge sets the shelf life. Typical datasheet currents at 25 C.+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 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.+Every part of one rev 2 Ghost Hand, with its live price, the break a build reaches and the date it was checked. The case parts and hardware join the table when the rev 2 case is finished. | Part | Qty | Refs | Value | Role | Unit cost | Line cost (1 / 100 units) | Buy | |---|---|---|---|---|---|---|---| | <a href="https://wiki.adom.inc/adom/attiny1616-mnr"><img src="docs/parts/attiny1616-mnr.png?v=b1a8105a" width="64" alt="ATTINY1616-MNR"></a><br>**[ATTINY1616-MNR](https://wiki.adom.inc/adom/attiny1616-mnr)**<br>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-07 | USD 0.900 / USD 0.873 | [Mouser 556-ATTINY1616MNR](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1616-MNR?qs=HXFqYaX1Q2yKNpuKQU9qww%3D%3D) |-| <a href="https://wiki.adom.inc/adom/mcp73831t-2aci"><img src="docs/parts/mcp73831t-2aci-ot.png?v=fccd44a9" width="64" alt="MCP73831T-2ACI/OT"></a><br>**[MCP73831T-2ACI/OT](https://wiki.adom.inc/adom/mcp73831t-2aci)**<br>Microchip Technology | 1 | U2 | MCP73831T-2ACI/OT | LiPo charger, 196 mA | USD 0.760 each at 1; USD 0.750 at 100 units (buy 25+), checked 2026-11-07 | USD 0.760 / USD 0.750 | [Mouser 579-MCP73831T-2ACIOT](https://www.mouser.com/en/ProductDetail/Microchip-Technology/MCP73831T-2ACI-OT?qs=yUQqVecv4qvbBQBGbHx0Mw%3D%3D) |+| <a href="https://wiki.adom.inc/adom/mcp73831t-2aci"><img src="docs/parts/mcp73831t-2aci-ot.png?v=fccd44a9" width="64" alt="MCP73831T-2ACI/OT"></a><br>**[MCP73831T-2ACI/OT](https://wiki.adom.inc/adom/mcp73831t-2aci)**<br>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-07 | USD 0.760 / USD 0.750 | [Mouser 579-MCP73831T-2ACIOT](https://www.mouser.com/en/ProductDetail/Microchip-Technology/MCP73831T-2ACI-OT?qs=yUQqVecv4qvbBQBGbHx0Mw%3D%3D) | | <a href="https://wiki.adom.inc/adom/tps7a0233pdbvr"><img src="docs/parts/tps7a0233pdbvr.png?v=fccd44a9" width="64" alt="TPS7A0233PDBVR"></a><br>**[TPS7A0233PDBVR](https://wiki.adom.inc/adom/tps7a0233pdbvr)**<br>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-07 | USD 0.950 / USD 0.540 | [DigiKey 296-TPS7A0233PDBVRCT-ND](https://www.digikey.com/en/products/detail/texas-instruments/TPS7A0233PDBVR/12165099) | | <a href="https://wiki.adom.inc/part-request/n8mib0MeRoaROvu4dI106rCYAxewTQXi"><img src="docs/parts/lis2dw12tr.png?v=756fe101" width="64" alt="LIS2DW12TR"></a><br>**[LIS2DW12TR](https://wiki.adom.inc/part-request/n8mib0MeRoaROvu4dI106rCYAxewTQXi)**<br>STMicroelectronics<br>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-07 | USD 1.79 / USD 1.30 | [Mouser 511-LIS2DW12TR](https://www.mouser.com/en/ProductDetail/STMicroelectronics/LIS2DW12TR?qs=u4fy%2FsgLU9NZAt0DqrAehA%3D%3D) | | <a href="https://wiki.adom.inc/adom/tlv9062idgkt"><img src="docs/parts/tlv9062idgkt.png?v=6f6a7fdb" width="64" alt="TLV9062IDGKT"></a><br>**[TLV9062IDGKT](https://wiki.adom.inc/adom/tlv9062idgkt)**<br>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-07 | USD 1.76 / USD 1.05 | [Mouser 595-TLV9062IDGKT](https://www.mouser.com/en/ProductDetail/Texas-Instruments/TLV9062IDGKT?qs=1mbolxNpo8fe4ip52k%252B7Aw%3D%3D) | | <a href="https://wiki.adom.inc/part-request/8MK0A64vuebcJ7-Y0bAGGN3PVLNitp8J"><img src="docs/parts/vsmy2853sl.png?v=4cae8128" width="64" alt="VSMY2853SL"></a><br>**[VSMY2853SL](https://wiki.adom.inc/part-request/8MK0A64vuebcJ7-Y0bAGGN3PVLNitp8J)**<br>Vishay<br>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-07 | USD 1.01 / USD 0.532 | [Mouser 78-VSMY2853SL](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMY2853SL?qs=5csRq1wdUj5LLuw5br%2F28g%3D%3D) | | <a href="https://wiki.adom.inc/part-request/o5md74npPDN2dqrLqUB6CkClqbT3ukpe"><img src="docs/parts/vsmb2948sl.png?v=4cae8128" width="64" alt="VSMB2948SL"></a><br>**[VSMB2948SL](https://wiki.adom.inc/part-request/o5md74npPDN2dqrLqUB6CkClqbT3ukpe)**<br>Vishay<br>component page requested | 2 | D2 D3 | VSMB2948SL | 940 nm emitters | USD 0.680 each at 1; USD 0.385 at 100 units (buy 100+), checked 2026-11-07 | USD 1.36 / USD 0.770 | [Mouser 78-VSMB2948SL](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMB2948SL?qs=5csRq1wdUj7tHqVBoZkgQA%3D%3D) | | <a href="https://wiki.adom.inc/adom/vemd2023slx01"><img src="docs/parts/vemd2023slx01.png?v=f5d4d7a1" width="64" alt="VEMD2023SLX01"></a><br>**[VEMD2023SLX01](https://wiki.adom.inc/adom/vemd2023slx01)**<br>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-07 | USD 1.72 / USD 0.920 | [Mouser 78-VEMD2023SLX01](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VEMD2023SLX01?qs=5csRq1wdUj48jE77ZOyA1Q%3D%3D) |-| <a href="https://wiki.adom.inc/adom/ws2812b-2020"><img src="docs/parts/ws2812b-2020.png?v=81bc6999" width="64" alt="WS2812B-2020"></a><br>**[WS2812B-2020](https://wiki.adom.inc/adom/ws2812b-2020)**<br>Worldsemi | 5 | D4 D5 D6 D7 D8 | WS2812B-2020 | status lights (logo + 4 gauge) | USD 0.045 each at 1; USD 0.045 at 100 units (buy 1+), checked 2026-11-07 | USD 0.227 / USD 0.227 | [Adom stock adom/ws2812b-2020](https://wiki.adom.inc/adom/ws2812b-2020) |+| <a href="https://wiki.adom.inc/adom/ws2812b-2020"><img src="docs/parts/ws2812b-2020.png?v=81bc6999" width="64" alt="WS2812B-2020"></a><br>**[WS2812B-2020](https://wiki.adom.inc/adom/ws2812b-2020)**<br>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-07 | USD 0.227 / USD 0.227 | [Adom stock adom/ws2812b-2020](https://wiki.adom.inc/adom/ws2812b-2020) | | <a href="https://wiki.adom.inc/adom/dmn2041l-7"><img src="docs/parts/dmn2041l-7.png?v=3f2108a3" width="64" alt="DMN2041L-7"></a><br>**[DMN2041L-7](https://wiki.adom.inc/adom/dmn2041l-7)**<br>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-07 | USD 1.06 / USD 0.444 | [Mouser 621-DMN2041L-7](https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMN2041L-7?qs=tiksPeNXt0LSbn3jTreVOg%3D%3D) | | <a href="https://wiki.adom.inc/adom/dmg2305ux-13"><img src="docs/parts/dmg2305ux-13.png?v=3f2108a3" width="64" alt="DMG2305UX-13"></a><br>**[DMG2305UX-13](https://wiki.adom.inc/adom/dmg2305ux-13)**<br>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-07 | USD 0.410 / USD 0.169 | [Mouser 621-DMG2305UX-13](https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMG2305UX-13?qs=L1DZKBg7t5Hgw5KN3G2IRg%3D%3D) | | <a href="https://wiki.adom.inc/adom/usb4105-gf-a"><img src="docs/parts/usb4105-gf-a.png?v=4eed2bf6" width="64" alt="USB4105-GF-A"></a><br>**[USB4105-GF-A](https://wiki.adom.inc/adom/usb4105-gf-a)**<br>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-07 | USD 0.800 / USD 0.575 | [Mouser 640-USB4105-GF-A](https://www.mouser.com/en/ProductDetail/GCT/USB4105-GF-A?qs=KUoIvG%2F9IlY%2FMLlBMpStpA%3D%3D) | | <a href="https://wiki.adom.inc/adom/s2b-ph-k-s"><img src="docs/parts/s2b-ph-k-s.png?v=cc5c1032" width="64" alt="S2B-PH-K-S"></a><br>**[S2B-PH-K-S](https://wiki.adom.inc/adom/s2b-ph-k-s)**<br>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-07 | USD 0.120 / USD 0.084 | [Mouser 306-S2BPHKSLFSNPP](https://www.mouser.com/en/ProductDetail/JST-Commercial/S2B-PH-K-SLFSN?qs=cdbOS8ANM9A5Ie4gXeMjTA%3D%3D) | | <a href="https://wiki.adom.inc/adom/smf5-0a"><img src="docs/parts/smf5-0a.png?v=8e37e223" width="64" alt="SMF5.0A"></a><br>**[SMF5.0A](https://wiki.adom.inc/adom/smf5-0a)**<br>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-07 | USD 0.420 / USD 0.162 | [Mouser 821-SMF5.0ARQG](https://www.mouser.com/en/ProductDetail/Taiwan-Semiconductor/SMF5.0A?qs=1mbolxNpo8eR5rZB%252BCLtCw%3D%3D) |-| <a href="https://wiki.adom.inc/adom/adom-1578"><img src="docs/parts/adafruit-1578.png?v=a610f227" width="64" alt="1578"></a><br>**[1578](https://wiki.adom.inc/adom/adom-1578)**<br>Adafruit | 1 | BT1 | 500mAh 1S LiPo | 500 mAh LiPo, off-board on J2 | USD 7.95 each at 1; USD 7.95 at 100 units (buy 1+), checked 2026-11-07 | USD 7.95 / USD 7.95 | [Mouser 485-1578](https://www.mouser.com/en/ProductDetail/Adafruit/1578?qs=GURawfaeGuBBv%2Fo5AsyERQ%3D%3D) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/board"><img src="docs/parts/pcb.png?v=4a5e6505" width="64" alt="Bare PCB"></a><br>**[Bare PCB](https://wiki.adom.inc/john/ghost-hand/files/board)**<br>3rd party fab (price is an estimate) | 1 | | 2-layer FR4 1.6 mm, 44 x 28 mm, HASL (ENIG option noted), green mask, 1 per unit | the board itself, 3rd party fab | USD 16.16 per unit at 1; USD 1.07 at 100 units, checked 2026-11-07 | USD 16.16 / USD 1.07 | Quote required (estimate basis: [public price formula](https://community.aisler.net/t/our-simple-pricing/102), note 8) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-base.png?v=e1c65b57" width="64" alt="Base + cover + battery spacer (printed)"></a><br>**[Base + cover + battery spacer (printed)](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Prusa Research (prusa3d.com US store) | 24.33 g | | UV-stabilized ASA filament, 1.75 mm (Prusament ASA; README colour light sage, Light Grey priced as stand-in) | base, cover and battery spacer (ASA) | USD 0.631 per unit at 1; USD 0.631 at 100 units, checked 2026-11-07 (note 1) | USD 0.631 / USD 0.631 | [Prusa Research (prusa3d.com US store) Not labelled on page (page shows internal IDF/IDS codes only)](https://www.prusa3d.com/product/prusament-asa-light-grey-800g/) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-gasket.png?v=1243f881" width="64" alt="Perimeter gasket + four screw seals + USB stopper/tether (printed)"></a><br>**[Perimeter gasket + four screw seals + USB stopper/tether (printed)](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Prusa Research (prusa3d.com US store) | 1.048 g | | Polyether TPU 95 Shore A filament, 1.75 mm (Prusament TPU 95A, ether-diol type; teal not offered, Urban Grey priced) | seals: perimeter gasket, 4 screw seals, USB stopper (TPU 95A) | USD 0.055 per unit at 1; USD 0.055 at 100 units, checked 2026-11-07 (note 2) | USD 0.055 / USD 0.055 | [Prusa Research (prusa3d.com US store) Not labelled on page (page shows IDF 26759 / IDS 4229)](https://www.prusa3d.com/product/prusament-tpu-95a-urban-grey-500g-nfc/) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-foot.png?v=23f0c63e" width="64" alt="Foot ring (printed)"></a><br>**[Foot ring (printed)](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Prusa Research (prusa3d.com US store) | 0.95 g | | TPU 85 Shore A filament, 1.75 mm (Bedrock 3D TPU 85A, sold as the BASF/Forward AM Ultrafuse TPU 85A successor) | non-slip foot (TPU 85A) | USD 0.061 per unit at 1; USD 0.061 at 100 units, checked 2026-11-07 (note 3) | USD 0.061 / USD 0.061 | [Prusa Research (prusa3d.com US store) Not labelled on page (page shows IDF 24352 / IDS 2095)](https://www.prusa3d.com/product/basf-ultrafuse-tpu-85a-natural-750g) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-main.png?v=425b4c8e" width="64" alt="Main logo light pipe + four gauge pipes + front IR window (SLA)"></a><br>**[Main logo light pipe + four gauge pipes + front IR window (SLA)](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Hawk Ridge Systems (US Formlabs reseller) | 0.628 mL | | Formlabs Clear Resin V5 (Form 4), 1 L cartridge | logo pipe, 4 gauge pipes, IR window (clear resin) | USD 0.075 per unit at 1; USD 0.075 at 100 units, checked 2026-11-07 (note 4) | USD 0.075 / USD 0.075 | [Hawk Ridge Systems (US Formlabs reseller) RS-C2-GPCL-05 (Formlabs part number; not printed on the reseller page)](https://hawkridgesys.com/product/formlabs-form-4-clear-resin-v5-1-l) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/m2x12-a4-pan.png?v=56c0aed2" width="64" alt="Cover screws"></a><br>**[Cover screws](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Fastener SuperStore | 4 | | M2-0.4 x 12 mm pan-head machine screw, 316 stainless (A4), ISO 7045, Pozi drive | M2 x 12 A4 screws, from below | USD 0.106 per unit at 1; USD 0.106 at 100 units, checked 2026-11-07 (note 5) | USD 0.106 / USD 0.106 | [Fastener SuperStore 605929](https://fastenersuperstore.com/products/605929/machine-screws?pid=18765) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/m2-heat-set-insert.png?v=22b80bb2" width="64" alt="Heat-set inserts"></a><br>**[Heat-set inserts](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>Mouser | 4 | | M2 brass heat-stake/ultrasonic insert, straight wall, thru-threaded, 4.00 mm long, knurl about 3.73 mm, hole 3.23 mm (PEM IUTB-M2) | M2 brass heat-set inserts in the cover | USD 1.84 per unit at 1; USD 1.06 at 100 units, checked 2026-11-07 (note 6) | USD 1.84 / USD 1.06 | [Mouser 153-IUTB-M2](https://www.mouser.com/en/ProductDetail/SI/IUTB-M2?qs=7MVldsJ5Uaxqa%252BXpG0YdCg%3D%3D) |-| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-ballast.png?v=8b0f6334" width="64" alt="Ballast plate (OPTIONAL)"></a><br>**[Ballast plate (OPTIONAL)](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>McMaster-Carr | 1 | | Low-carbon steel 20 x 14 x 2 mm, rounded, insulated (estimate cut from 1/16 in x 3/4 in 1018 bar) | optional steel ballast | USD 0.075 per unit at 1; USD 0.075 at 100 units, checked 2026-11-07 (note 7) | USD 0.075 / USD 0.075 (optional, not in total) | [McMaster-Carr 7702N146](https://www.mcmaster.com/product/7702N146/) |-| <a href="https://wiki.adom.inc/john/rc0402fr-075k1l"><img src="docs/parts/rc0402fr-075k1l.png?v=d854fe24" width="64" alt="RC0402FR-075K1L"></a><br>**[RC0402FR-075K1L](https://wiki.adom.inc/john/rc0402fr-075k1l)**<br>Yageo | 3 | R1 R2 R3 | 5.1k | 5.1k (input) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.300 / USD 0.021 | [Mouser 603-RC0402FR-075K1L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-075K1L?qs=YUgVZYePFqCSmQuaha43RA%3D%3D) |+| <br>**1317**<br>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](https://www.mouser.com/c/?q=485-1317) |+| <a href="https://wiki.adom.inc/john/rc0402fr-075k1l"><img src="docs/parts/rc0402fr-075k1l.png?v=d854fe24" width="64" alt="RC0402FR-075K1L"></a><br>**[RC0402FR-075K1L](https://wiki.adom.inc/john/rc0402fr-075k1l)**<br>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-07 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-075K1L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-075K1L?qs=YUgVZYePFqCSmQuaha43RA%3D%3D) | | <a href="https://wiki.adom.inc/adom/cc0603krx5r7bb475"><img src="docs/parts/cc0603krx5r7bb475.png?v=3c30bab9" width="64" alt="CC0603KRX5R7BB475"></a><br>**[CC0603KRX5R7BB475](https://wiki.adom.inc/adom/cc0603krx5r7bb475)**<br>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-07 | USD 0.480 / USD 0.170 | [Mouser 603-CC603KRX5R7BB475](https://www.mouser.com/en/ProductDetail/YAGEO/CC0603KRX5R7BB475?qs=57cj7OiSijmnlq47szjeyw%3D%3D) |+| <br>**RC0402FR-0713KL**<br>Yageo | 1 | R3 | 13k | 13k (charger) | Unknown (not checked) | Unknown (not checked) / Unknown (not checked) | [Mouser 603-RC0402FR-0713KL](https://www.mouser.com/c/?q=RC0402FR-0713KL) | | <a href="https://wiki.adom.inc/adom/rc0402fr-0768kl"><img src="docs/parts/rc0402fr-0768kl.png?v=d854fe24" width="64" alt="RC0402FR-0768KL"></a><br>**[RC0402FR-0768KL](https://wiki.adom.inc/adom/rc0402fr-0768kl)**<br>Yageo | 1 | R4 | 68k | 68k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.100 / USD 0.007 | [Mouser 603-RC0402FR-0768KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0768KL?qs=Is6ZsIPfHkZqrkXGHvEfjA%3D%3D) | | <a href="https://wiki.adom.inc/john/rc0402fr-07100kl"><img src="docs/parts/rc0402fr-07100kl.png?v=d854fe24" width="64" alt="RC0402FR-07100KL"></a><br>**[RC0402FR-07100KL](https://wiki.adom.inc/john/rc0402fr-07100kl)**<br>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-07 | USD 0.800 / USD 0.056 | [Mouser 603-RC0402FR-07100KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100KL?qs=mnq%2FyloZIXzTlUn7JAHSWg%3D%3D) | | <a href="https://wiki.adom.inc/adom/rc0402fr-07150kl"><img src="docs/parts/rc0402fr-07150kl.png?v=d854fe24" width="64" alt="RC0402FR-07150KL"></a><br>**[RC0402FR-07150KL](https://wiki.adom.inc/adom/rc0402fr-07150kl)**<br>Yageo | 2 | R7 R15 | 150k | 150k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-07150KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07150KL?qs=UOUeRUa%252B8Wn3KcUL8sT7JA%3D%3D) |@@ -189,64 +265,50 @@ Every part of one Ghost Hand, with its live price, the break a build reaches and | <a href="https://wiki.adom.inc/john/rc0402fr-0710kl"><img src="docs/parts/rc0402fr-0710kl.png?v=d854fe24" width="64" alt="RC0402FR-0710KL"></a><br>**[RC0402FR-0710KL](https://wiki.adom.inc/john/rc0402fr-0710kl)**<br>Yageo | 2 | R14 R18 | 10k | 10k (receiver) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-0710KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0710KL?qs=I1mnnYJTTsxUoNwrUsQExA%3D%3D) | | <a href="https://wiki.adom.inc/adom/grm1555c1h4r7wa01d"><img src="docs/parts/grm1555c1h4r7wa01d.png?v=fec952b1" width="64" alt="GRM1555C1H4R7WA01D"></a><br>**[GRM1555C1H4R7WA01D](https://wiki.adom.inc/adom/grm1555c1h4r7wa01d)**<br>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-07 | USD 0.130 / USD 0.042 | [Mouser 81-GRM1555C1H4R7WA1D](https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H4R7WA01D?qs=ouTquLLW2S5qwZJBh3x8FA%3D%3D) | | <a href="https://wiki.adom.inc/part-request/cVJEFouFMqWLi9DTBUq9wLbW4NAleHWO"><img src="docs/parts/grm1555c1h102ja01d.png?v=fec952b1" width="64" alt="GRM1555C1H102JA01D"></a><br>**[GRM1555C1H102JA01D](https://wiki.adom.inc/part-request/cVJEFouFMqWLi9DTBUq9wLbW4NAleHWO)**<br>Murata Electronics<br>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-07 | USD 0.110 / USD 0.020 | [Mouser 81-GRM1555C1H102JA1D](https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H102JA01D?qs=%2FOTtAhf8R8ZL4biNptvoUQ%3D%3D) |-| <a href="https://wiki.adom.inc/adom/rc0603fr-0712rl"><img src="docs/parts/rc0603fr-0712rl.png?v=83f5a507" width="64" alt="RC0603FR-0712RL"></a><br>**[RC0603FR-0712RL](https://wiki.adom.inc/adom/rc0603fr-0712rl)**<br>Yageo | 3 | R19 R22 R23 | 12R | 12R (emitter) | USD 0.100 each at 1; USD 0.008 at 100 units (buy 100+), checked 2026-11-07 | USD 0.300 / USD 0.024 | [Mouser 603-RC0603FR-0712RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0603FR-0712RL?qs=uM1JSSdPjODV%252BWweQ64ZaA%3D%3D) |+| <br>**RC0603FR-078R2L**<br>Yageo | 3 | R19 R22 R23 | 8.2R | 8.2R (emitter) | Unknown (not checked) | Unknown (not checked) / Unknown (not checked) | [Mouser 603-RC0603FR-078R2L](https://www.mouser.com/c/?q=RC0603FR-078R2L) | | <a href="https://wiki.adom.inc/adom/rc0402fr-07100rl"><img src="docs/parts/rc0402fr-07100rl.png?v=d854fe24" width="64" alt="RC0402FR-07100RL"></a><br>**[RC0402FR-07100RL](https://wiki.adom.inc/adom/rc0402fr-07100rl)**<br>Yageo | 2 | R20 R24 | 100R | 100R (emitter) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-07100RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100RL?qs=V1yeUXFNrknwaJOOZ4yDtg%3D%3D) | | <a href="https://wiki.adom.inc/adom/jmk316bj107ml-t"><img src="docs/parts/jmk316bj107ml-t.png?v=41b087be" width="64" alt="JMK316BJ107ML-T"></a><br>**[JMK316BJ107ML-T](https://wiki.adom.inc/adom/jmk316bj107ml-t)**<br>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-07 | USD 1.07 / USD 0.488 | [Mouser 963-JMK316BJ107ML-T](https://www.mouser.com/en/ProductDetail/TAIYO-YUDEN/JMK316BJ107ML-T?qs=I6KAKw0tg2ze5%252Bz37ec%2FZg%3D%3D) | | <a href="https://wiki.adom.inc/adom/rc0402fr-0733rl"><img src="docs/parts/rc0402fr-0733rl.png?v=d854fe24" width="64" alt="RC0402FR-0733RL"></a><br>**[RC0402FR-0733RL](https://wiki.adom.inc/adom/rc0402fr-0733rl)**<br>Yageo | 1 | R27 | 33R | 33R (lights) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-07 | USD 0.100 / USD 0.007 | [Mouser 603-RC0402FR-0733RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0733RL?qs=V1yeUXFNrkk7PcMc%252BKdghg%3D%3D) | -**Per unit: USD 48.88 building 1, USD 21.64 each building 100** (electronics and battery USD 29.96 / 18.58).--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: adhesives and sealant: window rebate fillet, pipe shoulder bonds, tether anchor, flexible foot-ring adhesive, spacer bond and neutral-cure electronics sealant are not yet chosen (compatibility coupons pending) and use well under a gram each; battery-safe removable adhesive pad: product not chosen; negligible cost per unit; ASA-compatible clear exterior coating: product not yet proven on a coupon; small consumable amount; ballast insulation (tape or sleeve): product not specified; negligible; SLA post-processing consumables (IPA wash, sanding papers 800 to 3000 grit, polish): shared shop consumables, not per-part materials; laser marking, print labour, machine time, shipping and sales tax: process costs, not materials; assembly labour, PCB assembly fees, tax and shipping.+**Per unit: USD 27.56 building 1, USD 16.54 each building 100** (electronics and battery USD 27.56 / 16.54). Partial: unpriced RC0402FR-0713KL, RC0603FR-078R2L. -1. **Base + cover + battery spacer (printed):** STL solid volume base 8.5417 + cover 9.9544 + spacer 2.1787 = 20.675 cm3 x 1.07 g/cm3 = 22.12 g, plus 10 percent purge/support allowance = 24.33 g. Solid volume x density, upper bound: base and cover print at 35 percent gyroid with 5 walls, so their real mass is lower (the spacer prints 100 percent solid). Price $20.73/800 g = $0.0259/g, an 18 percent sale price (list $25.92/spool); at list price the unit cost would be $0.788. 100 units need about 2.43 kg = 4 spools ($82.92 outlay); no price break applies. Prusa states the ASA is UV stable. Excludes shipping and tax.-2. **Perimeter gasket + four screw seals + USB stopper/tether (printed):** STL volume gasket 0.2686 + screw seals (all four) 0.0221 + USB plug/tether 0.497 = 0.7877 cm3 x 1.21 g/cm3, plus 10 percent allowance = 1.048 g. These parts print 100 percent solid, so the volume figure is close to actual. Prusa's page states an ether-diol TPU with high hydrolysis resistance. Price $26.24/500 g = $0.0525/g, a 24 percent sale price (list $34.99). 100 units use about 105.0 g, still one spool. Excludes shipping and tax.-3. **Foot ring (printed):** STL volume 0.7134 cm3 x 1.21 g/cm3 (85A density not given on the listing; 1.21 assumed, real 85A grades are about 1.1 to 1.2), plus 10 percent allowance = 0.95 g; prints 100 percent solid. Price $47.99/750 g = $0.064/g. The listing does not state a polyether base: confirm on the TDS before buying if hydrolysis resistance matters. The Prusa URL for the BASF Ultrafuse 85A now serves this Bedrock 3D product. Teal is not offered. 100 units use about 94 g, still one spool. Excludes shipping and tax.-4. **Main logo light pipe + four gauge pipes + front IR window (SLA):** STL volume main pipe 0.1764 + four gauge pipes 0.0672 + IR window 0.2396 = 0.4832 cm3, taken as mL of resin, plus 30 percent support/raft/waste allowance = 0.628 mL. Price $119.00/1000 mL = $0.119/mL. The Formlabs store itself refused the request (HTTP 429), so a US reseller price is used; the page shows $ without naming the currency. 100 units use about 63 mL, still one cartridge. Excludes IPA wash, shipping and tax.-5. **Cover screws:** 4 x $0.02656 each at the 1-carton price. 100 units use 400 screws, still one carton, so there is no break. Mouser and DigiKey searches found no A4/316 M2 x 12 pan head (Mouser only had unspecified-grade Essentra 50M020040P012 and 18-8 APM Hexseal seal screws). A small pack of 316 could not be confirmed: the Zoro listing returned HTTP 403 and BelMetric shows no price. ISO 7045 allows head diameter up to 4.0 mm, above the README's 3.8 mm limit (counterbore is 4.2 mm): check the supplier drawing. Stock not shown on the page. Excludes shipping and tax.-6. **Heat-set inserts:** Build of 1: 4 pcs at $0.46. Build of 100: 400 pcs hit the 100-pc break at $0.266 ($106.40 outlay). 14,446 in stock at Mouser (factory lead time 143 days). Dimensions from the PEM catalog page: length 4.00 mm, recommended hole 3.23 mm, minimum hole depth 4.76 mm, deeper than the README's 4.5 mm pocket: check fit or choose a shorter insert. Excludes shipping and tax.-7. **Ballast plate (OPTIONAL):** Optional. Cut-to-size estimate: 14 mm pieces from a 1829 mm bar with 1.5 mm kerf gives about 118 pieces, so $8.86/118 = $0.075 of material each; one bar covers 100 units. This stock is 1.59 mm thick and 19.05 mm wide, close to but not the 20 x 14 x 2 mm spec; 2 mm stock would cost a similar amount. Plate mass at spec is about 4.4 g (0.56 cm3 x 7.85). Excludes cutting, deburring, rounding and insulation labour and materials.-8. **Bare PCB:** Estimate only. The board is made by a 3rd party fab; this public price list is used as an independent reference and is not the fab's price. Area 12.32 cm2. Build of 1: minimum order of 3 = EUR 14.48 = $16.16, all charged to the one unit. Build of 100: 102 boards (sets of 3) = EUR 96.19 = $107.4, $1.074 per unit. ENIG Budget (EUR 0.097/cm2) would be $17.4 for 1 and $1.495 per unit at 100. Prices are net of VAT; the page says shipping is covered by the job fee. Green mask is standard (AISLER portfolio page). The pricing post is dated 2023-08-27 and its worked example uses a different rate (0.051 EUR/cm2), so treat as indicative. Converted at the ECB reference rate 1.1165 USD/EUR of 2026-11-06.+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: case parts and hardware: waiting for the rev 2 case (case/mech_costs.json); assembly labour, PCB assembly fees, tax and shipping. -The sourcing BOM with stock checks and every price column is [docs/fab/ghost-hand-sourcing-bom.csv](docs/fab/ghost-hand-sourcing-bom.csv).+The sourcing BOM with stock checks and every price column is [docs/fab/ghost-hand-rev2-sourcing-bom.csv](docs/fab/ghost-hand-rev2-sourcing-bom.csv). ## Board -The board is an Adom molecule designed with Adom AI Flow in KiCad: schematic, placement, routing, copper-pours, current and heat analysis, silkscreen and 3D, on a 3rd party fab's 2-layer rules. Its four corner-machine pins are the same pins that seat it in an Adom workcell, and in the case they press into-printed sockets that hold the 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 26 x 18 mm span:+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/](board/README.md). -### The finished board--| | |-|---|---|-| Parts | 68 fitted, 32 BOM lines on the board plus BT1 (battery, off-board, do-not-place line), every placement rotation checked |-| Routing | 1136 mm of track in 1051 segments, 153 vias, 0 DRC errors, 0 unconnected |-| Copper | GND pours on both layers, wider VBAT and VBUS, heat-spreading copper under the charger |-| Current and heat | peak 44 A/mm2, +37 C peak rise in still air while charging (Adom Fields) |-| Checks | ERC 0, netlist parity 217 of 217 pins, zone fills current in the Gerbers |-| 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 |+The board is being laid out now; the finished board, its checks and its fab files appear here when AI Flow exports it. ## 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 gives about 10 years on the counter between charges.+**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.-- **Rev B 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:+- **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.- The finished rev A board is not re-laid out for this.+ 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 rev A? |+| 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](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1616-MNR?qs=HXFqYaX1Q2yKNpuKQU9qww%3D%3D)<br>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](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1606-MNR?qs=u16ybLDytRanDU%2F7volyWw%3D%3D)<br>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 |@@ -255,7 +317,7 @@ The board's own page, written by AI Flow, is in [board/](board/README.md). | [MSPM0L1306SRGER](https://www.mouser.com/en/ProductDetail/Texas-Instruments/MSPM0L1306SRGER?qs=ulEaXIWI0c8A7hoirNenxw%3D%3D)<br>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](https://www.mouser.com/en/ProductDetail/Texas-Instruments/MSPM0C1104SDDFR?qs=dbcCsuKDzFV0JvqjQIWgGw%3D%3D)<br>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: 425 mAh usable, the rest of the board sleeping at 4.6 uA. Sleep figures:+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.@@ -266,9 +328,9 @@ ATtiny806, 416 and the other 8 KB and 4 KB parts are too small for the 13.1 KB f ## The AI Flow run -The board went from the prompt to fab files in one measured [Adom AI Flow](https://wiki.adom.inc/adom/adom-aiflow) run, all 25 steps: intake, requirements, sourcing, test plan, schematic, placement, routing, vias, copper pours, current, thermal, Adom Fields, silkscreen, 3D, finish and export. Every step left its proof, screenshots and clips in the page repo. The run, step by step: [board-claude-opus-5-5-20261106-1434](docs/runs/board-claude-opus-5-5-20261106-1434/README.md), [ghost-hand-claude-opus-5-5-20261106-1434](docs/runs/ghost-hand-claude-opus-5-5-20261106-1434/README.md). Build clips: [docs/clips.md](docs/clips.md).+Each board went from the prompt to fab files in one measured [Adom AI Flow](https://wiki.adom.inc/adom/adom-aiflow) 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](docs/runs/board-claude-opus-5-5-20261106-1434/README.md), [board-claude-opus-5-5-20261108-1620](docs/runs/board-claude-opus-5-5-20261108-1620/README.md), [ghost-hand-claude-opus-5-5-20261106-1434](docs/runs/ghost-hand-claude-opus-5-5-20261106-1434/README.md). Build clips: [docs/clips.md](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 this build:+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](https://wiki.adom.inc/adom/adom-aiflow/issues/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](https://wiki.adom.inc/adom/adom-aiflow/issues/166): flat test-pad 3D models were flagged as upside down@@ -277,7 +339,7 @@ When a tool got in the way, the board thread fixed it at the source instead of w ## How it was built: three AI threads in Hydrogen -Ghost Hand was built in one day by three AI threads working side by side in Adom Hydrogen, each owning+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 |@@ -294,22 +356,11 @@ screen: the chat on the left, the AI Flow dashboard, the Studio and this page in ## Case -The 3D view at the top of this page is the assembled gadget: open its Layers panel to hide the case shell, the light pipes or the battery, and press Replay to watch it assemble.---------A 54 x 44 mm pebble for a wet sink counter. The roof follows the board's 12 degree nose-up pitch, so drips run off toward the back and the dark front window aims the IR up at the faucet's sensor, with separate transmit and receive openings and an opaque barrier between them. The board's four machine pins press into split printed collets that squeeze them, the same pins that seat it in an Adom workcell. The LiPo lies flat under the board on its own spacer, which also holds an optional steel ballast plate. A TPU gasket seals the seam, a tethered TPU stopper seals the USB-C tunnel, every screw enters from below through a TPU seal, and a TPU ring is the non-slip foot. Five clear-resin light pipes carry the WS2812 lights to the top: the main one is the Adom logo and four pills make the battery gauge. A UV fiber laser engraves the light names on the case. Design notes, print settings and assembly: [case/README.md](case/README.md); engraving guide: [case/laser_engrave.md](case/laser_engrave.md); parametric source: [case/ghost_hand_case.py](case/ghost_hand_case.py).--+The rev 2 case is being built now, about half of rev 1's footprint and much lower: the same sealed seam with a TPU gasket, sealed USB-C, non-slip foot and pin sockets that squeeze the machine pins, an IR window at the 5 degree tilt, five 1.5 mm clear-resin light pipes, and UV laser names for each light. Its files appear here when it is done; rev 1's case is in the [0.1.0 release](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip). ## Firmware -Plain C for the ATtiny1616 (avr-gcc, about 13.1 KB of the 16 KB flash). The echo path is pure hardware:+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) (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/](firmware/README.md), with a host test that runs the learner against simulated faucets@@ -327,21 +378,37 @@ lights and the safety checks, and a 1 s watchdog guards the main loop. Full sour ## Ghost Hand Studio -The build dashboard: an Adom app that shows the architecture, the faucet and its beam, the learning state+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.  +## Revisions++| | Rev 1 (0.1.0) | Rev 2 (0.2.0) |+|---|---|---|+| Case on the counter | 54 x 44 mm, 27 mm tall | about 38 x 32 mm, 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 | 39 days at six sessions a day, 168 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 emitter resistors | 12 ohm | 8.2 ohm, for the off-axis counter spots |+| 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](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip) ([Gerbers](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-gerbers.zip)).+ ## Downloads | | | |---|---|-| Case STEP | [ballast.step](case/step/ballast.step), [base.step](case/step/base.step), [battery.step](case/step/battery.step), [cover.step](case/step/cover.step), [foot.step](case/step/foot.step), [gasket.step](case/step/gasket.step), [ghost-hand-assembly.step](case/step/ghost-hand-assembly.step), [ghost-hand-exploded.step](case/step/ghost-hand-exploded.step), [ir_window.step](case/step/ir_window.step), [lightpipe_100.step](case/step/lightpipe_100.step), [lightpipe_25.step](case/step/lightpipe_25.step), [lightpipe_50.step](case/step/lightpipe_50.step), [lightpipe_75.step](case/step/lightpipe_75.step), [lightpipe_main.step](case/step/lightpipe_main.step), [print-layout.step](case/step/print-layout.step), [screw_seals.step](case/step/screw_seals.step), [spacer.step](case/step/spacer.step), [usb_plug.step](case/step/usb_plug.step) |-| Case STL (print) | [base.stl](case/stl/base.stl), [cover.stl](case/stl/cover.stl), [foot.stl](case/stl/foot.stl), [gasket.stl](case/stl/gasket.stl), [ir_window.stl](case/stl/ir_window.stl), [lightpipe_100.stl](case/stl/lightpipe_100.stl), [lightpipe_25.stl](case/stl/lightpipe_25.stl), [lightpipe_50.stl](case/stl/lightpipe_50.stl), [lightpipe_75.stl](case/stl/lightpipe_75.stl), [lightpipe_main.stl](case/stl/lightpipe_main.stl), [screw_seals.stl](case/stl/screw_seals.stl), [spacer.stl](case/stl/spacer.stl), [usb_plug.stl](case/stl/usb_plug.stl) |-| Laser engraving SVG | [laser_engrave.svg](case/laser_engrave.svg) |-| Board fab files (Gerbers and drill, BOM, CPL, 3D) | [ghost-hand-gerbers.zip](docs/fab/ghost-hand-gerbers.zip), [ghost-hand-bom.csv](docs/fab/ghost-hand-bom.csv), [ghost-hand-sourcing-bom.csv](docs/fab/ghost-hand-sourcing-bom.csv), [ghost-hand-cpl.csv](docs/fab/ghost-hand-cpl.csv), [ghost-hand-board.glb](docs/fab/ghost-hand-board.glb) |-| Board files from AI Flow | [ghost-hand-board-pcm-1.0.0.zip](board/pcm/ghost-hand-board-pcm-1.0.0.zip), [repository.json](board/pcm/repository.json) |+| Sourcing BOM | [ghost-hand-rev2-sourcing-bom.csv](docs/fab/ghost-hand-rev2-sourcing-bom.csv) |+| Aim drawings and numbers | [side-view.svg](docs/aim/side-view.svg), [top-view.svg](docs/aim/top-view.svg), [aim.json](docs/aim/aim.json) | | Firmware | [ghost-hand.hex](firmware/build/ghost-hand.hex), [source](firmware/README.md) |+| Rev 1 | [design zip](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip), [Gerbers](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-gerbers.zip) |++Rev 2 Gerbers, BOM and CPL appear here when AI Flow exports the finished board. ## License
docs/aim/aim.jsonadded+264@@ -0,0 +1,264 @@+{+ "title": "Ghost Hand rev 2 aim geometry",+ "date": "2026-11-08",+ "sources": {+ "faucet": "Moen 8551 spec sheet rev 3/17",+ "emitters": "Vishay VSMY2853SL, VSMB2948SL",+ "receiver": "Vishay VEMD2023SLX01"+ },+ "faucet": {+ "column_deep_mm": 57.0,+ "column_wide_mm": 53.0,+ "height_mm": 166,+ "spout_mm": 155,+ "outlet_mm": 142,+ "window_h_mm": 40.0,+ "window_h_current_units_mm": 56.0,+ "lip_gap_max_mm": 25.0+ },+ "half_angles_deg": {+ "VSMY2853SL": 28.0,+ "VSMB2948SL": 25.0,+ "VEMD2023SLX01": 35.0+ },+ "ghost_hand": {+ "emitter_height_mm": 9.0,+ "placements_mm": [+ 100.0,+ 350.0+ ]+ },+ "elevation_deg": {+ "at_100": 17.2,+ "at_350": 5.1,+ "at_100_56mm": 25.2,+ "at_350_56mm": 7.6,+ "formula": "tilt = atan((window height - emitter height) / distance)"+ },+ "tilt": {+ "chosen_deg": 5,+ "optimum_deg": 5.0,+ "rule": "maximise the worst link margin over 100 to 350 mm; signal falls as 1/d^2 so the far end limits and the beam axis points at the window from 350 mm",+ "rev1_deg": 12.0,+ "worst_margin": {+ "tilt_0": 6.3,+ "tilt_5": 6.5,+ "tilt_12": 6.2+ },+ "worst_margin_56mm": {+ "tilt_0": 5.9,+ "tilt_5": 6.2,+ "tilt_12": 6.1+ }+ },+ "table": [+ {+ "d_mm": 100,+ "elev_40_deg": 17.2,+ "rel940_40_tilt0": 0.72,+ "rel940_40_tilt5": 0.85,+ "rel940_40_tilt12": 0.97,+ "rel850_40_tilt5": 0.88,+ "relPD_40_tilt5": 0.92,+ "margin_40_tilt5": 50.8,+ "elev_56_deg": 25.2,+ "rel940_56_tilt0": 0.5,+ "rel940_56_tilt5": 0.64,+ "rel940_56_tilt12": 0.83,+ "rel850_56_tilt5": 0.7,+ "relPD_56_tilt5": 0.8,+ "margin_56_tilt5": 26.5+ },+ {+ "d_mm": 150,+ "elev_40_deg": 11.7,+ "rel940_40_tilt0": 0.86,+ "rel940_40_tilt5": 0.95,+ "rel940_40_tilt12": 1.0,+ "rel850_40_tilt5": 0.96,+ "relPD_40_tilt5": 0.98,+ "margin_40_tilt5": 30.0,+ "elev_56_deg": 17.4,+ "rel940_56_tilt0": 0.72,+ "rel940_56_tilt5": 0.85,+ "rel940_56_tilt12": 0.97,+ "rel850_56_tilt5": 0.88,+ "relPD_56_tilt5": 0.92,+ "margin_56_tilt5": 22.3+ },+ {+ "d_mm": 200,+ "elev_40_deg": 8.8,+ "rel940_40_tilt0": 0.92,+ "rel940_40_tilt5": 0.98,+ "rel940_40_tilt12": 0.99,+ "rel850_40_tilt5": 0.99,+ "relPD_40_tilt5": 0.99,+ "margin_40_tilt5": 18.5,+ "elev_56_deg": 13.2,+ "rel940_56_tilt0": 0.83,+ "rel940_56_tilt5": 0.93,+ "rel940_56_tilt12": 1.0,+ "rel850_56_tilt5": 0.94,+ "relPD_56_tilt5": 0.96,+ "margin_56_tilt5": 15.8+ },+ {+ "d_mm": 250,+ "elev_40_deg": 7.1,+ "rel940_40_tilt0": 0.95,+ "rel940_40_tilt5": 1.0,+ "rel940_40_tilt12": 0.97,+ "rel850_40_tilt5": 1.0,+ "relPD_40_tilt5": 1.0,+ "margin_40_tilt5": 12.3,+ "elev_56_deg": 10.6,+ "rel940_56_tilt0": 0.88,+ "rel940_56_tilt5": 0.97,+ "rel940_56_tilt12": 1.0,+ "rel850_56_tilt5": 0.97,+ "relPD_56_tilt5": 0.98,+ "margin_56_tilt5": 11.2+ },+ {+ "d_mm": 300,+ "elev_40_deg": 5.9,+ "rel940_40_tilt0": 0.96,+ "rel940_40_tilt5": 1.0,+ "rel940_40_tilt12": 0.96,+ "rel850_40_tilt5": 1.0,+ "relPD_40_tilt5": 1.0,+ "margin_40_tilt5": 8.7,+ "elev_56_deg": 8.9,+ "rel940_56_tilt0": 0.92,+ "rel940_56_tilt5": 0.98,+ "rel940_56_tilt12": 0.99,+ "rel850_56_tilt5": 0.99,+ "relPD_56_tilt5": 0.99,+ "margin_56_tilt5": 8.2+ },+ {+ "d_mm": 350,+ "elev_40_deg": 5.1,+ "rel940_40_tilt0": 0.97,+ "rel940_40_tilt5": 1.0,+ "rel940_40_tilt12": 0.95,+ "rel850_40_tilt5": 1.0,+ "relPD_40_tilt5": 1.0,+ "margin_40_tilt5": 6.5,+ "elev_56_deg": 7.6,+ "rel940_56_tilt0": 0.94,+ "rel940_56_tilt5": 0.99,+ "rel940_56_tilt12": 0.98,+ "rel850_56_tilt5": 0.99,+ "relPD_56_tilt5": 1.0,+ "margin_56_tilt5": 6.2+ }+ ],+ "link_model": {+ "hand_return_W_m2": 0.1045,+ "I_940_W_sr": 0.0853,+ "I_850_W_sr": 0.0966,+ "pd_threshold_nA": 36.0,+ "margin_ok": 2.0,+ "margin_works": 1.0,+ "r_emit_ohm": 8.2,+ "note": "echo margin = our echo at the faucet receiver / a hand at 5.5 in on axis (the faucet's own trigger level); rx margin = faucet pulse photocurrent / our comparator threshold; low battery, 940 nm only"+ },+ "assumptions": [+ "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 9 mm above the counter, turned by the user to face the window",+ "two photodiodes and the rev 1 receiver chain and threshold; emitters behind 8.2 ohm (rev 1: 12), low battery 3.45 V"+ ],+ "zone": {+ "rx30_6dB": {+ "area_cm2": 264.0,+ "per_side": true,+ "d_mm": [+ 357,+ 500+ ],+ "off_axis_deg": [+ 0,+ 37+ ]+ },+ "rx45_6dB": {+ "area_cm2": 421.0,+ "per_side": true,+ "d_mm": [+ 299,+ 500+ ],+ "off_axis_deg": [+ 0,+ 52+ ]+ },+ "rx30_works": {+ "area_cm2": 395.0,+ "per_side": true,+ "d_mm": [+ 309,+ 500+ ],+ "off_axis_deg": [+ 0,+ 50+ ]+ },+ "rx45_works": {+ "area_cm2": 531.0,+ "per_side": true,+ "d_mm": [+ 249,+ 500+ ],+ "off_axis_deg": [+ 0,+ 60+ ]+ },+ "spot_mm": [+ 215.0,+ 230.0+ ],+ "spot": {+ "d": 314.8,+ "beta": 5.6,+ "yaw": 43.1,+ "theta_f": 43.4,+ "gh_err": 0.6,+ "m_echo": 1.8,+ "m_rx": 4.2,+ "m": 1.8+ },+ "spot_56mm": {+ "d": 314.8,+ "beta": 8.5,+ "yaw": 43.1,+ "theta_f": 43.7,+ "gh_err": 3.5,+ "m_echo": 1.7,+ "m_rx": 4.0,+ "m": 1.7+ },+ "spot_front_mm": [+ 60.0,+ 450.0+ ],+ "spot_front": {+ "d": 454.0,+ "beta": 3.9,+ "yaw": 7.6,+ "theta_f": 8.5,+ "gh_err": -1.1,+ "m_echo": 3.7,+ "m_rx": 8.9,+ "m": 3.7+ }+ }+}
docs/aim/side-view-068b0058.pngadded⋯ 1 unchanged line ⋯
docs/aim/side-view.svgadded+428@@ -0,0 +1,428 @@+<?xml version="1.0" encoding="utf-8" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="792pt" height="360pt" viewBox="0 0 792 360" xmlns="http://www.w3.org/2000/svg" version="1.1">+ <metadata>+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">+ <cc:Work>+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>+ <dc:date>2026-11-08T10:34:01.092768</dc:date>+ <dc:format>image/svg+xml</dc:format>+ <dc:creator>+ <cc:Agent>+ <dc:title>Matplotlib v3.11.2, https://matplotlib.org/</dc:title>+ </cc:Agent>+ </dc:creator>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <defs>+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>+ </defs>+ <g id="figure_1">+ <g id="patch_1">+ <path d="M 0 360 +L 792 360 +L 792 0 +L 0 0 +z+" style="fill: #ffffff"/>+ </g>+ <g id="axes_1">+ <g id="patch_2">+ <path d="M 75.136754 278.478182 +L 677.345548 278.478182 +L 677.345548 243.735367 +L 75.136754 243.735367 +z+" clip-path="url(#p5f7be69322)" style="fill: #d9cdb4; stroke: #d9cdb4; stroke-linejoin: miter"/>+ </g>+ <g id="patch_3">+ <path d="M 159.677604 243.735367 +L 202.527076 243.735367 +Q 214.108014 243.735367 214.108014 232.154429 +L 214.108014 63.072729 +Q 214.108014 51.491791 202.527076 51.491791 +L 159.677604 51.491791 +Q 148.096666 51.491791 148.096666 63.072729 +L 148.096666 232.154429 +Q 148.096666 243.735367 159.677604 243.735367 +z+" clip-path="url(#p5f7be69322)" style="fill: #e9edf2; stroke: #9aa5b4; stroke-width: 1.2; stroke-linejoin: miter"/>+ </g>+ <g id="patch_4">+ <path d="M 153.887135 51.491791 +L 327.60121 70.021292 +L 327.60121 79.286043 +L 208.317545 79.286043 +L 208.317545 70.021292 +z+" clip-path="url(#p5f7be69322)" style="fill: #e9edf2; stroke: #9aa5b4; stroke-width: 1.2; stroke-linejoin: miter"/>+ </g>+ <g id="patch_5">+ <path d="M 211.791827 203.202083 +L 215.266108 203.202083 +L 215.266108 191.621145 +L 211.791827 191.621145 +z+" clip-path="url(#p5f7be69322)" style="fill: #202020; stroke: #202020; stroke-linejoin: miter"/>+ </g>+ <g id="patch_6">+ <path d="M 211.791827 184.672582 +L 215.266108 184.672582 +L 215.266108 173.091644 +L 211.791827 173.091644 +L 211.791827 184.672582 +z+" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #202020; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="patch_7">+ <path d="M 334.549773 242.808892 +L 362.344025 242.808892 +Q 366.9764 242.808892 366.9764 238.176517 +L 366.9764 233.312523 +Q 366.9764 228.680148 362.344025 228.680148 +L 334.549773 228.680148 +Q 329.917398 228.680148 329.917398 233.312523 +L 329.917398 238.176517 +Q 329.917398 242.808892 334.549773 242.808892 +z+" clip-path="url(#p5f7be69322)" style="fill: #2b3440; opacity: 0.35; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="patch_8">+ <path d="M 508.263848 242.808892 +L 536.0581 242.808892 +Q 540.690475 242.808892 540.690475 238.176517 +L 540.690475 233.312523 +Q 540.690475 228.680148 536.0581 228.680148 +L 508.263848 228.680148 +Q 503.631473 228.680148 503.631473 233.312523 +L 503.631473 238.176517 +Q 503.631473 242.808892 508.263848 242.808892 +z+" clip-path="url(#p5f7be69322)" style="fill: #2b3440; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="patch_9">+ <path d="M 624.073231 242.808892 +L 651.867483 242.808892 +Q 656.499859 242.808892 656.499859 238.176517 +L 656.499859 233.312523 +Q 656.499859 228.680148 651.867483 228.680148 +L 624.073231 228.680148 +Q 619.440856 228.680148 619.440856 233.312523 +L 619.440856 238.176517 +Q 619.440856 242.808892 624.073231 242.808892 +z+" clip-path="url(#p5f7be69322)" style="fill: #2b3440; opacity: 0.35; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="patch_10">+ <path d="M 434.410257 227.256451 +C 434.322171 228.263273 434.256062 229.271897 434.211978 230.281602 +C 434.167893 231.291308 434.145843 232.301855 434.145843 233.312523 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="line2d_1">+ <path d="M 75.136754 243.735367 +L 677.345548 243.735367 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #1d2530; stroke-width: 1.2; stroke-linecap: square"/>+ </g>+ <g id="line2d_2">+ <path d="M 128.409071 197.411614 +L 214.108014 197.411614 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 1,1; stroke-dashoffset: 0; stroke: #5b6675; stroke-width: 0.5"/>+ </g>+ <g id="line2d_3">+ <path d="M 112.195757 178.882113 +L 214.108014 178.882113 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 1,1; stroke-dashoffset: 0; stroke: #5b6675; stroke-width: 0.5"/>+ </g>+ <g id="line2d_4">+ <path d="M 329.917398 233.312523 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #e0425b; stroke-opacity: 0.35; stroke-width: 1.5; stroke-linecap: square"/>+ <defs>+ <path id="m98e9ca465e" d="M 0 1.5 +C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 +C 1.341951 0.77937 1.5 0.397805 1.5 0 +C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 +C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 +C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 +C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 +C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 +C -0.77937 1.341951 -0.397805 1.5 0 1.5 +z+" style="stroke: #e0425b; stroke-opacity: 0.35"/>+ </defs>+ <g clip-path="url(#p5f7be69322)">+ <use xlink:href="#m98e9ca465e" x="329.917398" y="233.312523" style="fill: #e0425b; fill-opacity: 0.35; stroke: #e0425b; stroke-opacity: 0.35"/>+ </g>+ </g>+ <g id="line2d_5">+ <path d="M 329.917398 233.312523 +L 214.108014 197.411614 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 0.9,1.485; stroke-dashoffset: 0; stroke: #e0425b; stroke-width: 0.9"/>+ </g>+ <g id="line2d_6">+ <path d="M 329.917398 233.312523 +L 214.108014 178.882113 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 0.7,1.155; stroke-dashoffset: 0; stroke: #f2994a; stroke-width: 0.7"/>+ </g>+ <g id="line2d_7">+ <path d="M 503.631473 233.312523 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #e0425b; stroke-width: 1.5; stroke-linecap: square"/>+ <defs>+ <path id="ma7637f08c1" d="M 0 1.5 +C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 +C 1.341951 0.77937 1.5 0.397805 1.5 0 +C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 +C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 +C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 +C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 +C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 +C -0.77937 1.341951 -0.397805 1.5 0 1.5 +z+" style="stroke: #e0425b"/>+ </defs>+ <g clip-path="url(#p5f7be69322)">+ <use xlink:href="#ma7637f08c1" x="503.631473" y="233.312523" style="fill: #e0425b; stroke: #e0425b"/>+ </g>+ </g>+ <g id="line2d_8">+ <path d="M 503.631473 233.312523 +L 214.108014 197.411614 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #e0425b; stroke-width: 0.9; stroke-linecap: square"/>+ </g>+ <g id="line2d_9">+ <path d="M 503.631473 233.312523 +L 214.108014 178.882113 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 0.7,1.155; stroke-dashoffset: 0; stroke: #f2994a; stroke-width: 0.7"/>+ </g>+ <g id="line2d_10">+ <path d="M 619.440856 233.312523 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #e0425b; stroke-opacity: 0.35; stroke-width: 1.5; stroke-linecap: square"/>+ <g clip-path="url(#p5f7be69322)">+ <use xlink:href="#m98e9ca465e" x="619.440856" y="233.312523" style="fill: #e0425b; fill-opacity: 0.35; stroke: #e0425b; stroke-opacity: 0.35"/>+ </g>+ </g>+ <g id="line2d_11">+ <path d="M 619.440856 233.312523 +L 214.108014 197.411614 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 0.9,1.485; stroke-dashoffset: 0; stroke: #e0425b; stroke-width: 0.9"/>+ </g>+ <g id="line2d_12">+ <path d="M 619.440856 233.312523 +L 214.108014 178.882113 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 0.7,1.155; stroke-dashoffset: 0; stroke: #f2994a; stroke-width: 0.7"/>+ </g>+ <g id="line2d_13">+ <path d="M 503.631473 233.312523 +L 330.578432 218.172344 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke: #e0425b; stroke-opacity: 0.9; stroke-width: 1.4; stroke-linecap: square"/>+ </g>+ <g id="line2d_14">+ <path d="M 503.631473 233.312523 +L 353.190671 146.455485 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #e0425b; stroke-opacity: 0.9; stroke-width: 0.8"/>+ </g>+ <g id="line2d_15">+ <path d="M 503.631473 233.312523 +L 474.994943 243.735367 +" clip-path="url(#p5f7be69322)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #e0425b; stroke-opacity: 0.9; stroke-width: 0.8"/>+ </g>+ <g id="text_1">+ <text style="font-size: 9px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #1d2530" x="671.555079" y="263.444665" transform="rotate(-0 671.555079 263.444665)">counter</text>+ </g>+ <g id="text_2">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #5b6675" transform="translate(158.75609 125.203015)">Moen 8551</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #5b6675" transform="translate(166.377965 134.805203)">column</text>+ </g>+ <g id="text_3">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(176.321561 211.967831)">window,</text>+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(167.969608 220.969882)">John's unit</text>+ </g>+ <g id="text_4">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="207.159451" y="170.131792" transform="rotate(-0 207.159451 170.131792)">current units</text>+ </g>+ <g id="patch_11">+ <path d="M 97.140537 52.386218 +Q 97.140537 147.613579 97.140537 242.84094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 95.340537 55.986218 +L 97.140537 52.386218 +L 98.940537 55.986218 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 98.940537 239.24094 +L 97.140537 242.84094 +L 95.340537 239.24094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_5">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="93.666256" y="149.821587" transform="rotate(-0 93.666256 149.821587)">166</text>+ </g>+ <g id="patch_12">+ <path d="M 131.883352 198.306041 +Q 131.883352 220.573491 131.883352 242.84094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 130.083352 201.906041 +L 131.883352 198.306041 +L 133.683352 201.906041 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 133.683352 239.24094 +L 131.883352 242.84094 +L 130.083352 239.24094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_6">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="128.409071" y="222.781499" transform="rotate(-0 128.409071 222.781499)">40</text>+ </g>+ <g id="patch_13">+ <path d="M 115.670039 179.77654 +Q 115.670039 211.30874 115.670039 242.84094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 113.870039 183.37654 +L 115.670039 179.77654 +L 117.470039 183.37654 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 117.470039 239.24094 +L 115.670039 242.84094 +L 113.870039 239.24094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_7">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="112.195757" y="213.516748" transform="rotate(-0 112.195757 213.516748)">56</text>+ </g>+ <g id="patch_14">+ <path d="M 326.706783 39.910853 +Q 237.848938 39.910853 148.991093 39.910853 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 323.106783 38.110853 +L 326.706783 39.910853 +L 323.106783 41.710853 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 152.591093 41.710853 +L 148.991093 39.910853 +L 152.591093 38.110853 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_8">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="237.848938" y="35.552673" transform="rotate(-0 237.848938 35.552673)">spout 155</text>+ </g>+ <g id="patch_15">+ <path d="M 334.549773 80.18047 +Q 334.549773 161.510705 334.549773 242.84094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 332.749773 83.78047 +L 334.549773 80.18047 +L 336.349773 83.78047 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 336.349773 239.24094 +L 334.549773 242.84094 +L 332.749773 239.24094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_9">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #5b6675" x="338.024055" y="163.719045" transform="rotate(-0 338.024055 163.719045)">outlet 142</text>+ </g>+ <g id="text_10">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #1d2530" x="522.160974" y="220.573491" transform="rotate(-0 522.160974 220.573491)">Ghost Hand</text>+ </g>+ <g id="text_11">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #e0425b" transform="translate(270.761593 132.584757)">940 nm half intensity</text>+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #e0425b" transform="translate(306.551827 141.586807)">(axis +/-25)</text>+ </g>+ <g id="text_12">+ <text style="font-weight: 700; font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #1d2530" x="427.19728" y="229.53339" transform="rotate(-0 427.19728 229.53339)">tilt 5</text>+ </g>+ <g id="patch_16">+ <path d="M 663.448422 234.20695 +Q 663.448422 238.523945 663.448422 242.84094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 661.648422 237.80695 +L 663.448422 234.20695 +L 665.248422 237.80695 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 665.248422 239.24094 +L 663.448422 242.84094 +L 661.648422 239.24094 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_13">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #5b6675" x="666.922703" y="240.732285" transform="rotate(-0 666.922703 240.732285)">9 IR axis</text>+ </g>+ <g id="patch_17">+ <path d="M 329.022971 299.323871 +Q 272.012706 299.323871 215.002442 299.323871 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 325.422971 297.523871 +L 329.022971 299.323871 +L 325.422971 301.123871 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 218.602442 301.123871 +L 215.002442 299.323871 +L 218.602442 297.523871 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_14">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="272.012706" y="296.123785" transform="rotate(-0 272.012706 296.123785)">100</text>+ </g>+ <g id="patch_18">+ <path d="M 502.737046 317.853373 +Q 358.869744 317.853373 215.002442 317.853373 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 499.137046 316.053373 +L 502.737046 317.853373 +L 499.137046 319.653373 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 218.602442 319.653373 +L 215.002442 317.853373 +L 218.602442 316.053373 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_15">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="358.869744" y="314.653287" transform="rotate(-0 358.869744 314.653287)">250</text>+ </g>+ <g id="patch_19">+ <path d="M 618.546429 336.382874 +Q 416.774435 336.382874 215.002442 336.382874 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 614.946429 334.582874 +L 618.546429 336.382874 +L 614.946429 338.182874 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 218.602442 338.182874 +L 215.002442 336.382874 +L 218.602442 334.582874 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_16">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="416.774435" y="333.182788" transform="rotate(-0 416.774435 333.182788)">350 (window to Ghost Hand IR lens)</text>+ </g>+ <g id="text_17">+ <g id="patch_20">+ <path d="M 387.822089 140.558654 +L 729.418496 140.558654 +Q 733.668496 140.558654 733.668496 136.308654 +L 733.668496 95.499357 +Q 733.668496 91.249357 729.418496 91.249357 +L 387.822089 91.249357 +Q 383.572089 91.249357 383.572089 95.499357 +L 383.572089 136.308654 +Q 383.572089 140.558654 387.822089 140.558654 +z+" style="fill: #ffffff; stroke: #cfd6df; stroke-linejoin: miter"/>+ </g>+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(387.822089 102.808859)">tilt = atan((40 - 9) / d): 17.2 at 100 mm, 5.1 at 350 mm</text>+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(387.822089 113.011183)">current units (56 mm): 25.2 at 100 mm, 7.6 at 350 mm</text>+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(387.822089 123.213507)">built at 5 deg: the window stays inside the +/-25 deg beam at every placement,</text>+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(387.822089 133.415831)">aimed where the signal is weakest (350 mm). Rev 1 was 12 deg.</text>+ </g>+ <g id="text_18">+ <text style="font-size: 10.5px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #1d2530" x="28.813001" y="17.697539" transform="rotate(-0 28.813001 17.697539)">Side view: section through the faucet window and Ghost Hand (mm, to scale)</text>+ </g>+ </g>+ </g>+ <defs>+ <clipPath id="p5f7be69322">+ <rect x="28.813001" y="23.697539" width="671.694423" height="326.582461"/>+ </clipPath>+ </defs>+</svg>
docs/aim/top-view-749108d6.pngadded⋯ 1 unchanged line ⋯
docs/aim/top-view.svgadded+2022@@ -0,0 +1,2022 @@+<?xml version="1.0" encoding="utf-8" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="720pt" height="604.8pt" viewBox="0 0 720 604.8" xmlns="http://www.w3.org/2000/svg" version="1.1">+ <metadata>+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">+ <cc:Work>+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>+ <dc:date>2026-11-08T10:34:01.731124</dc:date>+ <dc:format>image/svg+xml</dc:format>+ <dc:creator>+ <cc:Agent>+ <dc:title>Matplotlib v3.11.2, https://matplotlib.org/</dc:title>+ </cc:Agent>+ </dc:creator>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <defs>+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>+ </defs>+ <g id="figure_1">+ <g id="patch_1">+ <path d="M 0 604.8 +L 720 604.8 +L 720 0 +L 0 0 +z+" style="fill: #ffffff"/>+ </g>+ <g id="axes_1">+ <g id="patch_2">+ <path d="M 20.638023 31.578676 +L 698.415839 31.578676 +L 698.415839 512.328057 +L 20.638023 512.328057 +z+" clip-path="url(#p88360a4953)" style="fill: #efe7d6; stroke: #efe7d6; stroke-linejoin: miter"/>+ </g>+ <g id="patch_3">+ <path d="M 359.526931 122.211756 +C 404.673136 122.211756 447.976347 136.99299 479.899534 163.300061 +C 511.822722 189.607132 529.759499 225.292185 529.759499 262.496002 +C 529.759499 299.699819 511.822722 335.384872 479.899534 361.691943 +C 447.976347 387.999015 404.673136 402.780248 359.526931 402.780248 +C 314.380726 402.780248 271.077516 387.999015 239.154328 361.691943 +C 207.231141 335.384872 189.294363 299.699819 189.294363 262.496002 +C 189.294363 225.292185 207.231141 189.607132 239.154328 163.300061 +C 271.077516 136.99299 314.380726 122.211756 359.526931 122.211756 +z+" clip-path="url(#p88360a4953)" style="fill: #ffffff; stroke: #9aa5b4; stroke-width: 1.4; stroke-linejoin: miter"/>+ </g>+ <g id="patch_4">+ <path d="M 355.980419 57.58643 +L 363.073443 57.58643 +Q 380.411945 57.58643 380.411945 74.924932 +L 380.411945 85.170411 +Q 380.411945 102.508913 363.073443 102.508913 +L 355.980419 102.508913 +Q 338.641917 102.508913 338.641917 85.170411 +L 338.641917 74.924932 +Q 338.641917 57.58643 355.980419 57.58643 +z+" clip-path="url(#p88360a4953)" style="fill: #e9edf2; stroke: #9aa5b4; stroke-width: 1.2; stroke-linejoin: miter"/>+ </g>+ <g id="patch_5">+ <path d="M 354.798249 100.932686 +L 364.255614 100.932686 +L 364.255614 103.297027 +L 354.798249 103.297027 +z+" clip-path="url(#p88360a4953)" style="fill: #202020; stroke: #202020; stroke-linejoin: miter"/>+ </g>+ <g id="QuadContourSet_1">+ <path d="M 189.294363 199.312272 +L 189.340987 200.235017 +L 189.294363 200.281641 +L 188.258585 200.235017 +z+M 529.759499 199.312272 +L 530.795277 200.235017 +L 529.759499 200.281641 +L 529.712875 200.235017 +z+M 186.141908 202.185562 +L 186.200394 203.387472 +L 186.349658 206.539927 +L 186.141908 206.747676 +L 183.199956 209.692382 +L 183.334676 212.844836 +L 182.989454 213.190058 +L 180.177488 215.997291 +L 180.299188 219.149746 +L 180.413209 222.302201 +L 179.836999 222.878411 +L 177.246029 225.454656 +L 177.349201 228.607111 +L 177.445699 231.759566 +L 177.535846 234.912021 +L 176.684544 235.763324 +L 174.358933 238.064476 +L 174.440863 241.216931 +L 174.517413 244.369386 +L 174.588898 247.521841 +L 174.655624 250.674296 +L 174.717891 253.826751 +L 174.775983 256.979206 +L 174.830174 260.131661 +L 174.880721 263.284116 +L 174.927868 266.436571 +L 174.971842 269.589026 +L 175.012857 272.741481 +L 175.051113 275.893936 +L 175.086795 279.046391 +L 175.120075 282.198846 +L 175.151114 285.3513 +L 176.684544 286.791167 +L 178.397132 288.503755 +L 178.422252 291.65621 +L 178.445632 294.808665 +L 178.467386 297.96112 +L 179.836999 299.268434 +L 181.68214 301.113575 +L 181.678942 304.26603 +L 181.675285 307.418485 +L 182.989454 308.706054 +L 184.854339 310.57094 +L 184.849383 313.723395 +L 184.844038 316.87585 +L 186.141908 318.150623 +L 188.019591 320.028305 +L 188.013126 323.18076 +L 189.294363 324.441328 +L 191.186251 326.333215 +L 192.446818 327.574719 +L 194.357769 329.48567 +L 194.349663 332.638125 +L 195.599273 333.870801 +L 197.519052 335.79058 +L 197.510095 338.943035 +L 198.751728 340.169705 +L 200.677513 342.09549 +L 201.904183 343.308534 +L 203.843594 345.247945 +L 205.056638 346.448644 +L 207.008394 348.4004 +L 206.99771 351.552855 +L 208.209093 352.753558 +L 210.160844 354.70531 +L 211.361548 355.896487 +L 213.322825 357.857764 +L 214.514003 359.040524 +L 216.483698 361.010219 +L 217.666458 362.185627 +L 219.643505 364.162674 +L 220.818913 365.331755 +L 222.802287 367.315129 +L 223.971368 368.47887 +L 225.960083 370.467584 +L 227.123823 371.626935 +L 229.116927 373.620039 +L 230.276278 374.775916 +L 233.428733 374.759495 +L 235.441732 376.772494 +L 236.581188 377.909952 +L 238.596185 379.924949 +L 239.733643 381.061248 +L 241.749799 383.077404 +L 242.886098 384.213353 +L 246.038553 384.199084 +L 248.069327 386.229859 +L 249.191008 387.352514 +L 252.343463 387.339202 +L 254.386575 389.382314 +L 255.495918 390.493898 +L 257.536789 392.534769 +L 258.648372 393.649303 +L 261.800827 393.637422 +L 263.850629 395.687224 +L 264.953282 396.794007 +L 268.105737 396.783012 +L 270.162405 398.839679 +L 271.258192 399.940727 +L 274.410647 399.930594 +L 277.563102 399.920846 +L 279.63439 401.992134 +L 280.715557 403.080103 +L 283.868012 403.071189 +L 285.941412 405.144589 +L 287.020467 406.231477 +L 290.172922 406.223375 +L 293.325377 406.215644 +L 295.406777 408.297044 +L 296.477832 409.377349 +L 299.630287 409.370405 +L 302.782742 409.363826 +L 305.935197 409.35761 +L 308.027085 411.449499 +L 309.087652 412.521072 +L 312.240107 412.515616 +L 315.392562 412.510518 +L 318.545017 412.505775 +L 321.697472 412.501388 +L 323.798038 414.601954 +L 324.849927 415.666898 +L 328.002382 415.663243 +L 331.154836 415.659938 +L 334.307291 415.656983 +L 337.459746 415.654377 +L 340.612201 415.652119 +L 343.764656 415.65021 +L 346.917111 415.648648 +L 350.069566 415.647434 +L 353.222021 415.646566 +L 356.374476 415.646046 +L 358.482839 417.754409 +L 359.526931 418.815619 +L 360.571024 417.754409 +L 362.679386 415.646046 +L 365.831841 415.646566 +L 368.984296 415.647434 +L 372.136751 415.648648 +L 375.289206 415.65021 +L 378.441661 415.652119 +L 381.594116 415.654377 +L 384.746571 415.656983 +L 387.899026 415.659938 +L 391.051481 415.663243 +L 394.203936 415.666898 +L 395.255825 414.601954 +L 397.356391 412.501388 +L 400.508846 412.505775 +L 403.6613 412.510518 +L 406.813755 412.515616 +L 409.96621 412.521072 +L 411.026777 411.449499 +L 413.118665 409.35761 +L 416.27112 409.363826 +L 419.423575 409.370405 +L 422.57603 409.377349 +L 423.647085 408.297044 +L 425.728485 406.215644 +L 428.88094 406.223375 +L 432.033395 406.231477 +L 433.11245 405.144589 +L 435.18585 403.071189 +L 438.338305 403.080103 +L 439.419473 401.992134 +L 441.49076 399.920846 +L 444.643215 399.930594 +L 447.79567 399.940727 +L 448.891458 398.839679 +L 450.948125 396.783012 +L 454.10058 396.794007 +L 455.203233 395.687224 +L 457.253035 393.637422 +L 460.40549 393.649303 +L 461.517073 392.534769 +L 463.557945 390.493898 +L 464.667287 389.382314 +L 466.7104 387.339202 +L 469.862855 387.352514 +L 470.984535 386.229859 +L 473.01531 384.199084 +L 476.167765 384.213353 +L 477.304063 383.077404 +L 479.320219 381.061248 +L 480.457677 379.924949 +L 482.472674 377.909952 +L 483.61213 376.772494 +L 485.625129 374.759495 +L 488.777584 374.775916 +L 489.936935 373.620039 +L 491.930039 371.626935 +L 493.093779 370.467584 +L 495.082494 368.47887 +L 496.251575 367.315129 +L 498.234949 365.331755 +L 499.410357 364.162674 +L 501.387404 362.185627 +L 502.570164 361.010219 +L 504.539859 359.040524 +L 505.731037 357.857764 +L 507.692314 355.896487 +L 508.893018 354.70531 +L 510.844769 352.753558 +L 512.056153 351.552855 +L 512.045468 348.4004 +L 513.997224 346.448644 +L 515.210268 345.247945 +L 517.149679 343.308534 +L 518.376349 342.09549 +L 520.302134 340.169705 +L 521.543767 338.943035 +L 521.53481 335.79058 +L 523.454589 333.870801 +L 524.704199 332.638125 +L 524.696093 329.48567 +L 526.607044 327.574719 +L 527.867612 326.333215 +L 529.759499 324.441328 +L 531.040736 323.18076 +L 531.034271 320.028305 +L 532.911954 318.150623 +L 534.209824 316.87585 +L 534.20448 313.723395 +L 534.199523 310.57094 +L 536.064409 308.706054 +L 537.378577 307.418485 +L 537.374921 304.26603 +L 537.371723 301.113575 +L 539.216864 299.268434 +L 540.586477 297.96112 +L 540.60823 294.808665 +L 540.63161 291.65621 +L 540.65673 288.503755 +L 542.369319 286.791167 +L 543.902748 285.3513 +L 543.933787 282.198846 +L 543.967067 279.046391 +L 544.002749 275.893936 +L 544.041005 272.741481 +L 544.08202 269.589026 +L 544.125995 266.436571 +L 544.173141 263.284116 +L 544.223688 260.131661 +L 544.277879 256.979206 +L 544.335971 253.826751 +L 544.398238 250.674296 +L 544.464964 247.521841 +L 544.536449 244.369386 +L 544.612999 241.216931 +L 544.694929 238.064476 +L 542.369319 235.763324 +L 541.518016 234.912021 +L 541.608164 231.759566 +L 541.704661 228.607111 +L 541.807833 225.454656 +L 539.216864 222.878411 +L 538.640654 222.302201 +L 538.754674 219.149746 +L 538.876375 215.997291 +L 536.064409 213.190058 +L 535.719187 212.844836 +L 535.853906 209.692382 +L 532.911954 206.747676 +L 532.704204 206.539927 +L 532.853468 203.387472 +L 532.911954 202.185562 +L 534.236509 203.387472 +L 536.064409 205.104576 +L 537.618502 206.539927 +L 539.216864 208.069235 +L 540.94464 209.692382 +L 542.369319 211.079683 +L 544.217717 212.844836 +L 545.521774 214.136253 +L 547.440041 215.997291 +L 548.674229 217.239431 +L 550.613516 219.149746 +L 551.826683 220.389832 +L 553.739713 222.302201 +L 554.979138 223.588177 +L 556.819924 225.454656 +L 558.131593 226.835277 +L 559.855203 228.607111 +L 561.284048 230.132018 +L 562.846408 231.759566 +L 564.436503 233.479348 +L 565.794225 234.912021 +L 567.588958 236.87827 +L 568.699197 238.064476 +L 570.741413 240.329832 +L 571.561744 241.216931 +L 573.893868 243.835119 +L 574.382178 244.369386 +L 577.046323 247.395249 +L 577.16072 247.521841 +L 579.918376 250.674296 +L 580.198778 251.006752 +L 582.644213 253.826751 +L 583.351233 254.673752 +L 585.330073 256.979206 +L 586.503688 258.39937 +L 587.975825 260.131661 +L 589.656143 262.18487 +L 590.581301 263.284116 +L 592.808598 266.031525 +L 593.146301 266.436571 +L 595.688742 269.589026 +L 595.961053 269.938066 +L 598.21288 272.741481 +L 599.113508 273.90572 +L 600.696934 275.893936 +L 602.265963 277.939024 +L 603.140562 279.046391 +L 605.418418 282.039297 +L 605.543411 282.198846 +L 607.943521 285.3513 +L 608.570873 286.205235 +L 610.310367 288.503755 +L 611.723328 290.441016 +L 612.636209 291.65621 +L 614.875783 294.748537 +L 614.920628 294.808665 +L 617.210186 297.96112 +L 618.028238 299.128918 +L 619.460733 301.113575 +L 621.180693 303.584572 +L 621.669343 304.26603 +L 623.861447 307.418485 +L 624.333147 308.118197 +L 626.037215 310.57094 +L 627.485602 312.731856 +L 628.170382 313.723395 +L 630.279309 316.87585 +L 630.638057 317.427837 +L 632.379997 320.028305 +L 633.790512 322.209905 +L 634.43732 323.18076 +L 636.474364 326.333215 +L 636.942967 327.079875 +L 638.499103 329.48567 +L 640.095422 332.041165 +L 640.47965 332.638125 +L 642.453823 335.79058 +L 643.247877 337.09886 +L 644.401347 338.943035 +L 646.308139 342.09549 +L 646.400332 342.251734 +L 648.222361 345.247945 +L 649.552787 347.51146 +L 650.091123 348.4004 +L 651.948093 351.552855 +L 652.705242 352.876775 +L 653.78272 354.70531 +L 655.583049 357.857764 +L 655.857697 358.351097 +L 655.888663 361.010219 +L 655.857697 361.041185 +L 652.835784 364.162674 +L 652.705242 364.293216 +L 649.780184 367.315129 +L 649.552787 367.542526 +L 646.721729 370.467584 +L 646.400332 370.788981 +L 643.660312 373.620039 +L 643.247877 374.032474 +L 640.595852 376.772494 +L 640.095422 377.272924 +L 637.528296 379.924949 +L 636.942967 380.510278 +L 634.457611 383.077404 +L 633.790512 383.744503 +L 631.383786 386.229859 +L 630.638057 386.975588 +L 628.30683 389.382314 +L 627.485602 390.203541 +L 625.213646 392.534769 +L 624.333147 393.415267 +L 622.089171 395.687224 +L 621.180693 396.595703 +L 618.963475 398.839679 +L 618.028238 399.774916 +L 615.83658 401.992134 +L 614.875783 402.952932 +L 612.708512 405.144589 +L 611.723328 406.129774 +L 608.570873 406.158759 +L 606.455249 408.297044 +L 605.418418 409.333875 +L 603.324334 411.449499 +L 602.265963 412.50787 +L 600.192322 414.601954 +L 599.113508 415.680768 +L 597.059239 417.754409 +L 595.961053 418.852595 +L 592.808598 418.879017 +L 590.798514 420.906864 +L 589.656143 422.049234 +L 587.662805 424.059319 +L 586.503688 425.218435 +L 583.351233 425.243447 +L 581.398107 427.211774 +L 580.198778 428.411102 +L 578.259891 430.364229 +L 577.046323 431.577796 +L 573.893868 431.60141 +L 571.991355 433.516683 +L 570.741413 434.766625 +L 568.850753 436.669138 +L 567.588958 437.930933 +L 564.436503 437.95317 +L 562.578521 439.821593 +L 561.284048 441.116066 +L 558.131593 441.13747 +L 556.304083 442.974048 +L 554.979138 444.298993 +L 553.159872 446.126503 +L 551.826683 447.459691 +L 548.674229 447.479757 +L 546.881965 449.278958 +L 545.521774 450.639149 +L 542.369319 450.658403 +L 540.601977 452.431413 +L 539.216864 453.816527 +L 536.064409 453.834976 +L 534.319954 455.583868 +L 532.911954 456.991868 +L 529.759499 457.009523 +L 528.035941 458.736323 +L 526.607044 460.165221 +L 523.454589 460.18209 +L 521.749985 461.888778 +L 520.302134 463.336629 +L 517.149679 463.352723 +L 513.997224 463.368506 +L 512.325005 465.041233 +L 510.844769 466.521469 +L 507.692314 466.536488 +L 506.034543 468.193688 +L 504.539859 469.688372 +L 501.387404 469.70264 +L 499.742285 471.346143 +L 498.234949 472.853478 +L 495.082494 472.867005 +L 491.930039 472.880223 +L 490.308615 474.498598 +L 488.777584 476.029629 +L 485.625129 476.042119 +L 482.472674 476.054303 +L 480.871495 477.651053 +L 479.320219 479.202328 +L 476.167765 479.213799 +L 473.01531 479.224963 +L 471.431007 480.803508 +L 469.862855 482.37166 +L 466.7104 482.382125 +L 463.557945 482.392287 +L 460.40549 482.402145 +L 458.844253 483.955963 +L 457.253035 485.547181 +L 454.10058 485.556356 +L 450.948125 485.565229 +L 447.79567 485.573801 +L 446.252048 487.108418 +L 444.643215 488.717251 +L 441.49076 488.725156 +L 438.338305 488.732762 +L 435.18585 488.740069 +L 432.033395 488.747077 +L 430.508726 490.260873 +L 428.88094 491.888658 +L 425.728485 491.895018 +L 422.57603 491.901082 +L 419.423575 491.906849 +L 416.27112 491.91232 +L 413.118665 491.917494 +L 409.96621 491.922373 +L 408.461943 493.413328 +L 406.813755 495.061515 +L 403.6613 495.065769 +L 400.508846 495.069728 +L 397.356391 495.073394 +L 394.203936 495.076767 +L 391.051481 495.079845 +L 387.899026 495.082631 +L 384.746571 495.085123 +L 381.594116 495.087322 +L 378.441661 495.089227 +L 375.289206 495.090839 +L 372.136751 495.092158 +L 368.984296 495.093184 +L 365.831841 495.093917 +L 362.679386 495.094357 +L 361.18995 496.565783 +L 359.526931 498.228802 +L 357.863912 496.565783 +L 356.374476 495.094357 +L 353.222021 495.093917 +L 350.069566 495.093184 +L 346.917111 495.092158 +L 343.764656 495.090839 +L 340.612201 495.089227 +L 337.459746 495.087322 +L 334.307291 495.085123 +L 331.154836 495.082631 +L 328.002382 495.079845 +L 324.849927 495.076767 +L 321.697472 495.073394 +L 318.545017 495.069728 +L 315.392562 495.065769 +L 312.240107 495.061515 +L 310.591919 493.413328 +L 309.087652 491.922373 +L 305.935197 491.917494 +L 302.782742 491.91232 +L 299.630287 491.906849 +L 296.477832 491.901082 +L 293.325377 491.895018 +L 290.172922 491.888658 +L 288.545137 490.260873 +L 287.020467 488.747077 +L 283.868012 488.740069 +L 280.715557 488.732762 +L 277.563102 488.725156 +L 274.410647 488.717251 +L 272.801814 487.108418 +L 271.258192 485.573801 +L 268.105737 485.565229 +L 264.953282 485.556356 +L 261.800827 485.547181 +L 260.209609 483.955963 +L 258.648372 482.402145 +L 255.495918 482.392287 +L 252.343463 482.382125 +L 249.191008 482.37166 +L 247.622855 480.803508 +L 246.038553 479.224963 +L 242.886098 479.213799 +L 239.733643 479.202328 +L 238.182367 477.651053 +L 236.581188 476.054303 +L 233.428733 476.042119 +L 230.276278 476.029629 +L 228.745247 474.498598 +L 227.123823 472.880223 +L 223.971368 472.867005 +L 220.818913 472.853478 +L 219.311578 471.346143 +L 217.666458 469.70264 +L 214.514003 469.688372 +L 213.019319 468.193688 +L 211.361548 466.536488 +L 208.209093 466.521469 +L 206.728857 465.041233 +L 205.056638 463.368506 +L 201.904183 463.352723 +L 198.751728 463.336629 +L 197.303878 461.888778 +L 195.599273 460.18209 +L 192.446818 460.165221 +L 191.017921 458.736323 +L 189.294363 457.009523 +L 186.141908 456.991868 +L 184.733908 455.583868 +L 182.989454 453.834976 +L 179.836999 453.816527 +L 178.451885 452.431413 +L 176.684544 450.658403 +L 173.532089 450.639149 +L 172.171898 449.278958 +L 170.379634 447.479757 +L 167.227179 447.459691 +L 165.893991 446.126503 +L 164.074724 444.298993 +L 162.749779 442.974048 +L 160.922269 441.13747 +L 157.769814 441.116066 +L 156.475341 439.821593 +L 154.617359 437.95317 +L 151.464904 437.930933 +L 150.203109 436.669138 +L 148.312449 434.766625 +L 147.062507 433.516683 +L 145.159994 431.60141 +L 142.007539 431.577796 +L 140.793971 430.364229 +L 138.855084 428.411102 +L 137.655755 427.211774 +L 135.702629 425.243447 +L 132.550174 425.218435 +L 131.391058 424.059319 +L 129.397719 422.049234 +L 128.255348 420.906864 +L 126.245264 418.879017 +L 123.092809 418.852595 +L 121.994623 417.754409 +L 119.940354 415.680768 +L 118.86154 414.601954 +L 116.787899 412.50787 +L 115.729529 411.449499 +L 113.635444 409.333875 +L 112.598613 408.297044 +L 110.48299 406.158759 +L 107.330535 406.129774 +L 106.34535 405.144589 +L 104.17808 402.952932 +L 103.217282 401.992134 +L 101.025625 399.774916 +L 100.090387 398.839679 +L 97.87317 396.595703 +L 96.964691 395.687224 +L 94.720715 393.415267 +L 93.840217 392.534769 +L 91.56826 390.203541 +L 90.747032 389.382314 +L 88.415805 386.975588 +L 87.670076 386.229859 +L 85.26335 383.744503 +L 84.596251 383.077404 +L 82.110895 380.510278 +L 81.525566 379.924949 +L 78.95844 377.272924 +L 78.45801 376.772494 +L 75.805985 374.032474 +L 75.393551 373.620039 +L 72.65353 370.788981 +L 72.332133 370.467584 +L 69.501075 367.542526 +L 69.273678 367.315129 +L 66.34862 364.293216 +L 66.218079 364.162674 +L 63.196165 361.041185 +L 63.165199 361.010219 +L 63.196165 358.351097 +L 63.470813 357.857764 +L 65.271143 354.70531 +L 66.34862 352.876775 +L 67.10577 351.552855 +L 68.962739 348.4004 +L 69.501075 347.51146 +L 70.831502 345.247945 +L 72.65353 342.251734 +L 72.745723 342.09549 +L 74.652515 338.943035 +L 75.805985 337.09886 +L 76.600039 335.79058 +L 78.574212 332.638125 +L 78.95844 332.041165 +L 80.554759 329.48567 +L 82.110895 327.079875 +L 82.579498 326.333215 +L 84.616542 323.18076 +L 85.26335 322.209905 +L 86.673865 320.028305 +L 88.415805 317.427837 +L 88.774553 316.87585 +L 90.88348 313.723395 +L 91.56826 312.731856 +L 93.016647 310.57094 +L 94.720715 308.118197 +L 95.192415 307.418485 +L 97.384519 304.26603 +L 97.87317 303.584572 +L 99.593129 301.113575 +L 101.025625 299.128918 +L 101.843676 297.96112 +L 104.133234 294.808665 +L 104.17808 294.748537 +L 106.417653 291.65621 +L 107.330535 290.441016 +L 108.743496 288.503755 +L 110.48299 286.205235 +L 111.110341 285.3513 +L 113.510451 282.198846 +L 113.635444 282.039297 +L 115.9133 279.046391 +L 116.787899 277.939024 +L 118.356928 275.893936 +L 119.940354 273.90572 +L 120.840982 272.741481 +L 123.092809 269.938066 +L 123.365121 269.589026 +L 125.907561 266.436571 +L 126.245264 266.031525 +L 128.472561 263.284116 +L 129.397719 262.18487 +L 131.078037 260.131661 +L 132.550174 258.39937 +L 133.723789 256.979206 +L 135.702629 254.673752 +L 136.409649 253.826751 +L 138.855084 251.006752 +L 139.135486 250.674296 +L 141.893142 247.521841 +L 142.007539 247.395249 +L 144.671685 244.369386 +L 145.159994 243.835119 +L 147.492119 241.216931 +L 148.312449 240.329832 +L 150.354665 238.064476 +L 151.464904 236.87827 +L 153.259637 234.912021 +L 154.617359 233.479348 +L 156.207454 231.759566 +L 157.769814 230.132018 +L 159.198659 228.607111 +L 160.922269 226.835277 +L 162.233938 225.454656 +L 164.074724 223.588177 +L 165.314149 222.302201 +L 167.227179 220.389832 +L 168.440347 219.149746 +L 170.379634 217.239431 +L 171.613821 215.997291 +L 173.532089 214.136253 +L 174.836145 212.844836 +L 176.684544 211.079683 +L 178.109222 209.692382 +L 179.836999 208.069235 +L 181.43536 206.539927 +L 182.989454 205.104576 +L 184.817353 203.387472 +z+" clip-path="url(#p88360a4953)" style="fill: #8fd3b8; fill-opacity: 0.45"/>+ </g>+ <g id="QuadContourSet_2">+ <path d="M 173.532089 259.562168 +L 173.543595 260.131661 +L 173.605001 263.284116 +L 173.663162 266.436571 +L 173.718195 269.589026 +L 173.770224 272.741481 +L 173.819371 275.893936 +L 173.865761 279.046391 +L 173.909513 282.198846 +L 173.950747 285.3513 +L 176.684544 287.95831 +L 177.229989 288.503755 +L 177.26473 291.65621 +L 177.297325 294.808665 +L 177.327881 297.96112 +L 179.836999 300.361695 +L 180.588879 301.113575 +L 180.61399 304.26603 +L 180.6374 307.418485 +L 182.989454 309.674872 +L 183.885521 310.57094 +L 183.904254 313.723395 +L 183.921581 316.87585 +L 186.141908 319.012022 +L 187.158191 320.028305 +L 187.171539 323.18076 +L 189.294363 325.22724 +L 190.400338 326.333215 +L 192.446818 328.308321 +L 193.624168 329.48567 +L 193.631781 332.638125 +L 195.599273 334.541057 +L 196.848796 335.79058 +L 196.853538 338.943035 +L 198.751728 340.782883 +L 200.064335 342.09549 +L 201.904183 343.881047 +L 203.271081 345.247945 +L 205.056638 346.98306 +L 206.473977 348.4004 +L 206.473089 351.552855 +L 208.209093 353.243442 +L 209.670961 354.70531 +L 211.361548 356.35383 +L 212.865483 357.857764 +L 214.514003 359.46739 +L 216.056832 361.010219 +L 217.666458 362.583951 +L 219.245182 364.162674 +L 220.818913 365.703349 +L 222.430694 367.315129 +L 223.971368 368.825429 +L 225.613523 370.467584 +L 227.123823 371.950046 +L 228.793816 373.620039 +L 230.276278 375.077059 +L 233.428733 375.043932 +L 235.157295 376.772494 +L 236.581188 378.17471 +L 238.331427 379.924949 +L 239.733643 381.307569 +L 241.503478 383.077404 +L 242.886098 384.442399 +L 246.038553 384.414549 +L 247.853863 386.229859 +L 249.191008 387.552533 +L 252.343463 387.526904 +L 254.198872 389.382314 +L 255.495918 390.667811 +L 257.362876 392.534769 +L 258.648372 393.810295 +L 261.800827 393.787901 +L 263.70015 395.687224 +L 264.953282 396.932972 +L 268.105737 396.912497 +L 270.032919 398.839679 +L 271.258192 400.059974 +L 274.410647 400.041318 +L 277.563102 400.023452 +L 279.531785 401.992134 +L 280.715557 403.174108 +L 283.868012 403.157937 +L 285.854664 405.144589 +L 287.020467 406.310635 +L 290.172922 406.296078 +L 293.325377 406.282239 +L 295.340182 408.297044 +L 296.477832 409.437672 +L 299.630287 409.425346 +L 302.782742 409.413706 +L 305.935197 409.402743 +L 307.981953 411.449499 +L 309.087652 412.561449 +L 312.240107 412.551892 +L 315.392562 412.542983 +L 318.545017 412.534717 +L 321.697472 412.527088 +L 323.772337 414.601954 +L 324.849927 415.68947 +L 328.002382 415.683144 +L 331.154836 415.677435 +L 334.307291 415.672338 +L 337.459746 415.667849 +L 340.612201 415.663966 +L 343.764656 415.660685 +L 346.917111 415.658004 +L 350.069566 415.655921 +L 353.222021 415.654434 +L 356.374476 415.653543 +L 358.475342 417.754409 +L 359.526931 418.822942 +L 360.57852 417.754409 +L 362.679386 415.653543 +L 365.831841 415.654434 +L 368.984296 415.655921 +L 372.136751 415.658004 +L 375.289206 415.660685 +L 378.441661 415.663966 +L 381.594116 415.667849 +L 384.746571 415.672338 +L 387.899026 415.677435 +L 391.051481 415.683144 +L 394.203936 415.68947 +L 395.281525 414.601954 +L 397.356391 412.527088 +L 400.508846 412.534717 +L 403.6613 412.542983 +L 406.813755 412.551892 +L 409.96621 412.561449 +L 411.071909 411.449499 +L 413.118665 409.402743 +L 416.27112 409.413706 +L 419.423575 409.425346 +L 422.57603 409.437672 +L 423.71368 408.297044 +L 425.728485 406.282239 +L 428.88094 406.296078 +L 432.033395 406.310635 +L 433.199198 405.144589 +L 435.18585 403.157937 +L 438.338305 403.174108 +L 439.522078 401.992134 +L 441.49076 400.023452 +L 444.643215 400.041318 +L 447.79567 400.059974 +L 449.020943 398.839679 +L 450.948125 396.912497 +L 454.10058 396.932972 +L 455.353712 395.687224 +L 457.253035 393.787901 +L 460.40549 393.810295 +L 461.690986 392.534769 +L 463.557945 390.667811 +L 464.85499 389.382314 +L 466.7104 387.526904 +L 469.862855 387.552533 +L 471.199999 386.229859 +L 473.01531 384.414549 +L 476.167765 384.442399 +L 477.550385 383.077404 +L 479.320219 381.307569 +L 480.722435 379.924949 +L 482.472674 378.17471 +L 483.896567 376.772494 +L 485.625129 375.043932 +L 488.777584 375.077059 +L 490.260046 373.620039 +L 491.930039 371.950046 +L 493.440339 370.467584 +L 495.082494 368.825429 +L 496.623169 367.315129 +L 498.234949 365.703349 +L 499.80868 364.162674 +L 501.387404 362.583951 +L 502.99703 361.010219 +L 504.539859 359.46739 +L 506.18838 357.857764 +L 507.692314 356.35383 +L 509.382901 354.70531 +L 510.844769 353.243442 +L 512.580773 351.552855 +L 512.579885 348.4004 +L 513.997224 346.98306 +L 515.782782 345.247945 +L 517.149679 343.881047 +L 518.989527 342.09549 +L 520.302134 340.782883 +L 522.200324 338.943035 +L 522.205066 335.79058 +L 523.454589 334.541057 +L 525.422081 332.638125 +L 525.429695 329.48567 +L 526.607044 328.308321 +L 528.653524 326.333215 +L 529.759499 325.22724 +L 531.882324 323.18076 +L 531.895671 320.028305 +L 532.911954 319.012022 +L 535.132281 316.87585 +L 535.149608 313.723395 +L 535.168341 310.57094 +L 536.064409 309.674872 +L 538.416462 307.418485 +L 538.439872 304.26603 +L 538.464983 301.113575 +L 539.216864 300.361695 +L 541.725981 297.96112 +L 541.756537 294.808665 +L 541.789132 291.65621 +L 541.823873 288.503755 +L 542.369319 287.95831 +L 545.103115 285.3513 +L 545.14435 282.198846 +L 545.188102 279.046391 +L 545.234491 275.893936 +L 545.283638 272.741481 +L 545.335667 269.589026 +L 545.390701 266.436571 +L 545.448861 263.284116 +L 545.510268 260.131661 +L 545.521774 259.562168 +L 545.878545 260.131661 +L 547.774866 263.284116 +L 548.674229 264.85224 +L 549.624923 266.436571 +L 551.430388 269.589026 +L 551.826683 270.309707 +L 553.225818 272.741481 +L 554.950845 275.893936 +L 554.979138 275.947542 +L 556.690291 279.046391 +L 558.131593 281.789495 +L 558.356484 282.198846 +L 560.025182 285.3513 +L 561.284048 287.843409 +L 561.632762 288.503755 +L 563.235596 291.65621 +L 564.436503 294.126953 +L 564.782806 294.808665 +L 566.325271 297.96112 +L 567.588958 300.661034 +L 567.810258 301.113575 +L 569.296864 304.26603 +L 570.718921 307.418485 +L 570.741413 307.470129 +L 572.152158 310.57094 +L 573.526023 313.723395 +L 573.893868 314.599229 +L 574.892238 316.87585 +L 576.220406 320.028305 +L 577.046323 322.06639 +L 577.517618 323.18076 +L 578.802116 326.333215 +L 580.0361 329.48567 +L 580.198778 329.9165 +L 581.270807 332.638125 +L 582.464987 335.79058 +L 583.351233 338.22085 +L 583.625813 338.943035 +L 584.781199 342.09549 +L 585.893005 345.247945 +L 586.503688 347.045123 +L 586.983564 348.4004 +L 588.058795 351.552855 +L 589.094199 354.70531 +L 589.656143 356.481202 +L 590.10975 357.857764 +L 591.11002 361.010219 +L 592.073465 364.162674 +L 592.808598 366.659709 +L 593.009407 367.315129 +L 593.938557 370.467584 +L 594.833285 373.620039 +L 595.695082 376.772494 +L 595.961053 377.784559 +L 596.54597 379.924949 +L 597.374265 383.077404 +L 598.171317 386.229859 +L 598.938284 389.382314 +L 599.113508 390.133422 +L 599.695542 392.534769 +L 600.429007 395.687224 +L 601.13354 398.839679 +L 601.810041 401.992134 +L 602.265963 404.209435 +L 602.465563 405.144589 +L 603.107991 408.297044 +L 602.290349 411.449499 +L 602.265963 411.473885 +L 599.199819 414.601954 +L 599.113508 414.688265 +L 596.107121 417.754409 +L 595.961053 417.900477 +L 592.808598 417.951701 +L 589.910045 420.906864 +L 589.656143 421.160765 +L 586.811998 424.059319 +L 586.503688 424.367628 +L 583.351233 424.416493 +L 580.607117 427.211774 +L 580.198778 427.620113 +L 577.503649 430.364229 +L 577.046323 430.821555 +L 573.893868 430.86782 +L 571.290741 433.516683 +L 570.741413 434.066011 +L 568.18191 436.669138 +L 567.588958 437.26209 +L 564.436503 437.30561 +L 561.960953 439.821593 +L 561.284048 440.498498 +L 558.131593 440.540327 +L 555.735163 442.974048 +L 554.979138 443.730073 +L 552.618045 446.126503 +L 551.826683 446.917865 +L 548.674229 446.956849 +L 546.384449 449.278958 +L 545.521774 450.141633 +L 542.369319 450.17889 +L 540.146202 452.431413 +L 539.216864 453.360751 +L 536.064409 453.396282 +L 533.903401 455.583868 +L 532.911954 456.575315 +L 529.759499 456.609132 +L 527.656159 458.736323 +L 526.607044 459.785438 +L 523.454589 459.817561 +L 521.404601 461.888778 +L 520.302134 462.991245 +L 517.149679 463.0217 +L 513.997224 463.051509 +L 512.025225 465.041233 +L 510.844769 466.221689 +L 507.692314 466.249867 +L 505.763842 468.193688 +L 504.539859 469.417671 +L 501.387404 469.444256 +L 499.498597 471.346143 +L 498.234949 472.609791 +L 495.082494 472.634824 +L 491.930039 472.659228 +L 490.100703 474.498598 +L 488.777584 475.821716 +L 485.625129 475.84462 +L 482.472674 475.866905 +L 480.695691 477.651053 +L 479.320219 479.026524 +L 476.167765 479.047364 +L 473.01531 479.067599 +L 471.283865 480.803508 +L 469.862855 482.224518 +L 466.7104 482.243363 +L 463.557945 482.261617 +L 460.40549 482.279283 +L 458.729988 483.955963 +L 457.253035 485.432916 +L 454.10058 485.44926 +L 450.948125 485.46503 +L 447.79567 485.480229 +L 446.16561 487.108418 +L 444.643215 488.630813 +L 441.49076 488.644755 +L 438.338305 488.658141 +L 435.18585 488.670974 +L 432.033395 488.683257 +L 430.450427 490.260873 +L 428.88094 491.830359 +L 425.728485 491.841456 +L 422.57603 491.852016 +L 419.423575 491.862043 +L 416.27112 491.871538 +L 413.118665 491.880505 +L 409.96621 491.888945 +L 408.432088 493.413328 +L 406.813755 495.03166 +L 403.6613 495.038996 +L 400.508846 495.045816 +L 397.356391 495.052123 +L 394.203936 495.057919 +L 391.051481 495.063204 +L 387.899026 495.067982 +L 384.746571 495.072252 +L 381.594116 495.076017 +L 378.441661 495.079278 +L 375.289206 495.082035 +L 372.136751 495.08429 +L 368.984296 495.086043 +L 365.831841 495.087295 +L 362.679386 495.088046 +L 361.18379 496.565783 +L 359.526931 498.222642 +L 357.870072 496.565783 +L 356.374476 495.088046 +L 353.222021 495.087295 +L 350.069566 495.086043 +L 346.917111 495.08429 +L 343.764656 495.082035 +L 340.612201 495.079278 +L 337.459746 495.076017 +L 334.307291 495.072252 +L 331.154836 495.067982 +L 328.002382 495.063204 +L 324.849927 495.057919 +L 321.697472 495.052123 +L 318.545017 495.045816 +L 315.392562 495.038996 +L 312.240107 495.03166 +L 310.621774 493.413328 +L 309.087652 491.888945 +L 305.935197 491.880505 +L 302.782742 491.871538 +L 299.630287 491.862043 +L 296.477832 491.852016 +L 293.325377 491.841456 +L 290.172922 491.830359 +L 288.603435 490.260873 +L 287.020467 488.683257 +L 283.868012 488.670974 +L 280.715557 488.658141 +L 277.563102 488.644755 +L 274.410647 488.630813 +L 272.888252 487.108418 +L 271.258192 485.480229 +L 268.105737 485.46503 +L 264.953282 485.44926 +L 261.800827 485.432916 +L 260.323874 483.955963 +L 258.648372 482.279283 +L 255.495918 482.261617 +L 252.343463 482.243363 +L 249.191008 482.224518 +L 247.769998 480.803508 +L 246.038553 479.067599 +L 242.886098 479.047364 +L 239.733643 479.026524 +L 238.358171 477.651053 +L 236.581188 475.866905 +L 233.428733 475.84462 +L 230.276278 475.821716 +L 228.953159 474.498598 +L 227.123823 472.659228 +L 223.971368 472.634824 +L 220.818913 472.609791 +L 219.555265 471.346143 +L 217.666458 469.444256 +L 214.514003 469.417671 +L 213.29002 468.193688 +L 211.361548 466.249867 +L 208.209093 466.221689 +L 207.028637 465.041233 +L 205.056638 463.051509 +L 201.904183 463.0217 +L 198.751728 462.991245 +L 197.649262 461.888778 +L 195.599273 459.817561 +L 192.446818 459.785438 +L 191.397703 458.736323 +L 189.294363 456.609132 +L 186.141908 456.575315 +L 185.150461 455.583868 +L 182.989454 453.396282 +L 179.836999 453.360751 +L 178.90766 452.431413 +L 176.684544 450.17889 +L 173.532089 450.141633 +L 172.669414 449.278958 +L 170.379634 446.956849 +L 167.227179 446.917865 +L 166.435817 446.126503 +L 164.074724 443.730073 +L 163.3187 442.974048 +L 160.922269 440.540327 +L 157.769814 440.498498 +L 157.09291 439.821593 +L 154.617359 437.30561 +L 151.464904 437.26209 +L 150.871952 436.669138 +L 148.312449 434.066011 +L 147.763121 433.516683 +L 145.159994 430.86782 +L 142.007539 430.821555 +L 141.550213 430.364229 +L 138.855084 427.620113 +L 138.446745 427.211774 +L 135.702629 424.416493 +L 132.550174 424.367628 +L 132.241864 424.059319 +L 129.397719 421.160765 +L 129.143818 420.906864 +L 126.245264 417.951701 +L 123.092809 417.900477 +L 122.946741 417.754409 +L 119.940354 414.688265 +L 119.854043 414.601954 +L 116.787899 411.473885 +L 116.763513 411.449499 +L 115.945871 408.297044 +L 116.588299 405.144589 +L 116.787899 404.209435 +L 117.243821 401.992134 +L 117.920322 398.839679 +L 118.624856 395.687224 +L 119.358321 392.534769 +L 119.940354 390.133422 +L 120.115578 389.382314 +L 120.882545 386.229859 +L 121.679597 383.077404 +L 122.507892 379.924949 +L 123.092809 377.784559 +L 123.35878 376.772494 +L 124.220578 373.620039 +L 125.115305 370.467584 +L 126.044455 367.315129 +L 126.245264 366.659709 +L 126.980397 364.162674 +L 127.943842 361.010219 +L 128.944112 357.857764 +L 129.397719 356.481202 +L 129.959663 354.70531 +L 130.995067 351.552855 +L 132.070298 348.4004 +L 132.550174 347.045123 +L 133.160857 345.247945 +L 134.272663 342.09549 +L 135.428049 338.943035 +L 135.702629 338.22085 +L 136.588875 335.79058 +L 137.783055 332.638125 +L 138.855084 329.9165 +L 139.017762 329.48567 +L 140.251746 326.333215 +L 141.536244 323.18076 +L 142.007539 322.06639 +L 142.833456 320.028305 +L 144.161624 316.87585 +L 145.159994 314.599229 +L 145.527839 313.723395 +L 146.901704 310.57094 +L 148.312449 307.470129 +L 148.334941 307.418485 +L 149.756999 304.26603 +L 151.243604 301.113575 +L 151.464904 300.661034 +L 152.728591 297.96112 +L 154.271056 294.808665 +L 154.617359 294.126953 +L 155.818267 291.65621 +L 157.4211 288.503755 +L 157.769814 287.843409 +L 159.02868 285.3513 +L 160.697378 282.198846 +L 160.922269 281.789495 +L 162.363571 279.046391 +L 164.074724 275.947542 +L 164.103017 275.893936 +L 165.828044 272.741481 +L 167.227179 270.309707 +L 167.623474 269.589026 +L 169.428939 266.436571 +L 170.379634 264.85224 +L 171.278996 263.284116 +L 173.175318 260.131661 +z+" clip-path="url(#p88360a4953)" style="fill: #1f9d74; fill-opacity: 0.45"/>+ </g>+ <g id="QuadContourSet_3">+ <path d="M 189.294363 326.25048 +L 189.377098 326.333215 +L 192.446818 329.295874 +L 192.636615 329.48567 +L 192.648035 332.638125 +L 195.599273 335.492523 +L 195.89733 335.79058 +L 195.904443 338.943035 +L 198.751728 341.702808 +L 199.14441 342.09549 +L 201.904183 344.773826 +L 202.378302 345.247945 +L 205.056638 347.850618 +L 205.60642 348.4004 +L 205.605088 351.552855 +L 208.209093 354.088735 +L 208.825667 354.70531 +L 211.361548 357.17809 +L 212.041222 357.857764 +L 214.514003 360.272203 +L 215.25202 361.010219 +L 217.666458 363.370816 +L 218.458316 364.162674 +L 220.818913 366.473686 +L 221.660356 367.315129 +L 223.971368 369.580579 +L 224.858373 370.467584 +L 227.123823 372.691276 +L 228.052586 373.620039 +L 230.276278 375.805569 +L 233.428733 375.755878 +L 234.445349 376.772494 +L 236.581188 378.875817 +L 237.63032 379.924949 +L 239.733643 381.998879 +L 240.812167 383.077404 +L 242.886098 385.124896 +L 246.038553 385.083121 +L 247.18529 386.229859 +L 249.191008 388.213869 +L 252.343463 388.175427 +L 253.55035 389.382314 +L 255.495918 391.310559 +L 256.720128 392.534769 +L 258.648372 394.448058 +L 261.800827 394.414467 +L 263.073584 395.687224 +L 264.953282 397.555846 +L 268.105737 397.525134 +L 269.420282 398.839679 +L 271.258192 400.670121 +L 274.410647 400.642138 +L 277.563102 400.615338 +L 278.939898 401.992134 +L 280.715557 403.765096 +L 283.868012 403.740839 +L 285.271762 405.144589 +L 287.020467 406.893658 +L 290.172922 406.871822 +L 293.325377 406.851064 +L 294.771357 408.297044 +L 296.477832 410.007985 +L 299.630287 409.989498 +L 302.782742 409.972037 +L 305.935197 409.955592 +L 307.429104 411.449499 +L 309.087652 413.117425 +L 312.240107 413.103088 +L 315.392562 413.089725 +L 318.545017 413.077327 +L 321.697472 413.065883 +L 323.233542 414.601954 +L 324.849927 416.233228 +L 328.002382 416.22374 +L 331.154836 416.215175 +L 334.307291 416.20753 +L 337.459746 416.200797 +L 340.612201 416.194972 +L 343.764656 416.190051 +L 346.917111 416.186029 +L 350.069566 416.182905 +L 353.222021 416.180674 +L 356.374476 416.179337 +L 357.949548 417.754409 +L 359.526931 419.357209 +L 361.104314 417.754409 +L 362.679386 416.179337 +L 365.831841 416.180674 +L 368.984296 416.182905 +L 372.136751 416.186029 +L 375.289206 416.190051 +L 378.441661 416.194972 +L 381.594116 416.200797 +L 384.746571 416.20753 +L 387.899026 416.215175 +L 391.051481 416.22374 +L 394.203936 416.233228 +L 395.82032 414.601954 +L 397.356391 413.065883 +L 400.508846 413.077327 +L 403.6613 413.089725 +L 406.813755 413.103088 +L 409.96621 413.117425 +L 411.624758 411.449499 +L 413.118665 409.955592 +L 416.27112 409.972037 +L 419.423575 409.989498 +L 422.57603 410.007985 +L 424.282505 408.297044 +L 425.728485 406.851064 +L 428.88094 406.871822 +L 432.033395 406.893658 +L 433.7821 405.144589 +L 435.18585 403.740839 +L 438.338305 403.765096 +L 440.113964 401.992134 +L 441.49076 400.615338 +L 444.643215 400.642138 +L 447.79567 400.670121 +L 449.63358 398.839679 +L 450.948125 397.525134 +L 454.10058 397.555846 +L 455.980278 395.687224 +L 457.253035 394.414467 +L 460.40549 394.448058 +L 462.333735 392.534769 +L 463.557945 391.310559 +L 465.503513 389.382314 +L 466.7104 388.175427 +L 469.862855 388.213869 +L 471.868572 386.229859 +L 473.01531 385.083121 +L 476.167765 385.124896 +L 478.241695 383.077404 +L 479.320219 381.998879 +L 481.423543 379.924949 +L 482.472674 378.875817 +L 484.608513 376.772494 +L 485.625129 375.755878 +L 488.777584 375.805569 +L 491.001276 373.620039 +L 491.930039 372.691276 +L 494.195489 370.467584 +L 495.082494 369.580579 +L 497.393506 367.315129 +L 498.234949 366.473686 +L 500.595546 364.162674 +L 501.387404 363.370816 +L 503.801842 361.010219 +L 504.539859 360.272203 +L 507.01264 357.857764 +L 507.692314 357.17809 +L 510.228195 354.70531 +L 510.844769 354.088735 +L 513.448775 351.552855 +L 513.447443 348.4004 +L 513.997224 347.850618 +L 516.67556 345.247945 +L 517.149679 344.773826 +L 519.909452 342.09549 +L 520.302134 341.702808 +L 523.149419 338.943035 +L 523.156533 335.79058 +L 523.454589 335.492523 +L 526.405827 332.638125 +L 526.417247 329.48567 +L 526.607044 329.295874 +L 529.676764 326.333215 +L 529.759499 326.25048 +L 532.481499 326.333215 +L 532.911954 328.886447 +L 533.018201 329.48567 +L 533.535837 332.638125 +L 534.017225 335.79058 +L 534.463265 338.943035 +L 534.874729 342.09549 +L 535.252275 345.247945 +L 535.596456 348.4004 +L 535.907726 351.552855 +L 536.064409 353.335414 +L 536.190623 354.70531 +L 536.445192 357.857764 +L 536.666255 361.010219 +L 536.854052 364.162674 +L 537.008755 367.315129 +L 537.130467 370.467584 +L 537.219233 373.620039 +L 537.275044 376.772494 +L 537.297834 379.924949 +L 537.287494 383.077404 +L 537.243866 386.229859 +L 537.166751 389.382314 +L 537.05591 392.534769 +L 536.911067 395.687224 +L 536.73191 398.839679 +L 536.518096 401.992134 +L 536.269248 405.144589 +L 536.064409 407.42732 +L 535.986638 408.297044 +L 535.673006 411.449499 +L 535.323401 414.601954 +L 534.937298 417.754409 +L 534.514148 420.906864 +L 534.053379 424.059319 +L 533.554402 427.211774 +L 533.016604 430.364229 +L 532.911954 430.944916 +L 532.446959 433.516683 +L 531.839001 436.669138 +L 531.190294 439.821593 +L 530.500125 442.974048 +L 529.767762 446.126503 +L 529.759499 446.160787 +L 529.00244 449.278958 +L 528.19338 452.431413 +L 527.339667 455.583868 +L 526.607044 458.162264 +L 526.442314 458.736323 +L 523.454589 458.781953 +L 520.379606 461.888778 +L 520.302134 461.966251 +L 517.149679 462.011934 +L 513.997224 462.056648 +L 511.039226 465.041233 +L 510.844769 465.23569 +L 507.692314 465.277957 +L 504.799607 468.193688 +L 504.539859 468.453435 +L 501.387404 468.493313 +L 498.554194 471.346143 +L 498.234949 471.665388 +L 495.082494 471.702937 +L 491.930039 471.739543 +L 489.186035 474.498598 +L 488.777584 474.907048 +L 485.625129 474.941404 +L 482.472674 474.974832 +L 479.807199 477.651053 +L 479.320219 478.138033 +L 476.167765 478.169293 +L 473.01531 478.199645 +L 470.418142 480.803508 +L 469.862855 481.358795 +L 466.7104 481.387063 +L 463.557945 481.414445 +L 460.40549 481.440943 +L 457.892238 483.955963 +L 457.253035 484.595166 +L 454.10058 484.619681 +L 450.948125 484.643336 +L 447.79567 484.666135 +L 445.350581 487.108418 +L 444.643215 487.815783 +L 441.49076 487.836696 +L 438.338305 487.856775 +L 435.18585 487.876024 +L 432.033395 487.894449 +L 429.658943 490.260873 +L 428.88094 491.038875 +L 425.728485 491.05552 +L 422.57603 491.071361 +L 419.423575 491.0864 +L 416.27112 491.100643 +L 413.118665 491.114093 +L 409.96621 491.126753 +L 407.665027 493.413328 +L 406.813755 494.264599 +L 403.6613 494.275603 +L 400.508846 494.285833 +L 397.356391 494.295293 +L 394.203936 494.303987 +L 391.051481 494.311915 +L 387.899026 494.319081 +L 384.746571 494.325487 +L 381.594116 494.331135 +L 378.441661 494.336026 +L 375.289206 494.340162 +L 372.136751 494.343544 +L 368.984296 494.346174 +L 365.831841 494.348051 +L 362.679386 494.349178 +L 360.435992 496.565783 +L 359.526931 497.474843 +L 358.61787 496.565783 +L 356.374476 494.349178 +L 353.222021 494.348051 +L 350.069566 494.346174 +L 346.917111 494.343544 +L 343.764656 494.340162 +L 340.612201 494.336026 +L 337.459746 494.331135 +L 334.307291 494.325487 +L 331.154836 494.319081 +L 328.002382 494.311915 +L 324.849927 494.303987 +L 321.697472 494.295293 +L 318.545017 494.285833 +L 315.392562 494.275603 +L 312.240107 494.264599 +L 311.388835 493.413328 +L 309.087652 491.126753 +L 305.935197 491.114093 +L 302.782742 491.100643 +L 299.630287 491.0864 +L 296.477832 491.071361 +L 293.325377 491.05552 +L 290.172922 491.038875 +L 289.39492 490.260873 +L 287.020467 487.894449 +L 283.868012 487.876024 +L 280.715557 487.856775 +L 277.563102 487.836696 +L 274.410647 487.815783 +L 273.703282 487.108418 +L 271.258192 484.666135 +L 268.105737 484.643336 +L 264.953282 484.619681 +L 261.800827 484.595166 +L 261.161624 483.955963 +L 258.648372 481.440943 +L 255.495918 481.414445 +L 252.343463 481.387063 +L 249.191008 481.358795 +L 248.63572 480.803508 +L 246.038553 478.199645 +L 242.886098 478.169293 +L 239.733643 478.138033 +L 239.246663 477.651053 +L 236.581188 474.974832 +L 233.428733 474.941404 +L 230.276278 474.907048 +L 229.867828 474.498598 +L 227.123823 471.739543 +L 223.971368 471.702937 +L 220.818913 471.665388 +L 220.499668 471.346143 +L 217.666458 468.493313 +L 214.514003 468.453435 +L 214.254256 468.193688 +L 211.361548 465.277957 +L 208.209093 465.23569 +L 208.014636 465.041233 +L 205.056638 462.056648 +L 201.904183 462.011934 +L 198.751728 461.966251 +L 198.674256 461.888778 +L 195.599273 458.781953 +L 192.611548 458.736323 +L 192.446818 458.162264 +L 191.714195 455.583868 +L 190.860482 452.431413 +L 190.051422 449.278958 +L 189.294363 446.160787 +L 189.2861 446.126503 +L 188.553737 442.974048 +L 187.863568 439.821593 +L 187.214861 436.669138 +L 186.606903 433.516683 +L 186.141908 430.944916 +L 186.037258 430.364229 +L 185.49946 427.211774 +L 185.000483 424.059319 +L 184.539714 420.906864 +L 184.116564 417.754409 +L 183.730461 414.601954 +L 183.380856 411.449499 +L 183.067224 408.297044 +L 182.989454 407.42732 +L 182.784615 405.144589 +L 182.535766 401.992134 +L 182.321952 398.839679 +L 182.142795 395.687224 +L 181.997952 392.534769 +L 181.887111 389.382314 +L 181.809996 386.229859 +L 181.766368 383.077404 +L 181.756028 379.924949 +L 181.778819 376.772494 +L 181.834629 373.620039 +L 181.923396 370.467584 +L 182.045108 367.315129 +L 182.19981 364.162674 +L 182.387608 361.010219 +L 182.608671 357.857764 +L 182.863239 354.70531 +L 182.989454 353.335414 +L 183.146136 351.552855 +L 183.457407 348.4004 +L 183.801587 345.247945 +L 184.179133 342.09549 +L 184.590598 338.943035 +L 185.036637 335.79058 +L 185.518025 332.638125 +L 186.035661 329.48567 +L 186.141908 328.886447 +L 186.572363 326.333215 +z+" clip-path="url(#p88360a4953)" style="fill: #0f6b4e; fill-opacity: 0.75"/>+ </g>+ <g id="patch_6">+ <path d="M 437.140983 116.194364 +C 433.924263 134.437293 424.376385 150.974702 410.185906 162.881928 +C 395.995427 174.789154 378.051286 181.320287 359.526931 181.320287 +C 341.002576 181.320287 323.058435 174.789154 308.867956 162.881928 +C 294.677477 150.974702 285.129599 134.437293 281.912879 116.194364 +" clip-path="url(#p88360a4953)" style="fill: none; stroke-dasharray: 0.6,0.99; stroke-dashoffset: 0; stroke: #5b6675; stroke-width: 0.6; stroke-linejoin: miter"/>+ </g>+ <g id="patch_7">+ <path d="M 631.176113 150.407993 +C 619.917592 214.258242 586.500019 272.139176 536.833342 313.814466 +C 487.166666 355.489756 424.362173 378.348722 359.526931 378.348722 +C 294.691689 378.348722 231.887196 355.489756 182.22052 313.814466 +C 132.553843 272.139176 99.13627 214.258242 87.877749 150.407993 +" clip-path="url(#p88360a4953)" style="fill: none; stroke-dasharray: 0.6,0.99; stroke-dashoffset: 0; stroke: #5b6675; stroke-width: 0.6; stroke-linejoin: miter"/>+ </g>+ <g id="patch_8">+ <path d="M 747.597191 170.93617 +C 731.513589 262.150811 683.774199 344.83786 612.821804 404.373988 +C 541.869409 463.910117 452.148705 496.565783 359.526931 496.565783 +C 266.905157 496.565783 177.184453 463.910117 106.232058 404.373988 +C 35.279663 344.83786 -12.459727 262.150811 -28.543329 170.93617 +" clip-path="url(#p88360a4953)" style="fill: none; stroke-dasharray: 0.6,0.99; stroke-dashoffset: 0; stroke: #5b6675; stroke-width: 0.6; stroke-linejoin: miter"/>+ </g>+ <g id="patch_9">+ <path d="M 514.027221 280.483352 +L 526.693464 268.643168 +Q 531.29937 264.337647 535.604892 268.943553 +L 544.215934 278.155366 +Q 548.521456 282.761273 543.915549 287.066794 +L 531.249306 298.906978 +Q 526.6434 303.212499 522.337878 298.606593 +L 513.726836 289.39478 +Q 509.421314 284.788873 514.027221 280.483352 +z+" clip-path="url(#p88360a4953)" style="fill: #2b3440; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="patch_10">+ <path d="M 396.553991 445.806651 +L 413.740398 443.51513 +Q 419.990001 442.68185 420.823281 448.931452 +L 422.489842 461.430657 +Q 423.323122 467.68026 417.07352 468.51354 +L 399.887113 470.805061 +Q 393.63751 471.638342 392.80423 465.388739 +L 391.137669 452.889534 +Q 390.304389 446.639931 396.553991 445.806651 +z+" clip-path="url(#p88360a4953)" style="fill: #2b3440; stroke: #1d2530; stroke-width: 0.8; stroke-linejoin: miter"/>+ </g>+ <g id="line2d_1">+ <path d="M 20.638023 512.328057 +L 698.415839 512.328057 +" clip-path="url(#p88360a4953)" style="fill: none; stroke: #1d2530; stroke-width: 1.2; stroke-linecap: square"/>+ </g>+ <g id="line2d_2">+ <path d="M 20.638023 31.578676 +L 698.415839 31.578676 +" clip-path="url(#p88360a4953)" style="fill: none; stroke: #1d2530; stroke-width: 2; stroke-linecap: square"/>+ </g>+ <g id="line2d_3">+ <path d="M 359.526931 102.508913 +L 174.320202 423.296377 +" clip-path="url(#p88360a4953)" style="fill: none; stroke: #1d2530; stroke-width: 0.7; stroke-linecap: square"/>+ </g>+ <g id="line2d_4">+ <path d="M 359.526931 102.508913 +L 544.73366 423.296377 +" clip-path="url(#p88360a4953)" style="fill: none; stroke: #1d2530; stroke-width: 0.7; stroke-linecap: square"/>+ </g>+ <g id="line2d_5">+ <path d="M 359.526931 102.508913 +L 97.605064 364.430781 +" clip-path="url(#p88360a4953)" style="fill: none; stroke-dasharray: 2.59,1.12; stroke-dashoffset: 0; stroke: #1d2530; stroke-width: 0.7"/>+ </g>+ <g id="line2d_6">+ <path d="M 359.526931 102.508913 +L 621.448799 364.430781 +" clip-path="url(#p88360a4953)" style="fill: none; stroke-dasharray: 2.59,1.12; stroke-dashoffset: 0; stroke: #1d2530; stroke-width: 0.7"/>+ </g>+ <g id="text_1">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="694.47527" y="507.599375" transform="rotate(-0 694.47527 507.599375)">counter front edge (24 in vanity)</text>+ </g>+ <g id="text_2">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #5b6675" x="24.578592" y="42.386109" transform="rotate(-0 24.578592 42.386109)">backsplash</text>+ </g>+ <g id="text_3">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #5b6675" transform="translate(325.527595 275.937754)">basin 17 x 14 in</text>+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; fill: #5b6675" transform="translate(334.769353 286.139414)">(432 x 356)</text>+ </g>+ <g id="text_4">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="359.526931" y="81.996207" transform="rotate(-0 359.526931 81.996207)">faucet</text>+ </g>+ <g id="text_5">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="292.691095" y="144.272578" transform="rotate(-0 292.691095 144.272578)">100</text>+ </g>+ <g id="text_6">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="125.601506" y="248.681741" transform="rotate(-0 125.601506 248.681741)">350</text>+ </g>+ <g id="text_7">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="25.347753" y="311.327239" transform="rotate(-0 25.347753 311.327239)">500</text>+ </g>+ <g id="text_8">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(549.462342 432.898393)">+/-30 receiver</text>+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(549.462342 441.900443)">(assumed)</text>+ </g>+ <g id="text_9">+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(145.106041 286.555566)">+/-45</text>+ <text style="font-size: 7.5px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(111.883385 295.557616)">(wide window)</text>+ </g>+ <g id="patch_11">+ <path d="M 516.563488 270.732353 +Q 438.734114 188.921011 361.829471 108.081713 +" style="fill: none; stroke: #e0425b; stroke-width: 1.2; stroke-linecap: round"/>+ <path d="M 363.006655 111.93064 +L 361.829471 108.081713 +L 365.614923 109.449322 +" style="fill: none; stroke: #e0425b; stroke-width: 1.2; stroke-linecap: round"/>+ </g>+ <g id="text_10">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(551.03857 258.695587)">Ghost Hand, 38 x 32</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(551.03857 268.297774)">315 mm, 43 deg off axis</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(551.03857 277.899962)">margin 1.8x a hand (2x = 6 dB)</text>+ </g>+ <g id="patch_12">+ <path d="M 404.413554 439.318596 +Q 382.10363 273.481494 359.942771 108.752445 +" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #e0425b; stroke-linecap: round"/>+ <path d="M 358.638823 112.560294 +L 359.942771 108.752445 +L 362.206682 112.080313 +" style="fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #e0425b; stroke-linecap: round"/>+ </g>+ <g id="text_11">+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(427.304713 457.589894)">or the front strip:</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(427.304713 467.192082)">454 mm, 8 deg, margin 3.7x</text>+ </g>+ <g id="patch_13">+ <path d="M 674.772427 511.43363 +Q 674.772427 307.418485 674.772427 103.40334 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 676.572427 507.83363 +L 674.772427 511.43363 +L 672.972427 507.83363 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 672.972427 107.00334 +L 674.772427 103.40334 +L 676.572427 107.00334 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_12">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #5b6675" x="677.136768" y="309.626493" transform="rotate(-0 677.136768 309.626493)">520</text>+ </g>+ <g id="patch_14">+ <path d="M 528.865072 230.971452 +Q 359.526931 230.971452 190.188791 230.971452 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 525.265072 229.171452 +L 528.865072 230.971452 +L 525.265072 232.771452 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 193.788791 232.771452 +L 190.188791 230.971452 +L 193.788791 229.171452 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_13">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="359.526931" y="230.505688" transform="rotate(-0 359.526931 230.505688)">432</text>+ </g>+ <g id="patch_15">+ <path d="M 178.260771 401.88582 +Q 178.260771 262.496002 178.260771 123.106184 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 180.060771 398.28582 +L 178.260771 401.88582 +L 176.460771 398.28582 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 176.460771 126.706184 +L 178.260771 123.106184 +L 180.060771 126.706184 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_14">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="175.89643" y="264.70401" transform="rotate(-0 175.89643 264.70401)">356</text>+ </g>+ <g id="patch_16">+ <path d="M 335.883519 121.317329 +Q 335.883519 112.360335 335.883519 103.40334 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 337.683519 117.717329 +L 335.883519 121.317329 +L 334.083519 117.717329 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 334.083519 107.00334 +L 335.883519 103.40334 +L 337.683519 107.00334 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_15">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: end; fill: #5b6675" x="333.519178" y="114.568343" transform="rotate(-0 333.519178 114.568343)">25</text>+ </g>+ <g id="patch_17">+ <path d="M 379.517518 41.824155 +Q 359.526931 41.824155 339.536344 41.824155 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 375.917518 40.024155 +L 379.517518 41.824155 +L 375.917518 43.624155 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ <path d="M 343.136344 43.624155 +L 339.536344 41.824155 +L 343.136344 40.024155 +" style="fill: none; stroke: #5b6675; stroke-width: 0.8; stroke-linecap: round"/>+ </g>+ <g id="text_16">+ <text style="font-size: 8.5px; font-family: 'DejaVu Sans'; text-anchor: middle; fill: #5b6675" x="359.526931" y="40.570277" transform="rotate(-0 359.526931 40.570277)">53</text>+ </g>+ <g id="text_17">+ <g id="patch_18">+ <path d="M 20.638023 570.499082 +L 417.268023 570.499082 +Q 421.268023 570.499082 421.268023 566.499082 +L 421.268023 528.090332 +Q 421.268023 524.090332 417.268023 524.090332 +L 20.638023 524.090332 +Q 16.638023 524.090332 16.638023 528.090332 +L 16.638023 566.499082 +Q 16.638023 570.499082 20.638023 570.499082 +z+" style="fill: #ffffff; stroke: #cfd6df; stroke-linejoin: miter"/>+ </g>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(20.638023 534.969863)">Darkest: 6 dB margin with a +/-30 deg faucet receiver (357 to 500 mm, 0 to 37 deg off axis)</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(20.638023 544.572051)">Green: works (echo at least a hand's return) with +/-30 deg (309 to 500 mm, 0 to 50 deg off axis)</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(20.638023 554.174238)">Pale: works with a +/-45 deg window (249 to 500 mm, 0 to 60 deg off axis)</text>+ <text style="font-size: 8px; font-family: 'DejaVu Sans'; fill: #1d2530" transform="translate(20.638023 563.776426)">Whole 38 mm case on the counter, 100 to 500 mm from the window, Ghost Hand turned to face it.</text>+ </g>+ <g id="text_18">+ <text style="font-size: 10.5px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #1d2530" x="20.638023" y="17.697539" transform="rotate(-0 20.638023 17.697539)">Top view: where Ghost Hand works on the counter (mm, to scale)</text>+ </g>+ </g>+ </g>+ <defs>+ <clipPath id="p88360a4953">+ <rect x="20.638023" y="23.697539" width="677.777816" height="571.382461"/>+ </clipPath>+ </defs>+</svg>
docs/calcs.jsonadded+217@@ -0,0 +1,217 @@+{+ "title": "Ghost Hand calcs",+ "rev": "2",+ "date": "2026-11-08",+ "charger": {+ "rprog_ohm": 13000.0,+ "i_reg_mA": 76.9,+ "c_rate": 0.51,+ "charge_time_h": 2.44,+ "p_worst_W": 0.135,+ "rise_minimal_copper_C": 31.0,+ "note": "0.51 C: inside the pack's 1 C quick-charge limit (QA.S.0228 form 1), and 4 x less heat in U2 than rev 1"+ },+ "stat_divider": {+ "r_top": 68000.0,+ "r_bot": 100000.0,+ "v_at_4v75": 2.83,+ "v_at_5v0": 2.98,+ "v_at_5v5": 3.27,+ "vih_ok": true,+ "abs_max_ok": true+ },+ "vbus_sense_divider": {+ "r_top": 100000.0,+ "r_bot": 150000.0,+ "v_at_4v75": 2.85,+ "v_at_5v0": 3.0,+ "v_at_5v5": 3.3,+ "vih_ok": true,+ "abs_max_ok": true+ },+ "ldo": {+ "iq_nA": 25,+ "i_rail_peak_mA": 48.1,+ "dropout_at_peak_mV": 64.9,+ "min_vbat_for_3v3": 3.365,+ "note": "the firmware stops at 3.45 V, above the dropout point"+ },+ "vbat_monitor": {+ "divider": "4.7M / 4.7M to GND, always on",+ "v_adc_full": 2.1,+ "ref_V": 2.5,+ "lsb_mV_at_vbat": 4.88,+ "sleep_leak_uA": 0.45,+ "settle_ms": 235,+ "note": "VBAT/2 stays under 2.1 V, inside the 3.3 V rail; C6 (100 nF) holds it for the ADC sample"+ },+ "receiver": {+ "tia_rf_ohm": 150000.0,+ "tia_cf_F": 4.7e-12,+ "tia_bw_kHz": 225.8,+ "hp_corner_kHz": 1.59,+ "stage2_gain": 11,+ "comparator": "AC0 AINP0 (PA7) vs DACREF, threshold RX_REF + 60 mV by default, adapted to the noise floor",+ "cases": [+ {+ "distance_in": 3,+ "off_axis_deg": 0,+ "irradiance_mW_cm2": 0.8611,+ "photo_uA": 12.056,+ "tia_mV": 1808.3,+ "rx_sig_mV": 3000.0+ },+ {+ "distance_in": 3,+ "off_axis_deg": 30,+ "irradiance_mW_cm2": 0.6097,+ "photo_uA": 8.536,+ "tia_mV": 1280.4,+ "rx_sig_mV": 3000.0+ },+ {+ "distance_in": 5.5,+ "off_axis_deg": 0,+ "irradiance_mW_cm2": 0.2562,+ "photo_uA": 3.587,+ "tia_mV": 538.0,+ "rx_sig_mV": 3000.0+ },+ {+ "distance_in": 5.5,+ "off_axis_deg": 30,+ "irradiance_mW_cm2": 0.1814,+ "photo_uA": 2.54,+ "tia_mV": 381.0,+ "rx_sig_mV": 3000.0+ },+ {+ "distance_in": 12,+ "off_axis_deg": 0,+ "irradiance_mW_cm2": 0.0538,+ "photo_uA": 0.753,+ "tia_mV": 113.0,+ "rx_sig_mV": 1243.0+ },+ {+ "distance_in": 12,+ "off_axis_deg": 30,+ "irradiance_mW_cm2": 0.0381,+ "photo_uA": 0.534,+ "tia_mV": 80.0,+ "rx_sig_mV": 880.0+ }+ ],+ "assumed": "faucet emitter 50 mW/sr peak; real units vary 10 to 200 mW/sr, the firmware sets the threshold from what it sees"+ },+ "echo": {+ "emitters": {+ "VSMY2853SL_850nm": {+ "vf_at_300mA_V": 1.8,+ "i_peak_mA": [+ 200,+ 292+ ],+ "ie_mW_sr": [+ 100,+ 146+ ],+ "limit": "IFSM 1 A at tp = 100 us; pulses are 25 us at under 2 % duty"+ },+ "VSMB2948SL_940nm": {+ "vf_at_300mA_V": 1.58,+ "i_peak_mA": [+ 227,+ 319+ ],+ "ie_mW_sr": [+ 45,+ 64+ ],+ "limit": "IFSM 1 A at tp = 100 us; pulses are 25 us at under 2 % duty"+ }+ },+ "r_series_ohm": 8.2,+ "pulse_us": 25,+ "total_peak_mA_at_full": 930,+ "hand_return_W_m2": 0.1045,+ "echo_850_W_m2_at_12in": 1.0764,+ "echo_940_W_m2_at_12in": 0.9688,+ "margin_vs_hand_at_12in_850": 10.3,+ "margin_vs_hand_at_12in_940": 9.3,+ "note": "the echo arrives inside the faucet's own pulse, so a synchronous receiver reads it as a strong reflection"+ },+ "battery_life": {+ "battery": "Adafruit 1317, 150 mAh 1S LiPo",+ "usable_mAh": 128,+ "stop_V": 3.45,+ "sleep_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+ },+ "sleep_total_uA": 4.7,+ "sleep_only_years": 3.1,+ "active_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 (3 emitters, 25 us at 20 Hz)": 0.465,+ "status dot: breathing at 2 % average white, 20 % rail duty": 0.6,+ "LIS2DW12 LP 50 Hz (pick-up and tilt watch)": 0.004+ },+ "active_total_mA": 2.98,+ "hours_of_running": 43.0,+ "mAh_per_10min_session": 0.496,+ "sessions_per_charge": 256,+ "days_per_charge": {+ "1 session a day": 168,+ "3 sessions a day": 73,+ "6 sessions a day": 39+ },+ "self_discharge": "3.0 %/month assumed (0.15 mAh/day), larger than the sleep current",+ "charge_time_h": 2.44,+ "days_per_charge_min_capacity": {+ "6 sessions a day": 37,+ "3 sessions a day": 69+ },+ "once_a_month_bar": {+ "sessions_per_day_for_30_days": 8.0+ },+ "pulse_supply": "the 0.93 A, 25 us echo pulse comes mostly from C15 (100 uF); the pack's average load is about 3 mA, far under its 150 mA (1 C) continuous rating",+ "note": "typical datasheet currents at 25 C; the faucet's pulse rate and the light pattern are the two big unknowns"+ },+ "timing": {+ "session_cap_s": 600,+ "settle_after_set_down_s": 1.5,+ "listen_before_echo_s": 2.0,+ "default_rearm_s": 8.0,+ "blip_start_ms": 600,+ "blip_min_ms": 120,+ "blip_step": 0.85,+ "rearm_margin_s": 1.5,+ "timeout_window_s": [+ 10,+ 60+ ],+ "pickup_g": 0.25,+ "tilt_deg": 30,+ "low_battery_V": 3.45,+ "note": "re-arm proactively at (learned timeout - margin); shorten the blip by 15 % each time the faucet stays on, lengthen 30 % when it misses"+ },+ "hot": {+ "U2": {+ "W": 0.135,+ "why": "MCP73831 linear charger at 77 mA, VBUS 5.25 V, cell 3.5 V"+ },+ "U3": {+ "W": 0.0433,+ "why": "LDO at the peak light current"+ }+ }+}
docs/fab/ghost-hand-rev2-sourcing-bom.csvadded+58@@ -0,0 +1,58 @@+ref,value,function,mpn,manufacturer,package,source,vendor_pn,stock_checked_2026-11-07,mpn_url,note,placement,stock_date,qty_per_board,unit_usd_1,unit_usd_100,price_break_100,price_date +J1,USB4105-GF-A,input,USB4105-GF-A,GCT,USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal,Mouser,640-USB4105-GF-A,390296,https://www.mouser.com/en/ProductDetail/GCT/USB4105-GF-A?qs=KUoIvG%2F9IlY%2FMLlBMpStpA%3D%3D,"USB-C sink, charge only (data pins unconnected)",board,2026-11-07,1,0.8,0.575,100,2026-11-07 +R1 R2,5.1k,input,RC0402FR-075K1L,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-075K1L,1819594,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-075K1L?qs=YUgVZYePFqCSmQuaha43RA%3D%3D,CC1 sink pull-down (USB-C default power),board,2026-11-07,2,0.1,0.007,100,2026-11-07 +D10,SMF5.0A,input,SMF5.0A,Littelfuse,D_SOD-123F,Mouser,821-SMF5.0ARQG,19203,https://www.mouser.com/en/ProductDetail/Taiwan-Semiconductor/SMF5.0A?qs=1mbolxNpo8eR5rZB%252BCLtCw%3D%3D,VBUS surge clamp,board,2026-11-07,1,0.42,0.162,100,2026-11-07 +C1 C2,4.7uF 16V,input,CC0603KRX5R7BB475,Yageo,C_0603_1608Metric,Mouser,603-CC603KRX5R7BB475,199538,https://www.mouser.com/en/ProductDetail/YAGEO/CC0603KRX5R7BB475?qs=57cj7OiSijmnlq47szjeyw%3D%3D,,board,2026-11-07,2,0.24,0.085,100,2026-11-07 +U2,MCP73831T-2ACI/OT,charger,MCP73831T-2ACI/OT,Microchip Technology,SOT-23-5,Mouser,579-MCP73831T-2ACIOT,105982,https://www.mouser.com/en/ProductDetail/Microchip-Technology/MCP73831T-2ACI-OT?qs=yUQqVecv4qvbBQBGbHx0Mw%3D%3D,"4.20 V LiPo charger, 77 mA",board,2026-11-07,1,0.76,0.75,25,2026-11-07 +R3,13k,charger,RC0402FR-0713KL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-0713KL,,https://www.mouser.com/c/?q=RC0402FR-0713KL,I_REG = 1000 V / 13 k = 77 mA (0.51 C on the 150 mAh Adafruit 1317),board,,1,,,, +R4,68k,charger,RC0402FR-0768KL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-0768KL,508441,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0768KL?qs=Is6ZsIPfHkZqrkXGHvEfjA%3D%3D,STAT swings to VBUS: 68k/100k divider keeps it under 3.3 V,board,2026-11-07,1,0.1,0.007,100,2026-11-07 +R5 R6 R13 R16 R17 R21 R25 R26,100k,charger,RC0402FR-07100KL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-07100KL,10453323,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100KL?qs=mnq%2FyloZIXzTlUn7JAHSWg%3D%3D,,board,2026-11-07,8,0.1,0.007,100,2026-11-07 +R7 R15,150k,charger,RC0402FR-07150KL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-07150KL,703725,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07150KL?qs=UOUeRUa%252B8Wn3KcUL8sT7JA%3D%3D,,board,2026-11-07,2,0.1,0.007,100,2026-11-07 +J2,S2B-PH-K-S,charger,S2B-PH-K-S,JST,JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal,Mouser,306-S2BPHKSLFSNPP,38261,https://www.mouser.com/en/ProductDetail/JST-Commercial/S2B-PH-K-SLFSN?qs=cdbOS8ANM9A5Ie4gXeMjTA%3D%3D,"LiPo pack, Adafruit polarity: pin 1 + (red), pin 2 - (black); rev A had them reversed",board,2026-11-07,1,0.12,0.084,100,2026-11-07 +U3,TPS7A0233PDBVR,power,TPS7A0233PDBVR,Texas Instruments,SOT-23-5,DigiKey,296-TPS7A0233PDBVRCT-ND,4163,https://www.digikey.com/en/products/detail/texas-instruments/TPS7A0233PDBVR/12165099,25 nA Iq LDO; Mouser stock thin (34),board,2026-11-07,1,0.95,0.5397,100,2026-11-07 +C3 C4 C8 C11,1uF 25V,power,CL05A105KA5NQNC,Samsung Electro-Mechanics,C_0402_1005Metric,Mouser,187-CL05A105KA5NQNC,366577,https://www.mouser.com/en/ProductDetail/Samsung-Electro-Mechanics/CL05A105KA5NQNC?qs=X6jEic%2FHinDIeFgZnm60Lw%3D%3D,,board,2026-11-07,4,0.31,0.113,100,2026-11-07 +C5 C21,10uF 10V,power,C0603C106M8PACTU,KEMET,C_0603_1608Metric,Mouser,80-C0603C106M8PACTU,299213,https://www.mouser.com/en/ProductDetail/KEMET/C0603C106M8PACTU?qs=gt1LBUVyoHk6B7S%252BOYJa0A%3D%3D,,board,2026-11-07,2,0.98,0.394,100,2026-11-07 +R8 R9,4.7M,power,RC0402FR-074M7L,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-074M7L,117079,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-074M7L?qs=UOUeRUa%252B8WlB6TmWxXROcg%3D%3D,"VBAT/2 into ADC AIN6, always on (0.45 uA), never above 2.1 V",board,2026-11-07,2,0.12,0.008,100,2026-11-07 +C6 C7 C9 C14 C16 C17 C18 C19 C20,100nF,power,CL05B104KO5NNNC,Samsung Electro-Mechanics,C_0402_1005Metric,Mouser,187-CL05B104KO5NNNC,13254012,https://www.mouser.com/en/ProductDetail/Samsung-Electro-Mechanics/CL05B104KO5NNNC?qs=hqM3L16%252BxlfT2SKOuAUq6Q%3D%3D,,board,2026-11-07,9,0.1,0.008,500,2026-11-07 +U1,ATtiny1616-MNR,mcu,ATTINY1616-MNR,Microchip Technology,QFN-20-1EP_3x3mm_P0.4mm_EP1.65x1.65mm,Mouser,556-ATTINY1616MNR,11216,https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1616-MNR?qs=HXFqYaX1Q2yKNpuKQU9qww%3D%3D,"AC0 (PA7) -> event system -> TCB0 (PA5, 850 nm) and TCB1 (PA3, 940 nm) single-shot: hardware IR echo",board,2026-11-07,1,0.9,0.873,25,2026-11-07 +R11 R12,4.7k,mcu,RC0402FR-074K7L,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-074K7L,5051435,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-074K7L?qs=V1yeUXFNrkn%2FmCXC8N8TTA%3D%3D,,board,2026-11-07,2,0.1,0.007,100,2026-11-07 +U4,LIS2DW12TR,motion,LIS2DW12TR,STMicroelectronics,LGA-12_2x2mm_P0.5mm,Mouser,511-LIS2DW12TR,46907,https://www.mouser.com/en/ProductDetail/STMicroelectronics/LIS2DW12TR?qs=u4fy%2FsgLU9NZAt0DqrAehA%3D%3D,set-down / pick-up / tilt; I2C address 0x19 (SA0 high),board,2026-11-07,1,1.79,1.3,100,2026-11-07 +PD1 PD2,VEMD2023SLX01,receiver,VEMD2023SLX01,Vishay,Vishay_SMD-SL_SideLooking_PD,Mouser,78-VEMD2023SLX01,14290,https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VEMD2023SLX01?qs=5csRq1wdUj48jE77ZOyA1Q%3D%3D,"side-looking PIN, 750 to 1050 nm daylight-blocking, +/-35 deg",board,2026-11-07,2,0.86,0.46,100,2026-11-07 +U5,TLV9062IDGKT,receiver,TLV9062IDGKT,Texas Instruments,MSOP-8_3x3mm_P0.65mm,Mouser,595-TLV9062IDGKT,2287,https://www.mouser.com/en/ProductDetail/Texas-Instruments/TLV9062IDGKT?qs=1mbolxNpo8fe4ip52k%252B7Aw%3D%3D,10 MHz dual; powered from PA4 only during a session,board,2026-11-07,1,1.76,1.05,100,2026-11-07 +R28,10R,receiver,RC0402FR-0710RL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-0710RL,2208149,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0710RL?qs=V1yeUXFNrkkzkWCUUWS9og%3D%3D,with C14: 160 kHz RC filter between the GPIO and the op amp supply,board,2026-11-07,1,0.19,0.011,100,2026-11-07 +R14 R18,10k,receiver,RC0402FR-0710KL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-0710KL,25442240,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0710KL?qs=I1mnnYJTTsxUoNwrUsQExA%3D%3D,,board,2026-11-07,2,0.1,0.007,100,2026-11-07 +C12,4.7pF,receiver,GRM1555C1H4R7WA01D,Murata Electronics,C_0402_1005Metric,Mouser,81-GRM1555C1H4R7WA1D,97322,https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H4R7WA01D?qs=ouTquLLW2S5qwZJBh3x8FA%3D%3D,"TIA feedback, 226 kHz",board,2026-11-07,1,0.13,0.042,100,2026-11-07 +C13,1nF,receiver,GRM1555C1H102JA01D,Murata Electronics,C_0402_1005Metric,Mouser,81-GRM1555C1H102JA1D,4478067,https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H102JA01D?qs=%2FOTtAhf8R8ZL4biNptvoUQ%3D%3D,"AC coupling, 1.6 kHz high-pass with R16",board,2026-11-07,1,0.11,0.02,100,2026-11-07 +D1,VSMY2853SL,emitter,VSMY2853SL,Vishay,Vishay_SMD-SL_SideLooking_AK,Mouser,78-VSMY2853SL,11798,https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMY2853SL?qs=5csRq1wdUj5LLuw5br%2F28g%3D%3D,"850 nm side-looking, 50 mW/sr at 100 mA, +/-28 deg",board,2026-11-07,1,1.01,0.532,100,2026-11-07 +D2 D3,VSMB2948SL,emitter,VSMB2948SL,Vishay,Vishay_SMD-SL_SideLooking_KA,Mouser,78-VSMB2948SL,4462,https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMB2948SL?qs=5csRq1wdUj7tHqVBoZkgQA%3D%3D,"940 nm side-looking, 20 mW/sr at 100 mA, +/-25 deg",board,2026-11-07,2,0.68,0.385,100,2026-11-07 +R19 R22 R23,8.2R,emitter,RC0603FR-078R2L,Yageo,R_0603_1608Metric,Mouser,603-RC0603FR-078R2L,,https://www.mouser.com/c/?q=RC0603FR-078R2L,"(4.2 - 1.8) / 8.2 = 293 mA peak, 25 us pulses (rev 2: 12 -> 8.2 ohm for the off-axis counter spots)",board,,3,,,, +Q1 Q2,DMN2041L-7,emitter,DMN2041L-7,Diodes Incorporated,SOT-23,Mouser,621-DMN2041L-7,897,https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMN2041L-7?qs=tiksPeNXt0LSbn3jTreVOg%3D%3D,"20 V N-FET, 26 mOhm at 2.5 V gate",board,2026-11-07,2,0.53,0.222,100,2026-11-07 +R20 R24,100R,emitter,RC0402FR-07100RL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-07100RL,10008612,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100RL?qs=V1yeUXFNrknwaJOOZ4yDtg%3D%3D,gate series,board,2026-11-07,2,0.1,0.007,100,2026-11-07 +C15,100uF 6.3V,emitter,JMK316BJ107ML-T,Taiyo Yuden,C_1206_3216Metric,Mouser,963-JMK316BJ107ML-T,228677,https://www.mouser.com/en/ProductDetail/TAIYO-YUDEN/JMK316BJ107ML-T?qs=I6KAKw0tg2ze5%252Bz37ec%2FZg%3D%3D,pulse reservoir: 650 mA for 25 us sags about 0.4 V at the 40 uF left under 4 V bias,board,2026-11-07,1,1.07,0.488,100,2026-11-07 +Q3,DMG2305UX-13,lights,DMG2305UX-13,Diodes Incorporated,SOT-23,Mouser,621-DMG2305UX-13,3675,https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMG2305UX-13?qs=L1DZKBg7t5Hgw5KN3G2IRg%3D%3D,LED rail switch (high side),board,2026-11-07,1,0.41,0.169,100,2026-11-07 +R27,33R,lights,RC0402FR-0733RL,Yageo,R_0402_1005Metric,Mouser,603-RC0402FR-0733RL,1632975,https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0733RL?qs=V1yeUXFNrkk7PcMc%252BKdghg%3D%3D,data series,board,2026-11-07,1,0.1,0.007,100,2026-11-07 +D4 D5 D6 D7 D8,WS2812B-2020,lights,WS2812B-2020,Worldsemi,WS2812B-2020,Adom stock,adom/ws2812b-2020,0,https://wiki.adom.inc/adom/ws2812b-2020,STATUS dot (state; replaces the rev 1 logo light); Adom basic part (wiki adom/ws2812b-2020),board,2026-11-07,5,0.0453,0.0453,1,2026-11-07 +MP1,MachinePinMediumShort,molecule,no part,,MachinePinMediumShort,no part,,,,"corner machine pin, seats in the case socket",board,,1,,,, +MP2,MachinePinMediumShort,molecule,no part,,MachinePinMediumShort,no part,,,,"corner machine pin, seats in the case socket",board,,1,,,, +MP3,MachinePinMediumShort,molecule,no part,,MachinePinMediumShort,no part,,,,"corner machine pin, seats in the case socket",board,,1,,,, +MP4,MachinePinMediumShort,molecule,no part,,MachinePinMediumShort,no part,,,,"corner machine pin, seats in the case socket",board,,1,,,, +MC1,GND,molecule,no part,,MachineContactMedium,no part,,,,machine contact,board,,1,,,, +MC2,VBAT,molecule,no part,,MachineContactMedium,no part,,,,machine contact,board,,1,,,, +MC3,3V3,molecule,no part,,MachineContactMedium,no part,,,,machine contact,board,,1,,,, +MC4,UPDI,molecule,no part,,MachineContactMedium,no part,,,,machine contact,board,,1,,,, +TP1,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for VBAT (test plan),board,,1,,,, +TP2,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for 3V3 (test plan),board,,1,,,, +TP3,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for VBUS (test plan),board,,1,,,, +TP4,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for PROG (test plan),board,,1,,,, +TP5,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for CHG_STAT (test plan),board,,1,,,, +TP6,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for VLED (test plan),board,,1,,,, +TP7,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for RX_REF (test plan),board,,1,,,, +TP8,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for TIA_OUT (test plan),board,,1,,,, +TP9,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for RX_SIG (test plan),board,,1,,,, +TP10,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for ECHO_EVT (test plan),board,,1,,,, +TP11,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for IR850_G (test plan),board,,1,,,, +TP12,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for IR850_D (test plan),board,,1,,,, +TP13,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for IR940_D (test plan),board,,1,,,, +TP14,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for LED_D0 (test plan),board,,1,,,, +TP15,TP_0.5mm,test,no part,,Adom_TestPoint_D0.5mm,no part,,,,probe spot for UPDI (test plan),board,,1,,,, +BT1,150mAh 1S LiPo,battery,1317,Adafruit,"pouch 19.75 x 26.02 x 3.8 mm, 127.5 mm leads, JST PHR-2",Mouser,485-1317,111,https://www.mouser.com/c/?q=485-1317,"off-board, plugs into J2. Polarity: + on JST circuit 1 (red), - on circuit 2 (black), as on every Adafruit pack; J2 pin 1 = VBAT. PKCell LP402025 with PCM, 1 C max continuous",off-board,2026-11-08,1,5.95,5.95,1,2026-11-08
docs/studio/aim-1a954333.pngadded⋯ 1 unchanged line ⋯
docs/studio/architecture-d33ab047.pngadded⋯ 1 unchanged line ⋯
docs/studio/battery-d45750c5.pngadded⋯ 1 unchanged line ⋯
docs/studio/charging-9f179081.pngadded⋯ 1 unchanged line ⋯
docs/studio/lights-5f231aa2.pngadded⋯ 1 unchanged line ⋯
firmware/README.md+23−11@@ -1,6 +1,6 @@ # Ghost Hand firmware -Firmware for Ghost Hand rev A: an ATtiny1616 that keeps an automatic (infrared sensor) faucet running+Firmware for Ghost Hand rev 2: an ATtiny1616 that keeps an automatic (infrared sensor) faucet running while someone stands at the sink. It hears the faucet's own IR interrogation pulse and fires an IR echo back inside that same pulse, so the faucet sees a hand. The echo path is pure hardware (analog comparator, event system, two timers); the CPU sleeps between pulses and only decides *when*@@ -59,7 +59,7 @@ stateDiagram-v2 ``` The gauge (3 s fill) and the listen phase overlap: the receiver powers up while the gauge fills, so the-echo is armed about 2 s after set-down. The logo then breathes while armed.+echo is armed about 2 s after set-down. The STATUS dot then breathes while armed. ## How the learning works @@ -154,6 +154,7 @@ re-armed by a blip longer than its run-on; for FALLBACK faucets the blip cannot | Main tick | 64 Hz (RTC PIT), lights at 32 Hz | `power.c` | | Done / low / unplugged shows | 3 s / 2 s / 2 s | `main.c` | | Full charge | four green 5 s, then a dim pulse every 10 s | `leds.c` |+| Charge (USB) | 77 mA (Rprog 13k, 0.5 C), about 2.4 h from empty | hardware (MCP73831) | ## Pin table @@ -180,21 +181,29 @@ re-armed by a blip longer than its run-on; for FALLBACK faucets the blip cannot ## Power states -Currents are the typical values of the design's battery-life calculation (25 C, 500 mAh pack, 425 mAh-usable, stop at 3.45 V).+Currents are the typical values of the design's battery-life calculation (`design/calcs.json`, 25 C,+Adafruit 1317 150 mAh pack, 128 mAh usable, stop at 3.45 V). | State | MCU | Peripherals on | Current | |---|---|---|---| | Sleep | power-down, PIT off, wake on PA2 / PB2 edges | accel LP mode 1 12.5 Hz wake-up, everything else off | 4.7 uA total (MCU 0.1, accel 1.0, LDO 0.025, charger 0.15, VBAT divider 9.4 Mohm 0.42, pack protection 3.0) | | Settle / charging display | standby between 64 Hz ticks | accel 50 Hz, LEDs | about 1 mA plus the lights |-| Session | standby with OSC20M kept on by the TCBs, IDLE only during the 0.2 ms blanking | receiver, AC0, DAC0, TCB0/1, accel 50 Hz | 2.84 mA average (MCU 0.8, receiver 1.08, bias 0.03, echo pulses 0.33, light 0.6, accel 0.004) |+| Session | standby with OSC20M kept on by the TCBs, IDLE only during the 0.2 ms blanking | receiver, AC0, DAC0, TCB0/1, accel 50 Hz | 2.98 mA average (MCU 0.8, receiver 1.08, bias 0.03, echo pulses 0.47 with the 8.2 ohm resistors, status dot 0.6, accel 0.004) |+| Charging | standby, lights only | MCP73831 at 77 mA from USB-C | the gauge shows the level | -That gives about 0.47 mAh per 10-minute session, roughly 900 sessions per charge, and 10.3 years of-pure sleep (self-discharge of the cell dominates long before that). Charging takes about 3.2 h at 196 mA.+That gives about 0.50 mAh per 10-minute session, about 256 sessions per charge: 39 days at six sessions+a day, 73 at three, 168 at one, so charging once a month holds up to about 7.6 sessions a day. Pure sleep+alone would last 3.1 years; the cell's self-discharge (about 3 % a month) is larger than the sleep+current. Charging takes about 2.4 h at 77 mA (0.5 C). ## LED behaviour -| State | Logo (LED 0) | Gauge (LEDs 1 to 4) |+Rev 2 has no logo light. The WS2812B-2020 chain is D4 (the STATUS dot, LED 0) and then D5 to D8 (the+charge gauge 25 / 50 / 75 / 100 %, LEDs 1 to 4). Every light is a 1.5 mm round clear-resin pipe sitting+on its LED, with an opaque wall between pipes; the silkscreen and the case engraving name each one. The+STATUS dot shows everything rev 1's logo showed.++| State | STATUS dot (D4) | Gauge (D5 to D8) | |---|---|---| | Session start | wakes up dim | fills to the battery level over 1.5 s, held to 3 s (amber at 25 % or less) | | Armed | soft cyan-white breathing, 4 s period | off |@@ -206,8 +215,11 @@ pure sleep (self-discharge of the cell dominates long before that). Charging tak | Full | off | all four green 5 s, then a dim pulse every 10 s | | Unplugged | off | the level for 2 s | -Total brightness is capped (sum of all 15 channel values at most 950, about 45 mA at 12 mA per channel)-so the 3.3 V LDO stays under 60 mA with the MCU and receiver.+Sized for a 1.5 mm dot: a dot right on its LED looks several times brighter than rev 1's spread-out+logo at the same drive, so the levels are about half of rev 1's (status breath 2 to 12 of 255 instead+of 3 to 24, gauge 28 instead of 40, red 24 instead of 40). Total brightness is capped (sum of all 15+channel values at most 640, about 30 mA at 12 mA per channel), which keeps the 150 mAh cell's peak load+at 0.2 C and the 3.3 V LDO far under 60 mA with the MCU and receiver. The WS2812 data pin (PB5) has no SPI, USART or CCL output on this chip, so the driver is a cycle-counted loop. At 5 MHz a 1.25 us bit is only 6 cycles, and 20 MHz needs 4.5 V, so the clock is raised to@@ -227,7 +239,7 @@ Measured with avr-gcc 7.3.0 (Microchip AVR 8-bit toolchain 3.7.0) and the Microc ``` text data bss dec hex filename- 13130 2 366 13498 34ba build/ghost-hand.elf+ 13122 2 366 13490 34b2 build/ghost-hand.elf ``` 13.1 KB of 16 KB flash, 368 B of 2 KB SRAM, 20 B of EEPROM.
firmware/build/ghost-hand.hex+172−172@@ -6,10 +6,10 @@ :100050000C945B000C945B000C945B000C945B00B4 :100060000C945B000C945B000C945B000C945B00A4 :100070000C945B000C945B000C945B0011241FBE7D -:10008000CFEFCDBFDFE3DEBF18E3A0E0B8E3EAE4E3 +:10008000CFEFCDBFDFE3DEBF18E3A0E0B8E3E2E4EB :10009000F3E302C005900D92A230B107D9F729E32E :1000A000A2E0B8E301C01D92A037B207E1F70E94B9 -:1000B00050090C948E190C9400004F925F926F922D +:1000B00050090C948A190C9400004F925F926F9231 :1000C0007F928F929F92AF92BF92CF92DF92EF92E8 :1000D000FF920F931F93FC01AAE6B9E3CD90DC9049 :1000E00011970D2C000CEE08FF0840815181052E60 @@ -19,9 +19,9 @@ :10012000FF088C189D08AE08BF081496CD90DC908F :100130000D2C000CEE08FF0844805580052C000CA7 :1001400066087708C418D508E608F7089801AC01D6 -:100150000E94DA182B013C01A5019401C501B401EC -:100160000E94DA18460E571E681E791EA7019601D6 -:10017000C701B6010E94DA18640D751D861D971D12 +:100150000E94D6182B013C01A5019401C501B401F0 +:100160000E94D618460E571E681E791EA7019601DA +:10017000C701B6010E94D618640D751D861D971D16 :100180001F910F91FF90EF90DF90CF90BF90AF90B5 :100190009F908F907F906F905F904F9008954F92B7 :1001A0005F926F927F928F929F92AF92BF92CF9207 @@ -35,21 +35,21 @@ :10022000C7953A95E1F71296ED91FC911397F7FD7A :100230007F9625E0F595E7952A95E1F714964D917F :100240005C9157FF02C0415E5F4F95E05595479521 -:100250009A95E1F79601DE010E9465194B015C0158 -:100260009701DF010E946519860E971EA81EB91E10 -:100270009801DA010E946519860E971EA81EB91E04 +:100250009A95E1F79601DE010E9461194B015C015C +:100260009701DF010E946119860E971EA81EB91E14 +:100270009801DA010E946119860E971EA81EB91E08 :10028000181419041A041B040CF06DC09601D60151 -:100290000E9465192B013C019701D7010E94651945 +:100290000E9461192B013C019701D7010E9461194D :1002A00073016201C60ED71EE81EF91E9801D8011F -:1002B0000E946519C60ED71EE81EF91EC114D1048E -:1002C000E104F10409F44FC09E01DE010E946519AA -:1002D0002B013C019F01DF010E946519460E571E4C -:1002E000681E791E9A01DA010E946519460E571E92 +:1002B0000E946119C60ED71EE81EF91EC114D10492 +:1002C000E104F10409F44FC09E01DE010E946119AE +:1002D0002B013C019F01DF010E946119460E571E50 +:1002E000681E791E9A01DA010E946119460E571E96 :1002F000681E791E4114510461047104A1F1A50125 -:100300009401C501B4010E94DA184B015C0182E03E +:100300009401C501B4010E94D6184B015C0182E042 :10031000880C991CAA1CBB1C8A95D1F7A3E0B0E0FD -:10032000A70196010E9483199B01AC01C301B20190 -:100330000E94DA1821E086169706A806B90608F08A +:10032000A70196010E947F199B01AC01C301B20194 +:100330000E94D61821E086169706A806B90608F08E :1003400020E0822FDF91CF911F910F91FF90EF90CE :10035000DF90CF90BF90AF909F908F907F906F90E5 :100360005F904F90089521E0ECCFFC0123E18FEFE7 @@ -69,16 +69,16 @@ :10044000CF92DF92EF92FF920F931F93CF93DF93A0 :1004500000915D3910915E398091683990916939C8 :10046000019680936839909369399801A3E7B0E0C9 -:100470000E946D1924E630E040E050E00E941E1911 +:100470000E94691924E630E040E050E00E941A1919 :1004800069017A01C0911939D0911A392097D9F0B0 -:100490002091273930912839ABE0B0E00E946D19E6 -:1004A0002AE030E040E050E00E941E19DA01C90164 +:100490002091273930912839ABE0B0E00E946919EA +:1004A0002AE030E040E050E00E941A19DA01C90168 :1004B0008C0F9D1FA11DB11DC816D906EA06FB06AB :1004C00010F46C017D0121EDC21627E0D206E10493 :1004D000F10430F080EDC82E87E0D82EE12CF12C0D :1004E000C0911739D0911839CC15DD0508F4E60113 :1004F000C0931739D09318399801ADE0B0E00E944D -:100500006D192AE030E040E050E00E941E192837C3 +:1005000069192AE030E040E050E00E941A192837CB :1005100031054105510560F1213D87E0380741056E :10052000510548F5C217D30708F4E901C0931539FE :10053000D093163980911B3990911C398C509E4F65 @@ -121,13 +121,13 @@ :100780009091FD388834974489F48091FE38813007 :1007900069F4C0910E398CEF98E30E94B50191E0A5 :1007A000C81390E0892F8170CF91089580E0FBCF2E -:1007B0000F931F93CF93A6E3B3EB41E050E0ED918D +:1007B0000F931F93CF93AEE2B3EB41E050E0ED9186 :1007C000FD91E817F90778F1BA0161507109DB0171 -:1007D000AA0FBB1FAC5CBC440D911C91E01BF10B3C -:1007E000675D7C44DB01CC91475D5C44DA012C9170 +:1007D000AA0FBB1FA45DBC440D911C91E01BF10B43 +:1007E0006F5D7C44DB01CC914F5D5C44DA012C9160 :1007F000422F4C1B550BDA019C01201B310B0E9430 -:100800007C199F0136952795620F731F811D911DDD -:100810009F0150E040E00E941E198C2F820FCF9163 +:1008000078199F0136952795620F731F811D911DE1 +:100810009F0150E040E00E941A198C2F820FCF9167 :100820001F910F9108954F5F5F4F4B30510539F67F :1008300084E6F5CF8091010180FDFCCF88ED98E042 :1008400084BF9093000108959091A0009F7830E1BB @@ -137,7 +137,7 @@ :100880008093080680910B0680FFFCCF2091100614 :10089000309111061092000602C0369527954A95B0 :1008A000E2F750E040E0611110C06CE474E080E0D9 -:1008B00090E00E94DA18DC01CB012AE0B695A795FA +:1008B00090E00E94D618DC01CB012AE0B695A795FE :1008C000979587952A95D1F7089564EC79E080E0B3 :1008D00090E0EFCFCF92DF92EF92FF92CF93C4E000 :1008E000C12CD12C76012FE144E061E086E00E942A @@ -151,7 +151,7 @@ :10096000430190FF04C017FD02C06F5F7F4F8FBF30 :1009700090E080E0CB017727662730E020E0602B15 :10098000712B822B932B1F910F9108950E94A3042A -:100990009B01AC01ADE7B0E00E94831927E096957A +:100990009B01AC01ADE7B0E00E947F1927E096957E :1009A0008795779567952A95D1F70895CF92DF922D :1009B000EF92FF926B017C0180912539909126394D :1009C00080931D3990931E39809127399091283951 @@ -167,13 +167,13 @@ :100A6000845691098B372DE0920718F0CF910C94A2 :100A7000D80380E0CF910895DF92EF92FF920F9319 :100A80001F93CF93DF93482FF62E0091C438EBEDE0 -:100A9000F8E330E088E2E82ECFEFD0E096E0D92E00 +:100A9000F8E330E08CE1E82ECFEFD0E09BE0D92EF8 :100AA0002FEF341718F02F2D431320E02E9DC00197 -:100AB0001124BE010E94F618162F3F5F0A31A8F4D8 -:100AC00050E1259FC0011124BE010E94F6186383E6 -:100AD000148315823396343019F7DF91CF911F912B -:100AE0000F91FF90EF90DF900895638314822D9D06 -:100AF000C0011124BE010E94F6186583EBCF80E28D +:100AB0001124BE010E94F218162F3F5F0A31A0F4E4 +:100AC0002D9DC0011124BE010E94F218638314837E +:100AD00015823396343021F7DF91CF911F910F911A +:100AE000FF90EF90DF9008956383148254E0259F78 +:100AF000C0011124BE010E94F2186583EACF80E292 :100B00008093260480E1809325041092CB381092C4 :100B1000C538ECECF8E3119288E3EB3DF807D9F720 :100B20000895F89480938F38882331F010929201C1 @@ -221,7 +221,7 @@ :100DC0007F4F88E20E948406D82E882371F1FE01AD :100DD0003196AE01495F5F4F7A01A1818081BA2FC0 :100DE000A82F84E0B595A7958A95E1F72AEF30E022 -:100DF0000E947C19672F782F892F992787FD9A9554 +:100DF0000E947819672F782F892F992787FD9A9558 :100E0000DA016D937D93AD013296EE16FF0629F758 :100E10008F819885F8018083918389859A85828363 :100E200093838B859C85848395838D2D2C96CDBF54 @@ -337,7 +337,7 @@ :10150000EF3881E00E9427051093C5388093C438D6 :10151000C092C638D092C738E092C838F092C93825 :101520009FB7F8948091F93881112AC09FBF8091AC -:10153000F9388111F5CF8091EA3881110C94D718D0 +:10153000F9388111F5CF8091EA3881110C94D318D4 :1015400082E08160809350007894889510925000DA :10155000E7CF10E0BECF86E08093F038C092EC3841 :10156000D092ED38E092EE38F092EF3880E00E94B1 @@ -345,7 +345,7 @@ :101580008091F93881508093F9389FBFA8950E94C7 :10159000C6042B013C011091EB381F5F1093EB3810 :1015A000E091F038E73008F02FC1F0E0E652F54F57 -:1015B0000C945F19FD0AE10A590C66157D15941506 +:1015B0000C945B19FD0AE10A590C66157D1594150A :1015C000EF150E9495048823A1F015E01093F038E0 :1015D0004092EC385092ED386092EE387092EF38CD :1015E0001092C13881E00E9427051093C5380C94F1 @@ -357,7 +357,7 @@ :10164000609264387092653810917E381123B1F041 :1016500080917D38811112C087E798E30E945D0078 :101660006532744F8105910530F487E798E30E9455 -:10167000CF00882319F081E080937D3880E293EBDE +:10167000CF00882319F081E080937D3888E193EBD7 :101680000E94CF0020917D38111102C021E030E08E :101690004091623850916338609164387091653838 :1016A00073016201C41AD50AE60AF70AB701A60156 @@ -385,11 +385,11 @@ :1018000010928F381092BC388091EB3880FD8FCECB :101810008091F038882309F48ACE0E94C604009192 :10182000C6381091C7382091C8383091C9386B013B -:101830007C01C01AD10AE20AF30A6BED862E68E336 -:10184000962E8AEE98E35401D5011D925D018A1708 +:101830007C01C01AD10AE20AF30AEBED8E2EE8E32E +:101840009E2E8AEE98E35401D5011D925D018A1700 :101850009B07D1F7E091C538E150E73010F00C94C8 -:101860006516F0E0EA5CF34F0C945F191716D41676 -:10187000331772178B17EA17631848395A436105F3 +:101860006216F0E0EA5CF34F0C945B191716D11680 +:1018700030176F178817E6175F1848395A43610504 :10188000710508F0BACE8091EC389091ED38A091B6 :10189000EE38B091EF38481A590A6A0A7B0A90EC80 :1018A000491694ED590691E06906710408F0A5CE39 @@ -431,7 +431,7 @@ :101AE0009F30B9F6698D7A8D645C7F4F693EF3E073 :101AF0007F0710F068EE73E06A3401E0700710F4BD :101B00006AE471E090E080E0982F872F762F6627B7 -:101B10002CE434E040E050E00E941E192093A1061E +:101B10002CE434E040E050E00E941A192093A10622 :101B20001092A6381092A7381092A8381092A938AF :101B30001092BA381092BB381092A5381092A4387F :101B4000F8941092920110929D011092500A1092F6 @@ -444,7 +444,7 @@ :101BB00069017A01C81AD90AEA0AFB0AD701C601E3 :101BC0000397A105B10508F46AC01093A4382093C7 :101BD0009B3830939C3840939D3850939E38ADE7A6 -:101BE000B0E00E948319DC01CB0147E0B695A795D0 +:101BE000B0E00E947F19DC01CB0147E0B695A795D4 :101BF000979587954A95D1F7CFA0D8A4E9A4FAA4E0 :101C00008C199D09AE09BF092091BB38222339F1F7 :101C1000E091BA38E83018F5C090A638D090A738CF @@ -465,7 +465,7 @@ :101D00004150510912976017710708F489C0880F74 :101D1000991FDC01A158B74C6D937C932F5F3F4F07 :101D200032962F1500F3F694EF2DF0E0EE0FFF1F23 -:101D3000E158F74C8081918165E070E00E94F618CF +:101D3000E158F74C8081918165E070E00E94F218D3 :101D40006B5F7F4F6932710510F068E270E06830B8 :101D5000710510F468E070E06093003815E0619F51 :101D6000C001112402972FE230E02093993830937C @@ -491,13 +491,13 @@ :101EA0000B39309729F1C801B0E0A0E0AF0170E034 :101EB00060E0481759076A077B0708F021C16801ED :101EC0007D01C41AD50AE60AF70AA7019601AAE01D -:101ED000B0E00E9483196B017C019F01A3E0B0E098 -:101EE0000E946D196C157D058E059F0508F40FC1C4 +:101ED000B0E00E947F196B017C019F01A3E0B0E09C +:101EE0000E9469196C157D058E059F0508F40FC1C8 :101EF00083E1ECEFF8E3AFE0B9E301900D928A954E :101F0000E1F70115110549F400911D3910911E39B1 :101F10000115110511F408EE13E000932539109313 :101F2000263960911F39709120396115710529F4A6 -:101F3000C80163E070E00E94F6186017710708F0AE +:101F3000C80163E070E00E94F2186017710708F0B2 :101F400018C1609327397093283910922239109262 :101F50002339109224398092293990922A39A092FB :101F60002B39B0922C3980922D3990922E39A09233 @@ -533,13 +533,13 @@ :102140001092193910921A398CED95E080931B3951 :1021500090931C3910921D3910921E3910921F391C :10216000109220398FE099E30E94B50180932139C4 -:10217000C8CEC80163E070E00E94F618E2CE298163 +:10217000C8CEC80163E070E00E94F218E2CE298167 :102180003A814B815C818091A4388823A9F08091A9 :102190009B3890919C38A0919D38B0919E386901F0 :1021A0007A01C81AD90AEA0AFB0AD701C6010397BD :1021B000A105B10508F434C12092A43820939B38BE :1021C00030939C3840939D3850939E38ADE7B0E0F3 -:1021D0000E948319DC01CB0147E0B695A79597953E +:1021D0000E947F19DC01CB0147E0B695A795979542 :1021E00087954A95D1F77C018D012FA138A549A586 :1021F0005AA5E21AF30A040B150BE9A2FAA20BA3E3 :102200001CA38091393990913A39A0913B39B09112 @@ -560,8 +560,8 @@ :1022F000280F391F411D511DDA01C901B695A79557 :102300009795879533243394C816D906EA06FB06B9 :1023100008F440C0312C3EC0C12CD12C76018CCFAA -:10232000A5E0B0E0A70196010E94831968AB79ABE4 -:102330008AAB9BAB9801A3E0B0E00E946D1928A97D +:10232000A5E0B0E0A70196010E947F1968AB79ABE8 +:102330008AAB9BAB9801A3E0B0E00E94691928A981 :1023400039A94AA95BA9261737074807590710F783 :102350002092223920921239C0922739D0922839FE :1023600080914A39882309F444C18091463990917B @@ -570,7 +570,7 @@ :102390008093243980912239813049F5332009F422 :1023A00038C10091273910912839C701B601601B47 :1023B000710B8109910928E030E040E050E00E9473 -:1023C0004019200F311F2530310508F41BC120931F +:1023C0003C19200F311F2530310508F41BC1209323 :1023D00027393093283909A11AA12BA13CA10093D8 :1023E0003539109336392093373930933839C092C4 :1023F0003139D0923239E0923339F0923439332086 @@ -585,7 +585,7 @@ :10248000F12CE12CC80ED91EE11CF11CF694E79446 :10249000D794C794C416D506E606F70640F5DB01C7 :1024A000CA01880F991FAA1FBB1F89A39AA3ABA3B8 -:1024B000BCA3A5E0B0E00E946D1909A11AA12BA14F +:1024B000BCA3A5E0B0E00E94691909A11AA12BA153 :1024C0003CA1601771078207930768F0809131394A :1024D00090913239A0913339B0913439C816D90668 :1024E000EA06FB0620F410923D390E942C039091DD @@ -600,19 +600,19 @@ :102570006201C81AD90AEA0AFB0AD701C6018C32DD :102580009140A105B10590F08091A33840929F3809 :102590005092A0386092A1387092A23890E00196D3 -:1025A00063E070E00E940A198093A33830912339C8 -:1025B000E091A338F0E0EA5DFC44908180E03130A6 +:1025A00063E070E00E9406198093A33830912339CC +:1025B000E091A338F0E0E25EFC44908180E03130AD :1025C00029F080E090FD80E291FD886098E29827F4 :1025D000909302048093010421E080E0313019F0EF :1025E00020E080913D3981708093C3382093C238B8 :1025F000F2C989A19AA1ABA1BCA18C199D09AE0910 :10260000BF09BBCE45E050E04093273950932839AD -:10261000E2CE9801A3E0B0E00E946D19C616D7067D +:10261000E2CE9801A3E0B0E00E946919C616D70681 :10262000E806F90608F0E3CE809127399091283921 :102630002CA53DA54EA55FA5280F391F411D511D95 :10264000DA01C901B695A795979587958C159D05D3 :10265000AE05BF0508F0CBCEC701B601601B710BFC -:102660008109910928E030E040E050E00E944019E3 +:102660008109910928E030E040E050E00E943C19E7 :10267000200F311F2093253930932639B8CE1BA562 :10268000123009F0CDCE20926139CACE80915939ED :1026900090915A39A0915B39B0915C3988169906AE @@ -664,7 +664,7 @@ :1029700080916139811142C08091513990915239D1 :10298000A0915339B091543988159905AA05BB0512 :1029900008F0BFCD80914C39882369F120915D39D1 -:1029A00030915E39A3E0B0E00E946D19DC01CB01EB +:1029A00030915E39A3E0B0E00E946919DC01CB01EF :1029B000B695A7959795879581342FE19207A10544 :1029C000B10520F080E49FE1A0E0B0E080935F39A2 :1029D0009093603980916239909163390196809328 @@ -679,7 +679,7 @@ :102A60008091663990916739019680936639909389 :102A700067392093193930931A3900911739109119 :102A800018390837110510F408E710E0A5E5B0E0A3 -:102A90000E946D1924E630E040E050E00E941E19CB +:102A90000E94691924E630E040E050E00E941A19D3 :102AA0000217130708F4890100931539109316399A :102AB0008F2D80658093243910924C3910922339E0 :102AC00028CD382D292D9A2D8B2DB8CF8091EC381B @@ -705,119 +705,119 @@ :102C00008091EC389091ED38A091EE38B091EF388A :102C1000481A590A6A0A7B0A60ED461667E05606AA :102C20006104710410F40C94040C0C94FD0A2091BE -:102C3000C438822F90E00C9669E170E00E94F6188B +:102C3000C438822F90E00C9669E170E00E94F2188F :102C4000162F611104C011E0211101C010E0C7016D -:102C5000B60127E731E040E050E00E941E1929014B +:102C5000B60127E731E040E050E00E941A1929014F :102C60003A019B01AC01812F90E0B0E0A0E0481652 -:102C700059066A067B0608F48AC060E00E943C059B -:102C800028E0B8EBCB16BBE0DB06E104F10478F4F6 -:102C9000C701B60153E0660F771F881F991F5A9529 -:102CA000D1F728EB3BE040E050E00E941E19209352 -:102CB000DB38E6E02E9FC00111246AE070E00E943C -:102CC0000A196093DC382093DD380BED18E3512CA2 -:102CD000412CD8018D918D01480E511CAA16BB06BE -:102CE000C1F7B7EB4B16B3E05B06D8F08BEDE82EDF -:102CF00088E3F82E712C612CF70121917F016F017F -:102D0000F1E0CF1AD10830E0A6EBB3E00E946D19D4 -:102D1000A30192010E941E19D6012C93E016F10620 -:102D200059F7ACECB8E3EBEDF8E390E020E08191EB -:102D3000811121E03D91831391E0E017F107B9F78C -:102D40008091CB382111D3C18823B9F08091CA3842 -:102D50008F5F8093CA38843080F080E280932604AD -:102D600080E1809325041092CB38ECECF8E31192CB -:102D7000CDA0DEA0CE16DF06D1F78091CB38882318 -:102D800011F40C94970A9111B6C10C94970AAFEF05 -:102D9000B0E00E94831927E731E040E050E00E9454 -:102DA0001E19622F842D6ACFC701B60120EA3FE0C9 -:102DB00040E050E00E941E199B01AC01203DF7E06D -:102DC0003F074105510550F060EA7FE080E090E068 -:102DD000621B730B840B950B9B01AC010FEF10E092 -:102DE000AFEFB0E00E94831920ED37E040E050E003 -:102DF0000E941E19229FC001239F900D900D112447 -:102E0000B8010E94F61825E1269FC001279F900D6A -:102E10001124B8010E94F61813E0160F8091C338F0 -:102E2000882319F0812F8695180F8091C238882346 -:102E300059F0C701B60128E230E040E050E00E94BE -:102E40001E19110F20FF10E01093DB3876E0179F5A -:102E5000C00111246AE070E00E940A196093DC3816 -:102E60001093DD3832CF20E084ECC81689E0D80614 -:102E7000E104F10468F4AFEFB0E0A70196010E940D -:102E8000831924EC39E040E050E00E941E1920959F -:102E9000229FC00111242FEF30E0B9010E94F618E3 -:102EA000FB01FF27AEE16A9FC0011124B9010E9416 -:102EB000F6186093DB3848E24E9FC0014F9F900D9B -:102EC0001124B9010E94F6186093DC38CF0144E068 -:102ED000880F991F4A95E1F7B9010E94F61860938F -:102EE000DD38F3CEC701B6012AEF30E040E050E014 -:102EF0000E941E1920FDE9CE1092DB3888E28093F3 -:102F0000DC381092DD381092DE388EE18093DF38A5 -:102F10001092E038DACE8091C43869E10E94EA1854 -:102F2000782EB3E060E084E0B71508F4DDC0872DAB -:102F30000E943C05C701B6012CED35E040E050E0B1 -:102F40000E941E199B01AC012E3EE2E03E074105A6 -:102F5000510560F09CEDC92E95E0D92EE12CF12CA5 -:102F6000C21AD30AE40AF50AA70196010FEF10E08E -:102F7000AFEFB0E00E9483192EEE32E040E050E067 -:102F80000E941E19229FC001239F900D900D1124B5 -:102F9000B8010E94F6189B01739443E0749EF001FF -:102FA0001124E552F74C44E2469FC001479F900D23 -:102FB0001124B8010E94F6186C5F6083118246E00C -:102FC000429FC001439F900D1124B8010E94F61842 -:102FD00062837BCE58E8C51653E1D506E104F104BF -:102FE000D0F488E28093DE381092DF381092E03817 -:102FF0008093E1381092E2381092E3388093E438FD -:103000001092E5381092E6388093E7381092E8384D -:103010001092E9385ACEC701B60168587341810948 -:10302000910920E137E240E050E00E941E199B0127 -:10303000AC01283562E036074105510508F045CE60 -:103040002C3271E037074105510550F088E592E0D8 -:10305000A0E0B0E0821B930BA40BB50B9C01AD016B -:103060000FEF10E0AFEFB0E00E9483192CE231E0E7 -:1030700040E050E00E941E19229FC001239F900D46 -:10308000900D1124B8010E94F6182CE0269FC00173 -:10309000279F900D1124B8010E94F6186093DE3826 -:1030A0001092DF381092E0386093E1381092E238E5 -:1030B0001092E3386093E4381092E5381092E638C5 -:1030C0006093E738A3CF2091C438822F90E00C960C -:1030D00069E170E00E94F618862F611104C081E05A -:1030E000211101C080E060E00E943C05EECD10920D -:1030F000CA38992351F18091CB3881110CC080E3FB -:103100008093260481E08093CB3881EE94E0019790 -:10311000F1F700C000000E94AA05882311F40C9466 -:10312000970A81E00E9491050E94AA05811104C0BE -:103130008091EA388823C1F38091EA38882349F0E6 -:1031400080E00E9491050C94970A8823A1F20C94C8 -:10315000970AF89498ED21E030E094BF2093610045 -:10316000EBEDF8E38FE0219138E02D9A000027FF86 -:103170002D98220F000000002D98000000003A95C5 -:10318000A1F78A9581F723E030E094BF2093610096 -:10319000789480E00E949105ECECF8E3D4018D91E5 -:1031A0004D018193A017B107C9F70C94970A80E0ED -:1031B0000C94A10ADB018F939F930E948319BF9106 -:1031C000AF91A29F800D911DA39F900DB29F900D76 -:1031D00011240895991B79E004C0991F961708F0EF -:1031E000961B881F7A95C9F780950895AA1BBB1B6B -:1031F00051E107C0AA1FBB1FA617B70710F0A61BF7 -:10320000B70B881F991F5A95A9F780959095BC0117 -:10321000CD01089597FB072E16F4009407D077FD93 -:1032200009D00E94F61807FC05D03EF490958195D0 -:103230009F4F0895709561957F4F0895A1E21A2ED2 -:10324000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F4A -:10325000A217B307E407F50720F0A21BB30BE40B9A -:10326000F50B661F771F881F991F1A9469F76095E1 -:103270007095809590959B01AC01BD01CF0108959B -:10328000052E97FB1EF400940E94571957FD07D096 -:103290000E941E1907FC03D04EF40C945719509548 -:1032A0004095309521953F4F4F4F5F4F0895909532 -:1032B0008095709561957F4F8F4F9F4F0895EE0FCA -:1032C000FF1F0590F491E02D09940E946D1933239E -:1032D00012F48A1B9B0B0C947E19A29FB001B39F22 -:1032E000C001A39F700D811D1124911DB29F700D0F -:1032F000811D1124911D08950E946D19B7FF089535 -:10330000821B930B08950E946D19A59F900DB49F89 -:10331000900DA49F800D911D11240895F894FFCF66 -:1033200000000000E8030301020007101A252F3AED -:10333000444F5A647A0D240E740EA60ECE0EEC0E77 -:0A3340001E0F500FA00F04106810BC -:02334A00190068 +:102C700059066A067B0608F487C060E00E943C059E +:102C800025E0B8EBCB16BBE0DB06E104F10460F411 +:102C9000A5E0B0E0A70196010E947F1928EB3BE078 +:102CA00040E050E00E941A192093DB38E6E02E9FA6 +:102CB000C00111246AE070E00E9406196093DC38BC +:102CC0002093DD380BED18E3512C412CD8018D9168 +:102CD0008D01480E511CAA16BB06C1F7B1E84B1670 +:102CE000B2E05B06D8F08BEDE82E88E3F82E712C6D +:102CF000612CF70121917F016F01F1E0CF1AD1081A +:102D000030E0A0E8B2E00E946919A30192010E949C +:102D10001A19D6012C93E016F10659F7ACECB8E37A +:102D2000EBEDF8E390E020E08191811121E03D910D +:102D3000831391E0E017F107B9F78091CB382111A7 +:102D4000D2C18823B9F08091CA388F5F8093CA3886 +:102D5000843080F080E28093260480E18093250413 +:102D60001092CB38ECECF8E31192CDA0DEA0CE1699 +:102D7000DF06D1F78091CB38882311F40C94970AA1 +:102D80009111B5C10C94970AAFEFB0E00E947F1982 +:102D900027E731E040E050E00E941A19622F842DAD +:102DA0006DCFC701B60120EA3FE040E050E00E944D +:102DB0001A199B01AC01203DF7E03F074105510581 +:102DC00050F060EA7FE080E090E0621B730B840BC0 +:102DD000950B9B01AC010FEF10E0AFEFB0E00E944C +:102DE0007F1920ED37E040E050E00E941A19229F41 +:102DF000C001239F900D900D1124B8010E94F2187C +:102E00002AE0269FC001279F900D1124B8010E943F +:102E1000F21812E0160F8091C338882319F0812F21 +:102E20008695180F8091C238882359F0C701B601E2 +:102E300028E230E040E050E00E941A19110F20FF14 +:102E400010E01093DB3876E0179FC00111246AE090 +:102E500070E00E9406196093DC381093DD3832CFA1 +:102E600020E084ECC81689E0D806E104F10468F497 +:102E7000AFEFB0E0A70196010E947F1924EC39E082 +:102E800040E050E00E941A192095229FC0011124B1 +:102E90002FEF30E0B9010E94F218FB01FF27AFE0ED +:102EA0006A9FC0011124B9010E94F2186093DB38B7 +:102EB00044E14E9FC0014F9F900D1124B9010E9423 +:102EC000F2186093DC38CF0173E0880F991F7A9570 +:102ED000E1F7B9010E94F2186093DD38F3CEC70123 +:102EE000B6012AEF30E040E050E00E941A1920FDC0 +:102EF000E9CE1092DB3888E18093DC381092DD381F +:102F00001092DE3884E18093DF381092E038DACE18 +:102F10008091C43869E10E94E618782EB3E060E041 +:102F200084E0B71508F4DCC0872D0E943C05C7017A +:102F3000B6012CED35E040E050E00E941A199B01EB +:102F4000AC012E3EE2E03E074105510560F06CED1C +:102F5000C62E65E0D62EE12CF12CC21AD30AE40A63 +:102F6000F50AA70196010FEF10E0AFEFB0E00E9465 +:102F70007F192EEE32E040E050E00E941A19229FA5 +:102F8000C001239F900D900D1124B8010E94F218EA +:102F90009B01739443E0749EF0011124E552F74CB9 +:102FA00049E1469FC001479F900D1124B8010E943E +:102FB000F2186D5F60831182C901880F991F880F15 +:102FC000991FB8010E94F21862837CCE58E8C5169A +:102FD00053E1D506E104F104D0F48CE18093DE38AE +:102FE0001092DF381092E0388093E1381092E23886 +:102FF0001092E3388093E4381092E5381092E63866 +:103000008093E7381092E8381092E9385BCEC70118 +:10301000B601685873418109910920E137E240E027 +:1030200050E00E941A199B01AC01283562E0360776 +:103030004105510508F046CE2C3271E037074105B5 +:10304000510550F088E592E0A0E0B0E0821B930BC0 +:10305000A40BB50B9C01AD010FEF10E0AFEFB0E09A +:103060000E947F192CE231E040E050E00E941A19E2 +:10307000229FC001239F900D900D1124B8010E9442 +:10308000F218CB0123E0880F991F2A95E1F7B801C8 +:103090000E94F2186093DE381092DF381092E03808 +:1030A0006093E1381092E2381092E3386093E4388C +:1030B0001092E5381092E6386093E738A3CF20915C +:1030C000C438822F90E00C9669E170E00E94F218FB +:1030D000862F611104C081E0211101C080E060E011 +:1030E0000E943C05EFCD1092CA38992351F180918E +:1030F000CB3881110CC080E38093260481E080935B +:10310000CB3881EE94E00197F1F700C000000E94F7 +:10311000AA05882311F40C94970A81E00E94910576 +:103120000E94AA05811104C08091EA388823C1F366 +:103130008091EA38882349F080E00E9491050C9440 +:10314000970A8823A1F20C94970AF89498ED21E04D +:1031500030E094BF20936100EBEDF8E38FE0219124 +:1031600038E02D9A000027FF2D98220F0000000064 +:103170002D98000000003A95A1F78A9581F723E089 +:1031800030E094BF20936100789480E00E94910524 +:10319000ECECF8E3D4018D914D018193A017B107B8 +:1031A000C9F70C94970A80E00C94A10ADB018F9375 +:1031B0009F930E947F19BF91AF91A29F800D911D97 +:1031C000A39F900DB29F900D11240895991B79E053 +:1031D00004C0991F961708F0961B881F7A95C9F7A7 +:1031E00080950895AA1BBB1B51E107C0AA1FBB1FF6 +:1031F000A617B70710F0A61BB70B881F991F5A9583 +:10320000A9F780959095BC01CD01089597FB072EF5 +:1032100016F4009407D077FD09D00E94F21807FC3D +:1032200005D03EF4909581959F4F089570956195D6 +:103230007F4F0895A1E21A2EAA1BBB1BFD010DC0F2 +:10324000AA1FBB1FEE1FFF1FA217B307E407F50756 +:1032500020F0A21BB30BE40BF50B661F771F881F32 +:10326000991F1A9469F760957095809590959B01C8 +:10327000AC01BD01CF010895052E97FB1EF400940B +:103280000E94531957FD07D00E941A1907FC03D05A +:103290004EF40C94531950954095309521953F4F1D +:1032A0004F4F5F4F089590958095709561957F4F32 +:1032B0008F4F9F4F0895EE0FFF1F0590F491E02D63 +:1032C00009940E946919332312F48A1B9B0B0C94F6 +:1032D0007A19A29FB001B39FC001A39F700D811DF9 +:1032E0001124911DB29F700D811D1124911D08950F +:1032F0000E946919B7FF0895821B930B08950E94DD +:103300006919A59F900DB49F900DA49F800D911DEC +:0833100011240895F894FFCF89 +:1033180000000000E8030301020007101A252F3AF5 +:10332800444F5A647A0D240E740EA60ECE0EEC0E7F +:0A3338001E0F500FA00F04106810C4 +:02334200190070 :00000001FF
firmware/src/board.h+9−6@@ -56,8 +56,8 @@ #define PIN_PC3_UNUSED 3 /* ---- LEDs ---- */-#define LED_COUNT 5 /* chain: 0 = logo, 1..4 = gauge 25/50/75/100 % */-#define LED_LOGO 0+#define LED_COUNT 5 /* chain: 0 = D4 STATUS dot, 1..4 = D5..D8 gauge 25/50/75/100 % */+#define LED_STATUS 0 /* rev 2: the status dot shows what the rev 1 logo showed */ #define LED_GAUGE0 1 /* ---- Accelerometer ---- */@@ -108,9 +108,12 @@ #define RX_SETTLE_MS 60 /* RX_REF: 1 uF with ~9 k -> 9 ms tau */ /* ---- LED current cap ----- * WS2812B-2020-V6: 12 mA per colour channel at full scale. The rail budget is- * 60 mA on the LDO; MCU + receiver + accel take about 4 mA, so the LEDs get at- * most ~45 mA = 950 / 255 * 12 mA (sum of all 15 channel values <= 950). */-#define LED_SUM_MAX 950+ * WS2812B-2020-V6: 12 mA per colour channel at full scale. Rev 2 lights are+ * 1.5 mm clear-resin dots sitting right on each LED, so a dot looks several+ * times brighter than rev 1's spread-out logo at the same drive: the levels in+ * leds.c are about half of rev 1's, and the cap is 640 (~30 mA for all five)+ * to keep the 150 mAh cell's peak load low (0.2 C) and the 3.3 V LDO well+ * under its 60 mA budget with the MCU and receiver (about 4 mA). */+#define LED_SUM_MAX 640 #endif
firmware/src/leds.c+18−14@@ -1,6 +1,10 @@ /* * leds.c : WS2812B-2020-V6 driver and light patterns *+ * Rev 2 chain: LED 0 = D4 STATUS dot, LEDs 1..4 = D5..D8 charge gauge+ * (25 / 50 / 75 / 100 %). Every light is a 1.5 mm round clear-resin pipe, so+ * the status dot shows everything rev 1's logo showed, at about half the drive.+ * * Why a bit-bang at 10 MHz (and not SPI / USART-SPI / CCL): * LED_DIN is PB5. On the ATtiny1616 PB5 carries CLKOUT, AIN8, AC0 AINP1 and * TCA0 WO2 (alternate) only: no SPI MOSI, no USART TxD, no CCL LUT output.@@ -26,7 +30,7 @@ * echo, which no faucet treats as the hand leaving). * * Current cap: 12 mA per channel at 255, sum of all channel values limited to- * LED_SUM_MAX (950 -> ~45 mA) so the 3.3 V LDO stays under 60 mA in total.+ * LED_SUM_MAX (640 -> ~30 mA), sized for small dots and the 150 mAh cell. */ #include <avr/io.h> #include <avr/interrupt.h>@@ -116,8 +120,8 @@ static void gauge(uint8_t lit, uint8_t fill_frac_255) for (uint8_t s = 0; s < 4; s++) { uint8_t k = s < lit ? 255 : 0; if (s == lit && fill_frac_255) k = fill_frac_255;- if (pct <= 25) set(LED_GAUGE0 + s, (uint8_t)(40u * k / 255u), (uint8_t)(16u * k / 255u), 0); /* amber */- else set(LED_GAUGE0 + s, 0, (uint8_t)(40u * k / 255u), (uint8_t)(6u * k / 255u)); /* green */+ if (pct <= 25) set(LED_GAUGE0 + s, (uint8_t)(28u * k / 255u), (uint8_t)(11u * k / 255u), 0); /* amber */+ else set(LED_GAUGE0 + s, 0, (uint8_t)(28u * k / 255u), (uint8_t)(4u * k / 255u)); /* green */ } } @@ -136,30 +140,30 @@ static void render(uint32_t now) uint32_t step = t / 375u; if (step >= lit) gauge(lit, 0); else gauge((uint8_t)step, (uint8_t)((t % 375u) * 255u / 375u));- uint8_t l = (uint8_t)(t < 3000 ? t * 8u / 3000u : 8); /* logo wakes up */- set(LED_LOGO, (uint8_t)(l * 6 / 10), l, l);+ uint8_t l = (uint8_t)(t < 3000 ? t * 5u / 3000u : 5); /* status dot wakes up */+ set(LED_STATUS, (uint8_t)(l * 6 / 10), l, l); break; } case PAT_ARMED: {- uint8_t l = (uint8_t)(3u + (breath(t, 4000) * 21u) / 255u); /* 3..24 */+ uint8_t l = (uint8_t)(2u + (breath(t, 4000) * 10u) / 255u); /* 2..12 (rev 1 logo: 3..24) */ if (f_echo) l = (uint8_t)(l + l / 2); /* echoing: a bit brighter */ if (f_blip) l = ((t / 40u) & 1u) ? (uint8_t)(l * 2u) : 0; /* re-arm: quick flicker */- set(LED_LOGO, (uint8_t)(l * 6 / 10), l, l); /* soft cyan-white */+ set(LED_STATUS, (uint8_t)(l * 6 / 10), l, l); /* soft cyan-white */ break; } case PAT_DONE: { /* slow warm fade, 2.5 s */ uint8_t k = t < 2500 ? (uint8_t)(255u - t * 255u / 2500u) : 0; k = (uint8_t)((k * k) / 255u);- set(LED_LOGO, (uint8_t)(40u * k / 255u), (uint8_t)(30u * k / 255u), (uint8_t)(16u * k / 255u));+ set(LED_STATUS, (uint8_t)(20u * k / 255u), (uint8_t)(15u * k / 255u), (uint8_t)(8u * k / 255u)); break; } - case PAT_LOW: /* red blink 4 Hz on logo and the first segment */+ case PAT_LOW: /* red blink 4 Hz on the status dot and the first segment */ if (((t / 250u) & 1u) == 0) {- set(LED_LOGO, 40, 0, 0);- set(LED_GAUGE0, 30, 0, 0);+ set(LED_STATUS, 24, 0, 0);+ set(LED_GAUGE0, 20, 0, 0); } break; @@ -169,19 +173,19 @@ static void render(uint32_t now) else { gauge(lit, 0); uint8_t k = breath(t, 1500);- set(LED_GAUGE0 + lit, 0, (uint8_t)(4u + 36u * k / 255u), (uint8_t)(6u * k / 255u));+ set(LED_GAUGE0 + lit, 0, (uint8_t)(3u + 25u * k / 255u), (uint8_t)(4u * k / 255u)); } break; } case PAT_FULL: if (t < 5000) {- for (uint8_t s = 0; s < 4; s++) set(LED_GAUGE0 + s, 0, 40, 0);+ for (uint8_t s = 0; s < 4; s++) set(LED_GAUGE0 + s, 0, 28, 0); } else { uint32_t w = (t - 5000) % 10000u; if (w < 600) { uint8_t k = breath(w, 600);- for (uint8_t s = 0; s < 4; s++) set(LED_GAUGE0 + s, 0, (uint8_t)(12u * k / 255u), 0);+ for (uint8_t s = 0; s < 4; s++) set(LED_GAUGE0 + s, 0, (uint8_t)(8u * k / 255u), 0); } } break;
firmware/src/leds.h+1−1@@ -10,7 +10,7 @@ typedef enum { PAT_OFF = 0, PAT_GAUGE, /* session start: gauge fills to the level over 3 s */- PAT_ARMED, /* logo breathing soft cyan-white */+ PAT_ARMED, /* status dot breathing soft cyan-white */ PAT_DONE, /* 10 min cap: slow warm fade */ PAT_LOW, /* low battery: red */ PAT_CHARGING, /* filled to the level, next segment pulses */
firmware/src/main.c+2−2@@ -13,7 +13,7 @@ * threshold is calibrated and the faucet is heard with the * echo disabled (2 s, up to 5 s for slow faucets) * ARMED echo enabled, learn.c decides blips, emitters rotate,- * logo breathes+ * the STATUS dot breathes * After DONE or LOW the device must be picked up (0.25 g / 30 deg change) * before the next set-down can start a session. *@@ -61,7 +61,7 @@ static void enter(state_t s, uint32_t now) { st = s; t_state = now; } static uint8_t battery_pct(uint32_t now, bool charging) { uint16_t mv = vbat_mv();- if (charging && mv > 100) mv -= 100; /* charger lifts the terminal voltage */+ if (charging && mv > 100) mv -= 100; /* charger lifts the terminal voltage (77 mA into the 150 mAh cell) */ return vbat_percent(mv); }
firmware/src/power.c+3−2@@ -9,8 +9,9 @@ * AWAKE (settle, charging display) STANDBY between 64 Hz PIT ticks, * OSC20M off in standby, accel 50 Hz. * SESSION STANDBY with OSC20M kept on by the TCBs (RUNSTDBY), receiver- * powered (1.1 mA), ~2.8 mA total average incl. echo pulses and- * the breathing light. IDLE only during the ~0.2 ms blanking+ * powered (1.1 mA), ~3.0 mA total average incl. echo pulses (8.2 ohm+ * series resistors in rev 2: 0.47 mA) and+ * the breathing status dot. IDLE only during the ~0.2 ms blanking * after each echo (TCA0 does not run in standby). */ #include <avr/io.h>