From 5d4252b62d047505dbd75f2d1a805193732a0587 Mon Sep 17 00:00:00 2001 From: zhao Date: Mon, 2 Jan 2023 23:55:26 -0500 Subject: [PATCH] work on connectingBar --- cases/common.scad | 3 +- cases/rack2/connectingBar.scad | 85 +++++++++++++++++++++++ cases/rack2/connectingBar.stl | Bin 0 -> 122884 bytes cases/rack2/helper/cylindricalFilet.scad | 16 +++++ cases/rack2/helper/sphericalFilet.scad | 15 ++++ cases/rack2/mainRail.scad | 78 ++++++++++++--------- cases/rack2/screws.scad | 55 ++++++++++----- 7 files changed, 197 insertions(+), 55 deletions(-) create mode 100644 cases/rack2/connectingBar.scad create mode 100644 cases/rack2/connectingBar.stl create mode 100644 cases/rack2/helper/cylindricalFilet.scad create mode 100644 cases/rack2/helper/sphericalFilet.scad 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 0000000000000000000000000000000000000000..c1db6c1e0b3c4fd00e6f863ce41a9d66442f1a20 GIT binary patch literal 122884 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 z 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
|gpFH!i}%>|rLF4!+`X>Gyx*?>+tgeK{f+ zF}xJfQ~KilKm22QZ_vL9KRm4-`=X~m_RTTHdqmq0Ut7{|s0|{bj31?6qT}_HzF3p{ zNKFj5&thLp>2nXnx9sWnTgTsf`eV;@5JfK!FGci}zSw6koqTg~))=$mvGx7tY*sw) zvafut@#p?e6z}ou8eiyK_w@T(9wR`o6w&c|N}p>|ETq%cDaL$-d3)4jfA{pe|2b;$ zI?jb0!BRxW>nVM4B(LjaM3gOZJw8=@-Z<-~^m%s1>z@8NQ;A?HqWONx!J|I%c(?~* zUrgz9iTIX1{eJ8CdryBvb`V9M4KGFXl)l(!CoNlAjK|U=53k2Djo$%#G+y`g#~O)X zDWczeM#ef~>zqq`+U1B~#PCu?$2q3ji+{HKl#O_?mXvD-wO{@&N=;Y+ zC@fe*;93&T46#&R6A^j8r#AAMh{)eCA@Z7t;G6TQ@|uX?H%LTY6A}5kl%6WDi3qM& zY$LCU2!2IG|+~wO+@6gI<=A4L$(c{yrnG|Lu-BRHCIE|loe+K8hWM~&#w z+u(jh^yrAV*2aB_=+P1Ux`-Yf5x=hZ6%jo;g5yl|=!oGn2D3!4;o~v<?UX)`9?_$>!S9af(GkPH;PR`@pNii>n)z`({{MX+@q3J= I*j@<#3uiw%0{{R3 literal 0 HcmV?d00001 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); } } }