fix: make camera node strap loops vertical
CI/CD / lint-and-typecheck (pull_request) Successful in 7s
CI/CD / test (pull_request) Successful in 7s
CI/CD / build (pull_request) Failing after 4m50s
CI/CD / deploy (pull_request) Has been skipped

This commit is contained in:
2026-05-23 13:58:28 +00:00
parent 9a50d0c801
commit daeea9f2c9
7 changed files with 18676 additions and 17827 deletions
+38 -30
View File
@@ -1,11 +1,11 @@
// RemoteRig camera node case v4
// Upright appliance-style OpenSCAD prototype for a strap-mounted camera node.
// Units: millimeters. Coordinate system: X=width, Y=depth/front-back, Z=height.
// Front/service lid is on the -Y face. Rear strap channels are on the +Y face.
// Front/service lid is on the -Y face. Rear zip-tie pass-through loops are on the +Y face.
//
// v4 visual direction: tall/upright appliance/control box matching the original
// reference image, replacing the rejected wide, low generic electronics box.
// Nominal body: 56 W x 36 D x 82 H mm; with low rear strap bridges ~40 D.
// Nominal body: 56 W x 36 D x 82 H mm; with low rear zip-tie loops ~41 D.
//
// Prototype assumptions to confirm against purchased parts:
// - 1.3 inch OLED module/window opening: 31 x 16 mm visible window, 37 x 22 mm panel recess.
@@ -50,14 +50,19 @@ rocker_h = 19.0;
front_slot_w = 34.0; // two long rounded horizontal slots near lower front
front_slot_h = 3.2;
// Rear reusable cloth zip-tie / Velcro strap channels: low-profile external loops.
strap_bridge_w = case_w - 14;
strap_bridge_h = 6.5; // outer raised rail height
strap_slot_h = 4.2; // strap thickness opening; adjust for cloth ties
strap_gap_y = 2.4; // clearance behind bridge for strap material
strap_bridge_y = strap_gap_y + 2.4;
strap_z1 = 23.0;
strap_z2 = 50.0;
// Rear reusable cloth zip-tie / Velcro pass-through loops.
// Two visibly vertical external belt-loop brackets sit left/right of center.
// The strap path is the real non-solid tunnel between rear wall and raised bridge;
// it stays outside the electronics cavity and is open at the top/bottom for feeding.
rear_loop_x = 13.0;
rear_loop_w = 8.5; // outside bracket width in X
rear_loop_h = 50.0; // outside bracket height in Z
rear_loop_z = case_h/2;
rear_loop_gap_y = 3.8; // usable strap-thickness clearance behind raised bridge
rear_loop_face_t = 1.4; // low-profile outer bridge skin
rear_loop_y = rear_loop_gap_y + rear_loop_face_t;
rear_loop_usable_w = 6.4; // usable strap width through each vertical loop
rear_loop_side_pad = (rear_loop_w - rear_loop_usable_w) / 2;
// USB power connector placeholder cutouts
usb_c_cutout_w = 10.5; // bottom USB-C female inlet visible opening, X width
@@ -107,24 +112,27 @@ module screw_boss(x, z) {
}
}
module strap_bridge(zc) {
// Low external rear belt-loop bridge for cloth ties/Velcro.
// The slot is entirely behind the rear wall so it does not expose the
// electronics cavity; a small overlap keeps the bridge connected to shell.
bridge_overlap_y = 0.8;
translate([0, case_d/2 + strap_bridge_y/2 - bridge_overlap_y, zc - strap_bridge_h/2])
union() {
difference() {
rounded_box([strap_bridge_w, strap_bridge_y, strap_bridge_h], r=1.8);
translate([0, -strap_bridge_y/2 + bridge_overlap_y + 0.05 + (strap_bridge_y + 1.0)/2,
(strap_bridge_h - strap_slot_h)/2])
rounded_box([strap_bridge_w - 9.0, strap_bridge_y + 1.0, strap_slot_h], r=1.1);
}
module rear_zip_tie_loop(xc) {
// Vertical external belt-loop bracket for reusable cloth zip ties/Velcro.
// The central void is a real strap tunnel: rear wall -> air gap -> raised
// outer bridge face. Side pads weld the bridge to the shell while keeping
// the electronics cavity sealed; the tunnel is open at top and bottom.
loop_overlap_y = 0.75;
tunnel_extra_y = 0.35;
tunnel_clear_z = rear_loop_h + 0.8;
// Rear-wall weld pad: mechanically joins the external bridge to the
// shell while keeping the belt slot outside the electronics cavity.
translate([0, -strap_bridge_y/2 + bridge_overlap_y, strap_bridge_h/2])
cube([strap_bridge_w, 0.9, strap_bridge_h], center=true);
translate([xc, case_d/2 + rear_loop_y/2 - loop_overlap_y, rear_loop_z])
difference() {
xz_rounded_prism(rear_loop_w, rear_loop_y, rear_loop_h, r=1.6);
// Real vertical feed-through gap behind the raised bridge. Starts
// just outside the rear wall, so it cannot cut into the enclosure.
translate([0,
-rear_loop_y/2 + loop_overlap_y + rear_loop_gap_y/2 + 0.08,
0])
cube([rear_loop_usable_w,
rear_loop_gap_y + tunnel_extra_y,
tunnel_clear_z], center=true);
}
}
@@ -137,9 +145,9 @@ module camera_node_body_v4() {
// Upright outer shell with softened appliance-like corners.
rounded_box([case_w, case_d, case_h], r=corner_r);
// Rear cloth zip-tie / Velcro strap bridges kept flat/quiet.
strap_bridge(strap_z1);
strap_bridge(strap_z2);
// Rear cloth zip-tie / Velcro pass-through loops kept flat/quiet.
rear_zip_tie_loop(-rear_loop_x);
rear_zip_tie_loop( rear_loop_x);
}
// Full-height front recessed lid pocket, like the green reference panel.