Skip to content

Commit 9897418

Browse files
committed
Revise platform bolt patterns and alignments
Updated the platform deck, angle iron, and pivot bracket modules to use new bolt patterns and offsets for improved alignment and assembly. Added a third bolt to transverse angles, moved side angle and bracket bolts to new positions with defined offsets, and synchronized hole locations across deck, angle iron, and bracket parts. Introduced new parameters for side gap and bolt offsets in lifetrac_v25_params.scad to ensure consistent spacing and collision avoidance.
1 parent 4b65e7f commit 9897418

File tree

4 files changed

+184
-47
lines changed

4 files changed

+184
-47
lines changed

LifeTrac-v25/mechanical_design/openscad/lifetrac_v25.scad

Lines changed: 102 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,8 +2414,8 @@ module platform_transverse_angle(length) {
24142414
}
24152415

24162416
// Deck Mounting Holes (Vertical through Horizontal Leg)
2417-
// 2 bolts: Near ends (aligned with side rails)
2418-
for (x_pos = [-length/2 + PLATFORM_TRANSVERSE_BOLT_END_OFFSET, length/2 - PLATFORM_TRANSVERSE_BOLT_END_OFFSET]) {
2417+
// 3 bolts: Near ends and Center
2418+
for (x_pos = [-length/2 + PLATFORM_TRANSVERSE_BOLT_END_OFFSET, 0, length/2 - PLATFORM_TRANSVERSE_BOLT_END_OFFSET]) {
24192419
translate([x_pos, leg/2, 0])
24202420
cylinder(d=angle_bolt_hole_dia, h=thick*3, center=true, $fn=24);
24212421
}
@@ -2443,19 +2443,109 @@ module platform_angle_iron(length=0, is_side=false) {
24432443
// Pivot Holes (Start) - Horizontal Holes through Vertical Leg (Leg 1)
24442444
// Leg 1 is along X. Normal Y. Holes along Y.
24452445
// 2 holes for bolts into the L shaped pivot plate
2446-
// Positions: PLATFORM_SIDE_BOLT_START and + SPACING
2447-
for (z_pos = [PLATFORM_SIDE_BOLT_START, PLATFORM_SIDE_BOLT_START + PLATFORM_SIDE_BOLT_SPACING]) {
2448-
translate([PLATFORM_ANGLE_LEG/2, PLATFORM_ANGLE_THICK/2, z_pos])
2449-
rotate([90, 0, 0]) // Align with Y axis
2446+
2447+
// Replicate calculations to align with platform_pivot_bracket
2448+
2449+
// 1. Calculate side_angle_start_y (World Y of Angle Iron Start)
2450+
// From assembly:
2451+
deck_pivot_y = PLATFORM_BRACKET_WIDTH/2;
2452+
front_angle_corner_y = deck_pivot_y - PLATFORM_EDGE_MARGIN - PLATFORM_ANGLE_LEG;
2453+
gap = 12.7;
2454+
side_angle_start_y = front_angle_corner_y - gap;
2455+
2456+
// 2. Calculate bolt positions
2457+
// Bracket bolts are on Leg 2 (File X -> Assembly -Y).
2458+
// Bracket Y is constant `bolt_y`.
2459+
// Bracket X varies: bolt_x_1, bolt_x_2.
2460+
2461+
corner_y = -PLATFORM_LOCK_OFFSET + PLATFORM_SIDE_BOLT_Y_OFFSET;
2462+
bracket_width = PLATFORM_BRACKET_WIDTH;
2463+
leg2_length = PLATFORM_BRACKET_LENGTH - bracket_width/2;
2464+
bx_1 = pivot_bolt_offset;
2465+
bx_2 = leg2_length - pivot_bolt_offset;
2466+
2467+
// 3. Map to Angle Iron Coordinates
2468+
// Angle Iron Local Z (Longitudinal) corresponds to Assembly -Y.
2469+
// Angle Iron Local X (Leg 1) corresponds to Assembly Z.
2470+
2471+
// Longitudinal Position (z_pos)
2472+
// Matches Bracket X (bx).
2473+
// z_pos = bx.
2474+
// Wait. Bracket X is distance from Pivot (along Leg 2).
2475+
// Angle Iron Z is distance from Angle Start.
2476+
// Angle Start is at side_angle_start_y.
2477+
// Pivot is at 0 (in Y).
2478+
// But Angle Iron is translated by side_angle_z_trans.
2479+
// side_angle_z_trans = PLATFORM_LOCK_OFFSET - side_angle_start_y.
2480+
// This is confusing.
2481+
// Let's use the fact that Bracket X=0 is at Corner.
2482+
// Corner is at Y = corner_y (in Bracket Local Y).
2483+
// But Bracket Leg 2 starts at X=0.
2484+
// In Assembly, Bracket Leg 2 starts at Pivot Y? No.
2485+
// Bracket Leg 2 starts at Corner Y?
2486+
// Bracket Leg 2 is the Horizontal Leg.
2487+
// It extends from Corner (Y=-130) backwards?
2488+
// No, Bracket Leg 2 is along Local X.
2489+
// Local X maps to World -Y.
2490+
// So it extends from Y=0 (Pivot) to Y=-Length?
2491+
// No, Bracket Local X=0 is at Pivot Y?
2492+
// In `platform_pivot_bracket`, X=0 is at Pivot X.
2493+
// So Bracket Leg 2 starts at Pivot X (which is 0).
2494+
// So Bracket X is distance from Pivot.
2495+
// So bx is distance from Pivot.
2496+
2497+
// Angle Iron Start is at side_angle_start_y (World Y).
2498+
// Angle Iron extends along -Y.
2499+
// So Angle Iron Z=0 is at side_angle_start_y.
2500+
// Angle Iron Z=z_pos is at Y = side_angle_start_y - z_pos.
2501+
// We want Y = -bx (since Bracket X maps to -Y).
2502+
// side_angle_start_y - z_pos = -bx.
2503+
// z_pos = side_angle_start_y + bx.
2504+
2505+
z_pos_1 = side_angle_start_y + bx_1;
2506+
z_pos_2 = side_angle_start_y + bx_2;
2507+
2508+
// Vertical Position (x_pos on profile)
2509+
// Matches Bracket Y (bolt_y).
2510+
// Bracket Y maps to World Z.
2511+
// Angle Iron X maps to World Z? No.
2512+
// Angle Iron Local X (Leg 1) -> Frame -Y -> World -Z.
2513+
// Angle Iron Local Y (Leg 2) -> Frame X -> World X.
2514+
// Angle Iron Local Z -> Frame Z -> World -Y.
2515+
2516+
// Wait. If Angle Iron Local X -> World -Z.
2517+
// Then Angle Iron X is Vertical (Down).
2518+
// Bracket Y is Vertical (Up/Down).
2519+
// Bracket Y = corner_y - width/2 + LEG/2.
2520+
// This is a negative value (e.g. -155).
2521+
// Angle Iron Origin Z is PLATFORM_ANGLE_Z_OFFSET.
2522+
// Angle Iron X is distance DOWN from Origin.
2523+
// World Z = Origin Z - Angle_X.
2524+
// Angle_X = Origin Z - World Z.
2525+
// Angle_X = PLATFORM_ANGLE_Z_OFFSET - bolt_y.
2526+
2527+
// Substitute PLATFORM_ANGLE_Z_OFFSET = corner_y - width/2 + LEG.
2528+
// Substitute bolt_y = corner_y - width/2 + LEG/2.
2529+
// Angle_X = (corner_y - width/2 + LEG) - (corner_y - width/2 + LEG/2).
2530+
// Angle_X = LEG - LEG/2 = LEG/2.
2531+
2532+
x_pos = PLATFORM_ANGLE_LEG/2;
2533+
2534+
for (z_pos = [z_pos_1, z_pos_2]) {
2535+
translate([x_pos, PLATFORM_ANGLE_THICK/2, z_pos])
2536+
rotate([0, 90, 0]) // Align with X axis
24502537
cylinder(d=angle_bolt_hole_dia, h=PLATFORM_ANGLE_THICK + 10, center=true, $fn=24);
24512538
}
24522539

24532540
// Deck Holes (Middle) - Vertical Holes through Horizontal Leg (Leg 2)
24542541
// Leg 2 is along Y. Normal X. Holes along X.
24552542
// 2 bolts upward connecting to the platform itself
2456-
// Centered on length
2457-
center_z = height / 2;
2458-
for (z_pos = [center_z - PLATFORM_SIDE_DECK_BOLT_SPACING/2, center_z + PLATFORM_SIDE_DECK_BOLT_SPACING/2]) {
2543+
// Symmetrical from end to end
2544+
// Offset from ends: PLATFORM_SIDE_DECK_BOLT_END_OFFSET
2545+
// If not defined, use 1/4 length or similar.
2546+
// Let's use a fixed offset from ends.
2547+
deck_bolt_offset = 50; // 50mm from ends
2548+
for (z_pos = [deck_bolt_offset, height - deck_bolt_offset]) {
24592549
translate([PLATFORM_ANGLE_THICK/2, PLATFORM_ANGLE_LEG/2, z_pos])
24602550
rotate([0, 90, 0]) // Align with X axis
24612551
cylinder(d=angle_bolt_hole_dia, h=PLATFORM_ANGLE_THICK + 10, center=true, $fn=24);
@@ -2464,13 +2554,9 @@ module platform_angle_iron(length=0, is_side=false) {
24642554
// Transverse Angle Iron
24652555
// Deck Holes only
24662556
// 2 bolts: Near ends
2467-
center_z = height / 2;
24682557
// Note: Transverse angle iron logic is handled by platform_transverse_angle module above
24692558
// This else block might be unused if platform_transverse_angle is used instead
24702559
// But if it IS used, we should update it too.
2471-
// However, the assembly calls platform_transverse_angle for transverse angles.
2472-
// So this block is likely dead code or for a different configuration.
2473-
// I will leave it as is or update it to match just in case.
24742560
for (z_pos = [PLATFORM_TRANSVERSE_BOLT_END_OFFSET, height - PLATFORM_TRANSVERSE_BOLT_END_OFFSET]) {
24752561
translate([PLATFORM_ANGLE_THICK/2, PLATFORM_ANGLE_LEG/2, z_pos])
24762562
rotate([0, 90, 0]) // Align with X axis
@@ -2504,8 +2590,8 @@ module folding_platform_assembly(fold_angle=90) {
25042590
// Bracket Thickness is assumed to be PLATE_1_4_INCH (6.35mm).
25052591
// Angle Iron Vertical Leg (Outer Face) should be at Bracket Inner Face.
25062592
// Bracket Inner Face X = PLATFORM_PIVOT_X - PLATE_1_4_INCH/2.
2507-
// So Angle Iron X = PLATFORM_PIVOT_X - 3.175.
2508-
angle_iron_x_from_center = PLATFORM_PIVOT_X - 3.175;
2593+
// So Angle Iron X = PLATFORM_PIVOT_X - PLATFORM_SIDE_GAP.
2594+
angle_iron_x_from_center = PLATFORM_PIVOT_X - PLATFORM_SIDE_GAP;
25092595

25102596
// Shift platform forward by 0.5 inches (12.7mm)
25112597
shift_y = 0;
@@ -2748,7 +2834,7 @@ module folding_platform_assembly(fold_angle=90) {
27482834
color("DarkSlateGray")
27492835
translate([bracket_x, pivot_y, pivot_z])
27502836
rotate([fold_angle, 0, 0])
2751-
rotate([0, -90, 0])
2837+
rotate([0, -90, 0]) // Reverted rotation: X->Z (Up), Y->Y (Back), Z->-X (Side)
27522838
linear_extrude(height=PLATFORM_THICKNESS, center=true)
27532839
projection(cut=true)
27542840
platform_pivot_bracket();

LifeTrac-v25/mechanical_design/openscad/lifetrac_v25_params.scad

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ PLATFORM_PIVOT_X = _inner_wall_x - PLATE_1_4_INCH/2;
191191
// PLATFORM_WIDTH calculated to fill distance between L plates (Pivot Brackets) with 1/8" gap
192192
// Pivot Bracket Inner Face = PLATFORM_PIVOT_X - PLATFORM_THICKNESS/2
193193
// Gap = 1/8 inch = 3.175mm
194-
PLATFORM_WIDTH = 2 * (PLATFORM_PIVOT_X - PLATFORM_THICKNESS/2 - 3.175);
194+
PLATFORM_SIDE_GAP = 3.175;
195+
PLATFORM_WIDTH = 2 * (PLATFORM_PIVOT_X - PLATFORM_THICKNESS/2 - PLATFORM_SIDE_GAP);
195196

196197
// --- Pivot bracket dimensions ---
197198
PLATFORM_BRACKET_WIDTH = 100; // Width of pivot bracket plate (mm)
@@ -215,6 +216,10 @@ PLATFORM_TRANSVERSE_BOLT_END_OFFSET = 38.1; // 1.5" offset from ends for transve
215216
PLATFORM_SIDE_DECK_BOLT_SPACING = 150; // Spacing for side angle deck bolts (mm)
216217
PLATFORM_EDGE_MARGIN = 12.7; // 1/2" margin from deck edge to angle iron (mm)
217218

219+
// --- Bolt Offsets for Collision Avoidance ---
220+
deck_bolt_offset = 50; // Distance from ends for deck bolts (mm)
221+
pivot_bolt_offset = 40; // Distance from ends for pivot bracket bolts (mm) - Increased to ensure engagement with angle iron
222+
218223
// --- Anti-slip pattern ---
219224
PLATFORM_ANTISLIP_HOLE_DIA = 15; // Diameter of anti-slip holes (mm)
220225
PLATFORM_ANTISLIP_SPACING = 80; // Spacing between anti-slip holes (mm)

LifeTrac-v25/mechanical_design/openscad/parts/platform_deck.scad

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@ module platform_deck() {
2828
bolt_hole_dia = PLATFORM_BOLT_DIA + PLATFORM_BOLT_CLEARANCE;
2929

3030
// Angle iron attachment positions (X coordinates)
31-
deck_half_width = width / 2;
32-
arm_margin = 35;
33-
arm_x_pos = min(PLATFORM_PIVOT_X, deck_half_width - arm_margin);
31+
// Aligned with the center of the angle iron leg (Leg 2)
32+
// Angle Iron Center X = PLATFORM_PIVOT_X - PLATFORM_SIDE_GAP (Gap/2)
33+
// Hole Offset from Center = PLATFORM_ANGLE_LEG/2 (Inward)
34+
// So Hole X = (PLATFORM_PIVOT_X - PLATFORM_SIDE_GAP) - PLATFORM_ANGLE_LEG/2
35+
36+
angle_iron_center_x = PLATFORM_PIVOT_X - PLATFORM_SIDE_GAP;
37+
arm_x_pos = angle_iron_center_x - PLATFORM_ANGLE_LEG/2;
3438
arm_x_left = -arm_x_pos;
3539
arm_x_right = arm_x_pos;
3640

@@ -39,12 +43,23 @@ module platform_deck() {
3943
cube([width, depth, thickness], center=true);
4044

4145
// Anti-slip hole pattern
42-
for (x = [-width/2 + PLATFORM_ANTISLIP_EDGE_MARGIN :
43-
PLATFORM_ANTISLIP_SPACING :
44-
width/2 - PLATFORM_ANTISLIP_EDGE_MARGIN]) {
45-
for (y = [-depth/2 + PLATFORM_ANTISLIP_EDGE_MARGIN :
46-
PLATFORM_ANTISLIP_SPACING :
47-
depth/2 - PLATFORM_ANTISLIP_EDGE_MARGIN]) {
46+
// Symmetrical grid calculation
47+
// Calculate number of holes that fit within margins
48+
avail_x = width - 2 * PLATFORM_ANTISLIP_EDGE_MARGIN;
49+
num_x = floor(avail_x / PLATFORM_ANTISLIP_SPACING);
50+
51+
avail_y = depth - 2 * PLATFORM_ANTISLIP_EDGE_MARGIN;
52+
num_y = floor(avail_y / PLATFORM_ANTISLIP_SPACING);
53+
54+
// Center the grid
55+
start_x = - (num_x * PLATFORM_ANTISLIP_SPACING) / 2;
56+
start_y = - (num_y * PLATFORM_ANTISLIP_SPACING) / 2;
57+
58+
for (i = [0 : num_x]) {
59+
x = start_x + i * PLATFORM_ANTISLIP_SPACING;
60+
for (j = [0 : num_y]) {
61+
y = start_y + j * PLATFORM_ANTISLIP_SPACING;
62+
4863
// Skip holes that would interfere with bolt hole areas
4964
// Expanded exclusion zones for new transverse angles
5065
if (!(abs(x - arm_x_left) < 50) &&
@@ -61,19 +76,40 @@ module platform_deck() {
6176

6277
// Left angle iron mounting holes (Side Angle)
6378
// 2 bolts upward connecting to the platform itself
64-
for (y_pos = [-PLATFORM_SIDE_DECK_BOLT_SPACING/2, PLATFORM_SIDE_DECK_BOLT_SPACING/2]) {
79+
// Symmetrical from ends of the side angle iron.
80+
81+
// Replicate assembly logic to find World Y positions
82+
_deck_pivot_y = PLATFORM_BRACKET_WIDTH/2;
83+
_deck_far_y = -(PLATFORM_DEPTH - PLATFORM_BRACKET_WIDTH/2);
84+
_front_angle_corner_y = (_deck_pivot_y - PLATFORM_EDGE_MARGIN) - PLATFORM_ANGLE_LEG;
85+
_rear_angle_corner_y = (_deck_far_y + PLATFORM_EDGE_MARGIN) + PLATFORM_ANGLE_LEG;
86+
_gap = 12.7;
87+
_side_angle_start_y = _front_angle_corner_y - _gap;
88+
_side_angle_end_y = _rear_angle_corner_y + _gap;
89+
90+
// Bolt Offset from Ends = 50mm (matching angle iron definition)
91+
_bolt_offset = 50;
92+
_bolt_1_world_y = _side_angle_start_y - _bolt_offset;
93+
_bolt_2_world_y = _side_angle_end_y + _bolt_offset;
94+
95+
// Convert World Y to Deck Y
96+
// Deck Y = -World Y - Shift
97+
// Shift = PLATFORM_DEPTH/2 - PLATFORM_BRACKET_WIDTH/2
98+
_shift = PLATFORM_DEPTH/2 - PLATFORM_BRACKET_WIDTH/2;
99+
100+
_bolt_1_deck_y = -_bolt_1_world_y - _shift;
101+
_bolt_2_deck_y = -_bolt_2_world_y - _shift;
102+
103+
for (y_pos = [_bolt_1_deck_y, _bolt_2_deck_y]) {
65104
translate([arm_x_left, y_pos, 0])
66105
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
67-
}
68-
69-
// Right angle iron mounting holes (Side Angle)
70-
for (y_pos = [-PLATFORM_SIDE_DECK_BOLT_SPACING/2, PLATFORM_SIDE_DECK_BOLT_SPACING/2]) {
106+
71107
translate([arm_x_right, y_pos, 0])
72108
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
73109
}
74110

75111
// Transverse Angle Holes (Front and Rear)
76-
// 2 bolts per angle: Near ends (aligned with side rails)
112+
// 3 bolts per angle: Near ends and Center
77113
// Angle irons are positioned with outside edge at PLATFORM_EDGE_MARGIN from deck edge.
78114
// Bolt holes should be centered on the angle iron leg.
79115
transverse_bolt_y_margin = PLATFORM_EDGE_MARGIN + PLATFORM_ANGLE_LEG / 2;
@@ -86,7 +122,7 @@ module platform_deck() {
86122
transverse_bolt_x = arm_x_pos - (PLATFORM_TRANSVERSE_GAP + PLATFORM_TRANSVERSE_BOLT_END_OFFSET);
87123

88124
for (y_pos = [-transverse_bolt_y, transverse_bolt_y]) {
89-
for (x_pos = [-transverse_bolt_x, transverse_bolt_x]) {
125+
for (x_pos = [-transverse_bolt_x, 0, transverse_bolt_x]) {
90126
translate([x_pos, y_pos, 0])
91127
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
92128
}

LifeTrac-v25/mechanical_design/openscad/parts/platform_pivot_bracket.scad

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,23 @@ module platform_pivot_bracket() {
3636
// Corner radius - using width/2 to maintain constant width and avoid pinching
3737
corner_radius = width / 2;
3838

39-
bolt_1_x = PLATFORM_SIDE_BOLT_START; // 20mm
40-
bolt_2_x = PLATFORM_SIDE_BOLT_START + PLATFORM_SIDE_BOLT_SPACING; // 90mm
39+
// Bolt positions
40+
// Moved to Leg 2 (Horizontal in File X, Vertical in Assembly Z)
41+
// This places bolts on the "bottom" leg relative to the L-shape in 2D view
42+
43+
// Y position is constant (centered on Leg 2)
44+
// Leg 2 is centered at corner_y. Width is width.
45+
// We want bolts in the "bottom half" of the leg width.
46+
// Bottom edge is corner_y - width/2.
47+
// Bolt Y = Bottom Edge + LEG/2.
48+
bolt_y = corner_y - width/2 + PLATFORM_ANGLE_LEG/2;
49+
50+
// X positions (distributed along Leg 2)
51+
// Leg 2 extends from X=0 to X=PLATFORM_BRACKET_LENGTH - width/2
52+
// We place bolts at pivot_bolt_offset from each end of this span
53+
leg2_length = PLATFORM_BRACKET_LENGTH - width/2;
54+
bolt_x_1 = pivot_bolt_offset;
55+
bolt_x_2 = leg2_length - pivot_bolt_offset;
4156

4257
// Hole diameters
4358
pivot_hole_dia = PLATFORM_PIVOT_PIN_DIA + PLATFORM_BOLT_CLEARANCE;
@@ -46,7 +61,7 @@ module platform_pivot_bracket() {
4661

4762
difference() {
4863
union() {
49-
// Vertical Leg (Pivot to Corner)
64+
// Vertical Leg (Pivot to Corner) - Along Y
5065
hull() {
5166
// Pivot position
5267
translate([0, pivot_y, 0])
@@ -57,7 +72,7 @@ module platform_pivot_bracket() {
5772
cylinder(r=corner_radius, h=thickness, center=true, $fn=48);
5873
}
5974

60-
// Horizontal Leg (Corner to End)
75+
// Horizontal Leg (Corner to End) - Along X
6176
hull() {
6277
// Corner position
6378
translate([0, corner_y, 0])
@@ -78,16 +93,11 @@ module platform_pivot_bracket() {
7893
cylinder(d=lock_hole_dia, h=thickness + 4, center=true, $fn=32);
7994

8095
// Bolt holes
81-
// Positioned 1 inch (25.4mm) from the bottom edge of the bracket
82-
// Bottom edge Y = corner_y - width/2
83-
// Bolt Y = Bottom edge Y + 25.4
84-
bolt_y = (corner_y - width/2) + 25.4;
85-
86-
translate([bolt_1_x, bolt_y, 0])
87-
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
88-
89-
translate([bolt_2_x, bolt_y, 0])
90-
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
96+
// Positioned along Leg 2 (X axis)
97+
for (bx = [bolt_x_1, bolt_x_2]) {
98+
translate([bx, bolt_y, 0])
99+
cylinder(d=bolt_hole_dia, h=thickness + 4, center=true, $fn=32);
100+
}
91101
}
92102
}
93103

0 commit comments

Comments
 (0)