Paul’s Projects

🗂️ Project Tracker

A central log of active, pending, and completed hobbyist & electronics projects.
Click More to expand details, or use the controls to expand/collapse all sections at once.


🔹 Active Projects

1. Luck Point Tracker {#luck-point-tracker}

Display and track 0–5 Luck Points at the gaming table
More

Hardware: Raspberry Pi Pico 2, TM1637 4-digit 7-segment display, two pushbuttons, Li-ion battery pack, 3D-printed enclosure.

Software: Custom MicroPython firmware controlling the display, button inputs, and animations.

Status: Prototyping complete — core display and button logic working on breadboard. Increment/decrement animations implemented, including “LUCH” boot animation, “5-flash” max indicator, and dramatic 1d4 reroll sequence when attempting to add a point above 5. Preparing to wire four identical units and design/print final case with panel-mounted buttons.

Next Steps:
1. Test wiring for 4× unit build.
2. Design 3D-printed enclosure with button mounts and display window.
3. Assemble battery-powered prototypes.
4. Field test at game table.

Related: TurnWright

2. Turnwright {#initiative-tracker}

Develop an app for organizing gaming encounters, especially in terms of tracking initiative at the game tabel
🗂️ Initiative Tracker (Turnwright) – Project Status (v1.1-pre)

✅ Current Status

🔧 Known Issues / Polishing Needed** - Undo/Redo: UI visible, but stack not consistently updating across all actions. Needs refinement.
-Live refresh gaps: Certain updates (e.g. HP adjustments, condition changes) still require Advance before Display View reflects them.
-Condition icons/text: Current symbols are hard to read at table distance; need clearer, higher-contrast notation.
-monsters.json: Patched and stable, but long-term goal is to replace with external Artisanal DB.

🛣️ Roadmap v1.1 (Immediate polish) - Fix refresh gaps (HP/conditions update instantly).
- Improve readability of condition indicators (superscripts, bold/colored tags).
- Larger Display View “Now Acting + Initiative” area for table visibility.
- Small styling polish for GM View (restore bigger fonts, confirm shortcut keys).

v1.1.1 / v1.2 (PC death saves & tracker polish) - GM View: Add “Fail Save” / “Success Save” buttons for PCs in dying state.
- Auto-track successes/failures, stabilize or kill at 3 checks.
- Display View: Portrait overlays fade redder as saves fail.
- <title> in Tracker View shows round number (e.g. "Darkmoor – Round 5").

v2.0 (Major upgrade: Turnwright) - App rename: “Encounter Tracker” → Turnwright (service, repo, backups, README, page titles).
- Artisanal DB integration: Replace monsters.json with live 5eADB queries.
- Filtering UI for monster type, CR, tags, source.
- Optional encounter “phases”: preload staged waves, click-to-add mid-combat.
- Exportable encounter logs (per-session summaries).
- Optional wireless “Done” button (GPIO / BLE remote) to advance turns.

** 📝 Next Steps - Field-test v1.1 polish** at next session (2 weeks out).
- If stable, back up as v1.1 release before tackling death saves & 2.0 DB work.
Related: Game Table Lighting Control Hub, Audioreactive LED wall (Build)

3. Game Table Lighting Control Hub {#game-table-lighting-control-hub}

Centralize and coordinate in-game lighting (and possibly audio) control
More

Hardware: Raspberry Pi (likely same one as DNS)

Software: Home Assistant, possibly Node-RED/MQTT

Features:
- Control WLED devices & Pico 2W tavern LEDs
- Integrate with Apple Home via HomeKit Bridge
- Future: smart bulbs, sound effects, coordinated scene triggers
- Status: Planning phase; software stack identified

Related: Audioreactive LED Wall, Raspberry Pi Home Radio Station

4. 📻 Raspberry Pi Home Radio Station (Build) {#raspberry-pi-home-radio-station-build}

Low-power Pi-based FM station for property-wide music playback, with automated announcements and future AI-DJ integration.
More

Purpose
- 24/7 FM broadcast within property limits
- Curated Apple Music playlists with TTS track announcements
- Future AI-DJ: recap last few songs, tease upcoming tracks

Hardware
- CanaKit Raspberry Pi 5 (8 GB) Starter Kit PRO
- Behringer U-Control UCA222 USB audio interface
- UGREEN 3.5 mm → RCA cable to C.Crane Digital FM Transmitter 3
- TP-Link Omada ES220GMP 16-port PoE+ managed switch
- Cat6 patch cables (1’, 3’, 5’) color-coded by device type

Networking
- ES220GMP as primary closet switch, PoE+ powering the Pi5-radio
- Local DNS entries for consistent naming (radio.home.arpa)

Software (implemented)
- MPD for playback engine
- Flask-based web UI for control/search (play/pause/skip, queue, shuffle, volume)
- “Shows” system via shows.json + program clock: time-of-day playlists by genre/artist
- Web editor for shows (name, schedule, include/exclude filters)
- Reseed button to apply changes instantly without interrupting current song
- rsync-based Mac → Pi sync script for updating library, excluding protected .m4p

Current Status
- FM broadcast working across property, transmitter placement under test
- Web UI functional with Now Playing, Up Next, Library search, and Show banner
- Show editor live: can define time windows and filters (genres/artists)
- Sync pipeline established from MacBook → Pi via rsync
- Verified MPD reads embedded tags (artist, album, genre) from .m4a files
- First working genre-based program schedule running (e.g. Electronic + Daft Punk, Vangelis)

Next Steps
1. Improve tag consistency on MacBook (genre cleanup in Music.app or Kid3)
2. Extend Flask UI with a debug view (show → matching tracks)
3. Add lightweight logging of rsync + MPD genre stats after sync
4. Experiment with transition handling (bumper padding, end-time alignment)
5. Revisit antenna placement to maximize FM coverage without drift

Future Enhancements
- AI-DJ running on Mac mini with Ollama (announce last/next tracks)
- Guest “Now Playing” / request portal (Pi Zero kiosk or browser-based)
- Integration with Game Table Lighting Control Hub for scene/audio sync
- Audioreactive LED tie-in (via Dig-Uno + WLED)

Related: Game Table Lighting Control Hub, Audioreactive LED Wall

5. Audioreactive LED wall (Build) {#led-wall}

WLED-based frame with ~477 addressable LEDs to power lighting effects for D&D games and to serve as an equalizer-style visualizer for music
More

Purpose
The project will deliver a video “wall” (36”X42”) of LEDs that can be triggered for mood effects during D&D games and that, otherwise, can present an audioreactive display for music playing in the wall’s vicinity.

Hardware
- Quinled Dig-Uno ESP32-based WLED controller - Mean Well LRS-200-5 power supply - 2812E LED strips (total 10 meters) - commodity lumber for the frame - Custom fabric cover

Software
- WLED project running on Dig-Uno

Current Status
- Dig-Uno running in 3D-printed case, powered by Mean Well - Strips cut to 53-LED lengths and 3-pin connectors soldered - Basic segment configuration defined for 9 segments - Fabric cover (wolf mural) received - Audioreactive microphone… initially tried to connect small digital mic. Never could get it to work, likely due to my poor soldering skills (a recurring theme). However, purchased analog mic and is now working well. - An intermittent flash began to occur with any type of animation. Worried that I had a wiring problem, but unplugging different legs of the install did not improve the flash. Reset Dig-Uno WLED to factory settings and reconfigured strips & segments and no flash! - Built frame. Like a dope, I cut the backboard to exactly (I mean… amateur woodworking exactly) 42” X 36” to accommodate the 53-LED strips… and then mounted the wooden frame pieces which shrunk the internal backboard space. Something I told myself to take into account, but did anyway. - 3D-printed clear PETG diffuser strips and fitted LED legs into the strips, SuperGlued diffuser to backboard… and it looks pretty good!

Next Steps
- Still thinking about how to attach Wolf mural and (probably) some more everyday cover. Adhesive-backed magstrips did not satisfactorily adhere to metal washers; washers suck at magnetism. Applied some metal strips which work better, but adhesive sucks at sticking metal to wood and my drill bits suck at cutting through 1/4” steel. Evaluating options.

Updated: 2025-09-26

Future Enhancements
- Integrate with Game Table Lighting Control Hub project

Related: Game Table Lighting Control Hub, Raspberry Pi Home Radio Station

6. 🎙️ AI-DJ (Active Project){#radio-ai-dj}

Create an AI DJ personality to run alongside Pi5-Radio. Also, manage playlists for “shows” on the radio with unique genres and music emphases.
More

Purpose Using a local AI create unique virtual DJs that select songs and introduce them verbally as well as react to music requests and give home-specific PSAs. The project: - Inserts short spoken interludes between tracks (Stephen Hill–style ambient guide).
- Builds deliberate playlists (“shows”) instead of relying on MPD shuffle.
- Runs on the Mac Mini (dj account) and integrates with Pi5 for playback.

Hardware
- Apple Mac Mini (M4, 32 GB RAM, 512 GB SSD) – running AI-DJ logic and voice generation
- Raspberry Pi 5 (“radio”) – MPD/Liquidsoap/FM transmission
- Local LAN / Wi-Fi connection between mini and Pi5

Software
- macOS 15, dj user with per-user Homebrew + Python venv
- Python 3.12 (python-mpd2, mutagen, typer, rich)
- show_planner.py (prototype script to own MPD queue)
- MPD configured to bind on LAN (port 6600)
- SSH key auth (dj@minimacuser@radio)
- Homebrew tools (per-user): mpc, nc, etc.

Next Steps
- ✅ Establish dj account and venv on Mac Mini
- ✅ Configure MPD on Pi5 for LAN access
- ✅ Build/test show_planner.py to generate ~30-min sets
- ⏳ Integrate Ollama (or other LLM) to generate playlist plans
- ⏳ Add TTS pipeline for voice stingers / commentary clips
- ⏳ Schedule planner runs via LaunchAgent (nightly or timed “shows”)
- ⏳ Develop “listener request/dedication” flow (insert forced lines)
- ⏳ Document end-to-end pipeline for backup & reproducibility

Future Enhancements
- Integrate with Game Table Lighting Control Hub project

Related: Game Table Lighting Control Hub, Raspberry Pi Home Radio Station

7. Raspberry Pi0 Head – Dual-Mode Boot {#kiosk}

Update Raspberry Pi Zero 2W that is mounted with monitor (and old Raspberry Pib) with an option boot either to streamlined Chromium display for initiative tracker or to Glances-based system monitoring tool
More

Purpose
In this project, I’m updating the Raspberry Pi Zero that serves up my initiative tracking app (TurnWright) during game nights, to give it a second boot option of running a 2X2 dashboard of performance monitors for 4 different Raspberry Pis so the Pi & Monitor serve some purpose on non-game nights

Hardware
Raspberry Pi Zero 2W in 3d-printed case connected to 32” monitor on VESA-mount stand with casters. Attached to the same stand is my old, old Raspberry Pi B and a portable ASUS 14” display which serves up images (maps, NPCs, etc) at the game table, served via http from a Pi 3.

Software
- Raspberry Pi Lite (Debian Bookworm) - tmux - Glances - Chromium

Current Status
- Boot Menu: Added 30-second chooser at tty1 (default = Kiosk / Chromium, option 2 = System Monitor).

Had brief issue, when trying to add functionality to quit the entire Glances session with a single “q” that one of the boxes I’m polling (my new Pi 3b that will be time-lapse video box) was powered off, and since it’s session failed, the entire dashboard failed.

Now running smoothly. Boots to option menu; defaults (in 30 seconds) to boot Chromium and TurnWright display; hitting “2” within that window boots to CLI and the 2X2 Glances dashboard.

Future Enhancements

Updated: 2025-09-17

Related: TurnWright

8. Raspberry Pi3b MotionEye Camera {#pi3-garage}

Install Pi3 with Logitech webcam for timelapse of 3D-print jobs, also check-in on AMS and other garage-tech(TM)
More

Purpose Add external camera to capture time-lapse of Bambu A1 (and possibly, via a 2nd camera A1-mini). May add 2nd (3rd?) camera to see status of AMS… which spools are connected, how much filament is left, etc. May also use Pi for other needs in garage.

Hardware
Raspberry Pi 3B in Flirc aluminum case (due to summer temps), existing Logitech webcam. Learned an important lesson about building the Pi while waiting for the case, and then installing in case with SD card still in Pi. Short version: don’t. Camera is currently just sitting on a plastic container. I’d like to get/print an arm with tripod mount to suspend the camera over the printer and get it off the floor.

Software
- Raspberry Pi OS(Debian Bookworm) - MotionEye – cool package! Used https://github.com/motioneye-project/motioneye#installation and no issues at all! - Custom script for copying files to Macbook (via ChatgPT) - Added to Glances dashboard, but Glances took a lot of Mem; so currently doing a Top snapshot and adding the results to tmux Glances via ssh

Current Status
In production. No issues.

Next Steps
Get camera off floor! Possible custom fan option to blow on Flirc case; though it’s pretty stable at ~45C even though it’s currently 90F outside! Might add another camera or two for A1-mini and AMS.

Updated: 2025-09-21

Related: N/A

⏳ Pending Projects

Magic Mirror Prop

This project will create a display-driven tabletop propsdesigned to appear as an ornate mirror within 3D-printed terrain. When inactive, the screen appears as a mirror. On a hidden trigger, the display plays a brief animation (e.g. swirling smoke) and then reveals the BBEG portrait.
More

Build Variants Two prototypes will be developed: 1. Large Mirror (first option)

Hardware:: Adafruit ESP32-S3 Feather (4 MB Flash / 2 MB PSRAM) paired with the Adafruit 2.4″ TFT FeatherWing V2 touchscreen (using only the display + SD slot).

Features: - MicroSD storage for multiple portraits/animations. - FeatherWing form-factor simplifies stacking. - Powered by USB-C or 500–1200 mAh Li-ion via JST. - Use Case: Mounted in terrain as a wall-sized mirror for dramatic reveals.

  1. Compact Mirror (alternate option)

Shared Elements

Software: - CircuitPython with displayio + gifio for simple animation → static image transitions. - Terrain design: 3D-printed bezels with 1 mm lip to frame displays; optional one-way mirror film to complete illusion. - Power: USB-C for setup; Li-ion for wireless runtime (≈3–8 hrs depending on battery)

Status - Hardware received. Started with “compact mirror” (number 2 above.). Soldered connections on each… not well. Struggled with ST7789 driver in CircuitPython but got that worked out. However, while backlight turns on, display isn’t working properly. There’s at least one loose wire on TFT. Will likely remove and resolder entire TFT; stranded Dupont wires too messy on this project!

Next steps: design and print terrain enclosures sized for both screen types, allowing service access to SD/battery.

Updated: 2025-09-26


Raspberry Pi 4 Porch Projector

A lightweight, dedicated Raspberry Pi 4 setup for running a portable projector.
Intended uses: - Streaming modest video (primarily YouTube). - Running looping slideshows for seasonal events (Halloween, Christmas, etc.).
More

Hardware - Raspberry Pi 4 (2–4 GB model sufficient). - MicroSD card with Raspberry Pi OS or LibreELEC. - Wi-Fi (built-in). - HDMI output to projector. - Optional: small case, remote control app, or wireless keyboard.

Software Options - feh: simple, lightweight slideshow tool for looping images. - Kodi (LibreELEC): full media center with support for slideshows, video playlists, and remote control from phone. - mpv: for looping video files.

Next Steps - Acquire Pi 4 and test with projector. - Choose preferred OS/software path (feh vs Kodi). - Create seasonal media folders (Halloween/Xmas slides, video loops). - (Later) Configure autostart for seamless porch setup.

✅ Completed Projects

Local DNS Server (Pi3 + dnsmasq)

Purpose: Provide local hostname resolution & DNS caching
More