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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+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.