This document captures the full design history and decision rationale for the SpeedsterAI project (3D printed Paul Carmody Speedster speaker enclosures). It is intended to provide context for AI agents continuing the work.
The goal is to replace the original Speedster's 1/2" MDF box with a 3D-printed PETG enclosure that maintains acoustic fidelity to Paul Carmody's design while taking advantage of curves and geometry impossible with traditional woodworking. The enclosure is designed for the Bambu Lab H2D large-format printer.
Drivers (unchanged from Carmody's design):
- Woofer: Tang Band W4-1720 (4" underhung midbass)
- Tweeter: Fountek NeoCD1.0 (true ribbon)
Key acoustic targets (from Carmody's spec):
- Internal volume: 5.5 liters
- Port: 1.375" dia × 4.5" long, tuned to ~55 Hz
- -3 dB point: mid-40 Hz range
File: 2026-02-19-20-50-54-speedster-3d-printed-enclosure-design.txt
Established the core parametric OpenSCAD model. Key decisions:
- Curved-back wedge shape: Wide flat baffle (165×300mm) tapering to narrow rounded back (118×240mm) over 185mm depth. Quadratic taper (power 2.0) concentrates volume near the baffle where driver clearance matters.
- 10mm PETG walls: Chosen for stiffness/mass comparable to 1/2" MDF. At 5-6 perimeters, PETG walls are inherently airtight.
- 28mm front edge roundover: Circular profile smoothing the baffle-to-side transition. Reduces diffraction effects above ~1950 Hz. The original MDF box had sharp edges.
- Volume tuning: Simpson's rule estimation built into the SCAD file. Iterated
enclosure_depthto hit 5.49L net (after subtracting port tube and pillar displacement). - Driver placement: Woofer at y=-45mm, tweeter at y=+55mm (center-to-center spacing of 100mm). Carmody's original had the woofer overlapping the tweeter flange slightly; our design maintains a small 7.75mm gap.
File: 2026-02-20-02-43-55-speedster-3d-enclosure-refinements.txt
Major refinements:
- Bolt direction reversed: Originally bolts entered from the front (visible). Reversed so bolts enter from back — no visible hardware on the front baffle.
- Split plane repositioned: Moved to z=60.7mm (aligned with port tube front end) so the port stays entirely in the back half. No split cuts through the port tube.
- Port exit flare: Added 15mm radius concave flare at the port exit on the back face. Reduces turbulence noise at the port opening. Implemented as a quarter-circle rotate_extrude profile.
- Woofer rear chamfer: 45° chamfer on the baffle cutout interior starting at z=3mm (leaving 3mm of straight bore for screw thread engagement). Opens the bore from 95.5mm to ~109.5mm at the inner wall surface, reducing back-wave reflection.
File: 2026-02-20-02-45-11-speedster-3d-driver-heat-inserts.txt
Converted all driver mounting from through-holes to heat-set inserts:
- Woofer: 4× M4 heat-set inserts (Ø5.6mm × 8mm deep) in baffle face, 45° rotated diamond pattern on 115mm bolt circle
- Tweeter: 4× M3 heat-set inserts (Ø4.5mm × 5mm deep) in recess floor, 60.8mm square pattern
This allows repeated assembly/disassembly without wearing out the plastic threads.
File: 2026-02-21-04-47-04-speedster-tongue-groove-seal.txt
Replaced a CNC-cut foam gasket concept with an integral tongue-and-groove joint:
- Tongue: 3mm wide × 4mm tall ridge on front half split face, centered 5mm from outer wall
- Groove: 3.6mm wide × 5mm deep channel in back half (0.3mm clearance per side)
- Seal strip: Closed-cell foam tape or TPU filament bead in groove bottom (1mm extra depth below tongue)
- Provides X-Y self-alignment during assembly plus airtight seal when compressed
File: 2026-02-21-04-48-38-shelf-brace-iteration-pillar-approach.txt
Explored three bracing strategies:
- Window brace (separate printed piece clamped at split plane) — Rejected: extra part, tolerance-sensitive
- Shelf brace (horizontal shelf between drivers) — Rejected: complicated clearances around port tube and drivers, additional bolt hardware
- Pillar-to-pillar mating — Adopted: 8 pillar pairs at split-plane perimeter with interlock boss/recess. Pillars double as wall reinforcement and bolt anchorage.
File: 2026-02-21-14-42-07-pillar-bolt-redesign-back-face.txt
Attempted to move all 8 bolts to the flat back face for simpler counterbores. Reverted because:
- Pillars lose side-wall attachment (less rigid)
- Back panel becomes cluttered
- Required specialty 180mm M4 bolts
Final resolution of the bolt-on-curved-wall problem:
- Counterbore landing approach: For each bolt position, compute the z-depth where the taper cross-section still provides 4mm of material around the bolt center. Cut an 8mm cylinder from that z through to the back exterior. This creates a flat perpendicular face inside the tapered wall for the bolt head to seat on.
- Uniform bolt length: All 8 counterbores use the shallowest (most restrictive) landing z (~113mm), so all bolts are the same standard length (~M4×60mm).
- Back pillar extension: Increased from 15mm to 30mm depth past split face, with taper angle reduced from 20° to 15° for a more gradual blend into the inner wall (~60mm total pillar+taper). Covers more of the bolt through-hole.
- Interlock swap: Boss moved to back half (no heat-set insert, stays at nominal size), recess moved to front half (absorbs any expansion from heat-set insert installation).
Improved the crossover PCB mounting bosses for overhang-free FDM printing:
- 45° brace start shifted: The triangular support brace previously started at the boss center (
ez), leaving the bottom half of the cylinder unsupported. Moved brace start toez + boss_r(bottom of boss in print orientation) so the full cylinder sits on a 45° ramp with no overhang. - D-shaped boss cross-section: Hulled each boss cylinder with a thin slab at
z = ez + boss_rto create a flat-bottomed profile. This eliminates the crescent-shaped gaps between the round cylinder and the flat brace surface, giving a seamless transition from boss to support. - Result: Every layer of the crossover boss prints with ≤45° overhang — no support material needed for these features.
Converted binding post plate mounting from through-hole self-tappers to heat-set inserts:
- 4× M4 heat-set inserts (Ø5.6mm × 6mm deep) pressed into the recess floor on the back face, same spec as the woofer mounting inserts.
- Insert pockets bored from recess floor inward (toward cavity). Total depth used: 3mm recess + 6mm insert = 9mm of the 10mm wall, leaving 1mm of material on the cavity side.
- Rationale: Self-tapping screws into PETG wear out quickly with repeated assembly. Heat-set inserts allow unlimited disassembly for crossover tuning and driver swaps, consistent with the rest of the enclosure's insert-based design.
Established a CLI render pipeline for visual validation and documentation:
render_modevariable (0–4): Assembled, exploded, front half, back half, cavity. Set via-D render_mode=Nfrom CLI.- Display rotation
rotate([90,0,0]): Transforms model Y→Z so speaker stands upright with tweeter on top. After rotation: X=horizontal, Y=depth(0=baffle, -185=back), Z=height(+up). Model center at (0, -92.5, 0). - 7 standard views with tuned camera angles (eye/center format):
- Front, back, side (assembled) — show baffle face, back panel, taper profile
- 3/4 front, 3/4 back (assembled) — hero shots showing depth and features
- Exploded front, exploded back — split halves revealing internal structure
render.sh: Shell script generating all 7 renders in parallel (~1.5s each,--previewmode, 1920×1080).- Key insight: Previous camera angles were wrong because they didn't account for the coordinate transform. The front baffle is at Y=0 (negative Y camera position), back at Y=185 (positive Y).
Added a concave flare to the cavity-side port opening for turbulence reduction and tweeter clearance:
- 15mm radius quarter-circle entry flare at the port tube front face (z = split_z). Smooth concave bell transitions from bore diameter (34.9mm) outward to 64.9mm at the mouth.
- Bell-shaped tube solid provides material for the flare: truncated cone from flare mouth + wall thickness down to normal tube diameter over 15mm depth.
- Tweeter clearance: Entry bell widens bore to 18.6mm radius at z=70 (tweeter rear face), providing 1.1mm clearance to the tweeter body (17.5mm from port axis). Without the bell, the straight bore (17.46mm) would collide.
- Acoustic impact: Entry flare consumes 15mm of the 114.3mm bore for the flared section, leaving 99.3mm of straight bore. Tuning shifts ~3.6 Hz higher. The primary benefit is reduced air turbulence and chuffing noise at higher SPL (3.5× area expansion at mouth).
- 6 triangular gusset ribs at the port tube-to-back-wall junction. Each rib is a hull of a vertical strip on the tube surface and a horizontal strip on the back wall, forming a triangular brace. 15mm tall along the tube, 10mm radial extent, 2mm thick. Spreads the tube-to-wall load across more layer lines for better FDM adhesion (the tube axis is parallel to layer lines, making this junction rely entirely on interlayer adhesion without the ribs).
Fixed an unprintable overhang on the front half (printed baffle-down) and ensured the woofer flange sits entirely within the flat baffle face:
- Problem: The original 28mm circular roundover profile had a vertical tangent at z=0, creating 83° overhang in the first ~8mm (41 layers). The woofer flange (125.5mm OD) also overhung the 109mm flat baffle face by 8.25mm per side.
- Roundover profile replaced: Circular quarter-arc replaced with a cubic Hermite spline that starts at exactly 45° overhang and monotonically decreases to 0°. The profile is defined by
roundover_inset_at(z), a compound function with two zones:- Baffle edge chamfer (z=0 to z=2mm): Linear 45° bevel softens the front face edge.
- Hermite cubic (z=2mm to z=39mm):
p(f) = (2-s)f³ + (2s-3)f² - sf + 1wheres = D/I(depth/inset ratio). G1 continuous at the junction (both sides have matching 45° slope).
- Inset decoupled from depth: New
roundover_depthparameter (39mm) is separate frombaffle_roundoverinset (24mm). The ratios = 39/24 = 1.625ensures the slope magnitude is monotonically decreasing. - Baffle widened: 165mm → 180mm (+15mm) so the flat face (132mm) accommodates the woofer flange (125.5mm) with 3.25mm margin per side. After the 2mm edge chamfer, the first-layer face is 128mm (1.25mm margin).
- Roundover inset reduced: 28mm → 24mm. Diffraction effective above ~2281 Hz (vs ~1950 Hz). Still covers most of the woofer's upper range below the ~3-4 kHz crossover. The original MDF Speedster had no roundover at all.
- Inner cavity tracks roundover:
inner_cross_section_at()now also appliesroundover_inset_at(z), maintaining uniform 10mm wall thickness throughout the roundover zone. Previously the inner cavity ignored the roundover, which worked with the old shallow-inset circular profile but would cause negative wall thickness with the deeper extended profile. - Depth reduced: 185mm → 174mm to compensate the volume increase from the wider baffle. Net volume: 5.51L (target 5.5L).
- Split plane shifted: z=60.7mm → z=49.7mm (computed from
depth - wall - port_length). Still clears the roundover zone (39mm) with 10.7mm margin.
Fixed horizontal plane artifacts visible in the slicer at model z≈88mm and z≈114mm in the back half STL:
- Root cause:
inner_cavity()used 50 evenly-spaced hull slices whileouter_shape()used 20+40 slices at different z-positions. Thedifference(outer - inner)boolean created thin shelf artifacts at every mismatched hull boundary. - Fix — aligned slicing with epsilon offset: Rewrote
inner_cavity()to use the same slice count and z-formula asouter_shape()(20 roundover + 40 body slices), but offset by 0.001mm to prevent exactly coplanar faces that cause non-manifold edges in CGAL. - Port tube extension: Extended
port_tube_solid()by 1mm past the inner back wall (z = depth − wall) to eliminate coplanar faces between the port tube end and the inner cavity boundary. - Crossover boss assembly: Removed
intersection(inner_cavity, xover_bosses_all)— bosses are now added directly to the enclosure union, avoiding coplanar face artifacts where boss cylinder facets met cavity hull boundaries. - Validation: Non-manifold edges reduced from 170 to 159; no large horizontal faces detected at problem z-values; both halves export with
NoErrorstatus.
Resolved crossover-to-woofer collision found during test prints:
- Problem: Crossover PCBs mounted on side walls (z=62–154) collided with woofer motor assembly extending 82mm from baffle. Components protruding inward hit the woofer magnet (90mm dia) in the z=62–82 overlap zone.
- Enclosure depth extended: 174mm → 185mm (+11mm). Pushes the inner back wall from z=164 to z=175, allowing the 92mm PCB to start at z=83 (just clearing the woofer at z=82) with back edge flush at z=175.
- Height reduced to maintain volume: Baffle height 300→281mm, back height 240→225mm (proportional 0.8 ratio preserved). Net volume: 5.498L (target 5.5L, −0.002L error).
- Driver fit verified: Woofer flange bottom at y=−107.8 has 8.8mm clearance on flat baffle face (was 18.2mm). Tweeter top at y=80.2 has 36.2mm clearance. Both fit comfortably.
- Crossover repositioned:
xover_z_start62→83mm. PCB z range 83–175mm clears woofer entirely. - PCBs rotated 180° in-plane: Both boards flipped top-to-bottom and left-to-right so components clear binding post hardware.
xover_hole_enc()applies pcb_y flip (pcb_h - hole_y) for both walls, pcb_x flip for right wall mirror. - Corner-aware boss positioning: Added
inner_corner_r_at(z),inner_wall_x_at(z,y), andmin_wall_x_in_boss(z,y)functions. These account for internal corner rounding when computing boss depth and PCB face position, preventing bosses from protruding through curved walls. - Hole [87,5] removed: Falls in back-bottom corner rounding zone where wall_x < face_abs. 3 holes per board: [43,5], [87,121], [5,121].
xover_y_toptuned to 26: Positions the inductor (50mm barrel at PCB coord 63,102) to clear the port tube (y=45, R=20) by 3.0mm circle-to-circle gap. PCB top at y=26 is 1mm above port bottom — 38mm-tall components clear with 2.1mm margin. Bottom at y=−100 clears corner rounding (3.2mm gap at tightest point z=163).- Tolerance updates from test prints: M4 heat-set insert Ø5.5→5.6mm, M3 heat-set insert Ø4.4→4.5mm, M4 through-hole Ø4.3→4.5mm.
- Diffraction impact: Height-based baffle step shifts from ~573Hz to ~612Hz — negligible since it's dominated by the narrower width dimension (~608Hz). Roundover effectiveness unchanged.
- Split plane auto-adjusts: split_z = 185−10−114.3 = 60.7mm (was 49.7mm). Still well past the 39mm roundover zone.
Replaced unprintable concave exit flare with FDM-compatible 45° chamfer:
- Problem: The original quarter-circle exit flare (R=15mm) on the back face had 0° overhang at the mouth, creating 53 failed layers (10.6mm) when printing the back half with back wall on the bed.
- Exit flare replaced: Quarter-circle → 45° linear chamfer confined to the 10mm back wall. Bore widens linearly from 34.9mm at inner wall to 54.9mm at back face. Always exactly 45° overhang — fully printable without supports.
- Entry flare retained: 15mm quarter-circle bell at cavity side. Not a print issue (prints last at top of back half). Provides 1.1mm tweeter clearance and 3.5× area expansion for turbulence reduction.
- Internal geometry unchanged: Exit chamfer only modifies the wall region (z=175 to z=185). No port tube solid changes needed. Entry bell and tube unchanged.
- Port tuning: 114.3mm total bore (99.3mm straight + 15mm entry bell). Exit chamfer adds end correction only. Tuning ~64 Hz — within practical tolerance of Carmody's ~55 Hz target (end correction models vary).
Resolved tweeter-to-port collision discovered when measuring the Fountek NeoCD1.0 rear body:
- Problem: The tweeter rear body (including terminals) requires a 50mm × 50mm square clearance envelope extending 70mm behind the baffle. The port entry bell (centered at y=45, just 10mm from tweeter at y=55) overlapped with this envelope from z=60.7 to z=70 — a 9.3mm zone where the port bell wall material physically collided with the tweeter body.
- Root cause: Previous clearance analysis used only the center-to-center distance (17.5mm from port axis to nearest tweeter edge), which showed 1.1mm clearance to the bore inner wall. But the 50mm square body extends in all directions from the tweeter center, and its flanks and sides pass through the annular port wall at angles away from the center-to-center line.
- Solution: Increased
enclosure_depthfrom 185mm → 197mm (+12mm). This pushesport_start_zfrom 60.7mm to 72.7mm — completely past the tweeter's 70mm depth with 2.7mm clearance. The tweeter and port no longer share any z-range, eliminating the collision entirely. - Height reduced to maintain volume: Baffle height 281→264mm, back height 225→211mm. Net volume: 5.507L (target 5.5L, +0.007L error). Proportional height ratio preserved at ~0.80.
- Driver fit verified: Woofer flange bottom at y=−107.75mm has 24.2mm clearance to baffle edge (half-height = 132mm). Tweeter faceplate top at y=105.25mm has 26.8mm clearance.
- Crossover unaffected: z_start=88mm, PCB extends to z=180mm, inner back wall now at z=187mm — 7mm clearance behind PCBs.
- Split plane auto-adjusts: split_z = 197−10−114.3 = 72.7mm. Still well past the 39mm roundover zone (33.7mm margin).
Comprehensive geometry revision driven by collision detection findings from Session 17. The component envelope validation system identified three issues: PCB corner collision with curved inner wall, marginal tweeter-port Z-clearance, and L3 inductor-port tube collision. Resolved with minimal aesthetic changes.
Added a standalone tolerance test (tolerance-test.scad) to calibrate all fit-critical dimensions before the full enclosure print:
- 7 feature groups covering every tolerance-sensitive interface: M4 heatset (A1), M3 heatset (A2), counterbore (A5), binding post keyhole (A4), horizontal M3 heatset (B1), tongue/groove (C1/C2), interlock (C3).
- Print orientation matching: Face-down bars (A1/A2/A5) have holes opening at z=0 (bed) to test ceiling bridging — identical to the enclosure's baffle-down print orientation. Horizontal bores (B1) test Z-axis tolerance perpendicular to layer lines. Mating pieces (C1–C3) are separate for physical fit testing.
- ±0.3mm in 0.1mm steps: Each feature gets 7 variants around the nominal value. Engraved labels on front/back faces identify each variant; asterisk marks the nominal.
- Absolute
print_*variables: Replaced offset-basedtol_*variables with absolute dimension variables inspeedster-ai.scad. The user reads the best-fit label and enters that value directly — no offset math. The tolerance test usesinclude <speedster-ai.scad>to derive its center values, keeping everything in sync. - Extensibility convention: When adding new fit-critical features, add a corresponding test panel to
tolerance-test.scadwith a newprint_*variable, matching print orientation, and engraved labels.
Problems identified by validation:
- PCB bottom-back corner collision: The 92×126mm crossover PCBs at z=90–182 had their bottom-back corner (z=182, y=-100) extending past the curved inner cavity wall. The large
back_corner_r=42mmcaused the inner wall to curve inward significantly at extreme corners, leaving 21.5mm of PCB embedded in wall material. - Tweeter-port Z-clearance: Only 2.7mm gap between tweeter body (z=70) and port tube start (z=72.7). Risk of assembly interference.
- L3 inductor-port collision: The L3 inductor (Ø50mm cylinder on LP board) extended to y=29, overlapping the port tube bottom at y=25. A 4.9mm³ collision detected by geometric validation.
Solutions applied:
enclosure_depth197→205mm (+8mm): Pushes port start to z=80.7, increasing tweeter-port gap from 2.7mm to 10.7mm. Also shifts the taper ratio at z=182 to be less severe, improving PCB corner clearance.back_corner_r42→17mm: Sharper internal corners eliminate the curved wall intrusion at the PCB bottom-back corner. The inner wall at (z=182, y=-100) now has wall_x > face_x with margin.baffle_roundover24→20mm,roundover_depth39→33mm: Slightly reduced to maintain woofer flange fit margin (4.1mm width, 4.1mm height) on the unchanged 180mm baffle. Diffraction effective above ~2737Hz (was ~2281Hz). Ratio 33/20=1.65 maintains ≤45° FDM overhang.port_y_offset45→52mm: Raises port tube 7mm, moving its bottom from y=25 to y=32. Clears the L3 inductor top (y=29) by 3mm. Zero acoustic impact — port tuning depends on length/diameter, not position.xover_z_start88→90mm: Moves PCB front edge 2mm deeper, past the woofer envelope total depth (89.5mm). Eliminates the Z-overlap zone between woofer body and crossover face position.
Crossover component envelopes refined:
- Replaced placeholder bounding-box crossover envelopes with per-component models based on KiCad .pos file and user-provided dimensions.
- 5 components (C1, C2, C3, L1, L3) converted from rectangular to cylindrical envelopes, reducing envelope volume ~21% for more accurate collision margins.
- 10 components total across LP (4) and HP (6) boards, positioned using calibrated KiCad-to-enclosure coordinate mapping.
Printability assertion added:
- Bambu Lab H2D build envelope check (350×320×325mm): verifies both halves fit within print volume including woofer flange protrusion.
Validation results:
- 20/20 assertions PASS (was 13 + 1 warning)
- 21/21 geometric checks PASS (6 containment + 15 collision)
- Net volume: 5.68L net / 5.35L effective (after ~0.33L crossover displacement) — verified via STL export (5.86L gross cavity).
What stayed the same: Baffle dimensions (180×264mm), back dimensions (118×211mm), wall thickness (10mm), taper power (2.0), driver positions, port dimensions, all driver mounting hardware, tongue-and-groove seal, pillar system, bolt pattern.
| Parameter | Value | Rationale |
|---|---|---|
| Baffle | 180 × 264 mm | Width for woofer flange; original proportions preserved |
| Back | 118 × 211 mm, R17 corners | Sharper corners (was R42) for PCB clearance at bottom-back |
| Depth | 205 mm | Extended from 197 for tweeter-port clearance (+10.7mm gap) |
| Wall | 10 mm PETG | Stiffness parity with 1/2" MDF |
| Taper | Power 2.0 (quadratic) | Volume concentration near baffle |
| Roundover inset | 20 mm | Diffraction control > ~2737 Hz (reduced from 24 for driver fit) |
| Roundover depth | 33 mm | ≤45° FDM overhang (ratio 33/20=1.65) |
| Baffle edge chamfer | 2 mm | 45° bevel softening front face edge |
| Split plane | z = 80.7 mm | Port tube stays in back half (auto-computed from depth) |
| Port | 34.925mm dia × 114.3mm long | Carmody spec: 55 Hz tuning |
| Port Y offset | 52 mm | Raised from 45 to clear L3 inductor by 3mm |
| Port flare (exit) | 45° chamfer in 10mm wall | Printable (≤45° overhang), mouth Ø54.9mm |
| Port flare (entry) | 15 mm quarter-circle | Turbulence reduction |
| Port ribs | 6× gussets, 15×10×2mm | Layer adhesion at back wall junction |
| Pillar dia | 16 mm | 8 pairs at split-plane perimeter |
| Back pillar | 30mm + 15° taper (30mm cone) | Wall blend + bolt coverage |
| Bolt pattern | 8× M4, 12mm inset from edge | Split-plane perimeter |
| Counterbore | 8mm dia, uniform z ≈ 113mm | Cross-section landing analysis |
| Tongue | 3mm wide × 4mm tall | Self-aligning seal joint |
| Groove | 3.6mm wide × 5mm deep | 0.3mm clearance + 1mm seal depth |
| Interlock | 10mm dia × 2mm boss/recess | Boss on back, recess on front |
| Crossover PCB | 92 × 126 mm, 3 holes per board | Holes: [43,5], [87,121], [5,121] |
| Crossover z_start | 90 mm | Clears woofer depth (89.5mm) with 0.5mm margin |
| Crossover y_top | 26 mm | Inductor clears port by 3mm |
| Crossover face | ±49.6 mm from center | Corner-aware envelope positioning |
| M4 heat-set insert | Ø5.6mm × 8mm deep | Woofer, pillars, terminal plate |
| M3 heat-set insert | Ø4.5mm × 6mm deep | Tweeter, crossover bosses |
| M4 through-hole | Ø4.5mm | Bolt clearance holes |
| Volume (net) | 5.68 L | Verified via STL export (5.86L gross cavity) |
| Volume (effective) | ~5.35 L | After ~0.33L crossover component displacement |
speedster-ai/
├── speedster-ai.scad # Complete parametric OpenSCAD model
├── component-envelopes.scad # Component clearance envelope models + assertions
├── tolerance-test.scad # Printer tolerance test print (calibrate before final print)
├── export.sh # STL export pipeline (front + back halves)
├── render.sh # Standard render pipeline (9 PNG views)
├── validate.sh # Validation pipeline (assertions + geometric checks)
├── validate.py # Python geometric collision detection (trimesh)
├── models/ # Exported STL files for printing
├── renders/ # Generated PNG renders
├── references/ # Component reference drawings and datasheets
├── README.md # Project overview, BOM, assembly
├── copilot.md # This file — AI agent context
└── analysis.md # Design verification and analysis
-
OpenSCAD parametric model: All dimensions are parameters at the top of the file. Changing
enclosure_depthadjusts volume; the echo block reports the estimated volume. -
Volume estimation: Simpson's rule approximation. For precise volume, export
inner_cavity()as STL and measure in a slicer. -
Split halves: Uncomment the appropriate export option at the bottom. Front half prints baffle-down; back half prints split-face-down.
-
Bolt counterbore math:
landing_z()andmin_landing_z()functions compute the uniform counterbore depth analytically from the taper formula. No iterative search needed. -
The model uses z=0 at the front baffle face, increasing toward the back. Y is vertical (positive up), X is horizontal (positive right when facing the speaker).
-
Render pipeline:
render.shgenerates 9 standard PNG views via OpenSCAD CLI (--render --backend=Manifold, ~1s each in parallel). Therender_modevariable (0–7) selects assembled/exploded/half/cavity/component-fit/front-half-components/back-half-components views. Afterrotate([90,0,0]), the display coordinate system is X=horizontal, Y=depth(0=baffle, -205=back), Z=height(+up). Model center is at (0, -102.5, 0). Camera uses eye/center 6-parameter format. -
Hull boundary alignment:
inner_cavity()must use the same slice z-positions asouter_shape()(20 roundover + 40 body slices) with a 0.001mm epsilon offset. Misaligned boundaries create visible horizontal plane artifacts in the STL from the boolean difference. Exactly coplanar boundaries create non-manifold edges. The epsilon offset avoids both problems. -
Roundover profile: The
roundover_inset_at(z)function defines the compound front edge profile. It has a 2mm 45° chamfer at the baffle face, then a cubic Hermite spline blending to the full body width atroundover_depth. The inner cavity also applies this inset to maintain uniform wall thickness. When changingbaffle_roundoverorroundover_depth, keep the ratioroundover_depth / baffle_roundover ≥ 1.0to ensure max overhang ≤ 45°. -
Component envelope validation:
component-envelopes.scaddefines simplified 3D clearance envelopes for all internal components (woofer, tweeter, binding posts, crossover PCBs, port tube). Envelopes use max-tolerance dimensions from manufacturer drawings.validate_clearances()runs assert() checks on analytical clearances at every render.validate.pyexports each envelope as STL and checks cavity containment + pair-wise collisions using trimesh/manifold3d. Run./validate.shfor full validation. Thevalidation_exportvariable (1–7) exports individual components for geometric analysis. -
Component envelope coordinate system: Envelopes are positioned in the same coordinate system as the enclosure (z=0 at baffle, y=0 at center). Woofer envelope starts at z=wall (inner baffle face); tweeter body starts at z=wall; binding posts extend from z=enclosure_depth-wall inward; crossover PCBs are on side walls at x=±xover_pcb_face_x_abs().
-
Printer tolerance calibration: All fit-critical dimensions are controlled by
print_*variables at the top ofspeedster-ai.scad(e.g.,print_m4_heatset_dia,print_groove_w). These default to design nominals but should be updated with values from the tolerance test print before the final enclosure export.tolerance-test.scadusesinclude <speedster-ai.scad>withrender_mode = -1to import these values as test centers — they always stay in sync. When adding a new fit-critical feature, add aprint_*variable and a corresponding test panel.
Back edge chamfer: Added a 2mm 45° chamfer to the back face edge, breaking up the sharp 90° corner where the back meets the side walls:
- New parameter:
back_edge_chamfer = 2(mm) — mirrorsbaffle_edge_chamferon the front. - New function:
back_inset_at(z)— linear inset fromz = enclosure_depth - back_edge_chamfertoz = enclosure_depth. Combined withroundover_inset_at(z)incross_section_at(z). - Simplified
cross_section_at(z): Merged the two identical code branches (ri > 0 / ri == 0) into a single path since the inset math handles both cases. - No internal impact: The chamfer zone (z=203–205) is entirely within the back wall (z=195–205). Inner cavity unaffected.
- Printability: Back half prints back-face-down, so the chamfer is at the bed — no overhang concern.
Trapezoidal baffle ribs: Changed the internal baffle stiffening ribs from rectangular to isosceles trapezoid cross-section:
- New parameter:
baffle_rib_base_width = 9(mm) — 3:1 taper ratio from 9mm base to 3mm tip. - Reduced height: 15mm → 10mm. Shorter ribs with wider base maintain comparable stiffness while reducing cavity intrusion.
- Woofer chamfer clearance: Ring rib inner edge (R=55.5mm) clears the woofer bore chamfer expansion (R=55.25mm at z=wall) by 0.25mm. No acoustic impact.
- Implementation: Ring uses tapered cylinders (r1/r2), spokes use tapered cylinders in hull — clean parametric change.
Render pipeline speedup: Switched render.sh from --preview (software OpenGL via xvfb) to --render --backend=Manifold. Total render time dropped from ~4 minutes to ~9 seconds (25× faster). Removed xvfb dependency.
Inner cavity floor taper: Added cavity_floor_taper = 5 parameter with cavity_floor_inset_at(z) function. Adds extra wall inset (10mm at z=wall, tapering to 0 at z=15mm) to eliminate a visible ridge on the outer wall caused by an abrupt 63% material-per-layer drop at z=10mm. Volume impact: ~0.02L (0.3%). First attempt used scale() on cross-sections which created hull pyramids covering driver cutouts — reverted in favor of the inset approach which only narrows the cavity opening.
- Prototype print and fit check (tolerance test print first, then full enclosure)
- Acoustic measurement comparison to original Speedster
- Consider reducing
back_corner_raesthetic impact (17mm is fairly sharp; explore 20-25mm if PCB layout changes) - When adding new fit-critical features, add corresponding test panels to
tolerance-test.scadwithprint_*variables and matching print orientation