Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions cad/joint-design/A_anchor_bulb.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// =============================================================================
// Design A — Anchor-bulb spherical node
// =============================================================================
// PETG sphere at each tensegrity vertex with through-holes; TPU cable threads
// through and is terminated in a printed-in-place TPU bulb on the far side.
// Per Edison Phase-3 ANALYSIS 19e0c868 §3 (CAD review) geometry, which
// supersedes the earlier c38a2046 / ce84ddf8 numbers (raises bulb-to-bore
// pull-through ratio from 1.38× to 1.71×):
// - Node OD ≈ 9.5 mm (was 9.0; cleanly encases the 2.8 mm bore while
// preserving perimeter thickness)
// - Through-bore Ø ≈ 2.8 mm (0.4 mm clearance over 2.4 mm cable)
// - Bulb OD ≈ 4.8 mm (printed-in-place TPU on the far side; 1.71× bore,
// full 1.0 mm radial TPU bearing against the PETG face)
// One PETG strut enters the node from -Z; one TPU cable passes through it
// horizontally along +X, terminated in a bulb on the +X side.
// =============================================================================
include <_common.scad>

node_d = 9.5; // PETG node sphere outer diameter
bore_d = 2.8; // through-hole diameter (cable_d + 0.4 mm clearance)
bulb_d = 4.8; // TPU bulb outer diameter at far end of cable (1.71× bore)
bulb_off = node_d/2 + 1.5; // bulb center distance from node center along +X

module designA_petg() {
difference() {
union() {
sphere(d=node_d);
translate([0, 0, -strut_l]) cylinder(h=strut_l, d=strut_d);
}
// Horizontal cable bore along +X (clear right through the node)
translate([-node_d, 0, 0]) rotate([0, 90, 0])
cylinder(h=2*node_d, d=bore_d);
}
}

module designA_tpu() {
// Cable on the entry (-X) side
translate([-cable_l, 0, 0]) rotate([0, 90, 0])
cylinder(h=cable_l, d=cable_d);
// Cable through the bore + a short stub past the bulb's near face
translate([-node_d/2 - 0.1, 0, 0]) rotate([0, 90, 0])
cylinder(h=node_d + 1.5, d=cable_d);
// Anchor bulb on the +X side
translate([bulb_off, 0, 0]) sphere(d=bulb_d);
}

module designA() {
petg() designA_petg();
tpu() designA_tpu();
}

designA();
9 changes: 9 additions & 0 deletions cad/joint-design/A_anchor_bulb_section_X.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Section view of Design A — cut at the X=0 plane, keep +X half (cut at X=0).
// Apply intersection per-color part so PETG/TPU colors survive the CSG.
include <_common.scad>
use <A_anchor_bulb.scad>

module half_cube_X() { translate([0, -30, -40]) cube([60, 60, 60]); }

petg() intersection() { designA_petg(); half_cube_X(); }
tpu() intersection() { designA_tpu(); half_cube_X(); }
10 changes: 10 additions & 0 deletions cad/joint-design/A_anchor_bulb_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view of Design A — anchor-bulb spherical node cut at Y=0 (keep
// -Y half so the camera at -Y sees the cut face). Apply intersection
// per-color part so PETG/TPU colors survive the CSG operation.
include <_common.scad>
use <A_anchor_bulb.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA_petg(); half_cube_negY(); }
tpu() intersection() { designA_tpu(); half_cube_negY(); }
9 changes: 9 additions & 0 deletions cad/joint-design/A_anchor_bulb_section_Z.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Section view of Design A — cut at the Z=0 plane, keep +Z half above the joint mid-plane (cut at Z=-2).
// Apply intersection per-color part so PETG/TPU colors survive the CSG.
include <_common.scad>
use <A_anchor_bulb.scad>

module half_cube_Z() { translate([-30, -30, -2]) cube([60, 60, 60]); }

petg() intersection() { designA_petg(); half_cube_Z(); }
tpu() intersection() { designA_tpu(); half_cube_Z(); }
25 changes: 25 additions & 0 deletions cad/joint-design/A_variants/A0_sphere.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// =============================================================================
// Design A0 — Reference: spherical bulb (the original Phase-3 geometry)
// =============================================================================
// Included here purely as the visual baseline so the four alternative upset
// shapes (frustum, torus, countersunk, lobed, mushroom) have something to
// be montaged against. Geometry is identical to `A_anchor_bulb.scad`.
// =============================================================================
include <_common_variants.scad>

bulb_d = upset_od; // 4.8 mm sphere upset
bulb_off = upset_x + bulb_d/2 - 0.5; // a little embedded into the +X face

module designA0_petg() { nodeA_petg(); }

module designA0_tpu() {
nodeA_tpu_cable();
translate([bulb_off, 0, 0]) sphere(d=bulb_d);
}

module designA0() {
petg() designA0_petg();
tpu() designA0_tpu();
}

designA0();
10 changes: 10 additions & 0 deletions cad/joint-design/A_variants/A0_sphere_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view (cut at Y=0) for variant A0_sphere. Keep -Y half so the camera
// at -Y sees the cut face. Apply intersection per-color part so the
// PETG/TPU colours survive the CSG operation.
include <_common_variants.scad>
use <A0_sphere.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA0_petg(); half_cube_negY(); }
tpu() intersection() { designA0_tpu(); half_cube_negY(); }
40 changes: 40 additions & 0 deletions cad/joint-design/A_variants/A1_frustum.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// =============================================================================
// Design A1 — Truncated cone / frustum (rivet-head) upset
// =============================================================================
// Replaces the spherical bulb of the reference design with a flat-topped
// frustum so the TPU bears against the PETG/PLA face on a flat annulus
// instead of a curved spherical cap. The flat top also lays down cleanly
// under the H2D top-layer pass (no curved free surface).
//
// Shape parameters:
// - Base OD (against the PETG face) = upset_od (4.8 mm) → preserves the
// 1.71× pull-through ratio of the reference geometry.
// - Top OD = 3.6 mm (75 % of base) → gentle 30°
// half-angle, self-supporting in TPU 85A on a Bambu H2D without supports.
// - Height = 2.4 mm → ~6 layers at 0.4 mm.
// Bearing area (flat annulus between bore Ø 2.8 and base Ø 4.8) = 6.0 mm²
// (vs. ≈3.4 mm² projected bearing on the reference sphere) → ~75 % more
// load-spreading area at the same OD.
// =============================================================================
include <_common_variants.scad>

base_d = upset_od; // 4.8 mm at the PETG face
top_d = 3.6; // 75 % of base — 30° half-angle
height = 2.4; // 6 layers at 0.4 mm
base_x = upset_x - 0.3; // a touch embedded in the +X face for fusion

module designA1_petg() { nodeA_petg(); }

module designA1_tpu() {
nodeA_tpu_cable();
// Frustum aligned with the cable axis (+X).
translate([base_x, 0, 0]) rotate([0, 90, 0])
cylinder(h=height, d1=base_d, d2=top_d);
}

module designA1() {
petg() designA1_petg();
tpu() designA1_tpu();
}

designA1();
10 changes: 10 additions & 0 deletions cad/joint-design/A_variants/A1_frustum_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view (cut at Y=0) for variant A1_frustum. Keep -Y half so the camera
// at -Y sees the cut face. Apply intersection per-color part so the
// PETG/TPU colours survive the CSG operation.
include <_common_variants.scad>
use <A1_frustum.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA1_petg(); half_cube_negY(); }
tpu() intersection() { designA1_tpu(); half_cube_negY(); }
47 changes: 47 additions & 0 deletions cad/joint-design/A_variants/A2_torus.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// =============================================================================
// Design A2 — Toroidal / donut upset
// =============================================================================
// Replaces the spherical bulb with a torus printed coaxially with the cable
// so the PETG/PLA face bears on the inner curve of the torus. The torus
// distributes the bearing load over a wider annulus than the spherical cap
// of the reference design, giving a lower peak contact stress under the
// repeated drops of the lander demo (#16).
//
// Shape parameters:
// - Major OD = upset_od (4.8 mm) → preserves the 1.71× pull-through ratio
// - Tube Ø = 1.8 mm → 3-perimeter wall in TPU at 0.4 mm nozzle
// - Major R = (major_od - tube_d) / 2 = 1.5 mm
// The cable shaft passes through the hole in the centre of the torus; the
// inner radius of the torus (= 0.6 mm) is < cable radius (1.2 mm) so the
// torus wraps around and grips the cable shaft — this is what closes the
// load path against the PETG/PLA face.
// =============================================================================
include <_common_variants.scad>

major_od = upset_od; // 4.8 mm overall OD
tube_d = 1.8; // 3-perimeter wall at 0.4 mm nozzle
major_r = (major_od - tube_d)/2;
torus_x = upset_x + tube_d/2; // bearing face flush against +X of node

module torus(major_r, tube_d) {
rotate_extrude(convexity=4)
translate([major_r, 0, 0])
circle(d=tube_d);
}

module designA2_petg() { nodeA_petg(); }

module designA2_tpu() {
nodeA_tpu_cable();
// Torus axis coincides with the cable axis (+X) — rotate the XY-plane
// torus 90° about Y so it sits with its hole facing -X.
translate([torus_x, 0, 0]) rotate([0, 90, 0])
torus(major_r, tube_d);
}

module designA2() {
petg() designA2_petg();
tpu() designA2_tpu();
}

designA2();
10 changes: 10 additions & 0 deletions cad/joint-design/A_variants/A2_torus_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view (cut at Y=0) for variant A2_torus. Keep -Y half so the camera
// at -Y sees the cut face. Apply intersection per-color part so the
// PETG/TPU colours survive the CSG operation.
include <_common_variants.scad>
use <A2_torus.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA2_petg(); half_cube_negY(); }
tpu() intersection() { designA2_tpu(); half_cube_negY(); }
52 changes: 52 additions & 0 deletions cad/joint-design/A_variants/A3_countersunk.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// =============================================================================
// Design A3 — Conical (countersunk) head — flush, self-centring
// =============================================================================
// Replaces the protruding bulb with a conical TPU head that mates a matching
// countersink cut into the +X exit of the PETG/PLA bore. The result is a
// flush far face (no protruding feature to snag on impact) and the cone
// self-centres the cable in the bore as the joint loads up.
//
// Shape parameters (90° included angle, standard ANSI flat-head):
// - Countersink mouth Ø = upset_od (4.8 mm) at the +X face
// - Cone bottom Ø = bore_d (2.8 mm) where it meets the cable
// - Half-angle = 45° → cone axial depth = (4.8-2.8)/2 = 1.0 mm
// - Total head height = 1.6 mm (1.0 mm cone + 0.6 mm flat top, just so
// the head is clearly visible in the iso
// render — set to 0.0 for true flush)
// Functional bearing area is the full conical wall = π·(R+r)·s ≈ 8.8 mm²
// (vs. ≈3.4 mm² projected on the reference sphere) → ~2.6× more bearing
// area at the same OD.
// =============================================================================
include <_common_variants.scad>

cs_mouth_d = upset_od; // 4.8 mm at the +X face
cs_root_d = bore_d; // 2.8 mm where the cable shaft enters
cs_depth = (cs_mouth_d - cs_root_d) / 2; // 45° → 1.0 mm
head_top_h = 0.6; // 0 = perfectly flush; nonzero for visibility

module designA3_petg() {
difference() {
nodeA_petg();
// Cut a 45° countersink into the +X face: narrow (root) end deeper
// inside the node, wide (mouth) end at the +X face.
translate([upset_x - cs_depth, 0, 0]) rotate([0, 90, 0])
cylinder(h=cs_depth + 0.01, d1=cs_root_d, d2=cs_mouth_d);
}
}

module designA3_tpu() {
nodeA_tpu_cable();
// Conical head filling the countersink (root at -X, mouth at +X face),
// plus a thin flat top extending past the +X face for visibility.
translate([upset_x - cs_depth, 0, 0]) rotate([0, 90, 0])
cylinder(h=cs_depth, d1=cs_root_d, d2=cs_mouth_d);
translate([upset_x, 0, 0]) rotate([0, 90, 0])
cylinder(h=head_top_h, d=cs_mouth_d);
}

module designA3() {
petg() designA3_petg();
tpu() designA3_tpu();
}

designA3();
10 changes: 10 additions & 0 deletions cad/joint-design/A_variants/A3_countersunk_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view (cut at Y=0) for variant A3_countersunk. Keep -Y half so the camera
// at -Y sees the cut face. Apply intersection per-color part so the
// PETG/TPU colours survive the CSG operation.
include <_common_variants.scad>
use <A3_countersunk.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA3_petg(); half_cube_negY(); }
tpu() intersection() { designA3_tpu(); half_cube_negY(); }
61 changes: 61 additions & 0 deletions cad/joint-design/A_variants/A4_lobed.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// =============================================================================
// Design A4 — Star / lobed / knurled head (rotational keying)
// =============================================================================
// Replaces the spherical bulb with a 6-lobed star head so the upset can't
// rotate relative to the bore under repeated drops. This is what the lander
// demo (#16) Bruceton n≥20 reuse case actually wants — every drop
// reseats the joint at a slightly different angle, and a smooth bulb just
// spins; a lobed head torsionally keys against the bore exit.
//
// Shape parameters:
// - Bounding OD = upset_od (4.8 mm) → preserves 1.71× ratio
// - Lobe count = 6
// - Lobe Ø (each) = 1.6 mm → 4-perimeter feature in TPU at 0.4 mm
// - Lobe centre radius = 1.4 mm from cable axis
// - Head thickness = 1.6 mm along +X
// The PETG/PLA bore is left round (Ø 2.8 mm); the lobes engage the +X face
// of the node when the cable pulls in -X. Optionally one could match the
// bore mouth with a 6-lobe profile to fully constrain rotation; here we
// leave the bore round so the joint stays drop-in compatible with the
// reference geometry and only change the head.
// =============================================================================
include <_common_variants.scad>

bound_d = upset_od; // 4.8 mm bounding circle
lobes = 6;
lobe_d = 1.6;
lobe_r = (bound_d - lobe_d) / 2; // 1.6 mm centre offset → 4.8 mm bound
head_th = 1.6; // 4 layers at 0.4 mm
head_x = upset_x - 0.3; // a touch embedded in the +X face

module star_head(thickness, lobes, lobe_d, lobe_r, hub_d) {
// 2D star + central hub, then linear-extruded along +Z.
linear_extrude(height=thickness, convexity=8) {
union() {
circle(d=hub_d);
for (i = [0:lobes-1]) {
rotate([0, 0, i * 360 / lobes])
translate([lobe_r, 0, 0])
circle(d=lobe_d);
}
}
}
}

module designA4_petg() { nodeA_petg(); }

module designA4_tpu() {
nodeA_tpu_cable();
// Lobed disc on the cable axis (+X). Hub Ø ≥ bore so the head fully
// covers the bore exit; lobes radiate outward in the Y-Z plane.
translate([head_x, 0, 0]) rotate([0, 90, 0])
star_head(thickness=head_th, lobes=lobes, lobe_d=lobe_d,
lobe_r=lobe_r, hub_d=bore_d + 0.6);
}

module designA4() {
petg() designA4_petg();
tpu() designA4_tpu();
}

designA4();
10 changes: 10 additions & 0 deletions cad/joint-design/A_variants/A4_lobed_section_Y.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Section view (cut at Y=0) for variant A4_lobed. Keep -Y half so the camera
// at -Y sees the cut face. Apply intersection per-color part so the
// PETG/TPU colours survive the CSG operation.
include <_common_variants.scad>
use <A4_lobed.scad>

module half_cube_negY() { translate([-30, -30, -40]) cube([60, 30, 60]); }

petg() intersection() { designA4_petg(); half_cube_negY(); }
tpu() intersection() { designA4_tpu(); half_cube_negY(); }
Loading