Skip to content

Add parametric OpenSCAD mount for UC-844 eye camera - #36

Open
danielkaijzer wants to merge 29 commits into
mainfrom
claude/eye-camera-mount-design-tot42k
Open

Add parametric OpenSCAD mount for UC-844 eye camera#36
danielkaijzer wants to merge 29 commits into
mainfrom
claude/eye-camera-mount-design-tot42k

Conversation

@danielkaijzer

@danielkaijzer danielkaijzer commented Jul 15, 2026

Copy link
Copy Markdown
Owner

No description provided.

claude and others added 29 commits July 15, 2026 22:07
Pocket-frame with a tight registration zone plus a looser lead-in
zone locates the 38x38mm PCB by its edges to fix the looseness of
the old mount, with 4 corner heat-set-insert bosses/gussets to bolt
the board down and a perforated floor for airflow (per 3d-files/NOTES.md).

Reuses two properties measured directly from the old mount's real
STEP file (3d-files/bottom mount/v1 various internal eye cams.step):
the 60 degree camera tilt, and the glasses-attachment clip's snap-fit
keyhole slot geometry (mouth/neck/pocket widths + bolt hole).

Parameters are grouped by confidence (measured from STEP vs. from
photos/ruler vs. designer defaults) so it's clear what to re-check
before printing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Camera tilt was flipped so the pocket opening (where the PCB/lens
faces) tilts back toward the spine and glasses clips - inward toward
the eye - instead of outward away from the face.

Frame is now a genuine open picture-frame (thin rim hugging the PCB
edges, hollow in the middle) with a diagonal-braced pad at each
corner carrying the mounting screw, instead of a solid slab. This
makes the back-perforation workaround unnecessary since there's
nothing solid left to perforate - airflow is inherent to the design
now. Added an explicit connector tab so the spine still fuses solidly
into the frame despite the hollow middle (verified via CGAL volume
count on the exported STL).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The old mount's camera bracket was tiny (~20x29.5x9mm, from its STEP
file) next to this frame's 44x44mm footprint. Centering the PCB the
same way in both, on an otherwise-identical flat/horizontal spine,
pushes the new lens noticeably further from the clip attachment point
than the old mount - which, given the tilt, means further up and away
from the eye.

This variant splits the spine into two segments with a bend
(dip_angle) between them, so the frame-side segment angles downward
before the frame attaches, compensating for that extra offset. Kept
as a separate file from uc844_mount_v1.scad (flat spine) since there's
no hard measurement yet for how much dip is actually needed - both are
meant to be compared during test-fit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
dip_angle and tilt_angle both rotate about the same axis, and the dip
was applied with the same sign as the tilt, so it compounded the
tilt instead of counteracting it - moving the lens further up/out
rather than back down. Traced the actual centroid coordinates through
both rotations to confirm: at dip_angle=25 the old (buggy) sign put
the frame centroid at height 32.0 (higher than v1's 23.8); the fixed
sign puts it at 11.7 (lower, as intended). Volume-check on the STL
still confirms a single fused part after the fix.

Also documented that the old mount's STEP file can't supply ground
truth for how much dip is actually needed - its bracket solids turned
out to be an unconnected comparison layout, not a modeled assembly -
so a real ruler measurement off the physical old mount is the
reliable way to calibrate this.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The old camera's lens sits ~3/8in (9.5mm) above the clip. Solved for
the dip_angle that puts this frame's PCB/lens centroid at the same
height above the clip while holding tilt_angle fixed at 60 degrees
(matching the old mount, per the user's requirement) - 29 degrees,
up from the earlier placeholder guess of 25. Verified the centroid
math directly (root-solved against the same transform chain used to
catch the previous sign bug) and re-confirmed the part still fuses
into one manifold solid after the change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
A clearer board photo showed two nested corner-hole patterns, not one
real + decoys as originally assumed from a blurrier shot. Measured
both via circle detection (cross-checked against all 4 sides of each
square): outer holes at 34.0mm pitch, inner at 28.0mm - matching the
"compatible with 34x34, 28x28mm" note from the very first message.
hole_pitch=34 already targeted the outer pattern correctly, so no
functional change, but the confidence label and comments were wrong
(claimed only 4 real holes existed) and are now corrected. Also
tightened hole_dia to the measured 2.85mm (from a rough 3.0mm guess);
purely informational, doesn't affect the geometry since the boss's
own insert_hole_dia is sized independently.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The two spine bends were fused by extending each segment past the
joint by a fixed 2mm overlap - fine for the unrotated clip-to-spine
joint, but wrong at the two angled bends: since the mating faces
aren't coplanar once rotated, the extension pokes a wedge out past
the neighboring segment's surface instead of meeting it flush. Traced
the exact numbers: at the tilt joint, the frame's connector tab's
real face and the spine's real end face were ~1.9mm apart, closed
only by the tab overlapping sloppily at the 60 degree angle - that
gap was the protruding wedge visible in Cura that made "lay the frame
flat" seem impossible.

Replaced both joints with hull() between the two segments' actual end
faces, which gives the minimal clean fillet instead of an oversized
angled overlap. Verified analytically (not just visually) that
nothing in the joint geometry sits below the frame's own bottom plane
after correcting for print orientation, and re-confirmed the whole
assembly still renders as a single fused manifold solid.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The already-printed uc844_mount_v2_dipped_spine.scad's keyhole clips were
reverse-engineered from the old STEP file for a thin wire, but the user's
actual glasses attach via a rigid oval rod (5mm x 4mm, measured directly
with a ruler) clamped by 2 screws - a different mechanism than modeled.

Rather than reprint the already-validated mount, this is a small separate
two-piece part: a base with two pegs sized to plug into the mount's
existing keyhole slots, plus a 2-piece screw clamp (base + cap) that
sandwiches the oval rod between them, mirroring the clamp visible in
photos of the old mount. Verified the two halves form a clean continuous
oval channel when stacked (no gaps/overlaps) and that the pegs actually
protrude from the block (an early version had them positioned at the
block's center, buried inside rather than sticking out - fixed before
committing).

This doesn't require re-solving the lens-height calibration (dip_angle=29
in the main mount file) since that was based on where the old mount
attached to the rod, not the attachment mechanism itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The printed part came out broken (thin, hollow, fragile prongs where
the screw bosses and pegs should have been) - traced to two separate
design bugs, not a print-orientation issue:

1. The rod channel was centered on the same axis as the screw bosses
   and ran the FULL length of the clamp, cutting straight through both
   insert bosses and leaving only thin crescent-shaped remnants instead
   of solid cylinders. Shortened the channel (12mm, centered) and moved
   the screw bosses further out (offset 13mm) so their Y-ranges no
   longer overlap at all - verified analytically (channel now spans
   Y -6..6, bosses start at Y=9.5, a clean 3.5mm gap) and visually
   (both bosses render as solid, unbroken cylinders).

2. The pegs were horizontal cantilevers sticking out from a vertical
   wall with nothing underneath them - one of the worst shapes for
   FDM without support, which explains the stringy/malformed print.
   Changed them to vertical bosses on the base's top face instead,
   matching every other successfully-printed round feature in this
   project. Print orientation doesn't need to match final assembly
   orientation for a part this small - it gets rotated by hand when
   pushed into the mount's keyhole slot.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Fold the glasses-rod attachment directly into the mount instead of
bridging it with a separate two-piece peg adapter. The near end of the
spine is now the lower half of a screw clamp; a small separate cap is the
upper half. The oval glasses rod (measured 5x4mm) is sandwiched between
the two half-oval channels and pinched by two screws (fore and aft of the
rod) driven into heat-set inserts in the base - the same insert scheme
used at the four camera-mounting corners.

This removes the confusing extra peg-into-keyhole interface entirely: the
glasses connect straight to the mount, one clamp, no loose rotational DOF.
Includes a rod mockup and an assembly/print toggle so the mating faces and
screw alignment can be checked before printing. Frame + dipped spine
geometry carried over unchanged from v2; dip_angle stays 29 but may need a
small re-tune since the rod grip point sits slightly differently than the
old clip grip point.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Show the cap lifted and the rod floating above the open groove in the
base, to make clear the rod drops STRAIGHT DOWN into the top-loading
channel (the only way to capture a continuous, no-free-end glasses rim)
and the cap then bolts down over it - no threading through a closed hole,
which is exactly what the printed v2 keyhole clips could not do with a
rigid rod.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Previously the two clamp halves had flat mating faces and a bore sized to
the rod plus clearance, so tightening bottomed the faces against each
other and left a fixed-size cavity - if the real rod were any smaller than
the 5x4mm estimate it would rattle and tightening wouldn't help.

Undersize the bore in the split (Z) direction (channel_r_z = rod_z/2 -
clamp_bore_squeeze) so the rod always stands proud of the parting line and
the halves pinch the ROD, never bottoming out flat first. A rod-size error
now just changes the leftover gap between the halves, not whether it grips:
tolerates ~1mm thinner (down to zero gap) and several mm thicker (screw
travel permitting). Width keeps a small clearance so it always drops in.
Bumped clamp_wall to 2.5 so the shallower groove still leaves half height
equal to spine_thick. Assembly view now shows the rod pinched with the
real gap between halves.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The combined "print" layout is one STL, which Cura imports as a single
grouped object - so rotating the mount to lay the frame flat drags the cap
along too. Add show="mount" and show="cap" so each body can be exported to
its own STL and imported as an independent object that rotates on its own.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The current scene-camera bar retains the HQ-L103 PCB with press-fit
windows, so the board shifts and doesn't seat consistently. This new
backing mount instead:

- locates the board with a full-perimeter pocket (no slide/rotate)
- pins it with two posts through the board's own end mounting holes
- holds it flat with chamfered snap post-heads + two connector-end lips
- opens a center window for component clearance and airflow (NOTES.md)

The clip interface (two Ø3.2 mm holes at 64 mm pitch) was extracted from
the existing top-mount STEP files, so the current white rod clips bolt on
unchanged. Fully parametric; PCB dimensions are flagged to confirm with
calipers before printing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Use the real board footprint (62 x 9 mm) instead of the photo estimate.
Separate the bare-board edge thickness (pocket/snap/lip depth) from the
overall 5.68 mm module height, since the lens/components face forward and
stay exposed rather than recessing into the plate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Incorporate the manufacturer datasheet and the current bar's STEP interface:

- PCB set to datasheet values: 62 x 9 x 1.0 mm; two Ø2.2 mounting holes
  4.0 mm apart, 2.0 mm from the end (camera 32.5 mm from that end).
- Retention switched to screw-down: two M2 screws through the board's own
  mounting holes clamp it flat (self-tap pilots, or heat-set option).
- Replicate the clip interface from the current bar's STEP: a rounded L-tab
  ear at each end carrying a Ø3.2 clip hole at 64 mm pitch, so the existing
  white rod clips bolt on unchanged.
- Add a connector/cable relief at the connector end and keep the center
  airflow window; optional third mounting hole near the connector.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Turn on the connector-end Ø2.2 mounting hole so the board is screwed down
at three points (two at the camera end, one at the connector end) instead
of cantilevered off one end. Offset it ~2 mm from the width centerline per
the datasheet, and stop the airflow window short of it so the screw has a
solid seat. Offset is parametric (third_y_offset) for test-fit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The connector (like the camera/LED/MIC) is on the front side; the plate
sits behind the bare PCB back and never touches it. Enlarge the
connector-end relief into a fully open cutout so the USB plug can be
inserted and the cable routed out. Also fix the connector stand-in in the
PCB mock (it was drawn off-center) and add a plug/cable stub so the render
shows the space the connector needs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Increase clip_ear_drop 2.0 -> 4.0 mm so the clip holes sit further from
the plate, moving the rod away from the board. Rework the ear as a rounded
tab (hull from the plate edge out to the hole) so it stays fused to the
plate at any drop distance.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Redesign of the UC-844 eye-camera mount to fix two issues found on the
printed v3: the camera aimed too high and sat too far from the eye.

Changes vs v3 (uc844_mount_v3_rod_clamp.scad):
  * Removes the 24 mm rigid spine that cantilevered the frame away and
    stacked three fixed angles (the overshoot). The frame now hangs right
    off the clamp on a short forked arm.
  * Rebuilds the rod clamp with a tight bore (small squeeze) so the two
    halves close on the rod instead of sitting a large gap off it (v3 bug).
  * New rod->frame joint is a friction clevis: a centered tab on the
    frame's back is captured between two fork prongs on the mount, one
    screw on the rod-parallel axis locks the tilt. The tab hole is a
    fore/aft slot so the same screw also sets standoff (lens-to-eye).
  * Rod crosses the frame ~1/3 up from its bottom (bottom third of the
    PCB hangs below the rod), per the new geometry.
  * A back rib bridges the frame's side rails so the tab fuses to solid
    material across the open picture-frame window (world-side, never
    blocks the lens).

The square frame + 4-corner PCB screw mount is carried over unchanged
from v3. Printable bodies: "mount", "cap", "frame"; all verified manifold
(CGAL Simple: yes, single fused solid each).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
The first v4 cut fused a centered tab to the frame's back via a rib
across the window. That encroaches on the PCB back, where the USB
connector lives and where an open back helps heat dissipation.

Rework so nothing touches the frame's back:
  * The pivot bracket now grabs ONE solid side rail of the picture frame
    at ~1/3 up (neck bonded down the rail's height). frame_body() is
    unchanged - no rib, no back tab.
  * All hardware (bracket disc, arm, clamp) sits BESIDE the frame along
    the rod axis, so the entire back stays clear.
  * Joint is a single-lap friction disc: frame bracket disc bears against
    the mount disc, one M2.5 screw on the rod-parallel axis locks the
    tilt; insert in the mount disc. The disc hole is a fore/aft slot, so
    the same screw sets standoff.

Consequence: the frame hangs to one side of the clamp (~half a
frame-width) - clamp toward the temple, camera over the pupil, hardware
out of the sightline. All three bodies (mount, cap, frame) verified
manifold (CGAL Simple: yes, single fused solid each).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Add 3d-files/MEASUREMENTS.md capturing every measurement/constraint
gathered so far, so future sessions can reuse it without re-deriving:
  * Eye-cam PCB (UC-844): board size, dual 34/28 mm hole pattern, centered
    lens/imager, back-side USB connector location -> keep back open.
  * Eye-cam M12 lens: EFL/FOV/mechanical; the "100 cm macro" spec is a
    typo (bench-tested sharp to ~1 cm), so focus is not a standoff limit.
  * Glasses rod: ~2.5-3 mm tall x ~5 mm deep, rounded, ~1 inch usable
    length -> compact centered mount.
  * Aim geometry: lens ~44-51 mm from eye, eye ~19 mm behind lens plane,
    ~60 deg tilt.
  * Scene-cam PCB + clip interface (separate top-mount project).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
v5 replaces v4's side-mount (which hung the frame ~30 mm off the clamp,
past the ~1 inch of usable rod) with a centered, compact arrangement:

  clamp on the rod -> short rise arm DOWN -> friction tilt pivot (small
  clevis) at the frame's bottom edge -> frame hangs below the rod, tilted
  up so the centered lens aims at the pupil.

  * Nothing sits behind the PCB (pivot grabs only the solid bottom rail) -
    USB connector + heat stay clear; frame_body() unchanged.
  * Rod clamp retuned + shrunk for the thin rod (~2.75 x 5 mm).
  * Aim geometry is modeled in-scene from the measurements (pupil ~27 mm
    up, ~19 mm behind the lens plane): the nominal lands the lens tip
    ~44 mm from the pupil at ~45 deg up-tilt, and echo() prints the
    tip->pupil distance/angle. Tilt (pivot) + standoff (slot) + M12
    refocus tune it on the face.

Also record the new measurements (pupil height 27 mm, rod spacing 46 mm)
in MEASUREMENTS.md. All three printed bodies verified manifold.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Address two issues found in review of the first v5 nominal:
  * The camera's sight line to the pupil clipped the clamp. Fix has two
    parts: (a) make the rod clamp ASYMMETRIC - both screws on the eye
    side (+X), world side kept thin - so it stays out of the sight line
    that rises on the world side of the rod; (b) retarget the nominal
    closer (~30 mm, tilt ~36 deg), which also lifts the lens tip above
    the clamp so the whole optical path clears. echo() reports
    tip->pupil 29.9 mm, axis 36 deg vs 35.4 deg needed (aimed at pupil).
  * Model the lens at its real datasheet size (Ø12 body, Ø14 front,
    15.86 mm long) instead of the Ø12x13 placeholder.

All three printed bodies remain manifold.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Split the eye-cam mount into separate printable parts using the ear/side-
clip pattern of the original internal-eye-cam mounts, while keeping v5's
aim pose (lens tip 30 mm from the pupil, ~38 deg, echo-verified).

  * Frame: unchanged frame_body() + two bottom attach-lugs (prints flat).
  * Arm: separate one-piece bracket - bolts to the frame's bottom lugs and
    runs up to clip-ears at the rod (Ø3.2 at the ~18.7 mm clip pitch).
    Attaching at the bottom keeps the arm below the lens/FOV and off the
    board face (an earlier top/back attach crossed the PCB window).
  * Clips: reuse existing white clips (interface still a placeholder tab).
  * Kept the eye/rod/gaze-ray mocks + added a 70 deg FOV cone to verify
    the view clears the hardware.

WIP - see uc844_mount_v6_NOTES.md for status and next steps (clip-ear
interface extraction, joint/rigidity, USB clearance, re-render + manifold).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Iterate the 3-part mount toward printable + verified:
  * Arm remodeled from round struts to a single FLAT PLATE in the tilted
    plane through the clip-ears and frame pads -> lays flat on the bed,
    prints without support, still hangs below the lens/FOV.
  * Frame bottom lugs + arm pads now share a coaxial hole along the frame
    normal (M2.5 bolt + nut lap joint); fixed the earlier non-manifold
    frame (lugs now overlap the bottom border cleanly).
  * Frame + arm both CGAL-manifold (Simple: yes). Aim unchanged
    (echo: tip->pupil 30.0 mm, 38 deg, pointed at pupil); 70 deg FOV cone
    clears the arm/clips/rod.
  * Added show="print" layout view.

Open: the clip-ear is still an approximate interface (Ø3.2 at the 18.7 mm
clip pitch) - needs exact extraction from the STEP + a physical test-fit
with the real white clips. See uc844_mount_v6_NOTES.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
New file (copied from v6, per the "major change = new version" rule; v6
left intact). Fixes v6's one-piece arm passing THROUGH the frame and the
hand-waved clip interface.

  * TWO separate arms (one per side): each has a clip-ear at the rod that
    mates the real white clip, a short body, and a pad lapping a NEW
    front-bottom frame lug. Arms stay in FRONT of / below the frame ->
    no collision (v6 bug fixed), open center for the lens, out of the FOV.
  * Real clip imported from bottom mount/*.step as clip_ref.stl; rotate
    ([90,0,0]) seats its U-channel on the rod; the clip-ear's Ø3.2 hole is
    coaxial with the clip's screw hole. Two clips at the 18.7 mm pitch.
  * Frame gains front-bottom lugs (Y bolt); frame + one arm both CGAL
    manifold. Aim unchanged (echo: tip->pupil 30.0 mm, 38 deg).
  * Kept eye/rod/gaze-ray + 70 deg FOV mocks; show=assembly|frame|arm|print.

Next: fine-tune the clip-ear mating + arm rigidity/print orientation, then
physical test-fit with the real clips.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KF1U5JFzBcD4CbzqbnSUAs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants