33 Commits

Author SHA1 Message Date
9d109f1756 document v4.5.0
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-10-07 10:33:11 -05:00
0ea02154b5 add the mount spacer to the BSS AE build notes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-10-07 10:32:54 -05:00
e29d9e6180 cut the horiz. stripes down to 5 to try to get them to print better
squeezing 6 in made the structure pretty stringy and unsatisfying to
handle, this should be better

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-10-07 10:26:28 -05:00
f509b8df80 rename the q2009 project as the BSS AE 2024-10-07 09:28:02 -05:00
71b2c786be create a basic README for the project
will add more documentation if/when it is needed

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-10-07 09:24:44 -05:00
5c542944d2 rename "sega 2P plus one" layouts + etc. as "sega 2P nine"
seems more coherent, and fits with the newer sega 2P eleven layout I
made, even if I'm going to end up sticking with nine in my builds

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-24 08:21:41 -05:00
623e025566 break out the Sega 2P + 1 plate by itself, absent the dir_arc plate
now that the dir_arc plate is a separate piece, as it should be, we
don't need to duplicate it here.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-24 07:55:57 -05:00
d1a8f34c2a another aux panel, this with a hole for a rocker switch
I realized pretty late in the build here that I didn't have a way to
access the Fn switch, so I'm just going to try putting it away at the
top back for now

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-24 07:51:57 -05:00
900ca8c751 add a three-button cluster for the aux buttons on a panel
Q2009-specific for now, though maybe one day I'll use the cluster on a
frame wall, in which case I'd move this to the "core" collection of
parts

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-20 08:13:16 -05:00
d87794db59 make the mount spacers a separate piece
this was necessary for the back bottom pieces, so might as well simplify the
print of the front bottom pieces as well

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-18 10:29:51 -05:00
f0d3f434a3 gitignore .stl files
why didn't I do this aeons ago!?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-17 16:21:16 -05:00
2f027ef1fe back pieces for extending the enclosure to the back edge of the base
these pieces are largely not used for anything, but the left/right have
mounting holes for securing the whole enclosure to the base, and
finishing the connection to where the monitor is mounted

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-17 16:19:06 -05:00
b826ecaccf create a panel with three aux buttons in a tight cluster
the idea of this is to have Select, Home, and Start buttons accessible
via this panel away from the action panels, and the action pannels have
the L3, TP, and R3 buttons in the Sega 2P 11 layout, and then there is
no need for buttons on the back of the q2009 enclosure. I don't think
this would get used for any reason other than q2009 so it lives there.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-15 09:05:31 -05:00
0cdd0ae846 break out the angled dir_arc + W decorative plate
there's a decorative plate angled plate that includes the sega 2P + 1
buttons and dir_arc + W buttons as separate pieces in the same model.
this is a historical artifact that I will fix at some point, but for now
at least, here is the dir_arc + W split out

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-15 09:03:47 -05:00
504dab935c create a Sega 2P-based 11 button layout
this allows for the traditional 8 buttons plus L3, R3, and TP, all on
one hand. I'm going to use this for the q2009 stuff, especially, but it
might be an interesting option for all arcade sticks

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-09-15 09:00:44 -05:00
0de2505de2 q2009 specific extended side with a flush back
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-08-21 13:19:02 -05:00
fd2193cc5a rename extended side piece to fit front/back naming idiom
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-08-19 12:17:46 -05:00
766fbf2883 add a horizontal interconnect for extending a stick vertically
for purposes of creating one large item in the arcade base

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-08-16 08:39:34 -05:00
7a03a1e38e create panels that can bolt to a arcade frame base
still working out all the kinks of this, but this would be something
that is part of a larger enclosure that is secured to a particular
vendor's pedestal

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-08-15 08:23:54 -05:00
1083492ef8 tweak the wall stripes to be thinner and fit 6
why 6? just Sega Reasons

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-25 09:07:12 -05:00
765ef689c5 rectangle dec. plate for a particular NES-ish stick style
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-24 11:38:02 -05:00
055b103abd parameterize some button layout positions
I need to refer to the math of these in laying out some panels, so best
to just parameterize it in case I fiddle with stuff in the future

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-16 14:35:53 -05:00
6ad801b8b2 use frame pieces for both sides of the all together demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-16 14:20:50 -05:00
875513a3d3 add a dir_arc + W 30mm inset panel, since I already have the layout
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-15 07:26:46 -05:00
7e67c15c13 updates for v4.4.3
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-14 23:21:44 -05:00
e426e15884 retain a bit of the inner wall on the outer piece for windowed pieces
the inner wall piece being the *whole* inner wall of the frame side
meant that the (now relatively thin) outer wall piece was not supported
by anything on the top and bottom, which combined with the already weak
piece because of the window, gave the edges a lot of give.

shrinking the inner wall piece slightly retains some of the material on
the outer piece, which should friction fit the top and bottom with both
the inner wall piece, and with the panels, leading to a lot more clamp
when everything is secured.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-14 09:28:10 -05:00
ba3e77d0cd explain more about printing the parts, esp. patterns
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-13 23:41:12 -05:00
c0ae73b139 link to the IRC channel in the README
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-13 23:40:04 -05:00
b871963cf7 backslash and forwardslash front/back window pieces for extended
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-12 08:30:25 -05:00
2c62c9119b cut a bit more out of windowed frame walls, make inner wall larger
this makes the inner wall a bit easier to see, without hugely
compromising outer wall integrity

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-12 08:19:38 -05:00
b7910cdb44 add some windowed frame pieces to go with extended sides
also a demo for them, though I didn't add the inside walls to the demo

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-12 08:19:33 -05:00
0ac3e8433f properly name the horiz. stripe windowed frame pieces
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-10 13:16:47 -05:00
2bbf69d9a0 properly name the extended (not to bottom) side frame piece
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-10 11:12:36 -05:00
53 changed files with 801 additions and 112 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
build/ build/
*.stl
*.sw* *.sw*

View File

@@ -2,6 +2,49 @@
Included is a summary of changes to the project, by version. Details can be found in the commit history. Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.5.0
### Features
* Many components for the Buildable Stick System - Arcade Edition --- pieces to create a control enclosure for the Qanba
2009 base! These pieces live in `extras/bss-ae/` but do use some parts from the base project; check that subdir's
README.
* Created a Sega 2P 11 button layout, basically following the curve of the fourth column and adding a fifth, plus one
extra button
* More decorative plates, this time square ones for an NES-styled project.
### Improvements
* Button layout positions for Sega 2P and directional arc layouts have been parameterized.
* The decorative plates for the directional arc + W and Sega 2P 9 layout have been split into two files, since there was
no reason to keep them as one with multiple pieces anymore.
* Tweaks to the horizontal stripes in order to get them to print better.
* Renamed "Sega 2P plus one" to Sega 2P 9, following the pattern of the 11 layout.
### Miscellaneous
* Renaming of extended side pieces to fit the front/back idiom.
* Cleanups to the demos.
## v4.4.3
### Features
* Windowed frame wall pieces were made for the "clean" front/back walls that line up with the extended sides.
### Improvements
* The inner wall piece has been thickened, bringing its surface closer to the end of the outer wall windowed frame
pieces, making the window less deep and the inner wall easier to see.
* The inner wall piece has been shrunken on the Z in order to leave some material on the outer wall and thus improve the
friction fit and clamp of the outer wall piece, which was too weakened by the unsupported top and bottom otherwise.
### Miscellaneous
* Documentation updates, especially around the printing of parts.
* Corrected the names of some pieces that were accidentally duplicated from the file they were copied from rather than
what they were, or otherwise didn't match the standard pattern (such as it is).
## v4.4.2 ## v4.4.2
### Bugfixes ### Bugfixes

View File

@@ -7,6 +7,9 @@ design before sending it to a custom builder? Do you just love having your space
because you keep making different variants, colorways, and so on? Or do you simply want a good stick on the cheap, and because you keep making different variants, colorways, and so on? Or do you simply want a good stick on the cheap, and
know someone or a library with a 3D printer? The Buildable Stick System may be the project for you! know someone or a library with a 3D printer? The Buildable Stick System may be the project for you!
**Join the project IRC channel: [#buildable-stick-system @
Randomus](https://webirc.randomus.net/#buildable-stick-system)!**
![An example of stick components displayed in OpenSCAD](docs/blown-up-demo.png) ![An example of stick components displayed in OpenSCAD](docs/blown-up-demo.png)
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.] [OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]

View File

@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/extended/front-or-back.scad>
use <frames/pieces/extended/side.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-windowed-horiz-stripes.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#8E9089";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_control_panel_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) extended_left_or_right_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) extended_left_or_right_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) horiz_striped_windowed_front_or_back_box_frame_piece_for_extended_side();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) horiz_striped_windowed_front_or_back_box_frame_piece_for_extended_side();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate_of_plates(); */
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -6,13 +6,12 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/extended/front-or-back.scad> use <frames/pieces/extended/front-or-back.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad> use <frames/pieces/extended/side-extended-to-front.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad> use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad> use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-plus-one-plus-control-panel-with-mount.scad> use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad> use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad> use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
use <misc/dustwasher-lsx-nobi.scad> use <misc/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579"; top_panel_color = "#5B6579";
@@ -22,7 +21,7 @@ frame_side_color = "#8E9089";
top_deco_color = "#8E9089"; top_deco_color = "#8E9089";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel(); color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount(); color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_control_panel_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) extra_extended_left_or_right_frame_piece(); color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) extra_extended_left_or_right_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece(); color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) extended_front_or_back_frame_piece(); color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) extended_front_or_back_frame_piece();
@@ -32,7 +31,6 @@ color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel(); color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel(); color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */ color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher(); color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate(); color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/extended/front-or-back.scad> use <frames/pieces/extended/front-or-back.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad> use <frames/pieces/extended/side-extended-to-front.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad> use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad> use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/lever-and-sega-2p-6-button-panel-with-aux-with-mount.scad> use <panels/inset/lever-and-sega-2p-6-button-panel-with-aux-with-mount.scad>

View File

@@ -5,15 +5,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad> use <frames/pieces/box/side.scad>
use <frames/pieces/box/front-or-back.scad> use <frames/pieces/box/front-or-back.scad>
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad> use <frames/pieces/box/front-or-back-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad> use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-plus-one-plus-control-panel-with-mount.scad> use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad> use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad> use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
use <misc/dustwasher-lsx-nobi.scad> use <misc/dustwasher-lsx-nobi.scad>
panel_color = "red"; panel_color = "red";
@@ -21,15 +19,16 @@ base_color = "gray";
top_deco_color = "white"; top_deco_color = "white";
color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel(); color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount(); color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_control_panel_with_mount();
color(base_color) translate([-frame_x/2+5, 0, -2.5]) left_frame();
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([0, 180, 0]) side_box_frame_piece(); color(base_color) translate([panel_x/2, 0, -2.5]) rotate([0, 180, 0]) side_box_frame_piece();
color(base_color) translate([-panel_x/2, 0, -2.5]) side_box_frame_piece();
color(base_color) translate([panel_x/2, 0, -2.5]) front_or_back_box_frame_piece(); color(base_color) translate([panel_x/2, 0, -2.5]) front_or_back_box_frame_piece();
color(base_color) translate([-panel_x/2, 0, -2.5]) front_or_back_box_frame_piece();
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece(); color(base_color) translate([panel_x/2, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece();
color(base_color) translate([-panel_x/2, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece();
color(base_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel(); color(base_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(base_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel(); color(base_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */ color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher(); color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate(); color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -10,14 +10,14 @@ use <frames/pieces/box/side.scad>
use <frames/pieces/box/front-or-back.scad> use <frames/pieces/box/front-or-back.scad>
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad> use <frames/pieces/box/front-or-back-aux-and-neutrik.scad>
use <panels/overhang/left-lever-and-dir_arc-plus-w-30mm-panel.scad> use <panels/overhang/left-lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/overhang/right-sega-2p-plus-one-plus-control-panel-with-mount.scad> use <panels/overhang/right-sega-2p-nine-plus-control-panel-with-mount.scad>
use <panels/overhang/left-or-right-panel.scad> use <panels/overhang/left-or-right-panel.scad>
use <misc/decorative-plate-24mm-button.scad> use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad> use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad> use <misc/dustwasher-lsx-nobi.scad>
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) lever_and_dir_arc_w_30mm_left_overhang_panel(); color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) lever_and_dir_arc_w_30mm_left_overhang_panel();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_plus_one_plus_control_right_overhang_panel_with_mount(); color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_nine_plus_control_right_overhang_panel_with_mount();
color("black") translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece(); color("black") translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece(); color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece(); color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece();
@@ -29,6 +29,6 @@ color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_ov
color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) rotate([0, 0, 180]) color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) rotate([0, 0, 180])
left_or_right_overhang_panel(); left_or_right_overhang_panel();
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate(); color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher(); color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();
color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate(); color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();

View File

@@ -8,6 +8,15 @@ My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives
strength against bowing forces, but something more default, like 2 wall loops, 15% grid sparse infill, is fine and does strength against bowing forces, but something more default, like 2 wall loops, 15% grid sparse infill, is fine and does
not lead to a weak enclosure. not lead to a weak enclosure.
### Supports and Positioning
All of the parts are designed to be printed outside-face-down. The bevels are at an angle (45 degrees) that should print
fine with no supports. Make sure everything is aligned properly on your plate so that the flat face you will look at the
most is on the bottom.
The only exception to this is the interconnect piece(s), which are not visible and need a support to print. Maybe one
day I'll rejigger these.
### Working With Flatness ### Working With Flatness
A lot of the pieces are long and flat, so I recommend really dialing in your printer settings. The frame pieces make A lot of the pieces are long and flat, so I recommend really dialing in your printer settings. The frame pieces make
@@ -20,15 +29,36 @@ uniform lines that create reflection patterns on long, flat surfaces. This can b
panels and their decorative plates, since they're what you're looking at 90% of the time, and the holes break up a panels and their decorative plates, since they're what you're looking at 90% of the time, and the holes break up a
perfect pattern, making the long lines stand out even more. perfect pattern, making the long lines stand out even more.
* **Top panels:** using a non-uniform pattern reduces if not eliminates the problem of the surface catching the light, Some specific parts are worth some additional notes:
but for some patterns, it may come at the expense of time. Other patterns may improve beyond monotonic, but hilbert
curve seems to be the gold standard.
* **Circle-centric decorative plates:** don't use complex patterns like Archimedean chords on decorative plates, as they
seem to have issues with filling curves and you still want to try to maximize contact with walls. Concentric is great
here if you dial it in.
The concentric pattern is a good default and prints awesome parts, with the only exception being the top panels, which * **Top panels:** using a non-uniform pattern reduces if not eliminates the problem of the surface catching the light,
benefit from using a Hilbert curve initial layer pattern instead of concentric. but for some patterns, it may come at the expense of time.
* **Avoid:** monotonic.
* **Good for the time:** Archimedean chords create the look of a circular ripple radiating out the center, and
depending on the material, you may not even notice it much, so it's a pretty good look/speed balance.
* **Great if you can wait:** hilbert curve leaves no discernable pattern on most materials, but some high gloss,
high contrast materials may show the winding pattern at some angles --- consider Archimedean chords for these.
* **Circle-centric decorative plates:** simple ones could be fine in whatever, but the ones for action buttons end up
having lots of weird interaction points.
* **Avoid:** none; monotonic doesn't look *good*, but the plates don't have enough surface area for the pattern to
stand out too much.
* **Decent:** concentric is generally good, but you can get some pitting when the pattern radiating away from
buttons collides with other patterns, because none of the geometry lines up well.
* **Great:** Archimedean chords, just crank up the infill/wall overlap to avoid pits on the edges.
* **Frame walls with Neutrik or aux button cutouts:** a reduced but similar problem with the action button decorative
plates, the circles near each other create weird interactions with the walls.
* **Avoid:** concentric, again, has problems with pitting where geometries clash.
* **Decent:** monotonic is pretty decent here, and you probably won't look at the sides too much, so maybe it
doesn't bother you.
* **Great:** Archimedean chords again, with the same infill/wall overlap as decorative plates.
* **Flush frame walls:** you can pretty much do whatever you like here.
* **Great:** concentric produces an interesting pattern and you won't have collision problems in a rectangle.
* **Essentially great:** Archimedean chords yet again, you may just not like the pattern as much as the end result
of concentric.
The Archimedean chord pattern is a good default and prints awesome parts, with the only exception being the top panels,
which benefit from using a Hilbert curve initial layer pattern instead, though you may be happy enough with Archimedean
chord.
## Materials ## Materials

View File

@@ -11,6 +11,10 @@ module m4_hole_countersink() {
cylinder(r1=m4_bolt_radius, r2=m4_bolt_countersink_radius, h=3.2, $fn=50, center=true); cylinder(r1=m4_bolt_radius, r2=m4_bolt_countersink_radius, h=3.2, $fn=50, center=true);
} }
module m6_hole() {
cylinder(r=m6_bolt_radius, h=100, $fn=50, center=true);
}
module panel_holes() { module panel_holes() {
// holes for mount bolts // holes for mount bolts
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) m4_hole(); translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) m4_hole();
@@ -90,6 +94,12 @@ module aux_control_three_button_cluster() {
translate([37, 0, 0]) button_24mm_hole(); translate([37, 0, 0]) button_24mm_hole();
} }
module aux_control_three_button_tight_cluster() {
translate([-32, 0, 0]) button_24mm_hole();
translate([0, 0, 0]) button_24mm_hole();
translate([32, 0, 0]) button_24mm_hole();
}
module m2_mount_post() { module m2_mount_post() {
difference() { difference() {
cylinder(r=m2_screw_selftap_radius*2.25, h=3, $fn=6, center=true); cylinder(r=m2_screw_selftap_radius*2.25, h=3, $fn=6, center=true);
@@ -396,24 +406,24 @@ module dir_arc_plus_w_24mm_8_button() {
module dir_arc_30mm_thumb_button() { module dir_arc_30mm_thumb_button() {
// just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored) // just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored)
translate([(panel_x/2)-28.06, (-panel_y/2)+62, 0]) button_30mm_hole(); translate([(panel_x/2)-sega_2p_column_1_left_panel_edge_offset, (-panel_y/2)+62, 0]) button_30mm_hole();
} }
module dir_arc_30mm_finger_buttons() { module dir_arc_30mm_finger_buttons() {
translate([0, 57.2, 0]) dir_arc_30mm_thumb_button(); translate([0, dir_arc_30mm_row_2_offset, 0]) dir_arc_30mm_thumb_button();
translate([-33.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button(); translate([-dir_arc_30mm_column_2_offset, dir_arc_30mm_row_3_offset, 0]) dir_arc_30mm_thumb_button();
translate([-33.8-34.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button(); translate([-dir_arc_30mm_column_3_offset, dir_arc_30mm_row_3_offset, 0]) dir_arc_30mm_thumb_button();
} }
module dir_arc_w_30mm() { module dir_arc_w_30mm() {
dir_arc_30mm_thumb_button(); dir_arc_30mm_thumb_button();
dir_arc_30mm_finger_buttons(); dir_arc_30mm_finger_buttons();
translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button(); translate([-26.8, dir_arc_w_30mm_row_4_offset, 0]) dir_arc_30mm_thumb_button();
} }
module dir_arc_w_30mm_plus_one() { module dir_arc_w_30mm_plus_one() {
dir_arc_w_30mm(); dir_arc_w_30mm();
translate([-33.8-34.8-33.8, 57.2, 0]) dir_arc_30mm_thumb_button(); translate([-dir_arc_30mm_column_3_offset-33.8, dir_arc_30mm_row_2_offset, 0]) dir_arc_30mm_thumb_button();
} }
// Namco Noir (right hand) // Namco Noir (right hand)
@@ -440,31 +450,38 @@ module noir_plus_one() {
// Sega Astro City 2P (right hand) // Sega Astro City 2P (right hand)
module sega_2p_p1() { module sega_2p_p1() {
translate([-panel_x/2, -panel_y/2, 0]) translate([28.06, 140, 0]) button_30mm_hole(); translate([-panel_x/2, -panel_y/2, 0]) translate([sega_2p_column_1_left_panel_edge_offset, 140, 0])
button_30mm_hole();
} }
module sega_2p_6_button() { module sega_2p_6_button() {
// via slagcoin // via slagcoin
sega_2p_p1(); sega_2p_p1();
translate([30.5, 11+9, 0]) sega_2p_p1(); translate([sega_2p_column_2_offset, 11+9, 0]) sega_2p_p1();
translate([30.5+36, 11+9, 0]) sega_2p_p1(); translate([sega_2p_column_3_offset, 11+9, 0]) sega_2p_p1();
translate([0, -19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11, 0]) sega_2p_p1();
translate([30.5, -19, 0]) sega_2p_p1(); translate([sega_2p_column_2_offset, -19, 0]) sega_2p_p1();
translate([30.5+36, -19, 0]) sega_2p_p1(); translate([sega_2p_column_3_offset, -19, 0]) sega_2p_p1();
} }
module sega_2p() { module sega_2p() {
sega_2p_6_button(); sega_2p_6_button();
translate([30.5+36+36, 11, 0]) sega_2p_p1(); translate([sega_2p_column_4_offset, 11, 0]) sega_2p_p1();
translate([30.5+36+36, -19-9, 0]) sega_2p_p1(); translate([sega_2p_column_4_offset, -19-9, 0]) sega_2p_p1();
} }
module sega_2p_plus_one() { module sega_2p_nine() {
sega_2p(); sega_2p();
// just my guesstimate on this one // just my guesstimate on this one
translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1();
} }
module sega_2p_eleven() {
sega_2p_nine();
translate([sega_2p_column_5_offset, 0, 0]) sega_2p_p1();
translate([sega_2p_column_5_offset, -19-9-11, 0]) sega_2p_p1();
}
module shiokenstar() { module shiokenstar() {
translate([-172, 32, 0]) dir_arc_24mm_directionals(); translate([-172, 32, 0]) dir_arc_24mm_directionals();
sega_2p(); sega_2p();

View File

@@ -0,0 +1,38 @@
# BSS Arcade Edition
Pieces for mounting to a Qanba 2009 in order to create the Buildable Stick System - Arcade Edition.
## Pieces
* 4 `interconnect-x` --- creating the internal support for joining two rows of panels
* 6 `frames/pieces/interconnect` --- (core project) the standard piece for joining two+ columns of panels
* 4 `extended-side-no-back` --- the extended side pieces, flush on the back to connect to each other
* 4 `frames/pieces/extended/front-or-back` --- (core project) the front extended piece
* 2 `extended-back` --- a small piece that fits into the Qanba 2009 "lip" for running cables
* 1 `extended-back-left-mount`
* 1 `extended-back-right-mount` --- extended back pieces that can be mounted to the Qanba 2009 base
* 1 `panel-front-left-mount`
* 1 `panel-front-right-mount` --- blank panels that can be mounted to the Qanba 2009 base
* 6 `panels/inset/panel` --- the rest of the bottom panels
* 4 `panels/inset/` panels of your choice for the front controls
* 2 `panel-three-aux-buttons` --- for aux controls in the back row
* 2 `panel-three-aux-buttons-and-rocker-hole` --- for aux controls and the wired rocker in the back row
* 4 `decorative-plate-aux-control-tight-three-button-cluster` --- for decorating the aux control clusters
* 4 `src/misc/` decorative plates of your choice for the front controls, and similar miscellany
* 4 `mount-spacer` --- making a flush mount between the enclosure and the base
## Hardware
* 32 45mm M4 hex brass standoffs (or equivalent) for each panel/frame compartment
* 64 8-12mm M4 countersunk hex bolts for attaching panels to the compartments
* 4 8-12mm M3 hex bolts and 4 M3 flange nuts for attaching rocker switches to the back panels
* 4 40mm M6 bolts for connecting the enclosure to the base
* 4 M6 flange nuts
## Components
* 2 controller boards, e.g. the RP2040 Advanced Breakout Board
* buttons and/or levers as desired
* necessary wiring
For the rest of the build (e.g. mounting a level to a panel), see the core README.

View File

@@ -0,0 +1,24 @@
/* Decorative plate for aux buttons.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module aux_control_three_button_tight_cluster_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -25]) hull() aux_control_three_button_tight_cluster();
// keep a thin slice
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([0, 0, -1]) aux_control_three_button_tight_cluster();
}
}
aux_control_three_button_tight_cluster_decorative_plate();

View File

@@ -0,0 +1,26 @@
/* A back piece of the enclosure, with a mounting hole.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <extended-back.scad>
// X: inner post to post (inclusive) is approx. 428.625mm, so half that, minus half the post itself
// (41.28mm) is how much in from a normal panel to put the M6 mounting hole
// Y: eyeballed it to 30mm
mount_hole_x = (panel_x / 2) - (panel_x - ((428.625 / 2) - (41.28 / 2)));
mount_hole_y = (panel_y / 2) + 30;
module left_mount_extended_back() {
difference() {
extended_back();
translate([mount_hole_x, -mount_hole_y, -30]) m6_hole();
// punch out the back for cables
cube([frame_x-70, frame_y+160, frame_z-20], center=true);
}
}
left_mount_extended_back();

View File

@@ -0,0 +1,15 @@
/* A back piece of the enclosure, with a mounting hole.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <extended-back-left-mount.scad>
module right_mount_extended_back() {
mirror([1, 0, 0]) left_mount_extended_back();
}
right_mount_extended_back();

View File

@@ -0,0 +1,30 @@
/* A back piece extended the rest of the depth of the base.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/extended/front-or-back.scad>
module back_piece_extension() {
// combine the original wall with a copy to "pull" the wall out
hull() {
linear_extrude(height=80) bottom_piece_wall();
linear_extrude(height=(frame_wall-frame_bevel_height)) bottom_piece_wall();
}
}
module extended_back() {
difference() {
union() {
clean_front_or_back();
translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) back_piece_extension();
}
cube([frame_x-60, frame_y+160-10, frame_z-10], center=true);
translate([0, -frame_y/2-35, 0]) cube([frame_x-20, 70, frame_z-10], center=true);
}
}
extended_back();

View File

@@ -0,0 +1,60 @@
/* Create an extended side that is flush on the back to lay against another side.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad>
use <frames/pieces/extended/front-or-back.scad>
module side_frame_piece_wall() {
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
// not creating a clean thing to cut, so we just take the whole wall and use that
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
left_frame();
}
module side_and_bottom_frame_piece_wall() {
// get a slice of the pieces, to use it in extruding
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
// not creating a clean thing to cut, so we just take the whole wall and use that
side_frame_piece_wall();
projection(cut=true) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
}
module side_and_bottom_frame_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([0.5, 0.90, 1]) side_and_bottom_frame_piece_wall();
linear_extrude(height=frame_extension_y) scale([0.5, 1, 1])
difference() {
side_frame_piece_wall();
// remove the front piece so it doesn't interfere with the front extend
translate([0, -frame_y/2, 0]) square([frame_x, frame_y], center=true);
}
linear_extrude(height=frame_bevel_height) side_and_bottom_frame_piece_wall();
}
}
module extra_extended_left_or_right_frame_piece() {
difference() {
union() {
difference() {
side_box_frame_piece();
// chop off the old edge which is getting replaced with the extension
translate([-frame_x/2+frame_bevel_height/2, 0, 0])
cube([frame_bevel_height, frame_y, frame_z], center=true);
}
translate([-frame_x/2+frame_bevel_height*2, 0, 0])
rotate([0, -90, 0]) side_and_bottom_frame_piece_extension();
}
// minus the back piece where the wall would be, since there is no wall and the pieces and panels
// go flush against one another
translate([0, frame_y/2-(frame_wall/2), 0]) cube([frame_x*2, frame_wall, frame_z], center=true);
}
}
extra_extended_left_or_right_frame_piece();

View File

@@ -0,0 +1,30 @@
/* Interconnect frames along the x-axis (the longer side)
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back.scad>
module interconnect_frame_half_piece() {
translate([0, frame_y/2-frame_wall, 0]) difference() {
front_or_back_box_frame_piece();
translate([0, (-frame_y+frame_wall)/2-panel_overhang_amount, 0])
cube([overhang_panel_x, frame_wall+panel_overhang_amount*2, frame_z], center=true);
}
}
module interconnect_frame_piece() {
difference() {
union() {
// slight translate is to make this a 2-manifold in OpenSCAD
translate([0, -0.01, 0]) interconnect_frame_half_piece();
mirror([0, 1, 0]) interconnect_frame_half_piece();
}
rotate([0, 0, 90]) translate([-frame_y/2, 0, 0]) frame_cable_routing_hole();
}
}
interconnect_frame_piece();

View File

@@ -0,0 +1,17 @@
/* Just a simple washer to go between the frame post and the arcade enclosure.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module mount_spacer() {
difference() {
cylinder(r=25, h=1.25, $fn=50, center=true);
m6_hole();
}
}
mount_spacer();

View File

@@ -0,0 +1,24 @@
/* A panel with a mount point for the front left of the enclosure.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <panels/inset/panel.scad>
// X: inner post to post (inclusive) is approx. 428.625mm, so half that, minus half the post itself
// (41.28mm) is how much in from a normal panel to put the M6 mounting hole
// Y: eyeballed it to 2": 50.80mm
mount_hole_x = (panel_x / 2) - (panel_x - ((428.625 / 2) - (41.28 / 2)));
mount_hole_y = (panel_y / 2) - 50.80;
module front_left_mount_panel() {
difference() {
panel();
translate([-mount_hole_x, -mount_hole_y, 0]) m6_hole();
}
}
front_left_mount_panel();

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <panel-front-left-mount.scad>
module front_right_mount_panel() {
mirror([1, 0, 0]) front_left_mount_panel();
}
front_right_mount_panel();

View File

@@ -0,0 +1,18 @@
/* A panel for mounting a couple aux buttons in a out of the way spot.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module three_aux_button_and_20mm_panel() {
difference() {
panel();
translate([0, -70, 0]) aux_control_three_button_tight_cluster();
translate([0, frame_y/2-30, 0]) rotate([180, 0, 0]) neutrik_d_mount();
}
}
three_aux_button_and_20mm_panel();

View File

@@ -0,0 +1,17 @@
/* A panel for mounting a couple aux buttons in a out of the way spot.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module three_aux_button_panel() {
difference() {
panel();
translate([0, -70, 0]) aux_control_three_button_tight_cluster();
}
}
three_aux_button_panel();

View File

@@ -15,9 +15,10 @@ module mount_column_cutout() {
} }
} }
module front_or_back_inner_wall_frame_piece() { module front_or_back_inner_wall_frame_base_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); // Z is scaled so that some part of the original part inner wall is retained
scale([1, 1, inner_frame_z_decorative_scale]) front_or_back_box_frame_piece();
// minus the outer wall // minus the outer wall
translate([0, -(frame_y-frame_wall)/2, 0]) cube([frame_x, frame_wall, frame_z], center=true); translate([0, -(frame_y-frame_wall)/2, 0]) cube([frame_x, frame_wall, frame_z], center=true);
// minus half of the mounting posts (the other half provided by the outer wall) // minus half of the mounting posts (the other half provided by the outer wall)
@@ -28,4 +29,11 @@ module front_or_back_inner_wall_frame_piece() {
} }
} }
module front_or_back_inner_wall_frame_piece() {
front_or_back_inner_wall_frame_base_piece();
// extend the outward face 2mm in order to have it cut deeper into the frame outer wall
translate([0, -(frame_y-frame_wall)/2, 0]) rotate([-90, 0, 0]) linear_extrude(height=2) projection()
translate([0, 0, 50]) rotate([90, 0, 0]) front_or_back_inner_wall_frame_base_piece();
}
front_or_back_inner_wall_frame_piece(); front_or_back_inner_wall_frame_piece();

View File

@@ -9,10 +9,10 @@ use <front-or-back.scad>
use <front-or-back-inner-wall.scad> use <front-or-back-inner-wall.scad>
module front_stripe() { module front_stripe() {
cube([frame_x-(frame_mount_column_width*1.75)*2, frame_wall, 6], center=true); cube([frame_x-(frame_mount_column_width*1.75)*2, frame_wall, 5], center=true);
} }
module windowed_front_or_back_box_frame_piece() { module horiz_striped_windowed_front_or_back_box_frame_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); front_or_back_box_frame_piece();
// subtract frame wall windows // subtract frame wall windows
@@ -26,4 +26,4 @@ module windowed_front_or_back_box_frame_piece() {
} }
} }
windowed_front_or_back_box_frame_piece(); horiz_striped_windowed_front_or_back_box_frame_piece();

View File

@@ -8,13 +8,17 @@ include <components.scad>
use <front-or-back.scad> use <front-or-back.scad>
use <front-or-back-inner-wall.scad> use <front-or-back-inner-wall.scad>
module front_or_back_window() {
translate([0, -frame_y/2, 0])
cube([frame_x-frame_mount_column_width*3.5, (frame_wall+panel_support_width)*2,
frame_z-panel_z*3], center=true);
}
module windowed_front_or_back_box_frame_piece() { module windowed_front_or_back_box_frame_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); front_or_back_box_frame_piece();
// subtract frame wall window // subtract frame wall window
translate([0, -frame_y/2, 0]) front_or_back_window();
cube([frame_x-frame_mount_column_width*3.5, (frame_wall+panel_support_width)*2,
frame_z-panel_z*3], center=true);
// subtract the inner wall area that will be provided by the other piece // subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece(); front_or_back_inner_wall_frame_piece();
} }

View File

@@ -15,9 +15,10 @@ module mount_column_cutout() {
} }
} }
module side_inner_wall_frame_piece() { module side_inner_wall_frame_base_piece() {
difference() { difference() {
side_box_frame_piece(); // Z is scaled so that some part of the original part inner wall is retained
scale([1, 1, inner_frame_z_decorative_scale]) side_box_frame_piece();
// minus the outer wall // minus the outer wall
translate([-(frame_x-frame_wall)/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true); translate([-(frame_x-frame_wall)/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
// minus half of the mounting posts (the other half provided by the outer wall) // minus half of the mounting posts (the other half provided by the outer wall)
@@ -32,4 +33,11 @@ module side_inner_wall_frame_piece() {
} }
} }
module side_inner_wall_frame_piece() {
side_inner_wall_frame_base_piece();
// extend the outward face 2mm in order to have it cut deeper into the frame outer wall
translate([-(frame_x-frame_wall)/2, 0, 0]) rotate([0, 90, 0]) linear_extrude(height=2) projection()
translate([0, 0, 50]) rotate([0, -90, 0]) side_inner_wall_frame_base_piece();
}
side_inner_wall_frame_piece(); side_inner_wall_frame_piece();

View File

@@ -9,10 +9,10 @@ use <side.scad>
use <side-inner-wall.scad> use <side-inner-wall.scad>
module side_stripe() { module side_stripe() {
cube([frame_wall, frame_y-(frame_mount_column_width*1.75)*2, 6], center=true); cube([frame_wall, frame_y-(frame_mount_column_width*1.75)*2, 5], center=true);
} }
module windowed_side_box_frame_piece() { module horiz_striped_windowed_side_box_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_box_frame_piece();
// subtract frame wall windows // subtract frame wall windows
@@ -26,4 +26,4 @@ module windowed_side_box_frame_piece() {
} }
} }
windowed_side_box_frame_piece(); horiz_striped_windowed_side_box_frame_piece();

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back-windowed-backslashes.scad>
module backslashes_windowed_front_or_back_box_frame_piece_for_extended_side() {
difference() {
backslashes_windowed_front_or_back_box_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
backslashes_windowed_front_or_back_box_frame_piece_for_extended_side();

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back-windowed-forwardslashes.scad>
module forwardslashes_windowed_front_or_back_box_frame_piece_for_extended_side() {
difference() {
forwardslashes_windowed_front_or_back_box_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
forwardslashes_windowed_front_or_back_box_frame_piece_for_extended_side();

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back-windowed-horiz-stripes.scad>
module horiz_striped_windowed_front_or_back_box_frame_piece_for_extended_side() {
difference() {
horiz_striped_windowed_front_or_back_box_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
horiz_striped_windowed_front_or_back_box_frame_piece_for_extended_side();

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back-windowed.scad>
module windowed_front_or_back_box_frame_piece_for_extended_side() {
difference() {
windowed_front_or_back_box_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
windowed_front_or_back_box_frame_piece_for_extended_side();

View File

@@ -25,7 +25,7 @@ module side_frame_piece_extension() {
} }
} }
module extended_bottom_left_or_right_frame_piece() { module extended_left_or_right_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_box_frame_piece();
// chop off the old edge which is getting replaced with the extension // chop off the old edge which is getting replaced with the extension
@@ -34,4 +34,4 @@ module extended_bottom_left_or_right_frame_piece() {
translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension(); translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension();
} }
extended_bottom_left_or_right_frame_piece(); extended_left_or_right_frame_piece();

View File

@@ -0,0 +1,36 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate_of_plates() {
difference() {
// layout offset + 30 = width for layout plus button width + 12+3 = space around button
left_plate_x = dir_arc_30mm_column_3_offset + 30 + 12;
// layout offset + 30 = width for layout plus button width + 12+3 = space around button
left_plate_y = dir_arc_w_30mm_row_4_offset + 30 + 12;
left_plate_center_x = (left_plate_x + sega_2p_column_1_left_panel_edge_offset - 15)/2;
// layout offset + 30 = width for layout plus button width + 12+3 = space around button
right_plate_x = sega_2p_column_4_offset + 30 + 12;
right_plate_center_x = (right_plate_x + sega_2p_column_1_left_panel_edge_offset - 15)/2;
union() {
// y values are based on the other half below
translate([right_plate_center_x, 15, 0]) linear_extrude(2) offset(r=3, $fn=50)
square([right_plate_x, left_plate_y], center=true);
translate([-left_plate_center_x, 15, 0]) linear_extrude(2) offset(r=3, $fn=50)
square([left_plate_x, left_plate_y], center=true);
/* translate([-50, 0, 0]) cube([200, 200, 2], center=true); */
}
// cut out the normal holes
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
translate([panel_x/2, 0, -1]) sega_2p_nine();
}
}
dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate_of_plates();

View File

@@ -6,19 +6,19 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() { module dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate() {
difference() { difference() {
// get a 2mm slice of the bigger button cylinders // get a 2mm slice of the bigger button cylinders
union() { union() {
translate([-panel_x/2, 0, -65]) dir_arc_w_30mm(); translate([-panel_x/2, 0, -65]) dir_arc_w_30mm();
translate([panel_x/2, 0, -65]) sega_2p_plus_one(); translate([panel_x/2, 0, -65]) sega_2p_nine();
} }
translate([0, 0, -100]) cube([500, 500, 198], center=true); translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true); translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes // cut out the normal holes
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm(); translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
translate([panel_x/2, 0, -1]) sega_2p_plus_one(); translate([panel_x/2, 0, -1]) sega_2p_nine();
} }
} }
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate(); dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();

View File

@@ -1,4 +1,5 @@
/* /* Decorative plate for directional buttons.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org> * SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -8,19 +9,15 @@ decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0; jumbo_decorative_radius_scale = 0;
include <components.scad> include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates() { module dir_arc_plus_w_30mm_plate_decorative_plate() {
difference() { difference() {
// get a 2mm slice of the bigger button cylinders // get a 2mm slice of the bigger button cylinders
union() { translate([-panel_x/2, 0, -25]) hull() dir_arc_w_30mm();
translate([-panel_x/2, 0, -25]) hull() dir_arc_w_30mm();
translate([panel_x/2, 0, -25]) hull() sega_2p_plus_one();
}
translate([0, 0, -100]) cube([500, 500, 198], center=true); translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true); translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes // cut out the normal holes
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm(); translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
translate([panel_x/2, 0, -1]) sega_2p_plus_one();
} }
} }
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); dir_arc_plus_w_30mm_plate_decorative_plate();

View File

@@ -0,0 +1,23 @@
/* Decorative plate for directional buttons.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module sega_2p_eleven_plate_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([panel_x/2, 0, -25]) hull() sega_2p_eleven();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([panel_x/2, 0, -1]) sega_2p_eleven();
}
}
sega_2p_eleven_plate_decorative_plate();

View File

@@ -0,0 +1,25 @@
/* A rounded corner decorative plate for the Sega 2P + 1 button layout.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module sega_2p_nine_decorative_plate_of_plates() {
difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([panel_x/2, 0, -25]) hull() sega_2p_nine();
}
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([panel_x/2, 0, -1]) sega_2p_nine();
}
}
sega_2p_nine_decorative_plate_of_plates();

View File

@@ -6,15 +6,15 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module sega_2p_plus_one_decorative_plate() { module sega_2p_nine_decorative_plate() {
difference() { difference() {
// get a 2mm slice of the bigger button cylinders // get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_plus_one(); translate([0, 0, -55]) sega_2p_nine();
translate([0, 0, -100]) cube([500, 500, 198], center=true); translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true); translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes // cut out the normal holes
translate([0, 0, -1]) sega_2p_plus_one(); translate([0, 0, -1]) sega_2p_nine();
} }
} }
sega_2p_plus_one_decorative_plate(); sega_2p_nine_decorative_plate();

View File

@@ -6,11 +6,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module sega_2p_plus_one_panel() { module dir_arc_w_30mm_panel() {
difference() { difference() {
panel(); panel();
sega_2p_plus_one(); dir_arc_w_30mm();
} }
} }
sega_2p_plus_one_panel(); dir_arc_w_30mm_panel();

View File

@@ -0,0 +1,16 @@
/* 11-button Sega 2P panel with PCB mount
*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <sega-2p-eleven-panel.scad>
module sega_2p_eleven_panel_with_mount() {
sega_2p_eleven_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_eleven_panel_with_mount();

View File

@@ -0,0 +1,17 @@
/* A panel with the Sega 2P button layout plus three extra buttons for whatever purpose.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module sega_2p_eleven_panel() {
difference() {
panel();
sega_2p_eleven();
}
}
sega_2p_eleven_panel();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module sega_2p_nine_panel() {
difference() {
panel();
sega_2p_nine();
}
}
sega_2p_nine_panel();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <right-sega-2p-plus-one-panel.scad> use <sega-2p-nine-plus-control-panel.scad>
module sega_2p_plus_one_with_mount_right_overhang_panel() { module sega_2p_nine_plus_control_panel_with_mount() {
sega_2p_plus_one_right_overhang_panel(); sega_2p_nine_plus_control_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount(); translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
} }
sega_2p_plus_one_with_mount_right_overhang_panel(); sega_2p_nine_plus_control_panel_with_mount();

View File

@@ -6,13 +6,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module sega_2p_plus_one_plus_control_panel() { module sega_2p_nine_plus_control_panel() {
difference() { difference() {
panel(); panel();
sega_2p_plus_one(); sega_2p_nine();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole(); translate([89, 30, 0]) button_24mm_hole();
} }
} }
sega_2p_plus_one_plus_control_panel(); sega_2p_nine_plus_control_panel();

View File

@@ -5,14 +5,14 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <right-sega-2p-plus-one-plus-control-panel-with-mount.scad> use <right-sega-2p-nine-plus-control-panel-with-mount.scad>
module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled() { module sega_2p_nine_plus_control_right_overhang_panel_with_mount_with_oled() {
difference() { difference() {
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount(); sega_2p_nine_plus_control_right_overhang_panel_with_mount();
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout(); translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
} }
translate([75, 77.5, 0.5]) oled_ssd1306_mount(); translate([75, 77.5, 0.5]) oled_ssd1306_mount();
} }
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled(); sega_2p_nine_plus_control_right_overhang_panel_with_mount_with_oled();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <sega-2p-plus-one-plus-control-panel.scad> use <right-sega-2p-nine-panel.scad>
module sega_2p_plus_one_plus_control_panel_with_mount() { module sega_2p_nine_with_mount_right_overhang_panel() {
sega_2p_plus_one_plus_control_panel(); sega_2p_nine_right_overhang_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount(); translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
} }
sega_2p_plus_one_plus_control_panel_with_mount(); sega_2p_nine_with_mount_right_overhang_panel();

View File

@@ -6,12 +6,12 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module sega_2p_plus_one_right_overhang_panel() { module sega_2p_nine_right_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
sega_2p_plus_one(); sega_2p_nine();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
} }
} }
sega_2p_plus_one_right_overhang_panel(); sega_2p_nine_right_overhang_panel();

View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <right-sega-2p-nine-plus-control-panel.scad>
module sega_2p_nine_plus_control_right_overhang_panel_with_mount() {
sega_2p_nine_plus_control_right_overhang_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_nine_plus_control_right_overhang_panel_with_mount();

View File

@@ -6,13 +6,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module sega_2p_plus_one_plus_control_right_overhang_panel() { module sega_2p_nine_plus_control_right_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
sega_2p_plus_one(); sega_2p_nine();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole(); translate([89, 30, 0]) button_24mm_hole();
} }
} }
sega_2p_plus_one_plus_control_right_overhang_panel(); sega_2p_nine_plus_control_right_overhang_panel();

View File

@@ -1,15 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <right-sega-2p-plus-one-plus-control-panel.scad>
module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount() {
sega_2p_plus_one_plus_control_right_overhang_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();

View File

@@ -17,6 +17,9 @@ m4_bolt_radius = 2 + hole_tolerance;
m4_bolt_countersink_radius = 6.1 + hole_tolerance; m4_bolt_countersink_radius = 6.1 + hole_tolerance;
m4_bolt_hex_exterior_radius = 3.6 + hole_tolerance; m4_bolt_hex_exterior_radius = 3.6 + hole_tolerance;
// M6
m6_bolt_radius = 3 + hole_tolerance;
// 24mm button // 24mm button
small_button_radius = 12 + hole_tolerance; small_button_radius = 12 + hole_tolerance;
@@ -75,6 +78,12 @@ panel_z = 5;
// inside the frame // inside the frame
inner_frame_z = frame_z - (panel_z * 2); inner_frame_z = frame_z - (panel_z * 2);
// "windowed" pieces chop out the inner wall of the frame as a separate piece in order
// to print it a different color/way/style. to improve friction fit, it is only the below
// value scale of the whole wall, so that the rest of the wall is retained on the outer
// piece, which helps clamp the two together (and helps the panels clamp it all)
inner_frame_z_decorative_scale = 0.95;
// how much the top plate x/y is expanded to overhang the frame // how much the top plate x/y is expanded to overhang the frame
// note that this is relative to the top plate (so the wall is added back) // note that this is relative to the top plate (so the wall is added back)
panel_overhang_amount = 8.5; panel_overhang_amount = 8.5;
@@ -99,3 +108,19 @@ jumbo_decorative_radius_scale = 2;
slash_inner_displacement = 10; slash_inner_displacement = 10;
slash_width = 15; slash_width = 15;
slash_height = frame_z-panel_z*3; slash_height = frame_z-panel_z*3;
// LAYOUTS
sega_2p_column_2_offset = 30.5;
sega_2p_column_3_offset = sega_2p_column_2_offset + 36;
sega_2p_column_4_offset = sega_2p_column_3_offset + 36;
sega_2p_column_5_offset = sega_2p_column_4_offset + 36;
// this offset is from the left edge of the panel
sega_2p_column_1_left_panel_edge_offset = 28.06;
dir_arc_30mm_column_2_offset = 33.8;
dir_arc_30mm_column_3_offset = dir_arc_30mm_column_2_offset + 34.8;
dir_arc_30mm_row_2_offset = 57.2;
dir_arc_30mm_row_3_offset = dir_arc_30mm_row_2_offset + 12.9;
dir_arc_w_30mm_row_4_offset = dir_arc_30mm_row_3_offset + 34.5;