diff --git a/cases/math.scad b/cases/math.scad new file mode 100644 index 0000000..2abbf42 --- /dev/null +++ b/cases/math.scad @@ -0,0 +1,12 @@ + +/* Example usage: +for (i=mirror4XY(midpoint=[0,0,0], offsetX=90, offsetY=90)) { + translate(v=i) + something(); +} +*/ +function mirror4XY(midpoint, offsetX, offsetY) = + [[midpoint[0]+offsetX, midpoint[1]+offsetY, midpoint[2]], + [midpoint[0]-offsetX, midpoint[1]+offsetY, midpoint[2]], + [midpoint[0]-offsetX, midpoint[1]-offsetY, midpoint[2]], + [midpoint[0]+offsetX, midpoint[1]-offsetY, midpoint[2]]]; diff --git a/cases/misc/magnet.scad b/cases/misc/magnet.scad new file mode 100644 index 0000000..74bedc5 --- /dev/null +++ b/cases/misc/magnet.scad @@ -0,0 +1,6 @@ + + +// Dimensions for small cylindrical neodymium magnets that I bought off Amazon +magnetD = 6; +magnetR = magnetD/2; +magnetH = 1.7; \ No newline at end of file diff --git a/cases/misc/voronoi.scad b/cases/misc/voronoi.scad new file mode 100644 index 0000000..011f8eb --- /dev/null +++ b/cases/misc/voronoi.scad @@ -0,0 +1,95 @@ + +// (c)2013 Felipe Sanches +// licensed under the terms of the GNU GPL version 3 (or later) + +function normalize(v) = v / (sqrt(v[0] * v[0] + v[1] * v[1])); + +// +// The voronoi() function generates a 2D surface, which can be provided to +// a) linear_extrude() to produce a 3D object +// b) intersection() to restrict it to a a specified shape -- see voronoi_polygon.scad +// +// Parameters: +// points (required) ... nuclei coordinates (array of [x, y] pairs) +// L ... the radius of the "world" (the pattern is built within this circle) +// thickness ... the thickness of the lines between cells +// round ... the radius applied to corners (fillet in CAD terms) +// nuclei (bool) ... show nuclei sites +// +// These parameters need to be kept more or less in proportion to each other, and to the distance +// apart of points in the point_set. If one or the other parameter is increased or decreased too +// much, you'll get no output. +// +module voronoi(points, L = 200, thickness = 1, round = 6, nuclei = true) { + for (p = points) { + difference() { + minkowski() { + intersection_for(p1 = points){ + if (p != p1) { + angle = 90 + atan2(p[1] - p1[1], p[0] - p1[0]); + + translate((p + p1) / 2 - normalize(p1 - p) * (thickness + round)) + rotate([0, 0, angle]) + translate([-L, -L]) + square([2 * L, L]); + } + } + circle(r = round, $fn = 20); + } + if (nuclei) + translate(p) circle(r = 1, $fn = 20); + } + } +} + +// +// The random_voronoi() function is the helper wrapper over the voronoi() core. +// It generates random nuclei site coordinates into the square area, +// passing other arguments to voronoi() unchanged. +// +// Parameters: +// n ... number of nuclei sites to be generated +// nuclei (bool) ... show nuclei sites +// L ... the radius of the "world" (the pattern is built within this circle) +// thickness ... the thickness of the lines between cells +// round ... the radius applied to corners (fillet in CAD terms) +// min ... minimum x and y coordinate for nuclei generation +// max ... maximum x and y coordinate for nuclei generation +// seed ... seed for the random generator (random if undefined) +// center (bool) ... move resulting pattern to [0, 0] if true +// +module random_voronoi(n = 20, nuclei = true, L = 200, thickness = 1, round = 6, min = 0, max = 100, seed = undef, center = false) { + seed = seed == undef ? rands(0, 100, 1)[0] : seed; + echo("Seed", seed); + + // Generate points. + x = rands(min, max, n, seed); + y = rands(min, max, n, seed + 1); + points = [ for (i = [0 : n - 1]) [x[i], y[i]] ]; + + // Center Voronoi. + offset_x = center ? -(max(x) - min(x)) / 2 : 0; + offset_y = center ? -(max(y) - min(y)) / 2 : 0; + translate([offset_x, offset_y]) + + voronoi(points, L = L, thickness = thickness, round = round, nuclei = nuclei); +} + +// example with an explicit list of points: +point_set = [ + [0, 0], [30, 0], [20, 10], [50, 20], [15, 30], [85, 30], [35, 30], [12, 60], + [45, 50], [80, 80], [20, -40], [-20, 20], [-15, 10], [-15, 50] +]; +//voronoi(points = point_set, round = 4, nuclei = true); + +module voronoi3u_N(h) { + intersection() { + translate(v=[10,5,0]) + cube(size=[160, 10, h]); + translate(v=[20,-52,0]) + scale(v=[0.40,0.44,10]) + linear_extrude(height=10) + random_voronoi(n = 128, round = 10, min = 0, max = 300, seed = 40, thickness=3.5, nuclei=false); + } +} + diff --git a/cases/open-frame.scad b/cases/open-frame.scad index 5bbc60f..ba17f62 100644 --- a/cases/open-frame.scad +++ b/cases/open-frame.scad @@ -1,14 +1,8 @@ $fn=64; +include <./math.scad> eps=0.1; - -function mirror4XY(midpoint, offsetX, offsetY) = - [[midpoint[0]+offsetX, midpoint[1]+offsetY, midpoint[2]], - [midpoint[0]-offsetX, midpoint[1]+offsetY, midpoint[2]], - [midpoint[0]-offsetX, midpoint[1]-offsetY, midpoint[2]], - [midpoint[0]+offsetX, midpoint[1]-offsetY, midpoint[2]]]; - module leg() { mainLength = 80; upperDim = 20; diff --git a/cases/rockpro/bottom.stl b/cases/profiles/rockpro/bottom.stl similarity index 100% rename from cases/rockpro/bottom.stl rename to cases/profiles/rockpro/bottom.stl diff --git a/cases/rockpro/case.scad b/cases/profiles/rockpro/case.scad similarity index 100% rename from cases/rockpro/case.scad rename to cases/profiles/rockpro/case.scad diff --git a/cases/rockpro/dual-tray-plate-part.scad b/cases/profiles/rockpro/dual-tray-plate-part.scad similarity index 100% rename from cases/rockpro/dual-tray-plate-part.scad rename to cases/profiles/rockpro/dual-tray-plate-part.scad diff --git a/cases/rockpro/dual-tray-plate-part.stl b/cases/profiles/rockpro/dual-tray-plate-part.stl similarity index 100% rename from cases/rockpro/dual-tray-plate-part.stl rename to cases/profiles/rockpro/dual-tray-plate-part.stl diff --git a/cases/rockpro/dual-tray.scad b/cases/profiles/rockpro/dual-tray.scad similarity index 100% rename from cases/rockpro/dual-tray.scad rename to cases/profiles/rockpro/dual-tray.scad diff --git a/cases/rockpro/dual-tray.stl b/cases/profiles/rockpro/dual-tray.stl similarity index 100% rename from cases/rockpro/dual-tray.stl rename to cases/profiles/rockpro/dual-tray.stl diff --git a/cases/rockpro/newcase.scad b/cases/profiles/rockpro/newcase.scad similarity index 100% rename from cases/rockpro/newcase.scad rename to cases/profiles/rockpro/newcase.scad diff --git a/cases/rockpro/newcase.stl b/cases/profiles/rockpro/newcase.stl similarity index 100% rename from cases/rockpro/newcase.stl rename to cases/profiles/rockpro/newcase.stl diff --git a/cases/rockpro/railTest.stl b/cases/profiles/rockpro/railTest.stl similarity index 100% rename from cases/rockpro/railTest.stl rename to cases/profiles/rockpro/railTest.stl diff --git a/cases/rockpro/rockpro.scad b/cases/profiles/rockpro/rockpro.scad similarity index 100% rename from cases/rockpro/rockpro.scad rename to cases/profiles/rockpro/rockpro.scad diff --git a/cases/rockpro/top.stl b/cases/profiles/rockpro/top.stl similarity index 100% rename from cases/rockpro/top.stl rename to cases/profiles/rockpro/top.stl diff --git a/cases/rpi/frontPlate.scad b/cases/profiles/rpi/frontPlate.scad similarity index 79% rename from cases/rpi/frontPlate.scad rename to cases/profiles/rpi/frontPlate.scad index a14ab3d..59df78b 100644 --- a/cases/rpi/frontPlate.scad +++ b/cases/profiles/rpi/frontPlate.scad @@ -92,9 +92,27 @@ module frontPlate() { difference() { difference() { - union() { - rotate(a=[-90,0,0]) - frontPlate(); + + difference() { + union() { + rotate(a = [- 90, 0, 0]) + frontPlate(); + } + + union() { + translate(v=[1,0,0]) + rotate(a=[0,-15, 0]) + translate(v=[0,-50,0]) + cube(size=[100, 100, 30]); + + translate(v=[180-1,0,0]) + mirror(v=[1,0,0]) { + rotate(a = [0, - 15, 0]) + translate(v = [0, - 50, 0]) + cube(size = [100, 100, 30]); + } + } + } // lug holes union() { @@ -105,7 +123,7 @@ difference() { } } for (i=[0:5]) { - translate(v=[5,i*4 - 0.5,-10]) - cube(size=[170, 2, 20]); + translate(v=[5,i*4 - 0.75,-10]) + cube(size=[170, 1.5, 20]); } } \ No newline at end of file diff --git a/cases/profiles/rpi/frontPlate.stl b/cases/profiles/rpi/frontPlate.stl new file mode 100644 index 0000000..5332005 Binary files /dev/null and b/cases/profiles/rpi/frontPlate.stl differ diff --git a/cases/rpi/rpi2b.scad b/cases/profiles/rpi/rpi2b.scad similarity index 97% rename from cases/rpi/rpi2b.scad rename to cases/profiles/rpi/rpi2b.scad index a245c9c..421db07 100644 --- a/cases/rpi/rpi2b.scad +++ b/cases/profiles/rpi/rpi2b.scad @@ -134,11 +134,11 @@ module cutoutProfile_N() { // front I/O mirror(v=[0,1,0]) translate(v=[1, -eps*100, pcbThickness-4]) - cube(size=[58.0 + 0.1, inf50, 18.0 + 0.1]); + cube(size=[58.0 + 0.1, inf50, 19.0 + 0.1]); // side I/O translate(v=[-48-3, (pcbDimensions[1]-54)-10, pcbThickness-4]) - cube(size=[inf50, 64, 18]); + cube(size=[inf50, 64, 19]); } } diff --git a/cases/profiles/rpi/rpi2b.stl b/cases/profiles/rpi/rpi2b.stl new file mode 100644 index 0000000..9b288a1 Binary files /dev/null and b/cases/profiles/rpi/rpi2b.stl differ diff --git a/cases/rpi/rpi2bDimTest.stl b/cases/profiles/rpi/rpi2bDimTest.stl similarity index 100% rename from cases/rpi/rpi2bDimTest.stl rename to cases/profiles/rpi/rpi2bDimTest.stl diff --git a/cases/rpi/top.scad b/cases/profiles/rpi/top.scad similarity index 92% rename from cases/rpi/top.scad rename to cases/profiles/rpi/top.scad index 888267c..4752c9b 100644 --- a/cases/rpi/top.scad +++ b/cases/profiles/rpi/top.scad @@ -4,7 +4,7 @@ difference() { union() { cube(size=[67,95.7,1]); translate(v=[2,2,1]) - cube(size=[63,91.7,3]); + cube(size=[63.2,92,3]); } union() { diff --git a/cases/profiles/rpi/top.stl b/cases/profiles/rpi/top.stl new file mode 100644 index 0000000..f1e520a Binary files /dev/null and b/cases/profiles/rpi/top.stl differ diff --git a/cases/rpi/voronoi.scad b/cases/profiles/rpi/voronoi.scad similarity index 100% rename from cases/rpi/voronoi.scad rename to cases/profiles/rpi/voronoi.scad diff --git a/cases/rack/body/base1.scad b/cases/rack/body/base1.scad index 74ee2fd..10f8711 100644 --- a/cases/rack/body/base1.scad +++ b/cases/rack/body/base1.scad @@ -1,5 +1,5 @@ -include <../common.scad> -include <./screws.scad> +include <../../common.scad> +include <../screws.scad> $fn=64; diff --git a/cases/rack/body/m4Leg.scad b/cases/rack/body/m4Leg.scad index d9c2d11..c0ba7c2 100644 --- a/cases/rack/body/m4Leg.scad +++ b/cases/rack/body/m4Leg.scad @@ -1,5 +1,5 @@ -include <../common.scad> -include <./screws.scad> +include <../../common.scad> +include <../screws.scad> //slack = 0.5; diff --git a/cases/rack/body/side/side.scad b/cases/rack/body/side/side.scad index 350c3e1..bc0bd98 100644 --- a/cases/rack/body/side/side.scad +++ b/cases/rack/body/side/side.scad @@ -1,19 +1,88 @@ -sideHeight = 210; -sideLength = 200; +include <../../../misc/magnet.scad> +include <../../../math.scad> +$fn=64; + +_height = 210; +_depth = 200; + +_thickness = 5; holeOffset = 10; +module _base() { + difference() { + cube(size = [_height, _depth, _thickness], center=true); + union() { + translate(v = [0, 0, 20]) + minkowski() { + sphere(r = 20); + cube(size = [_height - 34, _depth - 34, 1], center = true); -// TODO make helper function for this -screwDiffs = [ - [sideLength-holeOffset, sideHeight-holeOffset,0], - [holeOffset, holeOffset,0], - [sideLength-holeOffset, holeOffset], - [holeOffset, sideHeight-holeOffset], + } + // handles + handleLength = 80; + translate(v=[0, _depth/2, _thickness+5.5]) + minkowski() { + sphere(r=10); + cube(size=[handleLength, 10, 1], center=true); + } + translate(v=[0, -_depth/2, _thickness+5.5]) + minkowski() { + sphere(r=10); + cube(size=[handleLength, 10, 1], center=true); + } + } + } +} + +module magnetMount(h) { + slack = 0.2; + difference() { + cylinder(h = h, r=magnetR*2); + translate(v=[0,0,h-magnetH]) + cylinder(h = magnetH, r = magnetR+slack); + } +} + + +module side() { + magnetMountOffsetX = 95; + magnetMountOffsetY = 90; + difference() { + union() { + // align _base to positive z plan + translate(v = [0, 0, _thickness / 2]) + _base(); + + // magnet mounts (no holes) + for (i=mirror4XY(midpoint=[0,0,0], offsetX=magnetMountOffsetX, offsetY=magnetMountOffsetY)) { + translate(v=i) + cylinder(h=_thickness, r=2*magnetR); + } + } + + // magnet mount holes + for (i=mirror4XY(midpoint=[0,0,_thickness-magnetH], offsetX=magnetMountOffsetX, offsetY=magnetMountOffsetY)) { + translate(v=i) + cylinder(h=magnetH, r=magnetR); + } + } +} + + +difference() { + side(); + + union() { + for (i=[0:7]) { + translate(v=[i*15 - 52.5,0,0]) + minkowski() { + cube(size = [2, 100, 10], center = true); + sphere(r=2); + } + } + + } +} - [sideLength-2*holeOffset, sideHeight-holeOffset,0], - [2*holeOffset, holeOffset,0], - [sideLength-2*holeOffset, holeOffset], - [2*holeOffset, sideHeight-holeOffset] -]; diff --git a/cases/rack/body/side/side.stl b/cases/rack/body/side/side.stl new file mode 100644 index 0000000..7b9db15 Binary files /dev/null and b/cases/rack/body/side/side.stl differ diff --git a/cases/rack/body/top1.scad b/cases/rack/body/top1.scad index 74ee2fd..cc76242 100644 --- a/cases/rack/body/top1.scad +++ b/cases/rack/body/top1.scad @@ -1,79 +1,97 @@ -include <../common.scad> -include <./screws.scad> +include <../../common.scad> +include <../../math.scad> +include <../screws.scad> $fn=64; -module baseFrame() { - difference() { - cube(size=[200,200,4], center=true); - cube(size=[180,180,4], center=true); - } - - translate(v=[80,80,0]) - cube(size=[20,20, 4],center=true); - - translate(v=[-80,80,0]) - cube(size=[20,20, 4],center=true); - - translate(v=[80,-80,0]) - cube(size=[20,20, 4],center=true); - - translate(v=[-80,-80,0]) - cube(size=[20,20, 4],center=true); -} - -module lugBottom() { - difference() { - cube(size=[9.7,9.7,6], center=true); - - translate(v=[2,2,0]) - cube(size=[9.1,9.1,5+1], center=true); - } - -} +_height = 8; +_width = 210; +_depth = 200; -module base() { +module _bodySilBase(width, depth, height, roundedPartHeight) { + hull() { + cube(size = [width, depth, height - roundedPartHeight]); + minkowski() { + translate(v = [roundedPartHeight, 0, height - roundedPartHeight]) + cube(size = [width-2*roundedPartHeight, depth, eps]); - difference() { - union() { - translate(v=[0,0,4/2]) - baseFrame(); - - - translate(v=[-90,-90,-6/2]) - lugBottom(); - - mirror(v=[1,0,0]) - translate(v=[-90,-90,-6/2]) - lugBottom(); - - mirror(v=[0,1,0]) - translate(v=[-90,-90,-6/2]) - lugBottom(); - - mirror(v=[1,1,0]) - translate(v=[-90,-90,-6/2]) - lugBottom(); - } - - union() { - translate(v=[80,80,0]) - cylinder(h = 100, r = m3ptr, $fn=32, center=true); - - translate(v=[-80,80,0]) - cylinder(h = 100, r = m3ptr, $fn=32, center=true); - - translate(v=[80,-80,0]) - cylinder(h = 100, r = m3ptr, $fn=32, center=true); - - translate(v=[-80,-80,0]) - cylinder(h = 100, r = m3ptr, $fn=32, center=true); - + rotate(a = [90, 0, 0]) + cylinder(r = roundedPartHeight, h = eps); } } } -base(); +module _bodySil(width, depth, height, roundedPartHeight, wallThickness, topThickness) { + cornerSquareDim = 30; + + difference() { + _bodySilBase(width, depth, height, roundedPartHeight); + + union() { + translate(v = [wallThickness, cornerSquareDim, - topThickness]) + _bodySilBase(width - 2 * wallThickness, depth - 2 * cornerSquareDim, height, roundedPartHeight); + + translate(v=[cornerSquareDim, wallThickness, -topThickness]) + cube(size=[width-2*cornerSquareDim, depth-2*wallThickness, height]); + } + } +} + +// Negative and centered on xy. Aligned with z=0 downwards +module _lugAndMagnet() { + slack = 0.3; + vSlack = 0.1; + // lug + translate(v=[0,0,-2.5]) + cube(size=[10+slack, 10+slack, 5+vSlack], center=true); + + // hole for magnet, no tolerance on + translate(v=[0,0,-(5+vSlack+1.7)]) + cylinder(d=6+slack, h=1.7+vSlack); +} + +module baseBody() { + difference() { + _bodySil(_width, _depth, _height, 4, 5, 2); + + _mid = [_width / 2, _depth / 2, _height]; + + union() { + + for (i = mirror4XY(midpoint = _mid, offsetX = (_width / 2) - 15, offsetY = (_depth / 2) - 10)) { + translate(v = i) + _lugAndMagnet(); + } + + screwHolePositions = concat( + mirror4XY(midpoint = _mid, offsetX = (_width / 2) - 25, offsetY = (_depth / 2) - 20), + mirror4XY(midpoint = _mid, offsetX = (_width / 2) - 15, offsetY = (_depth / 2) - 20), + mirror4XY(midpoint = _mid, offsetX = (_width / 2) - 25, offsetY = (_depth / 2) - 10) + ); + + for (i = screwHolePositions) { + translate(v = i) { + cylinder(r = m3RadiusSlacked, h = inf, center = true); + + } + } + + } + } +} +difference() { + baseBody(); + + union() { + minkowski() { + translate(v = [(_width - 130) / 2, (_depth - 150) / 2, - inf / 2]) + cube(size = [130, 150, inf]); + + cylinder(r = 5); + } + } +} + diff --git a/cases/rack/body/top1.stl b/cases/rack/body/top1.stl new file mode 100644 index 0000000..50fe498 Binary files /dev/null and b/cases/rack/body/top1.stl differ diff --git a/cases/rack/rackCase.scad b/cases/rack/rackCase.scad index ad833e2..281bf5a 100644 --- a/cases/rack/rackCase.scad +++ b/cases/rack/rackCase.scad @@ -298,7 +298,7 @@ module frontPlateAligned() { frontPlate(); union() { - // lugs + // lugs TODO not recessed enough!! translate(v=[-0.05,-(1.5+boxFrontThickness),-0.05]) cube(size=[4+0.1,2,4+0.1]); diff --git a/cases/rack2/config.scad b/cases/rack2/config.scad new file mode 100644 index 0000000..962fa99 --- /dev/null +++ b/cases/rack2/config.scad @@ -0,0 +1,32 @@ +/* + case-files v2 + This file contains parameters used for declaring/generating a customized rack frame. + + - All dimensions are in millimetres (mm) unless stated otherwise. + - A "_N" appended to a module is meant to denote that this module is a negative volume, and should only be used to + substract from other volumes. +*/ + +// Maximum width for rackmount units. Change this according your max expected enclosure width. +// Changing this will directly affect the required build volume. +maxUnitWidth = 200; + +// Maximum (recommended) unit depth. There technically isn't a max unit depth because there's no physical bound on +// how far a rack unit can extrude back. This parameter basically controls the distance between the front of the front +// rails and the back of the back rails. Changing this will directly affect the required build volume. +maxUnitDepth = 200; + +// Vertical distance between the midpoint of adjacent screws mounts. Affects build volume. +screwDiff = 10; + +// Number screw slots on the main rail. Affects build volume. +numRailScrews = 20; + +// Screw type used for rackmount units. See screws.scad. +railMainScrewType = "m4"; + +// Screw type used to affix side rails. +railSideMountScrewType = "m4"; + +// Screw type used for constructing the actual rack frame. +rackScrewType = "m3"; diff --git a/cases/rack2/mainRail.scad b/cases/rack2/mainRail.scad new file mode 100644 index 0000000..8c5cfd3 --- /dev/null +++ b/cases/rack2/mainRail.scad @@ -0,0 +1,121 @@ +include <./config.scad> +include <./screws.scad> + +// 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; + +/* Small horizontal planes at the top and bottom of the main rails. Used so we can fasten the rail to the frame + Note that this value is also used for a depression at the bottom/top of the frame for aligning the rail */ +railFootThickness = 3; + +railTotalHeight = screwDiff * (numRailScrews+1) + 2*railFootThickness; + + +sideSupportExtraSpace = 2; +sideSupportScrewHoleToFrontEdge = 5; +sideSupportScrewHoleToBackEdge = 4.5; +sideSupportDepth = sideSupportScrewHoleToBackEdge + sideSupportScrewHoleToFrontEdge; + +frontFaceWidth = railScrewHoleToInnerEdge + railScrewHoleToOuterEdge; + + +module _frontRailSegment() { + difference() { + cube(size=[frontFaceWidth, railFrontThickness, railTotalHeight]); + + for (i=[1:numRailScrews]) { + translate(v=[railScrewHoleToOuterEdge, railFrontThickness/2, i*screwDiff + railFootThickness]) + rotate(a=[90,0,0]) + m4HexNutPocketNegative(); + } + } +} + +module _connectingLBracketRailSegment() { + + difference() { + cube(size = [railOtherThickness, frontScrewSpacing + railOtherThickness, railTotalHeight]); + + union () { + translate(v=[0,4,railFootThickness + screwDiff / 2]) + rotate(a=[0,90,0]) + cylinder(r=m3RadiusSlacked, h = 10, $fn=32, center=true); + + translate(v=[0,4,railTotalHeight-(railFootThickness + screwDiff / 2)]) + rotate(a=[0,90,0]) + cylinder(r=m3RadiusSlacked, h = 10, $fn=32, center=true); + } + } + + translate(v=[0, frontScrewSpacing + railOtherThickness, 0]) + rotate(a=[0,0,270]) + cube(size=[railOtherThickness, frontFaceWidth - sideSupportExtraSpace, railTotalHeight]); +} + + +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=m4RadiusSlacked, h=10, $fn=32); + } + } + +} + +module _railFeet() { + + difference() { + cube(size = [frontFaceWidth - sideSupportExtraSpace, sideSupportDepth, railFootThickness]); + + hull() { + translate(v = [1.5, 5, 0]) + cylinder(r = m3RadiusSlacked, h = 10, $fn = 32); + + translate(v = [0, 5, 0]) + cube(size=[0.1, m3RadiusSlacked*2, 10], center=true); + } + } +} + +module mainRail() { + union() { + + _frontRailSegment(); + + translate(v = [0, railFrontThickness, 0]) + _connectingLBracketRailSegment(); + + 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]) + _railFeet(); + } + } +} + +mainRail(); + +echo("Total Rail Height = ", railTotalHeight); diff --git a/cases/rack2/mainRail.stl b/cases/rack2/mainRail.stl new file mode 100644 index 0000000..8c823aa Binary files /dev/null and b/cases/rack2/mainRail.stl differ diff --git a/cases/rack2/screws.scad b/cases/rack2/screws.scad new file mode 100644 index 0000000..266655d --- /dev/null +++ b/cases/rack2/screws.scad @@ -0,0 +1,113 @@ + +/* Some common screw dimensions */ + + +inf = 400; // basically infinity + +/********************************************************************************/ +// M3 dimensions + +m3HoleRadiusSlack = 0.15; +m3Diameter = 3.0; +m3Radius = m3Diameter/2.0; + +m3RadiusSlacked = m3Radius + m3HoleRadiusSlack; + +// legacy TODO: replace +m3ptr = m3RadiusSlacked; + +// NUTS! +m3HexNutWidthAcrossFlats = 5.41; +m3HexNutWidthAcrossCorners = FtoG(m3HexNutWidthAcrossFlats); + +m3HexNutThickness = 2.18; + +module m3HexNutPocketNegative() { + hexNutPocketNegative(m3RadiusSlacked, + m3HexNutWidthAcrossCorners/2 + 0.1, + m3HexNutThickness + 0.2); +} + + +// TODO: remove test + +*difference() { + cube(size=[8,12,5], center=true); + + rotate(a=[0,0,20]) + m3HexNutPocketNegative(); +} + +*m3HexNutPocketNegative(); + + +/********************************************************************************/ +// M4 dimensions + +m4HoleRadiusSlack = 0.15; +m4Diameter = 4.0; +m4Radius = m4Diameter/2.0; +m4RadiusSlacked = m4Radius + m4HoleRadiusSlack; + +m4HexNutWidthAcrossFlats = 6.89; +m4HexNutWidthAcrossCorners = FtoG(m4HexNutWidthAcrossFlats); + +m4HexNutThickness = 3.07; + +module m4HexNutPocketNegative() { + hexNutPocketNegative(m4RadiusSlacked, + m4HexNutWidthAcrossCorners/2 + 0.1, + m4HexNutThickness + 0.2); +} + + +// TODO: remove test + +*difference() { + translate(v=[0,1,0]) + cube(size=[10,12,6], center=true); + + rotate(a=[0,0,20]) + m4HexNutPocketNegative(); +} + +*m4HexNutPocketNegative(); + +/********************************************************************************/ + +// Convert a regular hexagon widthAcrossFlats to widthAcrossCorners +function FtoG(widthAcrossFlats) = widthAcrossFlats * (2/sqrt(3)); + +// Convert a regular hexagon widthAcrossCorners to widthAcrossFlats +function GtoF(widthAcrossCorners) = widthAcrossCorners * (sqrt(3)/2); + + +module hexNutPocketNegative( + 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]) + 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); + + hull() { + translate(v=[inf,0,0]) + cylinder(r=innerRadius, h = inf, $fn=32); + cylinder(r=innerRadius, h = inf, $fn=32); + } + } +} + diff --git a/cases/rockpro/case.scad~ b/cases/rockpro/case.scad~ deleted file mode 100644 index ea47709..0000000 --- a/cases/rockpro/case.scad~ +++ /dev/null @@ -1,214 +0,0 @@ -// test for screw tolerances - -include <./rockpro.scad>; - -include <../power/src/base.scad>; -$fn = 128; -outerD = 4.65; - -innerD = 2.93; - - - -*difference() { - cube(size=[10,50,10]); - union() { - translate(v=[5,10,-1]) - cylinder(h=30,r=innerD/2-0.2); - - translate(v=[5,25,-1]) - cylinder(h=30,r=innerD/2); - - translate(v=[5,40,-1]) - cylinder(h=30,r=innerD/2+0.2); - } -} - - - -module caseOuter() { - rotate(a=[90,0,0]) - minkowski() { - cube(size=[80,40,195], center=true); - cylinder(h=0.00000000001, r=10); - } -} - -module caseInner() { - translate(v=[0,0,2]) - rotate(a=[90,0,0]) - minkowski() { - cube(size=[81.5,47,195+0.01], center=true); - *cylinder(h=0.00000000001, r=5); - } -} - - -module hgill(i) { - minkowski() { - *sphere(r=2); - translate(v=[0,i*10,5]) - rotate(a=[30,0,0]) - cube(size=[200, 4, 30], center=true); - } - } - -module caseShell() { - difference() { - caseOuter(); - - union() { - caseInner(); - - // side perforations - for (i=[-7:7]) { - hgill(i=i); - } - - // top perforations - for (i=[-3:3]) { - translate(v=[0,i*20,50]) - cube(size=[75,10,60], center=true); - } - - // bottom perforations - for (i=[2:4]) { - translate(v=[0,i*20,-20]) - cube(size=[60,8,50], center=true); - } - - for (i=[-4:0]) { - translate(v=[0,i*20,-20]) - cube(size=[60,8,50], center=true); - } - - } - } -} - - -module faceMountDiffs() { -translate(v=[45,0,20]) -rotate(a=[90,0,0]) -cylinder(r=innerD/2,h=300, center=true); - -translate(v=[45,0,-20]) -rotate(a=[90,0,0]) -cylinder(r=innerD/2,h=300, center=true); - -translate(v=[-45,0,-20]) -rotate(a=[90,0,0]) -cylinder(r=innerD/2,h=300, center=true); - -translate(v=[-45,0,20]) -rotate(a=[90,0,0]) -cylinder(r=innerD/2,h=300, center=true); -} - - -module caseWithMountHoles() { - difference() { - - union() { - caseShell(); - - translate(v=[-35, 25,-27.5]) - rotate(a=[0,0,-90]) - rockProMountPoints(6, 3.8, 64, false); - } - - union() { - translate(v=[-35, 25,-27.5]) - rotate(a=[0,0,-90]) - rockProMountPoints(6, innerD/2, 64, false); - - faceMountDiffs(); - } - } -} - -*caseWithMountHoles(); - - -module bottomTray() { -difference() { - -union() { -intersection() { - caseWithMountHoles(); - translate(v=[0,0,-115]) - cube(size=[500,500,200], center=true); -} - -translate(v=[-45.5,0,-15]) -rotate(a=[90,90,0]) -joinTriangle(185); - -translate(v=[45.5,0,-15]) -rotate(a=[90,90,0]) -joinTriangle(185); -} - - // bottom lugs - union() { - translate(v=[-40,-90,-29]) - cube(size=[10.2,10.2,2.5], center=true); - - translate(v=[40,-90,-29]) - cube(size=[10.2,10.2,2.5],center=true); - - translate(v=[40,90,-29]) - cube(size=[10.2,10.2,2.5],center=true); - - translate(v=[-40,90,-29]) - cube(size=[10.2,10.2,2.5],center=true); - } -} -} - - -module topTray() { - difference () { - union() { - difference() { - caseWithMountHoles(); - translate(v=[0,0,-115]) - cube(size=[500,500,200], center=true); - } - } - // bottom lugs - union() { - translate(v=[-40,-90,29]) - cube(size=[10.2,10.2,2.5], center=true); - - translate(v=[40,-90,29]) - cube(size=[10.2,10.2,2.5],center=true); - - translate(v=[40,90,29]) - cube(size=[10.2,10.2,2.5],center=true); - - translate(v=[-40,90,29]) - cube(size=[10.2,10.2,2.5],center=true); - - - - translate(v=[-45.5,0,-15]) - rotate(a=[90,90,0]) - scale(v=[1,0.9,1]) - joinTriangle(300); - - translate(v=[45.5,0,-15]) - rotate(a=[90,90,0]) - scale(v=[1,0.9,1]) - joinTriangle(300); - } - } -} - -topTray(); - -// TODO make sure rail works!!! - - -scale(v=[1,0.9,1]) -*joinTriangle(10); diff --git a/cases/rockpro/newcase.scad~ b/cases/rockpro/newcase.scad~ deleted file mode 100644 index 18d1574..0000000 --- a/cases/rockpro/newcase.scad~ +++ /dev/null @@ -1,66 +0,0 @@ - -include <./rockpro.scad>; - -include <../power/src/base.scad>; -$fn = 128; -outerD = 4.65; - -innerD = 2.93; - - - - - -module caseOuter() { - rotate(a=[90,0,0]) - minkowski() { - cube(size=[80,40,195], center=true); - cylinder(h=0.00000000001, r=10); - } -} - -module caseInner() { - translate(v=[0,0,2]) - rotate(a=[90,0,0]) - minkowski() { - cube(size=[81.5,47,195+0.01], center=true); - *cylinder(h=0.00000000001, r=5); - } -} - - -module caseShell() { - difference() { - caseOuter(); - - union() { - caseInner(); - - // side perforations - for (i=[-7:7]) { - hgill(i=i); - } - - // top perforations - for (i=[-3:3]) { - translate(v=[0,i*20,50]) - cube(size=[75,10,60], center=true); - } - - // bottom perforations - for (i=[2:4]) { - translate(v=[0,i*20,-20]) - cube(size=[60,8,50], center=true); - } - - for (i=[-4:0]) { - translate(v=[0,i*20,-20]) - cube(size=[60,8,50], center=true); - } - - } - } -} - - -caseShell(); diff --git a/cases/rpi/frontPlate.stl b/cases/rpi/frontPlate.stl deleted file mode 100644 index 6ca878d..0000000 Binary files a/cases/rpi/frontPlate.stl and /dev/null differ diff --git a/cases/rpi/rpi2b.stl b/cases/rpi/rpi2b.stl deleted file mode 100644 index 3a75d79..0000000 Binary files a/cases/rpi/rpi2b.stl and /dev/null differ diff --git a/cases/rpi/top.stl b/cases/rpi/top.stl deleted file mode 100644 index 360382a..0000000 Binary files a/cases/rpi/top.stl and /dev/null differ diff --git a/cases/sinusoid.scad b/cases/sinusoid.scad index 2248b8b..ef74b32 100644 --- a/cases/sinusoid.scad +++ b/cases/sinusoid.scad @@ -25,15 +25,15 @@ module sineWave(length, resolution, amplitudeFunction, period, shift) { idx_curr = i * dx; hull() { translate(v = [idx_prev, amplitudeFunction(idx_prev) * sinR(p * idx_prev + shift), 0]) - cube(size = [0.1, 1, 1]); + cube(size = [0.1, 2, 2]); translate(v = [idx_curr, amplitudeFunction(idx_curr) * sinR(p * idx_curr + shift), 0]) - cube(size = [0.1, 1, 1]); + cube(size = [0.1, 2, 2]); translate(v = [idx_curr, -10, 0]) - cube(size=[0.1,1,1]); + cube(size=[0.1,2,2]); translate(v = [idx_prev, -10, 0]) - cube(size=[0.1,1,1]); + cube(size=[0.1,2,2]); } } } @@ -47,15 +47,15 @@ module sineWaveHull(length, resolution, amplitudeFunction, period, shift, hullDi idx_curr = i * dx; hull() { translate(v = [idx_prev, amplitudeFunction(idx_prev) * sinR(p * idx_prev + shift), 0]) - cube(size = [0.1, 1, 1]); + cube(size = [0.1, 2, 2]); translate(v = [idx_curr, amplitudeFunction(idx_curr) * sinR(p * idx_curr + shift), 0]) - cube(size = [0.1, 1, 1]); + cube(size = [0.1, 2, 2]); translate(v = [idx_curr, -hullDiff, 0]) - cube(size=[0.1,1,1]); + cube(size=[0.1,2,2]); translate(v = [idx_prev, -hullDiff, 0]) - cube(size=[0.1,1,1]); + cube(size=[0.1,2,2]); } } }