From bb6288ee32dc5dba5c3129f08a628478d0171398 Mon Sep 17 00:00:00 2001 From: zhao Date: Tue, 10 Jan 2023 23:30:19 -0500 Subject: [PATCH] refactor --- {rack => old}/base1.stl | 0 {rack => old}/body/base1.scad | 0 {rack => old}/body/l1.scad | 0 {rack => old}/body/legToleranceTest.scad | 0 {rack => old}/body/m4Leg.scad | 0 {rack => old}/body/side/side.scad | 0 {rack => old}/body/side/side.stl | Bin {rack => old}/body/top1.scad | 0 {rack => old}/body/top1.stl | Bin {rack => old}/frontPlate.scad | 0 {rack => old}/frontPlate2u.stl | 0 {rack => old}/l1.stl | 0 {rack => old}/legToleranceTest.stl | 0 {rack => old}/m4Leg.stl | 0 {rack => old}/m4LegM.stl | 0 {rack => old}/open-frame.scad | 0 {rack => old}/patch-panel.scad | 0 {power => old/power}/old/src/open-frame.scad | 0 {power => old/power}/src/Untitled.scad | 0 {power => old/power}/src/base.scad | 0 {power => old/power}/src/join.scad | 0 {power => old/power}/src/plate.stl | 0 {power => old/power}/src/sfx-psu.scad | 0 {power => old/power}/stl/backPlate.stl | 0 {power => old/power}/stl/feet.stl | 0 {power => old/power}/stl/joinTest.stl | 0 .../power/stl/joinTest\\.stl" | 0 {power => old/power}/stl/legTest.stl | 0 {power => old/power}/stl/plate.stl | 0 {power => old/power}/stl/railInsert.stl | 0 {power => old/power}/stl/screwtest.stl | 0 {power => old/power}/stl/support1.stl | 0 {power => old/power}/stl/support2.stl | 0 {power => old/power}/stl/top.stl | 0 {power => old/power}/stl/topBarInsert.stl | 0 {power => old/power}/stl/untitled.fpp | Bin {rack => old}/rack-tray/rack-tray.scad | 0 {rack => old}/rackCase.scad | 0 {rack => old}/rackCase.stl | Bin {rack => old}/rackCase180.stl | 0 {rack => old}/rackCaseForBox.scad | 0 {rack => old}/rackCaseForBox.stl | 0 {rack => old}/rackCaseForBoxM.stl | 0 {rack => old}/rackCaseFrontPlat.stl | Bin {rack => old}/rackCaseFrontPlate.stl | Bin {rack => old}/rackCaselid.stl | Bin {rack => old}/risers.scad | 0 {rack => old}/screwmount-test.stl | 0 {rack => old}/screwmount.scad | 0 old/screws.scad | 113 ++++++++++++++++ {rack => old}/screws.stl | 0 profiles/{ => sbc}/rockpro/bottom.stl | 0 profiles/{ => sbc}/rockpro/case.scad | 0 .../rockpro/dual-tray-plate-part.scad | 0 .../rockpro/dual-tray-plate-part.stl | Bin profiles/{ => sbc}/rockpro/dual-tray.scad | 0 profiles/{ => sbc}/rockpro/dual-tray.stl | Bin profiles/{ => sbc}/rockpro/newcase.scad | 0 profiles/{ => sbc}/rockpro/newcase.stl | 0 profiles/{ => sbc}/rockpro/railTest.stl | 0 profiles/{ => sbc}/rockpro/rockpro.scad | 0 profiles/{ => sbc}/rockpro/top.stl | 0 profiles/{ => sbc}/rpi/frontPlate.scad | 0 profiles/{ => sbc}/rpi/frontPlate.stl | Bin profiles/{ => sbc}/rpi/rpi2b.scad | 0 profiles/{ => sbc}/rpi/rpi2b.stl | Bin profiles/{ => sbc}/rpi/rpi2bDimTest.stl | 0 profiles/{ => sbc}/rpi/top.scad | 0 profiles/{ => sbc}/rpi/top.stl | Bin profiles/{ => sbc}/rpi/voronoi.scad | 0 {rack2 => rack}/assemble.scad | 2 +- {rack2 => rack}/config.scad | 0 rack/connectors.scad | 0 {rack2 => rack}/mainRail.scad | 2 +- rack/screws.scad | 124 ++++++++---------- {rack2 => rack}/stackConnector.scad | 4 +- {rack2 => rack}/xBar.scad | 0 {rack2 => rack}/yBar.scad | 2 +- rack2/mainRail.stl | Bin 68684 -> 0 bytes rack2/mainRailS.stl | Bin 68684 -> 0 bytes rack2/mainRailShort.stl | Bin 68684 -> 0 bytes rack2/screws.scad | 97 -------------- rack2/stackConnector.stl | Bin 34684 -> 0 bytes 83 files changed, 172 insertions(+), 172 deletions(-) rename {rack => old}/base1.stl (100%) rename {rack => old}/body/base1.scad (100%) rename {rack => old}/body/l1.scad (100%) rename {rack => old}/body/legToleranceTest.scad (100%) rename {rack => old}/body/m4Leg.scad (100%) rename {rack => old}/body/side/side.scad (100%) rename {rack => old}/body/side/side.stl (100%) rename {rack => old}/body/top1.scad (100%) rename {rack => old}/body/top1.stl (100%) rename {rack => old}/frontPlate.scad (100%) rename {rack => old}/frontPlate2u.stl (100%) rename {rack => old}/l1.stl (100%) rename {rack => old}/legToleranceTest.stl (100%) rename {rack => old}/m4Leg.stl (100%) rename {rack => old}/m4LegM.stl (100%) rename {rack => old}/open-frame.scad (100%) rename {rack => old}/patch-panel.scad (100%) rename {power => old/power}/old/src/open-frame.scad (100%) rename {power => old/power}/src/Untitled.scad (100%) rename {power => old/power}/src/base.scad (100%) rename {power => old/power}/src/join.scad (100%) rename {power => old/power}/src/plate.stl (100%) rename {power => old/power}/src/sfx-psu.scad (100%) rename {power => old/power}/stl/backPlate.stl (100%) rename {power => old/power}/stl/feet.stl (100%) rename {power => old/power}/stl/joinTest.stl (100%) rename "power/stl/joinTest\\.stl" => "old/power/stl/joinTest\\.stl" (100%) rename {power => old/power}/stl/legTest.stl (100%) rename {power => old/power}/stl/plate.stl (100%) rename {power => old/power}/stl/railInsert.stl (100%) rename {power => old/power}/stl/screwtest.stl (100%) rename {power => old/power}/stl/support1.stl (100%) rename {power => old/power}/stl/support2.stl (100%) rename {power => old/power}/stl/top.stl (100%) rename {power => old/power}/stl/topBarInsert.stl (100%) rename {power => old/power}/stl/untitled.fpp (100%) rename {rack => old}/rack-tray/rack-tray.scad (100%) rename {rack => old}/rackCase.scad (100%) rename {rack => old}/rackCase.stl (100%) rename {rack => old}/rackCase180.stl (100%) rename {rack => old}/rackCaseForBox.scad (100%) rename {rack => old}/rackCaseForBox.stl (100%) rename {rack => old}/rackCaseForBoxM.stl (100%) rename {rack => old}/rackCaseFrontPlat.stl (100%) rename {rack => old}/rackCaseFrontPlate.stl (100%) rename {rack => old}/rackCaselid.stl (100%) rename {rack => old}/risers.scad (100%) rename {rack => old}/screwmount-test.stl (100%) rename {rack => old}/screwmount.scad (100%) create mode 100644 old/screws.scad rename {rack => old}/screws.stl (100%) rename profiles/{ => sbc}/rockpro/bottom.stl (100%) rename profiles/{ => sbc}/rockpro/case.scad (100%) rename profiles/{ => sbc}/rockpro/dual-tray-plate-part.scad (100%) rename profiles/{ => sbc}/rockpro/dual-tray-plate-part.stl (100%) rename profiles/{ => sbc}/rockpro/dual-tray.scad (100%) rename profiles/{ => sbc}/rockpro/dual-tray.stl (100%) rename profiles/{ => sbc}/rockpro/newcase.scad (100%) rename profiles/{ => sbc}/rockpro/newcase.stl (100%) rename profiles/{ => sbc}/rockpro/railTest.stl (100%) rename profiles/{ => sbc}/rockpro/rockpro.scad (100%) rename profiles/{ => sbc}/rockpro/top.stl (100%) rename profiles/{ => sbc}/rpi/frontPlate.scad (100%) rename profiles/{ => sbc}/rpi/frontPlate.stl (100%) rename profiles/{ => sbc}/rpi/rpi2b.scad (100%) rename profiles/{ => sbc}/rpi/rpi2b.stl (100%) rename profiles/{ => sbc}/rpi/rpi2bDimTest.stl (100%) rename profiles/{ => sbc}/rpi/top.scad (100%) rename profiles/{ => sbc}/rpi/top.stl (100%) rename profiles/{ => sbc}/rpi/voronoi.scad (100%) rename {rack2 => rack}/assemble.scad (95%) rename {rack2 => rack}/config.scad (100%) create mode 100644 rack/connectors.scad rename {rack2 => rack}/mainRail.scad (99%) rename {rack2 => rack}/stackConnector.scad (97%) rename {rack2 => rack}/xBar.scad (100%) rename {rack2 => rack}/yBar.scad (98%) delete mode 100644 rack2/mainRail.stl delete mode 100644 rack2/mainRailS.stl delete mode 100644 rack2/mainRailShort.stl delete mode 100644 rack2/screws.scad delete mode 100644 rack2/stackConnector.stl diff --git a/rack/base1.stl b/old/base1.stl similarity index 100% rename from rack/base1.stl rename to old/base1.stl diff --git a/rack/body/base1.scad b/old/body/base1.scad similarity index 100% rename from rack/body/base1.scad rename to old/body/base1.scad diff --git a/rack/body/l1.scad b/old/body/l1.scad similarity index 100% rename from rack/body/l1.scad rename to old/body/l1.scad diff --git a/rack/body/legToleranceTest.scad b/old/body/legToleranceTest.scad similarity index 100% rename from rack/body/legToleranceTest.scad rename to old/body/legToleranceTest.scad diff --git a/rack/body/m4Leg.scad b/old/body/m4Leg.scad similarity index 100% rename from rack/body/m4Leg.scad rename to old/body/m4Leg.scad diff --git a/rack/body/side/side.scad b/old/body/side/side.scad similarity index 100% rename from rack/body/side/side.scad rename to old/body/side/side.scad diff --git a/rack/body/side/side.stl b/old/body/side/side.stl similarity index 100% rename from rack/body/side/side.stl rename to old/body/side/side.stl diff --git a/rack/body/top1.scad b/old/body/top1.scad similarity index 100% rename from rack/body/top1.scad rename to old/body/top1.scad diff --git a/rack/body/top1.stl b/old/body/top1.stl similarity index 100% rename from rack/body/top1.stl rename to old/body/top1.stl diff --git a/rack/frontPlate.scad b/old/frontPlate.scad similarity index 100% rename from rack/frontPlate.scad rename to old/frontPlate.scad diff --git a/rack/frontPlate2u.stl b/old/frontPlate2u.stl similarity index 100% rename from rack/frontPlate2u.stl rename to old/frontPlate2u.stl diff --git a/rack/l1.stl b/old/l1.stl similarity index 100% rename from rack/l1.stl rename to old/l1.stl diff --git a/rack/legToleranceTest.stl b/old/legToleranceTest.stl similarity index 100% rename from rack/legToleranceTest.stl rename to old/legToleranceTest.stl diff --git a/rack/m4Leg.stl b/old/m4Leg.stl similarity index 100% rename from rack/m4Leg.stl rename to old/m4Leg.stl diff --git a/rack/m4LegM.stl b/old/m4LegM.stl similarity index 100% rename from rack/m4LegM.stl rename to old/m4LegM.stl diff --git a/rack/open-frame.scad b/old/open-frame.scad similarity index 100% rename from rack/open-frame.scad rename to old/open-frame.scad diff --git a/rack/patch-panel.scad b/old/patch-panel.scad similarity index 100% rename from rack/patch-panel.scad rename to old/patch-panel.scad diff --git a/power/old/src/open-frame.scad b/old/power/old/src/open-frame.scad similarity index 100% rename from power/old/src/open-frame.scad rename to old/power/old/src/open-frame.scad diff --git a/power/src/Untitled.scad b/old/power/src/Untitled.scad similarity index 100% rename from power/src/Untitled.scad rename to old/power/src/Untitled.scad diff --git a/power/src/base.scad b/old/power/src/base.scad similarity index 100% rename from power/src/base.scad rename to old/power/src/base.scad diff --git a/power/src/join.scad b/old/power/src/join.scad similarity index 100% rename from power/src/join.scad rename to old/power/src/join.scad diff --git a/power/src/plate.stl b/old/power/src/plate.stl similarity index 100% rename from power/src/plate.stl rename to old/power/src/plate.stl diff --git a/power/src/sfx-psu.scad b/old/power/src/sfx-psu.scad similarity index 100% rename from power/src/sfx-psu.scad rename to old/power/src/sfx-psu.scad diff --git a/power/stl/backPlate.stl b/old/power/stl/backPlate.stl similarity index 100% rename from power/stl/backPlate.stl rename to old/power/stl/backPlate.stl diff --git a/power/stl/feet.stl b/old/power/stl/feet.stl similarity index 100% rename from power/stl/feet.stl rename to old/power/stl/feet.stl diff --git a/power/stl/joinTest.stl b/old/power/stl/joinTest.stl similarity index 100% rename from power/stl/joinTest.stl rename to old/power/stl/joinTest.stl diff --git "a/power/stl/joinTest\\.stl" "b/old/power/stl/joinTest\\.stl" similarity index 100% rename from "power/stl/joinTest\\.stl" rename to "old/power/stl/joinTest\\.stl" diff --git a/power/stl/legTest.stl b/old/power/stl/legTest.stl similarity index 100% rename from power/stl/legTest.stl rename to old/power/stl/legTest.stl diff --git a/power/stl/plate.stl b/old/power/stl/plate.stl similarity index 100% rename from power/stl/plate.stl rename to old/power/stl/plate.stl diff --git a/power/stl/railInsert.stl b/old/power/stl/railInsert.stl similarity index 100% rename from power/stl/railInsert.stl rename to old/power/stl/railInsert.stl diff --git a/power/stl/screwtest.stl b/old/power/stl/screwtest.stl similarity index 100% rename from power/stl/screwtest.stl rename to old/power/stl/screwtest.stl diff --git a/power/stl/support1.stl b/old/power/stl/support1.stl similarity index 100% rename from power/stl/support1.stl rename to old/power/stl/support1.stl diff --git a/power/stl/support2.stl b/old/power/stl/support2.stl similarity index 100% rename from power/stl/support2.stl rename to old/power/stl/support2.stl diff --git a/power/stl/top.stl b/old/power/stl/top.stl similarity index 100% rename from power/stl/top.stl rename to old/power/stl/top.stl diff --git a/power/stl/topBarInsert.stl b/old/power/stl/topBarInsert.stl similarity index 100% rename from power/stl/topBarInsert.stl rename to old/power/stl/topBarInsert.stl diff --git a/power/stl/untitled.fpp b/old/power/stl/untitled.fpp similarity index 100% rename from power/stl/untitled.fpp rename to old/power/stl/untitled.fpp diff --git a/rack/rack-tray/rack-tray.scad b/old/rack-tray/rack-tray.scad similarity index 100% rename from rack/rack-tray/rack-tray.scad rename to old/rack-tray/rack-tray.scad diff --git a/rack/rackCase.scad b/old/rackCase.scad similarity index 100% rename from rack/rackCase.scad rename to old/rackCase.scad diff --git a/rack/rackCase.stl b/old/rackCase.stl similarity index 100% rename from rack/rackCase.stl rename to old/rackCase.stl diff --git a/rack/rackCase180.stl b/old/rackCase180.stl similarity index 100% rename from rack/rackCase180.stl rename to old/rackCase180.stl diff --git a/rack/rackCaseForBox.scad b/old/rackCaseForBox.scad similarity index 100% rename from rack/rackCaseForBox.scad rename to old/rackCaseForBox.scad diff --git a/rack/rackCaseForBox.stl b/old/rackCaseForBox.stl similarity index 100% rename from rack/rackCaseForBox.stl rename to old/rackCaseForBox.stl diff --git a/rack/rackCaseForBoxM.stl b/old/rackCaseForBoxM.stl similarity index 100% rename from rack/rackCaseForBoxM.stl rename to old/rackCaseForBoxM.stl diff --git a/rack/rackCaseFrontPlat.stl b/old/rackCaseFrontPlat.stl similarity index 100% rename from rack/rackCaseFrontPlat.stl rename to old/rackCaseFrontPlat.stl diff --git a/rack/rackCaseFrontPlate.stl b/old/rackCaseFrontPlate.stl similarity index 100% rename from rack/rackCaseFrontPlate.stl rename to old/rackCaseFrontPlate.stl diff --git a/rack/rackCaselid.stl b/old/rackCaselid.stl similarity index 100% rename from rack/rackCaselid.stl rename to old/rackCaselid.stl diff --git a/rack/risers.scad b/old/risers.scad similarity index 100% rename from rack/risers.scad rename to old/risers.scad diff --git a/rack/screwmount-test.stl b/old/screwmount-test.stl similarity index 100% rename from rack/screwmount-test.stl rename to old/screwmount-test.stl diff --git a/rack/screwmount.scad b/old/screwmount.scad similarity index 100% rename from rack/screwmount.scad rename to old/screwmount.scad diff --git a/old/screws.scad b/old/screws.scad new file mode 100644 index 0000000..266655d --- /dev/null +++ b/old/screws.scad @@ -0,0 +1,113 @@ + +/* Some common screw dimensions */ + + +inf = 400; // basically infinity + +/********************************************************************************/ +// M3 dimensions + +m3HoleRadiusSlack = 0.15; +m3Diameter = 3.0; +m3Radius = m3Diameter/2.0; + +m3RadiusSlacked = m3Radius + m3HoleRadiusSlack; + +// legacy TODO: replace +m3ptr = m3RadiusSlacked; + +// NUTS! +m3HexNutWidthAcrossFlats = 5.41; +m3HexNutWidthAcrossCorners = FtoG(m3HexNutWidthAcrossFlats); + +m3HexNutThickness = 2.18; + +module m3HexNutPocketNegative() { + hexNutPocketNegative(m3RadiusSlacked, + m3HexNutWidthAcrossCorners/2 + 0.1, + m3HexNutThickness + 0.2); +} + + +// TODO: remove test + +*difference() { + cube(size=[8,12,5], center=true); + + rotate(a=[0,0,20]) + m3HexNutPocketNegative(); +} + +*m3HexNutPocketNegative(); + + +/********************************************************************************/ +// M4 dimensions + +m4HoleRadiusSlack = 0.15; +m4Diameter = 4.0; +m4Radius = m4Diameter/2.0; +m4RadiusSlacked = m4Radius + m4HoleRadiusSlack; + +m4HexNutWidthAcrossFlats = 6.89; +m4HexNutWidthAcrossCorners = FtoG(m4HexNutWidthAcrossFlats); + +m4HexNutThickness = 3.07; + +module m4HexNutPocketNegative() { + hexNutPocketNegative(m4RadiusSlacked, + m4HexNutWidthAcrossCorners/2 + 0.1, + m4HexNutThickness + 0.2); +} + + +// TODO: remove test + +*difference() { + translate(v=[0,1,0]) + cube(size=[10,12,6], center=true); + + rotate(a=[0,0,20]) + m4HexNutPocketNegative(); +} + +*m4HexNutPocketNegative(); + +/********************************************************************************/ + +// Convert a regular hexagon widthAcrossFlats to widthAcrossCorners +function FtoG(widthAcrossFlats) = widthAcrossFlats * (2/sqrt(3)); + +// Convert a regular hexagon widthAcrossCorners to widthAcrossFlats +function GtoF(widthAcrossCorners) = widthAcrossCorners * (sqrt(3)/2); + + +module hexNutPocketNegative( + innerRadius, + widthAcrossCorners, + thickness) +{ + + union() { + + hull() { + // hexagonal cylinder representing where the nut should fit + cylinder(r=widthAcrossCorners, h=thickness, center=true, $fn=6); + + // negative volume for sliding in the nut + translate(v=[inf,0,0]) + cylinder(r=widthAcrossCorners, h=thickness, center=true, $fn=6); + } + + // negative volume for screw lead + translate(v=[0,0,-10]) + cylinder(r=innerRadius, h = inf, $fn=32); + + hull() { + translate(v=[inf,0,0]) + cylinder(r=innerRadius, h = inf, $fn=32); + cylinder(r=innerRadius, h = inf, $fn=32); + } + } +} + diff --git a/rack/screws.stl b/old/screws.stl similarity index 100% rename from rack/screws.stl rename to old/screws.stl diff --git a/profiles/rockpro/bottom.stl b/profiles/sbc/rockpro/bottom.stl similarity index 100% rename from profiles/rockpro/bottom.stl rename to profiles/sbc/rockpro/bottom.stl diff --git a/profiles/rockpro/case.scad b/profiles/sbc/rockpro/case.scad similarity index 100% rename from profiles/rockpro/case.scad rename to profiles/sbc/rockpro/case.scad diff --git a/profiles/rockpro/dual-tray-plate-part.scad b/profiles/sbc/rockpro/dual-tray-plate-part.scad similarity index 100% rename from profiles/rockpro/dual-tray-plate-part.scad rename to profiles/sbc/rockpro/dual-tray-plate-part.scad diff --git a/profiles/rockpro/dual-tray-plate-part.stl b/profiles/sbc/rockpro/dual-tray-plate-part.stl similarity index 100% rename from profiles/rockpro/dual-tray-plate-part.stl rename to profiles/sbc/rockpro/dual-tray-plate-part.stl diff --git a/profiles/rockpro/dual-tray.scad b/profiles/sbc/rockpro/dual-tray.scad similarity index 100% rename from profiles/rockpro/dual-tray.scad rename to profiles/sbc/rockpro/dual-tray.scad diff --git a/profiles/rockpro/dual-tray.stl b/profiles/sbc/rockpro/dual-tray.stl similarity index 100% rename from profiles/rockpro/dual-tray.stl rename to profiles/sbc/rockpro/dual-tray.stl diff --git a/profiles/rockpro/newcase.scad b/profiles/sbc/rockpro/newcase.scad similarity index 100% rename from profiles/rockpro/newcase.scad rename to profiles/sbc/rockpro/newcase.scad diff --git a/profiles/rockpro/newcase.stl b/profiles/sbc/rockpro/newcase.stl similarity index 100% rename from profiles/rockpro/newcase.stl rename to profiles/sbc/rockpro/newcase.stl diff --git a/profiles/rockpro/railTest.stl b/profiles/sbc/rockpro/railTest.stl similarity index 100% rename from profiles/rockpro/railTest.stl rename to profiles/sbc/rockpro/railTest.stl diff --git a/profiles/rockpro/rockpro.scad b/profiles/sbc/rockpro/rockpro.scad similarity index 100% rename from profiles/rockpro/rockpro.scad rename to profiles/sbc/rockpro/rockpro.scad diff --git a/profiles/rockpro/top.stl b/profiles/sbc/rockpro/top.stl similarity index 100% rename from profiles/rockpro/top.stl rename to profiles/sbc/rockpro/top.stl diff --git a/profiles/rpi/frontPlate.scad b/profiles/sbc/rpi/frontPlate.scad similarity index 100% rename from profiles/rpi/frontPlate.scad rename to profiles/sbc/rpi/frontPlate.scad diff --git a/profiles/rpi/frontPlate.stl b/profiles/sbc/rpi/frontPlate.stl similarity index 100% rename from profiles/rpi/frontPlate.stl rename to profiles/sbc/rpi/frontPlate.stl diff --git a/profiles/rpi/rpi2b.scad b/profiles/sbc/rpi/rpi2b.scad similarity index 100% rename from profiles/rpi/rpi2b.scad rename to profiles/sbc/rpi/rpi2b.scad diff --git a/profiles/rpi/rpi2b.stl b/profiles/sbc/rpi/rpi2b.stl similarity index 100% rename from profiles/rpi/rpi2b.stl rename to profiles/sbc/rpi/rpi2b.stl diff --git a/profiles/rpi/rpi2bDimTest.stl b/profiles/sbc/rpi/rpi2bDimTest.stl similarity index 100% rename from profiles/rpi/rpi2bDimTest.stl rename to profiles/sbc/rpi/rpi2bDimTest.stl diff --git a/profiles/rpi/top.scad b/profiles/sbc/rpi/top.scad similarity index 100% rename from profiles/rpi/top.scad rename to profiles/sbc/rpi/top.scad diff --git a/profiles/rpi/top.stl b/profiles/sbc/rpi/top.stl similarity index 100% rename from profiles/rpi/top.stl rename to profiles/sbc/rpi/top.stl diff --git a/profiles/rpi/voronoi.scad b/profiles/sbc/rpi/voronoi.scad similarity index 100% rename from profiles/rpi/voronoi.scad rename to profiles/sbc/rpi/voronoi.scad diff --git a/rack2/assemble.scad b/rack/assemble.scad similarity index 95% rename from rack2/assemble.scad rename to rack/assemble.scad index db76f0c..3c13233 100644 --- a/rack2/assemble.scad +++ b/rack/assemble.scad @@ -1,4 +1,4 @@ -include <../math.scad> +include <../helper/math.scad> include <./config.scad> include <./mainRail.scad> include <./yBar.scad> diff --git a/rack2/config.scad b/rack/config.scad similarity index 100% rename from rack2/config.scad rename to rack/config.scad diff --git a/rack/connectors.scad b/rack/connectors.scad new file mode 100644 index 0000000..e69de29 diff --git a/rack2/mainRail.scad b/rack/mainRail.scad similarity index 99% rename from rack2/mainRail.scad rename to rack/mainRail.scad index ecb8437..d3856be 100644 --- a/rack2/mainRail.scad +++ b/rack/mainRail.scad @@ -1,6 +1,6 @@ include <./config.scad> include <./screws.scad> -include <../math.scad> +include <../helper/math.scad> /* Small horizontal planes at the top and bottom of the main rails. Used so we can fasten the rail to the frame Note that this value is also used for a depression at the bottom/top of the frame for aligning the rail */ diff --git a/rack/screws.scad b/rack/screws.scad index 266655d..3d18670 100644 --- a/rack/screws.scad +++ b/rack/screws.scad @@ -1,113 +1,97 @@ +/* Some common screw dimensions and helper functions/modules */ -/* Some common screw dimensions */ - - -inf = 400; // basically infinity +include <../helper/math.scad> +include <../helper/common.scad> /********************************************************************************/ // M3 dimensions - -m3HoleRadiusSlack = 0.15; +m3HoleRadiusSlack = 0.4; // higher slack for not-so straight heat set inserts m3Diameter = 3.0; -m3Radius = m3Diameter/2.0; - +m3Radius = m3Diameter / 2.0; m3RadiusSlacked = m3Radius + m3HoleRadiusSlack; -// legacy TODO: replace -m3ptr = m3RadiusSlacked; - -// NUTS! m3HexNutWidthAcrossFlats = 5.41; m3HexNutWidthAcrossCorners = FtoG(m3HexNutWidthAcrossFlats); - m3HexNutThickness = 2.18; -module m3HexNutPocketNegative() { - hexNutPocketNegative(m3RadiusSlacked, - m3HexNutWidthAcrossCorners/2 + 0.1, - m3HexNutThickness + 0.2); -} +m3HeatSetInsertSlotRadiusSlack = -0.1; +m3HeatSetInsertSlotHeightSlack = 0.5; +m3HeatSetInsertSlotRadius = 2.5; +m3HeatSetInsertSlotHeight = 6; -// TODO: remove test - -*difference() { - cube(size=[8,12,5], center=true); - - rotate(a=[0,0,20]) - m3HexNutPocketNegative(); -} - -*m3HexNutPocketNegative(); - +m3HeatSetInsertSlotRadiusSlacked = m3HeatSetInsertSlotRadius+m3HeatSetInsertSlotRadiusSlack; +m3HeatSetInsertSlotHeightSlacked = m3HeatSetInsertSlotHeight+m3HeatSetInsertSlotHeightSlack; /********************************************************************************/ // M4 dimensions - m4HoleRadiusSlack = 0.15; m4Diameter = 4.0; -m4Radius = m4Diameter/2.0; +m4Radius = m4Diameter / 2.0; m4RadiusSlacked = m4Radius + m4HoleRadiusSlack; - m4HexNutWidthAcrossFlats = 6.89; m4HexNutWidthAcrossCorners = FtoG(m4HexNutWidthAcrossFlats); - m4HexNutThickness = 3.07; -module m4HexNutPocketNegative() { - hexNutPocketNegative(m4RadiusSlacked, - m4HexNutWidthAcrossCorners/2 + 0.1, - m4HexNutThickness + 0.2); -} - - -// TODO: remove test - -*difference() { - translate(v=[0,1,0]) - cube(size=[10,12,6], center=true); - - rotate(a=[0,0,20]) - m4HexNutPocketNegative(); -} - -*m4HexNutPocketNegative(); - /********************************************************************************/ -// Convert a regular hexagon widthAcrossFlats to widthAcrossCorners -function FtoG(widthAcrossFlats) = widthAcrossFlats * (2/sqrt(3)); +module heatSetInsertSlot_N(screwType) { + if (screwType == "m3") { + union() { + // actual slot for insert + cylinder(h = m3HeatSetInsertSlotHeightSlacked, r = m3HeatSetInsertSlotRadiusSlacked); -// Convert a regular hexagon widthAcrossCorners to widthAcrossFlats -function GtoF(widthAcrossCorners) = widthAcrossCorners * (sqrt(3)/2); + // extra space above slot to help with insertion + translate(v=[0, 0, m3HeatSetInsertSlotHeightSlacked]) + cylinder(h = inf50, r = 1.3*m3HeatSetInsertSlotRadiusSlacked); + } + } else { + error("Unsupported screw type"); + } +} +function screwRadiusSlacked(screwType) = + (screwType == "m3") + ? m3RadiusSlacked + : (screwType == "m4") + ? m4RadiusSlacked + : error("Unsupported screw type"); -module hexNutPocketNegative( - innerRadius, - widthAcrossCorners, - thickness) -{ +module hexNutPocket_N(screwType) { + if (screwType == "m3") { + hexNutPocketHelper_N(m3RadiusSlacked, m3HexNutWidthAcrossCorners / 2 + 0.1, m3HexNutThickness + 0.2); + } else if (screwType == "m4") { + hexNutPocketHelper_N(m4RadiusSlacked, m4HexNutWidthAcrossCorners / 2 + 0.1, m4HexNutThickness + 0.2); + } else { + error("Unsupported screw type"); + } +} +module hexNutPocketHelper_N(innerRadius, widthAcrossCorners, thickness) { union() { - hull() { // hexagonal cylinder representing where the nut should fit - cylinder(r=widthAcrossCorners, h=thickness, center=true, $fn=6); + cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); // negative volume for sliding in the nut - translate(v=[inf,0,0]) - cylinder(r=widthAcrossCorners, h=thickness, center=true, $fn=6); + translate(v = [inf50, 0, 0]) + cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); } // negative volume for screw lead - translate(v=[0,0,-10]) - cylinder(r=innerRadius, h = inf, $fn=32); + translate(v = [0, 0, - 10]) + cylinder(r = innerRadius, h = inf50, $fn = 32); hull() { - translate(v=[inf,0,0]) - cylinder(r=innerRadius, h = inf, $fn=32); - cylinder(r=innerRadius, h = inf, $fn=32); + translate(v = [inf50, 0, 0]) + cylinder(r = innerRadius, h = inf50, $fn = 32); + cylinder(r = innerRadius, h = inf50, $fn = 32); } } } +// Convert a regular hexagon widthAcrossFlats to widthAcrossCorners +function FtoG(widthAcrossFlats) = widthAcrossFlats * (2 / sqrt(3)); + +// Convert a regular hexagon widthAcrossCorners to widthAcrossFlats +function GtoF(widthAcrossCorners) = widthAcrossCorners * (sqrt(3) / 2); diff --git a/rack2/stackConnector.scad b/rack/stackConnector.scad similarity index 97% rename from rack2/stackConnector.scad rename to rack/stackConnector.scad index 9aaf4cd..71ab558 100644 --- a/rack2/stackConnector.scad +++ b/rack/stackConnector.scad @@ -1,6 +1,6 @@ -include <../math.scad> +include <../helper/math.scad> include <../misc/magnet.scad> -include <../common.scad> +include <../helper/common.scad> connectorTaperStartHeight = 2; connectorRectWidth = 10; diff --git a/rack2/xBar.scad b/rack/xBar.scad similarity index 100% rename from rack2/xBar.scad rename to rack/xBar.scad diff --git a/rack2/yBar.scad b/rack/yBar.scad similarity index 98% rename from rack2/yBar.scad rename to rack/yBar.scad index 1572e6c..bcb4f41 100644 --- a/rack2/yBar.scad +++ b/rack/yBar.scad @@ -1,4 +1,4 @@ -include <../math.scad> +include <../helper/math.scad> include <../misc/magnet.scad> include <../helper/sphericalFilet.scad> include <../helper/cylindricalFilet.scad> diff --git a/rack2/mainRail.stl b/rack2/mainRail.stl deleted file mode 100644 index 94ebd91206c0cdcfc9c90071d0875562691bc05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68684 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 YYBcE9SC&XUlBheXhen(}`Yg-;18vBJq5uE@ diff --git a/rack2/mainRailS.stl b/rack2/mainRailS.stl deleted file mode 100644 index 6de58f54ed6da2d9a6200eac78ed978e89b9754b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68684 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 diff --git a/rack2/mainRailShort.stl b/rack2/mainRailShort.stl deleted file mode 100644 index 6de58f54ed6da2d9a6200eac78ed978e89b9754b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68684 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 diff --git a/rack2/screws.scad b/rack2/screws.scad deleted file mode 100644 index 67ab710..0000000 --- a/rack2/screws.scad +++ /dev/null @@ -1,97 +0,0 @@ -/* Some common screw dimensions and helper functions/modules */ - -include <../math.scad> -include <../common.scad> - -/********************************************************************************/ -// M3 dimensions -m3HoleRadiusSlack = 0.4; // higher slack for not-so straight heat set inserts -m3Diameter = 3.0; -m3Radius = m3Diameter / 2.0; -m3RadiusSlacked = m3Radius + m3HoleRadiusSlack; - -m3HexNutWidthAcrossFlats = 5.41; -m3HexNutWidthAcrossCorners = FtoG(m3HexNutWidthAcrossFlats); -m3HexNutThickness = 2.18; - -m3HeatSetInsertSlotRadiusSlack = -0.1; -m3HeatSetInsertSlotHeightSlack = 0.5; - -m3HeatSetInsertSlotRadius = 2.5; -m3HeatSetInsertSlotHeight = 6; - -m3HeatSetInsertSlotRadiusSlacked = m3HeatSetInsertSlotRadius+m3HeatSetInsertSlotRadiusSlack; -m3HeatSetInsertSlotHeightSlacked = m3HeatSetInsertSlotHeight+m3HeatSetInsertSlotHeightSlack; - -/********************************************************************************/ -// M4 dimensions -m4HoleRadiusSlack = 0.15; -m4Diameter = 4.0; -m4Radius = m4Diameter / 2.0; -m4RadiusSlacked = m4Radius + m4HoleRadiusSlack; -m4HexNutWidthAcrossFlats = 6.89; -m4HexNutWidthAcrossCorners = FtoG(m4HexNutWidthAcrossFlats); -m4HexNutThickness = 3.07; - -/********************************************************************************/ - -module heatSetInsertSlot_N(screwType) { - if (screwType == "m3") { - union() { - // actual slot for insert - cylinder(h = m3HeatSetInsertSlotHeightSlacked, r = m3HeatSetInsertSlotRadiusSlacked); - - // extra space above slot to help with insertion - translate(v=[0, 0, m3HeatSetInsertSlotHeightSlacked]) - cylinder(h = inf50, r = 1.3*m3HeatSetInsertSlotRadiusSlacked); - } - } else { - error("Unsupported screw type"); - } -} - -function screwRadiusSlacked(screwType) = - (screwType == "m3") - ? m3RadiusSlacked - : (screwType == "m4") - ? m4RadiusSlacked - : error("Unsupported screw type"); - -module hexNutPocket_N(screwType) { - if (screwType == "m3") { - hexNutPocketHelper_N(m3RadiusSlacked, m3HexNutWidthAcrossCorners / 2 + 0.1, m3HexNutThickness + 0.2); - } else if (screwType == "m4") { - hexNutPocketHelper_N(m4RadiusSlacked, m4HexNutWidthAcrossCorners / 2 + 0.1, m4HexNutThickness + 0.2); - } else { - error("Unsupported screw type"); - } -} - -module hexNutPocketHelper_N(innerRadius, widthAcrossCorners, thickness) { - union() { - hull() { - // hexagonal cylinder representing where the nut should fit - cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); - - // negative volume for sliding in the nut - translate(v = [inf50, 0, 0]) - cylinder(r = widthAcrossCorners, h = thickness, center = true, $fn = 6); - } - - // negative volume for screw lead - translate(v = [0, 0, - 10]) - cylinder(r = innerRadius, h = inf50, $fn = 32); - - hull() { - translate(v = [inf50, 0, 0]) - cylinder(r = innerRadius, h = inf50, $fn = 32); - cylinder(r = innerRadius, h = inf50, $fn = 32); - } - } -} - -// Convert a regular hexagon widthAcrossFlats to widthAcrossCorners -function FtoG(widthAcrossFlats) = widthAcrossFlats * (2 / sqrt(3)); - -// Convert a regular hexagon widthAcrossCorners to widthAcrossFlats -function GtoF(widthAcrossCorners) = widthAcrossCorners * (sqrt(3) / 2); diff --git a/rack2/stackConnector.stl b/rack2/stackConnector.stl deleted file mode 100644 index e6df8cda49d6399bd6b12e6a9ceb12d61c5d645c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34684 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