fix ventilation for sidewalls
11
README.md
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 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.
|
- ***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.
|
- ***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.
|
- ***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
|
## 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
|
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.
|
(supports, orientation) can be found in these files.
|
||||||
|
|
||||||
### Assembly Instructions
|
### Assembly Instructions
|
||||||
Please see [the assembly README here](./assembly-guide)
|
Please see [the assembly guide](./assembly-guide).
|
||||||
|
|
||||||
### Required Tools:
|
### Required Tools:
|
||||||
- 3d FDM Printer - build size requirements depend on configured rack profile
|
- 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 |
|
| [Left Side Wall](./rack/print/sideWallLeft_P.scad) | 1 |
|
||||||
| [Right Side Wall](./rack/print/sideWallRight_P.scad) | 1 |
|
| [Right Side Wall](./rack/print/sideWallRight_P.scad) | 1 |
|
||||||
| [XY-Plate](./rack/print/xyPlate_P.scad) | 2 |
|
| [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:
|
#### 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.
|
- 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),
|
- 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.
|
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.
|
- Main front rails use M4 hex nuts and screws.
|
||||||
- Side rails are mounted using M3 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`
|
`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).
|
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:
|
For generating a specific part:
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 326 KiB After Width: | Height: | Size: 339 KiB |
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 86 KiB |
@ -1,9 +1,15 @@
|
|||||||
|
|
||||||
// Manually set this variable to toggle rack profile
|
// Manually set this variable to toggle rack profile
|
||||||
profileName = "micro";
|
profileName = "micro";
|
||||||
|
|
||||||
|
|
||||||
_profileConfigs = [
|
_profileConfigs = [
|
||||||
|
// You can introduce a custom profile like:
|
||||||
|
/*
|
||||||
|
["custom", [
|
||||||
|
["maxUnitWidth", 180],
|
||||||
|
["maxUnitDepth", 120],
|
||||||
|
["numRailScrews", 10]
|
||||||
|
]],
|
||||||
|
*/
|
||||||
["default", [
|
["default", [
|
||||||
["maxUnitWidth", 180],
|
["maxUnitWidth", 180],
|
||||||
["maxUnitDepth", 180],
|
["maxUnitDepth", 180],
|
||||||
@ -27,7 +33,7 @@ _profileConfigs = [
|
|||||||
["mini", [
|
["mini", [
|
||||||
["maxUnitWidth", 205],
|
["maxUnitWidth", 205],
|
||||||
["maxUnitDepth", 205],
|
["maxUnitDepth", 205],
|
||||||
["numRailScrews", 20]
|
["numRailScrews", 16]
|
||||||
]]
|
]]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,6 @@ module slideHexNutToFeet(at=0) {
|
|||||||
slideNut();
|
slideNut();
|
||||||
|
|
||||||
if (!plasticMask) {
|
if (!plasticMask) {
|
||||||
stackConnectorFeet();
|
rackFeet();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use <../stackEnds.scad>
|
use <../stackEnds.scad>
|
||||||
|
|
||||||
|
|
||||||
stackConnectorFeet();
|
rackFeet();
|
||||||
@ -2,4 +2,4 @@ include <../stackEnds.scad>
|
|||||||
|
|
||||||
// Oriented for 3d printing. No supports required, but it's reccommended to print this with a brim.
|
// 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.
|
// Adding a brim will require some post-processing in the form of trimming the bottom.
|
||||||
stackConnectorDual();
|
rackJoiner();
|
||||||
@ -131,41 +131,76 @@ module sideWallBase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) {
|
module applySideWallDefaultVentilation(numVents) {
|
||||||
|
|
||||||
ribRampLength = 5;
|
r = 2; // vent roundness
|
||||||
ribWidth = 2;
|
ventLength = sideWallY - 2*sideWallDefaultVentilationToZEdge;
|
||||||
|
ventZDiff = (sideWallZ - 2*sideWallDefaultVentilationToYEdge)/(numVents-1);
|
||||||
|
|
||||||
intersection() {
|
apply_n() {
|
||||||
for (i = [0:numRibs-1]) {
|
for (i = [0:numVents-1]) {
|
||||||
|
translate(v = [0, sideWallDefaultVentilationToZEdge, i * ventZDiff + sideWallDefaultVentilationToYEdge])
|
||||||
translate(v = [sideWallThickness, i*ribYDiff, (sideWallZ-ribZ)/2])
|
vent();
|
||||||
translate(v = [ribExtrusion-ribWidth, 0, 0])
|
|
||||||
verticalRib(ribExtend=4, ribWidth=ribWidth);
|
|
||||||
}
|
}
|
||||||
|
children(0);
|
||||||
halfspace(vpos=[1,0,0], p=[0,0,0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module vent() {
|
||||||
module verticalRib(ribExtend, ribWidth) {
|
translate(v=[-inf/2,r,-sideWallDefaultVentilationWidth/2])
|
||||||
|
|
||||||
roundness = 0.5;
|
|
||||||
|
|
||||||
minkowski() {
|
minkowski() {
|
||||||
hull() {
|
rotate(a=[0,90,0])
|
||||||
translate(v=[0,0,roundness])
|
cylinder(r=r,h=inf);
|
||||||
cube(size = [eps, ribWidth, eps]);
|
cube(size = [inf, max(eps, ventLength-2*r), max(eps,sideWallDefaultVentilationWidth-2*r)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
translate(v = [0, 0, ribRampLength])
|
module applySideWallBracing(numRibs) {
|
||||||
cube(size = [ribExtend, ribWidth, ribZ-2*(ribRampLength+roundness)]);
|
|
||||||
|
|
||||||
translate(v = [0, 0, ribZ-roundness])
|
apply_p() {
|
||||||
cube(size = [eps, ribWidth, eps]);
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,37 +4,9 @@ include <./sideWallBase.scad>
|
|||||||
|
|
||||||
module sideWallLeft() {
|
module sideWallLeft() {
|
||||||
|
|
||||||
applySideWallVerticalRibs()
|
numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10);
|
||||||
applyEpicVentilation()
|
|
||||||
|
applySideWallBracing(numRibs=2)
|
||||||
|
applySideWallDefaultVentilation(numVents=numVentsCustom)
|
||||||
sideWallBase();
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,40 +4,11 @@ include <./sideWallBase.scad>
|
|||||||
|
|
||||||
module sideWallRight() {
|
module sideWallRight() {
|
||||||
|
|
||||||
applyEpicVentilation()
|
numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10);
|
||||||
|
|
||||||
mirror(v=[1,0,0])
|
mirror(v=[1,0,0])
|
||||||
applySideWallVerticalRibs()
|
applySideWallBracing(numRibs=2)
|
||||||
|
applySideWallDefaultVentilation(numVents=numVentsCustom)
|
||||||
sideWallBase();
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,3 +32,8 @@ sideWallX = (yBarWidth-(railTotalWidth+railSlotToInnerYEdge)) - sideWallXGapClea
|
|||||||
|
|
||||||
hingePoleDx = sideWallSlotToOuterYEdge + sideWallConnW/2.0;
|
hingePoleDx = sideWallSlotToOuterYEdge + sideWallConnW/2.0;
|
||||||
hingePoleDy = sideWallY - (sideWallSlotToOuterXEdge + (hingePoleR+radiusXYSlack));
|
hingePoleDy = sideWallY - (sideWallSlotToOuterXEdge + (hingePoleR+radiusXYSlack));
|
||||||
|
|
||||||
|
sideWallDefaultVerticalBracingToZEdge = 30;
|
||||||
|
sideWallDefaultVentilationToZEdge = 40;
|
||||||
|
sideWallDefaultVentilationToYEdge = 25;
|
||||||
|
sideWallDefaultVentilationWidth = 6;
|
||||||
@ -7,7 +7,7 @@ stackConnectorDx = rackTotalWidth - 2*(connectorXEdgeToYBarXEdge + connectorRect
|
|||||||
stackConnectorDy = rackTotalDepth - 2*(connectorYEdgeToYBarYEdge + connectorRectDepth/2);
|
stackConnectorDy = rackTotalDepth - 2*(connectorYEdgeToYBarYEdge + connectorRectDepth/2);
|
||||||
stackConnectorDualSpacing = 0.5;
|
stackConnectorDualSpacing = 0.5;
|
||||||
|
|
||||||
module stackConnectorDual() {
|
module rackJoiner() {
|
||||||
translate(v=[0,0,stackConnectorDualSpacing/2])
|
translate(v=[0,0,stackConnectorDualSpacing/2])
|
||||||
stackConnectorPlug();
|
stackConnectorPlug();
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ module stackConnectorDual() {
|
|||||||
cube(size=[connectorRectWidth+connectorRectPlugSlack, connectorRectDepth+connectorRectPlugSlack, stackConnectorDualSpacing]);
|
cube(size=[connectorRectWidth+connectorRectPlugSlack, connectorRectDepth+connectorRectPlugSlack, stackConnectorDualSpacing]);
|
||||||
}
|
}
|
||||||
|
|
||||||
module stackConnectorFeet() {
|
module rackFeet() {
|
||||||
|
|
||||||
bandThickness = 2;
|
bandThickness = 2;
|
||||||
height = 18;
|
height = 18;
|
||||||
|
|||||||