Skip to content

Commit 7b0ea16

Browse files
committed
fix ventilation for sidewalls
1 parent 07dee71 commit 7b0ea16

21 files changed

+91
-101
lines changed

README.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![display](media/renders/rackDisplayRounded.png)
44

5-
### A parametric 3d-printable mini rack system
5+
### A modular 3d-printable mini rack system
66
- ***Mount Anything:*** Perfect for organizing SBCs, mini PCs, small switches, power hubs, etc.
77
- ***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.
88
- ***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 @@
1111

1212
## Assembly
1313

14-
Pre-generated STLs for roughly 200mm^3 (mini), 180mm^3 (micro), and 100mm^3 (nano) rack frames can be found in [stl](stl).
14+
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.
1515
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
1616
(supports, orientation) can be found in these files.
1717

1818
### Assembly Instructions
19-
Please see [the assembly README here](./assembly-guide)
19+
Please see [the assembly guide](./assembly-guide).
2020

2121
### Required Tools:
2222
- 3d FDM Printer - build size requirements depend on configured rack profile
@@ -48,15 +48,15 @@ Please see [the assembly README here](./assembly-guide)
4848
| [Left Side Wall](./rack/print/sideWallLeft_P.scad) | 1 |
4949
| [Right Side Wall](./rack/print/sideWallRight_P.scad) | 1 |
5050
| [XY-Plate](./rack/print/xyPlate_P.scad) | 2 |
51-
| [Feet](./rack/print/feet_P.scad) (optional) | 2 |
51+
| [Feet](./rack/print/rackFeet_P.scad) (optional) | 2 |
5252

5353

5454
#### Notes:
5555
- Before printing the actual parts. It's recommended to print this evaluation part: [eval_P](./rack/print/eval_P.scad) to test tolerances. If you find the fits too tight/loose, you can adjust them [here](./config/slack.scad).
5656
- Please also adjust [this file](./config/slicer.scad) to match your slicer settings.
5757
- Omitted actual plastic for printing. Any conventional 3d printing plastic should do (PLA, PETG, ABS),
5858
but beware of PLA's thermal limits. Higher infill is recommended for all parts.
59-
- 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.
59+
- 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.
6060
- Main front rails use M4 hex nuts and screws.
6161
- Side rails are mounted using M3 hex nuts and screws.
6262

@@ -74,6 +74,7 @@ Generate all project files for the `micro` profile:
7474
`python3 rbuild.py -b all -c micro`
7575

7676
This will build all the parts defined in [rack/print](./rack/print), and put the STLs in [stl/micro](./stl/micro).
77+
You can also provide a `-dz {n}` parameter to adjust the height of the generated rack.
7778

7879
For generating a specific part:
7980

Loading
-1.81 KB
Loading
3.47 KB
Loading

assembly-guide/gifs/attachXYTrays.gif

13.3 KB
Loading
-279 Bytes
Loading

assembly-guide/gifs/insertFeet.gif

54.1 KB
Loading
Loading

assembly-guide/gifs/screwFeet.gif

30.2 KB
Loading
98 Bytes
Loading
419 Bytes
Loading
Loading

config/rackFrame.scad

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
21
// Manually set this variable to toggle rack profile
32
profileName = "micro";
43

5-
64
_profileConfigs = [
5+
// You can introduce a custom profile like:
6+
/*
7+
["custom", [
8+
["maxUnitWidth", 180],
9+
["maxUnitDepth", 120],
10+
["numRailScrews", 10]
11+
]],
12+
*/
713
["default", [
814
["maxUnitWidth", 180],
915
["maxUnitDepth", 180],
@@ -27,7 +33,7 @@ _profileConfigs = [
2733
["mini", [
2834
["maxUnitWidth", 205],
2935
["maxUnitDepth", 205],
30-
["numRailScrews", 20]
36+
["numRailScrews", 16]
3137
]]
3238
];
3339

rack/assembly/slideHexNutToFeet.scad

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ module slideHexNutToFeet(at=0) {
2626
slideNut();
2727

2828
if (!plasticMask) {
29-
stackConnectorFeet();
29+
rackFeet();
3030
}
3131
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
use <../stackEnds.scad>
22

33

4-
stackConnectorFeet();
4+
rackFeet();

rack/print/stackConnectorDual_P.scad rack/print/rackJoiner_P.scad

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ include <../stackEnds.scad>
22

33
// Oriented for 3d printing. No supports required, but it's reccommended to print this with a brim.
44
// Adding a brim will require some post-processing in the form of trimming the bottom.
5-
stackConnectorDual();
5+
rackJoiner();

rack/side/sideWallBase.scad

+58-23
Original file line numberDiff line numberDiff line change
@@ -131,41 +131,76 @@ module sideWallBase() {
131131
}
132132
}
133133

134-
module sideWallVerticalRibs(numRibs, ribZ, ribYDiff, ribExtrusion=1) {
134+
module applySideWallDefaultVentilation(numVents) {
135135

136-
ribRampLength = 5;
137-
ribWidth = 2;
136+
r = 2; // vent roundness
137+
ventLength = sideWallY - 2*sideWallDefaultVentilationToZEdge;
138+
ventZDiff = (sideWallZ - 2*sideWallDefaultVentilationToYEdge)/(numVents-1);
138139

139-
intersection() {
140-
for (i = [0:numRibs-1]) {
141-
142-
translate(v = [sideWallThickness, i*ribYDiff, (sideWallZ-ribZ)/2])
143-
translate(v = [ribExtrusion-ribWidth, 0, 0])
144-
verticalRib(ribExtend=4, ribWidth=ribWidth);
140+
apply_n() {
141+
for (i = [0:numVents-1]) {
142+
translate(v = [0, sideWallDefaultVentilationToZEdge, i * ventZDiff + sideWallDefaultVentilationToYEdge])
143+
vent();
145144
}
145+
children(0);
146+
}
146147

147-
halfspace(vpos=[1,0,0], p=[0,0,0]);
148+
module vent() {
149+
translate(v=[-inf/2,r,-sideWallDefaultVentilationWidth/2])
150+
minkowski() {
151+
rotate(a=[0,90,0])
152+
cylinder(r=r,h=inf);
153+
cube(size = [inf, max(eps, ventLength-2*r), max(eps,sideWallDefaultVentilationWidth-2*r)]);
154+
}
148155
}
156+
}
149157

158+
module applySideWallBracing(numRibs) {
150159

151-
module verticalRib(ribExtend, ribWidth) {
160+
apply_p() {
161+
// TODO add horizontal bracing
162+
sideWallVerticalBracing(numRibs = numRibs);
163+
children(0);
164+
}
152165

153-
roundness = 0.5;
166+
module sideWallVerticalBracing(numRibs, ribZ, ribExtrusion=1) {
154167

155-
minkowski() {
156-
hull() {
157-
translate(v=[0,0,roundness])
158-
cube(size = [eps, ribWidth, eps]);
168+
ribRampLength = 5;
169+
ribWidth = 2;
170+
ribZ = sideWallZ;
171+
ribYDiff = sideWallY - 2*sideWallDefaultVerticalBracingToZEdge;
159172

160-
translate(v = [0, 0, ribRampLength])
161-
cube(size = [ribExtend, ribWidth, ribZ-2*(ribRampLength+roundness)]);
173+
translate(v=[0,sideWallDefaultVerticalBracingToZEdge,0])
174+
intersection() {
175+
for (i = [0:numRibs-1]) {
162176

163-
translate(v = [0, 0, ribZ-roundness])
164-
cube(size = [eps, ribWidth, eps]);
177+
translate(v = [sideWallThickness, i*ribYDiff, (sideWallZ-ribZ)/2])
178+
translate(v = [ribExtrusion-ribWidth, 0, 0])
179+
verticalRib(ribExtend=4, ribWidth=ribWidth);
180+
}
181+
182+
halfspace(vpos=[1,0,0], p=[0,0,0]);
165183
}
166184

167-
sphere(r=roundness);
168-
}
185+
module verticalRib(ribExtend, ribWidth) {
186+
187+
roundness = 0.5;
188+
translate(v=[0,-ribWidth/2,0])
189+
minkowski() {
190+
hull() {
191+
translate(v=[0,0,roundness])
192+
cube(size = [eps, ribWidth, eps]);
193+
194+
translate(v = [0, 0, ribRampLength])
195+
cube(size = [ribExtend, ribWidth, ribZ-2*(ribRampLength+roundness)]);
196+
197+
translate(v = [0, 0, ribZ-roundness])
198+
cube(size = [eps, ribWidth, eps]);
199+
}
169200

201+
sphere(r=roundness);
202+
}
203+
}
170204
}
171-
}
205+
}
206+

rack/side/sideWallLeft.scad

+4-32
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,9 @@ include <./sideWallBase.scad>
44

55
module sideWallLeft() {
66

7-
applySideWallVerticalRibs()
8-
applyEpicVentilation()
9-
sideWallBase();
10-
11-
module applyEpicVentilation() {
12-
apply_n() {
13-
for (i = [1:8]) {
14-
translate(v = [0, 41, i * 12 + 10])
15-
vent();
16-
}
17-
children(0);
18-
}
19-
20-
module vent() {
21-
minkowski() {
22-
rotate(a=[0,90,0])
23-
cylinder(r=2,h=1);
24-
25-
cube(size = [10, 100, 1]);
26-
}
27-
}
28-
}
7+
numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10);
298

30-
module applySideWallVerticalRibs() {
31-
echo("sideWallZ", sideWallZ);
32-
apply_p() {
33-
translate(v = [0, 30, 0])
34-
sideWallVerticalRibs(numRibs = 2, ribZ = sideWallZ, ribYDiff = 120, ribExtrusion = 1.5);
35-
36-
children(0);
37-
}
38-
}
9+
applySideWallBracing(numRibs=2)
10+
applySideWallDefaultVentilation(numVents=numVentsCustom)
11+
sideWallBase();
3912
}
40-

rack/side/sideWallRight.scad

+4-33
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,11 @@ include <./sideWallBase.scad>
44

55
module sideWallRight() {
66

7-
applyEpicVentilation()
7+
numVentsCustom = ceil((sideWallZ - 2*sideWallDefaultVentilationToYEdge)/10);
8+
89
mirror(v=[1,0,0])
9-
applySideWallVerticalRibs()
10+
applySideWallBracing(numRibs=2)
11+
applySideWallDefaultVentilation(numVents=numVentsCustom)
1012
sideWallBase();
11-
12-
module applyEpicVentilation() {
13-
14-
apply_n() {
15-
translate(v=[-10,0,0])
16-
for (i = [1:8]) {
17-
translate(v = [0, 41, i * 12 + 10])
18-
vent();
19-
}
20-
children(0);
21-
}
22-
23-
module vent() {
24-
minkowski() {
25-
rotate(a=[0,90,0])
26-
cylinder(r=2,h=1);
27-
28-
cube(size = [10, 100, 1]);
29-
}
30-
}
31-
32-
}
33-
34-
module applySideWallVerticalRibs() {
35-
apply_p() {
36-
translate(v = [0, 30, 0])
37-
sideWallVerticalRibs(numRibs = 2, ribZ = sideWallZ, ribYDiff = 120, ribExtrusion = 1.5);
38-
39-
children(0);
40-
}
41-
}
4213
}
4314

rack/side/sideWallVariables.scad

+5
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,8 @@ sideWallX = (yBarWidth-(railTotalWidth+railSlotToInnerYEdge)) - sideWallXGapClea
3232

3333
hingePoleDx = sideWallSlotToOuterYEdge + sideWallConnW/2.0;
3434
hingePoleDy = sideWallY - (sideWallSlotToOuterXEdge + (hingePoleR+radiusXYSlack));
35+
36+
sideWallDefaultVerticalBracingToZEdge = 30;
37+
sideWallDefaultVentilationToZEdge = 40;
38+
sideWallDefaultVentilationToYEdge = 25;
39+
sideWallDefaultVentilationWidth = 6;

rack/stackEnds.scad

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ stackConnectorDx = rackTotalWidth - 2*(connectorXEdgeToYBarXEdge + connectorRect
77
stackConnectorDy = rackTotalDepth - 2*(connectorYEdgeToYBarYEdge + connectorRectDepth/2);
88
stackConnectorDualSpacing = 0.5;
99

10-
module stackConnectorDual() {
10+
module rackJoiner() {
1111
translate(v=[0,0,stackConnectorDualSpacing/2])
1212
stackConnectorPlug();
1313

@@ -19,7 +19,7 @@ module stackConnectorDual() {
1919
cube(size=[connectorRectWidth+connectorRectPlugSlack, connectorRectDepth+connectorRectPlugSlack, stackConnectorDualSpacing]);
2020
}
2121

22-
module stackConnectorFeet() {
22+
module rackFeet() {
2323

2424
bandThickness = 2;
2525
height = 18;

0 commit comments

Comments
 (0)