2024-04-26 01:50:36 +01:00
|
|
|
// 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;
|
2024-11-21 02:28:34 +00:00
|
|
|
washerThickness = 3.00; // 2.00;
|
|
|
|
metalWasherThickness = 4.00; // 3.46;
|
|
|
|
bladeThickness = 2.50; // 2.24;
|
2024-04-26 01:50:36 +01:00
|
|
|
|
2024-11-21 02:28:34 +00:00
|
|
|
minGuideRidgeThickness = 8.00; // 3.00;
|
|
|
|
|
|
|
|
bladeBumpWidth = bladeWidth * 0.3333;
|
|
|
|
bladeBumpHeight = bladeThickness;
|
2024-04-26 01:50:36 +01:00
|
|
|
|
|
|
|
innerShaftRadius = innerShaftDiameter / 2;
|
|
|
|
bulbRadius = bulbsDiameter / 2;
|
|
|
|
washerLength = max(topMetalWasherLength, bladeWidth) + (minGuideRidgeThickness * 2);
|
|
|
|
bladeRidgeThickness = max(minGuideRidgeThickness, (washerLength - bladeWidth) / 2);
|
|
|
|
metalWasherRidgeThickness = max(minGuideRidgeThickness, (washerLength - topMetalWasherLength) / 2);
|
|
|
|
|
2024-11-21 02:28:34 +00:00
|
|
|
bladeBumpOffsetFromCenter = washerLength * 0.375;
|
|
|
|
|
2024-04-26 01:50:36 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2024-11-21 02:28:34 +00:00
|
|
|
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);
|
|
|
|
|
2024-04-26 01:50:36 +01:00
|
|
|
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]);
|
|
|
|
}
|
2024-11-21 02:28:34 +00:00
|
|
|
// metal washer ridges (standard)
|
|
|
|
translate([washerLength / 2, 0, - metalWasherThickness + zFightingOffset]) {
|
2024-04-26 01:50:36 +01:00
|
|
|
translate([-(topMetalWasherLength / 2) - metalWasherRidgeThickness, 0,0])
|
|
|
|
cube([metalWasherRidgeThickness, washerLength, metalWasherThickness]);
|
|
|
|
translate([topMetalWasherLength / 2,0,0])
|
|
|
|
cube([metalWasherRidgeThickness, washerLength, metalWasherThickness]);
|
|
|
|
}
|
2024-11-21 02:28:34 +00:00
|
|
|
// 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]);
|
|
|
|
}
|
2024-04-26 01:50:36 +01:00
|
|
|
}
|
2024-11-21 02:28:34 +00:00
|
|
|
translate([0,0,-zFightingOffset]) {
|
|
|
|
// shaft
|
2024-04-26 01:50:36 +01:00
|
|
|
rotate([0,0,0])
|
|
|
|
shaft(washerThickness + (zFightingOffset * 2));
|
2024-11-21 02:28:34 +00:00
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
}
|
2024-04-26 01:50:36 +01:00
|
|
|
/*
|
|
|
|
// 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]);
|
|
|
|
*/
|
|
|
|
}
|