Add parametric OpenSCAD mount for UC-844 eye camera - #36
Open
danielkaijzer wants to merge 29 commits into
Open
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.