diff --git a/helper/common.scad b/helper/common.scad index c4abcad..3d04219 100644 --- a/helper/common.scad +++ b/helper/common.scad @@ -3,10 +3,11 @@ include <./apply.scad> include <./dovetail.scad> include <./filet.scad> -include <./keystone.scad> +include <./keystone1.scad> +include <./keystone2.scad> include <./math.scad> include <./matrix.scad> include <./screws.scad> include <./sine.scad> -$fn=64; \ No newline at end of file +$fn=64; diff --git a/helper/keystone.scad b/helper/keystone1.scad similarity index 77% rename from helper/keystone.scad rename to helper/keystone1.scad index 37b6ed3..463177a 100644 --- a/helper/keystone.scad +++ b/helper/keystone1.scad @@ -1,4 +1,3 @@ - include <../config/common.scad> // rj45 slot-to-slot keystone jack model and negative @@ -45,3 +44,15 @@ module rj45KeystoneJack_N() { rj45Keystone(); } } + +module keystone1(outerWidth, outerHeight) { + rotate([0, 0, 180]) // To keep the same direction with keystone2 + difference() { + translate([0, 0, 5.9 / 2]) + cube([outerWidth, outerHeight, 5.9], center = true); + + translate([-(keystoneMainBodyWidth + xySlack) / 2, (heightWithHookCatch + heightWithBottomLug - keystoneMainBodyHeight) / 2, 0]) + rotate([90, 0, 0]) + rj45KeystoneJack_N(); + } +} diff --git a/helper/keystone2.scad b/helper/keystone2.scad new file mode 100644 index 0000000..15121f8 --- /dev/null +++ b/helper/keystone2.scad @@ -0,0 +1,42 @@ +include <../config/common.scad> + +// These all constants are obtained by measuring rj45 keystone modules +// in hand. frontToRearDepth and rearPanelThickness are adjusted after testing. +// Before printing the Patch Panel, print a keystone2(outerWidth = 19, +// outerHeight = 27) to test if it fits. +frontWidth = 14.5; +frontHeight = 16.2; + +frontToRearDepth = 8.4; + +rearWidth = frontWidth; +rearHeight = 19.55; +rearPanelThickness = 2 - supportedOverhangSlack; + +maximumWidth = frontWidth; +maximumHeight = 22.15; + +lugHeight = 1.3; + +module keystone2(plateThickness = 1, outerWidth, outerHeight) { + assert(outerWidth > maximumWidth); + assert(outerHeight > maximumHeight); + + difference() { + // Outer cube + translate([-outerWidth / 2, -outerHeight / 2, 0]) + cube([outerWidth, outerHeight, frontToRearDepth + rearPanelThickness]); + + // Front panel hole + translate([-(frontWidth + xySlack) / 2, -(frontHeight + xySlack) / 2, 0]) + cube([frontWidth + xySlack, frontHeight + xySlack, plateThickness]); + + // Middle cavity + translate([-(maximumWidth + xySlack) / 2, -frontHeight / 2 - lugHeight - xySlack / 2, plateThickness]) + cube([rearWidth + xySlack, outerHeight + 1000, frontToRearDepth - plateThickness]); + + // Rear panel hole + translate([-(rearWidth + xySlack) / 2, -(frontHeight + xySlack) / 2, frontToRearDepth]) + cube([rearWidth + xySlack, rearHeight + xySlack, rearPanelThickness]); + } +} diff --git a/rack-mount/patch-panel/animate.gif b/rack-mount/patch-panel/animate.gif index f30f11c..2d6e294 100644 Binary files a/rack-mount/patch-panel/animate.gif and b/rack-mount/patch-panel/animate.gif differ diff --git a/rack-mount/patch-panel/animate.scad b/rack-mount/patch-panel/animate.scad index 03a7341..bc4ff65 100644 --- a/rack-mount/patch-panel/animate.scad +++ b/rack-mount/patch-panel/animate.scad @@ -12,17 +12,12 @@ module animatePatchPanel(at=$t) { plateThickness = 3; keystoneSpacing = 19; - slots = max(1,ceil(at*8)); + allSlots = [2, 2, 2, 2, 2, 2, 2, 5, 2]; + numSlots = max(1,ceil(at*8)); + slots = [each [for (i=[1:numSlots]) allSlots[i]]]; rotate(a=[90,0,0]) - mirror(v=[0,0,1]) render() - patchPanelSystem(numSlots = slots, plateThickness=plateThickness, keystoneSpacing=keystoneSpacing); - - // keystone visualization - for (i = [0:slots-1]) { - translate(v=[keystoneSpacing*i + 12, 0,0,]) // hardcoded offset - %rj45Keystone(); - } + patchPanelSystem(slots = slots, plateThickness=plateThickness, keystoneSpacing=keystoneSpacing); } \ No newline at end of file diff --git a/rack-mount/patch-panel/entry.scad b/rack-mount/patch-panel/entry.scad index b164dce..91584c7 100644 --- a/rack-mount/patch-panel/entry.scad +++ b/rack-mount/patch-panel/entry.scad @@ -12,7 +12,11 @@ module patchPanelSystem ( // begin config //////////////////////////////////////////////////////////////////////////////////////////////////////// -numSlots = 8, +// 1 for the original keystone mount design, 2 for a visually cleaner keystone mount +// but where the keystone is a bit harder to remove +// 3 for a cube with the height of plateThickness, +// 4 and 5 for cubes with the same height as keystone1 and 2 +slots = [2, 2, 2, 2, 2, 2, 2, 5, 2], plateThickness = 3, keystoneSpacing = 19, center = false @@ -21,7 +25,7 @@ center = false ) { mirror(v = [0, 0, 1]) - patchPanel(slots = numSlots, center=center); + patchPanel(slots = slots, plateThickness = 3, keystoneSpacing = 19, center=center); } patchPanelSystem(); diff --git a/rack-mount/patch-panel/patchPanel.scad b/rack-mount/patch-panel/patchPanel.scad index 6932006..010370c 100644 --- a/rack-mount/patch-panel/patchPanel.scad +++ b/rack-mount/patch-panel/patchPanel.scad @@ -8,35 +8,34 @@ use <../plateBase.scad> Please also make sure that the correct rack frame preset is set in rackFrame.scad. */ -module patchPanel (slots=8, plateThickness=3, keystoneSpacing=19, center=false) { +module patchPanel(slots, plateThickness = 3, screwToXEdge = 4.5, screwToYEdge = 4.5, keystoneSpacing = 19, center = false) { + slotsWidth = len(slots) * keystoneSpacing; + slotsMinPadding = railScrewHoleToInnerEdge+4; + plateLength = rackMountScrewWidth + 2 * screwToXEdge; + plateHeight = 2 * uDiff + 2 * screwToXEdge; + leftRailScrewToSlots = center + ? (plateLength-(slotsWidth+slotsMinPadding))/2 + : slotsMinPadding; + difference() { - supportPlateThickness = 5.9; - supportPlateHeight = 29; - supportPlateEdgeSpacing = 3; - supportPlateWidth = slots * keystoneSpacing + supportPlateEdgeSpacing; - supportPlateMinPadding = railScrewHoleToInnerEdge+4; + plateBase(U = 2, plateThickness = plateThickness, screwType = mainRailScrewType, screwToXEdge = screwToXEdge, screwToYEdge = screwToYEdge, filletR = 2); + translate([leftRailScrewToSlots, -screwToYEdge - 10 * eps, -plateThickness - 10 * eps]) + cube([slotsWidth, plateHeight + 2 * 10 * eps, plateThickness + 2 * 10 * eps]); + } - // TODO: these values should belong somewhere closer to plateBase.scad - railScrewToEdge = 4.5; - plateLength = rackMountScrewWidth + 2*railScrewToEdge; - - leftRailScrewToSupportDx = center - ? (plateLength-(supportPlateWidth+supportPlateMinPadding))/2 - : supportPlateMinPadding; - - union() { - plateBase(U = 2, plateThickness = plateThickness, screwType = mainRailScrewType, screwToXEdge=railScrewToEdge, screwToYEdge=railScrewToEdge, filletR = 2); - translate(v = [leftRailScrewToSupportDx, - railScrewToEdge, - supportPlateThickness]) - cube(size = [supportPlateWidth, supportPlateHeight, supportPlateThickness]); - } - - render() - union() { - for (i = [0:slots-1]) { - translate(v = [leftRailScrewToSupportDx+supportPlateEdgeSpacing + i*keystoneSpacing, 0, eps]) - rotate(a = [-90, 0, 0]) - rj45KeystoneJack_N(); - } - } + for(i = [0 : len(slots) - 1]) { + translate([leftRailScrewToSlots + keystoneSpacing / 2 + i * keystoneSpacing, uDiff, -plateThickness]) + let (slot = slots[i]) + if (slot == 1) keystone1(outerWidth = keystoneSpacing, outerHeight = plateHeight); + else if (slot == 2) keystone2(outerWidth = keystoneSpacing, outerHeight = plateHeight); + else if (slot == 3) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = plateThickness); + else if (slot == 4) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = 5.9); + else if (slot == 5) plate(outerWidth = keystoneSpacing, outerHeight = plateHeight, thickness = 9.9); + else assert(false); } } + +module plate(outerWidth, outerHeight, thickness) { + translate([0, 0, thickness / 2]) + cube([outerWidth, outerHeight, thickness], center = true); +}