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.
|
||||
- ***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:
|
||||
|
||||
|
||||
|
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
|
||||
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]
|
||||
]]
|
||||
];
|
||||
|
||||
|
||||
@ -26,6 +26,6 @@ module slideHexNutToFeet(at=0) {
|
||||
slideNut();
|
||||
|
||||
if (!plasticMask) {
|
||||
stackConnectorFeet();
|
||||
rackFeet();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
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.
|
||||
// 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;
|
||||
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]);
|
||||
|
||||
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);
|
||||
rotate(a=[0,90,0])
|
||||
cylinder(r=r,h=inf);
|
||||
cube(size = [inf, max(eps, ventLength-2*r), max(eps,sideWallDefaultVentilationWidth-2*r)]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module applySideWallBracing(numRibs) {
|
||||
|
||||
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]);
|
||||
}
|
||||
|
||||
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() {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
||||