main
John Lauer Rev 2 hero 3D: frame the device and the hand on load 8ba0a93 1d ago
{
 "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": 13.73,
  "placements_mm": [
   100.0,
   350.0
  ]
 },
 "elevation_deg": {
  "at_100": 14.7,
  "at_350": 4.3,
  "at_100_56mm": 22.9,
  "at_350_56mm": 6.9,
  "formula": "tilt = atan((window height - emitter height) / distance)"
 },
 "tilt": {
  "chosen_deg": 5,
  "optimum_deg": 4.25,
  "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,
  "why_5": "optimum 4.25 deg for the 40 mm window; 5 deg loses 0.05 % of worst-case margin there and gains 0.5 % on 56 mm units, and is what the case is built at",
  "worst_margin": {
   "tilt_0": 5.3,
   "tilt_5": 5.4,
   "tilt_12": 5.0
  },
  "worst_margin_56mm": {
   "tilt_0": 5.0,
   "tilt_5": 5.2,
   "tilt_12": 5.1
  }
 },
 "table": [
  {
   "d_mm": 100,
   "elev_40_deg": 14.7,
   "rel940_40_tilt0": 0.79,
   "rel940_40_tilt5": 0.9,
   "rel940_40_tilt12": 0.99,
   "rel850_40_tilt5": 0.92,
   "relPD_40_tilt5": 0.95,
   "margin_40_tilt5": 48.3,
   "elev_56_deg": 22.9,
   "rel940_56_tilt0": 0.56,
   "rel940_56_tilt5": 0.7,
   "rel940_56_tilt12": 0.88,
   "rel850_56_tilt5": 0.76,
   "relPD_56_tilt5": 0.84,
   "margin_56_tilt5": 27.0
  },
  {
   "d_mm": 150,
   "elev_40_deg": 9.9,
   "rel940_40_tilt0": 0.9,
   "rel940_40_tilt5": 0.97,
   "rel940_40_tilt12": 1.0,
   "rel850_40_tilt5": 0.98,
   "relPD_40_tilt5": 0.99,
   "margin_40_tilt5": 26.2,
   "elev_56_deg": 15.7,
   "rel940_56_tilt0": 0.76,
   "rel940_56_tilt5": 0.88,
   "rel940_56_tilt12": 0.99,
   "rel850_56_tilt5": 0.91,
   "relPD_56_tilt5": 0.94,
   "margin_56_tilt5": 20.3
  },
  {
   "d_mm": 200,
   "elev_40_deg": 7.5,
   "rel940_40_tilt0": 0.94,
   "rel940_40_tilt5": 0.99,
   "rel940_40_tilt12": 0.98,
   "rel850_40_tilt5": 0.99,
   "relPD_40_tilt5": 1.0,
   "margin_40_tilt5": 15.7,
   "elev_56_deg": 11.9,
   "rel940_56_tilt0": 0.86,
   "rel940_56_tilt5": 0.95,
   "rel940_56_tilt12": 1.0,
   "rel850_56_tilt5": 0.96,
   "relPD_56_tilt5": 0.97,
   "margin_56_tilt5": 13.7
  },
  {
   "d_mm": 250,
   "elev_40_deg": 6.0,
   "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": 10.3,
   "elev_56_deg": 9.6,
   "rel940_56_tilt0": 0.91,
   "rel940_56_tilt5": 0.98,
   "rel940_56_tilt12": 0.99,
   "rel850_56_tilt5": 0.98,
   "relPD_56_tilt5": 0.99,
   "margin_56_tilt5": 9.5
  },
  {
   "d_mm": 300,
   "elev_40_deg": 5.0,
   "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": 7.3,
   "elev_56_deg": 8.0,
   "rel940_56_tilt0": 0.93,
   "rel940_56_tilt5": 0.99,
   "rel940_56_tilt12": 0.98,
   "rel850_56_tilt5": 0.99,
   "relPD_56_tilt5": 1.0,
   "margin_56_tilt5": 6.9
  },
  {
   "d_mm": 350,
   "elev_40_deg": 4.3,
   "rel940_40_tilt0": 0.98,
   "rel940_40_tilt5": 1.0,
   "rel940_40_tilt12": 0.94,
   "rel850_40_tilt5": 1.0,
   "relPD_40_tilt5": 1.0,
   "margin_40_tilt5": 5.4,
   "elev_56_deg": 6.9,
   "rel940_56_tilt0": 0.95,
   "rel940_56_tilt5": 1.0,
   "rel940_56_tilt12": 0.97,
   "rel850_56_tilt5": 1.0,
   "relPD_56_tilt5": 1.0,
   "margin_56_tilt5": 5.2
  }
 ],
 "link_model": {
  "hand_return_W_m2": 0.1045,
  "I_940_W_sr": 0.0702,
  "I_850_W_sr": 0.0982,
  "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 14 mm above the counter, turned by the user to face the window",
  "two photodiodes and the rev 1 receiver chain and threshold; 850 nm behind 8.2 ohm, one 940 nm behind 4.7 ohm (rev 1: three emitters behind 12 ohm), low battery 3.45 V"
 ],
 "zone": {
  "rx30_6dB": {
   "area_cm2": 220.0,
   "per_side": true,
   "d_mm": [
    366,
    500
   ],
   "off_axis_deg": [
    0,
    34
   ]
  },
  "rx45_6dB": {
   "area_cm2": 384.0,
   "per_side": true,
   "d_mm": [
    299,
    500
   ],
   "off_axis_deg": [
    0,
    52
   ]
  },
  "rx30_works": {
   "area_cm2": 361.0,
   "per_side": true,
   "d_mm": [
    325,
    500
   ],
   "off_axis_deg": [
    0,
    46
   ]
  },
  "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": 4.8,
   "yaw": 43.1,
   "theta_f": 43.3,
   "gh_err": -0.2,
   "m_echo": 1.5,
   "m_rx": 4.2,
   "m": 1.5
  },
  "spot_56mm": {
   "d": 314.8,
   "beta": 7.6,
   "yaw": 43.1,
   "theta_f": 43.6,
   "gh_err": 2.6,
   "m_echo": 1.4,
   "m_rx": 4.0,
   "m": 1.4
  },
  "spot_front_mm": [
   60.0,
   450.0
  ],
  "spot_front": {
   "d": 454.0,
   "beta": 3.3,
   "yaw": 7.6,
   "theta_f": 8.3,
   "gh_err": -1.7,
   "m_echo": 3.1,
   "m_rx": 8.9,
   "m": 3.1
  }
 }
}