135 lines
5.5 KiB
OpenSCAD
135 lines
5.5 KiB
OpenSCAD
|
// Modular Single Board Computer mount for server rack
|
|||
|
// length units are millimeters
|
|||
|
rackFunctionalWidth = 450.85; // distance between server rack side rails
|
|||
|
sbcFullThickness = 34.0; // full height of board including PoE HAT and GPIO extensions
|
|||
|
boardThicknessExactSBC = 1.40;
|
|||
|
boardThicknessExactPoEHAT = 1.69;
|
|||
|
boardThickness = 2.0; // approximate thickness of circuit boards (HAT and SBC)
|
|||
|
sbcInterBoardThickness = 21.20; // distance between PoE HAT board and SBC board
|
|||
|
sbcPinToEdgeDistanceExact = 1.40;
|
|||
|
sbcPinToEdgeDistance = 1.5; // approximate lip between GPIO pins and edge of circuit board
|
|||
|
sbcGPIOPinHeight = 7.60; // distance from HAT top to top of GPIO pins
|
|||
|
sbcDepth = 85.00;
|
|||
|
moduleMultiplier = 11; // modules per server rack width
|
|||
|
mountWidth = 450.85 / moduleMultiplier;
|
|||
|
mountHeight = 16;//63.5; // 2U height
|
|||
|
mountStructuralQuantum = 1.5; // minimum unit for structural components
|
|||
|
mountStructuralDepth = sbcDepth / 4;
|
|||
|
sideWallWidth = (mountWidth - sbcFullThickness) / 2;
|
|||
|
clipThicknessMultiplier = 6;
|
|||
|
clipDepthMultiplier = 1.1;
|
|||
|
unsupportedMaxExtension = mountStructuralQuantum * 2;
|
|||
|
|
|||
|
circleResolution=360*2; // faces per rotation
|
|||
|
|
|||
|
union() {
|
|||
|
// SBC slot
|
|||
|
translate ([(mountWidth / 2) - (sbcFullThickness / 2), 0, 0]) {
|
|||
|
union() {
|
|||
|
cube([
|
|||
|
sbcFullThickness,
|
|||
|
mountStructuralDepth,
|
|||
|
mountStructuralQuantum
|
|||
|
]);
|
|||
|
translate([
|
|||
|
sbcGPIOPinHeight + boardThickness,
|
|||
|
0,
|
|||
|
0
|
|||
|
]) {
|
|||
|
difference() {
|
|||
|
cube([
|
|||
|
sbcInterBoardThickness,
|
|||
|
mountStructuralDepth,
|
|||
|
mountStructuralQuantum + sbcPinToEdgeDistance
|
|||
|
]);
|
|||
|
translate([-0.4, mountStructuralDepth - 3, -0.01]) {
|
|||
|
rotate([0,0,-45])
|
|||
|
#linear_extrude(height=(mountStructuralQuantum + sbcPinToEdgeDistance) * 1.01) {
|
|||
|
text("α4·NG", size=6, font="Noto Sans Mono:style=Bold");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// left side panel and mount
|
|||
|
translate([0, 0, 0]) {
|
|||
|
difference() {
|
|||
|
cube([
|
|||
|
sideWallWidth,
|
|||
|
mountStructuralDepth,
|
|||
|
mountHeight,
|
|||
|
]);
|
|||
|
translate([-0.01, -0.01, -0.01]) {
|
|||
|
// front clip (female)
|
|||
|
cube([
|
|||
|
sideWallWidth * 1.01,
|
|||
|
mountStructuralQuantum * 1.11,
|
|||
|
mountHeight * 1.01
|
|||
|
]);
|
|||
|
translate([mountStructuralQuantum, mountStructuralQuantum, 0]) {
|
|||
|
cube([
|
|||
|
sideWallWidth,
|
|||
|
mountStructuralQuantum * (0.01 + clipDepthMultiplier),
|
|||
|
mountHeight * 1.01
|
|||
|
]);
|
|||
|
}
|
|||
|
// back rod (female)
|
|||
|
translate([-0.01, mountStructuralDepth - (mountStructuralQuantum * ((clipThicknessMultiplier / 2) + 1)), mountStructuralQuantum * 8]) {
|
|||
|
rotate([0, 90, 0]) {
|
|||
|
cylinder(h=sideWallWidth * 4, r=mountStructuralQuantum * clipThicknessMultiplier / 2, $fn=circleResolution, center=true);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// right side panel and mount
|
|||
|
translate([sbcFullThickness + sideWallWidth, 0, 0]) {
|
|||
|
cube([
|
|||
|
sideWallWidth,
|
|||
|
mountStructuralDepth,
|
|||
|
mountHeight,
|
|||
|
]);
|
|||
|
// front clip (male)
|
|||
|
translate([0, 0, 0]) {
|
|||
|
cube([
|
|||
|
sideWallWidth + mountStructuralQuantum * 1.15,
|
|||
|
mountStructuralQuantum,
|
|||
|
mountStructuralQuantum * clipThicknessMultiplier
|
|||
|
]);
|
|||
|
translate([sideWallWidth + mountStructuralQuantum * 1.15,0,0]) {
|
|||
|
cube([
|
|||
|
mountStructuralQuantum / 2,
|
|||
|
mountStructuralQuantum * (clipDepthMultiplier + 1),
|
|||
|
mountStructuralQuantum * clipThicknessMultiplier
|
|||
|
]);
|
|||
|
}
|
|||
|
translate([sideWallWidth + mountStructuralQuantum * 1.65, 0, 0]) {
|
|||
|
polyhedron(points = [
|
|||
|
// y-plane points
|
|||
|
[0,0,0],
|
|||
|
[sideWallWidth - (mountStructuralQuantum * 1.55), 0, 0],
|
|||
|
[0,0,mountStructuralQuantum * clipThicknessMultiplier],
|
|||
|
[sideWallWidth - (mountStructuralQuantum * 1.55), 0, mountStructuralQuantum * clipThicknessMultiplier],
|
|||
|
// x-plane points
|
|||
|
[0, mountStructuralQuantum * (clipDepthMultiplier + 1), 0],
|
|||
|
[0, mountStructuralQuantum * (clipDepthMultiplier + 1), mountStructuralQuantum * clipThicknessMultiplier]
|
|||
|
], faces = [
|
|||
|
[0, 2, 3, 1], //[0, 1, 2, 3],
|
|||
|
[0, 4, 5, 2], //[0, 2, 4, 5],
|
|||
|
[1, 3, 5, 4], //[1, 3, 4, 5],
|
|||
|
[0, 1, 4],
|
|||
|
[2, 5, 3]
|
|||
|
]);
|
|||
|
}
|
|||
|
}
|
|||
|
// back rod (male)
|
|||
|
translate([sideWallWidth, mountStructuralDepth - (mountStructuralQuantum * ((clipThicknessMultiplier / 2) + 1)), mountStructuralQuantum * 8]) {
|
|||
|
rotate([0, 90, 0]) {
|
|||
|
cylinder(h=unsupportedMaxExtension * 2, r=mountStructuralQuantum * clipThicknessMultiplier * 0.48, $fn=circleResolution, center=true);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|