Skip to content

Commit b49373b

Browse files
committed
Add weld bead module and update bucket construction
Introduced a weld_bead module in fasteners.scad for visualizing welds. Refactored the bucket module to use tab & slot construction and added weld bead markers for improved assembly visualization. Removed crossmember and control housing modules from lifetrac_v25.scad, and commented out the ground plane per user request.
1 parent 472e756 commit b49373b

File tree

2 files changed

+124
-107
lines changed

2 files changed

+124
-107
lines changed

LifeTrac-v25/mechanical_design/openscad/lifetrac_v25.scad

Lines changed: 113 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,48 +1382,6 @@ module side_panel_right_outer() {
13821382
}
13831383
}
13841384

1385-
// =============================================================================
1386-
// CROSSMEMBERS
1387-
// =============================================================================
1388-
1389-
module rear_crossmember_assembly() {
1390-
// Positioned rear crossmember for assembly
1391-
back_height = MACHINE_HEIGHT * 0.55;
1392-
1393-
color("DarkSlateGray")
1394-
translate([0, -PANEL_THICKNESS/2, FRAME_Z_OFFSET + back_height/2])
1395-
rear_crossmember();
1396-
}
1397-
1398-
module front_crossmember() {
1399-
// Top crossmember at arm pivot level
1400-
crossmember_width = TRACK_WIDTH - SANDWICH_SPACING; // Spans between inner panels
1401-
1402-
color("DarkSlateGray")
1403-
translate([0, WHEEL_BASE, FRAME_Z_OFFSET + MACHINE_HEIGHT - 50])
1404-
cube([crossmember_width, 100, PANEL_THICKNESS], center=true);
1405-
}
1406-
1407-
module bottom_crossmembers() {
1408-
// Floor/bottom crossmembers
1409-
crossmember_width = TRACK_WIDTH + SANDWICH_SPACING;
1410-
1411-
// Front bottom
1412-
color("DarkSlateGray")
1413-
translate([0, WHEEL_BASE - 100, FRAME_Z_OFFSET + PANEL_THICKNESS/2])
1414-
cube([crossmember_width, 150, PANEL_THICKNESS], center=true);
1415-
1416-
// Rear bottom
1417-
color("DarkSlateGray")
1418-
translate([0, 100, FRAME_Z_OFFSET + PANEL_THICKNESS/2])
1419-
cube([crossmember_width, 150, PANEL_THICKNESS], center=true);
1420-
1421-
// Middle bottom
1422-
color("DarkSlateGray")
1423-
translate([0, WHEEL_BASE/2, FRAME_Z_OFFSET + PANEL_THICKNESS/2])
1424-
cube([crossmember_width, 150, PANEL_THICKNESS], center=true);
1425-
}
1426-
14271385
// =============================================================================
14281386
// CYLINDER MOUNTING LUGS - Using Standardized U-Channel Type A Bracket
14291387
// =============================================================================
@@ -1858,9 +1816,6 @@ module base_frame() {
18581816
side_panel_left_inner();
18591817
side_panel_right_inner();
18601818
side_panel_right_outer();
1861-
rear_crossmember();
1862-
front_crossmember();
1863-
bottom_crossmembers();
18641819
cylinder_mounting_lugs();
18651820
arm_pivot_assembly();
18661821

@@ -1901,6 +1856,9 @@ module base_frame() {
19011856
module engine() {
19021857
// V-Twin Engine Representation
19031858
// Dimensions approx for 25HP engine
1859+
// TODO: Design proper engine mounting plate and bolt pattern
1860+
// Currently floating in space
1861+
19041862
eng_width = 450;
19051863
eng_depth = 400;
19061864
eng_height = 450;
@@ -2202,17 +2160,95 @@ module loader_arms() {
22022160
// =============================================================================
22032161

22042162
module bucket() {
2205-
// Standard bucket (Simplified)
2163+
// Standard bucket with Tab & Slot construction for welding
2164+
2165+
tab_len = 50;
2166+
2167+
// 1. Back Plate
2168+
difference() {
2169+
union() {
2170+
// Main Plate
2171+
color("Yellow")
2172+
translate([-BUCKET_WIDTH/2, 0, -BUCKET_HEIGHT])
2173+
cube([BUCKET_WIDTH, PLATE_1_4_INCH, BUCKET_HEIGHT]);
2174+
2175+
// Tabs for Side Plates (Left and Right)
2176+
for (z = [-BUCKET_HEIGHT + 50 : 150 : -50]) {
2177+
// Left Tabs
2178+
translate([-BUCKET_WIDTH/2 - PLATE_1_4_INCH, 0, z])
2179+
cube([PLATE_1_4_INCH, PLATE_1_4_INCH, tab_len]);
2180+
2181+
// Right Tabs
2182+
translate([BUCKET_WIDTH/2, 0, z])
2183+
cube([PLATE_1_4_INCH, PLATE_1_4_INCH, tab_len]);
2184+
}
2185+
}
2186+
2187+
// Slots for Bottom Plate tabs
2188+
for (x = [-BUCKET_WIDTH/2 + 50 : 150 : BUCKET_WIDTH/2 - 50]) {
2189+
translate([x, -1, -BUCKET_HEIGHT])
2190+
cube([tab_len, PLATE_1_4_INCH + 2, PLATE_1_4_INCH]);
2191+
}
2192+
}
22062193

2207-
// Bottom plate
2208-
color("Yellow")
2209-
translate([-BUCKET_WIDTH/2, 0, -BUCKET_HEIGHT])
2210-
cube([BUCKET_WIDTH, BUCKET_DEPTH, PLATE_1_4_INCH]);
2194+
// 2. Bottom Plate
2195+
difference() {
2196+
union() {
2197+
// Main Plate
2198+
color("Yellow")
2199+
translate([-BUCKET_WIDTH/2, PLATE_1_4_INCH, -BUCKET_HEIGHT])
2200+
cube([BUCKET_WIDTH, BUCKET_DEPTH - PLATE_1_4_INCH, PLATE_1_4_INCH]);
2201+
2202+
// Tabs for Back Plate (Rear edge)
2203+
for (x = [-BUCKET_WIDTH/2 + 50 : 150 : BUCKET_WIDTH/2 - 50]) {
2204+
translate([x, 0, -BUCKET_HEIGHT])
2205+
cube([tab_len, PLATE_1_4_INCH, PLATE_1_4_INCH]);
2206+
}
2207+
2208+
// Tabs for Side Plates (Left and Right)
2209+
for (y = [PLATE_1_4_INCH + 50 : 150 : BUCKET_DEPTH - 50]) {
2210+
// Left Tabs
2211+
translate([-BUCKET_WIDTH/2 - PLATE_1_4_INCH, y, -BUCKET_HEIGHT])
2212+
cube([PLATE_1_4_INCH, tab_len, PLATE_1_4_INCH]);
2213+
2214+
// Right Tabs
2215+
translate([BUCKET_WIDTH/2, y, -BUCKET_HEIGHT])
2216+
cube([PLATE_1_4_INCH, tab_len, PLATE_1_4_INCH]);
2217+
}
2218+
}
2219+
}
22112220

2212-
// Back plate (Simplified)
2213-
color("Yellow")
2214-
translate([-BUCKET_WIDTH/2, 0, -BUCKET_HEIGHT])
2215-
cube([BUCKET_WIDTH, PLATE_1_4_INCH, BUCKET_HEIGHT]);
2221+
// 3. Side Plates
2222+
for (side = [-1, 1]) {
2223+
x_pos = (side == -1) ? -BUCKET_WIDTH/2 - PLATE_1_4_INCH : BUCKET_WIDTH/2;
2224+
2225+
difference() {
2226+
// Main Shape
2227+
color("Yellow")
2228+
translate([x_pos, 0, -BUCKET_HEIGHT])
2229+
rotate([0, -90, 0])
2230+
linear_extrude(height=PLATE_1_4_INCH)
2231+
polygon([
2232+
[0, 0],
2233+
[BUCKET_HEIGHT, 0],
2234+
[BUCKET_HEIGHT, PLATE_1_2_INCH],
2235+
[BUCKET_HEIGHT * 0.3, BUCKET_DEPTH],
2236+
[0, BUCKET_DEPTH]
2237+
]);
2238+
2239+
// Slots for Back Plate tabs
2240+
for (z = [-BUCKET_HEIGHT + 50 : 150 : -50]) {
2241+
translate([x_pos - 1, -1, z])
2242+
cube([PLATE_1_4_INCH + 2, PLATE_1_4_INCH + 2, tab_len]);
2243+
}
2244+
2245+
// Slots for Bottom Plate tabs
2246+
for (y = [PLATE_1_4_INCH + 50 : 150 : BUCKET_DEPTH - 50]) {
2247+
translate([x_pos - 1, y, -BUCKET_HEIGHT - 1])
2248+
cube([PLATE_1_4_INCH + 2, tab_len, PLATE_1_4_INCH + 2]);
2249+
}
2250+
}
2251+
}
22162252

22172253
// Cylinder Lugs (Moved from QA plate)
22182254
for (side = [-1, 1]) {
@@ -2225,36 +2261,29 @@ module bucket() {
22252261
u_channel_lug_with_pin(TUBE_3X3_1_4, 80, BOLT_DIA_3_4 + 2);
22262262
}
22272263

2228-
// Left side plate
2229-
color("Yellow")
2230-
translate([-BUCKET_WIDTH/2, 0, -BUCKET_HEIGHT])
2231-
rotate([0, -90, 0])
2232-
linear_extrude(height=PLATE_1_4_INCH)
2233-
polygon([
2234-
[0, 0],
2235-
[BUCKET_HEIGHT, 0],
2236-
[BUCKET_HEIGHT, PLATE_1_2_INCH],
2237-
[BUCKET_HEIGHT * 0.3, BUCKET_DEPTH],
2238-
[0, BUCKET_DEPTH]
2239-
]);
2240-
2241-
// Right side plate
2242-
color("Yellow")
2243-
translate([BUCKET_WIDTH/2 + PLATE_1_4_INCH, 0, -BUCKET_HEIGHT])
2244-
rotate([0, -90, 0])
2245-
linear_extrude(height=PLATE_1_4_INCH)
2246-
polygon([
2247-
[0, 0],
2248-
[BUCKET_HEIGHT, 0],
2249-
[BUCKET_HEIGHT, PLATE_1_2_INCH],
2250-
[BUCKET_HEIGHT * 0.3, BUCKET_DEPTH],
2251-
[0, BUCKET_DEPTH]
2252-
]);
2253-
22542264
// Cutting edge
22552265
color("DarkSlateGray")
22562266
translate([-BUCKET_WIDTH/2, BUCKET_DEPTH - PLATE_3_4_INCH, -BUCKET_HEIGHT])
22572267
cube([BUCKET_WIDTH, PLATE_3_4_INCH, 80]);
2268+
2269+
// Weld Beads
2270+
// 1. Bottom-Back Corner (Inside)
2271+
translate([0, PLATE_1_4_INCH, -BUCKET_HEIGHT + PLATE_1_4_INCH])
2272+
rotate([0, 0, 90])
2273+
weld_bead(length=BUCKET_WIDTH - 20, diameter=8);
2274+
2275+
// 2. Bottom-Side Corners (Inside)
2276+
for (x = [-BUCKET_WIDTH/2, BUCKET_WIDTH/2]) {
2277+
translate([x, BUCKET_DEPTH/2, -BUCKET_HEIGHT + PLATE_1_4_INCH])
2278+
weld_bead(length=BUCKET_DEPTH - 20, diameter=8);
2279+
}
2280+
2281+
// 3. Back-Side Corners (Inside)
2282+
for (x = [-BUCKET_WIDTH/2, BUCKET_WIDTH/2]) {
2283+
translate([x, PLATE_1_4_INCH, -BUCKET_HEIGHT/2])
2284+
rotate([90, 0, 0])
2285+
weld_bead(length=BUCKET_HEIGHT - 20, diameter=8);
2286+
}
22582287
}
22592288

22602289
// =============================================================================
@@ -2899,36 +2928,13 @@ module standing_deck() {
28992928
folding_platform_assembly(platform_fold_angle);
29002929
}
29012930

2902-
// =============================================================================
2903-
// CONTROL HOUSING
2904-
// =============================================================================
2905-
2906-
module control_housing() {
2907-
housing_width = 300;
2908-
housing_height = 350;
2909-
housing_depth = 200;
2910-
2911-
// Position inside the frame
2912-
translate([0, WHEEL_BASE/2, FRAME_Z_OFFSET + 150])
2913-
{
2914-
// Housing box (transparent for visualization)
2915-
color("Blue", 0.3)
2916-
difference() {
2917-
cube([housing_width, housing_depth, housing_height], center=true);
2918-
translate([0, 0, 10])
2919-
cube([housing_width-20, housing_depth-20, housing_height], center=true);
2920-
}
2921-
}
2922-
}
2923-
29242931
// =============================================================================
29252932
// MAIN ASSEMBLY
29262933
// =============================================================================
29272934

29282935
module lifetrac_v25_assembly() {
29292936
if (show_frame) {
29302937
base_frame();
2931-
control_housing();
29322938
engine();
29332939
}
29342940

@@ -2947,7 +2953,7 @@ module lifetrac_v25_assembly() {
29472953
lifetrac_v25_assembly();
29482954
calculate_cog();
29492955

2950-
// Ground plane reference at Z=0 (shifted down slightly so wheels visibly touch it)
2951-
color("Green", 0.2)
2952-
translate([0, WHEEL_BASE/2, -1])
2953-
cube([4000, 4000, 2], center=true);
2956+
// Ground plane reference removed per user request
2957+
// color("Green", 0.2)
2958+
// translate([0, WHEEL_BASE/2, -1])
2959+
// cube([4000, 4000, 2], center=true);

LifeTrac-v25/mechanical_design/openscad/modules/fasteners.scad

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ BOLT_1_INCH = 25.4; // 1" bolt diameter
1313
HEX_1_2_INCH = 19.05; // 3/4" hex for 1/2" bolt
1414
HEX_1_INCH = 38.1; // 1.5" hex for 1" bolt
1515

16+
/**
17+
* Creates a weld bead marker
18+
* @param length Length of the weld bead
19+
* @param diameter Diameter of the weld bead (default 6mm ~ 1/4")
20+
*/
21+
module weld_bead(length=20, diameter=6) {
22+
color("Red")
23+
rotate([90, 0, 0])
24+
cylinder(d=diameter, h=length, center=true, $fn=16);
25+
}
26+
1627
/**
1728
* Creates a hex bolt
1829
* @param diameter Shaft diameter in mm

0 commit comments

Comments
 (0)