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
![mini](media/renders/mini-cropped.png)
![display](media/renders/rackDisplay.png)
A parametric 3d-printable (mini) rack system.
- ***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.
### A parametric 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.
- ***No cage nuts!***
- ***Stackable:*** Individual racks can be easily stacked together. Mix and match different color and design combinations!
- ***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 and fastened together. Mix and match different color and design combinations!
### 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
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
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
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/screws.scad>
include <../../rack/config.scad>
include <../../rack/sharedVariables.scad>
*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) {
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
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()
sideSupportRailBaseHolder();
@ -41,7 +44,7 @@ module sideSupportRailBase(type) {
union() {
dualMount();
translate(v=[0,screwMountDist,0])
translate(v=[0,sideRailScrewMountDist,0])
dualMount();
}

View File

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

View File

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

View File

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

View File

@ -6,8 +6,8 @@ module sideWallRight() {
//applyEpicVentilation()
mirror(v=[1,0,0])
applySideWallVerticalRibs()
render()
//applySideWallVerticalRibs()
//render()
sideWallBase();
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