diff --git a/cases/common.scad b/cases/common.scad index 3e73cf3..99fe71a 100644 --- a/cases/common.scad +++ b/cases/common.scad @@ -5,8 +5,7 @@ $fn=64; - -eps=0.01; +eps=0.0001; inf10 = 10; inf50 = 50; diff --git a/cases/rack2/connectingBar.scad b/cases/rack2/connectingBar.scad new file mode 100644 index 0000000..75372fc --- /dev/null +++ b/cases/rack2/connectingBar.scad @@ -0,0 +1,85 @@ +include <../math.scad> +include <./config.scad> +include <./screws.scad> +include <./mainRail.scad> +include <./helper/sphericalFilet.scad> +include <./helper/cylindricalFilet.scad> + + +// TODO: How do I nicely explain this? +railSlotSpacing = 4; +sideSpacing = 12; + +barDepth = maxUnitDepth + 2*railSlotSpacing; +barWidth = railSlotSpacing + railTotalWidth + sideSpacing; +barHeight = 15; + +barWallThickness = 3; +barRoundness = 12; + +echo("Bar total depth: ", barDepth); +echo("Bar total width: ", barWidth); + +module connectingBar() { + + module _positive() { + minkowski() { + difference() { + sphericalFiletEdge(barWidth, barDepth, barHeight, barRoundness); + + translate(v = [barWallThickness, 40, barWallThickness]) + cylindricalFiletEdge(barWidth, barDepth-80, barHeight, barRoundness); + } + } + } + + + module _stackConn() { + translate(v=[0,0,0]) + cube(size = [10, 10, 5]); + + translate(v=[5,5,5]) + cylinder(r=2, h=2); + } + + module _sideConnector() { + //translate(v=[1.5, railTotalDepth - 4, -m3HeatSetInsertSlotHeightSlacked]) + rotate(a=[0,90,0]) + heatSetInsertSlot_N(rackFrameScrewType); + } + + module _test() { + difference() { + _positive(); + + union() { + translate(v=[10,10,0]) + _stackConn(); + + translate(v=[barWidth - (railTotalWidth + railSlotSpacing), railSlotSpacing, barHeight - railFootThickness]) + railFeetSlot_N(); + + translate(v=[barWidth - m3HeatSetInsertSlotHeightSlacked + eps, 6, 7.5]) + _sideConnector(); + + translate(v=[barWidth - m3HeatSetInsertSlotHeightSlacked + eps, 35, 7.5]) + _sideConnector(); + } + } + + } + _test(); + + translate(v=[barWidth - m3HeatSetInsertSlotHeightSlacked + eps, 6, 7.5]) + _sideConnector(); + +} + +connectingBar(); + + +intersection() { + connectingBar(); + + cube(size=[15,100,100]); +} diff --git a/cases/rack2/connectingBar.stl b/cases/rack2/connectingBar.stl new file mode 100644 index 0000000..c1db6c1 Binary files /dev/null and b/cases/rack2/connectingBar.stl differ diff --git a/cases/rack2/helper/cylindricalFilet.scad b/cases/rack2/helper/cylindricalFilet.scad new file mode 100644 index 0000000..7a04feb --- /dev/null +++ b/cases/rack2/helper/cylindricalFilet.scad @@ -0,0 +1,16 @@ + +module cylindricalFiletEdge(width, depth, height, roundness) { + rd = roundness; + + intersection() { + minkowski() { + rotate(a = [90, 0, 0]) + cylinder(r = rd, h = eps); + + translate(v = [rd, 0, rd]) + cube(size = [width, depth, height]); + } + + cube(size = [width, depth, height]); + } +} \ No newline at end of file diff --git a/cases/rack2/helper/sphericalFilet.scad b/cases/rack2/helper/sphericalFilet.scad new file mode 100644 index 0000000..da78faf --- /dev/null +++ b/cases/rack2/helper/sphericalFilet.scad @@ -0,0 +1,15 @@ + +module sphericalFiletEdge(width, depth, height, roundness) { + rd = roundness; + + intersection() { + minkowski() { + sphere(r = rd); + + translate(v = [rd, rd, rd]) + cube(size = [width*2, depth - 2*rd, height*2]); + } + + cube(size = [width, depth, height]); + } +} diff --git a/cases/rack2/mainRail.scad b/cases/rack2/mainRail.scad index bb51005..a1e8e27 100644 --- a/cases/rack2/mainRail.scad +++ b/cases/rack2/mainRail.scad @@ -1,4 +1,5 @@ include <./config.scad> +include <../math.scad> include <./screws.scad> /* Small horizontal planes at the top and bottom of the main rails. Used so we can fasten the rail to the frame @@ -7,47 +8,49 @@ railFootThickness = 3; railTotalHeight = screwDiff * (numRailScrews + 1) + 2 * railFootThickness; -mainRail(); -echo("Total Rail Height = ", railTotalHeight); +// Distance between the middle of a screw mount and the rail's vertical edges +railScrewHoleToInnerEdge = 5; +railScrewHoleToOuterEdge = 5; + +// Distance between the midpoint of the rail screw holes. +rackMountScrewWidth = maxUnitWidth + 2 * railScrewHoleToInnerEdge; + +railFrontThickness = 6; // Make sure that the nuts for the chosen screw type can slot within the front face +railSideMountThickness = 2.5; +railOtherThickness = 2.5; + +// Extra spacing for screws. +frontScrewSpacing = 8; + +sideSupportExtraSpace = 2; +sideSupportScrewHoleToFrontEdge = 5; +sideSupportScrewHoleToBackEdge = 4.5; +sideSupportDepth = sideSupportScrewHoleToBackEdge + sideSupportScrewHoleToFrontEdge; + +frontFaceWidth = railScrewHoleToInnerEdge + railScrewHoleToOuterEdge; + +railTotalWidth = frontFaceWidth; +railTotalDepth = railFrontThickness+railOtherThickness+frontScrewSpacing+sideSupportDepth; + + +*mainRail(); +echo("Total Rail Height: ", railTotalHeight); module mainRail() { - // Distance between the middle of a screw mount and the rail's vertical edges - - railScrewHoleToInnerEdge = 5; - railScrewHoleToOuterEdge = 5; - - // Distance between the midpoint of the rail screw holes. - rackMountScrewWidth = maxUnitWidth + 2 * railScrewHoleToInnerEdge; - - railFrontThickness = 6; // Make sure that the nuts for the chosen screw type can slot within the front face - railSideMountThickness = 2.5; - railOtherThickness = 2.5; - - - // Extra spacing for the rack unit screws. - frontScrewSpacing = 8; - - sideSupportExtraSpace = 2; - sideSupportScrewHoleToFrontEdge = 5; - sideSupportScrewHoleToBackEdge = 4.5; - sideSupportDepth = sideSupportScrewHoleToBackEdge + sideSupportScrewHoleToFrontEdge; - - frontFaceWidth = railScrewHoleToInnerEdge + railScrewHoleToOuterEdge; - union() { _frontRailSegment(); translate(v = [0, railFrontThickness, 0]) _connectingLBracketRailSegment(); - translate(v = [frontFaceWidth - sideSupportExtraSpace, railFrontThickness + railOtherThickness + frontScrewSpacing, - 0]) + translate(v = [frontFaceWidth-sideSupportExtraSpace, railFrontThickness+railOtherThickness+frontScrewSpacing, 0]) rotate(a = [0, 0, 90]) _sideSupportSegment(); translate(v = [0, railFrontThickness + railOtherThickness + frontScrewSpacing, 0]) { + _railFeet(); translate(v = [0, 0, railTotalHeight - railFootThickness]) @@ -68,7 +71,6 @@ module mainRail() { } module _connectingLBracketRailSegment() { - difference() { cube(size = [railOtherThickness, frontScrewSpacing + railOtherThickness, railTotalHeight]); @@ -79,7 +81,7 @@ module mainRail() { translate(v = [0, 4, railTotalHeight - (railFootThickness + screwDiff / 2)]) rotate(a = [0, 90, 0]) - cylinder(r = screwRadiusSlacked(rackFrameScrewType), h = 10, $fn = 32, center = true); + cylinder(r = screwRadiusSlacked(rackFrameScrewType), h = inf10, $fn = 32, center = true); } } @@ -90,32 +92,40 @@ module mainRail() { module _sideSupportSegment() { - difference() { cube(size = [sideSupportDepth, railSideMountThickness, railTotalHeight]); for (i = [1:numRailScrews]) { translate(v = [sideSupportScrewHoleToFrontEdge, railFrontThickness / 2, i * screwDiff + railFootThickness]) rotate(a = [90, 0, 0]) - cylinder(r = screwRadiusSlacked(mainRailSideMountScrewType), h = 10, $fn = 32); + cylinder(r = screwRadiusSlacked(mainRailSideMountScrewType), h = inf10, $fn = 32); } } } module _railFeet() { - difference() { cube(size = [frontFaceWidth - sideSupportExtraSpace, sideSupportDepth, railFootThickness]); hull() { translate(v = [1.5, 5, 0]) - cylinder(r = screwRadiusSlacked(rackFrameScrewType), h = 10, $fn = 32); + cylinder(r = screwRadiusSlacked(rackFrameScrewType), h = inf10, $fn = 32); translate(v = [0, 5, 0]) - cube(size = [0.1, screwRadiusSlacked(rackFrameScrewType) * 2, 10], center = true); + cube(size = [eps, screwRadiusSlacked(rackFrameScrewType) * 2, 10], center = true); } } } } + +module railFeetSlot_N() { + + union() { + cube(size = [railTotalWidth, railTotalDepth, railFootThickness]); + + translate(v=[1.5, railTotalDepth - 4, -m3HeatSetInsertSlotHeightSlacked]) + heatSetInsertSlot_N(rackFrameScrewType); + } +} diff --git a/cases/rack2/screws.scad b/cases/rack2/screws.scad index 3f9c75f..bb51c50 100644 --- a/cases/rack2/screws.scad +++ b/cases/rack2/screws.scad @@ -1,6 +1,7 @@ /* Some common screw dimensions and helper functions/modules */ -inf = 400; +include <../math.scad> +include <../common.scad> /********************************************************************************/ // M3 dimensions @@ -8,10 +9,20 @@ m3HoleRadiusSlack = 0.15; m3Diameter = 3.0; m3Radius = m3Diameter / 2.0; m3RadiusSlacked = m3Radius + m3HoleRadiusSlack; + m3HexNutWidthAcrossFlats = 5.41; m3HexNutWidthAcrossCorners = FtoG(m3HexNutWidthAcrossFlats); m3HexNutThickness = 2.18; +m3HeatSetInsertSlotRadiusSlack = 0.0; +m3HeatSetInsertSlotHeightSlack = 0.5; + +m3HeatSetInsertSlotRadius = 2.5; +m3HeatSetInsertSlotHeight = 6; + +m3HeatSetInsertSlotRadiusSlacked = m3HeatSetInsertSlotRadius+m3HeatSetInsertSlotRadiusSlack; +m3HeatSetInsertSlotHeightSlacked = m3HeatSetInsertSlotHeight+m3HeatSetInsertSlotHeightSlack; + /********************************************************************************/ // M4 dimensions m4HoleRadiusSlack = 0.15; @@ -23,6 +34,22 @@ m4HexNutWidthAcrossCorners = FtoG(m4HexNutWidthAcrossFlats); m4HexNutThickness = 3.07; /********************************************************************************/ + +module heatSetInsertSlot_N(screwType) { + if (screwType == "m3") { + union() { + // actual slot for insert + cylinder(h = m3HeatSetInsertSlotHeightSlacked, r = m3HeatSetInsertSlotRadiusSlacked); + + // extra space above slot to help with insertion + translate(v=[0, 0, m3HeatSetInsertSlotHeightSlacked]) + cylinder(h = inf50, r = 1.3*m3HeatSetInsertSlotRadiusSlacked); + } + } else { + error("Unsupported screw type"); + } +} + function screwRadiusSlacked(screwType) = (screwType == "m3") ? m3RadiusSlacked @@ -30,45 +57,35 @@ function screwRadiusSlacked(screwType) = ? m4RadiusSlacked : error("Unsupported screw type"); - module hexNutPocket_N(screwType) { if (screwType == "m3") { - hexNutPocketHelper_N(m3RadiusSlacked, - m3HexNutWidthAcrossCorners / 2 + 0.1, - m3HexNutThickness + 0.2); + hexNutPocketHelper_N(m3RadiusSlacked, m3HexNutWidthAcrossCorners / 2 + 0.1, m3HexNutThickness + 0.2); } else if (screwType == "m4") { - hexNutPocketHelper_N(m4RadiusSlacked, - m4HexNutWidthAcrossCorners / 2 + 0.1, - m4HexNutThickness + 0.2); + hexNutPocketHelper_N(m4RadiusSlacked, m4HexNutWidthAcrossCorners / 2 + 0.1, m4HexNutThickness + 0.2); } else { error("Unsupported screw type"); } } -module hexNutPocketHelper_N( -innerRadius, -widthAcrossCorners, -thickness) -{ +module hexNutPocketHelper_N(innerRadius, widthAcrossCorners, thickness) { union() { - hull() { // hexagonal cylinder representing where the nut should fit cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); // negative volume for sliding in the nut - translate(v = [inf, 0, 0]) + translate(v = [inf50, 0, 0]) cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); } // negative volume for screw lead translate(v = [0, 0, - 10]) - cylinder(r = innerRadius, h = inf, $fn = 32); + cylinder(r = innerRadius, h = inf50, $fn = 32); hull() { - translate(v = [inf, 0, 0]) - cylinder(r = innerRadius, h = inf, $fn = 32); - cylinder(r = innerRadius, h = inf, $fn = 32); + translate(v = [inf50, 0, 0]) + cylinder(r = innerRadius, h = inf50, $fn = 32); + cylinder(r = innerRadius, h = inf50, $fn = 32); } } }