Skip to content

SSD1333 brightness: photometer harness, four-axis driver, and measured response surface (stages 1+2) - #568

Merged
brickbots merged 4 commits into
mainfrom
worktree-ssd1333-photometric-characterization
Aug 2, 2026
Merged

SSD1333 brightness: photometer harness, four-axis driver, and measured response surface (stages 1+2)#568
brickbots merged 4 commits into
mainfrom
worktree-ssd1333-photometric-characterization

Conversation

@brickbots

@brickbots brickbots commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Summary

Stages 1 and 2 of the SSD1333 brightness re-characterization: the photometer harness + four-axis driver + ADR 0023 revision (stage 1), and the panel's photometrically measured response surface (stage 2) — raw journals, the sweep specs/scripts that produced them, the measured-model writeup (docs/ax/display/ssd1333-response.md), CONTEXT.md vocabulary, and the stage-3 handoff (docs/ax/display/HANDOFF-stage3-dimming-policy.md).

Stage 1 (commit feat(display): …)

  • python/PiFinder/panel_photometry.py — camera-as-photometer rig (selftest/measure/sweep/monitor, period-locked exposure ladder, JSONL journals).
  • ssd1333_device.py — emitted-light-space ceiling LUT + pre-charge voltage command; displays.py — four-axis set_brightness (bounded fit search, canary floor, pre-charge regime, knee curve); precharge_sweep.py — by-eye harness kept for visual artifact checks.
  • ADR 0023 four-axis revision; test_ssd1333_brightness.py (12 unit tests, passing).

Stage 2 headline findings

  • Contrast and master are one axis: flux depends on the two registers only through the drive product P = contrast × (master+1) (single-valued within 1.6% across independent sessions). Dark below P=4, cliff to 28.5% of reference, near-flat to P≈32, ≈√P above P≈128.
  • Separability fails: pre-charge spans 32× at low drive but 1.29× at reference; cut-out edges move with operating point. The multiplicative model — and its predicted 18,000:1 span — was structurally wrong (measured whole-policy span: 233:1). Fill-fraction probe rules out APL/current-limiting: this is true register behaviour.
  • Ceiling duty law (n−1)/30 confirmed to ~1% — the one axis the model got right.
  • "Very dim" is reachable: 148 ADU/s at (contrast 4, master 0, ceiling 4, pre-charge 4) — ~3.8 decades within the tonal-range rule. The shipped policy's dimmest state sits 40× above the panel's floor.
  • Value remap math validated at reference drive; the value-64 canary stays photometrically distinct at every measured operating point; "pre-charge glow" found under native level 1.

ssd1333-response.md §7 flags (does not fix) the ADR 0023 claims that fell; amending the ADR is stage 3's job alongside the policy refit — see the handoff.

Verification

  • pytest tests/test_ssd1333_brightness.py: 12 passed. ruff check on all touched Python: clean.
  • Pre-sweep selftest: all gates PASS (darkness, ladder, repeatability CV 0.71%, dark stability); sentinel drift ≤0.9% within every run; journals carry the sentinels.

🤖 Generated with Claude Code

brickbots and others added 3 commits August 2, 2026 12:42
Camera-measured response surface for the 1.91" SSD1333, replacing the
by-eye brightness model's measured claims:

- Contrast and master collapse onto one drive product P = c*(m+1)
  (1.6% single-valuedness); dark below P=4, ~flat to P~32, sqrt(P) above.
- Gray-scale ceiling duty law (n-1)/30 confirmed to ~1%.
- Separability fails: pre-charge authority spans 32x (low drive) to 1.1x
  (high drive); cut-out edges move with operating point.
- Emission floor within the tonal rule: 148 ADU/s at c4 m0 L4 pc4 —
  ~3.8 decades reachable; the shipped policy stops 40x short of it.
- Pixel-value remap validated at reference drive; canary distinct at all
  measured operating points; pre-charge glow found under level 1.

Adds raw journals + sweep specs/runners, ssd1333-response.md (the
measured model stage 3 fits against), CONTEXT.md vocabulary (drive
product, pre-charge glow), and the stage-3 handoff.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… revision (stage 1)

The stage-1 changeset the stage-2 measurements build on:

- panel_photometry.py: camera-as-photometer bench rig (selftest/measure/
  sweep/monitor CLI, period-locked exposure ladder, JSONL journals).
- ssd1333_device.py: emitted-light-space gray-scale-ceiling LUT and the
  pre-charge voltage (0xBB) command.
- displays.py: four-axis set_brightness with bounded ceiling fit search,
  MIN_TONAL_CEILING canary floor, pre-charge regime, knee curve.
- precharge_sweep.py: the by-eye 2026-07 pre-charge harness (kept for
  visual artifact checks the photometer cannot do).
- ADR 0023: the four-axis revision this branch's ssd1333-response.md
  measures against (its measured claims are amended in stage 3).
- test_ssd1333_brightness.py: 12 unit tests holding the canary line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@brickbots brickbots changed the title docs(display): SSD1333 photometric characterization (stage 2) SSD1333 brightness: photometer harness, four-axis driver, and measured response surface (stages 1+2) Aug 2, 2026
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@brickbots
brickbots marked this pull request as ready for review August 2, 2026 20:04
@brickbots
brickbots merged commit 03e2314 into main Aug 2, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant