hardware
Alex — Adom Molecule LED Nameplate
Public Made by Adomby adom
Alex's name etched out of the soldermask over the top-layer ground plane, lit by side-view LEDs firing inward across the board. A real Adom molecule: large machine pins on the 32 mm base-scaffold grid, USB-C powered. Every LED returns its current through the letters, so there is no second ground path.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
<!doctype html><html><head><meta charset="utf-8">
<meta name="readme-max-height" content="32000">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
/* No @font-face here: the wiki renders README.html in a null-origin iframe,
so adom.inc's font files fail CORS on every load and only add console
noise. Fall back to the system stack, which the wiki chrome matches. */
:root { --bg:#0d1117; --surface:#161b22; --elev:#1c2128; --border:#30363d;
--text:#e6edf3; --body:#c9d1d9; --muted:#8b949e; --accent:#00b8b1; --purple:#8C6BF7; }
* { box-sizing:border-box; margin:0; padding:0; }
html,body { background:var(--bg); color:var(--body);
font:15px/1.65 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
scrollbar-width:none; }
html::-webkit-scrollbar, body::-webkit-scrollbar { width:0; height:0; display:none; }
#wrap { max-width:900px; margin:0 auto; padding:24px 20px 48px; }
h1 { font-weight:700; color:var(--text);
font-size:40px; letter-spacing:-.02em; margin:6px 0 4px; }
h2 { font-weight:700; color:var(--text);
font-size:24px; margin:36px 0 10px; letter-spacing:-.01em; }
p { margin:10px 0; }
.lede { color:var(--muted); font-size:17px; margin-bottom:20px; }
.viewer { border:1px solid var(--border); border-radius:12px; overflow:hidden;
background:var(--surface); margin:22px 0 8px;
box-shadow:0 12px 40px rgba(0,0,0,.45); }
.viewer iframe { display:block; width:100%; height:620px; border:0; }
/* Click to load. The viewer bundle is ~13 MB of Babylon plus a 2.5 MB model;
loading it eagerly on a page most people are just reading makes the whole
tab crawl, and four of these tabs will peg a browser. */
.poster { display:block; width:100%; padding:0; border:0; background:none;
cursor:pointer; position:relative; font:inherit; color:inherit; }
.poster img { display:block; width:100%; height:auto; opacity:.55; transition:opacity .18s; }
.poster:hover img { opacity:.75; }
.play { position:absolute; inset:0; display:flex; flex-direction:column;
align-items:center; justify-content:center; gap:6px; text-align:center; }
.play b { background:var(--accent); color:#04120f; padding:10px 20px;
border-radius:999px; font-size:15px; font-weight:700; }
.play i { color:var(--text); font-style:normal; font-size:12.5px; opacity:.85; }
.cap { color:var(--muted); font-size:13px; margin:0 0 26px; }
.cap a { color:var(--accent); text-decoration:none; }
table { border-collapse:collapse; width:100%; margin:12px 0 4px; font-size:14px; }
th,td { text-align:left; padding:7px 10px; border-bottom:1px solid var(--border); }
th { color:var(--muted); font-weight:600; }
code { font-family:"JetBrains Mono",ui-monospace,monospace; font-size:13px;
background:var(--elev); padding:1px 5px; border-radius:4px; color:var(--text); }
.call { background:var(--elev); border:1px solid rgba(0,184,177,.25);
border-left:3px solid var(--accent); border-radius:8px; padding:14px 16px; margin:18px 0; }
.call b { color:var(--text); }
ul { margin:10px 0 10px 20px; } li { margin:5px 0; }
.grid { display:flex; gap:14px; flex-wrap:wrap; margin:14px 0; }
.grid img { flex:1 1 380px; max-width:100%; border:1px solid var(--border); border-radius:10px; }
</style></head><body><div id="wrap">
<h1>Alex</h1>
<p class="lede">An Adom molecule LED nameplate. The name is etched out of the soldermask
over the ground plane, lit by 10 side-view LEDs firing inward across the board.</p>
<div class="viewer" id="viewer">
<button class="poster" id="viewer-load" type="button">
<img src="https://wiki.adom.inc/adom/alex-nameplate/render/docs/hero.png" alt="Alex nameplate">
<span class="play"><b>Load interactive 3D viewer</b><i>Orbit, inspect, measure, x-ray the copper. About 15 MB.</i></span>
</button>
</div>
<p class="cap">The guided walkthrough starts on its own once loaded.
<a href="https://wiki.adom.inc/adom/alex-nameplate/render/viewer/index.html" target="_blank">Open full screen instead</a>.</p>
<div class="call"><b>The one idea: the name is the ground plane.</b>
A rectangular GND copper pour covers the top layer and the soldermask is opened in the
shape of the letters, so bare plated copper shows through. There is deliberately no second
ground path, no bottom ground pour, so every milliamp those 10 LEDs draw physically
crosses the letters on its way back to the connector. The line you get to say to Alex,
<i>"your name is part of the electrical path that lights up the LEDs"</i>, is a statement
about the netlist rather than a slogan.</div>
<h2>The board</h2>
<table>
<tr><th>Board</th><td>172 x 76 mm, 2 layer, 4 mm corner radius</td></tr>
<tr><th>Pin box</th><td><b>160 x 64 mm</b> = 5 x 2 on the 32 mm scaffold grid</td></tr>
<tr><th>Name</th><td>112.6 x 40 mm, Familjen Grotesk Bold</td></tr>
<tr><th>Mask openings</th><td>118 letter polygons</td></tr>
<tr><th>GND plate</th><td>165.6 x 69.6 mm, top layer</td></tr>
<tr><th>LEDs</th><td>10 x Wurth WL-SMSW <code>155060GS75300</code>, 515 nm side-view</td></tr>
<tr><th>Current</th><td>120 mA at 5 V (10 x 12 mA)</td></tr>
<tr><th>Parts / traces / vias</th><td>30 / 48 / 25</td></tr>
</table>
<div class="grid">
<img src="https://wiki.adom.inc/adom/alex-nameplate/render/docs/hero.png" alt="Alex board, 3D render">
<img src="https://wiki.adom.inc/adom/alex-nameplate/render/docs/pcb.png" alt="Alex board, PCB view">
</div>
<h2>Molecule compliance</h2>
<ul>
<li>A large machine pin at every corner: a 3.6 mm body press-fit into a 3.45 mm plated hole,
0.15 mm of interference, solderless.</li>
<li>The pin box is <b>160 x 64 mm</b>, both exact multiples of 32 mm, the base
scaffold's large-contact pitch, so it drops straight onto 6 x 3 contact positions of
the 18 x 18 field across the 576 x 576 mm workspace.</li>
<li>Minimal wings: the board stops 6 mm outside each corner pin. That is as tight as the pin
allows, since a 5.2 mm annular ring eats 2.6 mm of it and a press-fit needs roughly 2x board
thickness of laminate outboard of the ring.</li>
<li>MP1 and MP4 are GND, MP2 and MP3 are +5 V, so the plate can run off a workcell control
panel instead of USB-C. The ground pins land inside the plate, so the scaffold's ground
return also passes through the name.</li>
</ul>
<h2>Why side-view LEDs</h2>
<p>A normal chip LED is a top-view emitter: it fires straight up, away from the board, and the
copper you are trying to light sees nothing. This board uses a true side-view part. The die sits
on its side behind a window in the long face of the package, so the beam leaves parallel to the
board about 0.5 mm above the soldermask. Ringed around the edge facing inward, the light rakes
across the plate at a grazing angle and washes the exposed-copper letters instead of escaping
to the sky.</p>
<p>Worth knowing if you go sourcing: Kingbright's <code>APTR3216</code> family is reverse-mount,
firing down through a hole in the PCB, and Broadcom's <code>HSMx-C265</code> is bottom-entry.
Both come back in a "right angle SMD LED" search and neither does this job.</p>
<h2>Power</h2>
<p>USB-C VBUS at 5 V through 150 R into a 3.2 V LED gives 12 mA each, <b>120 mA</b> for the
board, well inside the 500 mA a charger gives an unnegotiated sink, so any phone brick works.
<code>R_CC1</code> and <code>R_CC2</code> are the mandatory Rd pulldowns: without them on both
CC lines a USB-C source never enables VBUS and the board stays dark.</p>
<p>The layer plan is inverted from the usual convention on purpose. Top is GND, one rectangular
pour, with the name cut out of it; bottom is the +5 V plane. Everything is placed top side only,
because the line does single-sided pick and place, so each LED string runs LED, then 150 R,
then a via down to the +5 V plane, while the cathode bonds straight into the plate.</p>
<h2>Fab notes</h2>
<ul>
<li><b>Specify ENIG, not HASL.</b> The letters are 113 x 40 mm of deliberately bare
copper and are the entire point of the board. HASL leaves them lumpy; ENIG leaves them mirror flat.</li>
<li>Dark soldermask maximises contrast against the exposed letters.</li>
<li>The four 3.45 mm machine-pin holes are an interference fit and are meant to be undersized.
Do not let a fab house "correct" them to a clearance fit.</li>
<li>Tented or plugged vias: there are vias whose rings lap onto LED resistor pads.</li>
</ul>
<h2>Verifying the mask opens</h2>
<p>Do not trust the render. Read the gerber. <code>F_Mask.gbr</code> is negative polarity
(<code>%TF.FilePolarity,Negative*%</code>), so what is drawn is where mask is removed:</p>
<ul>
<li><b>118 region polygons</b>, bounding box <b>112.59 x 40.00 mm</b>, the letters</li>
<li>the plate rectangle <b>absent</b> from F_Mask; present would mean inverted</li>
<li><b>zero</b> letter regions in <code>F_Paste.gbr</code>. The letters are decoration, not solder
joints, and must never be stencilled</li>
</ul>
<h2>Reproducing it</h2>
<p>Built with <a href="https://wiki.adom.inc/adom/adom-tsci" style="color:var(--accent)">adom-tsci</a>
from parametric tscircuit source. Board size, pin box, LED count and silkscreen are all derived
from the name's ink box, so a new name is one command:</p>
<p><code>scripts/make-nameplate.sh "Alex"</code></p>
<script>
(function () {
// The wiki renders README.html inside an iframe that does not know our
// height, so it has to be told. Without this the page is clipped to the
// default frame height and everything below the 3D viewer is unreachable.
var wrap = document.getElementById('wrap');
var last = 0;
var btn = document.getElementById('viewer-load');
if (btn) btn.addEventListener('click', function () {
var f = document.createElement('iframe');
f.src = 'https://wiki.adom.inc/adom/alex-nameplate/render/viewer/index.html';
f.title = 'Alex nameplate, interactive 3D';
f.setAttribute('allow', 'fullscreen');
f.addEventListener('load', post);
var host = document.getElementById('viewer');
host.innerHTML = '';
host.appendChild(f);
post();
});
function post() {
var h = wrap.offsetHeight + 24;
if (h !== last) { last = h; parent.postMessage({ type: 'readme-height', height: h }, '*'); }
}
post();
addEventListener('load', post);
addEventListener('resize', post);
// Images and the lazily-loaded viewer iframe land after first paint and each
// one changes our height, so re-post as they arrive.
document.querySelectorAll('img, iframe').forEach(function (el) {
el.addEventListener('load', post);
});
if (window.ResizeObserver) new ResizeObserver(post).observe(wrap);
// Belt and braces for late web-font swaps.
[100, 400, 1200, 3000].forEach(function (t) { setTimeout(post, t); });
})();
</script>
</div></body></html>