Skip to content

Commit df0f54d

Browse files
committed
Add parametric pivot mount assembly and welding jig
Introduces a fully parametric, replaceable pivot mount assembly for the loader arm, including new OpenSCAD modules for the assembly, arm plate slot, and bolt pattern. Updates arm plate and loader arm modules to support the new assembly, with non-uniform bolt spacing and proper clearances. Adds a 3D printed welding jig for accurate fabrication. All relevant parameters are centralized in lifetrac_v25_params.scad for consistency and easier modification.
1 parent 95698bb commit df0f54d

File tree

5 files changed

+764
-18
lines changed

5 files changed

+764
-18
lines changed
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
// pivot_mount_welding_jig.scad
2+
// 3D Printed Welding Jig for Pivot Mount Assembly
3+
// Part of LifeTrac v25 OpenSCAD design
4+
//
5+
// This jig holds the two circular plates and DOM tube in proper alignment
6+
// during welding. It ensures:
7+
// - Correct spacing between plates (arm tube width)
8+
// - DOM tube centered on both plates
9+
// - Plates perpendicular to DOM tube
10+
// - Access for welding around the DOM-to-plate joints
11+
12+
include <../lifetrac_v25_params.scad>
13+
14+
// =============================================================================
15+
// JIG PARAMETERS
16+
// =============================================================================
17+
18+
// Inherit from params file
19+
// JIG_WALL_THICKNESS = 4; // Standard wall for 3D printed parts
20+
// JIG_CLEARANCE = 0.5; // Fit clearance
21+
22+
// Pivot mount dimensions (use params if available, else fallback)
23+
_JIG_PIVOT_PLATE_DIA = is_undef(PIVOT_MOUNT_PLATE_DIA) ? 152.4 : PIVOT_MOUNT_PLATE_DIA;
24+
_JIG_PIVOT_PLATE_THICK = is_undef(PIVOT_MOUNT_PLATE_THICK) ? PLATE_1_4_INCH : PIVOT_MOUNT_PLATE_THICK;
25+
_JIG_PIVOT_WIDTH = is_undef(PIVOT_MOUNT_WIDTH) ? TUBE_2X6_1_4[0] : PIVOT_MOUNT_WIDTH;
26+
_JIG_PIVOT_BOLT_CIRCLE_DIA = is_undef(PIVOT_MOUNT_BOLT_CIRCLE_DIA) ? 114.3 : PIVOT_MOUNT_BOLT_CIRCLE_DIA;
27+
_JIG_PIVOT_CLEARANCE = is_undef(PIVOT_MOUNT_CLEARANCE) ? 25.4 : PIVOT_MOUNT_CLEARANCE;
28+
29+
// Jig dimensions
30+
JIG_BASE_THICK = 8; // Base plate thickness
31+
JIG_SUPPORT_HEIGHT = 30; // Height of plate supports
32+
JIG_FINGER_COUNT = 6; // Number of support fingers around plate
33+
JIG_FINGER_WIDTH = 20; // Width of each support finger
34+
JIG_FINGER_THICKNESS = JIG_WALL_THICKNESS;
35+
36+
// DOM alignment features
37+
DOM_CRADLE_DEPTH = 15; // How deep the DOM sits in cradle
38+
DOM_CRADLE_ANGLE = 120; // Arc angle of DOM cradle (degrees)
39+
40+
// Clearance for welding access
41+
WELD_ACCESS_GAP = 25; // Gap between jig parts for welder access
42+
43+
// =============================================================================
44+
// JIG BASE PLATE MODULE
45+
// =============================================================================
46+
47+
module jig_base_plate() {
48+
// Base plate that sits under the assembly
49+
// Has cradle for DOM tube and supports for circular plates
50+
51+
base_length = _JIG_PIVOT_WIDTH + _JIG_PIVOT_PLATE_DIA + 40;
52+
base_width = _JIG_PIVOT_PLATE_DIA + 40;
53+
54+
difference() {
55+
union() {
56+
// Main base plate
57+
translate([-base_length/2, -base_width/2, 0])
58+
cube([base_length, base_width, JIG_BASE_THICK]);
59+
60+
// DOM tube cradle (V-shaped supports at ends)
61+
// Left cradle
62+
translate([-_JIG_PIVOT_WIDTH/2 - 10, 0, JIG_BASE_THICK])
63+
dom_cradle_support();
64+
65+
// Right cradle
66+
translate([_JIG_PIVOT_WIDTH/2 + 10, 0, JIG_BASE_THICK])
67+
dom_cradle_support();
68+
}
69+
70+
// Cutout center for weight reduction and ventilation
71+
translate([0, 0, -1])
72+
cylinder(d=_JIG_PIVOT_PLATE_DIA - 60, h=JIG_BASE_THICK + 2, $fn=48);
73+
}
74+
}
75+
76+
// =============================================================================
77+
// DOM CRADLE SUPPORT MODULE
78+
// =============================================================================
79+
80+
module dom_cradle_support() {
81+
// V-shaped cradle to hold DOM tube at correct height
82+
// DOM center should be at plate center height
83+
84+
cradle_height = DOM_PIPE_OD/2 + DOM_CRADLE_DEPTH;
85+
cradle_width = DOM_PIPE_OD + JIG_WALL_THICKNESS * 2;
86+
87+
difference() {
88+
// Outer block
89+
translate([-15, -cradle_width/2, 0])
90+
cube([30, cradle_width, cradle_height]);
91+
92+
// DOM tube cutout (with clearance)
93+
translate([0, 0, cradle_height])
94+
rotate([0, 90, 0])
95+
cylinder(d=DOM_PIPE_OD + JIG_CLEARANCE*2, h=50, center=true, $fn=48);
96+
97+
// V-notch for easier tube placement
98+
translate([0, 0, cradle_height + 10])
99+
rotate([0, 90, 0])
100+
cylinder(d=DOM_PIPE_OD * 1.5, h=50, center=true, $fn=48);
101+
}
102+
}
103+
104+
// =============================================================================
105+
// PLATE ALIGNMENT RING MODULE
106+
// =============================================================================
107+
108+
module plate_alignment_ring(inner=false) {
109+
// Ring that fits around the circular plate edge
110+
// Holds plate perpendicular and centered
111+
// Has gaps for welding access
112+
113+
ring_id = _JIG_PIVOT_PLATE_DIA + JIG_CLEARANCE * 2;
114+
ring_od = ring_id + JIG_WALL_THICKNESS * 2 + 10;
115+
ring_height = _JIG_PIVOT_PLATE_THICK + JIG_SUPPORT_HEIGHT;
116+
117+
// Support ledge for plate to sit on
118+
ledge_height = JIG_SUPPORT_HEIGHT;
119+
ledge_width = 8;
120+
121+
difference() {
122+
union() {
123+
// Main ring
124+
difference() {
125+
cylinder(d=ring_od, h=ring_height, $fn=64);
126+
translate([0, 0, -1])
127+
cylinder(d=ring_id, h=ring_height + 2, $fn=64);
128+
}
129+
130+
// Inner support ledge (plate sits on this)
131+
translate([0, 0, 0])
132+
difference() {
133+
cylinder(d=ring_id, h=ledge_height, $fn=64);
134+
translate([0, 0, -1])
135+
cylinder(d=ring_id - ledge_width*2, h=ledge_height + 2, $fn=64);
136+
}
137+
}
138+
139+
// Welding access gaps (4 equally spaced)
140+
for (i = [0:3]) {
141+
angle = i * 90 + 45;
142+
rotate([0, 0, angle])
143+
translate([0, 0, ledge_height])
144+
cube([ring_od + 2, WELD_ACCESS_GAP, ring_height], center=true);
145+
}
146+
147+
// Center hole for DOM tube (with clearance)
148+
translate([0, 0, -1])
149+
cylinder(d=DOM_PIPE_OD + JIG_CLEARANCE * 4, h=ring_height + 2, $fn=48);
150+
151+
// Bolt hole clearances (so jig doesn't interfere with bolt holes)
152+
for (i = [0:5]) {
153+
angle = i * 60;
154+
bx = (_JIG_PIVOT_BOLT_CIRCLE_DIA / 2) * cos(angle);
155+
by = (_JIG_PIVOT_BOLT_CIRCLE_DIA / 2) * sin(angle);
156+
translate([bx, by, -1])
157+
cylinder(d=BOLT_DIA_1_2 + 5, h=ring_height + 2, $fn=24);
158+
}
159+
}
160+
}
161+
162+
// =============================================================================
163+
// COMPLETE JIG ASSEMBLY MODULE
164+
// =============================================================================
165+
166+
module pivot_mount_welding_jig_assembly(show_parts=true) {
167+
// Complete jig showing all components
168+
// Set show_parts=true to see the pivot mount parts in position
169+
170+
color("Orange", 0.8) {
171+
// Base with DOM cradles
172+
jig_base_plate();
173+
174+
// Left plate alignment ring
175+
translate([-_JIG_PIVOT_WIDTH/2 - _JIG_PIVOT_PLATE_THICK, 0, JIG_BASE_THICK])
176+
rotate([0, 90, 0])
177+
plate_alignment_ring();
178+
179+
// Right plate alignment ring
180+
translate([_JIG_PIVOT_WIDTH/2, 0, JIG_BASE_THICK])
181+
rotate([0, 90, 0])
182+
plate_alignment_ring();
183+
}
184+
185+
// Show the parts in position
186+
if (show_parts) {
187+
// DOM tube cradle height
188+
dom_z = JIG_BASE_THICK + DOM_PIPE_OD/2 + DOM_CRADLE_DEPTH;
189+
190+
color("SteelBlue", 0.6) {
191+
// DOM tube
192+
translate([0, 0, dom_z])
193+
rotate([0, 90, 0])
194+
difference() {
195+
cylinder(d=DOM_PIPE_OD, h=_JIG_PIVOT_WIDTH, center=true, $fn=48);
196+
cylinder(d=DOM_PIPE_ID, h=_JIG_PIVOT_WIDTH + 2, center=true, $fn=48);
197+
}
198+
199+
// Left plate
200+
translate([-_JIG_PIVOT_WIDTH/2, 0, dom_z])
201+
rotate([0, 90, 0])
202+
difference() {
203+
cylinder(d=_JIG_PIVOT_PLATE_DIA, h=_JIG_PIVOT_PLATE_THICK, $fn=64);
204+
cylinder(d=DOM_PIPE_OD, h=_JIG_PIVOT_PLATE_THICK + 1, $fn=48);
205+
}
206+
207+
// Right plate
208+
translate([_JIG_PIVOT_WIDTH/2 - _JIG_PIVOT_PLATE_THICK, 0, dom_z])
209+
rotate([0, 90, 0])
210+
difference() {
211+
cylinder(d=_JIG_PIVOT_PLATE_DIA, h=_JIG_PIVOT_PLATE_THICK, $fn=64);
212+
cylinder(d=DOM_PIPE_OD, h=_JIG_PIVOT_PLATE_THICK + 1, $fn=48);
213+
}
214+
}
215+
}
216+
}
217+
218+
// =============================================================================
219+
// INDIVIDUAL PRINTABLE COMPONENTS
220+
// =============================================================================
221+
222+
module jig_base_printable() {
223+
// Base plate oriented for printing (flat on bed)
224+
jig_base_plate();
225+
}
226+
227+
module jig_ring_printable() {
228+
// Alignment ring oriented for printing
229+
// Printed standing up for strength
230+
plate_alignment_ring();
231+
}
232+
233+
// =============================================================================
234+
// EXPLODED VIEW FOR DOCUMENTATION
235+
// =============================================================================
236+
237+
module pivot_mount_welding_jig_exploded() {
238+
explode = 80;
239+
240+
color("Orange", 0.8) {
241+
// Base
242+
jig_base_plate();
243+
244+
// Left ring (exploded)
245+
translate([-_JIG_PIVOT_WIDTH/2 - _JIG_PIVOT_PLATE_THICK - explode, 0, JIG_BASE_THICK])
246+
rotate([0, 90, 0])
247+
plate_alignment_ring();
248+
249+
// Right ring (exploded)
250+
translate([_JIG_PIVOT_WIDTH/2 + explode, 0, JIG_BASE_THICK])
251+
rotate([0, 90, 0])
252+
plate_alignment_ring();
253+
}
254+
}
255+
256+
// =============================================================================
257+
// RENDER PREVIEW
258+
// =============================================================================
259+
260+
$fn = 32;
261+
262+
echo("=== PIVOT MOUNT WELDING JIG SPECIFICATIONS ===");
263+
echo("Jig Base Thickness:", JIG_BASE_THICK, "mm");
264+
echo("Support Ring Height:", JIG_SUPPORT_HEIGHT, "mm");
265+
echo("Wall Thickness:", JIG_WALL_THICKNESS, "mm");
266+
echo("DOM Cradle Depth:", DOM_CRADLE_DEPTH, "mm");
267+
echo("Weld Access Gap:", WELD_ACCESS_GAP, "mm");
268+
echo("");
269+
echo("Parts to print:");
270+
echo(" 1x Base plate");
271+
echo(" 2x Alignment rings");
272+
273+
// Show complete assembly with parts
274+
pivot_mount_welding_jig_assembly(show_parts=true);
275+
276+
// Show individual printable parts below
277+
translate([0, -250, 0]) {
278+
translate([-100, 0, 0])
279+
jig_base_printable();
280+
281+
translate([100, 0, 0])
282+
jig_ring_printable();
283+
284+
translate([100, 100, 0])
285+
jig_ring_printable();
286+
}

LifeTrac-v25/mechanical_design/openscad/lifetrac_v25_params.scad

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,81 @@ DOM_PIPE_ID = 38.1; // ID matching 1.5" pivot pin
127127
JIG_WALL_THICKNESS = 4; // Standard wall thickness for 3D printed jigs
128128
JIG_CLEARANCE = 0.5; // Clearance for fit
129129

130+
// Tube bolt hole positioning
131+
TUBE_BOLT_INSET = 50.8; // 2" distance from tube edge to NEAREST bolt
132+
133+
// =============================================================================
134+
// PIVOT MOUNT ASSEMBLY PARAMETERS
135+
// =============================================================================
136+
// Replaceable pivot mount assembly that slides into arm from bottom
137+
// Consists of 2 circular plates welded to a DOM tube section
138+
139+
PIVOT_MOUNT_PLATE_DIA = 152.4; // 6" = 152.4mm diameter circular plates
140+
PIVOT_MOUNT_PLATE_THICK = PLATE_1_4_INCH; // 1/4" plate thickness
141+
PIVOT_MOUNT_BOLT_COUNT = 5; // Number of bolts per plate
142+
PIVOT_MOUNT_BOLT_DIA = BOLT_DIA_1_2; // 1/2" mounting bolts
143+
PIVOT_MOUNT_BOLT_CIRCLE_DIA = 114.3; // 4.5" bolt circle diameter
144+
145+
// Slot position and NON-UNIFORM bolt spacing
146+
// Slot is at bottom (270°) for DOM to slide in from below
147+
// In arm plate coordinates: 0°=right (toward arm tip), 90°=up, 180°=left, 270°=down (toward slot)
148+
PIVOT_MOUNT_SLOT_ANGLE = 270; // Angle where DOM slot is located (bottom)
149+
PIVOT_MOUNT_BOLT_SLOT_CLEARANCE = 127; // 5" total arc clearance across slot for bolts (2.5" each side)
150+
151+
// Calculate slot gap angle from clearance distance
152+
// Arc length = radius × angle(radians), so angle(deg) = clearance / radius × 180/π
153+
_pivot_bolt_radius = PIVOT_MOUNT_BOLT_CIRCLE_DIA / 2; // 57.15mm
154+
PIVOT_MOUNT_SLOT_GAP_ANGLE = PIVOT_MOUNT_BOLT_SLOT_CLEARANCE / _pivot_bolt_radius * 180 / PI; // ~50.9° for 2"
155+
156+
// Non-uniform spacing: slot gap is larger, remaining bolts are closer
157+
// With N bolts: 1 slot gap + (N-1) regular gaps = 360°
158+
// regular_gap = (360° - slot_gap) / (N-1)
159+
_pivot_regular_gap = (360 - PIVOT_MOUNT_SLOT_GAP_ANGLE) / (PIVOT_MOUNT_BOLT_COUNT - 1);
160+
161+
// Calculate bolt angles array
162+
// Two bolts flank the slot at: slot_angle ± half_slot_gap
163+
// Bolt A (CCW from slot): slot_angle - half_gap = 270° - 25.45° ≈ 244.55°
164+
// Bolt B (CW from slot): slot_angle + half_gap = 270° + 25.45° ≈ 295.45°
165+
// Remaining bolts fill in with regular spacing going CCW from Bolt B
166+
_half_slot_gap = PIVOT_MOUNT_SLOT_GAP_ANGLE / 2;
167+
_bolt_A_angle = PIVOT_MOUNT_SLOT_ANGLE - _half_slot_gap; // ~244.55° (lower-left, just before slot)
168+
_bolt_B_angle = PIVOT_MOUNT_SLOT_ANGLE + _half_slot_gap; // ~295.45° (lower-right, just after slot)
169+
170+
// Build array: start at Bolt B (after slot), go CCW around, end at Bolt A (before slot)
171+
PIVOT_MOUNT_BOLT_ANGLES = [
172+
for (i = [0:PIVOT_MOUNT_BOLT_COUNT-1])
173+
_bolt_B_angle + i * _pivot_regular_gap
174+
];
175+
// Result for 5 bolts: [295.45, 372.7, 449.9, 527.2, 604.4] = [295.45°, 12.7°, 89.9°, 167.2°, 244.4°]
176+
// Bolt 0 (295.45°) and Bolt 4 (244.4°) flank the 270° slot
177+
178+
// Echo clearance info for verification
179+
echo("=== PIVOT MOUNT BOLT PATTERN ===");
180+
echo(str("Slot at: ", PIVOT_MOUNT_SLOT_ANGLE, "° (bottom of arm)"));
181+
echo(str("Slot gap: ", round(PIVOT_MOUNT_SLOT_GAP_ANGLE * 10) / 10, "° (",
182+
round(PIVOT_MOUNT_BOLT_SLOT_CLEARANCE * 10) / 10, "mm arc)"));
183+
echo(str("Regular gap: ", round(_pivot_regular_gap * 10) / 10, "°"));
184+
echo(str("Bolt flanking slot (CCW): ", round(_bolt_A_angle * 10) / 10, "° (lower-left)"));
185+
echo(str("Bolt flanking slot (CW): ", round(_bolt_B_angle * 10) / 10, "° (lower-right)"));
186+
echo("All bolt angles (raw): ", PIVOT_MOUNT_BOLT_ANGLES);
187+
188+
PIVOT_MOUNT_WIDTH = TUBE_2X6_1_4[0]; // Assembly width = arm tube width (50.8mm/2")
189+
PIVOT_MOUNT_DOM_LENGTH = PIVOT_MOUNT_WIDTH; // DOM tube length between plates
190+
PIVOT_MOUNT_CLEARANCE = 25.4; // 1" clearance from plate OD to tube start
191+
192+
// Weld parameters - torus (donut) shape at DOM-to-plate joints
193+
PIVOT_MOUNT_WELD_DIA = 6.35; // 0.25" diameter of weld bead (torus cross-section)
194+
// Weld torus center is at DOM OD radius, so weld OD = DOM_OD + weld_dia
195+
PIVOT_MOUNT_WELD_OD = DOM_PIPE_OD + PIVOT_MOUNT_WELD_DIA; // ~57.15mm
196+
197+
// Slot cutout diameter = weld OD + 1/4" clearance
198+
PIVOT_MOUNT_WELD_SLOT_CLEARANCE = 6.35; // 0.25" clearance around weld in slot cutout
199+
PIVOT_MOUNT_SLOT_DIA = PIVOT_MOUNT_WELD_OD + PIVOT_MOUNT_WELD_SLOT_CLEARANCE; // ~63.5mm
200+
201+
// Calculate tube start offset from pivot center
202+
// Tube starts at: plate radius + clearance = 76.2 + 25.4 = 101.6mm
203+
PIVOT_MOUNT_TUBE_START = PIVOT_MOUNT_PLATE_DIA/2 + PIVOT_MOUNT_CLEARANCE;
204+
130205
// Define ARM_MIN_ANGLE and ARM_MAX_ANGLE later after geometry is calculated
131206
// ARM_MIN_ANGLE = -ARM_GROUND_ANGLE; // Lowest position (at ground)
132207
// ARM_MAX_ANGLE = 60; // Maximum raised position
@@ -323,7 +398,9 @@ _bend_rad = (180 - ARM_SHAPE_ANGLE);
323398
_geom_correction = _tube_offset * (sin(_bend_rad) - (1 - cos(_bend_rad)) / tan(_bend_rad));
324399

325400
// Set Lengths
326-
ARM_OVERLAP = 76.2;
401+
// ARM_OVERLAP defines how far the plate extends behind the tube start
402+
// Updated to account for 6" pivot mount plate + 1" clearance
403+
ARM_OVERLAP = PIVOT_MOUNT_PLATE_DIA/2 + PIVOT_MOUNT_CLEARANCE; // 76.2 + 25.4 = 101.6mm
327404
ARM_MAIN_LEN = _L_main_kinematic - ARM_OVERLAP + _geom_correction;
328405

329406
ARM_DROP_EXT = 80;

0 commit comments

Comments
 (0)