Add parametric 3D-printable enclosure (OpenSCAD)

A printable reimagining of the wooden Kidsbox: rectangular cabinet with two
front speakers, removable top lid (NFC tag rests there, reader mounts beneath),
and swappable speaker mounts.

- kidsbox.scad: master model + part dispatcher (body/lid/speaker_adapter/grill)
- params.scad: all tunable dimensions in one place
- lib.scad: helper modules (rounded shell, bosses, bolt circles)
- Fixed front-panel speaker interface + swappable adapter so any driver fits
  by printing a new adapter (edit spk_* params, re-export)
- Internal mounts: 2x18650 cradle, ESP32-LyraT standoffs, RC522 under lid,
  3 buttons on lid, USB/charge + power-switch side ports, back-wall vents
- Snap-in speaker grills
- Makefile to export STLs and render previews (headless via xvfb)
- Exported STLs and preview renders included
- Link enclosure from main README

Dimensions are sensible defaults from the reference photos and common parts;
README flags the fit-critical values to verify before mass-printing.

https://claude.ai/code/session_01MhAnh68DPNnTjcKqjNYDmk
This commit is contained in:
Claude committed 2026-06-13 10:39:55 +00:00
1 parent 64475dbf5e
commit 75dd63b56f
17 files changed
+170230

No files matched your search

+96
View File
@@ -0,0 +1,96 @@
// ============================================================================
// Kidsbox enclosure — parameters
// All dimensions in millimetres. Edit here, then re-export the STLs.
// See README.md for the export commands.
// ============================================================================
// ---- global print settings ------------------------------------------------
$fn = 64; // facet count for curves (raise for final render)
wall = 3.0; // shell wall thickness
floor_t = 3.0; // bottom thickness
corner_r = 6.0; // outer vertical-edge radius
fit = 0.30; // general clearance for mating parts (per side)
// ---- outer box dimensions (interior is derived) ---------------------------
box_w = 190; // width (X) — roughly one banana, per reference photo
box_h = 110; // height (Z)
box_d = 115; // depth (Y)
// derived interior
inner_w = box_w - 2*wall;
inner_d = box_d - 2*wall;
inner_h = box_h - floor_t; // open-top shell, lid closes it
// ---- lid -------------------------------------------------------------------
lid_t = 2.4; // thin enough for 13.56 MHz NFC to read through PLA
lid_rim_h = 6.0; // depth of the lip that drops into the box
lid_rim_t = 1.6; // thickness of that lip
lid_screw_d = 3.2; // M3 clearance
lid_boss_d = 9.0; // corner screw-boss outer diameter
lid_boss_inset = 9.0; // boss centre inset from interior corner
// ---- speaker panel interface (FIXED) --------------------------------------
// This is the standard "mount for the speaker mount". Every swappable
// speaker adapter bolts to THIS pattern, so the box never changes.
spk_sound_d = 66; // sound opening through the front panel
spk_bolt_d = 80; // bolt circle for the adapter screws
spk_bolt_count = 4; // number of adapter screws
spk_bolt_hole_d = 3.2; // M3 clearance through the panel
spk_boss_d = 8.0; // screw boss diameter on the inside of the panel
spk_boss_h = 5.0; // screw boss height (into the box)
spk_spacing = 94; // centre-to-centre of the two speakers (X)
spk_center_z = 48; // speaker centre height from the box floor (Z)
// ---- swappable speaker ADAPTER (edit for YOUR speaker) ---------------------
// Print one adapter per speaker model. Defaults suit a common 3" driver.
adapter_t = 3.0; // adapter plate thickness
adapter_outer_d = 88; // outer diameter of the adapter disc
spk_frame_d = 66; // speaker outer frame diameter (seat recess)
spk_frame_seat = 1.5; // depth the frame sinks into the adapter
spk_cutout_d = 58; // cone clearance hole through the adapter
spk_screw_count = 4; // the SPEAKER's own mounting holes
spk_screw_bolt_d = 60; // bolt circle of the speaker's mounting holes
spk_screw_d = 3.0; // speaker screw clearance
// ---- speaker grill (snaps into the sound opening) -------------------------
grill_t = 2.4; // grill face thickness
grill_rings = 3; // number of concentric rings
grill_spokes = 6; // number of radial spokes
grill_lip_h = 5.0; // snap lip depth into the sound hole
grill_standoff = 3.0; // gap the grill holds off the cone
// ---- buttons (top lid, row near the front edge) ---------------------------
// Kept off the front face (which stays clean like the reference box) and
// clear of the central NFC reader, which sits under the lid centre.
btn_d = 12.2; // panel hole for a 12 mm momentary switch
btn_count = 3; // vol-, play/pause, vol+
btn_pitch = 26; // spacing between buttons along X
btn_row_y = 18; // distance of the button row from the front wall
// ---- side ports ------------------------------------------------------------
usb_w = 12; // micro-USB / charge access cutout (W)
usb_h = 7; // (H)
usb_center_z = 22; // height of the port from the floor
sw_d = 7; // power slide-switch hole diameter
sw_center_z = 22;
// ---- ESP32-LyraT v4.3 mount (verify against your board) -------------------
lyrat_w = 99; // board long edge
lyrat_d = 57; // board short edge
lyrat_hole_dx = 92; // mounting-hole rectangle, long axis (VERIFY)
lyrat_hole_dy = 50; // mounting-hole rectangle, short axis (VERIFY)
lyrat_standoff_h = 6; // standoff height off the floor
lyrat_standoff_d = 6; // standoff outer diameter
lyrat_screw_d = 2.6; // self-tap for M2.5/M3
// ---- 2x 18650 battery holder cradle ---------------------------------------
batt_holder_w = 78; // typical 2-cell holder footprint (X)
batt_holder_d = 39; // (Y)
batt_holder_h = 21; // (Z)
batt_wall = 2.0; // cradle wall
batt_clip = true; // add retaining clips
// ---- ventilation -----------------------------------------------------------
vent_slot_w = 3;
vent_slot_len = 28;
vent_count = 5;