add instructions and renders
This commit is contained in:
45
README.md
45
README.md
@ -1,34 +1,39 @@
|
||||
# rackstack
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
Individual racks can be stacked and fastened together.
|
||||

|
||||
|
||||
There's also cool magnetic side doors.
|
||||

|
||||
|
||||
|
||||
## 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
BIN
media/features/slideOpt.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
BIN
media/features/stackConnectorOpt.gif
Normal file
BIN
media/features/stackConnectorOpt.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 151 KiB |
BIN
media/features/swivelOpt.gif
Normal file
BIN
media/features/swivelOpt.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
BIN
media/renders/rackDisplay.png
Normal file
BIN
media/renders/rackDisplay.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
if (!screwMask) {
|
||||
heatSetInsertsOneCorner(t = t);
|
||||
|
||||
multmatrix(yBarMirrorOtherCornerTrans)
|
||||
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();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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,6 +594,7 @@ module assemblyInstructions () {
|
||||
|
||||
|
||||
module caseScrewA() {
|
||||
if (!screwMask) {
|
||||
color([1, 1, 1]) {
|
||||
difference() {
|
||||
scale(v = [0.9, 0.9, 0.9])
|
||||
@ -544,8 +604,10 @@ module assemblyInstructions () {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module caseScrewB() {
|
||||
if (!screwMask) {
|
||||
color([1, 1, 1]) {
|
||||
difference() {
|
||||
scale(v = [0.9, 0.9, 0.9])
|
||||
@ -555,17 +617,22 @@ module assemblyInstructions () {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module hingeDowel() {
|
||||
if (!screwMask) {
|
||||
color([0, 1, 1])
|
||||
cylinder(h = dowelPinH, r = dowelPinR);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module magnet() {
|
||||
if (!screwMask) {
|
||||
color([1, 1, 1])
|
||||
cylinder(r = magnetR, h = magnetH);
|
||||
}
|
||||
}
|
||||
|
||||
module arrow(length) {
|
||||
color([1,0,1]) {
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
*/
|
||||
include <./profiles.scad>
|
||||
|
||||
profileName = "micro";
|
||||
profileName = "default";
|
||||
profile = getProfile(profileName);
|
||||
|
||||
// echo("Profile:", profile);
|
||||
|
||||
@ -5,8 +5,8 @@ include <./sideWallBase.scad>
|
||||
module sideWallLeft() {
|
||||
|
||||
//applyEpicVentilation()
|
||||
applySideWallVerticalRibs()
|
||||
render()
|
||||
//applySideWallVerticalRibs()
|
||||
//render()
|
||||
sideWallBase();
|
||||
|
||||
module applyEpicVentilation() {
|
||||
|
||||
@ -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
Reference in New Issue
Block a user