// Lawnmower washer square thing // length units are millimeters tolerance = 1.00; topMetalWasherLength = 45.00 + tolerance; // this is (basically) square innerShaftDiameter = 22.30; bulbsLength = 32.40; bulbsDiameter = 11.60; bladeWidth = 44.40 + tolerance; washerThickness = 3.00; // 2.00; metalWasherThickness = 4.00; // 3.46; bladeThickness = 2.50; // 2.24; minGuideRidgeThickness = 8.00; // 3.00; bladeBumpWidth = bladeWidth * 0.3333; bladeBumpHeight = bladeThickness; innerShaftRadius = innerShaftDiameter / 2; bulbRadius = bulbsDiameter / 2; washerLength = max(topMetalWasherLength, bladeWidth) + (minGuideRidgeThickness * 2); bladeRidgeThickness = max(minGuideRidgeThickness, (washerLength - bladeWidth) / 2); metalWasherRidgeThickness = max(minGuideRidgeThickness, (washerLength - topMetalWasherLength) / 2); bladeBumpOffsetFromCenter = washerLength * 0.375; circleResolution=360*4; // faces per rotation zFightingOffset=0.01; // offset for shape subtraction module shaft(height) { cylinder(r=innerShaftRadius, h=height, $fn=circleResolution); translate([-(bulbsLength - (bulbRadius * 2)) / 2,-bulbRadius,0]) cube([bulbsLength - (bulbRadius * 2), bulbRadius * 2, height]); translate([innerShaftRadius, 0, 0]) cylinder(r=bulbRadius, h=height, $fn=circleResolution); translate([-innerShaftRadius, 0, 0]) cylinder(r=bulbRadius, h=height, $fn=circleResolution); } module bump(length, width, height) { translate([0, width/2, height]) scale([length, width / 2, height]) rotate([0, 90, 0]) cylinder(r=1, h=1, $fn=circleResolution); translate([0, 0, height]) cube([length, width, height + zFightingOffset]); } //bump(washerLength, bladeBumpWidth + zFightingOffset, washerThickness); difference() { translate([-washerLength / 2, -washerLength / 2, 0]) { cube([washerLength, washerLength, washerThickness]); // blade ridges translate([0, washerLength / 2, washerThickness - zFightingOffset]) { translate([0, - (bladeWidth / 2) - bladeRidgeThickness,0]) cube([washerLength, bladeRidgeThickness, bladeThickness]); translate([0, bladeWidth / 2,0]) cube([washerLength, bladeRidgeThickness, bladeThickness]); } // metal washer ridges (standard) translate([washerLength / 2, 0, - metalWasherThickness + zFightingOffset]) { translate([-(topMetalWasherLength / 2) - metalWasherRidgeThickness, 0,0]) cube([metalWasherRidgeThickness, washerLength, metalWasherThickness]); translate([topMetalWasherLength / 2,0,0]) cube([metalWasherRidgeThickness, washerLength, metalWasherThickness]); } // metal washer ridges (optional) translate([0, washerLength / 2, - metalWasherThickness + zFightingOffset]) { translate([0, -(topMetalWasherLength / 2) - metalWasherRidgeThickness,0]) cube([washerLength, metalWasherRidgeThickness, metalWasherThickness]); translate([0, topMetalWasherLength / 2,0]) cube([washerLength, metalWasherRidgeThickness, metalWasherThickness]); } } translate([0,0,-zFightingOffset]) { // shaft rotate([0,0,0]) shaft(washerThickness + (zFightingOffset * 2)); // blade shaft bumps translate([0, -bladeBumpWidth/2, washerThickness - bladeBumpHeight]) { translate([-(washerLength + bladeBumpOffsetFromCenter), 0, 0]) bump(washerLength, bladeBumpWidth + zFightingOffset, washerThickness); translate([bladeBumpOffsetFromCenter, 0, 0]) bump(washerLength, bladeBumpWidth + zFightingOffset, washerThickness); } } /* // blade stand-in translate([-50, -bladeWidth/2, washerThickness]) #cube([100, bladeWidth, bladeThickness]); // top metal washer stand-in translate([-topMetalWasherLength/2, -topMetalWasherLength/2, -metalWasherThickness]) #cube([topMetalWasherLength, topMetalWasherLength, metalWasherThickness]); */ }