diff --git a/README.md b/README.md index e47c656..49e2b89 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![display](media/renders/rackDisplayRounded.png) -### A parametric 3d-printable mini rack system +### A modular 3d-printable mini rack system - ***Mount Anything:*** Perfect for organizing SBCs, mini PCs, small switches, power hubs, etc. - ***Fully customizable:*** Fully written in OpenSCAD. Everything, from the dimensions of the rack, to the roundness of the corners, can be modified with a simple code change. - ***Printable from home:*** Designed to be printed with conventional FDM printers. Requires minimal supports when printing, and final assembly needs only a few easy-to-source parts. @@ -11,12 +11,12 @@ ## Assembly -Pre-generated STLs for roughly 200mm^3 (mini), 180mm^3 (micro), and 100mm^3 (nano) rack frames can be found in [stl](stl). +Pre-generated STLs for roughly 200mm^3 (mini), 180mm^3 (micro), and 100mm^3 (nano) rack frames can be found in the [stl](stl) dir. These STLs are generated from the files in [rack/print](rack/print), and [rack-mount/print](rack-mount/print) - further information about printing these parts (supports, orientation) can be found in these files. ### Assembly Instructions -Please see [the assembly README here](./assembly-guide) +Please see [the assembly guide](./assembly-guide). ### Required Tools: - 3d FDM Printer - build size requirements depend on configured rack profile @@ -48,7 +48,7 @@ Please see [the assembly README here](./assembly-guide) | [Left Side Wall](./rack/print/sideWallLeft_P.scad) | 1 | | [Right Side Wall](./rack/print/sideWallRight_P.scad) | 1 | | [XY-Plate](./rack/print/xyPlate_P.scad) | 2 | -| [Feet](./rack/print/feet_P.scad) (optional) | 2 | +| [Feet](./rack/print/rackFeet_P.scad) (optional) | 2 | #### Notes: @@ -56,7 +56,7 @@ Please see [the assembly README here](./assembly-guide) - Please also adjust [this file](./config/slicer.scad) to match your slicer settings. - Omitted actual plastic for printing. Any conventional 3d printing plastic should do (PLA, PETG, ABS), but beware of PLA's thermal limits. Higher infill is recommended for all parts. -- For joining two racks, you will need to print 4 [stackConnectorDuals](./rack/print/stackConnectorDual_P.scad), as well as 8 M3 hex nuts, and 8 M3x12 FHCS. +- For joining two racks, you will need to print 4 [rackJoiners](./rack/print/rackJoiner_P.scad), as well as 8 M3 hex nuts, and 8 M3x12 FHCS. - Main front rails use M4 hex nuts and screws. - Side rails are mounted using M3 hex nuts and screws. @@ -74,6 +74,7 @@ Generate all project files for the `micro` profile: `python3 rbuild.py -b all -c micro` This will build all the parts defined in [rack/print](./rack/print), and put the STLs in [stl/micro](./stl/micro). +You can also provide a `-dz {n}` parameter to adjust the height of the generated rack. For generating a specific part: diff --git a/assembly-guide/gifs/attachSideConnectorModulesToYBars.gif b/assembly-guide/gifs/attachSideConnectorModulesToYBars.gif index 4d245df..0230064 100644 Binary files a/assembly-guide/gifs/attachSideConnectorModulesToYBars.gif and b/assembly-guide/gifs/attachSideConnectorModulesToYBars.gif differ diff --git a/assembly-guide/gifs/attachXBarWithYBar.gif b/assembly-guide/gifs/attachXBarWithYBar.gif index 4c4c224..b8f6848 100644 Binary files a/assembly-guide/gifs/attachXBarWithYBar.gif and b/assembly-guide/gifs/attachXBarWithYBar.gif differ diff --git a/assembly-guide/gifs/attachXYPlates.gif b/assembly-guide/gifs/attachXYPlates.gif index a72dc67..6072611 100644 Binary files a/assembly-guide/gifs/attachXYPlates.gif and b/assembly-guide/gifs/attachXYPlates.gif differ diff --git a/assembly-guide/gifs/attachXYTrays.gif b/assembly-guide/gifs/attachXYTrays.gif index 1675175..d7e57e5 100644 Binary files a/assembly-guide/gifs/attachXYTrays.gif and b/assembly-guide/gifs/attachXYTrays.gif differ diff --git a/assembly-guide/gifs/connectXYTrayWithMainRails.gif b/assembly-guide/gifs/connectXYTrayWithMainRails.gif index 9be4550..aac4bf1 100644 Binary files a/assembly-guide/gifs/connectXYTrayWithMainRails.gif and b/assembly-guide/gifs/connectXYTrayWithMainRails.gif differ diff --git a/assembly-guide/gifs/insertFeet.gif b/assembly-guide/gifs/insertFeet.gif index 87cc58c..8805ad4 100644 Binary files a/assembly-guide/gifs/insertFeet.gif and b/assembly-guide/gifs/insertFeet.gif differ diff --git a/assembly-guide/gifs/propUpBottomXYTraywithSideWalls.gif b/assembly-guide/gifs/propUpBottomXYTraywithSideWalls.gif index d36f8f0..4bc0d47 100644 Binary files a/assembly-guide/gifs/propUpBottomXYTraywithSideWalls.gif and b/assembly-guide/gifs/propUpBottomXYTraywithSideWalls.gif differ diff --git a/assembly-guide/gifs/screwFeet.gif b/assembly-guide/gifs/screwFeet.gif index 41491ee..fd3bdea 100644 Binary files a/assembly-guide/gifs/screwFeet.gif and b/assembly-guide/gifs/screwFeet.gif differ diff --git a/assembly-guide/gifs/screwXBarAndYBar.gif b/assembly-guide/gifs/screwXBarAndYBar.gif index 63ad2ed..9e4bb89 100644 Binary files a/assembly-guide/gifs/screwXBarAndYBar.gif and b/assembly-guide/gifs/screwXBarAndYBar.gif differ diff --git a/assembly-guide/gifs/slideHexNutsIntoYBar.gif b/assembly-guide/gifs/slideHexNutsIntoYBar.gif index b0c0bca..1de575b 100644 Binary files a/assembly-guide/gifs/slideHexNutsIntoYBar.gif and b/assembly-guide/gifs/slideHexNutsIntoYBar.gif differ diff --git a/assembly-guide/gifs/slideHexNutsIntoYBarXYPlate.gif b/assembly-guide/gifs/slideHexNutsIntoYBarXYPlate.gif index 03a5e0e..9f67bd4 100644 Binary files a/assembly-guide/gifs/slideHexNutsIntoYBarXYPlate.gif and b/assembly-guide/gifs/slideHexNutsIntoYBarXYPlate.gif differ diff --git a/config/rackFrame.scad b/config/rackFrame.scad index bf5d6bd..649c0e8 100644 --- a/config/rackFrame.scad +++ b/config/rackFrame.scad @@ -1,9 +1,15 @@ - // Manually set this variable to toggle rack profile profileName = "micro"; - _profileConfigs = [ + // You can introduce a custom profile like: + /* + ["custom", [ + ["maxUnitWidth", 180], + ["maxUnitDepth", 120], + ["numRailScrews", 10] + ]], + */ ["default", [ ["maxUnitWidth", 180], ["maxUnitDepth", 180], @@ -27,7 +33,7 @@ _profileConfigs = [ ["mini", [ ["maxUnitWidth", 205], ["maxUnitDepth", 205], - ["numRailScrews", 20] + ["numRailScrews", 16] ]] ]; diff --git a/rack/assembly/slideHexNutToFeet.scad b/rack/assembly/slideHexNutToFeet.scad index a496d64..714b665 100644 --- a/rack/assembly/slideHexNutToFeet.scad +++ b/rack/assembly/slideHexNutToFeet.scad @@ -26,6 +26,6 @@ module slideHexNutToFeet(at=0) { slideNut(); if (!plasticMask) { - stackConnectorFeet(); + rackFeet(); } } diff --git a/rack/print/feet_P.scad b/rack/print/rackFeet_P.scad similarity index 55% rename from rack/print/feet_P.scad rename to rack/print/rackFeet_P.scad index 1df7366..d6dbffd 100644 --- a/rack/print/feet_P.scad +++ b/rack/print/rackFeet_P.scad @@ -1,4 +1,4 @@ use <../stackEnds.scad> -stackConnectorFeet(); \ No newline at end of file +rackFeet(); \ No newline at end of file diff --git a/rack/print/stackConnectorDual_P.scad b/rack/print/rackJoiner_P.scad similarity index 91% rename from rack/print/stackConnectorDual_P.scad rename to rack/print/rackJoiner_P.scad index 7c19131..48b6a95 100644 --- a/rack/print/stackConnectorDual_P.scad +++ b/rack/print/rackJoiner_P.scad @@ -2,4 +2,4 @@ include <../stackEnds.scad> // Oriented for 3d printing. No supports required, but it's reccommended to print this with a brim. // Adding a brim will require some post-processing in the form of trimming the bottom. -stackConnectorDual(); \ No newline at end of file +rackJoiner(); \ No newline at end of file diff --git a/rack/side/sideWallBase.scad b/rack/side/sideWallBase.scad index 9fc3196..570a430 100644 --- a/rack/side/sideWallBase.scad +++ b/rack/side/sideWallBase.scad @@ -131,41 +131,76 @@ module sideWallBase() { } } -module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) { +module applySideWallDefaultVentilation(numVents) { - ribRampLength = 5; - ribWidth = 2; + r = 2; // vent roundness + ventLength = sideWallY - 2*sideWallDefaultVentilationToZEdge; + ventZDiff = (sideWallZ - 2*sideWallDefaultVentilationToYEdge)/(numVents-1); - intersection() { - for (i = [0:numRibs-1]) { - - translate(v = [sideWallThickness, i*ribYDiff, (sideWallZ-ribZ)/2]) - translate(v = [ribExtrusion-ribWidth, 0, 0]) - verticalRib(ribExtend=4, ribWidth=ribWidth); + apply_n() { + for (i = [0:numVents-1]) { + translate(v = [0, sideWallDefaultVentilationToZEdge, i * ventZDiff + sideWallDefaultVentilationToYEdge]) + vent(); } - - halfspace(vpos=[1,0,0], p=[0,0,0]); + children(0); } - - module verticalRib(ribExtend, ribWidth) { - - roundness = 0.5; - + module vent() { + translate(v=[-inf/2,r,-sideWallDefaultVentilationWidth/2]) minkowski() { - hull() { - translate(v=[0,0,roundness]) - cube(size = [eps, ribWidth, eps]); + rotate(a=[0,90,0]) + cylinder(r=r,h=inf); + cube(size = [inf, max(eps, ventLength-2*r), max(eps,sideWallDefaultVentilationWidth-2*r)]); + } + } +} - translate(v = [0, 0, ribRampLength]) - cube(size = [ribExtend, ribWidth, ribZ-2*(ribRampLength+roundness)]); +module applySideWallBracing(numRibs) { - translate(v = [0, 0, ribZ-roundness]) - cube(size = [eps, ribWidth, eps]); + apply_p() { + // TODO add horizontal bracing + sideWallVerticalBracing(numRibs = numRibs); + children(0); + } + + module sideWallVerticalBracing(numRibs, ribZ, ribExtrusion=1) { + + ribRampLength = 5; + ribWidth = 2; + ribZ = sideWallZ; + ribYDiff = sideWallY - 2*sideWallDefaultVerticalBracingToZEdge; + + translate(v=[0,sideWallDefaultVerticalBracingToZEdge,0]) + intersection() { + for (i = [0:numRibs-1]) { + + translate(v = [sideWallThickness, i*ribYDiff, (sideWallZ-ribZ)/2]) + translate(v = [ribExtrusion-ribWidth, 0, 0]) + verticalRib(ribExtend=4, ribWidth=ribWidth); + } + + halfspace(vpos=[1,0,0], p=[0,0,0]); } - sphere(r=roundness); - } + module verticalRib(ribExtend, ribWidth) { + roundness = 0.5; + translate(v=[0,-ribWidth/2,0]) + minkowski() { + hull() { + translate(v=[0,0,roundness]) + cube(size = [eps, ribWidth, eps]); + + translate(v = [0, 0, ribRampLength]) + cube(size = [ribExtend, ribWidth, ribZ-2*(ribRampLength+roundness)]); + + translate(v = [0, 0, ribZ-roundness]) + cube(size = [eps, ribWidth, eps]); + } + + sphere(r=roundness); + } + } } -} \ No newline at end of file +} + diff --git a/rack/side/sideWallLeft.scad b/rack/side/sideWallLeft.scad index 336327f..cd10792 100644 --- a/rack/side/sideWallLeft.scad +++ b/rack/side/sideWallLeft.scad @@ -4,37 +4,9 @@ include <./sideWallBase.scad> module sideWallLeft() { - applySideWallVerticalRibs() - applyEpicVentilation() + numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10); + + applySideWallBracing(numRibs=2) + applySideWallDefaultVentilation(numVents=numVentsCustom) sideWallBase(); - - module applyEpicVentilation() { - apply_n() { - for (i = [1:8]) { - translate(v = [0, 41, i * 12 + 10]) - vent(); - } - children(0); - } - - module vent() { - minkowski() { - rotate(a=[0,90,0]) - cylinder(r=2,h=1); - - cube(size = [10, 100, 1]); - } - } - } - - module applySideWallVerticalRibs() { - echo("sideWallZ", sideWallZ); - apply_p() { - translate(v = [0, 30, 0]) - sideWallVerticalRibs(numRibs = 2, ribZ = sideWallZ, ribYDiff = 120, ribExtrusion = 1.5); - - children(0); - } - } } - diff --git a/rack/side/sideWallRight.scad b/rack/side/sideWallRight.scad index 22c28b0..ca50eb7 100644 --- a/rack/side/sideWallRight.scad +++ b/rack/side/sideWallRight.scad @@ -4,40 +4,11 @@ include <./sideWallBase.scad> module sideWallRight() { - applyEpicVentilation() + numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10); + mirror(v=[1,0,0]) - applySideWallVerticalRibs() + applySideWallBracing(numRibs=2) + applySideWallDefaultVentilation(numVents=numVentsCustom) sideWallBase(); - - module applyEpicVentilation() { - - apply_n() { - translate(v=[-10,0,0]) - for (i = [1:8]) { - translate(v = [0, 41, i * 12 + 10]) - vent(); - } - children(0); - } - - module vent() { - minkowski() { - rotate(a=[0,90,0]) - cylinder(r=2,h=1); - - cube(size = [10, 100, 1]); - } - } - - } - - module applySideWallVerticalRibs() { - apply_p() { - translate(v = [0, 30, 0]) - sideWallVerticalRibs(numRibs = 2, ribZ = sideWallZ, ribYDiff = 120, ribExtrusion = 1.5); - - children(0); - } - } } diff --git a/rack/side/sideWallVariables.scad b/rack/side/sideWallVariables.scad index 060f6c0..7e99a36 100644 --- a/rack/side/sideWallVariables.scad +++ b/rack/side/sideWallVariables.scad @@ -32,3 +32,8 @@ sideWallX = (yBarWidth-(railTotalWidth+railSlotToInnerYEdge)) - sideWallXGapClea hingePoleDx = sideWallSlotToOuterYEdge + sideWallConnW/2.0; hingePoleDy = sideWallY - (sideWallSlotToOuterXEdge + (hingePoleR+radiusXYSlack)); + +sideWallDefaultVerticalBracingToZEdge = 30; +sideWallDefaultVentilationToZEdge = 40; +sideWallDefaultVentilationToYEdge = 25; +sideWallDefaultVentilationWidth = 6; \ No newline at end of file diff --git a/rack/stackEnds.scad b/rack/stackEnds.scad index d1ffa72..ab95048 100644 --- a/rack/stackEnds.scad +++ b/rack/stackEnds.scad @@ -7,7 +7,7 @@ stackConnectorDx = rackTotalWidth - 2*(connectorXEdgeToYBarXEdge + connectorRect stackConnectorDy = rackTotalDepth - 2*(connectorYEdgeToYBarYEdge + connectorRectDepth/2); stackConnectorDualSpacing = 0.5; -module stackConnectorDual() { +module rackJoiner() { translate(v=[0,0,stackConnectorDualSpacing/2]) stackConnectorPlug(); @@ -19,7 +19,7 @@ module stackConnectorDual() { cube(size=[connectorRectWidth+connectorRectPlugSlack, connectorRectDepth+connectorRectPlugSlack, stackConnectorDualSpacing]); } -module stackConnectorFeet() { +module rackFeet() { bandThickness = 2; height = 18;