generated from CubeCraft-Creations/Tracehound
CUB-229: Design camera auto-discovery and registration flow #14
+115
-15
@@ -2,30 +2,126 @@
|
|||||||
|
|
||||||
> Living queue for 3D-printed / physical hardware design work.
|
> Living queue for 3D-printed / physical hardware design work.
|
||||||
|
|
||||||
## Active / Ready for prototype print
|
## Active / Ready for CAD prototype
|
||||||
|
|
||||||
|
### Camera node case v4 — upright status panel + strap mount
|
||||||
|
|
||||||
|
**Status:** Parametric OpenSCAD source created; body/lid/preview STLs exported and validated watertight. Ready for CAD review, exact part measurement, and first prototype print.
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- `hardware/case/camera-node-case-v4.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-body.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-lid.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-preview.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-front-review.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-body.stl`
|
||||||
|
- `hardware/case/camera-node-case-v4-lid.stl`
|
||||||
|
- `hardware/case/camera-node-case-v4-preview.stl`
|
||||||
|
- `hardware/case/camera-node-case-v4-front-review.stl`
|
||||||
|
|
||||||
|
**Design direction:**
|
||||||
|
|
||||||
|
- Stand-mounted upright camera node enclosure; the case still does **not** mount to the GoPro.
|
||||||
|
- Visual direction now matches the original green appliance-style reference: tall vertical body, large inset front panel, centered OLED near the upper third, blank middle area, two long rounded lower slots, bottom USB-C female power input, right-side USB-A female passthrough power port for the GoPro, and left-side IPEX/U.FL antenna pigtail/connector exit opposite the USB-A.
|
||||||
|
- This replaces the rejected wide/low generic electronics-box layout from the first v4 attempt.
|
||||||
|
- Primary mounting is reusable cloth zip ties / Velcro straps through two low-profile vertical rear brackets with long lateral side-feed openings, not a clamp/dovetail.
|
||||||
|
- Front has a recessed/flush full-height service lid similar to a field-service status panel.
|
||||||
|
- Lid includes cutouts for:
|
||||||
|
- 1.3-inch OLED/status screen.
|
||||||
|
- separate 3 mm power LED.
|
||||||
|
- single 3 mm RGB status LED replacing red/green status LEDs.
|
||||||
|
- small rocker on/off switch.
|
||||||
|
- two long rounded lower front slots styled after the reference.
|
||||||
|
- Front-panel screen, LED, rocker, and lower-slot openings are actual through-cuts through the full lid and locating lip so the back side of the printed lid is not skinned over.
|
||||||
|
- Body includes screw bosses, recessed lid pocket, lid locating geometry, a bottom USB-C female power inlet cutout, a right-side USB-A female passthrough power cutout, a left-side 5.0 mm prototype IPEX/U.FL antenna pigtail/connector through-hole with shallow exterior recess, and two vertical external rear zip-tie/Velcro brackets to resist rotation on a stand. The zip ties feed laterally through long side windows behind the raised bridge faces; the old top-to-bottom feed-through tunnel is intentionally closed by top/bottom anchor pads.
|
||||||
|
- Internal envelope is sized for known module dimensions plus service clearance:
|
||||||
|
- ESP32-C3 Super Mini: 22.5 × 18 mm.
|
||||||
|
- ESP-01S: ~24.7 × 14.3 × 12 mm.
|
||||||
|
|
||||||
|
**Prototype display content target:**
|
||||||
|
|
||||||
|
```text
|
||||||
|
CAM 03 REC ●
|
||||||
|
BAT 87% LINK OK
|
||||||
|
00:12:34
|
||||||
|
```
|
||||||
|
|
||||||
|
**Prototype dimensions to validate before production:**
|
||||||
|
|
||||||
|
- Exact 1.3-inch OLED module dimensions:
|
||||||
|
- PCB width/height/thickness.
|
||||||
|
- active display/window width/height.
|
||||||
|
- connector side and ribbon/header clearance.
|
||||||
|
- mounting-hole positions, if using module screws or adhesive tape.
|
||||||
|
- Rocker switch:
|
||||||
|
- snap-in cutout width/height.
|
||||||
|
- bezel/flange size.
|
||||||
|
- required panel thickness range.
|
||||||
|
- rear depth and terminal clearance.
|
||||||
|
- LEDs:
|
||||||
|
- preferred holder/bezel style, if any.
|
||||||
|
- final hole diameter for 3 mm PWR LED and 3 mm RGB STAT LED.
|
||||||
|
- current-limiting resistor placement.
|
||||||
|
- Wiring/service:
|
||||||
|
- USB cable diameter and bend radius.
|
||||||
|
- bottom USB-C female panel/breakout connector flange, body depth, and mounting requirements.
|
||||||
|
- right-side USB-A female panel/breakout connector flange, body depth, and mounting requirements for GoPro 5 V passthrough.
|
||||||
|
- left-side IPEX/U.FL antenna pigtail/bulkhead exact outside diameter, retention/flange needs, bend radius, strain relief, and whether the current 5.0 mm prototype through-hole plus 8.5 mm shallow exterior recess should change before production.
|
||||||
|
- actual regulator/power distribution board footprint if used.
|
||||||
|
- Fasteners:
|
||||||
|
- M2 vs M2.5 vs self-tapping screws for lid.
|
||||||
|
- pilot diameter, screw length, and head/counterbore diameter.
|
||||||
|
- Mounting straps:
|
||||||
|
- cloth zip-tie / Velcro width and thickness.
|
||||||
|
- prototype rear side-feed opening: ~40 mm long vertical side window × ~3.8 mm strap-thickness clearance behind each raised bridge, with each visible vertical bracket ~8.5 mm wide × 50 mm tall.
|
||||||
|
- whether two strap paths are enough to prevent case rotation on the expected stand diameter.
|
||||||
|
- whether rear vertical bracket/window edges need larger radii or TPU/silicone sleeve protection.
|
||||||
|
- Printability:
|
||||||
|
- rear vertical zip-tie bracket top/bottom anchor-pad and bridge strength, and whether the lateral side-feed openings print cleanly without supports.
|
||||||
|
- body/lid fit after PETG shrinkage.
|
||||||
|
- lid lip clearance and screw boss robustness.
|
||||||
|
- USB-C/USB-A and IPEX antenna exit cutout edge quality, wall strength, and connector retention/strain relief.
|
||||||
|
|
||||||
|
**Suggested OpenSCAD validation/export commands:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openscad -o /tmp/camera-node-case-v4-body.stl hardware/case/camera-node-case-v4-body.scad
|
||||||
|
openscad -o /tmp/camera-node-case-v4-lid.stl hardware/case/camera-node-case-v4-lid.scad
|
||||||
|
openscad -o /tmp/camera-node-case-v4-preview.stl hardware/case/camera-node-case-v4-preview.scad
|
||||||
|
openscad -o /tmp/camera-node-case-v4-front-review.stl hardware/case/camera-node-case-v4-front-review.scad
|
||||||
|
```
|
||||||
|
|
||||||
|
Latest validation: OpenSCAD reports `Simple: yes`; trimesh confirms body, lid, preview, and front-review STLs are watertight. Body and lid each export as a single connected printable component; preview includes separate non-print board/connector guide volumes by design. A rear-bracket sanity check confirms both vertical brackets have clear non-solid lateral X-direction side-feed volumes behind the raised bridge faces, while the rear wall, bridge faces, and top/bottom anchor pads remain solid. The left-side IPEX/U.FL antenna hole is a through-wall cut to the interior cavity, not a blind exterior pocket.
|
||||||
|
|
||||||
|
Or with the main parametric selector:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openscad -D 'part="body"' -o /tmp/camera-node-case-v4-body.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="lid"' -o /tmp/camera-node-case-v4-lid.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="preview"' -o /tmp/camera-node-case-v4-preview.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="front_review"' -o /tmp/camera-node-case-v4-front-review.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prior prototype reference
|
||||||
|
|
||||||
### Tripod electronics case v3
|
### Tripod electronics case v3
|
||||||
|
|
||||||
**Status:** STL generated and validated watertight.
|
**Status:** Historical design reference. In this checkout, previous v3 SCAD/STL files are not present; v4 starts a new `hardware/case/` CAD source set.
|
||||||
|
|
||||||
**Files:**
|
**Previous design notes:**
|
||||||
- `hardware/case/tripod-case-v3.scad`
|
|
||||||
- `hardware/case/case-body-v3.stl`
|
|
||||||
- `hardware/case/case-lid-v3.stl`
|
|
||||||
- `hardware/case/tripod-clamp-v3.stl`
|
|
||||||
- `hardware/case/full-case-preview-v3.stl`
|
|
||||||
|
|
||||||
**Design notes:**
|
- Held ESP32 + ESP8266 stack.
|
||||||
- Holds ESP32 + ESP8266 stack.
|
|
||||||
- Screw-on lid with vent slots.
|
- Screw-on lid with vent slots.
|
||||||
- Rear dovetail-style rail/socket interface.
|
- Rear dovetail-style rail/socket interface.
|
||||||
- Separate screw-tightened tripod clamp sized around a 35 mm stand/pole.
|
- Separate screw-tightened tripod clamp sized around a 35 mm stand/pole.
|
||||||
- Clamp uses M3 hardware: one M3 screw across the clamp mouth, with an M3 nut trap.
|
- Clamp used M3 hardware: one M3 screw across the clamp mouth, with an M3 nut trap.
|
||||||
|
|
||||||
**Prototype questions:**
|
**Reasons superseded by v4:**
|
||||||
- Does the clamp close enough on smaller tripod legs, or do we need swappable inserts?
|
|
||||||
- Does the dovetail hold under vibration without a retention screw?
|
- User requested front status/service panel with OLED, LEDs, and rocker switch.
|
||||||
- Are USB/LED/UART cutouts in the correct orientation for the actual boards?
|
- Single RGB status LED replaces separate red/green status LEDs.
|
||||||
|
- Rear strap pass-through loops are simpler and more adaptable than a dedicated clamp/dovetail for field stands.
|
||||||
|
|
||||||
## Backlog
|
## Backlog
|
||||||
|
|
||||||
@@ -36,6 +132,7 @@
|
|||||||
**Goal:** A printable enclosure for the RemoteRig hub/control panel using a 10.1-inch touchscreen and Raspberry Pi Zero / Zero 2 W.
|
**Goal:** A printable enclosure for the RemoteRig hub/control panel using a 10.1-inch touchscreen and Raspberry Pi Zero / Zero 2 W.
|
||||||
|
|
||||||
**Display target:**
|
**Display target:**
|
||||||
|
|
||||||
- Vendor/model: HZWDONE Raspberry Pi Screen 10.1" Touchscreen
|
- Vendor/model: HZWDONE Raspberry Pi Screen 10.1" Touchscreen
|
||||||
- Resolution: 1024×600
|
- Resolution: 1024×600
|
||||||
- Interface: HDMI portable monitor
|
- Interface: HDMI portable monitor
|
||||||
@@ -43,12 +140,14 @@
|
|||||||
- Compatibility listing: Raspberry Pi 5/4/3B/B+ and Windows 11/10/8
|
- Compatibility listing: Raspberry Pi 5/4/3B/B+ and Windows 11/10/8
|
||||||
|
|
||||||
**Initial assumptions to validate:**
|
**Initial assumptions to validate:**
|
||||||
|
|
||||||
- Compute: Raspberry Pi Zero / Zero 2 W mounted behind or below the display.
|
- Compute: Raspberry Pi Zero / Zero 2 W mounted behind or below the display.
|
||||||
- Use case: RemoteRig local monitor/control panel at field recording setup.
|
- Use case: RemoteRig local monitor/control panel at field recording setup.
|
||||||
- Likely needs: front bezel, rear electronics cavity, Pi mounting posts, HDMI/USB/power cable exits, strain relief, ventilation, and optional tripod/stand mounting.
|
- Likely needs: front bezel, rear electronics cavity, Pi mounting posts, HDMI/USB/power cable exits, strain relief, ventilation, and optional tripod/stand mounting.
|
||||||
- Because this is a 10.1" panel, design should prioritize rigidity: thicker bezel ribs, rear standoffs, and possibly a two-piece shell instead of a small snap case.
|
- Because this is a 10.1" panel, design should prioritize rigidity: thicker bezel ribs, rear standoffs, and possibly a two-piece shell instead of a small snap case.
|
||||||
|
|
||||||
**Required measurements before CAD:**
|
**Required measurements before CAD:**
|
||||||
|
|
||||||
- Product link or datasheet for the exact HZWDONE 10.1" variant.
|
- Product link or datasheet for the exact HZWDONE 10.1" variant.
|
||||||
- Screen/PCB outer dimensions: width, height, thickness.
|
- Screen/PCB outer dimensions: width, height, thickness.
|
||||||
- Active display opening dimensions.
|
- Active display opening dimensions.
|
||||||
@@ -60,6 +159,7 @@
|
|||||||
- Mounting preference: desktop kickstand, tripod clamp, VESA-style holes, handle, or combination.
|
- Mounting preference: desktop kickstand, tripod clamp, VESA-style holes, handle, or combination.
|
||||||
|
|
||||||
**Proposed design approach:**
|
**Proposed design approach:**
|
||||||
|
|
||||||
1. Create `hardware/display-case/`.
|
1. Create `hardware/display-case/`.
|
||||||
2. Build a parametric OpenSCAD model with measured display/Pi dimensions.
|
2. Build a parametric OpenSCAD model with measured display/Pi dimensions.
|
||||||
3. Split into printable parts: front bezel, rear shell, Pi/controller tray, optional stand/tripod mount.
|
3. Split into printable parts: front bezel, rear shell, Pi/controller tray, optional stand/tripod mount.
|
||||||
|
|||||||
+142
-63
@@ -1,89 +1,158 @@
|
|||||||
# RemoteRig — Camera Node Hardware Design
|
# RemoteRig — Camera Node Hardware Design
|
||||||
|
|
||||||
> **Version:** 0.2.0 | **Status:** Draft
|
> **Version:** 0.3.0 | **Status:** v4 CAD prototype ready for measurement/print validation
|
||||||
> **Target:** GoPro Hero 3 Black/Silver + ESP8266 + ESP32 + USB power bank
|
> **Target:** GoPro Hero 3 Black/Silver + ESP32-C3 Super Mini + ESP-01S + USB power bank
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Each camera node is two ESP boards in a small case that clips to the tripod/stand. The case **does not attach to the camera** — only to the stand. Powered by a standard USB power bank.
|
Each camera node is two ESP boards in a small upright stand-mounted case. The case **does not attach to the camera**; it straps to a tripod/lighting stand with reusable cloth zip ties / Velcro straps. Powered by a standard USB power bank.
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────┐
|
┌─────────────────┐
|
||||||
│ USB Power Bank │── USB ──→ GoPro (power only)
|
│ USB Power Bank │
|
||||||
│ (off-the-shelf)│── USB ──→ ESP32 + ESP8266 (shared)
|
│ (off-the-shelf)│
|
||||||
└─────────────────┘
|
└────────┬────────┘
|
||||||
│
|
│ USB-C cable into bottom USB-C female input
|
||||||
┌────────┴────────┐
|
▼
|
||||||
│ Tripod Case │ ← clips to stand leg
|
┌─────────────────────────────────────┐
|
||||||
│ ┌────────────┐ │
|
│ Camera Node Case v4 │ ← Velcro/cloth straps to stand
|
||||||
│ │ ESP8266 │ │ ← Wi-Fi → GoPro AP (10.5.5.1)
|
│ ┌──────────────────────────────┐ │
|
||||||
│ │ (camera) │ │
|
│ │ Flush/recessed service lid │ │
|
||||||
│ ├────────────┤ │ ← UART between boards
|
│ │ 1.3 OLED: CAM/REC/BAT/LINK │ │
|
||||||
│ │ ESP32 │ │ ← Wi-Fi → Travel Router
|
│ │ PWR LED + RGB STAT LED │ │
|
||||||
│ │ (MQTT) │ │
|
│ │ Small rocker power switch │ │
|
||||||
│ └────────────┘ │
|
│ └──────────────────────────────┘ │
|
||||||
└─────────────────┘
|
│ ESP-01S camera bridge ↔ ESP32-C3 │
|
||||||
|
│ side USB-A female power output ────┼── USB cable ──→ GoPro power
|
||||||
|
└─────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bill of Materials
|
## Bill of Materials
|
||||||
|
|
||||||
| Item | Qty | Cost | Notes |
|
| Item | Qty | Cost | Notes |
|
||||||
|------|-----|------|-------|
|
|------|-----|------|-------|
|
||||||
| ESP32 Dev Board | 1 | ~$5 | MQTT bridge — talks to hub |
|
| ESP32-C3 Super Mini | 1 | ~$4–$6 | MQTT / hub-side bridge; known board envelope 22.5 × 18 mm |
|
||||||
| ESP8266 D1 Mini | 1 | ~$3 | Camera bridge — talks to GoPro |
|
| ESP-01S / ESP8266 module | 1 | ~$2–$3 | Camera-side GoPro Wi-Fi bridge; known envelope ~24.7 × 14.3 × 12 mm |
|
||||||
| USB power bank (5000mAh+) | 1 | ~$10 | Powers both boards + GoPro |
|
| 1.3-inch OLED/status screen | 1 | ~$4–$8 | Prototype CAD assumes ~31 × 16 mm visible window / ~37 × 22 mm panel recess; confirm exact module |
|
||||||
| Micro-USB cable (short) | 2 | ~$2 | Power bank → boards + GoPro |
|
| 3 mm power LED | 1 | <$1 | Separate always-power/5V indicator |
|
||||||
| Jumper wires F-F | 3 | ~$0.25 | UART TX/RX/GND between boards |
|
| 3 mm RGB status LED | 1 | <$1 | Replaces separate red/green status LEDs; firmware can map node states to color |
|
||||||
| PETG filament | ~25g | ~$0.50 | 3D printed case |
|
| Small rocker switch | 1 | ~$1–$3 | On/off switch; prototype CAD assumes 13 × 19 mm snap-in opening |
|
||||||
| Velcro strap (small) | 1 | ~$0.25 | Secure power bank to stand |
|
| USB-C female panel/breakout connector | 1 | ~$1–$4 | Bottom power input; prototype CAD assumes ~10.5 × 4.5 mm rounded visible opening plus shallow underside recess; measure purchased part |
|
||||||
|
| USB-A female panel/breakout connector | 1 | ~$1–$4 | Right-side GoPro power passthrough output; prototype CAD assumes ~16 × 8 mm side opening; measure purchased part |
|
||||||
|
| IPEX/U.FL antenna pigtail or bulkhead lead | 1 | TBD | Left-side antenna exit opposite the USB-A port; prototype CAD assumes a 5.0 mm circular through-hole plus shallow exterior recess; measure exact pigtail/bulkhead diameter before production |
|
||||||
|
| USB power bank (5000 mAh+) | 1 | ~$10 | Powers camera node and GoPro |
|
||||||
|
| Short USB cables / wiring | as needed | ~$2–$5 | Power bank → node USB-C input; node 5 V passthrough → USB-A female → GoPro USB cable; internal power/signal wiring |
|
||||||
|
| M2 or small self-tapping screws | 4 | <$1 | Front service lid screws; pilot holes are parametric |
|
||||||
|
| PETG filament | ~35–50 g | ~$1 | 3D printed case body + lid |
|
||||||
|
| Reusable cloth zip ties / Velcro straps | 2 | ~$1 | Primary stand mount through rear vertical zip-tie brackets with lateral side-feed openings |
|
||||||
|
|
||||||
**Total per node:** ~$21 (+ GoPro already owned)
|
**Total per node:** roughly ~$25–$35 plus GoPro and power bank, depending on display/switch choice.
|
||||||
|
|
||||||
## 3D Printed Case
|
## 3D Printed Case
|
||||||
|
|
||||||
**Current source:** `hardware/case/tripod-case-v3.scad`
|
**Current source:** `hardware/case/camera-node-case-v4.scad`
|
||||||
**Pipeline:** `hardware/DESIGN_PIPELINE.md`
|
**Pipeline:** `hardware/DESIGN_PIPELINE.md`
|
||||||
|
|
||||||
Four exported prototype files:
|
The current v4 CAD replaces the rejected wide/low electronics-box layout with a tall appliance-style enclosure matching the original upright reference: a clean vertical body, large inset front panel, OLED near the top, open blank middle area, two long rounded lower slots, a bottom USB-C female power input, a right-side USB-A female passthrough power port for the GoPro, and a left-side IPEX/U.FL antenna pigtail/connector hole opposite the USB-A. It also replaces the v3 clamp/dovetail concept with a simpler strap-mounted field enclosure:
|
||||||
1. **Case body** — holds both boards stacked, cable ports, rear dovetail-style receiver
|
|
||||||
2. **Case lid** — screw-on cover with ventilation
|
1. **Case body** — shell sized around ESP32-C3 Super Mini + ESP-01S with service/wiring clearance.
|
||||||
3. **Tripod clamp** — separate screw-tightened C-clamp sized around a 35mm stand/pole
|
2. **Flush/recessed full-height front service lid** — screw-on front panel with locating lip and a restrained raised/recessed border.
|
||||||
4. **Full preview** — combined visualization STL only, not intended as the print job
|
3. **Front panel controls/indicators**:
|
||||||
|
- 1.3-inch OLED/status screen window.
|
||||||
|
- 3 mm **PWR** LED.
|
||||||
|
- single 3 mm **RGB STAT** LED for state-dependent colors.
|
||||||
|
- small rectangular rocker switch cutout.
|
||||||
|
- two long rounded lower front slots styled after the reference appliance face.
|
||||||
|
4. **Rear vertical zip-tie pass-through brackets** — two low-profile external brackets, one left and one right of center, with top/bottom anchor pads and long vertical side-access openings. Zip ties feed laterally in the X direction behind each raised bridge face instead of top-to-bottom, while the rear wall stays sealed.
|
||||||
|
5. **USB power ports** — bottom USB-C female power input and right-side USB-A female passthrough power output for a GoPro USB power cable.
|
||||||
|
6. **Left-side antenna exit** — prototype 5.0 mm round through-wall IPEX/U.FL antenna pigtail/connector clearance, placed opposite the right-side USB-A port at the same vertical position, with a shallow exterior circular recess for visual/exit relief. Measure the actual antenna pigtail/bulkhead before production.
|
||||||
|
|
||||||
|
### Export wrappers
|
||||||
|
|
||||||
|
Simple per-part OpenSCAD wrappers are included:
|
||||||
|
|
||||||
|
- `hardware/case/camera-node-case-v4-body.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-lid.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-preview.scad`
|
||||||
|
- `hardware/case/camera-node-case-v4-front-review.scad`
|
||||||
|
|
||||||
|
Example CLI exports, if OpenSCAD is installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openscad -o hardware/case/camera-node-case-v4-body.stl hardware/case/camera-node-case-v4-body.scad
|
||||||
|
openscad -o hardware/case/camera-node-case-v4-lid.stl hardware/case/camera-node-case-v4-lid.scad
|
||||||
|
openscad -o hardware/case/camera-node-case-v4-preview.stl hardware/case/camera-node-case-v4-preview.scad
|
||||||
|
openscad -o hardware/case/camera-node-case-v4-front-review.stl hardware/case/camera-node-case-v4-front-review.scad
|
||||||
|
```
|
||||||
|
|
||||||
|
Or render the main file directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openscad -D 'part="body"' -o hardware/case/camera-node-case-v4-body.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="lid"' -o hardware/case/camera-node-case-v4-lid.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="preview"' -o hardware/case/camera-node-case-v4-preview.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
openscad -D 'part="front_review"' -o hardware/case/camera-node-case-v4-front-review.stl hardware/case/camera-node-case-v4.scad
|
||||||
|
```
|
||||||
|
|
||||||
|
`camera-node-case-v4-preview.stl` is the seated fit-check assembly. `camera-node-case-v4-front-review.stl` is a non-print review layout with the body and front panel separated/angled so the OLED, LED, rocker, USB connector, and lower-slot cutouts are obvious in a slicer.
|
||||||
|
|
||||||
### Print Settings
|
### Print Settings
|
||||||
- **Material:** PETG preferred for heat/outdoor use and clamp flex
|
|
||||||
- **Layer:** 0.2mm | **Infill:** 20% gyroid minimum; 35%+ recommended for clamp
|
- **Material:** PETG preferred for heat/outdoor use and strap-tab durability.
|
||||||
- **Supports:** Likely yes for clamp ears / dovetail overhangs depending on slicer orientation
|
- **Layer:** 0.2 mm typical.
|
||||||
- **Post-processing:** M3x8mm screws for lid (4x), one M3 screw + M3 nut for clamp tightening
|
- **Infill:** 20% gyroid minimum; 30%+ recommended around rear vertical zip-tie bracket anchor pads/bridges.
|
||||||
|
- **Supports:** likely minimal/none depending on orientation; verify the rear lateral side-feed openings remain open and check USB-C/USB-A port cutouts in slicer.
|
||||||
|
- **Post-processing:** fit 4 lid screws; deburr OLED/LED/switch and IPEX antenna exit cutouts; clear any stringing inside the rear side-feed openings; soften strap-contact edges if the printed radius is too sharp for cloth ties.
|
||||||
|
|
||||||
|
## Expected Status Screen Content
|
||||||
|
|
||||||
|
Preferred 1.3-inch OLED layout/content style:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CAM 03 REC ●
|
||||||
|
BAT 87% LINK OK
|
||||||
|
00:12:34
|
||||||
|
```
|
||||||
|
|
||||||
|
Suggested fields:
|
||||||
|
|
||||||
|
- `CAM` / node ID.
|
||||||
|
- `REC` state with a clear recording indicator.
|
||||||
|
- Battery percentage or supply estimate.
|
||||||
|
- `LINK OK` / degraded / disconnected state.
|
||||||
|
- Recording/session timer.
|
||||||
|
|
||||||
## Wiring
|
## Wiring
|
||||||
|
|
||||||
```
|
```text
|
||||||
USB Power Bank
|
USB Power Bank
|
||||||
├── USB-A → Micro-USB cable → ESP32 USB port
|
└── USB-C cable → bottom USB-C female input on Camera Node Case
|
||||||
│ (powers ESP32, shared 5V rail)
|
├── rocker switch → node power rail
|
||||||
│
|
├── PWR LED indicator
|
||||||
├── USB-A → Micro-USB cable → GoPro USB port
|
├── ESP32-C3 Super Mini
|
||||||
│ (power only — no data)
|
├── ESP-01S / ESP8266
|
||||||
│
|
├── 1.3-inch OLED display
|
||||||
└── (ESP8266 powered via ESP32 3.3V pin, or via shared USB)
|
├── RGB status LED
|
||||||
|
└── 5 V passthrough rail → side USB-A female output
|
||||||
|
└── USB cable → GoPro USB port
|
||||||
|
(power only — no data)
|
||||||
|
|
||||||
UART (inside case):
|
UART / control inside case:
|
||||||
ESP8266 TX (GPIO1) ──→ ESP32 RX (GPIO16)
|
ESP-01S TX ──→ ESP32-C3 RX
|
||||||
ESP8266 RX (GPIO3) ←── ESP32 TX (GPIO17)
|
ESP-01S RX ←── ESP32-C3 TX
|
||||||
ESP8266 GND ─────────── ESP32 GND
|
ESP-01S GND ─── ESP32-C3 GND
|
||||||
```
|
```
|
||||||
|
|
||||||
**Power note:** Both boards can be powered from a single USB cable if the ESP32's VIN/5V pin is bridged to the ESP8266's VIN. Alternatively, use a USB Y-splitter cable.
|
**Power note:** exact wiring depends on the regulator/power board used. Confirm OLED voltage, LED current limiting, and whether the rocker switches USB 5 V input or a regulated node rail.
|
||||||
|
|
||||||
## Wi-Fi Topology
|
## Wi-Fi Topology
|
||||||
|
|
||||||
```
|
```text
|
||||||
GoPro Hero 3 ──(AP @ 10.5.5.1)──→ ESP8266 (camera bridge)
|
GoPro Hero 3 ──(AP @ 10.5.5.1)──→ ESP-01S / ESP8266 camera bridge
|
||||||
│
|
│
|
||||||
UART │ (inside case)
|
UART │ (inside case)
|
||||||
│
|
│
|
||||||
Travel Router ──(AP)─────────────────→ ESP32 (MQTT bridge)
|
Travel Router ──(AP)────────────────────→ ESP32-C3 MQTT bridge
|
||||||
(10.60.1.1) │
|
(10.60.1.1) │
|
||||||
│
|
│
|
||||||
MQTT │
|
MQTT │
|
||||||
@@ -91,22 +160,32 @@ Travel Router ──(AP)─────────────────→ E
|
|||||||
Pi Hub (10.60.1.56)
|
Pi Hub (10.60.1.56)
|
||||||
```
|
```
|
||||||
|
|
||||||
The ESP8266 and GoPro talk over Wi-Fi — **no data cable between them**. The only cable to the GoPro is USB power from the battery pack.
|
The ESP8266/ESP-01S and GoPro talk over Wi-Fi. The only cable to the GoPro is USB power from the case side USB-A passthrough port.
|
||||||
|
|
||||||
## Field Setup
|
## Field Setup
|
||||||
|
|
||||||
1. **Mount GoPro** on tripod/stand
|
1. Mount GoPro on tripod/stand.
|
||||||
2. **Clip case** to tripod leg
|
2. Feed two reusable cloth zip ties / Velcro straps laterally through the long side openings behind the rear vertical brackets.
|
||||||
3. **Connect power bank** via USB to case + GoPro
|
3. Strap the case to a tripod/stand leg; use both strap paths to resist rotation.
|
||||||
4. **Power on** — ESP32 auto-connects to travel router, ESP8266 auto-connects to GoPro
|
4. Connect the power bank to the case bottom USB-C input; connect the GoPro USB power cable to the case side USB-A passthrough output.
|
||||||
5. **Monitor** from `http://10.60.1.56:8080`
|
5. Toggle rocker switch on.
|
||||||
|
6. Verify PWR LED, RGB status LED, and OLED status: camera ID, REC state, battery, link, timer.
|
||||||
|
7. Monitor from `http://10.60.1.56:8080`.
|
||||||
|
|
||||||
## Case Dimensions
|
## Case Dimensions
|
||||||
|
|
||||||
| | W × D × H (mm) |
|
Prototype v4 nominal CAD dimensions:
|
||||||
|
|
||||||
|
| Part / feature | W × D × H (mm) |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Case body external | ~56.8 × 38.2 × 19.0 |
|
| Case shell external | ~56 × 36 × 82 |
|
||||||
| Lid external | ~56.8 × 32.8 × 4.0 |
|
| Case with rear zip-tie brackets | ~56 × 41.2 × 82 |
|
||||||
| Tripod clamp | ~43.0 × 56.9 × 16.0 |
|
| Front recessed lid | visible panel ~48 × 2 × 74; total with locating lip ~48 × 3 × 74 |
|
||||||
| Clamp pole fit | Nominal 35mm; smaller poles TBD / may need inserts |
|
| OLED visible window assumption | ~31 × 16 |
|
||||||
| Total weight | TBD after prototype print |
|
| Rocker cutout assumption | ~13 × 19 |
|
||||||
|
| Bottom USB-C power input cutout | ~10.5 × 4.5 opening with ~18 × 10 shallow underside recess |
|
||||||
|
| Right-side USB-A passthrough cutout | ~16 Y/front-back × 8 Z opening through side wall |
|
||||||
|
| Rear vertical zip-tie brackets | two external side-feed brackets, each ~8.5 mm wide × 50 mm tall; lateral tunnel has ~40 mm vertical side-window length × ~3.8 mm strap-thickness clearance behind the raised bridge |
|
||||||
|
| Board clearance targets | ESP32-C3 22.5 × 18 mm + ESP-01S 24.7 × 14.3 × 12 mm plus wiring/service clearance |
|
||||||
|
|
||||||
|
These dimensions are placeholders for the first CAD prototype. Measure the actual OLED module, rocker switch, LEDs, screws, USB-C/USB-A connector flanges and body depths, USB cable bend radius, and strap width/thickness before committing to production prints.
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// Export wrapper for RemoteRig camera node case v4 body.
|
||||||
|
use <camera-node-case-v4.scad>
|
||||||
|
|
||||||
|
camera_node_body_v4();
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
|||||||
|
// Export wrapper for RemoteRig camera node case v4 front-facing review layout.
|
||||||
|
use <camera-node-case-v4.scad>
|
||||||
|
|
||||||
|
camera_node_front_review_v4();
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
|||||||
|
// Export wrapper for RemoteRig camera node case v4 front service lid/status panel.
|
||||||
|
use <camera-node-case-v4.scad>
|
||||||
|
|
||||||
|
camera_node_lid_v4();
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
|||||||
|
// Export wrapper for RemoteRig camera node case v4 assembly preview.
|
||||||
|
use <camera-node-case-v4.scad>
|
||||||
|
|
||||||
|
camera_node_preview_v4();
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,309 @@
|
|||||||
|
// 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 side-feed zip-tie brackets 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 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.
|
||||||
|
// - Small rocker switch cutout: 13 x 19 mm rectangular snap-in opening.
|
||||||
|
// - LEDs: two 3 mm panel LEDs (PWR + RGB STAT) with 3.2 mm holes.
|
||||||
|
// - Boards: ESP32-C3 Super Mini 22.5 x 18 mm, ESP-01S 24.7 x 14.3 x 12 mm.
|
||||||
|
// - USB-C bottom power inlet and side USB-A passthrough are panel/breakout placeholders;
|
||||||
|
// measure purchased connector flanges/bodies before production prints.
|
||||||
|
// - Left-side IPEX/U.FL antenna pigtail connector/lead hole is a prototype 5.0 mm
|
||||||
|
// circular through-wall clearance; measure the final bulkhead/lead before production.
|
||||||
|
|
||||||
|
$fn = 56;
|
||||||
|
|
||||||
|
// ----- Main enclosure parameters -----
|
||||||
|
case_w = 56; // upright appliance-style external width
|
||||||
|
case_d = 36; // depth for module stack + wiring clearance
|
||||||
|
case_h = 82; // tall vertical appliance-style height
|
||||||
|
wall = 2.2;
|
||||||
|
corner_r = 4.0;
|
||||||
|
front_recess_d = 2.0; // lid sits in this front pocket, nominally flush
|
||||||
|
lid_clearance = 0.35;
|
||||||
|
lid_w = case_w - 8; // nearly full-height/front-width inset panel
|
||||||
|
lid_h = case_h - 8;
|
||||||
|
lid_t = 2.0;
|
||||||
|
lid_lip_t = 1.2; // locating lip protrudes inside service opening
|
||||||
|
service_opening_w = lid_w - 10.0;
|
||||||
|
service_opening_h = lid_h - 16.0;
|
||||||
|
|
||||||
|
// Hardware
|
||||||
|
screw_d = 2.4; // M2 self-tapping / pilot; confirm hardware
|
||||||
|
screw_head_d = 4.6;
|
||||||
|
boss_d = 6.0;
|
||||||
|
boss_len = 8.0;
|
||||||
|
|
||||||
|
// Front panel components
|
||||||
|
oled_window_w = 31.0;
|
||||||
|
oled_window_h = 16.0;
|
||||||
|
oled_bezel_w = 37.0; // shallow recessed visual outline around window
|
||||||
|
oled_bezel_h = 22.0;
|
||||||
|
oled_z = 53.0; // upper third, clear of top screw counterbores
|
||||||
|
led_hole_d = 3.2; // 3 mm LED clearance
|
||||||
|
rocker_w = 13.0; // prototype cutout; measure purchased rocker
|
||||||
|
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 pass-through brackets.
|
||||||
|
// Two visibly vertical external brackets sit left/right of center.
|
||||||
|
// The strap path is a lateral X-direction tunnel between the sealed rear wall
|
||||||
|
// and raised bridge face; long side windows stay open for feeding from either side.
|
||||||
|
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_anchor_h = 5.0; // top/bottom weld pads; side window remains long vertically
|
||||||
|
rear_loop_side_window_h = rear_loop_h - 2*rear_loop_anchor_h;
|
||||||
|
|
||||||
|
// USB power connector placeholder cutouts
|
||||||
|
usb_c_cutout_w = 10.5; // bottom USB-C female inlet visible opening, X width
|
||||||
|
usb_c_cutout_d = 4.5; // bottom USB-C female inlet visible opening, Y/front-back
|
||||||
|
usb_c_recess_w = 18.0; // shallow underside panel-mount/breakout recess
|
||||||
|
usb_c_recess_d = 10.0;
|
||||||
|
usb_c_y = -7.5; // close to front/service side but clear of screw bosses/lower slots
|
||||||
|
usb_a_cutout_d = 16.0; // side USB-A female opening, Y/front-back dimension
|
||||||
|
usb_a_cutout_h = 8.0; // side USB-A female opening, Z height
|
||||||
|
usb_a_z = 26.0; // mid/lower right side, clear of front lid screws/strap bridges
|
||||||
|
usb_a_y = 2.0;
|
||||||
|
|
||||||
|
// Left-side antenna lead / IPEX-U.FL pigtail connector placeholder.
|
||||||
|
// Opposite the right-side USB-A port and cut fully through the left wall into the cavity.
|
||||||
|
ipex_hole_d = 5.0; // prototype circular clearance; measure final pigtail/bulkhead
|
||||||
|
ipex_recess_d = 8.5; // shallow exterior visual/seat recess, not retention geometry
|
||||||
|
ipex_recess_depth = 0.9;
|
||||||
|
ipex_z = usb_a_z;
|
||||||
|
ipex_y = usb_a_y;
|
||||||
|
|
||||||
|
// ----- Utility geometry -----
|
||||||
|
module rounded_box(size=[10,10,10], r=2, center_xy=true) {
|
||||||
|
// Rounded in XY, straight in Z.
|
||||||
|
linear_extrude(height=size[2])
|
||||||
|
offset(r=r)
|
||||||
|
square([size[0]-2*r, size[1]-2*r], center=center_xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
module xz_rounded_prism(w, d, h, r=2) {
|
||||||
|
// Rounded rectangle in the visible X/Z plane, extruded through Y.
|
||||||
|
rotate([-90,0,0])
|
||||||
|
linear_extrude(height=d, center=true)
|
||||||
|
offset(r=r)
|
||||||
|
square([w-2*r, h-2*r], center=true);
|
||||||
|
}
|
||||||
|
|
||||||
|
module yz_rounded_prism(d, x, h, r=2) {
|
||||||
|
// Rounded rectangle in the visible Y/Z plane, extruded through X.
|
||||||
|
// First argument maps to global Y, third argument maps to global Z.
|
||||||
|
rotate([0,90,0])
|
||||||
|
linear_extrude(height=x, center=true)
|
||||||
|
offset(r=r)
|
||||||
|
square([h-2*r, d-2*r], center=true);
|
||||||
|
}
|
||||||
|
|
||||||
|
module y_cylinder(d, h, center=true) {
|
||||||
|
rotate([90,0,0]) cylinder(d=d, h=h, center=center);
|
||||||
|
}
|
||||||
|
|
||||||
|
module x_cylinder(d, h, center=true) {
|
||||||
|
rotate([0,90,0]) cylinder(d=d, h=h, center=center);
|
||||||
|
}
|
||||||
|
|
||||||
|
module screw_boss(x, z) {
|
||||||
|
translate([x, -case_d/2 + front_recess_d + boss_len/2, z])
|
||||||
|
difference() {
|
||||||
|
y_cylinder(d=boss_d, h=boss_len);
|
||||||
|
y_cylinder(d=screw_d, h=boss_len + 0.8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module rear_zip_tie_loop(xc) {
|
||||||
|
// Vertical external belt-loop bracket for reusable cloth zip ties/Velcro.
|
||||||
|
// The bracket silhouette remains vertical, but the real strap tunnel runs
|
||||||
|
// laterally in X through the long side windows, behind the raised bridge face.
|
||||||
|
// Top/bottom pads weld the bridge to the shell; no cut reaches the rear wall.
|
||||||
|
loop_overlap_y = 0.75;
|
||||||
|
pad_r = 1.15;
|
||||||
|
bridge_y_center = case_d/2 + rear_loop_gap_y + rear_loop_face_t/2;
|
||||||
|
pad_y_center = case_d/2 + rear_loop_y/2 - loop_overlap_y;
|
||||||
|
pad_z_offset = rear_loop_h/2 - rear_loop_anchor_h/2;
|
||||||
|
|
||||||
|
union() {
|
||||||
|
// Raised vertical bridge face: visually preserves the requested vertical
|
||||||
|
// rear brackets while spanning the side-feed tunnel externally.
|
||||||
|
translate([xc, bridge_y_center, rear_loop_z])
|
||||||
|
xz_rounded_prism(rear_loop_w, rear_loop_face_t, rear_loop_h, r=1.6);
|
||||||
|
|
||||||
|
// Top and bottom anchor pads close the old top-to-bottom feed direction
|
||||||
|
// and tie the raised face back into the rear wall without opening the case.
|
||||||
|
for (zoff = [-pad_z_offset, pad_z_offset])
|
||||||
|
translate([xc, pad_y_center, rear_loop_z + zoff])
|
||||||
|
xz_rounded_prism(rear_loop_w, rear_loop_y, rear_loop_anchor_h, r=pad_r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- Printable body -----
|
||||||
|
module camera_node_body_v4() {
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
// Upright outer shell with softened appliance-like corners.
|
||||||
|
rounded_box([case_w, case_d, case_h], r=corner_r);
|
||||||
|
|
||||||
|
// Rear cloth zip-tie / Velcro side-feed brackets 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.
|
||||||
|
translate([0, -case_d/2 + front_recess_d/2, case_h/2])
|
||||||
|
cube([lid_w + lid_clearance, front_recess_d + 0.4, lid_h + lid_clearance], center=true);
|
||||||
|
|
||||||
|
// Through service opening behind the lid, leaving a strong inset frame.
|
||||||
|
service_depth = front_recess_d + wall + 2.0;
|
||||||
|
translate([0, -case_d/2 + service_depth/2, case_h/2])
|
||||||
|
xz_rounded_prism(service_opening_w, service_depth + 0.4, service_opening_h, r=2.0);
|
||||||
|
|
||||||
|
// Interior electronics cavity: ESP32-C3 Super Mini + ESP-01S plus wiring/service clearance.
|
||||||
|
cavity_d = case_d - front_recess_d - 2*wall;
|
||||||
|
translate([0, -case_d/2 + front_recess_d + wall + cavity_d/2, case_h/2])
|
||||||
|
cube([case_w - 2*wall, cavity_d, case_h - 2*wall], center=true);
|
||||||
|
|
||||||
|
// Bottom USB-C female power inlet: shallow underside recess plus
|
||||||
|
// rounded through-slot for a flush/panel-mount breakout placeholder.
|
||||||
|
translate([0, usb_c_y, -0.35])
|
||||||
|
rounded_box([usb_c_recess_w, usb_c_recess_d, 0.9], r=1.5);
|
||||||
|
translate([0, usb_c_y, -0.2])
|
||||||
|
rounded_box([usb_c_cutout_w, usb_c_cutout_d, wall + 1.2], r=1.6);
|
||||||
|
|
||||||
|
// Right-side USB-A female passthrough power port for the GoPro.
|
||||||
|
translate([case_w/2 - 0.10, usb_a_y, usb_a_z])
|
||||||
|
yz_rounded_prism(usb_a_cutout_d, wall + 2.8, usb_a_cutout_h, r=0.9);
|
||||||
|
|
||||||
|
// Left-side IPEX/U.FL antenna pigtail connector/lead clearance.
|
||||||
|
// Through-hole intentionally extends past the inner wall so it opens to the cavity.
|
||||||
|
translate([-case_w/2 - 0.10, ipex_y, ipex_z])
|
||||||
|
x_cylinder(d=ipex_hole_d, h=wall + 3.0);
|
||||||
|
// Shallow exterior circular recess marks/relieves the antenna exit area.
|
||||||
|
translate([-case_w/2 + ipex_recess_depth/2 - 0.05, ipex_y, ipex_z])
|
||||||
|
x_cylinder(d=ipex_recess_d, h=ipex_recess_depth + 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Four protected screw bosses are added after shell hollowing so the
|
||||||
|
// electronics cavity cannot cut away the receiving material.
|
||||||
|
screw_x = lid_w/2 - 5.0;
|
||||||
|
screw_z_low = (case_h - lid_h)/2 + 5.0;
|
||||||
|
screw_z_high = case_h - screw_z_low;
|
||||||
|
screw_boss(-screw_x, screw_z_low);
|
||||||
|
screw_boss( screw_x, screw_z_low);
|
||||||
|
screw_boss(-screw_x, screw_z_high);
|
||||||
|
screw_boss( screw_x, screw_z_high);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final body-level pilot holes cut through the front frame into the protected bosses.
|
||||||
|
screw_x = lid_w/2 - 5.0;
|
||||||
|
screw_z_low = (case_h - lid_h)/2 + 5.0;
|
||||||
|
screw_z_high = case_h - screw_z_low;
|
||||||
|
for (x=[-screw_x, screw_x], z=[screw_z_low, screw_z_high])
|
||||||
|
translate([x, -case_d/2 + front_recess_d + boss_len/2, z])
|
||||||
|
y_cylinder(d=screw_d, h=boss_len + front_recess_d + 4.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- Printable front service lid / status panel -----
|
||||||
|
module camera_node_lid_v4() {
|
||||||
|
panel_through_d = lid_t + lid_lip_t + 2.4;
|
||||||
|
panel_through_y = 0.25;
|
||||||
|
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
// Visible full-height flush panel; restrained and not a busy slab.
|
||||||
|
rounded_box([lid_w, lid_t, lid_h], r=0.65);
|
||||||
|
|
||||||
|
// Rear locating lip fits inside the large service opening.
|
||||||
|
translate([0, lid_t/2 + lid_lip_t/2 - 0.2, lid_h/2])
|
||||||
|
xz_rounded_prism(service_opening_w - 0.8, lid_lip_t, service_opening_h - 0.8, r=1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// OLED window and shallow black-bezel-style recess near the top.
|
||||||
|
translate([0, -lid_t/2 + 0.35, oled_z])
|
||||||
|
xz_rounded_prism(oled_bezel_w, 0.9, oled_bezel_h, r=1.3);
|
||||||
|
translate([0, panel_through_y, oled_z])
|
||||||
|
xz_rounded_prism(oled_window_w, panel_through_d, oled_window_h, r=0.5);
|
||||||
|
|
||||||
|
// Subtle secondary indicators flanking the rocker, below the OLED bezel.
|
||||||
|
translate([-15.0, panel_through_y, 33.0]) y_cylinder(d=led_hole_d, h=panel_through_d);
|
||||||
|
translate([ 15.0, panel_through_y, 33.0]) y_cylinder(d=led_hole_d, h=panel_through_d);
|
||||||
|
|
||||||
|
// Small rocker lower on the panel, offset away from the OLED, screws, and slots.
|
||||||
|
translate([0, panel_through_y, 33.0])
|
||||||
|
xz_rounded_prism(rocker_w, panel_through_d, rocker_h, r=0.8);
|
||||||
|
|
||||||
|
// Two long rounded horizontal slots near the lower front, matching the reference.
|
||||||
|
translate([0, panel_through_y, 17.0])
|
||||||
|
xz_rounded_prism(front_slot_w, panel_through_d, front_slot_h, r=front_slot_h/2 - 0.15);
|
||||||
|
translate([0, panel_through_y, 11.0])
|
||||||
|
xz_rounded_prism(front_slot_w, panel_through_d, front_slot_h, r=front_slot_h/2 - 0.15);
|
||||||
|
|
||||||
|
// Screw clearance/counterbore holes.
|
||||||
|
screw_x = lid_w/2 - 5.0;
|
||||||
|
screw_z_low = 5.0;
|
||||||
|
screw_z_high = lid_h - screw_z_low;
|
||||||
|
for (x=[-screw_x, screw_x], z=[screw_z_low, screw_z_high]) {
|
||||||
|
translate([x, panel_through_y, z]) y_cylinder(d=screw_d + 0.4, h=panel_through_d);
|
||||||
|
translate([x, -lid_t/2 + 0.55, z]) y_cylinder(d=screw_head_d, h=1.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- Non-print preview assembly -----
|
||||||
|
module camera_node_preview_v4(show_lid=true) {
|
||||||
|
color("lightgray") camera_node_body_v4();
|
||||||
|
if (show_lid)
|
||||||
|
translate([0, -case_d/2 + lid_t/2 + 0.03, (case_h - lid_h)/2])
|
||||||
|
color("gainsboro") camera_node_lid_v4();
|
||||||
|
|
||||||
|
// Dark OLED bezel/window cue for visual review only (not part of exported lid STL when rendering lid).
|
||||||
|
if (show_lid)
|
||||||
|
translate([0, -case_d/2 - 0.08, (case_h - lid_h)/2 + oled_z])
|
||||||
|
color("black") xz_rounded_prism(oled_bezel_w, 0.6, oled_bezel_h, r=1.3);
|
||||||
|
|
||||||
|
// Internal board/connector volume guides (not printed): ESP modules and USB connector envelopes.
|
||||||
|
color([0,0.45,0,0.35]) translate([-9, -1, 26]) cube([22.5, 18, 4], center=true);
|
||||||
|
color([0,0.2,0.8,0.35]) translate([9, -1, 45]) cube([24.7, 14.3, 12], center=true);
|
||||||
|
color([0.1,0.1,0.1,0.35]) translate([0, usb_c_y, 3.8]) cube([16, 9, 5], center=true);
|
||||||
|
color([0.1,0.1,0.1,0.35]) translate([case_w/2 - 5.5, usb_a_y, usb_a_z]) cube([11, usb_a_cutout_d + 2, usb_a_cutout_h + 2], center=true);
|
||||||
|
color([0.9,0.7,0.1,0.45]) translate([-case_w/2 - 1.8, ipex_y, ipex_z]) x_cylinder(d=ipex_hole_d, h=8.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-print review layout: separates the body and front lid while keeping both
|
||||||
|
// front faces oriented toward -Y. Use this STL when checking that the screen,
|
||||||
|
// LED, rocker, USB connector, and lower-slot cutouts are visible in a slicer.
|
||||||
|
module camera_node_front_review_v4() {
|
||||||
|
translate([-34, 0, 0]) rotate([0,0,-18]) color("lightgray") camera_node_body_v4();
|
||||||
|
translate([34, -case_d/2 + lid_t/2 + 0.03, (case_h - lid_h)/2])
|
||||||
|
color("gainsboro") camera_node_lid_v4();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select part to render from OpenSCAD CLI with: -D 'part="body"'
|
||||||
|
part = "preview"; // "body", "lid", "preview", or "front_review"
|
||||||
|
|
||||||
|
if (part == "body") {
|
||||||
|
camera_node_body_v4();
|
||||||
|
} else if (part == "lid") {
|
||||||
|
camera_node_lid_v4();
|
||||||
|
} else if (part == "front_review") {
|
||||||
|
camera_node_front_review_v4();
|
||||||
|
} else {
|
||||||
|
camera_node_preview_v4();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user