LED Nameplate Generator
Generate a KiCad PCB that spells any name in addressable WS2812B-2020 RGB LEDs β dot-font letters are auto-placed on a 5Γ9 grid and auto-routed with a clearance-aware, no-right-angle Dijkstra router.
Provenance β hero image. Rendered by this repo's
route_visualizergeometry via a small PIL script from the actualdijkstra_alg.route_chainoutput for the word "ADOM". It is NOT a KiCad screenshot β it's the same routing the generator emits to the.kicad_pcb, drawn to PNG. Inputs:dot-font/font-data.json+blank-letter-template.zip.
What it does
Give it a word like ADONIS. For each letter it:
- Looks the character up in a 5Γ9 dot-font (
dot-font/font-data.json). - Clones a fully-routed blank-letter template tile (45 WS2812B-2020 LEDs + decoupling caps + GND/+5V fills) and removes the LEDs that the glyph doesn't use.
- Re-routes the surviving DINβDOUT chain with an 8-direction Dijkstra router (orthogonal cost 1, diagonal β2) that:
- keeps β₯0.2 mm clearance from every pad (rectangle-based keepout),
- never makes a right angle (perpendicular direction changes are forbidden β only 45Β° turns),
- treats the template's GND vias/traces as keepout so chain traces never short,
- leaves each pin with a clean 45Β° chamfer instead of a horizontal nub.
- Tiles the letters, alternating upright and inverted-chain numbering so even-position letters take their data input from the opposite corner while still reading right-side-up.
- Emits a flat schematic whose netlist matches the PCB exactly.
Each letter is an independent LED string (its own data-in net), so the STM32 driving the board can address letters individually.
Provenance β letter close-up. Same render path as the hero, for a single glyph "A". Green/red pad outlines mark DIN/DOUT; copper-orange polylines are the routed chain. Source:
dijkstra_alg.route_chain.
Interactive routing visualizer
route_visualizer.py builds a self-contained HTML page showing the router's output for every glyph (AβZ, 0β9) in both chain orientations. route_server.py serves it plus a live /api/route endpoint that powers a Custom Shape editor β draw any 5Γ9 pattern and watch it route on demand using the same dijkstra_alg module the PCB generator uses (no algorithm duplication).
Usage
# Generate a nameplate (writes <name>-nameplate/ with .kicad_pcb / .kicad_sch / .kicad_pro)
python3 generate_nameplate.py ADONIS
# Build + serve the interactive routing visualizer (custom-shape mode needs the server)
python3 route_server.py 7702 # then open route_visualizer.html through the proxy
# Or just regenerate the static visualizer HTML
python3 route_visualizer.py
The generator can also ship the project straight to a desktop KiCad workspace via adom-desktop (auto-versioned <name>-nameplate-N folders).
Files
| File | Role |
|---|---|
generate_nameplate.py | Main generator: font β LED removal β routing β tiling β KiCad PCB + flat schematic |
dijkstra_alg.py | Shared 8-direction router (grid, keepout, route_chain) β single source of truth |
route_visualizer.py | Builds the self-contained routing-visualizer HTML for all 36 glyphs |
route_server.py | Serves the visualizer + live /api/route for the custom-shape editor |
dot-font/font-data.json | 5Γ9 dot-font bitmaps (AβZ, 0β9, punctuation) |
blank-letter-template.zip | Pre-routed 45-LED KiCad tile (LEDs, caps, GND/+5V fills, vias) |
Dependencies
adompkg (auto-installed): none.
System (manual):
| Dependency | Why |
|---|---|
| Python 3.8+ | runs the generator/visualizer (stdlib only β heapq, json, zipfile, re) |
| KiCad 9 | open the generated .kicad_pcb / .kicad_sch (and to fill zones) |
| Pillow (optional) | only for regenerating the README hero/screenshot PNGs |
| adom-desktop (optional) | ship generated projects to a local KiCad workspace |
Board summary (per generated nameplate)
- WS2812B-2020 LEDs, ~19 per letter (5Γ9 dot-font), 4 mm pitch
- One 100 nF 0402 decoupling cap per LED
- GND fill (F.Cu + B.Cu) + a custom +5V fork fill (B.Cu), GND via stitching
- Each letter is its own addressable string (independent data GPIO)

