152 Commits

Author SHA1 Message Date
4c045951c7 fix some trivial markdown issues
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-06-20 08:20:40 -05:00
bcf2adcaa2 add a short FAQ to answer a question on IRC
and maybe more questions in the future

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-06-20 08:11:34 -05:00
5e25a27d58 add a simple sleeve for a hex spacer that isn't wide enough
I got a bag of spacers that are not as wide as what I normally use, so
they rattle around in the post hole and obviously don't help with the
fit of the completed stick. this sleeve seems to be right for them to
fill the hole. provided in case it is useful in the future, for myself
or anyone else

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-06-08 10:06:58 -05:00
462b4d45e0 some fixes and updates to the extended demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-06-01 09:35:40 -05:00
b0e5082064 remove the decorative corners, I don't use them
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-31 20:58:22 -05:00
6df2d7a84f remove test components that were commented out while testing
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-30 16:12:41 -05:00
ef32076d98 rename some "control-panel" panels that are just one aux button appropriately
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-30 14:32:01 -05:00
d9d1183488 remove old unsupported OLED mount/cutout/panel
the mount/cutout wasn't in a sensible place in the only panel it
appeared in for a while, so removing it for now until/unless there's a
reason to do it better, but in all likelihood, I'll just keep reusing
the adafruit one

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-28 17:01:09 -05:00
fe8826d86f rework the OLED mount and add it to a new panel
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-28 17:01:04 -05:00
8b96f60f37 add more color options to the demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-05-28 17:00:59 -05:00
5675921875 changelog for v4.7.1
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-28 08:27:02 -05:00
d70ccf6491 fix an issue with decorative plate sizing
I was taking a hull of the whole button negative shape in many places,
rather than a hull of the sliced shape, which meant the amount of
decorative plate beyond the button holes varied depending on the exact
positioning of how it was sliced. this was brittle in general, but
more importantly made many plates too big when I cleaned up some code to
remove an override that I thought was irrelevant --- it was actually
affecting the overall geometry outside of the slice

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-28 08:20:07 -05:00
432e6e74d5 put everything in docs/ in the build, in order to include images
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 16:32:30 -05:00
1e64f59134 minor README wording tweak
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 16:11:57 -05:00
a4f2650f00 include a v4.7 photo and add it to the README
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 15:56:46 -05:00
c9a74ebb18 build two zip files for printables uploading
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 14:39:49 -05:00
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
7e67c15c13 updates for v4.4.3
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-14 23:21:44 -05:00
e426e15884 retain a bit of the inner wall on the outer piece for windowed pieces
the inner wall piece being the *whole* inner wall of the frame side
meant that the (now relatively thin) outer wall piece was not supported
by anything on the top and bottom, which combined with the already weak
piece because of the window, gave the edges a lot of give.

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

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

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

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-12 08:19:33 -05:00
0ac3e8433f properly name the horiz. stripe windowed frame pieces
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-10 13:16:47 -05:00
2bbf69d9a0 properly name the extended (not to bottom) side frame piece
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-10 11:12:36 -05:00
f4c9c91d91 fix an issue with frame wall + small button screw-in space
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 14:25:09 -05:00
bbe1ab25d7 reorganize the READMEs a bit and put both in the .zip
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 11:13:03 -05:00
cb82933e50 docs updates for v4.4.1
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:37:05 -05:00
a1fc85c069 rename the overhang solo lever + 6 button and add a board mount
this makes it essentially the same as the inset panel, just as an
overhang variant

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:35:44 -05:00
850bbdf5b9 demo for the solo panel stick I'm working on
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:52:29 -05:00
7e42129594 add an inset solo panel, room for lever + 6 buttons + 2 aux
good for classic/mini consoles and MiSTer?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:46:47 -05:00
66719f84c6 adjust solo lever + 6 button panel
this tested better and allows a bit of space for two aux buttons

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:33:50 -05:00
184664cceb tweak the area around button holes for screw-ins
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:26:00 -05:00
903b9b40ff actually update the blown up demo image after fixing the file
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-01 20:28:53 -05:00
9fd3658518 parameterize more of the slashes used for windowed walls
this was done for a probably-abandoned attempt at something, but the
parameterization is good anyway

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-28 12:01:49 -05:00
bd7b908712 make more windowed frame pieces, this time horizontal stripes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-28 12:01:26 -05:00
61a67109ce fix alignment of a bottom overhang panel in the demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-25 17:02:03 -05:00
ff85423cee DRY the frame wall slashes and parameterize them a bit
this should allow me to reuse them in another design I've got cooking

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-25 17:01:21 -05:00
ca655012c5 start a CHANGELOG for v4.4 and backfill old notes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-24 16:17:06 -05:00
3059e01b8f update build blown up demo and example photo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-24 15:50:25 -05:00
2911b23db4 rewrite "plates" as two separate plates
could these be broken up? yes. but this .scad was never used AFAIK, so
I'm just going to repurpose it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-24 15:35:43 -05:00
00a1bbc065 don't error if the necessary build directories already exist
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-24 15:35:14 -05:00
6726233beb favor symmetry in the front/back and side wall windowed pieces
I think the lack of symmetry led to a varying amount of force being
applied when joined with the interconnect. take for instance:

OUTER  INTER  INNER
INTER  INTER  INTER
INNER  INTER  OUTER

if OUTER (the "windowed" piece, the outside wall + one half of the
mounting column) is on top on the left side and on the bottom on the
right side, and INNER (the inner wall, the one that floats around
relative to the outer wall) vice versa on the other side, the two pieces
side by side would not create a clean line --- left would be ~0.5mm
lower than the right.

if there was a way to clamp these down relative to each other, the
problem might go away, but these are pretty pivotal to the overall stick
being aligned and the panels don't cross the interconnect, so probably
panels and a completed stick would have been similarly misaligned.

this, I believe, fixes it, and also fixes a tiny issue where a bit too
much material was being cut out of the inner walls by way of the mount
columns having a triangular point not normally seen because it's inside
the inner wall

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-22 09:01:19 -05:00
bc68f8b0dc naming consistency: panels are top/bottom
vertical planes that make up the frame are either sides or front/back

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-21 11:38:31 -05:00
de3914fa85 more documentation updates for the assembly, after renaming stuff
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-21 09:07:46 -05:00
92d3f9e6d5 some minor documentation updates
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-21 08:44:40 -05:00
8168797be3 rewrite the README notes on parts, now that I reorganized them
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-21 08:36:08 -05:00
244ace1b4a add box pieces for a vent kind of look
no particular reference for this, just took some "slashes" and cut them
out of the walls with the expectation of using the inner wall in a
different color. designed, as much as I'd call it a design, for the Eva
stick, but this is mostly just me trying stuff at the moment

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-21 08:34:18 -05:00
db887b668f reorganize all the parts into subdirectories
src/ was getting pretty unreadable and I finally had time to do
something about it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-20 17:58:19 -05:00
dccd2836b2 start some frame pieces that have openings for decoration
essentially, the whole inner wall and part of the outer wall gets cut
out of the piece, and a new inner wall piece (probably printed in a
different color, or with some design of its own) created that can be
seen through the outer wall's window

multiple window and inner options are possible, this is just the start
while I do other organization

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-20 14:02:19 -05:00
2ed9b12ed3 simplify my Makefile by writing the build stuff in Python
I'm going to move all of the .scad files into subdirectories and I
couldn't figure out how to recurse properly in make, so... do it the
easy way

make is hard, let's go shopping

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-20 10:51:16 -05:00
de0fcfd160 use gray in the demo so that it's easier to see edges
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 13:28:23 -05:00
4e65445e16 fix the extended pieces, sans 45 degree box corner
box pieces having a 45 degree cut for the corners looks very nice, and
works well, but the cut interferes with the extended piece options, so
this reuses the pieces to take ones with the 45 degree lip cut off,
which would be combined with the flush extended pieces, much like how
things used to work for these pieces before I made the box pieces use
said cut.

this also commits a demo of combining everything extended-style

phew

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 13:23:01 -05:00
d578890d96 rename box-style frame pieces to be explicitly for boxes
I'm going to need to duplicate and edit the top/bottom pieces in
order to create better extended pieces, so this moves them into
something explicitly-named. next commit will fix the extended pieces

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 12:54:13 -05:00
db41aa1183 add demo of a stick as if was assembled
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 11:12:33 -05:00
0d954c2630 fix the blown up demo and move it to a demo/ dir
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 10:46:27 -05:00
60b52eb10d DRY: base top_or_bottom_aux_and_neutrik_frame_piece on basic piece
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 10:05:07 -05:00
63c7ade41d split the top/bottom and side walls' corners in the middle
this makes them meet at the corner at a 45 degree angle, rather than the
side having the whole wall, which tended not to print well. the behavior
of the extended walls, where the whole side is on the extended side
piece, is retained --- this only affects the box walls

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-19 09:57:38 -05:00
eaaa92004f scoot the 3 aux buttons a bit closer to the edge
this is just to line up with the frame/panel mount column a bit better
and remove some weird geometry

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-18 13:58:55 -05:00
cf218ecc1d tweaks to the frame pieces for better names and post sizes
in addition to renaming a number of the frame pieces, and adjusting the
pieces affected by those renames, this tweaks how the interlocking
pieces are designed by using 1/3 of the inner z of the frame rather than
dividing up the outer z. this is more consistent and might be a relevant
tweak in a later part I'm working on

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-18 07:37:52 -05:00
8fd77375b7 parameterize the construction of the frame_mount_column chamfer
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-17 12:22:31 -05:00
a9911820c9 make a base for the little stand things
for stability, could be decorated more in the future, that kind of
thing, but this works right now so I'll commit it before I go breaking
things

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-17 11:51:34 -05:00
b9ba201c99 add a shiokenstar layout and top panels
I didn't use this in a build, but the panels work. there might be some
misalignment with the interconnect, still, but I'm thinking of redoing
that piece anyway. I think these files are good at least.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-17 11:25:32 -05:00
3bd36cfbdf leave a section of full frame after a neutrik cutout
the previous cutout ran the height of the interior, meaning that if you
looked straight down a top panel edge, if the fit wasn't perfect, you
could see some gaps, as the lip that the panel was resting on had gaps
in it. this eliminates that, and makes the pieces with neutrik cutouts a
bit more stable, by just shortening the cutout box and retaining a
little lip for the panels across the whole box

slightly harder to get around with buttons that way, but definitely a
net improvement

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-30 08:03:52 -05:00
89e25bd001 lengthen the stand to give more support
previous design worked fine, but it's just so tiny, a slight breeze
would sometimes knock the stick off

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-20 10:11:52 -05:00
a6803450f8 raise the stand piece slightly
this will make room for the mount structure I'm working on now, which
will tweak this further

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-20 10:09:44 -05:00
e41f3f4c6c a new stand, far simpler and smaller than the old
this is basically just a little wedge to display the stick on. I really
like using three since they're not secured to anything, but I might make
a plate to put them in next, for a bit more stability

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-19 15:52:53 -05:00
3ec6132547 tweak the interchange hole slightly to fit center layouts a bit better
a shiokenstar layout is possible with this, to be committed soon once I
do a confirmation

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-13 12:44:01 -05:00
b43b79ce19 commit the frame_box component necessary for the abandoned mount
so, that mount wouldn't have even been printable for anyone else anyway,
that's good, but this breaking out of a piece might as well be committed

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-11 09:44:41 -05:00
f93f20997a move the fancy mount into the attic
the friction fit is too unreliable, and it took minimal kid aura to have
the whole thing toppling over. I will make a more stable mount at a
minimum later, so this thing goes into the TODO pile for now

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-11 09:43:17 -05:00
70b45fa18b make a fancy mount for showing off sticks
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-05-01 08:11:40 -05:00
e50629d372 make the frame routing hole a semicircle on one side
this is still a very solid piece compared to the old method of a diamond
through the middle, and comes with two benefits:

1. semicircle cut out of the bottom (or top) means that wiring can be
   run over rather than through, simplifying some (dis)assembly, and...
2. semicircle on the bottom, and offset from the center, should allow
   for designs with a button in the center of the x-axis, rather than
   having to leave room for the frame wall. this might facilitate
   directional arc layouts where the buttons are combined in one shape

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-23 17:15:03 -05:00
01d4d95f24 update the blown up demo, now with frame pieces
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-22 12:40:24 -05:00
4cefdfa26b move the DCO into CONTRIBUTING.md
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-12 00:56:49 -05:00
dabfc4258b include the right file following its rename
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-05 18:49:09 -05:00
a7206add7c updated assembly instructions, simpler without posts
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-05 10:25:44 -05:00
d70a2f90c6 remove the frame posts from panels, more trouble than they're worth
the panels had posts that would drive into the frame column (the frame
column needing to be a bit wider at the top and bottom accodringly).
this was an attempt to assist the friction fit of the whole stick in
tandem by having the panels contribute to the position and rigidity of
the frame pieces. in practice I think this didn't really contribute
anything major to that problem, and instead made the panels hard to
connect, and way harder to remove, while also having a visual defect in
that the panels were usually separated slightly due to having to fit
exactly in the frame columns.

this goes back to the old design where the base panel is a flat sheet
and the frame column holes are uniform. everything seems nicer this way,
and the overall build is simpler.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-04 16:33:29 -05:00
0513da125f don't recommend fiddling with the initial layer height/width
doesn't seem to be any real gain in changing them, having done more
prints with those settings and with stock settings.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-04 14:17:34 -05:00
e7543dceb0 dedupe top left and right frame pieces, they're the same shape
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-03 18:00:58 -05:00
45439cbf6d things might have actually been warping a bit more with the higher temps
at least it's seeming that way with some Bambu matte PLA

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-01 16:11:43 -05:00
b21cb75816 add some documentation to the built STLs .zip
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-21 19:07:29 -05:00
882a34db55 rewrite Makefile to allow parallelization
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-21 18:15:10 -05:00
90f5670c2a more notes on printing settings for the parts
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-21 17:36:03 -05:00
96342f1b16 general assembly instructions
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-18 18:15:52 -05:00
7bc6acfb93 updated photo for the README, showing the large bevels
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-18 18:15:52 -05:00
16f41fe245 more notes on printing and bottom layer patterns
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-18 18:15:48 -05:00
c8881fc172 document observations on printing settings
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-16 11:28:25 -05:00
1f8b5d527b reorder the attribution section a bit
also add a blurb about what I believe satisfies the GPLv3 in any
distribution of the object files and/or objects themselves, since I'm
beginning to think about how to send sticks to other people

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-15 09:48:52 -05:00
130 changed files with 2550 additions and 611 deletions

1
.gitignore vendored
View File

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

225
CHANGELOG.md Normal file
View File

@@ -0,0 +1,225 @@
# CHANGELOG
Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.7.1
### Fixes
* Hull-based decorative plates were accidentally grown in v4.7.0 due to ye olde refactoring. They are back to the
dimensions they should be (give or take) because there was an underlying bug in how they were geometried pre-v4.7.1.
* The docs/ directory in the build now includes the images referred to, especially in the README.
### Miscellaneous
* Some README tweaks, including another demonstrative photo.
* The build creates both a ZIP of everything, including docs, for humans to download, and also a ZIP of *just* the STLs,
to ease uploading to Printables.
## 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
### Features
* Windowed frame wall pieces were made for the "clean" front/back walls that line up with the extended sides.
### Improvements
* The inner wall piece has been thickened, bringing its surface closer to the end of the outer wall windowed frame
pieces, making the window less deep and the inner wall easier to see.
* The inner wall piece has been shrunken on the Z in order to leave some material on the outer wall and thus improve the
friction fit and clamp of the outer wall piece, which was too weakened by the unsupported top and bottom otherwise.
### Miscellaneous
* Documentation updates, especially around the printing of parts.
* Corrected the names of some pieces that were accidentally duplicated from the file they were copied from rather than
what they were, or otherwise didn't match the standard pattern (such as it is).
## v4.4.2
### Bugfixes
* Fix a regression with the small button screw-in space cutting into the frame wall supports. The screw-in space is
potentially more important for some nuts than the thickness of the frame wall supports, so the latter have been
thinned slightly.
## v4.4.1
### Features
* A new lever + Sega 2P 6 button panel has been added. The overhang version hadn't been updated in forever, but the
inset panel moved stuff around in a way that allowed a couple aux buttons to fit in, so those have been added to the
overhang panel as well.
* A horizontal stripe frame windowed piece has been added. YMMV may vary a bit on this vs. an empty window --- you can
see less of the inner object with the stripes, but it's a bit more stable.
### Improvements
* The frame wall slashes have been made a bit more reusable.
* The area around button holes for screw-ins has been tweaked to be a bit smaller for 30mm buttons and a bit larger for
24mm buttons.
### Miscellaneous
* A bottom overhang panel was positioned incorrectly in the demo file; this has been fixed.
* Added a demo of the one-panel overhang lever + 6 button stick.
## v4.4.0
### Features
* New "windowed" frame box walls have been added, which allow for seeing through the outer wall to something else, such
as an inner wall of a different color, or for people who like showing off their wiring, nothing.
* An attempt at a two-panel "shiokenstar" layout has been added.
* The "plates" decorative plate for my favorite layout was altered since I wasn't using it anyway.
### Improvements
* The frame routing hole, in either the whole frames or the interconnect, is a semicircle on one side, making it easier
to wire (and rewire) a completed arcade stick, and it also makes button layouts that span the connection point more
possible.
* Less of the inner wall is cut out for e.g. Neutrik and aux buttons now, removing the possibility for inset panels to
allow for a tiny bit of light to seep the cracks and giving panels a bit more support.
* The piece-based frame walls now meet at 45 degree angles at the corners, which makes for fewer print anomalies to
catch your hand or clothing on. These 45 degree angles are not used for the TE1-style extended panels, which still
meet at 90 degree angles.
* All of the core arcade stick parts, and extras, have been reorganized and renamed into subdirectories that make their
purpose more obvious. This also makes it clearer what you're looking at when looking at the project file structure.
Documentation was updated throughout for this change.
### Miscellaneous
* A stand for showing off inset-based sticks has been added to extras. This may get more love in a future release.
* The blown up demo now uses frame pieces, as these are quickly becoming the standard build.
* Cleanups to CONTRIBUTING.md
* Demos have been given their own place in the repository.
* The Makefile has been altered to use a Python script to build the files, due to the complexity of reorganizing the
project into subdirectories.
* An abandoned floating stand has been moved into the attic --- it barely works right.
## v4.3.x
This finally removed the posts added to the panels introduced in v4.0.
## v4.2.x
This added TE1-like bevels to the repository, which look pretty neat.
## v4.1.0
Having improved the internals in v4.0.0, this broke out the frame into modular pieces, making them easier and more
reliable to print, with only a trivial effect on the overall stability of the stick. This also made the bottom panels
identical to the top, easing reuse.
## v4.0.x
This was an experiment that didn't survive scrutiny to add more posts to the frames and panels, in order to improve the
friction fit, but it really just make the whole thing more obnoxious to work with. However, this redesign also came with
some key improvements to the construction of the stick, which has made the subsequent releases easier to work with.
## v3.3.x
Largely a cleanup, this improved the component reuse and added more complete licensing information to the project.
## v3.2.x
This improved the frame height to accommodate more levers in inset panels, along with some cleanup.
## v3.1.x
This added panels for more layouts with more buttons, establishing my go-to of a lever, a directional arc with an extra
button in a W-as-in-WASD position, and a Sega 2P-inspired 9-button action button layout.
## v3.0.x
I think the project really took shape at this point, as it resized the panels and frames to accommodate a two-panel
layout for nice, long sticks.
## v2.0.x
This added the overhang plates to the mix, while still sticking to the three-panel design. It also started adding
dustwashers and decorative plates, which improved the aesthetics of the project.
## v1.0.x
This was a simple three-panel stick that was somewhat ridiculously long, but worked, and built a lot of the foundation
for the project. Its start as being inspired by the Open Stick really showed at this point, but things were coming
together.

View File

@@ -9,11 +9,47 @@ I do not request the copyright of contributions be assigned to me or to the proj
be allowed to relicense your contributions. My personal oath is to maintain inbound=outbound in my open source projects,
and the expectation is authors are responsible for their contributions.
I am following the the [Developer Certificate of Origin (DCO)](https://developercertificate.org/), also available at
`DCO.txt`. The DCO is a way for contributors to certify that they wrote or otherwise have the right to license their
code contributions to the project. Contributors must sign-off that they adhere to these requirements by adding a
`Signed-off-by` line to their commit message, and/or, for frequent contributors, by signing off on their entry in
`MAINTAINERS.md`.
I am following the [Developer Certificate of Origin (DCO)](https://developercertificate.org/), reproduced below. The DCO
is a way for contributors to certify that they wrote or otherwise have the right to license their code contributions to
the project. Contributors must sign-off that they adhere to these requirements by adding a `Signed-off-by` line to their
commit message, and/or, for frequent contributors, by signing off on their entry in `MAINTAINERS.md`.
```
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
```
This process is followed by a number of open source projects, most notably the Linux kernel. Here's the gist of it:

34
DCO.txt
View File

@@ -1,34 +0,0 @@
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.

View File

@@ -1,15 +1,13 @@
SRC_FILES := $(wildcard ./src/*.scad)
SRC_FILES := $(filter-out ./src/all-together-demo.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/blown-up-demo.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/components.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/roundedcube.scad, $(SRC_FILES))
all: $(SRC_FILES)
mkdir -p ./build
for file in $^ ; do \
openscad -o $${file}.stl $${file} ; \
mv $${file}.stl ./build/ ; \
done
zip ./build/buildable-stick-system-`git describe --dirty`-stls.zip ./build/*
all:
python build.py
mkdir -p ./build/docs
cp ./README.md ./build/README.md
cp ./docs/README-objects.md ./build/README-objects.md
cp ./docs/* ./build/docs/
cp ./LICENSE ./build/LICENSE
cp ./CHANGELOG.md ./build/CHANGELOG.md
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls-and-docs.zip . -r; popd
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip extras frames misc panels -r; popd
clean:
rm -rf ./build

125
README.md
View File

@@ -1,17 +1,20 @@
# The Buildable Stick System
Files for 3D printing an arcade stick.
Files for 3D printing and building an arcade stick enclosure.
Have you ever wanted to conjure your own arcade stick out of the ether (well, plastic), or to prototype a new layout or
design before sending it to a custom builder? Do you just love having your space filled with arcade stick enclosures,
because you keep making different variants, colorways, and so on? Or do you simply want a good stick on the cheap, and
know someone or a library with a 3D printer? The Buildable Stick System may be the project for you!
**Join the project IRC channel: [#buildable-stick-system @
Randomus](https://webirc.randomus.net/#buildable-stick-system)!**
![An example of stick components displayed in OpenSCAD](docs/blown-up-demo.png)
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
![A photo of a completed stick](docs/finished-v4.1.jpg)
![A photo of a completed stick](docs/finished-v4.4.jpg)
[Photo of a completed inset panel-based stick.]
@@ -30,29 +33,49 @@ starting with an existing object and constructing what you'd like with new or ex
## Usage of Parts
There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help
about when/how to use specific parts:
about what the types of parts are and how to use them:
* `panel-inset` --- these fit flush into a frame, creating a closed box enclosure.
* `panel-overhang` --- these have a tray that fits into a frame with the actual face extending beyond the frame,
creating an ice cream sandwich enclosure.
* These also yield a bit more space inside the box, for tall levers or whatever.
* `frame` (non-pieces) --- these create the box of the enclosure, as one part. These can be hard to print well ---
shrinkage forces tend to curl up the corners no matter what you do, and some points need supports --- but if you don't
care about that because you're printing an ice cream sandwich, they are simpler than...
* `frame-piece` --- these break up the frame box into four faces, and are held together by friction fit and the hex
bolts. This is more stable than you might expect, but it does introduce some variability in the overall sturdiness of
the enclosure compared with the frame as one box piece.
* The `interconnect` replaces the need to bolt multiple frames together.
* `frames/`
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
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
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
* `pieces/` 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
lay them all face down on the print surface for better adhesion and surface patterns. There are also variants
here, the "windowed" pieces, for doing two-tone variants and that kind of thing. There are also frame walls pulled
out to create MCZ TE-style extended sides. There is an interconnect that stands in for the joined inner wall
between boxes of the overall unit. You need this if you are combining multiple sets of walls, e.g. for a
two-panel-long stick.
* `panels/`
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
top or bottom. Aside from using up a bit of the space for components inside the frame, come with no downsides ---
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
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
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
variants depending on where you put things.
* `misc/`
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
desired height. You don't *need* any of these, but you'll probably use a few.
* `extras/`
* 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.
* `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
in `docs/assembly-and-tips.md`.
## 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
OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple
weird things, in my experience.
My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives the models a bit more weight and
stability, but something like 2 wall loops, 15% grid sparse infill is fine and does not lead to a weak enclosure. The
costs below have been made against my settings.
OpenStickCommunity. Standard settings seem sufficiently sturdy, but see `docs/printing-and-materials.md` for more
thoughts and settings based on my tinkering with prints.
## Assembling
@@ -61,14 +84,14 @@ What you'll need beyond these objects:
* An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
* 4 M3 8mm hex bolts to secure the PCB to a panel
* Per frame and plate combo:
* Per frame and panel combo:
* 4 45mm M4 hex brass standoffs (or equivalent)
* 8 M4 countersunk hex bolts
* Overhang plates should use 12-16mm length bolts since they are taller
* Inset plates should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
* Overhang panels should use 12-16mm length bolts since they are taller
* Inset panels should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
too long to go flush
* If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
* Per frame connection point:
* Per frame connection point (only necessary if you are using complete frames and not frame pieces):
* 8 16mm M4 bolts
* 8 M4 flange nuts
* For a lever:
@@ -83,7 +106,7 @@ What you'll need beyond these objects:
## Rough Costs
This is a rough estimate of the cost to produce one of these sticks, assuming a usual 2-frame design and layout.
Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
Filament masses from Bambu Studio estimates, using Bambu PLA Basic, 20% gyroid infill and 3 wall loops.
* Left and right frame: **$10.42 USD** (208.50g each, as of 2024-02-22)
* Left and right (inset) top panels: **~$6.40 USD** (~128g each, as of 2024-02-22)
@@ -103,8 +126,8 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
stick anyway
* You can also use a shorter length with longer bolts, or combine multiple standoffs, if either of those yield better
prices
* 8 16mm M4 bolts to connect top plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
* 8 12mm M4 bolts to connect bottom plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
* 8 16mm M4 bolts to connect top panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
* 8 12mm M4 bolts to connect bottom panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
2023-09-12)
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
@@ -112,6 +135,16 @@ Board, ~$60 for Sanwa buttons and a lever, and ~$20 for miscellaneous connectors
full-featured controller with an open source foundation together for around $140. Reducing wall and infill settings
will probably save you around $5 of material, and you can probably decide what you want to do from there.
## FAQ
### I get a bunch of warnings on not being able to include files when I open them in OpenSCAD, what do I do?
OpenSCAD pathing is relative to the current working directory by default, which is probably not the `src/` directory.
When you start OpenSCAD, you must either start it from inside the project's `src/` directory, or point it at the path to
the source files via e.g. `OPENSCADPATH=path/to/buildable-stick-system/src/ openscad`.
See <https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Include_Statement>.
## Miscellany
See the `/docs/` directory for more thoughts too scattered for this document.
@@ -138,6 +171,23 @@ to hang out and discuss issues and features and whatnot.
## Attribution
### Author and Licensing
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
later version.
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
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/>.
### 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
@@ -145,16 +195,19 @@ by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright
Made possible by the amazing efforts of [slagcoin](https://www.slagcoin.com/).
## Author and Licensing
### Distributing BSS Sticks
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is
a bit of a gray area for physical objects, but likely applies to distribution of modified or unmodified STL, STEP, etc.
files at a minimum. The easiest way to satisfy the GPLv3 in either situation is to provide a link to the source code
(either the unmodified mainline project, or your copy, with modifications listed in a "prominent notice"); something
like the below should suffice in either electronic or printed form:
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
version.
> This arcade stick is part of the Buildable Stick System, version X.Y.Z; the source code to this program is available
> under the terms of the GNU General Public License, at [LINK].
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
## Gallery
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/>.
More photos.
![A photo of three completed sticks](docs/finished-v4.7-x3.jpg)

View File

@@ -4,4 +4,8 @@ Notes for "next time".
## v4.x
* Engraving some cosmetic stuff? Or maybe a place to mount other plates?
* Engraving some cosmetic stuff? Or maybe a place to mount other plates on the top?
## v5
* Finishing the build123d rewrite?

4
attic/README.md Normal file
View File

@@ -0,0 +1,4 @@
# The Attic
This directory includes abandoned pieces that I'd like to revisit some time, but I cannot support or recommend using
as-is. Print at your own caution, or better yet, maybe fix them!

View File

@@ -0,0 +1,68 @@
/*
* A stick mount that fits rectangular (non-extended) BSS sticks.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <../parameters.scad>
include <../components.scad>
holder_x = 114;
holder_y = 60;
holder_z = 45;
tall_holder_post = frame_y-10;
module stick_holder() {
difference() {
cube([holder_x, holder_y, holder_z], center=true);
translate([14, 0, 132]) rotate([90, -40, 0]) frame_solid();
}
}
module mount() {
difference() {
union() {
// lowest post
translate([62, -frame_z-25, holder_z/2]) stick_holder(); // top = 45
// middle post
translate([0, 0, ((tall_holder_post)/2)/2])
cube([holder_x, holder_y, (tall_holder_post)/2], center=true);
translate([0, 0, ((tall_holder_post)/2)+holder_z/2]) stick_holder(); // top = 139
// highest post
translate([-62, frame_z+25, tall_holder_post/2])
cube([holder_x, holder_y, tall_holder_post], center=true);
translate([-62, frame_z+25, tall_holder_post+holder_z/2]) stick_holder(); // top = 233
// post stabilizers
translate([31, -41, holder_z/2]) cube([52, 23, holder_z], center=true);
translate([-31, 41, ((tall_holder_post/2)+holder_z)/2])
cube([52, 23, (tall_holder_post/2)+holder_z], center=true);
// base
hull() {
translate([110, 103, -2.5]) cylinder(r=15, h=5, center=true);
translate([110, -103, -2.5]) cylinder(r=15, h=5, center=true);
translate([-110, 103, -2.5]) cylinder(r=15, h=5, center=true);
translate([-110, -103, -2.5]) cylinder(r=15, h=5, center=true);
}
// placard
translate([0, -112, 15]) cube([frame_y, 5, 30], center=true);
/* // test */
/* translate([62+14, -frame_z-25, 132+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
/* translate([14, 0, 132+(frame_y/2)-20+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
/* translate([-62+14, frame_z+25, 132+tall_holder_post+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
}
// text on the placard
translate([-frame_z*3.3/2.5, -holder_x, 15]) rotate([90, 0, 0])
linear_extrude(1) text("Buildable Stick System", font="Noto Sans");
translate([-frame_z*3.3/2.5, -holder_x, 4]) rotate([90, 0, 0])
linear_extrude(1) text("v4 by bss", font="Noto Sans", size=6);
}
}
mount();

52
build.py Normal file
View File

@@ -0,0 +1,52 @@
"""Compile all OpenSCAD files into a build directory and package it with docs.
(a.k.a.: "make is hard"
SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
SPDX-License-Identifier: GPL-3.0-or-later
"""
import os
import os.path
import re
import subprocess
PROJECT_ROOT = os.path.abspath(os.getcwd())
BUILD_DIR = os.path.join(PROJECT_ROOT, 'build/')
SOURCE_DIR = os.path.join(PROJECT_ROOT, 'src/')
EXCLUDES = ['components.scad', 'parameters.scad']
# set up our environment to point openscad at the right stuff
os.environ['OPENSCADPATH'] = SOURCE_DIR
# track processes to wait on
processes = []
os.chdir(SOURCE_DIR)
for root, dirs, files in os.walk('.'):
print(f"{root} {dirs} {files}")
# make the current directory so that openscad can write stuff into it
try:
os.makedirs(os.path.join(BUILD_DIR, root))
except FileExistsError:
pass
input_dir = os.path.join(SOURCE_DIR, root)
output_dir = os.path.join(BUILD_DIR, root)
for file in files:
if not re.match(r'.*\.scad$', file):
continue
if file in EXCLUDES:
continue
stl_file = re.sub(r'\.scad$', '.stl', file)
input_ = os.path.join(input_dir, file)
output = os.path.join(output_dir, stl_file)
cmd = f'openscad --hardwarnings -o {output} {input_}'
print(cmd)
processes.append(subprocess.Popen(cmd.split(' ')))
for process in processes:
process.wait()
if process.returncode != 0:
raise Exception(f"building {process.args} failed")

View File

@@ -0,0 +1,36 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/side-trapezoid.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <frames/pieces/front-or-back-windowed-horiz-stripes.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-nine-plus-aux-button-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#8E9089";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_aux_button_with_mount();
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]) side_trapezoid_frame_piece();
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_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_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_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(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -0,0 +1,37 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel-with-oled.scad>
use <panels/inset/sega-2p-nine-plus-aux-button-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
top_panel_color = "#0086D6";
bottom_panel_color = "white";
frame_front_color = "white";
frame_back_color = "white";
frame_side_color = "yellow";
top_deco_color = "white";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel_with_oled();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_aux_button_with_mount();
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]) side_trapezoid_extended_to_front_frame_piece();
color(frame_front_color) translate([-frame_x/2+4, 0, -2.5]) front_or_back_trapezoid_frame_piece();
color(frame_front_color) translate([frame_x/2-4, 0, -2.5]) front_or_back_trapezoid_frame_piece();
color(frame_back_color) translate([-frame_x/2+4, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(frame_back_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(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]) rotate([180, 0, 0]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.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-sega-2p-6-button-panel-with-aux-with-mount.scad>
use <misc/dustwasher-jlf.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
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(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]) side_trapezoid_extended_to_front_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_frame_piece();
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();

View File

@@ -0,0 +1,35 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/side.scad>
use <frames/pieces/front-or-back.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/sega-2p-nine-plus-aux-button-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
panel_color = "red";
base_color = "gray";
top_deco_color = "white";
brace_color = "gray";
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/2+0.001]) sega_2p_nine_plus_aux_button_with_mount();
color(base_color) translate([panel_x/2, 0, 0]) rotate([0, 180, 0]) side_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) side_frame_piece();
color(base_color) translate([panel_x/2, 0, 0]) front_or_back_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) front_or_back_frame_piece();
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, 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, 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();

34
demo/blown-up-demo.scad Normal file
View File

@@ -0,0 +1,34 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/interconnect.scad>
use <frames/pieces/side.scad>
use <frames/pieces/front-or-back.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/right-sega-2p-nine-plus-aux-button-with-mount.scad>
use <panels/overhang/left-or-right-panel.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
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_nine_plus_aux_button_right_overhang_panel_with_mount();
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_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_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_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") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) rotate([0, 0, 180])
left_or_right_overhang_panel();
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([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();

49
docs/README-objects.md Normal file
View File

@@ -0,0 +1,49 @@
# The Buildable Stick System
Files for 3D printing an arcade stick. See `README.md` for the core documentation, this file is specific to distributed
objects.
## Attribution
### Author and Licensing
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
These arcade stick parts are from the Buildable Stick System; the source code to this program is available under the
terms of the GNU General Public License, at:
* <https://github.com/bsstephan/buildable-stick-system>, or
* <https://git.incorporeal.org/bss/buildable-stick-system>
See the tags/releases for the version of the source code corresponding to the STLs you received.
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
later version.
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
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/>.
### 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
Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is
a bit of a gray area for physical objects, but likely applies to distribution of modified or unmodified STL, STEP, etc.
files at a minimum. The easiest way to satisfy the GPLv3 in either situation is to provide a link to the source code
(either the unmodified mainline project, or your copy, with modifications listed in a "prominent notice"); something
like the below should suffice in either electronic or printed form:
> This arcade stick is part of the Buildable Stick System, version X.Y.Z; the source code to this program is available
> under the terms of the GNU General Public License, at [LINK].

View File

@@ -1,19 +1,72 @@
# 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.
## Removing Inset Panels
## Parts for a Basic Enclosure
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.
The pieces you need to print (all colors to your taste):
You can instead use the reverse side and the hex standoffs to push a panel out, as so:
* **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.
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.
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
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.
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
installation while the pieces are free.
1. You could also do the decorative plates and related buttons, but it might be just as well to leave those for step 7,
just to make sure the buttons don't get in the way of other buttons or a lever or so on.
2. Start the top panels: you want both to get the components installed now when it's easy, and to make sure that the
overall assembly works with your components, so again get your buttons, lever, etc., in place. You can secure them at
this point.
1. If you are using a button decorative plate that spans two panels --- e.g.
`misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as tightly
as possible, and accurately, as they will be hard to adjust once everything is secured and in the frame.
2. If using a lever, don't forget the lever mount spacer --- `misc/lever-mount-sanwa-seimitsu` --- if you want it,
and tighten those mounting bolts now as well.
3. Create the frame box by combining your frame piece parts, box or extended, together. This will be relatively stable
just via friction fit.
4. Rest the frame top-up on a desk, and put the standoffs through the holes. This will probably be tight, and you may
even need a rubber mallet or similar to drive the standoffs through the holes.
5. Insert the top panels into the frame.
6. Insert the bolts for the top panels, make any last adjustments, and tighten them.
7. At this point you have an open box with access to all your components. Do all of your wiring.
1. Tighten the buttons and etc. if you didn't in step 2.
8. Insert the bottom panels into the frame.
9. Insert the bottom bolts for the bottom panels, and tighten them.
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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 66 KiB

BIN
docs/finished-v4.2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

BIN
docs/finished-v4.4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

BIN
docs/finished-v4.7-x3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

View File

@@ -1,25 +0,0 @@
# Materials
bss's random thoughts and notes on 3D printing materials.
## Bambu Lab PLA
### Basic
* In general, nice texture, but under direct light, you can see a bit of the infill pattern through the walls. Not super
distracting, but it's there.
#### White
* Walls are practically translucent, you can almost always see the infill. Do not use for major components.
* Looks perfectly good for thin things like the Neutrik plates, decorative pieces, that kind of thing.
### Matte
* I don't like the texture as much, but they do produce nice non-primary color colorways, and you don't see the infill.
* Seems like their plastic treatment leaves some plate residue, so be better about cleaning it or you'll get ghosts.
## Hatchbox PLA
* **Blue:** very blue. Wife likes it.
* **White:** more opaque than the Bambu PLA mentioned above, makes a pretty decent (still slightly translucent) frame.

View File

@@ -0,0 +1,88 @@
# Printing and Materials
bss's random thoughts and notes on the actual printing of the Buildable Stick System.
## Printing Settings
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
not lead to a weak enclosure.
### Supports and Positioning
All of the parts are designed to be printed outside-face-down. The bevels are at an angle (45 degrees) that should print
fine with no supports. Make sure everything is aligned properly on your plate so that the flat face you will look at the
most is on the bottom.
The only exception to this is the interconnect piece(s), which are not visible and need a support to print. Maybe one
day I'll rejigger these.
### Working With Flatness
A lot of the pieces are long and flat, so I recommend really dialing in your printer settings. The frame pieces make
corner curling of the frame less of a problem, but you may still get it on the panels and the beveled frame pieces.
#### Bottom Layer Notes
Considering the visible layer (usually, the bottom layer) pattern is ideal. Monotonic prints fast but creates long,
uniform lines that create reflection patterns on long, flat surfaces. This can be especially distracting for the top
panels and their decorative plates, since they're what you're looking at 90% of the time, and the holes break up a
perfect pattern, making the long lines stand out even more.
Some specific parts are worth some additional notes:
* **Top panels:** using a non-uniform pattern reduces if not eliminates the problem of the surface catching the light,
but for some patterns, it may come at the expense of time.
* **Avoid:** monotonic.
* **Good for the time:** Archimedean chords create the look of a circular ripple radiating out the center, and
depending on the material, you may not even notice it much, so it's a pretty good look/speed balance.
* **Great if you can wait:** hilbert curve leaves no discernable pattern on most materials, but some high gloss,
high contrast materials may show the winding pattern at some angles --- consider Archimedean chords for these.
* **Circle-centric decorative plates:** simple ones could be fine in whatever, but the ones for action buttons end up
having lots of weird interaction points.
* **Avoid:** none; monotonic doesn't look *good*, but the plates don't have enough surface area for the pattern to
stand out too much.
* **Decent:** concentric is generally good, but you can get some pitting when the pattern radiating away from
buttons collides with other patterns, because none of the geometry lines up well.
* **Great:** Archimedean chords, just crank up the infill/wall overlap to avoid pits on the edges.
* **Frame walls with Neutrik or aux button cutouts:** a reduced but similar problem with the action button decorative
plates, the circles near each other create weird interactions with the walls.
* **Avoid:** concentric, again, has problems with pitting where geometries clash.
* **Decent:** monotonic is pretty decent here, and you probably won't look at the sides too much, so maybe it
doesn't bother you.
* **Great:** Archimedean chords again, with the same infill/wall overlap as decorative plates.
* **Flush frame walls:** you can pretty much do whatever you like here.
* **Great:** concentric produces an interesting pattern and you won't have collision problems in a rectangle.
* **Essentially great:** Archimedean chords yet again, you may just not like the pattern as much as the end result
of concentric.
The Archimedean chord pattern is a good default and prints awesome parts, with the only exception being the top panels,
which benefit from using a Hilbert curve initial layer pattern instead, though you may be happy enough with Archimedean
chord.
## Materials
Some notes on PLA brands, usages, etc.
### Bambu Lab PLA
#### Basic
* In general, nice texture, but under direct light, you can see a bit of the infill pattern through the walls. Not super
distracting, but it's there.
##### White
* Walls are practically translucent, you can almost always see the infill. 3 wall loops and a varying infill pattern
definitely help here.
* Looks perfectly good for thin things like the Neutrik plates, decorative pieces, that kind of thing.
#### Matte
* I don't like the texture as much, but they do produce nice non-primary color colorways, and you don't see the infill.
* Seems like their plastic treatment leaves some plate residue, so be better about cleaning it or you'll get ghosts.
### Hatchbox PLA
* **Blue:** very blue. Wife likes it.
* **White:** more opaque than the Bambu PLA mentioned above, makes a pretty decent (still slightly translucent) frame.

View File

@@ -1,27 +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 <frame-left.scad>
use <frame-right.scad>
use <top-panel-overhang-left-lever-and-dir_arc-plus-w-30mm.scad>
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
use <bottom-panel-overhang-left.scad>
use <bottom-panel-overhang-right.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-dustwasher-lsx-nobi.scad>
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) top_panel_left_lever_and_dir_arc_w_30mm();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) top_panel_right_sega_2p_plus_one_plus_control_with_mount();
color("black") translate([-frame_x/2+5-25, 0, -2.5]) left_frame();
color("black") translate([frame_x/2+25, 0, -2.5]) right_frame();
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) bottom_panel_left();
color("#C12E1F") translate([panel_x/2+25, 0, -5-frame_z/2-75]) bottom_panel_right();
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([-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();

View File

@@ -1,14 +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 <bottom-panel-overhang-left.scad>
module bottom_panel_right() {
rotate([0, 0, 180]) bottom_panel_left();
}
bottom_panel_right();

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);
}
module m6_hole() {
cylinder(r=m6_bolt_radius, h=100, $fn=50, center=true);
}
module panel_holes() {
// holes for mount bolts
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) m4_hole();
@@ -27,27 +31,25 @@ module panel_holes() {
// button hole, with extra wide bits for various uses (cutting out space
// for snap-ins, etc.
module button_24mm_hole() {
cylinder(r=small_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 29.5mm, so radius+3 to leave some space
cylinder(r=small_button_radius, h=100, $fn=100, center=true);
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=small_button_radius+3, 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
translate([0, 0, 50]) cylinder(r=small_button_radius*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=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=100, center=true);
}
// button hole, with extra wide bits for various uses (cutting out space
// for snap-ins, etc.
module button_30mm_hole() {
cylinder(r=big_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 36mm, so radius+6 to leave some space
cylinder(r=big_button_radius, h=100, $fn=100, center=true);
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+6, 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
translate([0, 0, 50]) cylinder(r=big_button_radius*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=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=100, center=true);
}
module frame_hex_bolt_hole() {
@@ -55,7 +57,7 @@ module frame_hex_bolt_hole() {
}
module frame_interchange_hole() {
cylinder(r=18, h=50, $fn=4, center=true);
cylinder(r=37, h=50, $fn=50, center=true);
}
module neutrik_d_hole() {
@@ -79,9 +81,10 @@ module rocker_20mm_mount() {
translate([-9.5, -12, 0]) neutrik_d_screw_hole();
}
// space for a neutrik D mount or 24mm button - Z is to cut the whole inside without affecting panel lip
// space for a neutrik D mount or 24mm button --- Z is meant to leave some lip now that frames
// are primarily printed on their side
module frame_cutout() {
cube([30.5, 8, frame_z-(panel_z*2)], center=true);
cube([35, 8, frame_z-(panel_z*3)], center=true);
}
// bank of three 24mm buttons, commonly on a frame face
@@ -91,6 +94,12 @@ module aux_control_three_button_cluster() {
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() {
difference() {
cylinder(r=m2_screw_selftap_radius*2.25, h=3, $fn=6, center=true);
@@ -98,16 +107,24 @@ module m2_mount_post() {
}
}
module oled_ssd1306_mount() {
translate([11.5, 12, 0]) m2_mount_post();
translate([11.5, -12, 0]) m2_mount_post();
translate([-11.5, 12, 0]) m2_mount_post();
translate([-11.5, -12, 0]) m2_mount_post();
module adafruit_pid_326_oled_ssd1306_mount_post() {
cylinder(r=2.25/2, h=8, $fn=50, center=true);
}
module oled_ssd1306_mount_cutout() {
translate([0, 1.9, 0]) cube([25, 14, 5], center=true);
translate([0, 0, -1.0]) cube([35, 35, 4], center=true);
// aligned to the cutout below
module adafruit_pid_326_oled_ssd1306_mount() {
translate([12, 13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([12, -13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([-12, 13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([-12, -13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
}
module adafruit_pid_326_oled_ssd1306_mount_cutout() {
translate([0, 3.5, 0]) cube([ssd1306_x, ssd1306_y, panel_z+0.1], center=true);
translate([0, 0, -ssd1306_z/2]) cube([adafruit_pid_326_oled_ssd1306_cutout_x,
adafruit_pid_326_oled_ssd1306_cutout_y, panel_z-ssd1306_z+0.1], center=true);
translate([0, 0, -ssd1306_z/2-2]) cube([adafruit_pid_326_oled_ssd1306_cutout_x*3/2,
adafruit_pid_326_oled_ssd1306_cutout_y/2, panel_z/2+0.1], center=true);
}
module m3_mount_post() {
@@ -164,36 +181,7 @@ module levermountcountersinks() {
}
module base_panel() {
difference() {
union() {
cube([panel_x, panel_y, panel_z], center=true);
// add posts that sink into the frame, just to give
// a somewhat more sturdy/tight connection
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
}
// the posts mentioned above need space for the actual hex bolts
// used in connecting to the frame
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
}
}
module base_bottom_panel() {
mirror([0, 0, 1]) base_panel();
cube([panel_x, panel_y, panel_z], center=true);
}
module panel() {
@@ -203,13 +191,6 @@ module panel() {
}
}
module bottom_panel() {
difference() {
base_bottom_panel();
mirror([0, 0, 1]) panel_holes();
}
}
module overhang_plate() {
top_points = [
// top bevel
@@ -260,7 +241,7 @@ module panel_with_raised_overhang() {
}
}
module frame_box() {
module frame_solid() {
difference() {
top_points = [
// top bevel
@@ -301,15 +282,21 @@ module frame_box() {
];
hull() {
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) {
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) {
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
translate(p) cylinder(r=2, h=frame_bevel_height, center=true, $fn=4);
}
}
}
}
module frame_box() {
difference() {
frame_solid();
// cut out the middle to make it a box
cube([panel_x-(panel_support_width*2), panel_y-(panel_support_width*2), frame_z+5], center=true);
}
@@ -319,7 +306,11 @@ module frame_mount_column() {
cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true);
// add some corners back to do a lame chamfer
linear_extrude(height=frame_z, center=true)
polygon([[10, 10], [-20, 10], [10, -20]]);
polygon([
[frame_mount_column_width/2, frame_mount_column_width/2],
[-frame_mount_column_width, frame_mount_column_width/2],
[frame_mount_column_width/2, -frame_mount_column_width]
]);
}
module side_chopper() {
@@ -340,7 +331,8 @@ module frame_connection_holes() {
}
module frame_cable_routing_hole() {
translate([frame_x/2, 0, 0]) rotate([0, 90, 0]) frame_interchange_hole();
// frame_y/12 is a hack for "kinda a bit above the center point"
translate([frame_x/2, frame_y/12+1, 25]) rotate([0, 90, 0]) frame_interchange_hole();
}
module base_frame() {
@@ -355,24 +347,30 @@ module frame() {
difference() {
base_frame();
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) bottom_panel();
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_panel();;
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
// slightly larger holes than the posts in the base_panel
translate([panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
}
}
/* MISC SHAPES --- for cutting out decorative panels, frame wall windows, etc. */
// for cutting out slashes from the frame outer wall
module slash_cutout() {
polyhedron([
[slash_inner_displacement/2, -wall_cutout_depth, -slash_height/2],
[(slash_inner_displacement/2+slash_width), -wall_cutout_depth, -slash_height/2],
[(slash_inner_displacement/2+slash_width), wall_cutout_depth, -slash_height/2],
[slash_inner_displacement/2, wall_cutout_depth, -slash_height/2],
[-(slash_inner_displacement/2+slash_width), -wall_cutout_depth, slash_height/2],
[-slash_inner_displacement/2, -wall_cutout_depth, slash_height/2],
[-slash_inner_displacement/2, wall_cutout_depth, 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]]);
}
/* LAYOUTS */
// Directional Arc (both hands)
@@ -416,24 +414,40 @@ module dir_arc_plus_w_24mm_8_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)
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() {
translate([0, 57.2, 0]) dir_arc_30mm_thumb_button();
translate([-33.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button();
translate([-33.8-34.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button();
dir_arc_30mm_fingers_left_button();
dir_arc_30mm_fingers_middle_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() {
dir_arc_30mm_thumb_button();
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() {
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)
@@ -460,27 +474,43 @@ module noir_plus_one() {
// Sega Astro City 2P (right hand)
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() {
// via slagcoin
sega_2p_p1();
translate([30.5, 11+9, 0]) sega_2p_p1();
translate([30.5+36, 11+9, 0]) sega_2p_p1();
translate([sega_2p_column_2_offset, 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([30.5, -19, 0]) sega_2p_p1();
translate([30.5+36, -19, 0]) sega_2p_p1();
translate([sega_2p_column_2_offset, -19, 0]) sega_2p_p1();
translate([sega_2p_column_3_offset, -19, 0]) sega_2p_p1();
}
module sega_2p() {
sega_2p_6_button();
translate([30.5+36+36, 11, 0]) sega_2p_p1();
translate([30.5+36+36, -19-9, 0]) sega_2p_p1();
translate([sega_2p_column_4_offset, 11, 0]) sega_2p_p1();
translate([sega_2p_column_4_offset, -19-9, 0]) sega_2p_p1();
}
module sega_2p_plus_one() {
sega_2p();
module sega_2p_nine_thumb_button() {
// just my guesstimate on this one
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() {
translate([-172, 32, 0]) dir_arc_24mm_directionals();
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,25 @@
/* 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() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) 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

@@ -0,0 +1,19 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <../parameters.scad>
include <../components.scad>
use <stand.scad>
module stand_base() {
difference() {
cube([frame_x, stand_y*2, 3], center=true);
translate([0, 0, 1.5]) rotate([180, 0, 0]) stand();
translate([-frame_x*0.4, 0, 1.5]) rotate([180, 0, 0]) stand();
translate([frame_x*0.4, 0, 1.5]) rotate([180, 0, 0]) stand();
}
}
stand_base();

29
src/extras/stand.scad Normal file
View File

@@ -0,0 +1,29 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <../parameters.scad>
include <../components.scad>
base_extra = 10;
back_extra_multiplier = 4.25;
rotation_alignment = 15;
module stand() {
difference() {
union() {
/* front lip piece */
translate([0, 0, stand_z/2]) cube([stand_x, stand_y, stand_z], center=true);
/* back supporting piece */
translate([0, (stand_y-rotation_alignment)/4, stand_z*back_extra_multiplier/2])
cube([stand_x, (stand_y+rotation_alignment)/2, stand_z*back_extra_multiplier], center=true);
/* base */
translate([0, 0, 0.5]) cube([stand_x+base_extra, stand_y+base_extra, 1], center=true);
}
/* cut out the actual frame solid */
translate([0, rotation_alignment, (frame_y/2)+7]) rotate([65, 0, 0]) frame_solid();
}
}
stand();

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 <frame-piece-bottom-left-or-right.scad>
module bottom_piece_wall() {
// get a slice of the piece, to use it in extruding
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-frame_bevel_height, 0])
bottom_left_or_right_frame_piece();
}
module bottom_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
linear_extrude(height=frame_bevel_height) bottom_piece_wall();
}
}
module extended_bottom_left_or_right_frame_piece() {
bottom_left_or_right_frame_piece();
translate([0, -frame_y/2+frame_bevel_height*2, 0]) rotate([90, 0, 0]) bottom_piece_extension();
}
extended_bottom_left_or_right_frame_piece();

View File

@@ -1,26 +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 <frame-left.scad>
module bottom_left_or_right_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// 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);
// ...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);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
bottom_left_or_right_frame_piece();

View File

@@ -1,24 +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 <frame-piece-top-left.scad>
use <frame-piece-bottom-left-or-right.scad>
module side_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
top_left_frame_piece();
bottom_left_or_right_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_frame_piece();

View File

@@ -1,26 +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 <frame-left.scad>
module top_left_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...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);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_left_frame_piece();

View File

@@ -1,26 +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 <frame-right.scad>
module top_right_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
right_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall and lip on the right
translate([frame_x/2-frame_wall/2, 0, 0])
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_right_frame_piece();

View File

@@ -24,9 +24,9 @@ module left_frame() {
frame_cable_routing_hole();
// aux button holes
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-35.25, 101.5, 0]) rotate([270, 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

View File

@@ -24,9 +24,9 @@ module right_frame() {
mirror([1, 0, 0]) frame_cable_routing_hole();
// aux button holes
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([35.25, 101.5, 0]) rotate([270, 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

View File

@@ -0,0 +1,28 @@
/*
* 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 front_or_back_aux_and_neutrik_frame_piece() {
difference() {
front_or_back_frame_piece();
// 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_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

@@ -0,0 +1,65 @@
/* The inner top/bottom wall of the frame, for being displayed through a windowed part.
*
* 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 mount_column_cutout() {
intersection() {
frame_mount_column();
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*5/8], center=true);
}
}
module front_or_back_inner_wall_frame_base_piece() {
difference() {
// 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_frame_piece();
// minus the outer wall
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)
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 180])
mount_column_cutout();
translate([panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 270])
mount_column_cutout();
}
}
module front_or_back_inner_wall_frame_piece() {
front_or_back_inner_wall_frame_base_piece();
// extend the outward face 2mm in order to have it cut deeper into the frame outer wall
translate([0, -(frame_y-frame_wall)/2, 0]) rotate([-90, 0, 0]) linear_extrude(height=2) projection()
translate([0, 0, 50]) rotate([90, 0, 0]) front_or_back_inner_wall_frame_base_piece();
}
// 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();

View File

@@ -0,0 +1,37 @@
/*
* 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 clean_front_or_back() {
difference() {
front_or_back_frame_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);
};
}
module bottom_piece_wall() {
// get a slice of the piece (before the bevel), to use it in extruding
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-(frame_wall-frame_bevel_height)*3/2, 0])
clean_front_or_back();
}
module bottom_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
linear_extrude(height=(frame_wall-frame_bevel_height)) bottom_piece_wall();
}
}
module front_or_back_trapezoid_frame_piece() {
clean_front_or_back();
translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) bottom_piece_extension();
}
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

@@ -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 <front-or-back.scad>
use <front-or-back-inner-wall.scad>
use <front-or-back-windowed-backslashes.scad>
module forwardslashes_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
// subtract slashes from the frame wall
mirror([0, 0, 1]) backslashes();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_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

@@ -0,0 +1,35 @@
/*
* 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_or_back_window() {
translate([0, -frame_y/2, 0])
cube([frame_x-frame_mount_column_width*3.5, (frame_wall+panel_support_width)*2,
frame_z-panel_z*3], center=true);
}
module windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
// subtract frame wall window
front_or_back_window();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_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

@@ -0,0 +1,25 @@
/*
* 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 <side.scad>
module front_or_back_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// include the whole bottom wall (including mount columns)
translate([0, -(frame_y/2)+(piece_width/2), 0])
cube([frame_piece_x_x, piece_width, frame_z], center=true);
// ...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);
}
}
}
front_or_back_frame_piece();

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <frame-piece-side.scad>
use <side.scad>
module interconnect_frame_half_piece() {
translate([frame_x/2-frame_wall, 0, 0]) difference() {

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

@@ -0,0 +1,43 @@
/* The inner side wall of the frame, for being displayed through a windowed part.
*
* 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 mount_column_cutout() {
intersection() {
frame_mount_column();
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*21/24], center=true);
}
}
module side_inner_wall_frame_base_piece() {
difference() {
// Z is scaled so that some part of the original part inner wall is retained
scale([1, 1, inner_frame_z_decorative_scale]) side_frame_piece();
// minus the outer wall
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)
translate([-panel_to_frame_point_x, panel_to_frame_point_y, inner_frame_z/2]) rotate([0, 0, 90])
mount_column_cutout();
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), -inner_frame_z/2]) rotate([0, 0, 180])
mount_column_cutout();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -inner_frame_z/2]) rotate([0, 0, 90])
mount_column_cutout();
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), inner_frame_z/2]) rotate([0, 0, 180])
mount_column_cutout();
}
}
module side_inner_wall_frame_piece() {
side_inner_wall_frame_base_piece();
// extend the outward face 2mm in order to have it cut deeper into the frame outer wall
translate([-(frame_x-frame_wall)/2, 0, 0]) rotate([0, 90, 0]) linear_extrude(height=2) projection()
translate([0, 0, 50]) rotate([0, -90, 0]) side_inner_wall_frame_base_piece();
}
side_inner_wall_frame_piece();

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

@@ -5,13 +5,16 @@
include <parameters.scad>
include <components.scad>
use <frame-piece-bottom-left-or-right-extended.scad>
use <frame-piece-side.scad>
use <frames/complete/left-frame.scad>
use <side.scad>
use <front-or-back-trapezoid.scad>
module side_and_bottom_frame_piece_wall() {
// get a slice of the pieces, to use it in extruding
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0])
side_frame_piece();
// 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();
projection(cut=true) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
}
@@ -23,7 +26,7 @@ module side_and_bottom_frame_piece_extension() {
}
}
module extra_extended_left_or_right_frame_piece() {
module side_trapezoid_extended_to_front_frame_piece() {
difference() {
side_frame_piece();
// chop off the old edge which is getting replaced with the extension
@@ -32,4 +35,4 @@ module extra_extended_left_or_right_frame_piece() {
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

@@ -5,12 +5,15 @@
include <parameters.scad>
include <components.scad>
use <frame-piece-side.scad>
use <frames/complete/left-frame.scad>
use <side.scad>
module side_frame_piece_wall() {
// get a slice of the piece, to use it in extruding
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0])
side_frame_piece();
// 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_frame_piece_extension() {
@@ -21,7 +24,7 @@ module side_frame_piece_extension() {
}
}
module extended_bottom_left_or_right_frame_piece() {
module side_trapezoid_frame_piece() {
difference() {
side_frame_piece();
// chop off the old edge which is getting replaced with the extension
@@ -30,4 +33,4 @@ module extended_bottom_left_or_right_frame_piece() {
translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension();
}
extended_bottom_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

@@ -0,0 +1,22 @@
/*
* 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>
use <side-windowed-backslashes.scad>
module forwardslashes_windowed_side_frame_piece() {
difference() {
side_frame_piece();
// subtract slashes from the frame wall
mirror([0, 0, 1]) backslashes();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_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

@@ -0,0 +1,23 @@
/*
* 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 windowed_side_frame_piece() {
difference() {
side_frame_piece();
// subtract frame wall window
translate([-frame_x/2, 0, 0])
cube([(frame_wall+panel_support_width)*2, frame_y-frame_mount_column_width*3.5,
frame_z-panel_z*3], center=true);
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_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

@@ -1,50 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates() {
difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([-panel_x/2, 0, -25]) {
hull() union() {
dir_arc_30mm_finger_buttons();
translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
}
}
translate([panel_x/2, 0, -25]) {
hull() sega_2p();
}
hull() {
translate([-panel_x/2, 0, -25]) dir_arc_30mm_thumb_button();
translate([panel_x/2, -19-9-11-19-9-11, -25]) sega_2p_p1();
}
difference() {
translate([-60, -8, 0]) cube(60, center=true);
translate([-98.35, -39.25, 0]) cylinder(h=50, r=48, $fn=50, center=true);
}
difference() {
translate([43.35, -10.30, 0]) cube(50, center=true);
translate([68.35, -35.30, 0]) cylinder(h=50, r=18, $fn=50, center=true);
}
difference() {
translate([-10, 55, 0]) cube(43, center=true);
translate([-5.15, 76.25, 0]) cylinder(h=50, r=27, $fn=50, center=true);
}
translate([-7, 0, 0]) cube(80, 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
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();

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,12 +4,13 @@
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad>
module button_24mm_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) button_24mm_hole();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) button_24mm_hole();
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

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
use <neutrik-d-plate.scad>
module aux_connectors_two_neutrik_cluster_decorative_plate() {
difference() {

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
use <neutrik-d-plate.scad>
module aux_control_three_button_cluster_decorative_plate() {
difference() {

View File

@@ -8,8 +8,8 @@ include <components.scad>
module dir_arc_plus_w_24mm_8_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) dir_arc_plus_w_24mm_8_button();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) dir_arc_plus_w_24mm_8_button();
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

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 decorative 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 <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() {
// get a 2mm slice of the bigger button cylinders
// get a 2mm slice of the jumbo decorative button cylinders
union() {
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, -70]) dir_arc_w_30mm();
translate([panel_x/2, 0, -70]) 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]) 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

@@ -0,0 +1,24 @@
/* 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 dir_arc_plus_w_30mm_plate_decorative_plate() {
difference() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([-panel_x/2, 0, -50]) dir_arc_w_30mm();
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();
}
}
dir_arc_plus_w_30mm_plate_decorative_plate();

View File

@@ -8,8 +8,8 @@ include <components.scad>
module dir_arc_plus_w_30mm_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) dir_arc_w_30mm();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) dir_arc_w_30mm();
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

View File

@@ -8,8 +8,8 @@ include <components.scad>
module sega_2p_6_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_6_button();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) sega_2p_6_button();
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

View File

@@ -0,0 +1,24 @@
/* 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() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([panel_x/2, 0, -50]) 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() {
difference() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([panel_x/2, 0, -50]) 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();

View File

@@ -6,15 +6,15 @@
include <parameters.scad>
include <components.scad>
module sega_2p_plus_one_decorative_plate() {
module sega_2p_nine_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_plus_one();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) 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([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 decorative button cylinders
translate([0, 0, -50]) 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() {
difference() {
cylinder(r=lever_plate_hole*decorative_radius_scale, h=2, $fn=50, center=true);
// 5.25 = 4.55 (diameter of shaft is 9.10mm) + .25 to let it take an angle
cylinder(r=4.8, h=2.1, $fn=50, center=true);
cylinder(r=jlf_dustwasher_radius, h=2, $fn=100, center=true);
cylinder(r1=jlf_shaft_inner_radius, r2=jlf_shaft_inner_radius+shaft_position_tolerance,
h=2.001, $fn=100, center=true);
}
}

View File

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

View File

@@ -0,0 +1,24 @@
/* Wrap a smaller width hex spacer with plastic to get it to fit in our standard post hole.
*
* Since the hex spacers can vary in width, you may have to adjust the inner dimensions
* to make this work right for your piece, but this worked right for mine. YMMV.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module small_m4_hole() {
scale([1, 1, 2]) cylinder(r=3.25, h=frame_z, $fn=6, center=true);
}
module m4_hex_spacer_sleeve() {
difference() {
resize([0, 0, 45]) frame_hex_bolt_hole();
small_m4_hole();
}
}
m4_hex_spacer_sleeve();

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
use <neutrik-d-plate.scad>
module neutrik_d_plate_24mm() {
difference() {

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
use <neutrik-d-plate.scad>
module rocker_plate_20mm() {
difference() {

View File

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

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <top-panel-inset-dir_arc-plus-w-30mm-plus-one.scad>
use <dir_arc-plus-w-30mm-plus-one-panel.scad>
module dir_arc_w_30mm_plus_one_panel_with_mount() {
dir_arc_w_30mm_plus_one_panel();

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <lever-and-dir_arc-plus-w-30mm-panel.scad>
module lever_and_dir_arc_w_30mm_panel_with_oled() {
difference() {
lever_and_dir_arc_w_30mm_panel();
translate([0, -(panel_y/2 - 22), 0]) adafruit_pid_326_oled_ssd1306_mount_cutout();
}
translate([0, -(panel_y/2 - 22), 0]) adafruit_pid_326_oled_ssd1306_mount();
}
lever_and_dir_arc_w_30mm_panel_with_oled();

View File

@@ -6,7 +6,7 @@
include <parameters.scad>
include <components.scad>
module top_panel_inset_lever_and_dir_arc_w_30mm() {
module lever_and_dir_arc_w_30mm_panel() {
difference() {
panel();
dir_arc_w_30mm();
@@ -15,4 +15,4 @@ module top_panel_inset_lever_and_dir_arc_w_30mm() {
}
}
top_panel_inset_lever_and_dir_arc_w_30mm();
lever_and_dir_arc_w_30mm_panel();

View File

@@ -0,0 +1,25 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module lever_and_sega_2p_6_button_panel_with_aux_with_mount() {
difference() {
union() {
panel();
translate([45, -58, -panel_z/2]) rotate([0, 0, 13]) pcb_mount();
}
translate([90, -25, 0]) sega_2p_6_button();
translate([-65, 5, 0]) union() {
levermountholes();
levermountcountersinks();
}
translate([17, 70, 0]) button_24mm_hole();
translate([-17, 70, 0]) button_24mm_hole();
}
}
lever_and_sega_2p_6_button_panel_with_aux_with_mount();

View File

@@ -5,7 +5,7 @@
include <parameters.scad>
include <components.scad>
use <top-panel-inset-lever.scad>
use <lever-panel.scad>
module lever_panel_with_mount() {
lever_panel();

Some files were not shown because too many files have changed in this diff Show More