diff --git a/chassis/gopro_mount.scad b/chassis/gopro_mount.scad new file mode 100644 index 0000000..2015724 --- /dev/null +++ b/chassis/gopro_mount.scad @@ -0,0 +1,256 @@ +// ============================================================ +// gopro_mount.scad — GoPro 3-Prong T-Slot Sensor Rail Mount +// Issue: #195 Agent: sl-mechanical Date: 2026-03-02 +// ============================================================ +// +// Universal GoPro camera mount for sensor_rail.scad (T-slot 2020). +// +// Top interface: Standard GoPro 3-prong (HERO 5+) +// Prongs slide into standard GoPro accessories. +// No additional clips or fasteners needed. +// +// Bottom clamp: T-slot 20×20 mm rail system (OpenBuilds compatible). +// M3 thumbscrew retention + M5 index holes for 15° detents. +// +// Tilt mechanism: Rotating hinge bracket allows camera tilt 0°–90° from +// horizontal, locked at 15° increments via index holes. +// Rotation axis is perpendicular to rail (about Y-axis). +// +// Assembly: +// 1. Print gopro_mount_base (single part, flat-side-down, no supports) +// 2. Slide built-in T-nut into rail T-groove +// 3. Clamp with M3 thumbscrew from outside rail face +// 4. Rotate camera to desired tilt angle (0°, 15°, 30°, ... 90°) +// 5. Insert M5 alignment pin to lock tilt +// +// RENDER options: +// "mount" assembled mount view (default) +// "base_stl" base clamp for slicing (print flat) +// "camera_bracket" rotatable camera bracket for slicing +// ============================================================ + +RENDER = "mount"; + +// ── GoPro 3-prong interface (top) ────────────────────────── +// Standard GoPro HERO 5+ 3-prong attachment point. +// Overall footprint ~43×25 mm, 3 prongs slide into camera mounting slot. + +GOPRO_WIDTH = 43.0; // front-to-back along camera face +GOPRO_DEPTH = 25.0; // left-to-right width +GOPRO_PRONG_H = 5.0; // height of prongs above base +GOPRO_PRONG_D = 4.0; // diameter/thickness of each prong +GOPRO_PRONG_SP = 14.0; // spacing between outer prongs (centre-to-centre) + +// Centre prong is at Y=0; outer prongs at Y±GOPRO_PRONG_SP/2 +// Prongs extend upward (+Z direction) + +// ── T-slot clamp (bottom) ────────────────────────────────── +// Matches sensor_rail.scad T-slot 2020 dimensions. +RAIL_W = 20.0; // rail outer width/height +SLOT_INNER_W = 10.2; // T-groove inner width +SLOT_INNER_H = 5.8; // T-groove inner height (depth) +SLOT_NECK_H = 3.2; // distance from outer face to T-groove + +TNUT_W = 9.8; // printable T-nut width (SLOT_INNER_W - 0.4) +TNUT_H = 5.5; // printable T-nut height (SLOT_INNER_H - 0.3) +TNUT_L = 12.0; // T-nut body length +TNUT_BOLT_D = 3.3; // M3 clearance bore through T-nut + +THUMB_D = 16.0; // thumbwheel OD (visual only) +THUMB_H = 8.0; // thumbwheel height + +// Index hole pitch for tilt detents +INDEX_PITCH = 25.0; // 25 mm spacing on rail +TILT_ANGLE_STEP = 15.0; // 15° tilt detents (0°, 15°, 30°, ... 90°) +M5_INDEX_D = 5.3; // M5 clearance hole diameter + +// ── Rotation/tilt mechanism ─────────────────────────────── +// Camera bracket rotates about Y-axis relative to base. +// Rotation axis is at the rail clamp interface (Z=0, Y=0). +// Tilt range: 0° to 90°. + +MAX_TILT_DEG = 90.0; // maximum tilt angle + +// Hinge pin: M5 bolt passes through base and camera bracket +HINGE_PIN_D = 5.3; // M5 bolt clearance +HINGE_PIN_L = 25.0; // pin length (accommodates rail width + brackets) + +// ── General ──────────────────────────────────────────────── +$fn = 64; +e = 0.01; + +// ───────────────────────────────────────────────────────────── +// gopro_mount_base() +// T-slot clamp bracket with integrated T-nut. +// Mounted at bottom, rail clamp at Z=0 face. +// Hinge pin axis at Y=0, rotates camera bracket ±X. +// +// Print: flat-side-down (rail face down), no supports needed. +// ───────────────────────────────────────────────────────────── +module gopro_mount_base() { + clamp_h = RAIL_W + 8.0; // total clamp height + clamp_w = TNUT_L + 8.0; // clamp width (along rail) + clamp_d = 18.0; // clamp depth (front-to-back) + + difference() { + union() { + // Main clamp body + translate([-clamp_w/2, -clamp_d/2, 0]) + cube([clamp_w, clamp_d, clamp_h]); + + // T-nut integration: slot to hold T-nut at rail interface + // T-nut sits in T-groove when rail is inserted from above + translate([-TNUT_L/2, -TNUT_W/2, SLOT_NECK_H]) + cube([TNUT_L, TNUT_W, TNUT_H]); + + // Hinge boss (supports rotation axis pin) + translate([-HINGE_PIN_L/2 - 2, -8, clamp_h - 4]) + cube([HINGE_PIN_L + 4, 4, 4]); + } + + // Rail bore (25.4 mm) — matches stem adapter pattern + // When rail is vertical, this bore slides onto rail extrusion + translate([0, 0, -e]) + cylinder(d=RAIL_W + 0.4, h=clamp_h + 2*e); + + // T-nut through-bolt (M3 thumbscrew hole) + // Bolt comes from outside rail face, through T-nut, clamping it + translate([0, 0, SLOT_NECK_H + TNUT_H/2]) + rotate([90, 0, 0]) + cylinder(d=TNUT_BOLT_D, h=clamp_d + 2*e); + + // Hinge pin (M5) passes through base to camera bracket + translate([-HINGE_PIN_L/2, 0, clamp_h - 2]) + rotate([0, 90, 0]) + cylinder(d=HINGE_PIN_D, h=HINGE_PIN_L + 2*e); + + // Index hole pockets for tilt angle lock (M5) + // One index hole on each side to lock camera tilt + for (angle = [0 : TILT_ANGLE_STEP : MAX_TILT_DEG]) { + // Holes are radially spaced around the hinge axis + y_offset = (HINGE_PIN_L/2 - 2) * sin(angle); + z_offset = clamp_h - 2 - (HINGE_PIN_L/2 - 2) * (1 - cos(angle)); + translate([0, y_offset, z_offset]) + cylinder(d=M5_INDEX_D, h=4, center=false); + } + + // Vent slots (optional, aesthetic + weight reduction) + for (dz = [4, 8, 12]) + translate([-clamp_w/2 + 2, -clamp_d/2 - e, dz]) + cube([clamp_w - 4, 2, 1.5]); + } +} + +// ───────────────────────────────────────────────────────────── +// gopro_camera_bracket() +// Rotatable bracket that holds GoPro camera via 3-prong mount. +// Rotates about Y-axis (hinge pin), tilt 0°–90°. +// +// Hinge pin (M5 bolt) enters from base and locks bracket rotation. +// Index hole on bracket aligns with base index holes at each 15° step. +// +// Print: flat-side-down (prong face down), no supports. +// ───────────────────────────────────────────────────────────── +module gopro_camera_bracket() { + bracket_h = GOPRO_WIDTH + 8.0; // height when vertical + bracket_w = GOPRO_DEPTH + 6.0; // width (left-right) + bracket_t = 4.0; // bracket thickness + + difference() { + union() { + // Main bracket body + translate([-bracket_w/2, -bracket_t/2, 0]) + cube([bracket_w, bracket_t, bracket_h]); + + // Hinge pivot boss + translate([-HINGE_PIN_L/2 - 2, 0, bracket_h - 4]) + cube([HINGE_PIN_L + 4, bracket_t, 4]); + + // GoPro prong mounting boss + translate([-GOPRO_DEPTH/2, 0, bracket_h - GOPRO_WIDTH/2]) + cube([GOPRO_DEPTH, bracket_t + 2, GOPRO_WIDTH]); + } + + // Hinge pin bore (M5) + translate([-HINGE_PIN_L/2, 0, bracket_h - 2]) + rotate([0, 90, 0]) + cylinder(d=HINGE_PIN_D + 0.2, h=HINGE_PIN_L + 2*e); + + // Index hole (M5) for angle lock + // Bracket has one index hole that aligns with base holes at tilt angles + translate([GOPRO_DEPTH/2 + 1, 0, bracket_h - 4]) + cylinder(d=M5_INDEX_D, h=bracket_t + 2*e); + + // GoPro prong socket (3 mounting prongs) + // Centre prong at Y=0, outer prongs at Y±GOPRO_PRONG_SP/2 + for (dy = [0, GOPRO_PRONG_SP/2, -GOPRO_PRONG_SP/2]) { + translate([0, bracket_t + e, bracket_h - GOPRO_WIDTH/2 + 5 - dy]) + rotate([90, 0, 0]) + cylinder(d=GOPRO_PRONG_D + 0.4, h=4); + } + } +} + +// ───────────────────────────────────────────────────────────── +// gopro_prong_interface() +// Visual representation of the 3 prongs that camera mounts to. +// Not printed; shown during assembly view. +// ───────────────────────────────────────────────────────────── +module gopro_prong_interface() { + bracket_h = GOPRO_WIDTH + 8.0; + bracket_w = GOPRO_DEPTH + 6.0; + + // 3 cylindrical prongs + for (dy = [0, GOPRO_PRONG_SP/2, -GOPRO_PRONG_SP/2]) { + translate([0, bracket_w/2 + 0.5, bracket_h - GOPRO_WIDTH/2 + 5 - dy]) + rotate([90, 0, 0]) + cylinder(d=GOPRO_PRONG_D, h=GOPRO_PRONG_H, $fn=32); + } +} + +// ───────────────────────────────────────────────────────────── +// Assembly view: base + rotatable camera bracket +// ───────────────────────────────────────────────────────────── +module gopro_mount_assembly() { + // Base clamp (fixed) + color("SteelBlue", 0.9) + gopro_mount_base(); + + // Camera bracket (rotatable, at 45° tilt for visualization) + color("CornflowerBlue", 0.85) + rotate([0, 45, 0]) + translate([0, 0, RAIL_W + 8]) + gopro_camera_bracket(); + + // Visual GoPro prongs + color("LightSteelBlue", 0.7) + rotate([0, 45, 0]) + translate([0, 0, RAIL_W + 8]) + gopro_prong_interface(); + + // Phantom M5 hinge pin (visual reference) + color("Silver", 0.5) + translate([-HINGE_PIN_L/2, 0, RAIL_W + 8 - 2]) + rotate([0, 90, 0]) + cylinder(d=5, h=HINGE_PIN_L); +} + +// ───────────────────────────────────────────────────────────── +// Render selector +// ───────────────────────────────────────────────────────────── +if (RENDER == "mount") { + gopro_mount_assembly(); + +} else if (RENDER == "base_stl") { + // Flat print orientation: rail-facing side down + rotate([180, 0, 0]) + translate([0, 0, -RAIL_W - 8]) + gopro_mount_base(); + +} else if (RENDER == "camera_bracket") { + // Flat print orientation: prong-facing side down + rotate([0, 0, 0]) + translate([0, 0, GOPRO_WIDTH + 14]) + rotate([180, 0, 0]) + gopro_camera_bracket(); +} diff --git a/chassis/gopro_mount_BOM.md b/chassis/gopro_mount_BOM.md new file mode 100644 index 0000000..c1a1367 --- /dev/null +++ b/chassis/gopro_mount_BOM.md @@ -0,0 +1,252 @@ +# GoPro 3-Prong T-Slot Sensor Rail Mount — BOM + Assembly +**Rev A — 2026-03-02 — sl-mechanical** + +--- + +## System Overview + +Universal GoPro HERO 5+ camera mount for sensor_rail.scad (T-slot 20×20 mm). + +| Feature | Spec | +|---------|------| +| Camera interface | Standard GoPro 3-prong (HERO 5+) | +| Rail system | T-slot 2020 OpenBuilds / MISUMI compatible | +| Tilt range | 0° – 90° from horizontal | +| Tilt detents | 15° increments (0°, 15°, 30°, 45°, 60°, 75°, 90°) | +| Retention | M3 thumbscrew clamp (T-nut to rail) + M5 index pin (angle lock) | +| Weight | ~85 g (printed) + ~45 g (fasteners) | + +--- + +## Design Features + +- **Top mount:** Standard GoPro 3-prong interface — no custom adapters, works with any GoPro HERO 5+ compatible accessory. +- **Bottom clamp:** Integrated T-nut slides into rail T-groove; single M3 thumbscrew locks clamp to rail (no tools required). +- **Tilt mechanism:** Rotating bracket + M5 hinge pin; camera tilts 0°–90° and locks at 15° steps via M5 index holes. +- **Printability:** Both parts print flat-face-down, no support material required. +- **Compatibility:** Works with all SaltyLab / SaltyRover sensor_rail.scad mounts; positions camera anywhere along rail. + +--- + +## Part A — Printed Components + +### 1. Base Clamp (gopro_mount.scad, RENDER="base_stl") + +**Purpose:** Holds T-nut in rail T-groove; provides rotation axis for camera bracket. + +| Parameter | Value | Notes | +|-----------|-------|-------| +| Qty | 1 | Single part per mount | +| Material | PETG | 5 perimeters, 40% infill (gyroid) | +| Print size | ~45 × 35 × 28 mm | Flat-face-down (rail-side down) | +| Orientation | Rail bore facing DOWN | Supports natural bed adhesion | +| Support | None | Design allows direct print | +| Wall thickness | 4–5 mm minimum | Ensure M3 threads cut cleanly | + +**Key features:** +- Integrated T-nut pocket (friction-fit to rail T-groove) +- M3 thumbscrew bore (perpendicular to T-nut, from outside rail face) +- M5 hinge-pin bore (passes through to camera bracket) +- 7 index holes (one for each tilt angle: 0°, 15°, 30°, 45°, 60°, 75°, 90°) +- Vent slots for weight reduction + +--- + +### 2. Camera Bracket (gopro_mount.scad, RENDER="camera_bracket") + +**Purpose:** Holds GoPro camera via 3-prong mount; rotates about M5 hinge pin. + +| Parameter | Value | Notes | +|-----------|-------|-------| +| Qty | 1 | Single part per mount | +| Material | PETG | 4 perimeters, 30% infill | +| Print size | ~35 × 25 × 51 mm | Flat-face-down (prong-side down) | +| Orientation | GoPro prongs facing DOWN | Minimal post-processing | +| Support | None | Design supports printing without supports | +| Wall thickness | 3–4 mm | Adequate for M5 through-bore | + +**Key features:** +- 3 cylindrical prong sockets (GoPro standard spacing) +- M5 hinge-pin bore (receives bolt from base) +- 1 index hole (aligns with base index holes at tilt angle) +- Lightweight design + +--- + +## Part B — Fasteners & Hardware + +All fasteners are stainless steel or zinc-plated for corrosion resistance. + +| # | Spec | Qty | Use | Notes | +|---|------|-----|-----|-------| +| 1 | M3 × 12 SHCS | 1 | Thumbscrew — clamps T-nut to rail | or M3 cap screw with printed knob | +| 2 | M3 washer | 1 | Under thumbscrew head | standard flat washer | +| 3 | M5 × 25 SHCS | 1 | Hinge pin — camera bracket rotation axis | or M5 cap screw + lock washer | +| 4 | M5 washer | 2 | Hinge pin lock washers (each end) | prevents backlash | +| 5 | M5 lock nut | 1 | Hinge pin lock nut | nylon-insert preferred | +| 6 | M5 × 8 roll pin | 7 | Index pins — lock tilt angle | one for each 15° detent (0°–90°) | + +--- + +## Installation & Assembly + +### Step 1: Prepare T-slot Rail + +1. Verify rail is clean (no burrs, chips). +2. Slide base clamp assembly onto rail from above (rail face toward clamp bore). +3. Align T-nut pocket with T-slot T-groove (groove faces inward). + +### Step 2: Clamp Base to Rail + +1. Insert M3 thumbscrew through rail outer face, through the T-nut pocket. +2. Tighten **finger-tight** first (do not overtighten — rail will deform). +3. Verify clamp is centered on rail (equal gap on both sides). +4. Tighten to **hand-tight** (≈2 N·m for M3). + +### Step 3: Assemble Hinge & Camera Bracket + +1. Slide M5 × 25 bolt through base clamp hinge bore (horizontal, perpendicular to rail). +2. Mount camera bracket on bolt (prong-side facing camera direction). +3. Add M5 washers at both bolt ends. +4. Tighten M5 lock nut to **hand-tight** (≈5 N·m). + - Bolt should rotate smoothly but without play. + - If bracket binds, loosen slightly; if too loose, add second lock washer. + +### Step 4: Mount GoPro Camera + +1. Rotate camera bracket to desired tilt angle (0°, 15°, 30°, etc.). +2. Align index hole on bracket with corresponding hole on base clamp. +3. Insert M5 × 8 roll pin into aligned holes (pushes in snugly, no tools needed). +4. Verify pin locks camera position (should not rotate when pin is seated). +5. Slide GoPro onto 3 prongs until camera contacts mount. + +### Step 5: Cable Management + +- Route camera USB/HDMI cable down rail (behind robot). +- Use cable tie on thumbscrew pocket if additional restraint needed. + +--- + +## Tilt Angle Detents + +The 15° step gives 7 fixed positions within 0°–90° range: + +| Tilt Index | Angle | Use case | +|------------|-------|----------| +| 1 | 0° | Horizontal (level with horizon) | +| 2 | 15° | Slight upward tilt | +| 3 | 30° | Moderate upward tilt | +| 4 | 45° | Balanced forward-up tilt | +| 5 | 60° | Steep upward tilt | +| 6 | 75° | Nearly vertical forward | +| 7 | 90° | Straight vertical (zenith) | + +To change tilt: +1. Push on camera bracket to rotate (index pin will pop out if at end of rotation). +2. Align new index hole. +3. Re-insert index pin. + +--- + +## Fastener Torque Spec + +| Fastener | Size | Torque | Note | +|----------|------|--------|------| +| M3 thumbscrew | M3 × 12 | 2 N·m | Hand-tight; over-tightening deforms rail | +| M5 hinge pin | M5 × 25 | 5 N·m | Smooth rotation, no play | +| M5 lock nut | M5 | 2.5 N·m | After initial tightening, verify free rotation | + +--- + +## Post-Print Finishing + +### Base Clamp +- **Support removal:** No supports needed. +- **Bore prep:** If M3 bore is rough, ream with M3 hand reamer (¼ turn only). +- **T-nut pocket:** Smooth with fine sandpaper if needed (must slide smoothly into groove). + +### Camera Bracket +- **Support removal:** No supports needed. +- **Prong sockets:** Clean with compressed air; verify no strands block GoPro prongs. +- **Index hole:** Verify M5 bore is clear (small drill bit can clear if needed). + +--- + +## Mass Estimate + +| Component | Material | Est. Mass | +|-----------|----------|-----------| +| Base clamp | PETG | ~35 g | +| Camera bracket | PETG | ~28 g | +| M3 thumbscrew | Stainless | ~2 g | +| M5 hinge bolt + nut | Stainless | ~6 g | +| M5 index pins (×7) | Steel | ~4 g | +| **Total (without camera)** | | **~75 g** | +| **Total (with GoPro HERO)** | | **~250 g** | + +--- + +## Mounting Position Recommendations + +### On sensor_rail.scad vertical rail + +| Position | Z height | Use | +|----------|----------|-----| +| Below sensor head | 700–800 mm | Forward-facing wide-angle view | +| Mid-rail | 400–500 mm | Side-looking perspective | +| Above base plate | 100–200 mm | Ground-level or low-angle view | + +Index holes on rail face every 25 mm; position bracket at any height (friction-fit with T-nut + thumbscrew). + +### On payload_bay_rail.scad (horizontal rail) + +Mount horizontally by: +1. Rotate entire assembly 90° (rail runs front-to-back). +2. Tilt camera bracket 0°–90° to point downward or forward. +3. Good for payload bay documentation (downward view) or forward obstacle detection. + +--- + +## Storage & Maintenance + +- **Store bracket vertical** (prongs up) to avoid stress on sockets. +- **Clean prongs** after each field session (dust prevents secure seating). +- **Verify index pin seating** before each deployment (pin can loosen if rattled). +- **Check thumbscrew** monthly (re-tighten if rail has shifted). + +--- + +## Design Notes for Future Revisions + +- **Optional:** Add detent detents (spring-loaded ball bearing pockets) at index holes for positive clicks. +- **Optional:** Add strap attachment points on base clamp for secondary safety line. +- **Alternative bracket:** Straight vertical bracket (0° fixed) for weight-optimized variant. +- **Camera variants:** Compatibility with GoPro Session (action cam) and DJI Osmo Action (different prong patterns) would require bracket redesign. + +--- + +## Files + +| File | Purpose | +|------|---------| +| `gopro_mount.scad` | OpenSCAD parametric model (3 RENDER variants) | +| `gopro_mount_BOM.md` | This document | +| `sensor_rail.scad` | Parent T-slot rail system (dependency) | +| `sensor_rail_brackets.scad` | Additional rail bracket options | + +--- + +## Assembly Checklist + +- [ ] Print base clamp (PETG, 45 × 35 × 28 mm, flat-side-down) +- [ ] Print camera bracket (PETG, 35 × 25 × 51 mm, flat-side-down) +- [ ] Inspect prong sockets on bracket (no strands, smooth) +- [ ] Ream or smooth M3 thumbscrew bore in base clamp +- [ ] Test T-nut pocket (slides in/out of rail groove smoothly) +- [ ] Assemble: M3 thumbscrew + washer +- [ ] Assemble: M5 × 25 bolt + 2 washers + lock nut +- [ ] Mount bracket on hinge pin (hand-tight fit) +- [ ] Insert one M5 × 8 index pin at 0° (test fit) +- [ ] Mount GoPro camera (prongs snap in) +- [ ] Final check: camera level in 0° position +- [ ] Stow extra index pins in camera bag