|
| 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 | +} |
0 commit comments