mirror of
https://github.com/ThorstenBr/FloppyEmuDiskIIEnclosure.git
synced 2024-12-28 16:30:28 +00:00
201 lines
6.2 KiB
OpenSCAD
201 lines
6.2 KiB
OpenSCAD
// Copyright 2022 Thorsten Brehm
|
|
// brehmt (at) gmail dot com
|
|
|
|
|
|
// front panel hole for a rectangular button
|
|
module buttonCutout()
|
|
{
|
|
// add 1mm spacing, so the button moves freely (results in 0.5mm clearance on each side)
|
|
buttonXWidth = ButtonXWidth+0.5;
|
|
buttonYHeight = ButtonYHeight+0.5;
|
|
|
|
translate([-buttonXWidth/2, -buttonYHeight/2, 0])
|
|
roundedCube(buttonXWidth, buttonYHeight, SKIN, ButtonCorners);
|
|
}
|
|
|
|
// test / unused
|
|
module buttonFrame()
|
|
{
|
|
XWidth = ButtonXWidth+6;
|
|
YHeight = ButtonYHeight+6;
|
|
|
|
difference()
|
|
{
|
|
translate([-XWidth/2, -YHeight/2, 0])
|
|
roundedCube(XWidth, YHeight, SKIN, ButtonCorners);
|
|
buttonCutout();
|
|
}
|
|
}
|
|
|
|
// various holes for the front panel
|
|
module panelCutouts()
|
|
{
|
|
// LCD display
|
|
translate([BoxX_Width-DisplayXDistance, BoxY_Height-DisplayYDistance, 0])
|
|
{
|
|
translate([-DisplayWidth, -DisplayHeight, 0])
|
|
roundedCube(DisplayWidth, DisplayHeight, SKIN*2, DisplayCornerRadius);
|
|
}
|
|
|
|
// SD Slot
|
|
translate([BoxX_Width-SDSlotXDistance, SDSlotYDistance, 0])
|
|
{
|
|
translate([-SDSlotWidth, 0, 0])
|
|
roundedCube(SDSlotWidth, SDSlotHeight, SKIN, SDSlotCorners);
|
|
}
|
|
|
|
// LEDs
|
|
translate([BoxX_Width-LedXOfs, LedYOfs, 0]) hole(LedDiameter, SKIN);
|
|
if (LedCount>1)
|
|
translate([BoxX_Width-LedXOfs, LedYOfs-LedYDistance, 0]) hole(LedDiameter, SKIN);
|
|
|
|
// buttons
|
|
for (x = [0 : 1: 0])
|
|
{
|
|
for (y = [0 : 1: 0])
|
|
{
|
|
translate([ButtonXOfs+ButtonXWidth/2+(ButtonXSpacing)*x,
|
|
BoxY_Height-ButtonYHeight/2-ButtonYOfs-(ButtonYSpacing)*y, 0])
|
|
buttonCutout();
|
|
}
|
|
}
|
|
|
|
for (x = [1 : 1: 1])
|
|
{
|
|
for (y = [0 : 1: 2])
|
|
{
|
|
translate([ButtonXOfs+ButtonXWidth/2+(ButtonXSpacing)*x,
|
|
BoxY_Height-ButtonYHeight/2-ButtonYOfs-(ButtonYSpacing)*y, 0])
|
|
buttonCutout();
|
|
}
|
|
}
|
|
}
|
|
|
|
// pegs to hold the display
|
|
module displayPegs()
|
|
{
|
|
translate([BoxX_Width-DisplayXDistance, BoxY_Height-DisplayYDistance-DisplayHeight/2+DisplayPegYDistance/2-DisplayPegYOffset, SKIN])
|
|
{
|
|
translate([-DisplayWidth/2+DisplayPegXDistance/2, 0, 0])
|
|
screwPost(DisplayPegHeight, DisplayPegDiameter, 0, 0, 0);
|
|
translate([-DisplayWidth/2+DisplayPegXDistance/2, -DisplayPegYDistance,0])
|
|
screwPost(DisplayPegHeight, DisplayPegDiameter, 0, 0, 0);
|
|
translate([-DisplayWidth/2-DisplayPegXDistance/2, 0,0])
|
|
screwPost(DisplayPegHeight, DisplayPegDiameter, 0, 0, 0);
|
|
translate([-DisplayWidth/2-DisplayPegXDistance/2, -DisplayPegYDistance,0])
|
|
screwPost(DisplayPegHeight, DisplayPegDiameter, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
// screw posts and supports of the button panel
|
|
module buttonPanelSupports()
|
|
{
|
|
XOfs = ButtonXOfs+ButtonXWidth/2+ButtonRaster*3/2;
|
|
YOfs = BoxY_Height-ButtonYHeight/2-ButtonYOfs;
|
|
for (x = [-1 : 1: -1])
|
|
for (y = [0 : 2: 2])
|
|
{
|
|
echo("Button Panel mount (x/y):",ButtonXSpacing*x, ButtonYSpacing*y);
|
|
translate([XOfs+ButtonXSpacing*x, YOfs-ButtonYSpacing*y, SKIN])
|
|
screwPost(ButtonScrewPostHeight, ScrewPostDiameter, ScrewDiameter, ButtonScrewPostHeight, 0.5);
|
|
}
|
|
for (x = [2 : 1: 2])
|
|
for (y = [0 : 2: 2])
|
|
{
|
|
echo("Button Panel mount (x/y):",ButtonXSpacing*x, ButtonYSpacing*y);
|
|
translate([XOfs+ButtonXSpacing*x, YOfs-ButtonYSpacing*y, SKIN])
|
|
screwPost(ButtonScrewPostHeight, ScrewPostDiameter, ScrewDiameter, ButtonScrewPostHeight, 0.5);
|
|
}
|
|
}
|
|
|
|
module baseFrontPanel()
|
|
{
|
|
roundedCube(BoxX_Width-2*FrontPanelGap, BoxY_Height-FrontPanelGap, SKIN, Box_Corner_Radius);
|
|
}
|
|
|
|
module displayFrame()
|
|
{
|
|
// LCD display
|
|
translate([BoxX_Width-DisplayXDistance, BoxY_Height-DisplayYDistance, 0])
|
|
{
|
|
translate([-DisplayWidth-1, -DisplayHeight-1, SKIN])
|
|
roundedCube(DisplayWidth+2, DisplayHeight+2, DisplayFrameZHeight, DisplayCornerRadius);
|
|
}
|
|
}
|
|
|
|
// front panel
|
|
module makeFront()
|
|
{
|
|
translate([FrontPanelGap, 0, FrontPanelZOffset])
|
|
{
|
|
displayPegs();
|
|
difference()
|
|
{
|
|
union()
|
|
{
|
|
baseFrontPanel();
|
|
displayFrame();
|
|
}
|
|
panelCutouts();
|
|
}
|
|
|
|
// screw posts for the button panel
|
|
buttonPanelSupports();
|
|
|
|
difference()
|
|
{
|
|
translate([Box_Corner_Radius, 0, SKIN]) cube([BoxX_Width-Box_Corner_Radius*2, SKIN, FrontPanelZLedge]);
|
|
|
|
// hole
|
|
translate([FrontGapX/2, -SKIN , FrontPanelZLedge/2]) rotate([270, 0, 0])
|
|
hole(ScrewDiameter, 10);
|
|
|
|
// hole
|
|
translate([BoxX_Width-FrontGapX/2, -SKIN, FrontPanelZLedge/2]) rotate([270, 0, 0])
|
|
hole(ScrewDiameter, 10);
|
|
}
|
|
|
|
// LED sockets
|
|
translate([BoxX_Width-LedXOfs, LedYOfs, SKIN])
|
|
screwPost(LedSocketHeight, LedDiameter+2, LedDiameter, LedSocketHeight, 0);
|
|
if (LedCount>1)
|
|
translate([BoxX_Width-LedXOfs, LedYOfs-LedYDistance, SKIN])
|
|
screwPost(LedSocketHeight, LedDiameter+2, LedDiameter, LedSocketHeight, 0);
|
|
|
|
// support triangles
|
|
SupportWidth = FrontPanelZLedge;
|
|
// left
|
|
translate([Box_Corner_Radius, SKIN, SupportWidth+SKIN]) rotate([270, 0, 0]) prism(SKIN, SupportWidth, SupportWidth);
|
|
// right
|
|
translate([BoxX_Width-Box_Corner_Radius-SKIN, SKIN, SupportWidth+SKIN]) rotate([270, 0, 0]) prism(SKIN, SupportWidth, SupportWidth);
|
|
|
|
// screw posts
|
|
translate([FrontGapX/2, SKIN , FrontPanelZLedge/2])
|
|
{
|
|
rotate([270, 0, 0]) screwPost(ScrewPostHeight, ScrewPostDiameter, ScrewDiameter, ScrewPostHeight, 0);
|
|
translate([-ScrewPostDiameter/2, 0, -FrontPanelZLedge/2+SKIN]) cube([ScrewPostHeight, ScrewPostDiameter, FrontPanelZLedge/3-SKIN]);
|
|
}
|
|
|
|
translate([BoxX_Width-FrontGapX/2, SKIN, FrontPanelZLedge/2])
|
|
{
|
|
rotate([270, 0, 0]) screwPost(ScrewPostHeight, ScrewPostDiameter, ScrewDiameter, ScrewPostHeight, 0);
|
|
translate([-ScrewPostDiameter/2, 0, -FrontPanelZLedge/2+SKIN]) cube([ScrewPostHeight, ScrewPostDiameter, FrontPanelZLedge/3-SKIN]);
|
|
}
|
|
}
|
|
|
|
// front screw posts for FloppyEmu PCB
|
|
PcbFrontMountHeight = PcbYOfs-SKIN;
|
|
translate([BoxX_Width/2-PcbXWidth/2+PcbScrewDistance+PcbXOfs, SKIN , PcbZOfs+PcbScrewDistance])
|
|
{
|
|
rotate([270, 0, 0]) screwPost(PcbFrontMountHeight, PcbScrewPostDiameter, PcbScrewDiameter, PcbFrontMountHeight, 0);
|
|
translate([-PcbScrewPostDiameter/2,0,-PcbScrewPostDiameter/2]) cube([PcbScrewPostDiameter, PcbFrontMountHeight, PcbScrewPostDiameter/4]);
|
|
}
|
|
|
|
translate([BoxX_Width/2+PcbXWidth/2-PcbScrewDistance+PcbXOfs, SKIN, PcbZOfs+PcbScrewDistance])
|
|
{
|
|
rotate([270, 0, 0]) screwPost(PcbFrontMountHeight, PcbScrewPostDiameter, PcbScrewDiameter, PcbFrontMountHeight, 0);
|
|
translate([-PcbScrewPostDiameter/2,0,-PcbScrewPostDiameter/2]) cube([PcbScrewPostDiameter, PcbFrontMountHeight, PcbScrewPostDiameter/4]);
|
|
}
|
|
}
|
|
|