1
0
Fork 0
3d/server sbc mount.scad
2024-04-13 12:48:55 -04:00

135 lines
No EOL
5.5 KiB
OpenSCAD
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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);
}
}
}
}