I started this project by measuring my wedding ring. I like its form factor and it fits well enough, and the wide curved stone on the top seemed like a nice element to replace with LEDs:
That got me in the ballpark; my fingers are all different sizes and I figured the PCB edge wouldn't be nearly as accommodating as a smooth gold band, so I decided on a ~19.5mm opening. After creating initial footprints in KiCad and pulling them into Inkscape (via *.svg export), I putzed about for a few hours and came up with a reasonable PCB outline:
- I'm using Inkscape, not a nice parametric CAD program that allows dimensioning and complex constraints. As such, I depend heavily on guidelines and snapping to ensure dimensional consistency and (in this case) symmetry. Like all things, using this tool rather than something like Fusion360 or FreeCAD is a tradeoff.
- I tend to design organic shapes using the minimum number of points possible; in this case, the ring outline has 8 nodes, six of which are smooth. Again, I used guidelines to ensure node alignment and approximate handle positioning. But if you zoom in close enough, the ring isn't perfectly symmetrical.
- I keep critical footprints in their own layer, and move them around as needed to get other dimensions correct. In this case, those footprints are mainly the batteries (the large red circles, one of which has a large hole for the Zn-air vent), the side-mounted pushbutton switch, and the LEDs. Note that the LEDs are linear-spacing-equalized but not rotated to final position; as fas as I can tell you can't do circular arrays in Inkscape, and in any case I wanted KiCad to identify them as discrete footprints rather than an imported graphic. The critical dimension here was width, so I used one footprint as a rough ruler and rotated it as needed to approximately equalize clearance between the inner and outer edge cut.
I then imported the outline as a *.dxf file (twice) into KiCad and got the two halves aligned on the same grid:At some point, "the perfect is the enemy of the good" applies here. I added centerlines and moved the respective outlines until they were aligned within 25 microns or so, but they aren't perfect. It doesn't really matter. Next, I created a circular array of LED footprints (again, twice...), tweaking spacing and radius until they seemed to fit nicely:
Note that I added the specs to the PCB comment layer, and manually named each LED footprint to its appropriate net. Then I deleted all the originally imported LED footprints. Probably a simpler way to do this, but it worked for me.
Routing was straightforward. I arranged the Charlieplexed LEDs in such a way that I minimized vias and was able to run the four signal lines as four pours around the skinny part of the ring, which avoided awkward jointed traces:
Note the four 0805 footprints above and below each of the side pours -- these were added post-netlist for the 20M structural resistors. I used a high value here since they short out the LED signal lines; I suppose I could have pushed the pours to the outside of the ring, but this worked well enough. This also caused one screw-up, as I improperly specified one of the front-layer pours resulting in an unintended gap:
After assembly and programming and still not being able to light up the center four LEDs, I discovered the problem, scraped away a bit of solder mask, and added a blobby bridge: