@@ -12,6 +12,7 @@ use <modules/structural_steel.scad>
1212use < modules/fasteners.scad>
1313use < modules/hydraulics.scad>
1414use < modules/wheels.scad>
15+ use < modules/loader_arm_v2.scad>
1516
1617// Import individual part files
1718use < parts/side_panel.scad>
@@ -163,7 +164,7 @@ animation_phase = animation_time < 0.5 ? (animation_time * 2) : (2 - animation_t
163164
164165// Default arm position: lowered to ground (animation_phase=0)
165166// ARM_GROUND_ANGLE is the angle below horizontal needed to reach ground
166- ARM_LIFT_ANGLE = - ARM_GROUND_ANGLE + (animation_phase * (60 + ARM_GROUND_ANGLE)); // Animate from ground to raised and back
167+ ARM_LIFT_ANGLE = - ARM_GROUND_ANGLE + ARM_V2_OFFSET_ANGLE + (animation_phase * (60 + ARM_GROUND_ANGLE)); // Animate from ground to raised and back
167168
168169// Cross beam positions along arm length (from pivot)
169170// First cross beam positioned for bucket cylinder attachment
@@ -175,8 +176,9 @@ CROSS_BEAM_SIZE = TUBE_2X2_1_4[0]; // 2"x2" tube size
175176CROSS_BEAM_CLEARANCE = 15 ; // Extra clearance around cross beam in cutout
176177
177178// Arm rotation range for cutout calculations
178- ARM_MIN_ANGLE = - ARM_GROUND_ANGLE; // Lowest position (at ground)
179- ARM_MAX_ANGLE = 60 ; // Maximum raised position
179+ // ARM_MIN_ANGLE and ARM_MAX_ANGLE are defined in lifetrac_v25_params.scad
180+ // ARM_MIN_ANGLE = -ARM_GROUND_ANGLE; // Lowest position (at ground)
181+ // ARM_MAX_ANGLE = 60; // Maximum raised position
180182
181183// =============================================================================
182184// CROSS BEAM CUTOUT GEOMETRY FUNCTIONS
@@ -237,9 +239,9 @@ BUCKET_HEIGHT = 450;
237239
238240// Bucket tilt angle calculation:
239241// When arm is at ARM_LIFT_ANGLE, bucket needs to counter-rotate to stay level
240- // At ground position (ARM_LIFT_ANGLE = -ARM_GROUND_ANGLE ), bucket tilts forward to lay flat
241- // The bucket bottom is horizontal when bucket tilt = ARM_GROUND_ANGLE (compensates for arm angle)
242- BUCKET_GROUND_TILT = ARM_GROUND_ANGLE ; // Tilt needed to make bottom flat when arm at ground
242+ // At ground position (ARM_LIFT_ANGLE = ARM_MIN_ANGLE ), bucket tilts forward to lay flat
243+ // The bucket bottom is horizontal when bucket tilt = -ARM_MIN_ANGLE (compensates for arm angle)
244+ BUCKET_GROUND_TILT = - ARM_MIN_ANGLE ; // Tilt needed to make bottom flat when arm at ground
243245BUCKET_MAX_CURL = 60 ; // Maximum curl angle when fully raised
244246
245247// Bucket actuates with the arm using the same animation_phase for looping
@@ -1497,7 +1499,7 @@ module stiffener_side_panel_cutters(is_inner, is_left) {
14971499 // Mid Plate Parameters
14981500 mid_y = 800 ;
14991501 mid_z_start = FRAME_Z_OFFSET + 100 ;
1500- mid_z_end = FRAME_Z_OFFSET + 825 - 25.4 ;
1502+ mid_z_end = FRAME_Z_OFFSET + 350 ;
15011503 mid_h = mid_z_end - mid_z_start;
15021504 mid_angle_size = [50.8 , 6.35 ];
15031505 mid_leg = mid_angle_size[0 ];
@@ -1813,7 +1815,7 @@ module base_frame() {
18131815
18141816 // Mid plate (at Y=800 to avoid cylinder bolts at 700)
18151817 // Top height at Y=800 is approx 825mm above frame bottom
1816- mid_stiffener_plate(800 , FRAME_Z_OFFSET + 100 , FRAME_Z_OFFSET + 825 - 25.4 );
1818+ mid_stiffener_plate(800 , FRAME_Z_OFFSET + 100 , FRAME_Z_OFFSET + 350 );
18171819}
18181820
18191821// =============================================================================
@@ -2045,84 +2047,37 @@ module wheel_assemblies() {
20452047// LOADER ARMS
20462048// =============================================================================
20472049
2048- module single_arm(side) {
2049- mirror_x = (side == "left" ) ? - 1 : 1 ;
2050- arm_x = mirror_x * ARM_SPACING/2 ;
2051- tube_size = ARM_TUBE_SIZE[0 ];
2052-
2053- color ("Orange" )
2054- translate ([arm_x, 0 , 0 ])
2055- {
2056- // Main arm beam - extends from Y=0 (pivot) to Y=ARM_LENGTH (bucket end)
2057- // Using a hollow square tube created directly with difference()
2058- translate ([0 , ARM_LENGTH/2 , 0 ])
2059- difference () {
2060- cube ([tube_size, ARM_LENGTH, tube_size], center= true );
2061- cube ([tube_size - 2 * ARM_TUBE_SIZE[1 ], ARM_LENGTH + 2 , tube_size - 2 * ARM_TUBE_SIZE[1 ]], center= true );
2062- }
2063-
2064- // Pivot reinforcement - TYPE B: Two CNC plasma cut rings from 3/4" plate
2065- // Welded to each side of arm tube at pivot point
2066- translate ([0 , 0 , 0 ])
2067- rotate ([0 , 90 , 0 ]) {
2068- // Inner ring
2069- translate ([0 , 0 , - tube_size/2 + PLATE_3_4_INCH/2 ])
2070- pivot_ring_large(tube_size + 30 , PIVOT_PIN_DIA + 2 );
2071- // Outer ring
2072- translate ([0 , 0 , tube_size/2 - PLATE_3_4_INCH/2 ])
2073- pivot_ring_large(tube_size + 30 , PIVOT_PIN_DIA + 2 );
2074- }
2075-
2076- // Lift cylinder attachment - TYPE A: U-Channel from 3"x3" tube with pin
2077- translate ([0 , LIFT_CYL_ARM_OFFSET, - tube_size/2 - TUBE_3X3_1_4[0 ]/2 ])
2078- rotate ([0 , 0 , 0 ])
2079- u_channel_lug_with_pin(TUBE_3X3_1_4, 80 , BOLT_DIA_1 + 2 );
2080-
2081- // Note: Bucket cylinder brackets are now on the cross beam, not individual arms
2082- }
2083- }
20842050
2085- module arm_cross_beams() {
2086- tube_size = ARM_TUBE_SIZE[0 ];
2087- cross_tube_size = TUBE_2X2_1_4[0 ];
2088- wall_thickness = TUBE_2X2_1_4[1 ];
2089- beam_length = ARM_SPACING + tube_size; // Span full width including arm tubes
2090-
2091- // First cross beam - at bucket cylinder attachment position
2092- color ("Orange" )
2093- translate ([0 , CROSS_BEAM_1_POS, 0 ])
2094- {
2095- // Cross beam tube
2096- difference () {
2097- cube ([beam_length, cross_tube_size, cross_tube_size], center= true );
2098- cube ([beam_length + 2 , cross_tube_size - 2 * wall_thickness, cross_tube_size - 2 * wall_thickness], center= true );
2099- }
2100-
2101- // Bucket cylinder mounting brackets - TYPE A: U-Channel from 3"x3" tube with pins
2102- for (side = [- 1 , 1 ]) {
2103- translate ([side * BUCKET_CYL_X_SPACING, 0 , cross_tube_size/2 + TUBE_3X3_1_4[0 ]/2 ])
2104- u_channel_lug_with_pin(TUBE_3X3_1_4, 80 , BOLT_DIA_3_4 + 2 );
2105- }
2106- }
2107-
2108- // Second cross beam - near bucket (centered on X=0)
2109- color ("Orange" )
2110- translate ([0 , CROSS_BEAM_2_POS, 0 ])
2111- difference () {
2112- cube ([beam_length, cross_tube_size, cross_tube_size], center= true );
2113- cube ([beam_length + 2 , cross_tube_size - 2 * wall_thickness, cross_tube_size - 2 * wall_thickness], center= true );
2114- }
2115- }
21162051
21172052module loader_arms() {
21182053 if (show_loader_arms) {
21192054 translate ([0 , ARM_PIVOT_Y, ARM_PIVOT_Z])
2120- rotate ([ARM_LIFT_ANGLE, 0 , 0 ])
2121- translate ([0 , 0 , 0 ]) // Local arm coordinate system
2055+ rotate ([is_undef(ARM_LIFT_ANGLE) ? 0 : ARM_LIFT_ANGLE, 0 , 0 ])
21222056 {
2123- single_arm("left" );
2124- single_arm("right" );
2125- arm_cross_beams();
2057+ // Left Arm
2058+ translate ([- ARM_SPACING/2 , 0 , 0 ])
2059+ rotate ([0 , 0 , 90 ])
2060+ translate ([0 , - TUBE_2X6_1_4[0 ]/2 , - TUBE_2X6_1_4[1 ]/2 ])
2061+ loader_arm_v2(angle= 0 , side= "left" );
2062+
2063+ // Right Arm
2064+ translate ([ARM_SPACING/2 , 0 , 0 ])
2065+ rotate ([0 , 0 , 90 ])
2066+ translate ([0 , - TUBE_2X6_1_4[0 ]/2 , - TUBE_2X6_1_4[1 ]/2 ])
2067+ loader_arm_v2(angle= 0 , side= "right" );
2068+
2069+ // Cross Beam
2070+ // Connects the elbow assemblies at the new mounting hole position
2071+ // Hole is at main_tube_len - 50 from pivot
2072+ // Z height is 0 relative to arm pivot (center of tube)
2073+ // Y position is ARM_PIVOT_Y + (ARM_MAIN_LEN - 50)
2074+ // But we are inside the rotated arm group, so we use local coordinates
2075+ // The arms are at +/- ARM_SPACING/2
2076+ // The cross beam spans between them
2077+
2078+ translate ([0 , ARM_MAIN_LEN - 50 , 0 ])
2079+ rotate ([0 , 90 , 0 ])
2080+ cube ([50.8 , 152.4 , ARM_SPACING], center= true ); // 2x6 tube
21262081 }
21272082 }
21282083}
@@ -2249,8 +2204,8 @@ module bucket() {
22492204module bucket_attachment() {
22502205 if (show_bucket) {
22512206 translate ([0 , ARM_PIVOT_Y, ARM_PIVOT_Z])
2252- rotate ([ARM_LIFT_ANGLE, 0 , 0 ])
2253- translate ([0 , ARM_LENGTH, 0 ])
2207+ rotate ([is_undef(ARM_LIFT_ANGLE) ? 0 : ARM_LIFT_ANGLE, 0 , 0 ])
2208+ translate ([0 , ARM_TIP_X, ARM_TIP_Z ])
22542209 {
22552210 // Pivot pin connecting arms to bucket
22562211 // This is at the arm tip, aligned with arm centerline
@@ -2275,7 +2230,7 @@ module bucket_attachment() {
22752230 // So we offset the bucket up so that point aligns with the arm tip (Z=0 here)
22762231 // Additional offset to keep bucket bottom above ground
22772232 rotate ([BUCKET_TILT_ANGLE, 0 , 0 ])
2278- translate ([0 , 0 , BOBCAT_QA_HEIGHT ]) // Shift bucket up fully so bottom clears ground
2233+ translate ([0 , 100 , BUCKET_HEIGHT - 100 ]) // Shift bucket up (less 100mm) to reach ground from raised pivot
22792234 bucket();
22802235 }
22812236 }
0 commit comments