add instructions and renders

This commit is contained in:
zhao
2023-05-19 14:23:24 -04:00
parent 28006685c5
commit b90ae7f1ae
21 changed files with 116064 additions and 169161 deletions

View File

@ -1,34 +1,39 @@
# rackstack # rackstack
![mini](media/renders/mini-cropped.png) ![display](media/renders/rackDisplay.png)
A parametric 3d-printable (mini) rack system. ### A parametric 3d-printable mini rack system
- ***Mount Anything:*** Perfect for organizing SBCs, mini PCs, small switches, power hubs, etc.
- ***Not just STLs:*** 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.
- ***No cage nuts!*** - ***No cage nuts!*** Sliding hex nut design for the front rails allows one to easily mount items without dealing with cage nuts.
- ***Stackable:*** Individual racks can be easily stacked together. Mix and match different color and design combinations! - ***Stackable:*** Individual racks can be easily stacked and fastened together. Mix and match different color and design combinations!
### Renders ### Renders
See the [renders for difference parametric profiles here](media/renders) See the [renders for difference parametric profiles here](media/renders)
## Features
Sliding nut design for the front rails allows one to easily mount items without dealing with cage nuts.
![slidingNuts](media/features/slide.gif)
Individual racks can be stacked and fastened together.
![stackable](media/features/stackConnector.gif)
There's also cool magnetic side doors.
![swivelSideDoor](media/features/swivel.gif)
## Assembly ## Assembly
Pre-generated STLs for roughly 200mm^3, and 100mm^3 rack frames can be found in [stl/rack](stl/rack).
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 their respective `.scad` files.
### Assembly Instructions
### BOM ### BOM
TODO
- A bunch of m3 screws for constructing the actual rack.
- A bunch of m4 screws for the main rails
- Some heatset inserts
- A bunch of m3 hex nuts
- m3 allen key (preferably with a rounded end)
- m4 allen key
- 2 dowel pins
- 8 magnets
## Configuring + Generating STLs ## Configuring + Generating STLs
TODO

BIN
media/features/slideOpt.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -2,26 +2,29 @@ include <../../helper/common.scad>
include <../../helper/math.scad> include <../../helper/math.scad>
include <../../helper/screws.scad> include <../../helper/screws.scad>
include <../../rack/config.scad> include <../../rack/config.scad>
include <../../rack/sharedVariables.scad>
*sideSupportRailBase("lBracket"); *sideSupportRailBase("lBracket");
// TODO: make this parametric
// distance between front and back main rail screw mounts
sideRailScrewMountDist = yBarDepth - 2*(frontScrewSpacing + railFrontThickness + railSlotToXZ); // TODO use transformation matrices
module sideSupportRailBase(type) { module sideSupportRailBase(type) {
railLength = 100;
railBaseThickness = 2;
railBaseWidth = 18;
railSideThickness = 2;
railSideHeight = 12;
sideDy = -2;
frontMountPad = 10; // depends on y of box to be mounted TODO calculate this
sideMountPad = 10; // depends on x of box TODO calculate this
// distance between front and back main rail screw mounts
screwMountDist = 62; // TODO calculate this instead of hardcode
// vertical distance between local origin and main rail screw mount // vertical distance between local origin and main rail screw mount
screwMountGlobalDz = screwDiff / 2.0; screwMountGlobalDz = screwDiff / 2.0;
railLength = sideRailScrewMountDist + 30; // TODO calculate this
railBaseThickness = 2;
railBaseWidth = 18;
railSideThickness = 2;
railSideHeight = 15;
sideDy = -2;
frontMountPad = 10; // depends on y of box to be mounted TODO calculate this
sideMountPad = 10; // depends on x of box TODO calculate this
translate(v=[sideMountPad,-(frontMountPad + 5),-5])
applyMainRailMounts() applyMainRailMounts()
sideSupportRailBaseHolder(); sideSupportRailBaseHolder();
@ -41,7 +44,7 @@ module sideSupportRailBase(type) {
union() { union() {
dualMount(); dualMount();
translate(v=[0,screwMountDist,0]) translate(v=[0,sideRailScrewMountDist,0])
dualMount(); dualMount();
} }

View File

@ -10,10 +10,16 @@ include <./side/sideWallLeft.scad>
include <./stackEnds.scad> include <./stackEnds.scad>
include <./xyPlate.scad> include <./xyPlate.scad>
include <../rack-mount/side-rail/dualMount.scad>
assemblyInstructions(); assemblyInstructions();
module assemblyInstructions () { module assemblyInstructions () {
screwMask = false;
plasticMask = true;
sideSupportRailMask = true;
// Instruction List (in order) // Instruction List (in order)
// render() // render()
// addHeatSetInsertsYBar(at=$t); // addHeatSetInsertsYBar(at=$t);
@ -37,7 +43,6 @@ module assemblyInstructions () {
finalSingle(); finalSingle();
// finalDouble(); // finalDouble();
// Features: // Features:
// render() // render()
// slideInNuts(at=$t); // slideInNuts(at=$t);
@ -48,7 +53,9 @@ module assemblyInstructions () {
module addHeatSetInsertsYBar(at=0) { module addHeatSetInsertsYBar(at=0) {
t = lerp(a=10,b=0.35,t=at); // non zero b for exposing the heatset gears for diagramming t = lerp(a=10,b=0.35,t=at); // non zero b for exposing the heatset gears for diagramming
if (!plasticMask) {
yBar(); yBar();
}
heatSetHeight = heatSetInsertSlotHeightSlacked(rackFrameScrewType) * 0.95; heatSetHeight = heatSetInsertSlotHeightSlacked(rackFrameScrewType) * 0.95;
@ -76,17 +83,21 @@ module assemblyInstructions () {
heatSetInsert(rackFrameScrewType); heatSetInsert(rackFrameScrewType);
} }
heatSetInsertsOneCorner(t=t); if (!screwMask) {
heatSetInsertsOneCorner(t = t);
multmatrix(yBarMirrorOtherCornerTrans) multmatrix(yBarMirrorOtherCornerTrans)
heatSetInsertsOneCorner(t=t); heatSetInsertsOneCorner(t = t);
}
} }
module addMagnetsToMagnetModules(at=0) { module addMagnetsToMagnetModules(at=0) {
t = lerp(a=8,b=0,t=at); t = lerp(a=8,b=0,t=at);
if (!plasticMask) {
magnetModule(); magnetModule();
}
function insertMagnetTrans(t=0) = function insertMagnetTrans(t=0) =
translate(v=[sideWallConnW-(magnetFaceToSideWallConnOuterYEdge+magnetHSlacked) + t, translate(v=[sideWallConnW-(magnetFaceToSideWallConnOuterYEdge+magnetHSlacked) + t,
@ -101,7 +112,9 @@ module assemblyInstructions () {
module addMagnetsToSideWall(at=0) { module addMagnetsToSideWall(at=0) {
t = lerp(a=8,b=0,t=at); t = lerp(a=8,b=0,t=at);
if (!plasticMask) {
sideWallLeft(); sideWallLeft();
}
function insertMagnetTrans(t=0) = function insertMagnetTrans(t=0) =
translate(v=[sideWallThickness+t, magnetMountToYBarFront, magnetMountToYBarTop-sideWallZHingeTotalClearance]) * translate(v=[sideWallThickness+t, magnetMountToYBarFront, magnetMountToYBarTop-sideWallZHingeTotalClearance]) *
@ -125,12 +138,14 @@ module assemblyInstructions () {
multmatrix(translate(v = [0, 0, t])*xBarSpaceToYBarSpace*xBarMirrorOtherCornerTrans*yBarSpaceToXBarSpace) multmatrix(translate(v = [0, 0, t])*xBarSpaceToYBarSpace*xBarMirrorOtherCornerTrans*yBarSpaceToXBarSpace)
addHeatSetInsertsYBar(at=1); addHeatSetInsertsYBar(at=1);
if (!plasticMask) {
multmatrix(xBarSpaceToYBarSpace) multmatrix(xBarSpaceToYBarSpace)
xBar(); xBar();
multmatrix(yBarMirrorOtherCornerTrans*xBarSpaceToYBarSpace) multmatrix(yBarMirrorOtherCornerTrans*xBarSpaceToYBarSpace)
xBar(); xBar();
} }
}
module screwXBarAndYBar(at=0) { module screwXBarAndYBar(at=0) {
screwExtension = lerp(a=15, b=0, t=at); screwExtension = lerp(a=15, b=0, t=at);
@ -147,7 +162,8 @@ module assemblyInstructions () {
multmatrix(xBarSpaceToYBarSpace) multmatrix(xBarSpaceToYBarSpace)
union() { union() {
xBar();
if (!plasticMask) { xBar(); }
multmatrix(xBarYBarScrewTrans(screwExtension)) multmatrix(xBarYBarScrewTrans(screwExtension))
caseScrewB(); caseScrewB();
@ -158,7 +174,7 @@ module assemblyInstructions () {
multmatrix(yBarMirrorOtherCornerTrans*xBarSpaceToYBarSpace) multmatrix(yBarMirrorOtherCornerTrans*xBarSpaceToYBarSpace)
union() { union() {
xBar(); if (!plasticMask) { xBar(); }
multmatrix(xBarYBarScrewTrans(screwExtension)) multmatrix(xBarYBarScrewTrans(screwExtension))
caseScrewB(); caseScrewB();
@ -197,7 +213,10 @@ module assemblyInstructions () {
multmatrix(yBarMirrorOtherCornerTrans * sideModuleTrans(elevation)) multmatrix(yBarMirrorOtherCornerTrans * sideModuleTrans(elevation))
union() { union() {
if (!plasticMask) {
hingeModule(); hingeModule();
}
translate(v=[yBarScrewHoleToOuterYEdge,yBarScrewHoleToFrontXEdge,sideWallConnLugDepression + 2*elevation]) translate(v=[yBarScrewHoleToOuterYEdge,yBarScrewHoleToFrontXEdge,sideWallConnLugDepression + 2*elevation])
caseScrewA(); caseScrewA();
@ -205,7 +224,9 @@ module assemblyInstructions () {
multmatrix(xBarSpaceToYBarSpace * xBarMirrorOtherCornerTrans * yBarSpaceToXBarSpace * yBarMirrorOtherCornerTrans * sideModuleTrans(elevation)) multmatrix(xBarSpaceToYBarSpace * xBarMirrorOtherCornerTrans * yBarSpaceToXBarSpace * yBarMirrorOtherCornerTrans * sideModuleTrans(elevation))
union() { union() {
if (!plasticMask) {
hingeModule(); hingeModule();
}
translate(v=[yBarScrewHoleToOuterYEdge,yBarScrewHoleToFrontXEdge,sideWallConnLugDepression + 2*elevation]) translate(v=[yBarScrewHoleToOuterYEdge,yBarScrewHoleToFrontXEdge,sideWallConnLugDepression + 2*elevation])
caseScrewA(); caseScrewA();
@ -221,7 +242,10 @@ module assemblyInstructions () {
function mainRailTrans(elevation) = translate(v=[0,0,elevation]) * yBarMainRailConnectorTrans; function mainRailTrans(elevation) = translate(v=[0,0,elevation]) * yBarMainRailConnectorTrans;
module railAndScrew(elevation) { module railAndScrew(elevation) {
if (!plasticMask) {
mainRail(); mainRail();
}
translate(v=[railSideMountThickness + 5, railFrontThickness + 4,railFootThickness + 2*elevation]) translate(v=[railSideMountThickness + 5, railFrontThickness + 4,railFootThickness + 2*elevation])
caseScrewA(); caseScrewA();
@ -322,8 +346,10 @@ module assemblyInstructions () {
caseScrewA(); caseScrewA();
} }
translate(v=[0,0,-t]) if (!plasticMask) {
translate(v = [0, 0, -t])
xyPlate(); xyPlate();
}
screw(t=2*t); screw(t=2*t);
@ -343,10 +369,12 @@ module assemblyInstructions () {
t = lerp(a=8, b=0, t=at); t = lerp(a=8, b=0, t=at);
module slideNut() { module slideNut() {
if (!screwMask) {
rotate(a = [0, 0, 90]) rotate(a = [0, 0, 90])
rotate(a = [90, 0, 0]) rotate(a = [90, 0, 0])
hexNut(rackFrameScrewType); hexNut(rackFrameScrewType);
} }
}
translate(v=[0,t,connectorBottomToScrew + 0.5]) // where does this come from again? slack? translate(v=[0,t,connectorBottomToScrew + 0.5]) // where does this come from again? slack?
slideNut(); slideNut();
@ -354,8 +382,10 @@ module assemblyInstructions () {
translate(v=[stackConnectorDx,t,connectorBottomToScrew + 0.5]) // where does this come from again? slack? translate(v=[stackConnectorDx,t,connectorBottomToScrew + 0.5]) // where does this come from again? slack?
slideNut(); slideNut();
if (!plasticMask) {
stackConnectorFeet(); stackConnectorFeet();
} }
}
module insertFeet(at=0,r=0) { module insertFeet(at=0,r=0) {
@ -397,16 +427,47 @@ module assemblyInstructions () {
module finalSingle(r=0) { module finalSingle(r=0) {
screwFeet(at=1,r=r); screwFeet(at=1,r=r);
for (i = [1, 5, 9, 13, 17]) {
translate(v = [2, frontScrewSpacing+railFrontThickness+railSlotToXZ, i*10])
multmatrix(yBarMainRailConnectorTrans)
union() {
if (!sideSupportRailMask) {
sideSupportRailBase("lBracket");
} }
rotate(a = [0, -90, 0])
caseScrewA();
translate(v = [0, sideRailScrewMountDist, 0])
rotate(a = [0, -90, 0])
caseScrewA();
}
}
multmatrix(xBarSpaceToYBarSpace*xBarMirrorOtherCornerTrans*yBarSpaceToXBarSpace)
for (i = [1, 5, 9, 13, 17]) {
translate(v = [2, frontScrewSpacing+railFrontThickness+railSlotToXZ, i*10])
multmatrix(yBarMainRailConnectorTrans)
union() {
if (!sideSupportRailMask) {
sideSupportRailBase("lBracket");
}
rotate(a=[0,-90,0])
caseScrewA();
translate(v=[0,sideRailScrewMountDist,0])
rotate(a=[0,-90,0])
caseScrewA();
}
}
}
module finalDouble(r=0) { module finalDouble(r=0) {
multmatrix(secondStackTrans) stackable(at=1,r=r);
attachXYPlates(at=1,r=r);
screwFeet(at=1,r=r);
} }
module slideInNuts(at=0) { module slideInNuts(at=0) {
t = lerp(a=15,b=0,t=at); t = lerp(a=15,b=0,t=at);
@ -445,7 +506,7 @@ module assemblyInstructions () {
stackConnectorDual(); stackConnectorDual();
} }
module stackable(at=0) { module stackable(at=0,r=0) {
t1 = lerp(a=0, b=1, t=min(3*at, 1)); t1 = lerp(a=0, b=1, t=min(3*at, 1));
t2 = lerp(a=30, b=0, t=min(max(3*at-1,0),1)); t2 = lerp(a=30, b=0, t=min(max(3*at-1,0),1));
@ -465,8 +526,10 @@ module assemblyInstructions () {
caseScrewB(); caseScrewB();
} }
translate(v=[0,0,t2/2]) if (!plasticMask) {
translate(v = [0, 0, t2/2])
stackConnectors(); stackConnectors();
}
if (at >= 2/3) { if (at >= 2/3) {
multmatrix(secondStackTrans) multmatrix(secondStackTrans)
@ -478,9 +541,9 @@ module assemblyInstructions () {
translate(v=[0,0,t2]) translate(v=[0,0,t2])
multmatrix(secondStackTrans) multmatrix(secondStackTrans)
attachXYPlates(at=1); attachXYPlates(at=1,r=r);
screwFeet(at=1); screwFeet(at=1,r=20);
} }
@ -490,10 +553,6 @@ module assemblyInstructions () {
finalSingle(r=r); finalSingle(r=r);
} }
module parametric() {
}
xBarSpaceToYBarSpace = xBarSpaceToYBarSpace =
yBarXBarConnectorTrans * yBarXBarConnectorTrans *
xBarConnectorToYBarConnectorTrans * xBarConnectorToYBarConnectorTrans *
@ -535,7 +594,8 @@ module assemblyInstructions () {
module caseScrewA() { module caseScrewA() {
color([1,1,1]) { if (!screwMask) {
color([1, 1, 1]) {
difference() { difference() {
scale(v = [0.9, 0.9, 0.9]) scale(v = [0.9, 0.9, 0.9])
counterSunkHead_N(rackFrameScrewType, screwExtension = 6, headExtension = 0.5); counterSunkHead_N(rackFrameScrewType, screwExtension = 6, headExtension = 0.5);
@ -544,9 +604,11 @@ module assemblyInstructions () {
} }
} }
} }
}
module caseScrewB() { module caseScrewB() {
color([1,1,1]) { if (!screwMask) {
color([1, 1, 1]) {
difference() { difference() {
scale(v = [0.9, 0.9, 0.9]) scale(v = [0.9, 0.9, 0.9])
counterSunkHead_N(rackFrameScrewType, screwExtension = 10, headExtension = 0.5); counterSunkHead_N(rackFrameScrewType, screwExtension = 10, headExtension = 0.5);
@ -555,16 +617,21 @@ module assemblyInstructions () {
} }
} }
} }
}
module hingeDowel() { module hingeDowel() {
color([0,1,1]) if (!screwMask) {
cylinder(h=dowelPinH, r=dowelPinR); color([0, 1, 1])
cylinder(h = dowelPinH, r = dowelPinR);
}
} }
module magnet() { module magnet() {
color([1,1,1]) if (!screwMask) {
cylinder(r=magnetR, h=magnetH); color([1, 1, 1])
cylinder(r = magnetR, h = magnetH);
}
} }
module arrow(length) { module arrow(length) {

View File

@ -8,7 +8,7 @@
*/ */
include <./profiles.scad> include <./profiles.scad>
profileName = "micro"; profileName = "default";
profile = getProfile(profileName); profile = getProfile(profileName);
// echo("Profile:", profile); // echo("Profile:", profile);

View File

@ -5,8 +5,8 @@ include <./sideWallBase.scad>
module sideWallLeft() { module sideWallLeft() {
//applyEpicVentilation() //applyEpicVentilation()
applySideWallVerticalRibs() //applySideWallVerticalRibs()
render() //render()
sideWallBase(); sideWallBase();
module applyEpicVentilation() { module applyEpicVentilation() {

View File

@ -6,8 +6,8 @@ module sideWallRight() {
//applyEpicVentilation() //applyEpicVentilation()
mirror(v=[1,0,0]) mirror(v=[1,0,0])
applySideWallVerticalRibs() //applySideWallVerticalRibs()
render() //render()
sideWallBase(); sideWallBase();
module applyEpicVentilation() { module applyEpicVentilation() {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff