fix ventilation for sidewalls

This commit is contained in:
zhao
2023-08-13 12:51:21 -04:00
parent 07dee71795
commit 7b0ea16b04
21 changed files with 94 additions and 104 deletions

View File

@ -2,7 +2,7 @@
![display](media/renders/rackDisplayRounded.png) ![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. - ***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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

@ -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]
]] ]]
]; ];

View File

@ -26,6 +26,6 @@ module slideHexNutToFeet(at=0) {
slideNut(); slideNut();
if (!plasticMask) { if (!plasticMask) {
stackConnectorFeet(); rackFeet();
} }
} }

View File

@ -1,4 +1,4 @@
use <../stackEnds.scad> use <../stackEnds.scad>
stackConnectorFeet(); rackFeet();

View File

@ -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();

View File

@ -131,11 +131,46 @@ module sideWallBase() {
} }
} }
module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) { module applySideWallDefaultVentilation(numVents) {
r = 2; // vent roundness
ventLength = sideWallY - 2*sideWallDefaultVentilationToZEdge;
ventZDiff = (sideWallZ - 2*sideWallDefaultVentilationToYEdge)/(numVents-1);
apply_n() {
for (i = [0:numVents-1]) {
translate(v = [0, sideWallDefaultVentilationToZEdge, i * ventZDiff + sideWallDefaultVentilationToYEdge])
vent();
}
children(0);
}
module vent() {
translate(v=[-inf/2,r,-sideWallDefaultVentilationWidth/2])
minkowski() {
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; ribRampLength = 5;
ribWidth = 2; ribWidth = 2;
ribZ = sideWallZ;
ribYDiff = sideWallY - 2*sideWallDefaultVerticalBracingToZEdge;
translate(v=[0,sideWallDefaultVerticalBracingToZEdge,0])
intersection() { intersection() {
for (i = [0:numRibs-1]) { for (i = [0:numRibs-1]) {
@ -147,11 +182,10 @@ module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) {
halfspace(vpos=[1,0,0], p=[0,0,0]); halfspace(vpos=[1,0,0], p=[0,0,0]);
} }
module verticalRib(ribExtend, ribWidth) { module verticalRib(ribExtend, ribWidth) {
roundness = 0.5; roundness = 0.5;
translate(v=[0,-ribWidth/2,0])
minkowski() { minkowski() {
hull() { hull() {
translate(v=[0,0,roundness]) translate(v=[0,0,roundness])
@ -166,6 +200,7 @@ module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) {
sphere(r=roundness); sphere(r=roundness);
} }
}
} }
} }

View File

@ -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);
}
}
} }

View File

@ -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);
}
}
} }

View File

@ -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;

View File

@ -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;