diff --git a/hardware/case/case-body-v3.stl b/hardware/case/case-body-v3.stl index f1a63d3..e454a58 100644 Binary files a/hardware/case/case-body-v3.stl and b/hardware/case/case-body-v3.stl differ diff --git a/hardware/case/case-lid-v3.stl b/hardware/case/case-lid-v3.stl index 8a25375..7361353 100644 Binary files a/hardware/case/case-lid-v3.stl and b/hardware/case/case-lid-v3.stl differ diff --git a/hardware/case/full-case-preview-v3.stl b/hardware/case/full-case-preview-v3.stl index 35ac9a3..986f473 100644 Binary files a/hardware/case/full-case-preview-v3.stl and b/hardware/case/full-case-preview-v3.stl differ diff --git a/hardware/case/tripod-case-v3.scad b/hardware/case/tripod-case-v3.scad index 87dc787..a7ef2b7 100644 --- a/hardware/case/tripod-case-v3.scad +++ b/hardware/case/tripod-case-v3.scad @@ -1,5 +1,5 @@ // RemoteRig — Dual-ESP Tripod Case v3 -// v3c changes: screw-tightened tripod clamp + horizontal two-screw flat mounting plate interface. +// v3d changes: screw-tightened tripod clamp + horizontal two-screw mount + flush locating-lip lid. // Coordinate system: all case/lid geometry uses bottom-origin Z. $fn = 36; @@ -21,6 +21,12 @@ outer_d = inner_d + wall*2 + tol*2; // 32.8mm outer_h = inner_h + wall*2; // 19mm corner_r = 2.5; +// Lid fit parameters +lid_top_thick = 2.0; +lid_lip_h = 1.6; +lid_clearance = 0.6; // clearance around underside locating lip +lid_lip_wall = 1.2; // thickness of perimeter lip/frame + // Tripod clamp parameters pole_dia = 35; // nominal stand/pole diameter clamp_thick = 4.0; // ring wall thickness @@ -133,18 +139,44 @@ module case_body() { } } +module lid_locating_lip() { + // Thin underside frame that drops into the case opening. This registers the + // lid so it cannot skate/rock on the rim, while staying clear of screw posts. + lip_outer_w = inner_w + tol - lid_clearance; + lip_outer_d = inner_d + tol - lid_clearance; + lip_inner_w = lip_outer_w - lid_lip_wall*2; + lip_inner_d = lip_outer_d - lid_lip_wall*2; + + translate([0, 0, -lid_lip_h]) + difference() { + rounded_cube0(lip_outer_w, lip_outer_d, lid_lip_h, 1.0); + translate([0, 0, -0.1]) + rounded_cube0(lip_inner_w, lip_inner_d, lid_lip_h + 0.2, 0.7); + + // Corner reliefs so the lip doesn't interfere with screw posts. + for (x = [-1, 1], y = [-1, 1]) { + translate([x*(outer_w/2 - 5), y*(outer_d/2 - 5), lid_lip_h/2]) + cylinder(d=7.0, h=lid_lip_h + 0.4, center=true, $fn=24); + } + } +} + module case_lid() { difference() { - rounded_cube0(outer_w, outer_d, wall*2, 1.8); + union() { + // Thinner top cover; underside lip handles registration. + rounded_cube0(outer_w, outer_d, lid_top_thick, 0.8); + lid_locating_lip(); + } for (x = [-1, 1], y = [-1, 1]) { - translate([x*(outer_w/2 - 5), y*(outer_d/2 - 5), -0.5]) - cylinder(d=2.4, h=wall*2 + 1, center=false, $fn=20); + translate([x*(outer_w/2 - 5), y*(outer_d/2 - 5), -lid_lip_h - 0.5]) + cylinder(d=2.4, h=lid_top_thick + lid_lip_h + 1, center=false, $fn=20); } for (x = [-outer_w/4, 0, outer_w/4]) { - translate([x, 0, wall*2/2]) - cube([8, outer_d*0.6, wall*3], center=true); + translate([x, 0, lid_top_thick/2]) + cube([8, outer_d*0.6, lid_top_thick*3], center=true); } } } @@ -213,7 +245,7 @@ module tripod_clip() { module full_case() { case_body(); - translate([0, 0, outer_h + 2]) case_lid(); + translate([0, 0, outer_h]) case_lid(); translate([0, outer_d/2 + pole_dia/2 + clamp_thick + 8, outer_h/2]) rotate([90, 0, 0]) tripod_clamp(); }