diff --git a/hardware/README.md b/hardware/README.md index 168d890..63cb5d0 100644 --- a/hardware/README.md +++ b/hardware/README.md @@ -105,8 +105,8 @@ The ESP8266 and GoPro talk over Wi-Fi — **no data cable between them**. The on | | W × D × H (mm) | |---|---| -| Case body external | ~56.8 × 38.2 × 19.0 | +| Case body external | ~56.8 × 42.0 × 19.2 | | Lid external | ~56.8 × 32.8 × 4.0 | -| Tripod clamp | ~43.0 × 56.9 × 16.0 | +| Tripod clamp | ~43.0 × 54.5 × 16.0 | | Clamp pole fit | Nominal 35mm; smaller poles TBD / may need inserts | | Total weight | TBD after prototype print | diff --git a/hardware/case/case-body-v3.stl b/hardware/case/case-body-v3.stl index af38598..4eaa1d9 100644 Binary files a/hardware/case/case-body-v3.stl and b/hardware/case/case-body-v3.stl differ diff --git a/hardware/case/full-case-preview-v3.stl b/hardware/case/full-case-preview-v3.stl index 70ced51..922b70a 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 586f344..c32fa83 100644 --- a/hardware/case/tripod-case-v3.scad +++ b/hardware/case/tripod-case-v3.scad @@ -30,13 +30,13 @@ m3_clearance = 3.4; // M3 screw clearance nut_flat = 6.4; // M3 nut trap flat-to-flat // Dovetail slide interface -// Male rail is on the case; matching female socket is on the tripod clamp. -// This is easier to inspect and avoids the previous mismatched "two lips + tab" geometry. +// Female receiver is on the case; male tab is on the tripod clamp. +// This makes the separate parts visually/physically obvious: tab slides into slot. rail_z = outer_h * 0.78; rail_depth = 5.0; -rail_neck_w = 12.0; // narrow width at case wall / slot opening -rail_outer_w = 18.0; // wider retained edge -rail_clearance = 0.45; // FDM sliding clearance per side-ish +rail_neck_w = 12.0; // narrow side of the trapezoid profile +rail_outer_w = 18.0; // wide side of the trapezoid profile +rail_clearance = 0.55; // FDM sliding clearance socket_wall = 2.2; // Cable ports @@ -107,15 +107,30 @@ module screw_post(x, y) { } } -module case_male_dovetail_rail() { - // Positive tapered rail on the case back. Cross-section is narrow at the - // wall and wider at the outside, so the clamp socket captures it. - translate([0, outer_d/2 - 0.15, outer_h/2]) - dovetail_prism(rail_z, rail_neck_w, rail_outer_w, rail_depth); +module case_dovetail_socket() { + // Receiver boss on the case back. A dovetail-shaped through-slot is cut + // vertically through it so the clamp's male tab slides down from above. + socket_outer_w = rail_outer_w + socket_wall*2; + socket_depth = rail_depth + socket_wall*2; + boss_y0 = outer_d/2 - 0.15; - // Bottom stop so the clamp socket cannot slide past the case. - translate([0, outer_d/2 + rail_depth/2, outer_h*0.12]) - rounded_cube_centered(rail_outer_w + 3.0, rail_depth + 0.8, 2.4, 0.8); + difference() { + translate([0, boss_y0 + socket_depth/2, outer_h/2]) + rounded_cube_centered(socket_outer_w, socket_depth, rail_z + socket_wall*2, 1.2); + + // Through-cut, centered within the receiver boss, oversized for FDM. + translate([0, boss_y0 + socket_wall, outer_h/2]) + dovetail_prism( + rail_z + socket_wall*3, + rail_neck_w + rail_clearance, + rail_outer_w + rail_clearance, + rail_depth + rail_clearance + ); + } + + // Bottom stop shelf: clamp tab slides down until it rests here. + translate([0, boss_y0 + socket_depth/2, outer_h*0.08]) + rounded_cube_centered(socket_outer_w, socket_depth, 1.8, 0.8); } module case_body() { @@ -123,7 +138,7 @@ module case_body() { case_shell(); for (x = [-1, 1], y = [-1, 1]) screw_post(x*(outer_w/2 - 5), y*(outer_d/2 - 5)); - case_male_dovetail_rail(); + case_dovetail_socket(); } } @@ -174,33 +189,25 @@ module clamp_ears() { } } -module clamp_dovetail_socket() { +module clamp_male_dovetail_tab() { outer_r = pole_dia/2 + clamp_thick; - socket_outer_w = rail_outer_w + socket_wall*2; - socket_depth = rail_depth + socket_wall*2; - // Solid boss on the rear of the clamp, opposite the tightening mouth. - // A matching dovetail void is cut through it along Z so the case rail - // slides in from the top/bottom with practical FDM clearance. - difference() { - translate([0, -outer_r - socket_depth/2 + socket_wall, 0]) - rounded_cube_centered(socket_outer_w, socket_depth, clamp_width, 1.2); - - translate([0, -outer_r - 0.15, 0]) - dovetail_prism( - clamp_width + 1.0, - rail_neck_w + rail_clearance, - rail_outer_w + rail_clearance, - rail_depth + 0.6 - ); - } + // Positive tab on rear of clamp, opposite the tightening mouth. This is + // intentionally the moving/replaceable side: it slides into the case socket. + translate([0, -outer_r - rail_depth + 0.2, 0]) + dovetail_prism( + rail_z - rail_clearance, + rail_neck_w - rail_clearance, + rail_outer_w - rail_clearance, + rail_depth - 0.25 + ); } module tripod_clamp() { union() { clamp_ring_with_mouth(); clamp_ears(); - clamp_dovetail_socket(); + clamp_male_dovetail_tab(); } } diff --git a/hardware/case/tripod-clamp-v3.stl b/hardware/case/tripod-clamp-v3.stl index fa616d2..d4a008c 100644 Binary files a/hardware/case/tripod-clamp-v3.stl and b/hardware/case/tripod-clamp-v3.stl differ