Skip to content

Commit 0ddf040

Browse files
committed
Add front stiffener plate and motor plate updates
Introduce a front_stiffener_plate module (geometry, bolt cutouts and trimmed angle-irons) to add the vertical front stiffener flush with the motor mounts; angle irons are shortened to avoid overlap with horizontal angles. Add motor_plate_tube_cutout helper (CNC-friendly corner radius) and integrate 2x6 tube cutouts into motor_mounting_plate. motor_mounting_plate now includes bolt cutouts for frame-tube angle irons and places both the existing horizontal split angles and new vertical frame_tube_angle_iron instances to match tube locations. Finally, call front_stiffener_plate from base_frame so the new plate is included in the assembled frame.
1 parent e4d3dbd commit 0ddf040

File tree

1 file changed

+346
-6
lines changed

1 file changed

+346
-6
lines changed

LifeTrac-v25/mechanical_design/openscad/lifetrac_v25.scad

Lines changed: 346 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,6 +2376,184 @@ module back_stiffener_plate() {
23762376
vertical_angle_iron_smart(plate_height, angle_size);
23772377
}
23782378

2379+
// =============================================================================
2380+
// FRONT STIFFENER PLATE
2381+
// =============================================================================
2382+
// Vertical plate at the front of the frame, similar mounting to back plate
2383+
// Flush with front of motor mount plates
2384+
// Center section (between motor plates): 10" + bottom plate thickness
2385+
// Outer sections (motor plate to outer wall): 5" tall
2386+
2387+
module front_stiffener_plate() {
2388+
plate_width = TRACK_WIDTH + SANDWICH_SPACING;
2389+
plate_thickness = PLATE_1_4_INCH;
2390+
y_pos = BOTTOM_PLATE_Y_END; // Flush with front of motor mount plates
2391+
2392+
// Heights
2393+
center_height = 254.0 + PLATE_1_4_INCH; // 10" + bottom plate thickness
2394+
outer_height = 127.0; // 5" for outer sections
2395+
2396+
// Angle iron trim to avoid overlap with horizontal angles below
2397+
angle_trim = 57.15; // 2.25 inches
2398+
center_angle_height = center_height - angle_trim;
2399+
outer_angle_height = outer_height - angle_trim;
2400+
angle_z_offset = angle_trim; // Start angles higher to avoid overlap
2401+
2402+
z_start = FRAME_Z_OFFSET + BOTTOM_PLATE_INNER_TRIM - PLATE_1_4_INCH; // Start at bottom stiffener plate top
2403+
2404+
angle_size = [50.8, 6.35];
2405+
leg = angle_size[0];
2406+
bolt_dia = 9.525;
2407+
hole_offset = leg * 0.6;
2408+
2409+
inner_offset = TRACK_WIDTH/2 - SANDWICH_SPACING/2;
2410+
2411+
// Center section plate (between motor plates)
2412+
difference() {
2413+
color("Silver")
2414+
translate([-MOTOR_PLATE_X, y_pos, z_start])
2415+
cube([2*MOTOR_PLATE_X, plate_thickness, center_height]);
2416+
2417+
// Holes for motor plate angles
2418+
// Left motor plate - right side (Legs +X, -Y)
2419+
for (z = get_stiffener_holes_b(center_height)) {
2420+
translate([-MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 + hole_offset, y_pos, z_start + z])
2421+
rotate([90, 0, 0])
2422+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2423+
}
2424+
2425+
// Right motor plate - left side (Legs -X, -Y)
2426+
for (z = get_stiffener_holes_b(center_height)) {
2427+
translate([MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 - hole_offset, y_pos, z_start + z])
2428+
rotate([90, 0, 0])
2429+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2430+
}
2431+
}
2432+
2433+
// Left outer section plate (outer wall to motor plate)
2434+
difference() {
2435+
color("Silver")
2436+
translate([-plate_width/2, y_pos, z_start])
2437+
cube([plate_width/2 - MOTOR_PLATE_X, plate_thickness, outer_height]);
2438+
2439+
// Holes for left outer wall angle
2440+
for (z = get_stiffener_holes_a(outer_height)) {
2441+
translate([-plate_width/2 + hole_offset, y_pos, z_start + z])
2442+
rotate([90, 0, 0])
2443+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2444+
}
2445+
2446+
// Holes for left inner wall - left side
2447+
for (z = get_stiffener_holes_b(outer_height)) {
2448+
translate([-inner_offset - hole_offset, y_pos, z_start + z])
2449+
rotate([90, 0, 0])
2450+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2451+
}
2452+
2453+
// Holes for left inner wall - right side
2454+
for (z = get_stiffener_holes_a(outer_height)) {
2455+
translate([-inner_offset + PANEL_THICKNESS + hole_offset, y_pos, z_start + z])
2456+
rotate([90, 0, 0])
2457+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2458+
}
2459+
2460+
// Holes for left motor plate - left side
2461+
for (z = get_stiffener_holes_b(outer_height)) {
2462+
translate([-MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 - hole_offset, y_pos, z_start + z])
2463+
rotate([90, 0, 0])
2464+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2465+
}
2466+
}
2467+
2468+
// Right outer section plate (motor plate to outer wall)
2469+
difference() {
2470+
color("Silver")
2471+
translate([MOTOR_PLATE_X, y_pos, z_start])
2472+
cube([plate_width/2 - MOTOR_PLATE_X, plate_thickness, outer_height]);
2473+
2474+
// Holes for right outer wall angle
2475+
for (z = get_stiffener_holes_b(outer_height)) {
2476+
translate([plate_width/2 - hole_offset, y_pos, z_start + z])
2477+
rotate([90, 0, 0])
2478+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2479+
}
2480+
2481+
// Holes for right inner wall - left side
2482+
for (z = get_stiffener_holes_b(outer_height)) {
2483+
translate([inner_offset - PANEL_THICKNESS - hole_offset, y_pos, z_start + z])
2484+
rotate([90, 0, 0])
2485+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2486+
}
2487+
2488+
// Holes for right inner wall - right side
2489+
for (z = get_stiffener_holes_a(outer_height)) {
2490+
translate([inner_offset + hole_offset, y_pos, z_start + z])
2491+
rotate([90, 0, 0])
2492+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2493+
}
2494+
2495+
// Holes for right motor plate - right side
2496+
for (z = get_stiffener_holes_a(outer_height)) {
2497+
translate([MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 + hole_offset, y_pos, z_start + z])
2498+
rotate([90, 0, 0])
2499+
cylinder(d=bolt_dia, h=20, center=true, $fn=16);
2500+
}
2501+
}
2502+
2503+
// Angle Irons (shortened by 2.25" to avoid overlap with horizontal angles below)
2504+
// Left Outer wall (Legs +X, -Y) -> Rot Z -90
2505+
translate([-plate_width/2, y_pos, z_start + angle_z_offset])
2506+
rotate([0, 0, -90])
2507+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2508+
2509+
// Right Outer wall (Legs -X, -Y) -> Rot Z 180
2510+
translate([plate_width/2, y_pos, z_start + angle_z_offset])
2511+
rotate([0, 0, 180])
2512+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2513+
2514+
// Left Inner Panel - left side (Legs -X, -Y) -> Rot Z 180
2515+
translate([-inner_offset, y_pos, z_start + angle_z_offset])
2516+
rotate([0, 0, 180])
2517+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2518+
2519+
// Left Inner Panel - right side (Legs +X, -Y) -> Rot Z -90
2520+
translate([-inner_offset + PANEL_THICKNESS, y_pos, z_start + angle_z_offset])
2521+
rotate([0, 0, -90])
2522+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2523+
2524+
// Right Inner Panel - left side (Legs -X, -Y) -> Rot Z 180
2525+
translate([inner_offset - PANEL_THICKNESS, y_pos, z_start + angle_z_offset])
2526+
rotate([0, 0, 180])
2527+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2528+
2529+
// Right Inner Panel - right side (Legs +X, -Y) -> Rot Z -90
2530+
translate([inner_offset, y_pos, z_start + angle_z_offset])
2531+
rotate([0, 0, -90])
2532+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2533+
2534+
// Motor plate angles (center section)
2535+
// Left motor plate - right side (Legs +X, -Y) -> Rot Z -90
2536+
translate([-MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2, y_pos, z_start + angle_z_offset])
2537+
rotate([0, 0, -90])
2538+
vertical_angle_iron_smart(center_angle_height, angle_size);
2539+
2540+
// Right motor plate - left side (Legs -X, -Y) -> Rot Z 180
2541+
translate([MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2, y_pos, z_start + angle_z_offset])
2542+
rotate([0, 0, 180])
2543+
vertical_angle_iron_smart(center_angle_height, angle_size);
2544+
2545+
// Motor plate angles (outer sections)
2546+
// Left motor plate - left side (Legs -X, -Y) -> Rot Z 180
2547+
translate([-MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2, y_pos, z_start + angle_z_offset])
2548+
rotate([0, 0, 180])
2549+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2550+
2551+
// Right motor plate - right side (Legs +X, -Y) -> Rot Z -90
2552+
translate([MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2, y_pos, z_start + angle_z_offset])
2553+
rotate([0, 0, -90])
2554+
vertical_angle_iron_smart(outer_angle_height, angle_size);
2555+
}
2556+
23792557
// =============================================================================
23802558
// BOTTOM STIFFENER PLATE
23812559
// =============================================================================
@@ -2520,6 +2698,25 @@ MOTOR_PLATE_THICKNESS = PLATE_1_4_INCH;
25202698
// Motor plate is 6" inboard (toward center)
25212699
MOTOR_PLATE_X = (TRACK_WIDTH/2 - SANDWICH_SPACING/2) - MOTOR_PLATE_INBOARD;
25222700

2701+
// Cutout shape for motor plates (in motor plate local coordinates)
2702+
// Motor plate local: Y = world Y, Z = world Z (relative to z_bottom)
2703+
// Uses CNC-friendly corner radius for manufacturability
2704+
module motor_plate_tube_cutout(y_pos, y_start, z_bottom) {
2705+
// In motor plate coords:
2706+
// Y position = world Y position of tube - y_start
2707+
// Z position = FRAME_TUBE_Z - z_bottom
2708+
local_y = y_pos - y_start;
2709+
local_z = FRAME_TUBE_Z - z_bottom;
2710+
2711+
translate([-5, local_y, local_z])
2712+
rotate([0, 90, 0])
2713+
rotate([0, 0, 90])
2714+
linear_extrude(height=MOTOR_PLATE_THICKNESS + 10)
2715+
offset(r=FRAME_TUBE_CNC_RADIUS)
2716+
offset(r=-FRAME_TUBE_CNC_RADIUS)
2717+
square([FRAME_TUBE_WIDTH, FRAME_TUBE_HEIGHT]);
2718+
}
2719+
25232720
module motor_mounting_plate() {
25242721
plate_height = MOTOR_PLATE_HEIGHT;
25252722
plate_length = BOTTOM_PLATE_LENGTH; // Same as bottom stiffener plate
@@ -2532,20 +2729,112 @@ module motor_mounting_plate() {
25322729
leg = angle_size[0];
25332730
thick = angle_size[1];
25342731

2732+
// Frame tube angle iron parameters (same as frame_tube_angle_iron module)
2733+
angle_trim = 3.175; // 1/8" trimmed from each end
2734+
angle_len = FRAME_TUBE_HEIGHT - 2*angle_trim; // 5.75" (146.05mm)
2735+
frame_bolt_dia = BOLT_DIA_1_2; // 1/2" bolts for frame tube angles
2736+
plate_bolt_offset = 50.8; // 2" from center (4" total spacing) for plate/wall side
2737+
2738+
// Local Y positions of frame tubes (relative to y_start)
2739+
front_tube_local_y = FRONT_FRAME_TUBE_Y - y_start;
2740+
rear_tube_local_y = REAR_FRAME_TUBE_Y - y_start;
2741+
2742+
// Z position of angle irons relative to plate bottom
2743+
angle_z_local = FRAME_TUBE_Z - z_bottom + angle_trim;
2744+
25352745
// Left motor plate (negative X side)
2536-
// Plate is in YZ plane
2746+
// Plate is in YZ plane with 2x6 tube cutouts
25372747
color("Silver")
25382748
translate([-MOTOR_PLATE_X - plate_thickness/2, y_start, z_bottom])
2539-
cube([plate_thickness, plate_length, plate_height]);
2749+
difference() {
2750+
cube([plate_thickness, plate_length, plate_height]);
2751+
2752+
// 2x6 cross tube cutouts (front and rear)
2753+
motor_plate_tube_cutout(FRONT_FRAME_TUBE_Y, y_start, z_bottom);
2754+
motor_plate_tube_cutout(REAR_FRAME_TUBE_Y, y_start, z_bottom);
2755+
2756+
// Frame tube angle iron bolt holes (same pattern as side wall plates)
2757+
// 2 holes per angle, spaced 4" apart (2" from center), 1/2" bolts
2758+
// FRONT TUBE - front face angle
2759+
translate([plate_thickness/2, front_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2760+
rotate([0, 90, 0])
2761+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2762+
translate([plate_thickness/2, front_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2763+
rotate([0, 90, 0])
2764+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2765+
2766+
// FRONT TUBE - rear face angle
2767+
translate([plate_thickness/2, front_tube_local_y - leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2768+
rotate([0, 90, 0])
2769+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2770+
translate([plate_thickness/2, front_tube_local_y - leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2771+
rotate([0, 90, 0])
2772+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2773+
2774+
// REAR TUBE - front face angle
2775+
translate([plate_thickness/2, rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2776+
rotate([0, 90, 0])
2777+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2778+
translate([plate_thickness/2, rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2779+
rotate([0, 90, 0])
2780+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2781+
2782+
// REAR TUBE - rear face angle
2783+
translate([plate_thickness/2, rear_tube_local_y - leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2784+
rotate([0, 90, 0])
2785+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2786+
translate([plate_thickness/2, rear_tube_local_y - leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2787+
rotate([0, 90, 0])
2788+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2789+
}
25402790

25412791
// Right motor plate (positive X side)
25422792
color("Silver")
25432793
translate([MOTOR_PLATE_X - plate_thickness/2, y_start, z_bottom])
2544-
cube([plate_thickness, plate_length, plate_height]);
2794+
difference() {
2795+
cube([plate_thickness, plate_length, plate_height]);
2796+
2797+
// 2x6 cross tube cutouts (front and rear)
2798+
motor_plate_tube_cutout(FRONT_FRAME_TUBE_Y, y_start, z_bottom);
2799+
motor_plate_tube_cutout(REAR_FRAME_TUBE_Y, y_start, z_bottom);
2800+
2801+
// Frame tube angle iron bolt holes (same pattern as side wall plates)
2802+
// FRONT TUBE - front face angle
2803+
translate([plate_thickness/2, front_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2804+
rotate([0, 90, 0])
2805+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2806+
translate([plate_thickness/2, front_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2807+
rotate([0, 90, 0])
2808+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2809+
2810+
// FRONT TUBE - rear face angle
2811+
translate([plate_thickness/2, front_tube_local_y - leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2812+
rotate([0, 90, 0])
2813+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2814+
translate([plate_thickness/2, front_tube_local_y - leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2815+
rotate([0, 90, 0])
2816+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2817+
2818+
// REAR TUBE - front face angle
2819+
translate([plate_thickness/2, rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2820+
rotate([0, 90, 0])
2821+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2822+
translate([plate_thickness/2, rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2823+
rotate([0, 90, 0])
2824+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2825+
2826+
// REAR TUBE - rear face angle
2827+
translate([plate_thickness/2, rear_tube_local_y - leg/2, angle_z_local + angle_len/2 - plate_bolt_offset])
2828+
rotate([0, 90, 0])
2829+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2830+
translate([plate_thickness/2, rear_tube_local_y - leg/2, angle_z_local + angle_len/2 + plate_bolt_offset])
2831+
rotate([0, 90, 0])
2832+
cylinder(d=frame_bolt_dia, h=plate_thickness+4, center=true, $fn=16);
2833+
}
25452834

2546-
// Angle irons connecting motor plates to bottom stiffener plate
2547-
// These run along the bottom edge of the motor plates
2548-
// Horizontal leg on bottom stiffener plate, vertical leg against motor plate
2835+
// ==========================================================================
2836+
// HORIZONTAL ANGLE IRONS - Bottom edge (connecting to bottom stiffener plate)
2837+
// ==========================================================================
25492838

25502839
// Left motor plate angles (2 angles - one on each side of plate)
25512840
// Left side of left motor plate (X-leg extends -X, away from center)
@@ -2566,6 +2855,54 @@ module motor_mounting_plate() {
25662855
// Right side of right motor plate (X-leg extends +X, away from center)
25672856
translate([MOTOR_PLATE_X + plate_thickness/2, y_start, z_bottom])
25682857
split_horizontal_angle_iron(angle_size);
2858+
2859+
// ==========================================================================
2860+
// VERTICAL ANGLE IRONS - At 2x6 frame tube locations (same as side wall plates)
2861+
// Uses frame_tube_angle_iron() module for matching size and bolt pattern
2862+
// ==========================================================================
2863+
2864+
// Z position - angle centered with tube (offset by 1/8" trim)
2865+
angle_z = FRAME_TUBE_Z + angle_trim;
2866+
2867+
// Left motor plate - horizontal leg extends toward +X (toward center)
2868+
// FRONT TUBE - front face angle
2869+
translate([-MOTOR_PLATE_X + plate_thickness/2, FRONT_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2870+
frame_tube_angle_iron();
2871+
2872+
// FRONT TUBE - rear face angle (mirrored in Y so vertical leg extends backward)
2873+
translate([-MOTOR_PLATE_X + plate_thickness/2, FRONT_FRAME_TUBE_Y, angle_z])
2874+
mirror([0, 1, 0])
2875+
frame_tube_angle_iron();
2876+
2877+
// REAR TUBE - front face angle
2878+
translate([-MOTOR_PLATE_X + plate_thickness/2, REAR_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2879+
frame_tube_angle_iron();
2880+
2881+
// REAR TUBE - rear face angle
2882+
translate([-MOTOR_PLATE_X + plate_thickness/2, REAR_FRAME_TUBE_Y, angle_z])
2883+
mirror([0, 1, 0])
2884+
frame_tube_angle_iron();
2885+
2886+
// Right motor plate - horizontal leg extends toward -X (toward center), so mirror X
2887+
// FRONT TUBE - front face angle
2888+
translate([MOTOR_PLATE_X - plate_thickness/2, FRONT_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2889+
mirror([1, 0, 0])
2890+
frame_tube_angle_iron();
2891+
2892+
// FRONT TUBE - rear face angle (mirrored in both X and Y)
2893+
translate([MOTOR_PLATE_X - plate_thickness/2, FRONT_FRAME_TUBE_Y, angle_z])
2894+
mirror([1, 1, 0])
2895+
frame_tube_angle_iron();
2896+
2897+
// REAR TUBE - front face angle
2898+
translate([MOTOR_PLATE_X - plate_thickness/2, REAR_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2899+
mirror([1, 0, 0])
2900+
frame_tube_angle_iron();
2901+
2902+
// REAR TUBE - rear face angle
2903+
translate([MOTOR_PLATE_X - plate_thickness/2, REAR_FRAME_TUBE_Y, angle_z])
2904+
mirror([1, 1, 0])
2905+
frame_tube_angle_iron();
25692906
}
25702907

25712908
// =============================================================================
@@ -2837,6 +3174,9 @@ module base_frame() {
28373174
// 2" from front, 6" from back of wall side plates
28383175
bottom_stiffener_plate();
28393176

3177+
// Front stiffener plate (vertical plate at front of motor mount area)
3178+
front_stiffener_plate();
3179+
28403180
// Motor mounting plates (vertical plates for engine mounting)
28413181
motor_mounting_plate();
28423182

0 commit comments

Comments
 (0)