64 Commits

Author SHA1 Message Date
0d8f74bef8 changelog for v4.7.0
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 13:43:24 -05:00
29fb93ee51 shrink the radius of the decorative 24mm disc
it just stands out a bit too much at the default, IMO, considering the
button is standalone and not part of a 24mm layout where the default is
nicer

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-20 18:54:29 -05:00
4564f29ef1 add a comment warning about the utility of the deco corners
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-20 18:36:56 -05:00
29b7f4a828 tinkering with plates led me to better modularize these layouts
no change in the layouts, just more modular/reusable

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-20 18:23:30 -05:00
15acfdcef4 add a "superplate" of dir_arc-plus-w + sega-2p-nine
I don't like the look of this, at least in the situation I was going to
use it in, but it's a functional piece, might has well commit it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-20 18:22:03 -05:00
b457441e9f tighten the dustwashers inner hole a bit
tested on my Nobis and it's still just a hair loose, but maybe that's
printer tolerances at this point, not inclined to mess with it much
further. this hole is exactly the radius of the lever shaft, with the
tapering to allow for it to be moved

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-20 08:09:06 -05:00
5cdac31eeb add little braces to go on the corner and middle seams
I like the corners especially. these pieces slide over the seam points
on box sticks and give a bit of depth and can cover some sharp points in
the corners where the bevels meet. so far, I've printed these in the
same color as the frame, but you could mix and match to taste, of
course.

the piece that goes in the middle is not my favorite, but I designed it
and it works, so might as well commit it. maybe these would look better
with a pattern or logo etched in.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-10 20:24:28 -05:00
a0fe108471 simplify the positioning in the basic demo
no reason to this other than it was unnecessarily harder to add another
piece at its default position

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-10 16:39:16 -05:00
4405c299b0 parameterize a measurement I may use in a new part
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-09 15:36:14 -05:00
3c1dadc917 improve on the dustwashers' fit
the hole is a bit tighter now, made possible by having a bevel on the
inside for the lever to move

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-09 15:34:21 -05:00
665674367c remove unnecessary side_chopper
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-06 12:54:46 -06:00
579d943268 slight update to my preferred printing settings
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-06 12:40:23 -06:00
b5805b1e66 include lineage information in the README for objects
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 16:48:02 -06:00
c19542bb66 updates to the README for frame piece reorg and BSS AE
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 16:44:42 -06:00
84fb2876ad align one of the back pieces properly in the demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 16:24:39 -06:00
3ca41bdb47 increase the precision of some visible round edges
this may not matter much to the actual print, but this improved the
dimensions of some objects, especially the dustwashers

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 12:41:46 -06:00
03737e2385 use the derived frame piece y dimension to build side
as in previous commit, this simplifies the build of the side frame piece
a bit. notably on this one, the preview of the piece is more performant,
so I'm thinking this is a good move. the object triangle count and
volume are slightly different (not sure why), but the object dimensions
are the same

still didn't get rid of any 2-manifold errors though :(

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 08:30:34 -06:00
ef68dbca48 use the derived frame piece x dimension to build front/back
this saves one operation and removes a bit of the artifacts. didn't seem
to help the 2-manifold stuff I was looking at, but this is slightly
clearer anyway?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 08:14:44 -06:00
4336098fe8 reorganize parameters.scad a bit
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 08:06:32 -06:00
a67c3a3d7f add --hardwarnings to the build to catch issues
this doesn't seem to error on manifold warnings (which I should fix at
some point), but it does catch "unknown module" errors, which will help
me notice when refactoring breaks imports and modularity

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 07:27:52 -06:00
950346f85a remove front-or-back-longish.scad, but use the piece elsewhere
the piece was not meant to be printed (at least not until/unless there
is a side that extends out the extra length of the front and back, which
seems unlikely), but the piece is used to create the inner wall that
juts out through windowed pieces, so we're going to keep it and just
stash it in front-or-back.scad

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-05 07:27:35 -06:00
c99a18d30f updates to the assembly information
explains the necessary pieces a bit better, and removes some information
that hasn't really been necessary since the panel posts were removed

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-04 15:54:18 -06:00
3153564ad4 add basic Sega 2P panels and decorative plates
because why not have them?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-04 15:52:26 -06:00
0129cf6ce6 add inner wall pieces that push out through their associated window
this looks kind of neat and helps the build feel of the horizontal
stripe windows, which were a bit flimsy without something sticking
through them

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-24 13:35:45 -06:00
c79427052e modularize the horizontal stripes for reuse
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-20 09:13:32 -06:00
623118b627 parameterize the frame wall cutout for readability's sake
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-19 11:09:48 -06:00
aff6efebb3 remove unnecessary difference now that all pieces have flush corner seams
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-19 07:41:07 -06:00
f3d0d4b6e2 simplify the "longish" extended side
also do the same thing for a "longish" front/back, since I want to play
around with windowed structural strength with this piece

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-18 16:03:17 -06:00
97a6f52e07 changelog for v4.6.0
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-02-18 14:58:48 -06:00
ecc3ffbb54 restore side-windowed.scad lost from previous commit 2024-12-18 14:08:46 -06:00
73b55861b6 remove the box frame pieces, all pieces are of the extended lineage
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-18 13:43:14 -06:00
439333c154 remove imports of the box pieces, and duplicate them into "extended" pieces
this is the next step in getting rid of the 45 degree angle "box" pieces

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-18 13:27:24 -06:00
ef16559b95 ensure the frame solid has the proper, complete dimensions
something about the sharp corners of the default cylinder was slightly
shrinking the overall solid by a fraction of a mm. I thought this was a
defect of how I was chopping pieces, but no, it was the core solid. this
shouldn't be a reason to rebuild anything, but it makes the models
slightly more consistent, especially when looking at the STLs

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 14:24:47 -06:00
2880018913 add a simple side for the extended frame pieces
I'm thinking the "extended" pieces become the only pieces soon, this is
one step closer to it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 13:36:33 -06:00
ca928932ba rename front/back pieces for clarity, part 1
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 13:03:08 -06:00
8b4cc0b182 fail the build (and thus make) if openscad failed
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 11:25:51 -06:00
a6b5d77671 rename some various extended pieces to make room for the simple side
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 11:25:00 -06:00
fa05469e19 add a slightly extended side piece
adds a bit of length to the build but without the longer polygon
geometry. the name of this is terrible, I think I might get rid of the
angled corner pieces in a refactoring

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-04 08:04:16 -06:00
9375a3a1b7 alignment tweaks for the rectangles plate to fit the famicom style
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-02 08:22:29 -06:00
1557021be4 squeeze in one more slash in the slashes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-12-02 08:19:54 -06:00
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
84 changed files with 1331 additions and 527 deletions

1
.gitignore vendored
View File

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

View File

@@ -2,6 +2,84 @@
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.7.0
### Features
* Inner wall pieces where the horizontal stripes jut through the horizontal stripe windows have been added, these look
decent and avoid the outer wall feeling extremely flimsy. This piece uses a "longish" front/back piece which isn't
retained as a separate piece, because the latter is not meant to be printed itself.
* I somehow went this whole time without creating a simple Sega 2P layout panel and decorative plate; those have been
added.
* Prototype (still literally a bit rough) braces for the corners and middle have been added. These pieces cover up the
seams of the frame, and add some visual depth and distinction, but are not for everyone. YMMV.
* A new "superplate" of the "directional arc + W" plus "sega 2P nine" layouts combined has been added, this is a piece I
ended up not using in a build, but it functions as well as any of the plates, so why not.
### Improvements
* Visible round edges have been made more round.
* The single-24mm-button decorative disc has been shrunk a bit, since (IMO) it stood out a bit too much relative to the
button.
* The "longish" extended side has been made a bit simpler to construct.
* The side piece construction has been reworked, making it a bit simpler to construct and reducing the build complexity,
though preview mode still complains about 2-manifold errors.
* The assembly documentation has been cleaned up, with more pieces explained a bit better as well.
* Dustwashers got some small updates to shrink the size of the disc to the normal JLF dustwasher size, and to fit the
shaft a bit tighter without obstructing the lever's ability to... be a lever.
### Miscellaneous
* The build has been improved to error when there are issues in the .scad files, to keep me from making bad packages.
* The back pieces are aligned properly in the all together demo.
* Updates to the docs on my preferred printing settings.
* README updates following the previous releases' reorganizations.
* Objects README update to add attribution to TheTrain.
## v4.6.0
### Features
* All frame pieces were updated to have flush edges, a la the "extended" sides, rather than the seam between the
front/back and the sides being at a 45 degree angle on some pieces, with the latter meaning that we were maintaining
two (complicated) duplicates of the same pieces because both 45 degree and 90 degree angles were necessary. This does
not affect the look of the build much, but simplifies the print and the maintenance of the project.
* A slightly-extended flat side piece was added, to add just a bit of length to the overall build.
### Improvements
* One more slash has been added to the frame pieces, just for more interesting visuals.
* The rectangle plates' positioning was tweaked slightly.
### Fixes
* The frame solid was very slightly shorter than it should have been as the corners relied on cylinders. The core solid
is now at its proper dimensions.
## 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 ## v4.4.3
### Features ### Features

View File

@@ -40,21 +40,17 @@ about what the types of parts are and how to use them:
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
are harder to print because the physics of the material cooling will probably pull the corners up. They also need are harder to print because the physics of the material cooling will probably pull the corners up. They also need
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk. supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
* `pieces/` * `pieces/` these are the same four walls (generally speaking) as in the complete frames above, broken out into
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you can
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you lay them all face down on the print surface for better adhesion and surface patterns. There are also variants
can lay them all face down on the print surface for better adhesion and surface patterns. There are also here, the "windowed" pieces, for doing two-tone variants and that kind of thing. There are also frame walls pulled
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing. out to create MCZ TE-style extended sides. There is an interconnect that stands in for the joined inner wall
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a between boxes of the overall unit. You need this if you are combining multiple sets of walls, e.g. for a
box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of two-panel-long stick.
course need more material) --- watch your surface adhesion.
* `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
a two-panel-long stick.
* `panels/` * `panels/`
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick * `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space top or bottom. Aside from using up a bit of the space for components inside the frame, come with no downsides ---
inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix. they print easily and are a pretty simple shape to tweak and remix.
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a * `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
@@ -69,6 +65,8 @@ about what the types of parts are and how to use them:
* `extras/` * `extras/`
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a * Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes. couple pieces for a little stand for the stick, solely for vanity purposes.
* `bss-ae/` --- these are pieces for an arcade control panel that fits on the Qanba 2009. See the docs in that
directory for details.
Feel free to request or contribute to more objects. Additional documentation regarding assembling the stick is available Feel free to request or contribute to more objects. Additional documentation regarding assembling the stick is available
in `docs/assembly-and-tips.md`. in `docs/assembly-and-tips.md`.
@@ -76,7 +74,7 @@ in `docs/assembly-and-tips.md`.
## Printing ## Printing
These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the
OpenStickCommunity. Standard settings seem sufficiently sturdy, but see `docs/materials-and-printing.md` for more OpenStickCommunity. Standard settings seem sufficiently sturdy, but see `docs/printing-and-materials.md` for more
thoughts and settings based on my tinkering with prints. thoughts and settings based on my tinkering with prints.
## Assembling ## Assembling

View File

@@ -42,9 +42,11 @@ for root, dirs, files in os.walk('.'):
stl_file = re.sub(r'\.scad$', '.stl', file) stl_file = re.sub(r'\.scad$', '.stl', file)
input_ = os.path.join(input_dir, file) input_ = os.path.join(input_dir, file)
output = os.path.join(output_dir, stl_file) output = os.path.join(output_dir, stl_file)
cmd = f'openscad -o {output} {input_}' cmd = f'openscad --hardwarnings -o {output} {input_}'
print(cmd) print(cmd)
processes.append(subprocess.Popen(cmd.split(' '))) processes.append(subprocess.Popen(cmd.split(' ')))
for process in processes: for process in processes:
process.wait() process.wait()
if process.returncode != 0:
raise Exception(f"building {process.args} failed")

View File

@@ -5,15 +5,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/extended/front-or-back.scad> use <frames/pieces/side-trapezoid.scad>
use <frames/pieces/extended/side.scad> use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad> use <frames/pieces/front-or-back-windowed-horiz-stripes.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/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";
@@ -23,17 +21,17 @@ 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]) extended_left_or_right_frame_piece(); color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) side_trapezoid_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_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) side_trapezoid_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_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_frame_piece();
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, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
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(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
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-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_plus_one_decorative_plate(); 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([-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

@@ -5,14 +5,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/extended/front-or-back.scad> use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad> use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad> use <frames/pieces/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>
top_panel_color = "#5B6579"; top_panel_color = "#5B6579";
@@ -22,17 +21,16 @@ 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]) side_trapezoid_extended_to_front_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]) side_trapezoid_extended_to_front_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]) front_or_back_trapezoid_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]) front_or_back_trapezoid_frame_piece();
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, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
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(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
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

@@ -5,9 +5,9 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/extended/front-or-back.scad> use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad> use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad> use <frames/pieces/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/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>
use <misc/dustwasher-jlf.scad> use <misc/dustwasher-jlf.scad>
@@ -19,10 +19,10 @@ frame_side_color = "#8E9089";
top_deco_color = "#000000"; top_deco_color = "#000000";
color(top_panel_color) translate([0, 0, frame_z/2-panel_z+0.01]) lever_and_sega_2p_6_button_panel_with_aux_with_mount(); color(top_panel_color) translate([0, 0, frame_z/2-panel_z+0.01]) lever_and_sega_2p_6_button_panel_with_aux_with_mount();
color(frame_side_color) translate([0, 0, -2.5]) extra_extended_left_or_right_frame_piece(); color(frame_side_color) translate([0, 0, -2.5]) side_trapezoid_extended_to_front_frame_piece();
color(frame_side_color) translate([0, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece(); color(frame_side_color) translate([0, 0, -2.5]) mirror([1, 0, 0]) side_trapezoid_extended_to_front_frame_piece();
color(frame_top_bottom_color) translate([0, 0, -2.5]) extended_front_or_back_frame_piece(); color(frame_top_bottom_color) translate([0, 0, -2.5]) front_or_back_trapezoid_frame_piece();
color(frame_top_bottom_color) translate([0, 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([0, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(bottom_panel_color) translate([0, 0, -5-frame_z/2+5]) panel(); color(bottom_panel_color) translate([0, 0, -5-frame_z/2+5]) panel();
color(top_deco_color) translate([-65, 5, 3+frame_z/2-panel_z]) jlf_dustwasher(); color(top_deco_color) translate([-65, 5, 3+frame_z/2-panel_z]) jlf_dustwasher();

View File

@@ -5,31 +5,37 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/complete/left-frame.scad> use <frames/pieces/side.scad>
use <frames/pieces/box/side.scad> use <frames/pieces/front-or-back.scad>
use <frames/pieces/box/front-or-back.scad> use <frames/pieces/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>
use <misc/decorative-corner.scad>
panel_color = "red"; panel_color = "red";
base_color = "gray"; base_color = "gray";
top_deco_color = "white"; top_deco_color = "white";
brace_color = "gray";
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/2+0.001]) 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/2+0.001]) 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, 0]) rotate([0, 180, 0]) side_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, 0]) side_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, 0]) front_or_back_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, 0]) front_or_back_frame_piece();
color(base_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel(); color(base_color) translate([panel_x/2, 0, 0]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(base_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel(); color(base_color) translate([-panel_x/2, 0, 0]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(base_color) translate([-panel_x/2, 0, -frame_z/2+panel_z/2]) panel();
color(base_color) translate([panel_x/2, 0, -frame_z/2+panel_z/2]) 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(brace_color) translate([-panel_x/2, 0, 0]) decorative_corner();
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(brace_color) mirror([1, 0, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher(); color(brace_color) mirror([0, 1, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate(); color(brace_color) mirror([1, 0, 0]) mirror([0, 1, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(top_deco_color) translate([0, 0, 4+frame_z/2-panel_z/2+0.001]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 4+frame_z/2-panel_z/2+0.001]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 4+frame_z/2-panel_z/2+0.001]) button_24mm_decorative_plate();

View File

@@ -6,29 +6,29 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/pieces/interconnect.scad> use <frames/pieces/interconnect.scad>
use <frames/pieces/box/side.scad> use <frames/pieces/side.scad>
use <frames/pieces/box/front-or-back.scad> use <frames/pieces/front-or-back.scad>
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad> use <frames/pieces/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_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_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_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece(); color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_frame_piece();
color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece(); color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_frame_piece();
color("black") rotate([180, 0, 0]) rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece(); color("black") rotate([180, 0, 0]) rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_frame_piece();
color("black") rotate([0, 180, 0]) interconnect_frame_piece(); color("black") rotate([0, 180, 0]) interconnect_frame_piece();
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel(); color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
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

@@ -28,6 +28,15 @@ details.
You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see
<https://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
### Lineage
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), itself based on the incredible work
by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright 2023 TheTrain, [licensed under CC BY
4.0](https://creativecommons.org/licenses/by/4.0/).
Made possible by the amazing efforts of [slagcoin](https://www.slagcoin.com/).
### Distributing BSS Sticks ### Distributing BSS Sticks
Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is

View File

@@ -1,12 +1,48 @@
# Assembly and Tips # Assembly and Tips
Just some miscellaneous notes for any dear reader, or more likely, my own forgetful self. These are the parts you need and instructions for creating a simple two panel arcade stick. The end product is a
rectangular prism roughly 18" long, with ample space for back buttons and enough top panel space for almost any layout
you can imagine. There are more pieces and designs to experiment with, but this will get you an awesome "standard"
build.
## Parts for a Basic Enclosure
The pieces you need to print (all colors to your taste):
* **The base frame:** `frame/pieces/front-or-back.stl` x2 + `frame/pieces/front-or-back-aux-and-neutrik.stl` x2 +
`frame/pieces/interconnect.stl`. This creates a large "H" with six 24mm button holes and two Neutrik D holes on the
back, which can mount USB connectors or rocker switches, or be covered if not used. All four of the front or back
pieces connect to the interconnect piece, which creates one frame out of the individual pieces, and also adds some
support to the center of the enclosure. The interconnect has a large hole that can either make wire routing easier, or
leave space in the center for button layouts that span it.
* **The frame sides:** `frame/pieces/side.stl` x2. These cap the "H", completing the overall frame.
* **The top:** `panels/inset/[LAYOUTS].stl`. These panels go on the top of the frame and are where you mount all of your
main buttons and levers and whatnot. There are a couple layouts whose panels are meant to be paired (e.g.
`shiokenstar-left-panel.stl` and `shiokenstar-right-panel.stl`), but usually you simply pick a left panel (e.g.
`lever-panel-with-mount.stl`) and right panel (e.g. `sega-2p-panel.stl`) based on what you want. Note that one of your
choices should be "with mount", which is where the usually-sized PCB will screw into inside the box.
* **The bottom:** `panels/inset/panel.stl` x2. Other than being the color of your choice, these just close the box.
You could put foam pads or something on these if you wanted.
The above gets you the basics. Some common things you may also want:
* **Mounting Neutrik connectors:** Neutrik D connectors can mount flush to the inside of the frame, but you can choose
to have a little decorative plate (`misc/neutrik-d-plate.stl` for added depth or color choices on the outside of the
frame, if you'd like.
* **Mounting a 24mm switch:** a rocker switch can also be mounted in the Neutrik D connector, but it needs to be placed
into a `misc/neutrik-d-plate-24mm-hole.stl` plate, and the plate mounted to the frame.
* **Flair for the auxillary buttons:** the three buttons in a row on the back of the frame can also get some style, just
place a `misc/decorative-plate-aux-control-three-button-cluster.stl` between the buttons and the frame. This only
works for screw-in buttons.
* **Flair for the top buttons:** same as above, a decorative plate for top panel layouts --- e.g.
`misc/decorative-plate-sega-2p.stl` --- can be sandwiched between the buttons and panel to add some style. This also
only tends to work on screw-in buttons.
* **Dustwashers/flair:** same deal, if you want to print one, use e.g. `misc/dustwasher-jlf.stl`.
## Putting a BSS Stick Together ## Putting a BSS Stick Together
Assembly of a stick is pretty straightforward, but there are some choices that can make it easier or harder. The Assembly of a stick is pretty straightforward, but there are some choices that can make it easier or harder. The
following is the most consistent way I've found to put one together. This is assuming a v4.2 or beyond stick, with two following is the most consistent way I've found to put one together.
panels to make a long standard stick, and the frame made of pieces.
1. Prepare the frame pieces: this is your best shot to get the e.g. Neutrik plates for the USB mount, SPDT switches, etc. 1. Prepare the frame pieces: this is your best shot to get the e.g. Neutrik plates for the USB mount, SPDT switches, etc.
installed, so do it now, and give them a good tighten. You shouldn't need to adjust these again, so finish their installed, so do it now, and give them a good tighten. You shouldn't need to adjust these again, so finish their
@@ -34,19 +70,3 @@ panels to make a long standard stick, and the frame made of pieces.
In the end, this should be extremely sturdy. None of the frame or panels should be loose at all, and you should be able In the end, this should be extremely sturdy. None of the frame or panels should be loose at all, and you should be able
to move, flip, gently toss, etc. the stick without anything moving or feeling loose. to move, flip, gently toss, etc. the stick without anything moving or feeling loose.
## Removing Inset Panels
As of v4.1 (or in v3), the top and bottom inset panels both insert into the frame, inside the frame "lip", meaning that
when everything is put together, they create a flush surface (more or less). This can make them hard to get out, as you
can't grab anything to get any leverage, and especially with v4.1, the plastic posts to aid the friction fit make it
even harder to muscle out --- in fact, even if you could get an edge and start yanking, you'd probably just break some
of the plastic.
You can instead use the reverse side and the hex standoffs to push a panel out, as so:
1. Loosen, or completely remove, the hex bolts for the panel you would like to remove.
2. Flip the stick over, and remove the hex bolts on the opposite side.
3. Screw in longer bolts, or anything else that'll fit into the hole without going flush against the panel.
4. Push the long bolts in, thus pushing the standoffs, thus pushing the desired panel out from within.
5. You may have to even get a mallet and tap on a bolt, occasionally, as everything can be *pretty* tight.

View File

@@ -4,7 +4,7 @@ bss's random thoughts and notes on the actual printing of the Buildable Stick Sy
## Printing Settings ## Printing Settings
My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives the models a bit more weight and My preferred settings are 3 wall loops with 25% gyroid sparse infill. This gives the models a bit more weight and
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.

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();
@@ -27,25 +31,25 @@ module panel_holes() {
// button hole, with extra wide bits for various uses (cutting out space // button hole, with extra wide bits for various uses (cutting out space
// for snap-ins, etc. // for snap-ins, etc.
module button_24mm_hole() { module button_24mm_hole() {
cylinder(r=small_button_radius, h=100, $fn=50, center=true); cylinder(r=small_button_radius, h=100, $fn=100, center=true);
// carve out space for snap-ins and screw-in nuts // carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything // translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=small_button_radius+button_radius_connector_space, h=49, $fn=50, center=true); translate([0, 0, -25]) cylinder(r=small_button_radius+button_radius_connector_space, h=49, $fn=100, center=true);
// space for decorative button surround stuff // space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=small_button_radius*decorative_radius_scale, h=20, $fn=50, center=true); translate([0, 0, 50]) cylinder(r=small_button_radius*decorative_radius_scale, h=20, $fn=100, center=true);
translate([0, 0, 70]) cylinder(r=small_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true); translate([0, 0, 70]) cylinder(r=small_button_radius*jumbo_decorative_radius_scale, h=20, $fn=100, center=true);
} }
// button hole, with extra wide bits for various uses (cutting out space // button hole, with extra wide bits for various uses (cutting out space
// for snap-ins, etc. // for snap-ins, etc.
module button_30mm_hole() { module button_30mm_hole() {
cylinder(r=big_button_radius, h=100, $fn=50, center=true); cylinder(r=big_button_radius, h=100, $fn=100, center=true);
// carve out space for snap-ins and screw-in nuts // carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything // translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+button_radius_connector_space, h=49, $fn=50, center=true); translate([0, 0, -25]) cylinder(r=big_button_radius+button_radius_connector_space, h=49, $fn=100, center=true);
// space for decorative button surround stuff // space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=50, center=true); translate([0, 0, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=100, center=true);
translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true); translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=100, center=true);
} }
module frame_hex_bolt_hole() { module frame_hex_bolt_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);
@@ -264,13 +274,13 @@ module frame_solid() {
]; ];
hull() { hull() {
for (p = top_points) { for (p = top_points) {
translate(p) cylinder(r=2, h=frame_bevel_height, center=true); translate(p) cylinder(r=2, h=frame_bevel_height, center=true, $fn=4);
} }
for (p = base_points) { for (p = base_points) {
translate(p) cylinder(r=2, h=frame_z-(frame_bevel_height*2), center=true); translate(p) cylinder(r=2, h=frame_z-(frame_bevel_height*2), center=true, $fn=4);
} }
for (p = bottom_points) { for (p = bottom_points) {
translate(p) cylinder(r=2, h=frame_bevel_height, center=true); translate(p) cylinder(r=2, h=frame_bevel_height, center=true, $fn=4);
} }
} }
} }
@@ -342,14 +352,14 @@ module frame() {
// for cutting out slashes from the frame outer wall // for cutting out slashes from the frame outer wall
module slash_cutout() { module slash_cutout() {
polyhedron([ polyhedron([
[slash_inner_displacement/2, -frame_wall/2, -slash_height/2], [slash_inner_displacement/2, -wall_cutout_depth, -slash_height/2],
[(slash_inner_displacement/2+slash_width), -frame_wall/2, -slash_height/2], [(slash_inner_displacement/2+slash_width), -wall_cutout_depth, -slash_height/2],
[(slash_inner_displacement/2+slash_width), frame_wall/2, -slash_height/2], [(slash_inner_displacement/2+slash_width), wall_cutout_depth, -slash_height/2],
[slash_inner_displacement/2, frame_wall/2, -slash_height/2], [slash_inner_displacement/2, wall_cutout_depth, -slash_height/2],
[-(slash_inner_displacement/2+slash_width), -frame_wall/2, slash_height/2], [-(slash_inner_displacement/2+slash_width), -wall_cutout_depth, slash_height/2],
[-slash_inner_displacement/2, -frame_wall/2, slash_height/2], [-slash_inner_displacement/2, -wall_cutout_depth, slash_height/2],
[-slash_inner_displacement/2, frame_wall/2, slash_height/2], [-slash_inner_displacement/2, wall_cutout_depth, slash_height/2],
[-(slash_inner_displacement/2+slash_width), frame_wall/2, slash_height/2] [-(slash_inner_displacement/2+slash_width), wall_cutout_depth, slash_height/2]
], [[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]); ], [[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]);
} }
@@ -396,24 +406,40 @@ 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_fingers_left_button() {
translate([-dir_arc_30mm_column_3_offset, dir_arc_30mm_row_3_offset, 0]) dir_arc_30mm_thumb_button();
}
module dir_arc_30mm_fingers_middle_button() {
translate([-dir_arc_30mm_column_2_offset, dir_arc_30mm_row_3_offset, 0]) dir_arc_30mm_thumb_button();
}
module dir_arc_30mm_fingers_right_button() {
translate([0, dir_arc_30mm_row_2_offset, 0]) dir_arc_30mm_thumb_button();
} }
module dir_arc_30mm_finger_buttons() { module dir_arc_30mm_finger_buttons() {
translate([0, 57.2, 0]) dir_arc_30mm_thumb_button(); dir_arc_30mm_fingers_left_button();
translate([-33.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button(); dir_arc_30mm_fingers_middle_button();
translate([-33.8-34.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button(); dir_arc_30mm_fingers_right_button();
}
module dir_arc_30mm_w_button() {
translate([-26.8, dir_arc_w_30mm_row_4_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(); dir_arc_30mm_w_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 +466,42 @@ 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_thumb_button() {
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_nine() {
sega_2p();
sega_2p_nine_thumb_button();
}
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,23 @@
/* 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;
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/front-or-back-trapezoid.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/side.scad>
use <frames/pieces/front-or-back-trapezoid.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_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/front-or-back.scad>
module interconnect_frame_half_piece() {
translate([0, frame_y/2-frame_wall, 0]) difference() {
front_or_back_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

@@ -1,31 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module backslashes() {
translate([-60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([0, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
}
module backslashes_windowed_front_or_back_box_frame_piece() {
difference() {
front_or_back_box_frame_piece();
// subtract slashes from the frame wall
backslashes();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
backslashes_windowed_front_or_back_box_frame_piece();

View File

@@ -1,29 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module front_stripe() {
cube([frame_x-(frame_mount_column_width*1.75)*2, frame_wall, 6], center=true);
}
module horiz_striped_windowed_front_or_back_box_frame_piece() {
difference() {
front_or_back_box_frame_piece();
// subtract frame wall windows
translate([0, -(frame_y-frame_wall)/2, 18]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, 9]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, 0]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, -9]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, -18]) front_stripe();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
horiz_striped_windowed_front_or_back_box_frame_piece();

View File

@@ -1,29 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module backslashes() {
translate([-(frame_x-frame_wall)/2, -40, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, -20, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 0, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 20, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 40, 0]) rotate([0, 0, -90]) slash_cutout();
}
module backslashes_windowed_side_box_frame_piece() {
difference() {
side_box_frame_piece();
// subtract slashes from the frame wall
backslashes();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
backslashes_windowed_side_box_frame_piece();

View File

@@ -1,29 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module side_stripe() {
cube([frame_wall, frame_y-(frame_mount_column_width*1.75)*2, 6], center=true);
}
module horiz_striped_windowed_side_box_frame_piece() {
difference() {
side_box_frame_piece();
// subtract frame wall windows
translate([-(frame_x-frame_wall)/2, 0, 18]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, 9]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, 0]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, -9]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, -18]) side_stripe();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
horiz_striped_windowed_side_box_frame_piece();

View File

@@ -1,23 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
module side_box_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
difference() {
// side piece is left/right agnostic
frame();
// minus the top and bottom
front_or_back_box_frame_piece();
rotate([180, 0, 0]) front_or_back_box_frame_piece();
// and just chop out the rest of the frame
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
}
}
side_box_frame_piece();

View File

@@ -1,28 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back-clean-for-extended-side.scad>
module front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side() {
difference() {
front_or_back_box_frame_piece_for_extended_side();
// aux button holes
translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster();
translate([-35.25, -(frame_y/2)+neutrik_panel_thickness+4, 0]) frame_cutout();
translate([-72.25, -(frame_y/2)+neutrik_panel_thickness+4, 0]) frame_cutout();
translate([2, -(frame_y/2)+neutrik_panel_thickness+4, 0]) frame_cutout();
// neutrix button hole
translate([frame_center_to_neutrik, -(frame_y/2)+neutrik_panel_thickness, 0])
rotate([270, 0, 0]) neutrik_d_mount();
translate([frame_center_to_neutrik, -(frame_y/2)+neutrik_panel_thickness+4, 0])
frame_cutout();
}
}
front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();

View File

@@ -1,18 +0,0 @@
/*
* 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

@@ -1,18 +0,0 @@
/*
* 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

@@ -1,18 +0,0 @@
/*
* 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

@@ -1,18 +0,0 @@
/*
* 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

@@ -1,18 +0,0 @@
/*
* 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 front_or_back_box_frame_piece_for_extended_side() {
difference() {
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);
}
}
front_or_back_box_frame_piece_for_extended_side();

View File

@@ -7,9 +7,9 @@ include <parameters.scad>
include <components.scad> include <components.scad>
use <front-or-back.scad> use <front-or-back.scad>
module front_or_back_aux_and_neutrik_box_frame_piece() { module front_or_back_aux_and_neutrik_frame_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); front_or_back_frame_piece();
// aux button holes // aux button holes
translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster(); translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster();
@@ -25,4 +25,4 @@ module front_or_back_aux_and_neutrik_box_frame_piece() {
} }
} }
front_or_back_aux_and_neutrik_box_frame_piece(); front_or_back_aux_and_neutrik_frame_piece();

View File

@@ -0,0 +1,31 @@
/* The inner top/bottom wall of the frame, for being displayed through a horizontal stripe windowed part.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back-inner-wall.scad>
use <front-or-back-windowed-horiz-stripes.scad>
// for stability's sake, this piece juts out a bit from the outside of the wall, so we
// need to hack the window piece a bit to subtract from the longer and get ours longer
module horiz_striped_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_longish_frame_piece();
// subtract frame wall windows
front_horiz_stripes();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
module front_or_back_windowed_horiz_stripes_inner_wall_frame_piece() {
difference() {
front_or_back_longish_frame_piece();
horiz_striped_windowed_front_or_back_frame_piece();
}
}
front_or_back_windowed_horiz_stripes_inner_wall_frame_piece();

View File

@@ -18,7 +18,7 @@ module mount_column_cutout() {
module front_or_back_inner_wall_frame_base_piece() { module front_or_back_inner_wall_frame_base_piece() {
difference() { difference() {
// Z is scaled so that some part of the original part inner wall is retained // 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(); scale([1, 1, inner_frame_z_decorative_scale]) front_or_back_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)
@@ -36,4 +36,30 @@ module front_or_back_inner_wall_frame_piece() {
translate([0, 0, 50]) rotate([90, 0, 0]) front_or_back_inner_wall_frame_base_piece(); translate([0, 0, 50]) rotate([90, 0, 0]) front_or_back_inner_wall_frame_base_piece();
} }
// this is here for use in inner wall pieces, but unlike the side longish piece (in its own
// .scad), front_or_back_longish_frame_piece is not printable so we'll just stash it here
module front_or_back_frame_piece_wall() {
// get a slice of the whole wall, to use it for making the extended version
difference() {
front_or_back_frame_piece();
cube([frame_x, frame_y-frame_wall*2, frame_z], center=true);
}
}
// this is here for use in inner wall pieces, but unlike the side longish piece (in its own
// .scad), front_or_back_longish_frame_piece is not printable so we'll just stash it here
module front_or_back_frame_piece_extension() {
hull() {
front_or_back_frame_piece_wall();
translate([0, -frame_bevel_height*2, 0]) front_or_back_frame_piece_wall();
}
}
// this is here for use in inner wall pieces, but unlike the side longish piece (in its own
// .scad), front_or_back_longish_frame_piece is not printable so we'll just stash it here
module front_or_back_longish_frame_piece() {
front_or_back_frame_piece_extension();
front_or_back_frame_piece();
}
front_or_back_inner_wall_frame_piece(); front_or_back_inner_wall_frame_piece();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <front-or-back-clean-for-extended-side.scad> use <front-or-back.scad>
module clean_front_or_back() { module clean_front_or_back() {
difference() { difference() {
front_or_back_box_frame_piece_for_extended_side(); front_or_back_frame_piece();
// chop off the lip we left on the basic piece // chop off the lip we left on the basic piece
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true); translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}; };
@@ -29,9 +29,9 @@ module bottom_piece_extension() {
} }
} }
module extended_front_or_back_frame_piece() { module front_or_back_trapezoid_frame_piece() {
clean_front_or_back(); clean_front_or_back();
translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) bottom_piece_extension(); translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) bottom_piece_extension();
} }
extended_front_or_back_frame_piece(); front_or_back_trapezoid_frame_piece();

View File

@@ -0,0 +1,40 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module backslashes() {
translate([-70, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-50, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-30, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-10, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([10, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([30, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([50, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([70, -(frame_y-frame_wall)/2, 0]) slash_cutout();
}
module backslashes_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
// subtract slashes from the frame wall
backslashes();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
module backslashes_windowed_front_or_back_frame_piece_for_extended_side() {
difference() {
backslashes_windowed_front_or_back_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_frame_piece_for_extended_side();

View File

@@ -9,9 +9,9 @@ use <front-or-back.scad>
use <front-or-back-inner-wall.scad> use <front-or-back-inner-wall.scad>
use <front-or-back-windowed-backslashes.scad> use <front-or-back-windowed-backslashes.scad>
module forwardslashes_windowed_front_or_back_box_frame_piece() { module forwardslashes_windowed_front_or_back_frame_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); front_or_back_frame_piece();
// subtract slashes from the frame wall // subtract slashes from the frame wall
mirror([0, 0, 1]) backslashes(); mirror([0, 0, 1]) backslashes();
// 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
@@ -19,4 +19,12 @@ module forwardslashes_windowed_front_or_back_box_frame_piece() {
} }
} }
forwardslashes_windowed_front_or_back_box_frame_piece(); module forwardslashes_windowed_front_or_back_frame_piece_for_extended_side() {
difference() {
forwardslashes_windowed_front_or_back_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_frame_piece_for_extended_side();

View File

@@ -0,0 +1,33 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module front_horiz_stripe() {
cube([frame_x-(frame_mount_column_width*1.75)*2, wall_cutout_depth, 5], center=true);
}
module front_horiz_stripes() {
translate([0, -(frame_y-frame_wall)/2, 18]) front_horiz_stripe();
translate([0, -(frame_y-frame_wall)/2, 9]) front_horiz_stripe();
translate([0, -(frame_y-frame_wall)/2, 0]) front_horiz_stripe();
translate([0, -(frame_y-frame_wall)/2, -9]) front_horiz_stripe();
translate([0, -(frame_y-frame_wall)/2, -18]) front_horiz_stripe();
}
module horiz_striped_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
// subtract frame wall windows
front_horiz_stripes();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
horiz_striped_windowed_front_or_back_frame_piece();

View File

@@ -14,9 +14,9 @@ module front_or_back_window() {
frame_z-panel_z*3], center=true); frame_z-panel_z*3], center=true);
} }
module windowed_front_or_back_box_frame_piece() { module windowed_front_or_back_frame_piece() {
difference() { difference() {
front_or_back_box_frame_piece(); front_or_back_frame_piece();
// subtract frame wall window // subtract frame wall window
front_or_back_window(); front_or_back_window();
// 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
@@ -24,4 +24,12 @@ module windowed_front_or_back_box_frame_piece() {
} }
} }
windowed_front_or_back_box_frame_piece(); module windowed_front_or_back_frame_piece_for_extended_side() {
difference() {
windowed_front_or_back_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_frame_piece_for_extended_side();

View File

@@ -6,25 +6,20 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/complete/left-frame.scad> use <frames/complete/left-frame.scad>
use <side.scad>
module front_or_back_box_frame_piece() { module front_or_back_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width; piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() { intersection() {
left_frame(); left_frame();
difference() { difference() {
// include the whole bottom wall (including mount columns) // include the whole bottom wall (including mount columns)
translate([0, -(frame_y/2)+(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true); translate([0, -(frame_y/2)+(piece_width/2), 0])
// ...minus the frame wall and lip on the left cube([frame_piece_x_x, piece_width, frame_z], center=true);
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y-frame_wall*2, frame_z], center=true);
linear_extrude(height=frame_z, center=true) polygon([
[-frame_x/2, -frame_y/2], [-frame_x/2+frame_wall, -frame_y/2+frame_wall],
[-frame_x/2, -frame_y/2+frame_wall]
]);
// ...minus a slot for the combining piece to go into // ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, inner_frame_z/3], center=true); cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, inner_frame_z/3], center=true);
} }
} }
} }
front_or_back_box_frame_piece(); front_or_back_frame_piece();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <box/side.scad> use <side.scad>
module interconnect_frame_half_piece() { module interconnect_frame_half_piece() {
translate([frame_x/2-frame_wall, 0, 0]) difference() { translate([frame_x/2-frame_wall, 0, 0]) difference() {
side_box_frame_piece(); side_frame_piece();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
} }
} }

View File

@@ -0,0 +1,32 @@
/* The inner side wall of the frame, for being displayed through a horizontal stripe windowed part.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side-inner-wall.scad>
use <side-longish.scad>
use <side-windowed-horiz-stripes.scad>
// for stability's sake, this piece juts out a bit from the outside of the wall, so we
// need to hack the window piece a bit to subtract from the longer and get ours longer
module horiz_striped_windowed_side_frame_piece() {
difference() {
side_longish_frame_piece();
// subtract frame wall windows
side_horiz_stripes();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
module side_windowed_horiz_stripes_inner_wall_frame_piece() {
difference() {
side_longish_frame_piece();
horiz_striped_windowed_side_frame_piece();
}
}
side_windowed_horiz_stripes_inner_wall_frame_piece();

View File

@@ -18,7 +18,7 @@ module mount_column_cutout() {
module side_inner_wall_frame_base_piece() { module side_inner_wall_frame_base_piece() {
difference() { difference() {
// Z is scaled so that some part of the original part inner wall is retained // 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(); scale([1, 1, inner_frame_z_decorative_scale]) side_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)

View File

@@ -0,0 +1,32 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
module side_frame_piece_wall() {
// get a slice of the whole wall, to use it for making the extended version
difference() {
side_frame_piece();
cube([frame_x-frame_wall*2, frame_y, frame_z], center=true);
}
}
module side_frame_piece_extension() {
// hulling the two walls provides a wall with a thicker x
hull() {
side_frame_piece_wall();
translate([-frame_bevel_height*2, 0, 0]) side_frame_piece_wall();
}
}
module side_longish_frame_piece() {
// combine the wider wall and the original piece
side_frame_piece_extension();
side_frame_piece();
}
side_longish_frame_piece();

View File

@@ -6,8 +6,8 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/complete/left-frame.scad> use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad> use <side.scad>
use <front-or-back.scad> use <front-or-back-trapezoid.scad>
module side_and_bottom_frame_piece_wall() { module side_and_bottom_frame_piece_wall() {
// get a slice of the pieces, to use it in extruding // get a slice of the pieces, to use it in extruding
@@ -26,13 +26,13 @@ module side_and_bottom_frame_piece_extension() {
} }
} }
module extra_extended_left_or_right_frame_piece() { module side_trapezoid_extended_to_front_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_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
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]) 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(); translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_and_bottom_frame_piece_extension();
} }
extra_extended_left_or_right_frame_piece(); side_trapezoid_extended_to_front_frame_piece();

View File

@@ -6,8 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frames/complete/left-frame.scad> use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad> use <side.scad>
use <front-or-back-clean-for-extended-side.scad>
module side_frame_piece_wall() { module side_frame_piece_wall() {
// get a slice of the piece, to use it in extruding // get a slice of the piece, to use it in extruding
@@ -25,13 +24,13 @@ module side_frame_piece_extension() {
} }
} }
module extended_left_or_right_frame_piece() { module side_trapezoid_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_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
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]) 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_frame_piece_extension(); translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension();
} }
extended_left_or_right_frame_piece(); side_trapezoid_frame_piece();

View File

@@ -0,0 +1,30 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module backslashes() {
translate([-(frame_x-frame_wall)/2, -50, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, -30, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, -10, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 10, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 30, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 50, 0]) rotate([0, 0, -90]) slash_cutout();
}
module backslashes_windowed_side_frame_piece() {
difference() {
side_frame_piece();
// subtract slashes from the frame wall
backslashes();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
backslashes_windowed_side_frame_piece();

View File

@@ -9,9 +9,9 @@ use <side.scad>
use <side-inner-wall.scad> use <side-inner-wall.scad>
use <side-windowed-backslashes.scad> use <side-windowed-backslashes.scad>
module forwardslashes_windowed_side_box_frame_piece() { module forwardslashes_windowed_side_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_frame_piece();
// subtract slashes from the frame wall // subtract slashes from the frame wall
mirror([0, 0, 1]) backslashes(); mirror([0, 0, 1]) backslashes();
// 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
@@ -19,4 +19,4 @@ module forwardslashes_windowed_side_box_frame_piece() {
} }
} }
forwardslashes_windowed_side_box_frame_piece(); forwardslashes_windowed_side_frame_piece();

View File

@@ -0,0 +1,33 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module side_horiz_stripe() {
cube([wall_cutout_depth, frame_y-(frame_mount_column_width*1.75)*2, 5], center=true);
}
module side_horiz_stripes() {
translate([-(frame_x-frame_wall)/2, 0, 18]) side_horiz_stripe();
translate([-(frame_x-frame_wall)/2, 0, 9]) side_horiz_stripe();
translate([-(frame_x-frame_wall)/2, 0, 0]) side_horiz_stripe();
translate([-(frame_x-frame_wall)/2, 0, -9]) side_horiz_stripe();
translate([-(frame_x-frame_wall)/2, 0, -18]) side_horiz_stripe();
}
module horiz_striped_windowed_side_frame_piece() {
difference() {
side_frame_piece();
// subtract frame wall windows
side_horiz_stripes();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
horiz_striped_windowed_side_frame_piece();

View File

@@ -8,9 +8,9 @@ include <components.scad>
use <side.scad> use <side.scad>
use <side-inner-wall.scad> use <side-inner-wall.scad>
module windowed_side_box_frame_piece() { module windowed_side_frame_piece() {
difference() { difference() {
side_box_frame_piece(); side_frame_piece();
// subtract frame wall window // subtract frame wall window
translate([-frame_x/2, 0, 0]) translate([-frame_x/2, 0, 0])
cube([(frame_wall+panel_support_width)*2, frame_y-frame_mount_column_width*3.5, cube([(frame_wall+panel_support_width)*2, frame_y-frame_mount_column_width*3.5,
@@ -20,4 +20,4 @@ module windowed_side_box_frame_piece() {
} }
} }
windowed_side_box_frame_piece(); windowed_side_frame_piece();

View File

@@ -0,0 +1,26 @@
/*
* 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 <front-or-back.scad>
module side_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
difference() {
intersection() {
left_frame();
// include the whole left wall (including mount columns)
translate([-(frame_x/2)+(piece_width/2), 0, 0])
cube([piece_width, frame_piece_y_y, frame_z], center=true);
}
// minus the top and bottom
front_or_back_frame_piece();
rotate([180, 0, 0]) front_or_back_frame_piece();
}
}
side_frame_piece();

View File

@@ -0,0 +1,31 @@
/* A bit of plastic to put on the corners of a case, just for more flair and seam hiding.
*
* Note: this only works on the standard side and front/back pieces, not the longish/extended pieces.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module decorative_corner() {
deco_thickness = 2;
difference() {
// start with the frame shape itself, just grown a bit
resize(newsize=[frame_x+(deco_thickness*2), frame_y+(deco_thickness*2), frame_z+(deco_thickness*2)])
frame_solid();
// lob off the pieces to make a corner
translate([(panel_to_frame_point_offset+deco_thickness*2)*1.5, 0, 0])
cube([frame_x, frame_y*2, frame_z*2], center=true);
translate([0, (panel_to_frame_point_offset+deco_thickness*2)*1.5, 0])
cube([frame_x*2, frame_y, frame_z*2], center=true);
// carve out the inside
frame_solid();
// holes for bolts
translate([0, 0, frame_z/2]) panel_holes();
translate([0, 0, -frame_z/2]) rotate([0, 180, 0]) panel_holes();
}
}
decorative_corner();

View File

@@ -0,0 +1,36 @@
/* A bit of plastic to put on the center of a case front, just for more flair and seam hiding.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module decorative_half_middle() {
deco_thickness = 2;
translate([-frame_x/2+frame_wall, 0, 0]) difference() {
// start with the frame shape itself, just grown a bit
resize(newsize=[frame_x+(deco_thickness*2), frame_y+(deco_thickness*2), frame_z+(deco_thickness*2)])
frame_solid();
// make this appropriate for the middle
scale([1, 1, 2]) side_chopper();
// lob off the pieces to make a cornerish piece
translate([-(panel_to_frame_point_offset+deco_thickness*2)*1.65, 0, 0])
cube([frame_x, frame_y*2, frame_z*2], center=true);
translate([0, (panel_to_frame_point_offset+deco_thickness*2)*1.5, 0])
cube([frame_x*2, frame_y, frame_z*2], center=true);
// carve out the inside
frame_solid();
// holes for bolts
translate([0, 0, frame_z/2]) panel_holes();
translate([0, 0, -frame_z/2]) rotate([0, 180, 0]) panel_holes();
}
}
module decorative_middle() {
decorative_half_middle();
mirror([1, 0, 0]) decorative_half_middle();
}
decorative_middle();

View File

@@ -4,6 +4,7 @@
*/ */
include <parameters.scad> include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad> include <components.scad>
module button_24mm_decorative_plate() { module button_24mm_decorative_plate() {

View File

@@ -0,0 +1,35 @@
/*
* 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;
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 + 19+3 = space around button
left_plate_x = dir_arc_30mm_column_3_offset + 30 + 19;
// layout offset + 30 = width for layout plus button width + 19+3 = space around button
left_plate_y = dir_arc_w_30mm_row_4_offset + 30 + 19;
left_plate_center_x = (left_plate_x + sega_2p_column_1_left_panel_edge_offset - 22)/2;
// layout offset + 30 = width for layout plus button width + 19+3 = space around button
right_plate_x = sega_2p_column_4_offset + 30 + 19;
right_plate_center_x = (right_plate_x + sega_2p_column_1_left_panel_edge_offset - 22)/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=100)
square([right_plate_x, left_plate_y], center=true);
translate([-left_plate_center_x, 15, 0]) linear_extrude(2) offset(r=3, $fn=100)
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

@@ -0,0 +1,34 @@
/* decorative plate for directional and action buttons.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_superplate() {
difference() {
union() {
hull() difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([-panel_x/2, 0, -50]) dir_arc_w_30mm();
translate([panel_x/2, 0, -50]) sega_2p_nine();
// customized position to make a top point even with the
// top of the dir_arc_w_30mm piece, because it being
// at an angle otherwise looks silly IMO
translate([panel_x*23/32, 26.6, -50]) sega_2p_p1();
}
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]) dir_arc_w_30mm();
translate([panel_x/2, 0, -1]) sega_2p_nine();
}
}
dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_superplate();

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,26 +1,22 @@
/* /* 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
*/ */
include <parameters.scad> include <parameters.scad>
decorative_radius_scale = 1.5; decorative_radius_scale = 1.5;
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,22 @@
/* 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;
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,24 @@
/* 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;
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

@@ -0,0 +1,21 @@
/* A decorative plate for the Sega 2P layout.
*
* 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_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p();
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]) sega_2p();
}
}
sega_2p_decorative_plate();

View File

@@ -8,9 +8,9 @@ include <components.scad>
module jlf_dustwasher() { module jlf_dustwasher() {
difference() { difference() {
cylinder(r=lever_plate_hole*decorative_radius_scale, h=2, $fn=50, center=true); cylinder(r=jlf_dustwasher_radius, h=2, $fn=100, center=true);
// 5.25 = 4.55 (diameter of shaft is 9.10mm) + .25 to let it take an angle cylinder(r1=jlf_shaft_inner_radius, r2=jlf_shaft_inner_radius+shaft_position_tolerance,
cylinder(r=4.8, h=2.1, $fn=50, center=true); h=2.001, $fn=100, center=true);
} }
} }

View File

@@ -8,9 +8,9 @@ include <components.scad>
module lsx_nobi_dustwasher() { module lsx_nobi_dustwasher() {
difference() { difference() {
cylinder(r=lever_plate_hole*decorative_radius_scale, h=2, $fn=50, center=true); cylinder(r=lsx_nobi_dustwasher_radius, h=2, $fn=100, center=true);
// 5.25 = 5 (diameter of shaft is 10mm) + .25 to let it take an angle cylinder(r1=lsx_nobi_shaft_inner_radius, r2=lsx_nobi_shaft_inner_radius+shaft_position_tolerance,
cylinder(r=5.25+hole_tolerance, h=2.1, $fn=50, center=true); h=2.001, $fn=100, center=true);
} }
} }

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,12 @@
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();
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

@@ -0,0 +1,17 @@
/* A top panel in the very popular Sega 2P layout.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module sega_2p_panel() {
difference() {
panel();
sega_2p();
}
}
sega_2p_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

@@ -3,6 +3,10 @@
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
// CONNECTION POINT SIZES
// adjustments // adjustments
hole_tolerance = 0.15; hole_tolerance = 0.15;
@@ -17,6 +21,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;
@@ -28,24 +35,38 @@ big_button_radius = 15 + hole_tolerance;
// radius + value below should leave space for the nut and for fingers to grab the nut // radius + value below should leave space for the nut and for fingers to grab the nut
button_radius_connector_space = 5; button_radius_connector_space = 5;
// standard lever hole
lever_plate_hole = 12;
// neutrik D screw holes
neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance;
// ELEMENT DIMENSIONS
// JLF mount dimensions // JLF mount dimensions
lever_mount_x = 53; lever_mount_x = 53;
lever_mount_y = 95; lever_mount_y = 95;
lever_mount_z = 2; lever_mount_z = 2;
// standard lever hole // base frame box. reminder: inside top and bottom (including mounts) are chopped by panel_z for plates
lever_plate_hole = 12;
// case dimensions
// base frame box. reminder: top of inside (including mounts) is chopped by panel_z for plates
frame_x = 233; frame_x = 233;
frame_y = 208; frame_y = 208;
frame_z = 57; frame_z = 57;
// stand dimensions to display a stick // depth of the "lip" of the frame that the top plate sets into/supports the overhang
stand_x = 5; frame_wall = 4;
stand_y = frame_z;
stand_z = 15; // top plate, which can either be the whole plate ("inset") or the mounting frame for a plate that overhangs
panel_x = frame_x - (frame_wall * 2);
panel_y = frame_y - (frame_wall * 2);
panel_z = 5;
// some dimensions for frame pieces, useful in doing some intersections and chopping
frame_piece_x_x = frame_x - (frame_wall * 2); // essentially panel_x, yes
frame_piece_y_y = frame_y; // the whole y of the frame, yes
// degree to which the extended frame pieces stick out from the end of the frame // degree to which the extended frame pieces stick out from the end of the frame
frame_extension_x = 25; frame_extension_x = 25;
@@ -58,20 +79,12 @@ overhang_panel_bevel_height = 1;
frame_center_to_neutrik = 70; frame_center_to_neutrik = 70;
// depth of the "lip" of the frame that the top plate sets into/supports the overhang
frame_wall = 4;
// width of the column in the frame corners to support the hex bolt // width of the column in the frame corners to support the hex bolt
frame_mount_column_width = 20; frame_mount_column_width = 20;
// per neutrik (mm) // per neutrik (mm)
neutrik_panel_thickness = 3; neutrik_panel_thickness = 3;
// top plate, which can either be the whole plate ("inset") or the mounting frame for a plate that overhangs
panel_x = frame_x - (frame_wall * 2);
panel_y = frame_y - (frame_wall * 2);
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);
@@ -87,21 +100,54 @@ panel_overhang_amount = 8.5;
overhang_panel_x = panel_x + (frame_wall * 2) + (panel_overhang_amount * 2); overhang_panel_x = panel_x + (frame_wall * 2) + (panel_overhang_amount * 2);
overhang_panel_y = panel_y + (frame_wall * 2) + (panel_overhang_amount * 2); overhang_panel_y = panel_y + (frame_wall * 2) + (panel_overhang_amount * 2);
panel_to_frame_point_x = (panel_x/2)-10; panel_to_frame_point_offset = 10;
panel_to_frame_point_y = (panel_y/2)-10; panel_to_frame_point_x = (panel_x/2) - panel_to_frame_point_offset;
panel_to_frame_point_y = (panel_y/2) - panel_to_frame_point_offset;
// frame interior that supports the top plates // frame interior that supports the top plates
panel_support_width = 5; panel_support_width = 5;
// neutrik D screw holes
neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance;
// additional button radius for decorative panels, etc. // additional button radius for decorative panels, etc.
decorative_radius_scale = 1.75; decorative_radius_scale = 1.75;
jumbo_decorative_radius_scale = 2; jumbo_decorative_radius_scale = 2;
// decorative wall cutout parameters
// thicker than the actual base wall to account for the longish pieces
wall_cutout_depth = frame_wall * 3;
// decorative slash parameters // decorative slash parameters
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;
// dustwasher parameters
jlf_dustwasher_radius = 19;
jlf_shaft_inner_radius = 4.55;
lsx_nobi_dustwasher_radius = jlf_dustwasher_radius;
lsx_nobi_shaft_inner_radius = 5;
shaft_position_tolerance = 2;
// stand dimensions to display a stick
stand_x = 5;
stand_y = frame_z;
stand_z = 15;
// 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;