The rhombic dodecahedron fills space on its own and is the dual of the cuboctahedron: twelve rhombic faces around a compact, almost spherical body. This build joins its frame with tenons and screws instead of glue, so the lamp can be taken apart for service or transport and closed in any order.
Mirrors glaze from outside onto seat ledges. One dowel per bar, held by crush ribs, stops a lifting mirror within 0.69 mm with 2 mm of overlap.
1032 LEDs on one chain, 12 fused injection hubs on 2 supplies, and every wire hidden in slots under the strips and through the hubs.
Every part is a watertight single solid, and glazing, retention, clearance, wire-fit and SCAD-to-model checks all pass on the placed assembly.
This lamp is a rhombic dodecahedron built as a printed edge-and-hub frame that carries twelve rhombic two-way acrylic mirrors and is lit from inside its edges by an addressable LED strip. The rhombic dodecahedron fills space on its own and is the dual of the cuboctahedron: twelve rhombic faces around a compact, almost spherical body. This build joins its frame with tenons and screws instead of glue, so the lamp can be taken apart for service or transport and closed in any order.
The frame is 24 edge bars and 8 three-way and 6 four-way hubs. Each bar ends in a 15.7 mm tenon that drops into an open mortise in the hub from inside the frame and is held by one M3 × 10 countersunk screw driven through the hub floor from outside, so the frame has 48 screwed joints and no glue and comes apart for service or transport. Each mirror loads from outside onto seat ledges, and one printed dowel per bar keeps it there. Every wire runs hidden in slots in the bars and hubs, so nothing crosses the mirror cavity.
A rhombic dodecahedron has 14 vertices, 24 edges and 12 faces. Every face is a rhombus whose diagonals are in the ratio of the square root of 2 to 1, with 70.5 and 109.5 degree corners; four acute corners meet at each of the six four-way vertices and three obtuse corners at each of the eight three-way vertices. All twenty-four edges share the 120 degree dihedral, so one bar design serves every edge. With a 260 mm edge the lamp stands 424.6 mm tall on a rhombus face and spans 600.4 mm from corner to opposite corner. The dihedral of 120° sets the bar half-angle β = 30°, the angle between each face and the bar's outward bisector, and every proportion of the bar follows from it.
| Property | Value |
|---|---|
| Edge length | 260 mm |
| Vertices / edges / faces | 14 / 24 / 12 |
| Vertex valence | three-way (8) and four-way (6) |
| Dihedral / bar half-angle β | 120° / 30° |
| Face | rhombus, 260 mm side, 424.6 mm across |
| Circumradius / midradius / inradius | 300.2 / 248.9 / 212.3 mm |
| Height resting on a face | 424.6 mm |
Every edge carries the same flat-facet edge bar, modeled once in a local edge frame (x along the edge, z along the outward bisector of the two faces, y across) and placed on every edge. The section is a 22 mm rail, 18 mm deep. The body runs 188 mm between the hubs and 219.4 mm overall, 15.7 mm tenon included at each end. Across the section, from the outer facet inward, the bar carries the dowel tunnel, the two mirror seat ledges, a wire T-slot and the LED channel.
At β = 30° the glass plunges 0.58 mm for every millimeter it moves across the bar, so the mirror edge sits deep and the bar must be deep enough to keep the seat above the LED channel. The seat ledges carry a 45° corbel underneath, which lets the bar print inner face down with the glass seats facing up. Three of the 24 bars, B5, B6, and B8, are entry bars: each adds a Ø9 mm harness port 25 mm from the end at its lower hub.
| Feature | Value |
|---|---|
| Rail | 22 mm wide × 18 mm deep, 188 mm body |
| Print envelope | 219.4 × 28.5 × 18 mm |
| Seat ledge top | z = -9.57 mm, 0.2 mm below the glass |
| Dowel tunnel | z = -6.49 to -2.39 mm, 6.6 mm long, roof 2.4 mm |
| Wire T-slot | 5 mm opening, 8 mm wide, 4.2 mm below the channel floor |
| LED channel | 9 × 1.5 mm on the inner face |
Each hub is the convex hull of the bar sections where the tenons end, 20 mm from the vertex, joined to one full-section sleeve per arm that houses the mortise and meets the bar body end to end. The rhombic dodecahedron has two kinds of vertex and so two hub designs: 8 three-way hubs of 29.38 cm³ (61.1 mm envelope) and 6 four-way hubs of 25.84 cm³ (44.6 mm envelope). Each arm has a mortise 12 mm wide, open toward the inside of the lamp under a 6 mm floor, and an open wire slot 5 mm wide and 6.2 mm deep on its inner face. The slots of the arms meet in a junction at least 5 mm square, with at least 1 mm of plastic between any slot and any mortise or screw hole.
The tenon is the lower 11.7 mm of the bar section, 11.4 mm wide and 15.7 mm long, with 0.3 mm clearance on each face. It drops radially into its mortise from inside the frame, so the frame closes in any order, and one M3 × 10 countersunk screw, driven through the hub floor from the outer facet, pulls it up against the floor. The countersunk head sits flush with the facet. The screw cuts its own thread in a Ø2.6 mm pilot hole, 5 mm deep in the tenon's roof, which leaves 1 mm of plastic above the wire slot. The LED channel and the wire slot run through the tenon, so the strip and every wire pass the joint unbroken, and each screw stays reachable from outside after the lamp is glazed.
Each mirror glazes from outside. It drops onto the seat ledges of its bars, whose top sits 0.2 mm below the glass at rest, so the glass settles onto the ledges after 0.17 mm of travel without being forced. Because every face loads from outside, the last mirror goes in exactly like the first; there is no keystone face.
One retaining dowel per bar then slides across the bar through its tunnel. The dowel is 31.2 × 6 × 3.5 mm and reaches at least 4.6 mm past each side of the rail, over the edges of both adjacent mirrors. Two crush ribs on its underside, 0.75 mm tall, press it against the tunnel roof with 0.15 mm of interference, so it cannot drift out sideways, yet it can be pushed out by hand to service a face.
The dowel length follows from a retention rule rather than a fixed allowance. If a mirror lifts along its own normal, its outer edge must meet the dowel before it can slide past the dowel's tip. With the dowel installed, the glass travels at most 0.69 mm before contact and the dowel then overlaps it by 2 mm. The CSG model confirms both numbers by moving each mirror along its normal until it touches.
Each mirror is the full rhombus face scaled to 0.88 about its center, which puts the glass edge 14.7 mm inside the edge line and on the seat ledges. Every corner points at a hub, so each is chamfered to clear it: 18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners. The nearest hub is 1.2 mm away. The result is a 354 × 243.4 mm piece of 2 mm two-way acrylic mirror, twelve identical pieces per lamp, with the mirrored side facing into the lamp.
| Parameter | Value |
|---|---|
| Material | 2 mm two-way acrylic mirror |
| Size | 354 × 243.4 mm (fit 0.88 of the 260 mm face) |
| Corners | 18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners |
| Area / mass | 489.1 cm² / 116 g each |
| Tolerance | ± 0.5 mm; deburr the edges |
| Quantity and files | 12; mirror_single.dxf and mirrors_12up.dxf (mm) |
A rhombic dodecahedron has six pairs of parallel faces, so six infinity tunnels cross inside it. With twelve faces packed tightly around a small interior, the reflections cross and re-cross into a dense lattice of receding tunnels.
A WS2812C-2020 addressable strip at 198 LED/m lines the inner channel of every bar. The strip is cut into one segment per bar of 43 LEDs (217.2 mm), the longest whole number of LEDs that fits the 220 mm channel with 1 mm left at each end for the solder joint. The lamp has 1032 LEDs on 5.21 m of strip. The controller is an ESP32 running WLED.
The supply is sized for every LED at full white, 0.3 W (60 mA) each, with a 1.2 margin, and rounded up to the next standard size. Full white draws 309.6 W, 61.92 A at 5 V; the margin asks for 74.3 A, more than the largest standard supply (60 A). The lamp therefore uses two 5 V supplies (40 A and 40 A, 400 W in all), each with its own fuse block and its own group of injection hubs (supply 1: H1, H2, H5, H6, H7, H11, 31 A at full white; supply 2: H3, H4, H8, H9, H10, H13, 31 A at full white). The grounds are common, and no feeder connects two supplies. The strip dissipates about 59 W per meter at full white, more than a printed channel sheds for long, so the firmware also carries a sustained brightness limit.
| Condition | Power | Current |
|---|---|---|
| Full white, all LEDs (design point) | 309.6 W | 61.92 A |
| Supply 1 (1.2 × its 31 A, rounded up) | 200 W | 40 A |
| Supply 2 (1.2 × its 31 A, rounded up) | 200 W | 40 A |
| WLED current limit (protects the supplies) | 309.5 W | 61.9 A |
| Recommended sustained limit (50 %) | 154.5 W | 30.9 A |
No single feed point can carry 61.9 A into a thin strip, so power enters at 12 injection hubs (H1, H2, H3, H4, H5, H6, H7, H8, H9, H10, H11, H13). Each strip segment is fed directly at one of its ends, and each injection hub feeds at most 0.5 m of strip; here every injection hub feeds two segments, 0.43 m and 5.16 A at full white. An integer program finds the smallest set of hubs that meets this rule; on the rhombic dodecahedron it is twelve hubs.
Each injection hub has its own 18 AWG feeder pair from a fused distribution block beside its supply, protected by a 7.5 A blade fuse (1.45 × the largest branch current). The pairs travel as three sleeved harnesses, 0.5 m long and at most 4 pairs each, into ports on B5, B6, and B8 near the base (port 1 on B5: H1, H4, H5, H11 and the data pair; port 2 on B6: H2, H6, H7, H13; port 3 on B8: H3, H8, H9, H10). Inside, each pair splits into the wire slots toward its hub. At each injection hub the feeder lands on one segment's end pads, and short 24 AWG bridges carry power to the other segments it feeds. The worst voltage drop at full white is 0.27 V (5.4 %) at H13.
| Injection hub | Supply | Feeds | Full-white load | Feeder route | Length | Drop |
|---|---|---|---|---|---|---|
| H1 | 1 | B1, B5 | 86 LEDs, 5.16 A | port 1 → H1 | 0.04 m | 2.4 % |
| H2 | 1 | B6, B7 | 86 LEDs, 5.16 A | port 2 → H2 | 0.04 m | 2.4 % |
| H3 | 2 | B2, B3 | 86 LEDs, 5.16 A | port 3 → H3 | 0.04 m | 2.4 % |
| H4 | 2 | B4, B9 | 86 LEDs, 5.16 A | port 1 → H1 → H4 | 0.3 m | 3.5 % |
| H5 | 1 | B11, B15 | 86 LEDs, 5.16 A | port 1 → H5 | 0.21 m | 3.1 % |
| H6 | 1 | B12, B16 | 86 LEDs, 5.16 A | port 2 → H6 | 0.21 m | 3.1 % |
| H7 | 1 | B13, B17 | 86 LEDs, 5.16 A | port 2 → H2 → H7 | 0.3 m | 3.5 % |
| H8 | 2 | B8, B18 | 86 LEDs, 5.16 A | port 3 → H8 | 0.21 m | 3.1 % |
| H9 | 2 | B14, B19 | 86 LEDs, 5.16 A | port 3 → H8 → H9 | 0.47 m | 4.2 % |
| H10 | 2 | B10, B20 | 86 LEDs, 5.16 A | port 3 → H3 → H4 → H10 | 0.56 m | 4.6 % |
| H11 | 1 | B21, B24 | 86 LEDs, 5.16 A | port 1 → H5 → H11 | 0.47 m | 4.2 % |
| H13 | 2 | B22, B23 | 86 LEDs, 5.16 A | port 2 → H6 → H12 → H13 | 0.73 m | 5.4 % |
All 1032 LEDs form one data chain, one segment per bar. A chain that visits every bar exactly once is an Euler trail, and a graph admits one only when at most two hubs have an odd number of bars. The rhombic dodecahedron has 8 odd hubs. The chain can start and end at two of them, so the other 6 must be joined in pairs, (k − 2) / 2 = 3 extra connections. A connection runs along the bars between its two hubs, and the pairing that uses the fewest bars (a minimum-weight matching) uses 6, so the chain needs 6 data return wires. Each return wire is a single 24 AWG conductor laid in the wire slot of one bar (B18, B8, B15, B11, B13, B14); it carries the signal back along that bar without lighting it. The chain starts at H1, beside port 1, and ends at H6.
| # | Bar | DIN → DOUT | LED index |
|---|---|---|---|
| 1 | B5 | H1 → H5 | 0–42 |
| 2 | B15 | H5 → H11 | 43–85 |
| B15 (return) | H11 → H5 | data only | |
| 3 | B12 | H5 → H6 | 86–128 |
| 4 | B16 | H6 → H12 | 129–171 |
| 5 | B21 | H12 → H11 | 172–214 |
| 6 | B24 | H11 → H14 | 215–257 |
| 7 | B20 | H14 → H10 | 258–300 |
| 8 | B11 | H10 → H5 | 301–343 |
| B11 (return) | H5 → H10 | data only | |
| 9 | B10 | H10 → H4 | 344–386 |
| 10 | B4 | H4 → H1 | 387–429 |
| 11 | B1 | H1 → H2 | 430–472 |
| 12 | B7 | H2 → H7 | 473–515 |
| 13 | B17 | H7 → H12 | 516–558 |
| 14 | B22 | H12 → H13 | 559–601 |
| 15 | B23 | H13 → H14 | 602–644 |
| 16 | B19 | H14 → H9 | 645–687 |
| 17 | B9 | H9 → H4 | 688–730 |
| 18 | B3 | H4 → H3 | 731–773 |
| 19 | B8 | H3 → H8 | 774–816 |
| 20 | B18 | H8 → H13 | 817–859 |
| B18 (return) | H13 → H8 | data only | |
| 21 | B13 | H8 → H7 | 860–902 |
| B13 (return) | H7 → H8 | data only | |
| 22 | B14 | H8 → H9 | 903–945 |
| B14 (return) | H9 → H8 | data only | |
| B8 (return) | H8 → H3 | data only | |
| 23 | B2 | H3 → H2 | 946–988 |
| 24 | B6 | H2 → H6 | 989–1031 |
Where the chain turns a corner, a single 24 AWG corner jumper runs through the hub slot from one segment's DOUT pad to the next segment's DIN pad (24 in all). Jumpers and return wires carry data only: every segment's ground already returns to a distribution block through its own feeder, so a second ground conductor would add wire without adding a reference. The harness data lead is a DATA and GND pair because it carries the controller's ground.
| Item | Qty | Specification | Size / note |
|---|---|---|---|
| A · Printed parts | |||
| Edge bar | 21 | printed, PETG; edge_bar | 219.4 x 28.5 x 18 mm |
| Edge bar, entry | 3 | printed, PETG; edge_bar_entry, Ø9 mm harness port | on B5, B6, B8 |
| Hub, three-way | 8 | printed, PETG; hub_3way | 61.1 mm envelope |
| Hub, four-way | 6 | printed, PETG; hub_4way | 44.6 mm envelope |
| Retaining dowel | 24 | printed, PETG; mirror_dowel, two crush ribs underneath | 31.17 x 6 x 3.5 mm |
| Test coupon | 1 | printed, PETG; print first | hub + 40 mm stub + dowel |
| Mirror template | 1 | printed, any filament; cutting guide | 354 x 243.4 x 2 mm |
| B · Optical | |||
| Mirror | 12 | 2 mm two-way acrylic mirror | 354 x 243.4 mm; 18 mm along each side at the three-way corners; 12 mm along each side at the four-way corners |
| C · Electrical | |||
| LED strip | 5.21 m | WS2812C-2020 addressable strip, 198 LED/m, 5 V | 43 LEDs per bar x 24; buy 5.5 m |
| Power supply 1 | 1 | 5 V 40 A (200 W), enclosed | >= 37.15 A required; feeds H1, H2, H5, H6, H7, H11 |
| Power supply 2 | 1 | 5 V 40 A (200 W), enclosed | >= 37.15 A required; feeds H3, H4, H8, H9, H10, H13 |
| Fuse block 1 | 1 | 6-way blade fuse holder | distribution |
| Fuse block 2 | 1 | 6-way blade fuse holder | distribution |
| Blade fuse | 12 | 7.5 A, one per feeder | ATO/ATC |
| Bulk capacitor | 2 | 1000 µF, 10 V electrolytic | across each fuse block input |
| Controller | 1 | ESP32 running WLED | ESP32 development board |
| Level shifter | 1 | 74AHCT125 (3.3 V to 5 V) | one channel used |
| Series resistor | 1 | 330 Ω, 1/4 W | at the level-shifter output |
| Feeder wire | 22.2 m | 18 AWG silicone, red and black | 12 pairs incl. 0.5 m lead |
| Bridge wire | 2.3 m | 24 AWG silicone, red and black | hub power bridges |
| Data wire | 5.1 m | 24 AWG silicone | lead pair, corner jumpers, return wires |
| Harness sleeve | 1.8 m | braided sleeve, 10 mm | over each lead |
| D · Adhesive and miscellaneous | |||
| Screw | 52 | M3 × 10 countersunk | 48 tenon joints and 4 spares |
| Controller enclosure | 1 | ventilated project box | ESP32, shifter, fuse blocks |
| Heat-shrink, solder, flux | a/r | ||
Print the test coupon first. It holds one hub, a 40 mm bar stub with a seat, tunnel and wire slot, and one dowel, which is enough to tune the tenon fit and the dowel's crush ribs before committing to the full queue. PETG (PLA acceptable for a display piece) at 0.2 mm layers, 3 perimeters and 25 % infill suits every part. The lamp parts hold 2169.8 cm³ of solid volume, at most 2756 g of plastic.
| File | Qty | Size (mm) | Orientation |
|---|---|---|---|
| test_coupon | 1 | 145.1 × 67.4 × 29 | each part as listed below |
| edge_bar | 21 | 219.4 × 28.5 × 18 | inner face on the bed, outer facet up |
| edge_bar_entry | 3 | 219.4 × 28.5 × 18 | inner face on the bed, outer facet up |
| hub_3way | 8 | 67.4 × 67.4 × 29 | vertex up |
| hub_4way | 6 | 51 × 61 × 39.9 | outer facet of one arm on the bed |
| mirror_dowel | 24 | 6 × 31.2 × 4.3 | flat, ribs up |
| mirror_template | 1 | 354 × 243.4 × 2 | flat |
Stand the lamp on a rhombus face. Hubs are numbered H1 to H14 from the bottom up, and hubs at the same height run counterclockwise seen from above. H1 to H4 are the corners of the bottom face and H11 to H14 the corners of the top face. Bars B1 to B24 are numbered the same way by their midpoints. The harnesses enter through ports on B5, B6, and B8, near H1, H2, and H3; port 1 on B5 also carries the data lead. The interactive viewer shows every step.
Every check below runs on the placed CSG assembly (trimesh with manifold3d booleans) before any document is generated, and the OpenSCAD source is rendered and compared part by part with the Python model.
| Group | Check | Measured | Limit | Result |
|---|---|---|---|---|
| part | edge_bar watertight single body | 1 | == 1 body, NoError | pass |
| part | mirror_dowel watertight single body | 1 | == 1 body, NoError | pass |
| part | edge_bar_entry watertight single body | 1 | == 1 body, NoError | pass |
| part | hub_3way watertight single body | 1 | == 1 body, NoError | pass |
| part | hub_4way watertight single body | 1 | == 1 body, NoError | pass |
| frame | bars intersect hubs (tenons in mortises) | 0.00 mm3 | < 0.01 | pass |
| frame | bar-to-bar at any vertex | 0.00 mm3 | < 0.01 | pass |
| slots | wall between wire slot and mortise or screw hole | 3.45 mm | >= 0.98 | pass |
| slots | hub junction passage (side of square) | 5.00 mm | >= 4.0 | pass |
| slots | harness fill of the fullest entry port | 0.48 | <= 0.60 | pass |
| slots | wires pack into every bar slot | 24 | == 24 | pass |
| slots | fullest bar groove (fill) | 0.54 | <= 0.60 | pass |
| slots | fullest hub junction (fill) | 0.60 | <= 0.60 | pass |
| glazing | glass intersects frame at rest | 0.00 mm3 | < 0.01 | pass |
| glazing | glass intersects dowels at rest | 0.00 mm3 | < 0.01 | pass |
| glazing | clearance glass to nearest hub | 1.24 mm | >= 0.5 | pass |
| glazing | dowel body intersects bars (installed) | 0.00 mm3 | < 0.05 | pass |
| glazing | crush-rib interference per dowel | 4.80 mm3 | ~= 4.80 (designed press fit) | pass |
| glazing | thinnest dowel section | 3.50 mm | >= 1.50 | pass |
| retention | outward lift before a dowel stops the glass | 0.70 mm | <= 1.00 | pass |
| retention | dowel overlap at the moment of contact | 2.00 mm | >= 2.00 | pass |
| retention | in-plane travel before a rail stops the glass | 1.52 mm | <= 2.0 | pass |
| retention | inward travel before the seat supports the glass | 0.17 mm | <= 0.5 | pass |
| led | strip stand-in intersects frame | 0.00 mm3 | < 0.01 | pass |
| led | strip intersects glass or dowels | 0.00 mm3 | < 0.01 | pass |
| entry | harness port opens into the wire slot | 1 | == 1 | pass |
| entry | port clear of the dowel tunnel | 61.20 mm | >= 1.0 | pass |
Orbit, explode and step through the build in your browser.
Open the construction viewer ›