137 Commits

Author SHA1 Message Date
05dab45152 fix the blown up demo and update it for the docs
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-22 13:40:01 -06:00
180b7deb9e update costs in the README based on new settings
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-22 13:40:01 -06:00
8987d403ce don't build another SCAD file I have locally for tinkering
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-22 13:40:01 -06:00
44a238f454 move the lever mount spacer out of the panels, into separate part
this has two effects:

1. thinner and thicker spacers could be printed to accommodate
   preferences without having to reprint panels
2. I'm still testing this a bit, but by not having the spacer and panel
   be the same (partially hollow) part, I think the lever clickiness is
   a bit more pleasing to the ear

the second point is entirely arbitrary, so the first point is the real
benefit, despite me trying this because of the second

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-22 13:40:01 -06:00
ed031b9308 create 2mm of additional frame bottom
this is for the bottom panels to go flush against; without it, there's a
visible gap between the panel edge and the wall cutout space

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-22 13:40:01 -06:00
296e6da14b link to a couple presences in the README
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-19 23:35:26 -06:00
c0c9b9e1dc adjust how the lever mount is aligned to do the chopper right
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-19 11:14:14 -06:00
b7af797349 un-inset the bottom panels, the bottom is now flush
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-19 10:41:59 -06:00
dd3d77ae90 correct the hole for the panel-to-frame post
made it too small accidentally, which explains why I got test prints
stuck :p

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-19 10:33:16 -06:00
f90fc095e0 remove the bottom bevel to try to simplify the print
this just chops off the bottom entirely, essentially. this could be done
cleaner but this is the least disruptive change until I'm certain of it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-18 12:36:51 -06:00
f54aa989f7 bevel all the top edges of the frame
I didn't think I'd want this, but playing with it... yeah. it's a good
idea.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-18 10:31:14 -06:00
abc4577173 bevel the bottom of the frame
mostly an aesthetic choice, but I think it helps mitigate the look of
the front relative to the need to have the case be deeper for some
levers, so (I believe) it's not an arbitrary aesthetic choice.

also maybe there's some benefit to have it be slightly less flush on the
surface, IDK

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-16 12:25:17 -06:00
7b2289624e fix an old math mistake with the spacing of 24mm aux buttons
their cutout for the screw nut was giving too much space, which spread
them out too much on the frame walls. this should fix it, the nuts for a
Crown SDB-202 or a Seimitsu PS-14 still fit anyway

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-15 15:32:02 -06:00
15083f6787 adjust the top panel post holes to fit appropriately
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-14 14:33:10 -06:00
a5724209fe restore space for the hex bolts in the base panel frame posts
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-14 14:04:24 -06:00
78a43e41bc fix imports of the overhang panels following renames
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-12 20:17:18 -06:00
370aeb56c6 add posts to the top panels
trying to add more friction fit to the panel to frame connection point

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-12 20:17:10 -06:00
06c27bd4aa only round the sides, not the top/bottom, of the frame
trying to simplify the print again a bit, I think the roundedness is one
of the causes of prints lifting

since the top is now "sharp" (not that sharp in my printing practice,
but whatever), I added a bevel to the front in an attempt to make it a
bit more comfortable

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-12 20:02:35 -06:00
773433cd10 add a chamfer to the frame mount columns
should add a bit of structural strength without compromising much

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-11 19:27:27 -06:00
bad3c7628f grow the frame, remove the bottom panel basin
the bottom panel had a basin or tray to make room for taller levers,
namely the Seimitsu LSX-NOBI that I really like. per its specs, the
lever needs 43.70mm internally, and the old values were too tight (55mm
- 19mm from panels - 2mm from lever plate = 43) so the bottom panel was
arbitrarily given a sunken portion (somewhat arbitrarily 2.5mm) to
compensate at the time, because I already had frames printed.

adding 2mm to the frame Z covers the difference (57mm - 10mm - 2mm =
45mm) and thus we don't need the bottom panel hack anymore. I also
suspect the bottom panel basin was slightly affecting it structurally,
so this may help that.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-11 19:27:23 -06:00
6a1e1cc1f3 better component/parameter names to match panel naming
sed -i 's/top_plate/panel/g' *.scad
sed -i 's/plate_to_frame/panel_to_frame/g' *.scad

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-02-11 19:27:17 -06:00
3c8aa4e090 rename overhang panel files for clarity and sorting
Signed-off-by: Brian S. Stephan <bss@incorporeal.org
2024-02-06 19:19:37 -06:00
dac1073aa0 move the bottom plate with overhang into the only part that uses it
also that component *is* the part so it's easier to just reuse the part

Signed-off-by: Brian S. Stephan <bss@incorporeal.org
2024-02-06 19:19:35 -06:00
d3940c4109 s/topplate/panel/ --- just better naming
Signed-off-by: Brian S. Stephan <bss@incorporeal.org
2024-02-06 19:19:33 -06:00
53834363a6 add overhang amount to the chopper, to chop those properly too
Signed-off-by: Brian S. Stephan <bss@incorporeal.org
2024-02-06 19:19:31 -06:00
02993ab6a6 the overhang plates don't need the sunken tray
Signed-off-by: Brian S. Stephan <bss@incorporeal.org
2024-02-06 19:19:22 -06:00
543e31aec7 add an alternative top plate for buttons
this is a crazy one since I tried to fill the corners by hand.
interesting, but I don't know if I'm actually going to use it... but it
works so committing it

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-01-16 22:14:26 -06:00
438220466d modularize "directional arc" buttons a bit more
just for DRY purposes that I may or may not use

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-01-07 17:00:05 -06:00
97f69b9332 update SPDX headers in source files
license is still the same, this just saves duplicating the terms and
standardizes with what I've been doing elsewhere, style-wise

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-01-02 15:08:01 -06:00
b653815ef5 leave a TODO note for myself
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2023-12-28 13:55:32 -06:00
14150a3f04 add DCO and contributing information
this also serves as my signoff for future DCO contributions under
MAINTAINERS.md

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2023-12-18 12:54:53 -06:00
a0db9d9c3f add SPDX-License-Identifier: GPL-3.0-or-later to SCAD files
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2023-12-18 12:51:38 -06:00
abc35affea add a decorative plate for the neutrik + rocker mounts 2023-12-14 12:30:09 -06:00
feebf5a38d put the rocker mount holes in components, give the plate a better name 2023-12-13 13:50:24 -06:00
3ee8745d09 DRY: use neutrik_d_mount in the 24mm mount plate 2023-12-13 13:40:17 -06:00
99b03a3b48 parameterize the distance the neutrik holes are from center 2023-12-13 13:33:14 -06:00
20373cf856 make the side chopper based on the frame wall parameter 2023-12-13 09:24:09 -06:00
36231248b9 new decorative plate for the 3-button aux controls 2023-11-26 12:59:54 -06:00
62c804ed35 group the three 24mm buttons used in frames in one component
this is a bit cleaner/DRY, and also lets me experiment with a decorative
plate easily
2023-11-25 23:52:20 -06:00
769f184d1d update material notes a bit with Hatchbox white 2023-11-23 20:50:09 -06:00
f14c80d8a8 bring the frame Z back to 55mm, for taller levers
50mm - 10mm of panels was fine for some levers but not enough for the
LSX-NOBI, which I personally have a number of. I can't vet every lever
in existence, but I know at least that this was a problem that is solved
by adding 5mm, which seems like a fair trade and not a huge difference
in the final product.

this also helps the fact that at 40mm internal, some buttons + wiring
harnesses were getting pretty tight, mostly relevant at the frame
connection point where the inner bottom panel isn't a basin. this should
help that too.

additionally this has us go back to the 45mm M4 standoff recommendation,
which kinda sucks because it seems like 40mm are easier to find, but as
stated in the notes, the difference is somewhat negligible if you just
use 40mm with longer bolts.
2023-11-23 09:32:03 -06:00
ae40fd7289 break out tweakable parameters into a separate file
this allows for:

include <parameters.scad>
// override a variable such as
frame_z = 60;
include <components.scad>

which will let individual components tweak settings, e.g. the height of
a frame
2023-11-20 14:25:27 -06:00
9a5792580c add a comment that is all that survived some experimentation 2023-11-16 16:48:05 -06:00
524273369b correctly refer to the plate overhang as per edge 2023-11-16 09:02:43 -06:00
e7a8fc42ed correctly refer to the frame wall as per edge 2023-11-16 08:59:06 -06:00
bac99f6ea8 fix dustwashers by scaling them based on the plate hole 2023-11-14 23:56:03 -06:00
6a4980165d write down a thing to try if I ever get time 2023-11-10 15:49:45 -06:00
7d3b4c0a6c update notes on bolts/plate heights 2023-11-10 15:49:26 -06:00
f2efee40ee include a finished photo, this time of an inset-based stick 2023-11-10 15:49:14 -06:00
53ecd27047 convert decorative plates to scaling the base button rather than adding 2023-11-09 12:47:05 -06:00
544f4fb4ce cleanups to the decorative plates 2023-11-09 12:29:18 -06:00
b9d66a4a2f remove commented out code 2023-11-09 08:02:47 -06:00
696697f574 more inset panels, my normal 9+1 buttons 2023-11-09 07:52:05 -06:00
d2a1a5be13 scoot the dir arc in and up a bit
the horizontal move sends the dir arc closer to the edge, and the
vertical move puts the top back where it used to be before moving the
rest of the layouts down

both of these choices are entirely subjective
2023-11-08 18:38:06 -06:00
56f2214339 scoot the button layouts down a bit
this gives a bit more space at the front, mostly so that the decorative
plate doesn't hang over the edge of an inset panel
2023-11-08 18:37:02 -06:00
6fa474b748 update README, need 40mm spacers since chopping the bottom 2023-11-08 18:14:19 -06:00
e13946e883 inset panel for a lever + directionals + W 2023-11-07 14:39:36 -06:00
fbf0dc6896 allow the frame bottom to take insets/raised panels too
this complicates the print, in that now printing the frame requires
supports, but by cutting in on the bottom the same way as the top, we
can center some stuff better and also make the plates a bit more
interchangeable. this also eliminates the slightly unsightly bottom
panel hanging out in the open, so overall I think it's worth the
printing complication
2023-11-02 16:34:08 -05:00
538fb1430b add a dustwasher for JLF mounts 2023-10-26 18:09:41 -05:00
8025038db5 improve 24mm + W layout components, add decorative plate 2023-10-04 16:47:06 -05:00
11107fe826 add lever + 6 30mm button sega 2P layout panel
a bit tight but totally possible
2023-10-04 16:45:53 -05:00
4ec97b9f36 add components for an OLED cutout and panel using it 2023-10-04 16:44:59 -05:00
a960e57bd1 docs updates for v3 2023-09-17 11:33:49 -05:00
c67722d0da simple button outline for a single 24mm button 2023-09-17 11:29:31 -05:00
fa1f6927c5 new demo for v3 --- two panels 2023-09-17 11:28:56 -05:00
1da14d6dc3 remove stuff taken care of, bump engraving down again 2023-09-15 15:32:24 -05:00
0611e23975 keep some notes on filament while I'm at it 2023-09-15 15:30:10 -05:00
87db45df15 complete the cost estimation: total ~$26 for an enclosure 2023-09-15 15:20:17 -05:00
28809230bc sega 2p panel with a button for start or whatever 2023-09-15 15:03:49 -05:00
2253889430 remove unnecessary difference/union duplication 2023-09-15 15:01:39 -05:00
a26f87a9d2 fit an arcade layout in one panel 2023-09-13 21:17:45 -05:00
962402c291 new top panels for my current two-frame experiment
seems good so far
2023-09-13 20:46:00 -05:00
63c7113d9f more notes for next time 2023-09-12 23:52:32 -05:00
163dfc2c63 commit my new target assembly 2023-09-12 23:51:37 -05:00
aa633584e5 don't mirror, mostly duplicate the left frame components into right frame
doing a naive mirror meant the neutrik D mount holes were in the wrong
spot. fine for a 20mm + plate mount, but not good for any actual
component
2023-09-12 23:40:51 -05:00
767b38acef more TODO notes 2023-09-12 23:40:48 -05:00
56367369b7 more panel estimates 2023-09-12 20:19:43 -05:00
fa304606df generalize the top panel cost, they should all come in around this 2023-09-12 17:09:30 -05:00
5d5eb34f8a top panel cost for something like the lever + dir_arc panel 2023-09-12 13:03:35 -05:00
17ab4815a6 more cost estimate documentation 2023-09-12 10:36:15 -05:00
afd548f8d9 correct hardware notes, since v2 the M4 standoffs are 45mm 2023-09-12 10:14:45 -05:00
e2549694ea start estimating cost of build 2023-09-12 09:24:33 -05:00
2aab029905 use the same frame cutout for neutrik D and 24mm holes 2023-09-11 20:34:09 -05:00
0f11aacec4 un-rotate the solo frame now that X is longer 2023-09-11 20:28:33 -05:00
3f0712af70 try making the frame wider than it is deep
the goal is to try to fit a hitstick-w into two frames
2023-09-11 13:29:40 -05:00
51ba220a5a refer to proper parent filename 2023-09-11 12:01:27 -05:00
47d9a523c3 remove double translation of dir_arc-30mm layouts 2023-09-11 11:43:25 -05:00
3e74f3d915 refer to proper parent filename 2023-09-11 11:28:18 -05:00
cfb48574b2 change 30mm dir_arc layouts to be based on the thumb position
this will hopefully make some moving of stuff around a bit easier
2023-09-11 11:25:59 -05:00
36a96fbe26 tighten up the inner hole a bit, to no noticeable detriment 2023-09-11 10:37:46 -05:00
86ba641ba6 modularize the directional arc part of the 24mm all buttons layout
this was for a failed experiment, but it's probably good to do this
regardless
2023-09-11 10:37:43 -05:00
3d24dad1ae spread out the frame connection holes a bit 2023-09-11 09:56:52 -05:00
fe961e8a7e make neutrik D cutout bigger, simplifies that frame wall 2023-09-11 09:45:09 -05:00
28c0c0e475 properly and relatively position neutrik cutouts 2023-09-11 09:33:39 -05:00
2960151d98 remove more magic numbers, overhang relative to base frame stuff 2023-09-08 14:08:40 -05:00
82d1913551 remove more magic numbers, top plate is a derivative of base frame dimensions 2023-09-08 13:53:51 -05:00
88fc53988e remove some magic numbers that are derived from base dimensions 2023-09-08 13:44:05 -05:00
f73c94be2f move the rotated top plate into something reusable 2023-09-08 13:17:04 -05:00
cd21b4dd0a remove unused import 2023-09-08 13:14:53 -05:00
7a71c8cd81 simple naming consistency change
sed -i 's/topplate_with_raised/top_plate_with_raised/' **/*.scad
2023-09-08 12:22:53 -05:00
350fc27285 break up the sega 2P layout into parts
messing with something that may never see the light of day, but no harm
in doing this
2023-09-08 12:15:46 -05:00
3b3b857568 build improvements, create zip file 2023-09-07 19:53:56 -05:00
fddb5d450e commit my scratch file since it's a good demo 2023-09-07 19:17:48 -05:00
0329dd2b3c make dustwasher hole a bit bigger to let the lever move 2023-09-07 19:12:20 -05:00
ee3dd23b36 another idea for next time 2023-09-07 11:02:00 -05:00
0e00f8d5d1 with the frame redesign, we can use 16mm M4s 2023-09-07 00:19:42 -05:00
b911a1b7c1 three section v2 render 2023-09-06 16:24:58 -05:00
ff19699d61 update TODO and README notes
no known issues!
2023-09-06 14:47:14 -05:00
8140d5e3a8 neutrik D base plate, also good as a cover 2023-09-06 14:44:54 -05:00
708122e510 dustwasher that fits the LSX-NOBI, maybe more 2023-09-06 11:30:52 -05:00
b704f158db start v3 TODO 2023-09-05 11:47:50 -05:00
5177090625 rename some misc files for consistency/sorting 2023-09-05 10:41:59 -05:00
679d3025fe decorative plate for a neutrik D mount
this is used for the outside of an ethercon, for instance
2023-09-03 09:56:53 -05:00
e68ffbfc7b decorative button surround plates for the top 2023-09-03 09:53:49 -05:00
ed3c5a1210 rename non-overhang panels accordingly 2023-09-01 15:54:55 -05:00
fbf919b764 bottom panels with overhang for left/right/middle 2023-09-01 15:50:31 -05:00
9881f6391e more top panel with overhang options
left/middle/right/solo is the overhang stuff, will need to rename the
inset ones at a later point
2023-09-01 13:39:48 -05:00
bfae2b093b create a top left (overhang) lever panel
this replaces the left-adjusted inset panel, which I didn't use anyway,
and starts normalizing the overhang panels more
2023-09-01 13:38:29 -05:00
43a036e17c consolidate button hole and wider cylinder into one object
nothing was materially using the non-snap-in cutout anymore (except for
the frame which wasn't updated since removing the bigger cutout
rectangle, so I fixed that), and I want to use it for a template thing
I'm working on, so remove some cruft
2023-08-30 10:02:12 -05:00
3b964ee6d8 scoot the buttons in panels a bit closer to each other 2023-08-30 00:24:19 -05:00
fe0e3b6017 center the button panels and their layouts
I can refactor the double translation away at soem later point
2023-08-30 00:22:31 -05:00
16d3feadc1 use the larger concaveness from the overhang panel 2023-08-29 23:33:54 -05:00
1db6577f75 remove unused, unnecessary panel with no concave
rename bottom panels now that concave is normal
2023-08-29 23:33:51 -05:00
cd5cd422e5 rename side chopper, going to be used for more than just frames 2023-08-29 10:13:40 -05:00
652653180e go back to three neutrik D mounts on the solo frame
this (barely) works
2023-08-29 10:07:08 -05:00
73e93d4536 make a bottom overhang plate
slightly different than the top since there's no inset, so no need for
that frame or the posts
2023-08-29 10:06:21 -05:00
e51b79a193 squeeze dir. arc + W w/8 buttons on one panel
it's a tight squeeze; fits in the frame, but frame buttons/quick
connects maybe a problem
2023-08-28 10:51:07 -05:00
694e2c6173 bring 5 mm back to the frame
to accommodate quick connects, levers, etc.
2023-08-28 10:47:53 -05:00
a8ca6bafa9 fix the frame support box again
math is even harder when you're not using the right variables
2023-08-28 00:08:48 -05:00
cd71ed013b fix the frame box width, which was too thin bc math is hard 2023-08-27 15:17:24 -05:00
12273649f5 better name for the 24mm dir + 6 button panel 2023-08-27 14:36:34 -05:00
57be13d9cb more accurate name for the neutrik D plate 2023-08-26 22:12:07 -05:00
344de2c84f standalone frame, with tweaks to the frame as a consequence
* frame width has been reduced in order to leave more space and have
  sunken buttons somewhat accessible
* the cutout for neutrik mounts has been reduced and moved into the
  holes themselves, to do this more modularly and restore some support
2023-08-26 21:57:12 -05:00
a8d02f9229 squish a decent all buttons layout onto one panel
this uses the new raised panel look, I'm trying it out but haven't
updated the other top panels yet until I'm sure I like it --- it'll mean
a lot of chopping
2023-08-26 14:48:01 -05:00
af38f0a580 move top plate holes into reusable module 2023-08-26 14:42:58 -05:00
19fa31b425 a one-panel 24mm dir arc + action buttons layout
(you can fit 6! not bad!)
2023-08-25 15:36:41 -05:00
6ca57615e4 solve for 24mm/30mm snap-ins 2023-08-25 15:36:38 -05:00
70 changed files with 1418 additions and 544 deletions

35
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,35 @@
# Contributing Guidelines
The Buildable Stick System is made available under the GPLv3 (or later) license. Contributions are welcome via pull
requests. This document outlines the process to get your contribution accepted.
## Sign Offs/Custody of Contributions
I do not request the copyright of contributions be assigned to me or to the project, and I require no provision that I
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`.
This process is followed by a number of open source projects, most notably the Linux kernel. Here's the gist of it:
```
[Your normal Git commit message here.]
Signed-off-by: Random J Developer <random@developer.example.org>
```
`git help commit` has more info on adding this:
```
-s, --signoff
Add Signed-off-by line by the committer at the end of the commit log
message. The meaning of a signoff depends on the project, but it typically
certifies that committer has the rights to submit this work under the same
license and agrees to a Developer Certificate of Origin (see
http://developercertificate.org/ for more information).
```

34
DCO.txt Normal file
View File

@@ -0,0 +1,34 @@
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.

10
MAINTAINERS.md Normal file
View File

@@ -0,0 +1,10 @@
# Maintainers
This file contains information about people permitted to make major decisions and direction on the project.
## Contributing Under the DCO
By adding your name and email address to this section, you certify that all of your subsequent contributions to the
Buildable Stick System are made under the terms of the Developer's Certificate of Origin 1.1, available at `DCO.txt`.
* Brian S. Stephan (<bss@incorporeal.org>)

View File

@@ -1,11 +1,15 @@
SRCDIR = ./src SRC_FILES := $(wildcard ./src/*.scad)
all: $(SRCDIR)/* SRC_FILES := $(filter-out ./src/all-together-demo.scad, $(SRC_FILES))
mkdir -p build 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 \ for file in $^ ; do \
openscad -o $${file}.stl $${file} ; \ openscad -o $${file}.stl $${file} ; \
mv $${file}.stl build ; \ mv $${file}.stl ./build/ ; \
done done
zip ./build/buildable-stick-system-`git describe --dirty`-stls.zip ./build/*
clean: clean:
rm build/*.stl rm -rf ./build
rmdir build

View File

@@ -2,7 +2,13 @@
Files for 3D printing an arcade stick. Files for 3D printing an arcade stick.
![An example of stick components displayed in OpenSCAD](docs/three-panel-example.png) ![An example of stick components displayed in OpenSCAD](docs/blown-up-demo.png)
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
![A photo of a completed stick](docs/finished-v3.1.jpg)
[Photo of a completed inset panel-based stick.]
Originally an attempt to make a couple customized STL files for the [OpenStickCommunity Fightstick Originally an attempt to make a couple customized STL files for the [OpenStickCommunity Fightstick
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), the changes ballooned to fit my Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), the changes ballooned to fit my
@@ -22,6 +28,10 @@ These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what
OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple
weird things, in my experience. 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.
## Assembling ## Assembling
What you'll need beyond these objects: What you'll need beyond these objects:
@@ -30,29 +40,61 @@ What you'll need beyond these objects:
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board)) Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
* 4 M3 8mm hex bolts to secure the PCB to a panel * 4 M3 8mm hex bolts to secure the PCB to a panel
* Per frame and plate combo: * Per frame and plate combo:
* 4 40mm M4 hex brass standoffs * 4 45mm M4 hex brass standoffs (or equivalent)
* 8 12-16mm M4 countersunk hex bolts * 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
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:
* 8 25mm M4 bolts * 8 16mm M4 bolts
* 8 M4 flange nuts * 8 M4 flange nuts
* For a lever: * For a lever:
* 4 12-16mm M4 countersunk hex bolts * 4 12-16mm M4 countersunk hex bolts
* 4 M4 flange nuts * 4 M4 flange nuts
* For Neutrik D connections:
* 2 10mm M3 hex bolts
* 2 M3 flange nuts
* Buttons and levers as desired * Buttons and levers as desired
* Wiring as required * Wiring as required
### Issues and Limitations ## Rough Costs
This is a living repository, and as such, there are likely issues with the objects, known or otherwise. Be aware: 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.
* The top panel is 5mm tall and doesn't have an inset; snap-in buttons likely do not fit. * Left and right frame: **$10.42 USD** (208.50g each, as of 2024-02-22)
* A composition error made the frame 5mm shorter than intended and wasn't noticed until I printed everything: * Left and right (inset) top panels: **~$6.40 USD** (~128g each, as of 2024-02-22)
* Some levers don't have enough clearance in the case. * Left and right (non-overhang) bottom panels: **$6.80 USD** (135.99g each, as of 2024-02-22)
* Buttons with traditional quick connects are a *very* tight fit, you will probably need to bend pins. * Miscellaneous mounting plates, decorative plates, etc.: **~$1.83 USD** (~73g, as of 2024-02-22)
* The PCB mount position was very tight on the buttons panel; it will probably have to be moved. * 8 16mm M4 bolts to connect the frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of 2023-09-12)
* Support for the top plate was removed from the frame due to overhang issues, and now the top plate can bow slightly * 8 M4 flange nuts to connect the frames: **$0.68 USD** (you can get a pack of 100 on Amazon for $8.50, as of 2023-09-12)
with pressure; a new solution needs to be found. * 4 10mm M3 bolts to connect Neutrik D plates to frames: **$0.40 USD** (you can get a pack of 100 on Amazon for $10, as
of 2023-09-12)
* 4 M3 flange nuts to connect Neutrik D plates to frames: **$0.34 USD** (you can get a pack of 100 on Amazon for $8.50,
as of 2023-09-12)
* 8 45mm M4 spacers to connect panels to frames: **$2.40 USD** (you can get a pack of 10 on AliExpress for $3, as of
2023-09-12)
* You could 3D print these too, but you're probably better off with brass ones as they give some weight to the
stick anyway
* You can also use a shorter length with longer bolts, or combine multiple spacers, 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
2023-09-12)
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
Board, ~$60 for Sanwa buttons and a lever, and ~$20 for miscellaneous connectors and wiring --- you can put a
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.
## Miscellany
See the `/docs/` directory for more thoughts too scattered for this document.
## Issues and Limitations
This is a living repository, and as such, there are likely issues with the objects, known or otherwise.
These issues may be fixed in the future; see `TODO.md` for details. These issues may be fixed in the future; see `TODO.md` for details.
## Development and Contributing ## Development and Contributing
@@ -62,6 +104,13 @@ Improvements, variants, new layouts, novel ideas, and etc. are all welcome.
These files are suitable for previewing and rendering in OpenSCAD. They may also work in FreeCAD and perhaps other These files are suitable for previewing and rendering in OpenSCAD. They may also work in FreeCAD and perhaps other
software, but they are developed in OpenSCAD, so YMMV otherwise. software, but they are developed in OpenSCAD, so YMMV otherwise.
This project is hosted at [my personal Git site](https://git.incorporeal.org/bss/buildable-stick-system), but people are
more likely to want to interact with [the GitHub mirror](https://github.com/bsstephan/buildable-stick-system). Feel free
to use either.
You may find me at a number of places; I maintain an IRC channel, `#buildable-stick-system`, on [my IRC network,
Randomus](https://randomus.net/).
## Attribution ## Attribution
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick

21
TODO.md
View File

@@ -2,17 +2,14 @@
Notes for "next time". Notes for "next time".
## v2 ## v3.3
* Try not using roundedcube and instead bezel the top, to get cleaner seams everywhere else
## v4
* I need at least 5mm, maybe 10mm, more height, to fit some of my levers like the Nobi Bullet
* I couldn't even fit a JLF without the compensations in v1 on the bottom panel
* I had to bend the pins a bit on Crown SDB-202s, too
* Top plates are 1-2mm too thick for snap-ins, maybe have a variant with a couple shaved off like with the bottom plate
workaround
* The plates bow a bit on the top when pressure is applied, because there's no support from the frame up there ---
adding 5mm to the frame should leave a couple mm for support to get added back
* PCB mount on `top-panel-dir_arc-plus-w-30mm-plus-one-with-mount.scad` doesn't leave room for a USB cable on the right
hand side
* The panels' connection points could probably be a bit thinner to accommodate more bolts. A 20mm bolt barely clears the
two panels and I don't like that kind of bolt connection.
* Engraving some cosmetic stuff? Or maybe a place to mount other plates? * Engraving some cosmetic stuff? Or maybe a place to mount other plates?
* Try making it so top plates are bolted in from the side of the frame rather than the top
* I'm thinking of abandoning this, because it makes the frame more complicated to have a portion of a column rather
than the full column, but I'll keep it here for a bit longer
* Try making frames out of four pieces connected at joints on the hex posts, rather than one large piece?

BIN
docs/blown-up-demo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/finished-v3.1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

25
docs/materials.md Normal file
View File

@@ -0,0 +1,25 @@
# 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

27
src/blown-up-demo.scad Normal file
View File

@@ -0,0 +1,27 @@
/*
* 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,29 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
use <bottom-panel.scad>
module bottom_panel_concave() {
difference() {
bottom_panel();
translate([0, 0, top_plate_z/2]) cube([top_plate_x*2/3, top_plate_y*2/3, top_plate_z], center=true);
}
}
bottom_panel_concave();

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 <bottom-panel-overhang-solo.scad>
module bottom_panel_left() {
difference() {
bottom_panel_solo();
// chop the right edge off
side_chopper();
}
}
bottom_panel_left();

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 <bottom-panel-overhang-left.scad>
use <bottom-panel-overhang-right.scad>
module bottom_panel_middle() {
intersection() {
bottom_panel_left();
bottom_panel_right();
}
}
bottom_panel_middle();

View File

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

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

View File

@@ -1,25 +1,9 @@
/* Copyright Brian Stephan 2023 /*
* * SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* This file is part of the Buildable Stick System. * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*/ */
include <parameters.scad>
include <components.scad> include <components.scad>
module bottom_panel() {
mirror([0, 0, 1]) topplate();
}
bottom_panel(); bottom_panel();

View File

@@ -1,61 +1,10 @@
/* Copyright Brian Stephan 2023 /*
* * SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* This file is part of the Buildable Stick System. * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*/ */
include <roundedcube.scad> include <roundedcube.scad>
/* QUASI-CONSTANTS */
// adjustments
hole_tolerance = 0.15;
// M3
m3_screw_selftap_radius = 1.3;
// M4
m4_bolt_radius = 2 + hole_tolerance;
m4_bolt_countersink_radius = 6.1 + hole_tolerance;
m4_bolt_hex_exterior_radius = 3.6 + hole_tolerance;
// 24mm button
small_button_radius = 12 + hole_tolerance;
// 30mm button
big_button_radius = 15 + hole_tolerance;
// JLF mount dimensions
lever_mount_x = 53;
lever_mount_y = 95;
lever_mount_z = 2;
// case dimensions
frame_x = 183;
frame_y = 208;
frame_z = 45; // reminder: inside (including mounts) is chopped by top_plate_z for plates
top_plate_x = 175;
top_plate_y = 200;
top_plate_z = 5;
// neutrik D screw holes
neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance;
/* PARTS */
module m4_hole() { module m4_hole() {
cylinder(r=m4_bolt_radius, h=100, $fn=50, center=true); cylinder(r=m4_bolt_radius, h=100, $fn=50, center=true);
} }
@@ -64,12 +13,43 @@ module m4_hole_countersink() {
cylinder(r1=m4_bolt_radius, r2=m4_bolt_countersink_radius, h=3.2, $fn=50, center=true); cylinder(r1=m4_bolt_radius, r2=m4_bolt_countersink_radius, h=3.2, $fn=50, center=true);
} }
module button_24mm_hole() { module panel_holes() {
cylinder(r=small_button_radius, h=100, $fn=50, center=true); // holes for mount bolts
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) m4_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) m4_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) m4_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) m4_hole();
// holes for mount bolt countersinks
translate([panel_to_frame_point_x, panel_to_frame_point_y, 2]) m4_hole_countersink();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 2]) m4_hole_countersink();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 2]) m4_hole_countersink();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 2]) m4_hole_countersink();
} }
// 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
// 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);
// 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);
}
// button hole, with extra wide bits for various uses (cutting out space
// for snap-ins, etc.
module button_30mm_hole() { module button_30mm_hole() {
cylinder(r=big_button_radius, h=100, $fn=50, center=true); cylinder(r=big_button_radius, h=100, $fn=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
// 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);
// 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);
} }
module frame_hex_bolt_hole() { module frame_hex_bolt_hole() {
@@ -94,6 +74,44 @@ module neutrik_d_mount() {
translate([-9.5, -12, 0]) neutrik_d_screw_hole(); translate([-9.5, -12, 0]) neutrik_d_screw_hole();
} }
module rocker_20mm_mount() {
cylinder(r=10+hole_tolerance, h=5, $fn=50, center=true);
cube([2.2, 22, 5], center=true);
translate([9.5, 12, 0]) neutrik_d_screw_hole();
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
module frame_cutout() {
cube([30.5, 8, frame_z-(panel_z*2)-2], center=true);
}
// bank of three 24mm buttons, commonly on a frame face
module aux_control_three_button_cluster() {
translate([-37, 0, 0]) button_24mm_hole();
translate([0, 0, 0]) button_24mm_hole();
translate([37, 0, 0]) button_24mm_hole();
}
module m2_mount_post() {
difference() {
cylinder(r=m2_screw_selftap_radius*2.25, h=3, $fn=6, center=true);
cylinder(r=m2_screw_selftap_radius, h=3*2, $fn=50, center=true);
}
}
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 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);
}
module m3_mount_post() { module m3_mount_post() {
difference() { difference() {
cylinder(r=m3_screw_selftap_radius*4, h=8, $fn=6, center=true); cylinder(r=m3_screw_selftap_radius*4, h=8, $fn=6, center=true);
@@ -123,7 +141,7 @@ module levermountbase() {
// should work with JLF, JLW, LS-32, LS-33, LS-40, LS-55, LS-56 // should work with JLF, JLW, LS-32, LS-33, LS-40, LS-55, LS-56
module levermountholes() { module levermountholes() {
// joystick hole // joystick hole
cylinder(r=12, h=5.1, $fn=50, center=true); cylinder(r=lever_plate_hole, h=5.1, $fn=50, center=true);
// holes for joystick bolts // holes for joystick bolts
translate([20, 42.5, 0]) translate([20, 42.5, 0])
m4_hole(); m4_hole();
@@ -133,6 +151,9 @@ module levermountholes() {
m4_hole(); m4_hole();
translate([-20, -42.5, 0]) translate([-20, -42.5, 0])
m4_hole(); m4_hole();
}
module levermountcountersinks() {
// holes for joystick bolt countersinks // holes for joystick bolt countersinks
translate([20, 42.5, 2]) translate([20, 42.5, 2])
m4_hole_countersink(); m4_hole_countersink();
@@ -144,59 +165,123 @@ module levermountholes() {
m4_hole_countersink(); m4_hole_countersink();
} }
module base_topplate() { module base_panel() {
cube([top_plate_x, top_plate_y, top_plate_z], center=true); 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 topplate() { module base_bottom_panel() {
cube([panel_x, panel_y, panel_z], center=true);
}
module panel() {
difference() { difference() {
base_topplate(); base_panel();
// holes for mount bolts panel_holes();
translate([77.5, 90, 0]) }
m4_hole(); }
translate([77.5, -90, 0])
m4_hole(); module bottom_panel() {
translate([-77.5, 90, 0]) difference() {
m4_hole(); base_bottom_panel();
translate([-77.5, -90, 0]) mirror([0, 0, 1]) panel_holes();
m4_hole(); }
// holes for mount bolt countersinks }
translate([77.5, 90, 2])
m4_hole_countersink(); module overhang_plate() {
translate([77.5, -90, 2]) roundedcube([overhang_panel_x, overhang_panel_y, panel_z], center=true, radius=1);
m4_hole_countersink(); }
translate([-77.5, 90, 2])
m4_hole_countersink(); // this takes the base_panel and makes it a small frame, putting a larger top plate
translate([-77.5, -90, 2]) module base_panel_with_raised_overhang() {
m4_hole_countersink(); // make a frame out of the top plate (and keep the main plate on the center plane)
translate([0, 0, -5]) difference() {
base_panel();
cube([panel_x-(panel_support_width*2), panel_y-(panel_support_width*2), panel_z], center=true);
}
translate([panel_to_frame_point_x, panel_to_frame_point_y, -2.5]) resize([0, 0, 10])
frame_mount_column();
translate([-(panel_to_frame_point_x), panel_to_frame_point_y, -2.5]) resize([0, 0, 10])
rotate([0, 0, 90]) frame_mount_column();
translate([panel_to_frame_point_x, -(panel_to_frame_point_y), -2.5]) resize([0, 0, 10])
rotate([0, 0, 270]) frame_mount_column();
translate([-(panel_to_frame_point_x), -(panel_to_frame_point_y), -2.5]) resize([0, 0, 10])
rotate([0, 0, 180]) frame_mount_column();
overhang_plate();
}
module panel_with_raised_overhang() {
difference() {
base_panel_with_raised_overhang();
panel_holes();
} }
} }
module frame_box() { module frame_box() {
difference() { difference() {
roundedcube([frame_x, frame_y, frame_z], center=true, radius=3); top_points = [
cube([frame_x-26, frame_y-26, frame_z+5], center=true); // top part, majority of shape
[(frame_x/2)-3, (frame_y/2)-3, panel_z/2],
[-(frame_x/2)+3, (frame_y/2)-3, panel_z/2],
[(frame_x/2)-3, -(frame_y/2)+3, panel_z/2],
[-(frame_x/2)+3, -(frame_y/2)+3, panel_z/2],
];
hull() {
for (p = top_points) {
translate(p) cylinder(r=3, h=frame_z-panel_z, center=true);
}
}
// 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);
} }
} }
module frame_mount_column() { module frame_mount_column() {
cube([20, 20, frame_z], center=true); cube([20, 20, 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]]);
} }
module frame_side_chopper() { module side_chopper() {
translate([frame_x/2, 0, 0]) cube([8, 2*(frame_y+top_plate_y), 2*(frame_z+top_plate_z)], center=true); translate([(frame_x-frame_wall)/2+panel_overhang_amount, 0, 0])
cube([frame_wall+panel_overhang_amount*2, overhang_panel_y, frame_z], center=true);
} }
module frame_connection_holes() { module frame_connection_holes() {
translate([frame_x/2, (frame_y/4)+10, (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)+15, (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)+10, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)+15, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)-10, (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)-15, (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)-10, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)-15, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)+10), (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)+15), (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)+10), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)+15), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)-10), (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)-15), (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)-10), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)-15), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
} }
module frame_cable_routing_hole() { module frame_cable_routing_hole() {
@@ -205,56 +290,107 @@ module frame_cable_routing_hole() {
module base_frame() { module base_frame() {
frame_box(); frame_box();
translate([(top_plate_x/2)-10, (top_plate_y/2)-10, 0]) translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_mount_column();
frame_mount_column(); translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) rotate([0, 0, 90]) frame_mount_column();
translate([-((top_plate_x/2)-10), (top_plate_y/2)-10, 0]) translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 180]) frame_mount_column();
frame_mount_column(); translate([panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 270]) frame_mount_column();
translate([(top_plate_x/2)-10, -((top_plate_y/2)-10), 0])
frame_mount_column();
translate([-((top_plate_x/2)-10), -((top_plate_y/2)-10), 0])
frame_mount_column();
} }
module frame() { module frame() {
difference() { difference() {
base_frame(); base_frame();
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_topplate(); translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
translate([(top_plate_x/2)-10, (top_plate_y/2)-10, 0]) translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_panel();
frame_hex_bolt_hole(); translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-((top_plate_x/2)-10), (top_plate_y/2)-10, 0]) translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
frame_hex_bolt_hole(); translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([(top_plate_x/2)-10, -((top_plate_y/2)-10), 0]) translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
frame_hex_bolt_hole();
translate([-((top_plate_x/2)-10), -((top_plate_y/2)-10), 0])
frame_hex_bolt_hole();
// thin up the mount point to accommodate snap-ins, ethercon adapter // comfort bevel
translate([0, 10, 10]) cube([120, 180, 60], center=true); translate([frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
translate([-frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
translate([0, frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
translate([0, -frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
// 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();
} }
} }
/* LAYOUTS */ /* LAYOUTS */
module dir_arc_30mm_button_l() { // Directional Arc (both hands)
translate([68, 132, 0]) button_30mm_hole();
module dir_arc_24mm_directionals() {
button_24mm_hole();
translate([29.5, 0, 0]) button_24mm_hole();
translate([29.5+26.3, -12.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5, -65.2, 0]) button_30mm_hole();
}
module dir_arc_24mm_6_button() {
dir_arc_24mm_directionals();
translate([29.5+26.3+27.8, 0, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7, -29.4, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9-1.7, 10.9-30.1, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6-0.2, 10.9-30.1, 0]) button_24mm_hole();
}
module dir_arc_24mm_8_button() {
dir_arc_24mm_6_button();
translate([29.5+26.3+27.8+26.9+29.6+29.5, 7.1, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6+29.5-0.3, -23.9, 0]) button_24mm_hole();
}
// 6 button plus the normal fourth column for 8 button actually on a third row
module dir_arc_24mm_8_button_compressed() {
dir_arc_24mm_6_button();
translate([29.5+26.3+27.8+2.6, 29.4, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+2.6, 40.3, 0]) button_24mm_hole();
}
module dir_arc_plus_w_24mm_8_button() {
dir_arc_24mm_8_button();
translate([36, 28, 0]) button_24mm_hole();
}
// Directional Arc (left hand)
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();
}
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();
} }
module dir_arc_w_30mm() { module dir_arc_w_30mm() {
dir_arc_30mm_button_l(); dir_arc_30mm_thumb_button();
translate([35, 0, 0]) dir_arc_30mm_button_l(); dir_arc_30mm_finger_buttons();
translate([35+33.5, -12.9, 0]) dir_arc_30mm_button_l(); translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
translate([35+7, 34.5, 0]) dir_arc_30mm_button_l();
// just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored)
translate([top_plate_x-33.06, 145-19-9-11-19-9-11, 0]) button_30mm_hole();
} }
module dir_arc_w_30mm_plus_one() { module dir_arc_w_30mm_plus_one() {
dir_arc_w_30mm(); dir_arc_w_30mm();
translate([-33.5, -12.9, 0]) dir_arc_30mm_button_l(); translate([-33.8-34.8-33.8, 57.2, 0]) dir_arc_30mm_thumb_button();
} }
// Namco Noir (right hand)
module noir_button_p1() { module noir_button_p1() {
translate([40, 145, 0]) button_30mm_hole(); translate([-panel_x/2, -panel_y/2, 0]) translate([35, 140, 0]) button_30mm_hole();
} }
module noir_plus_one() { module noir_plus_one() {
@@ -272,21 +408,30 @@ module noir_plus_one() {
translate([-3.47-3.47, -78, 0]) noir_button_p1(); translate([-3.47-3.47, -78, 0]) noir_button_p1();
} }
// Sega Astro City 2P (right hand)
module sega_2p_p1() { module sega_2p_p1() {
translate([33.06, 145, 0]) button_30mm_hole(); translate([-panel_x/2, -panel_y/2, 0]) translate([28.06, 140, 0]) button_30mm_hole();
} }
module sega_2p_plus_one() { module sega_2p_6_button() {
// via slagcoin // via slagcoin
sega_2p_p1(); sega_2p_p1();
translate([30.5, 11+9, 0]) sega_2p_p1(); translate([30.5, 11+9, 0]) sega_2p_p1();
translate([30.5+36, 11+9, 0]) sega_2p_p1(); translate([30.5+36, 11+9, 0]) sega_2p_p1();
translate([30.5+36+36, 11, 0]) sega_2p_p1();
translate([0, -19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11, 0]) sega_2p_p1();
translate([30.5, -19, 0]) sega_2p_p1(); translate([30.5, -19, 0]) sega_2p_p1();
translate([30.5+36, -19, 0]) sega_2p_p1(); translate([30.5+36, -19, 0]) sega_2p_p1();
translate([30.5+36+36, -19-9, 0]) sega_2p_p1(); }
// just my guesstimate on this one, but note that this is the same position as sega 2p 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();
}
module sega_2p_plus_one() {
sega_2p();
// just my guesstimate on this one
translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1();
} }

View File

@@ -1,28 +1,16 @@
/* Copyright Brian Stephan 2023 /*
* * SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* This file is part of the Buildable Stick System. * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*/ */
include <parameters.scad>
include <components.scad> include <components.scad>
module base_left_frame() { module base_left_frame() {
difference() { difference() {
frame(); frame();
// chop the right edge off // chop the right edge off
frame_side_chopper(); side_chopper();
} }
} }
@@ -30,15 +18,22 @@ module left_frame() {
difference() { difference() {
base_left_frame(); base_left_frame();
// connection holes to other frames // connection holes to other frames
translate([0, 0, -top_plate_z/2]) frame_connection_holes(); frame_connection_holes();
// cable routing hole // cable routing hole
translate([0, 0, -top_plate_z/2]) frame_cable_routing_hole(); frame_cable_routing_hole();
// aux button holes // aux button holes
translate([0, 100, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([-35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([-40, 100, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([40, 100, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
// neutrix button hole
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount();
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1])
frame_cutout();
} }
} }

View File

@@ -1,29 +1,17 @@
/* Copyright Brian Stephan 2023 /*
* * SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* This file is part of the Buildable Stick System. * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*/ */
include <parameters.scad>
include <components.scad> include <components.scad>
module base_middle_frame() { module base_middle_frame() {
difference() { difference() {
frame(); frame();
// chop the left and right edge off // chop the left and right edge off
frame_side_chopper(); side_chopper();
mirror([1, 0, 0]) frame_side_chopper(); mirror([1, 0, 0]) side_chopper();
} }
} }
@@ -31,17 +19,23 @@ module middle_frame() {
difference() { difference() {
base_middle_frame(); base_middle_frame();
// connection holes to other frames // connection holes to other frames
translate([0, 0, -top_plate_z/2]) frame_connection_holes(); frame_connection_holes();
translate([0, 0, -top_plate_z/2]) mirror([1, 0, 0]) frame_connection_holes(); mirror([1, 0, 0]) frame_connection_holes();
// cable routing holes // cable routing holes
translate([0, 0, -top_plate_z/2]) frame_cable_routing_hole(); frame_cable_routing_hole();
translate([0, 0, -top_plate_z/2]) mirror([1, 0, 0]) frame_cable_routing_hole(); mirror([1, 0, 0]) frame_cable_routing_hole();
// neutrik mounts for connector, switches // neutrik mounts for connector, switches
translate([0, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
translate([-40, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([40, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
} }
} }

View File

@@ -1,26 +1,40 @@
/* Copyright Brian Stephan 2023 /*
* * SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* This file is part of the Buildable Stick System. * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*/ */
include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-left.scad>
module base_right_frame() {
difference() {
frame();
// chop the left edge off
mirror([1, 0, 0]) side_chopper();
}
}
module right_frame() { module right_frame() {
mirror([1, 0, 0]) left_frame(); difference() {
base_right_frame();
// connection holes to other frames
mirror([1, 0, 0]) frame_connection_holes();
// cable routing hole
mirror([1, 0, 0]) frame_cable_routing_hole();
// aux button holes
translate([35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
// neutrix button hole
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount();
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1])
frame_cutout();
}
} }
right_frame(); right_frame();

36
src/frame-solo.scad Normal file
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>
module solo_frame() {
difference() {
frame();
// neutrik mounts for connector, switches
translate([0, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
// aux button holes
translate([-frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
aux_control_three_button_cluster();
translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 1]) rotate([0, 0, 90]) frame_cutout();
translate([(frame_x/2)-neutrik_panel_thickness-4, -37, 1]) rotate([0, 0, 90]) frame_cutout();
translate([(frame_x/2)-neutrik_panel_thickness-4, 37, 1]) rotate([0, 0, 90]) frame_cutout();
translate([frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
aux_control_three_button_cluster();
translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 1]) rotate([0, 0, 90]) frame_cutout();
translate([-(frame_x/2)+neutrik_panel_thickness+4, -37, 1]) rotate([0, 0, 90]) frame_cutout();
translate([-(frame_x/2)+neutrik_panel_thickness+4, 37, 1]) rotate([0, 0, 90]) frame_cutout();
}
}
solo_frame();

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
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();
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]) button_24mm_hole();
}
}
button_24mm_decorative_plate();

View File

@@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
module aux_connectors_two_neutrik_cluster_decorative_plate() {
difference() {
hull() {
translate([-50, 0, 0]) neutrik_d_plate();
translate([50, 0, 0]) neutrik_d_plate();
}
translate([(frame_x/2)-frame_center_to_neutrik-frame_wall, 0, 0]) rocker_20mm_mount();
translate([-((frame_x/2)-frame_center_to_neutrik-frame_wall), 0, 0]) neutrik_d_mount();
}
}
aux_connectors_two_neutrik_cluster_decorative_plate();

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
module aux_control_three_button_cluster_decorative_plate() {
difference() {
hull() {
translate([-44, 0, 0]) neutrik_d_plate();
translate([44, 0, 0]) neutrik_d_plate();
}
translate([0, 0, -10]) aux_control_three_button_cluster();
}
}
aux_control_three_button_cluster_decorative_plate();

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
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();
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]) dir_arc_plus_w_24mm_8_button();
}
}
dir_arc_plus_w_24mm_8_button_decorative_plate();

View File

@@ -0,0 +1,50 @@
/*
* 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,24 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([-panel_x/2, 0, -65]) dir_arc_w_30mm();
translate([panel_x/2, 0, -65]) sega_2p_plus_one();
}
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();

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
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();
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]) dir_arc_w_30mm();
}
}
dir_arc_plus_w_30mm_decorative_plate();

View File

@@ -0,0 +1,20 @@
/*
* 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_6_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) 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
translate([0, 0, -1]) sega_2p_6_button();
}
}
sega_2p_6_button_decorative_plate();

View File

@@ -0,0 +1,20 @@
/*
* 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_plus_one_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_plus_one();
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();
}
}
sega_2p_plus_one_decorative_plate();

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
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);
}
}
jlf_dustwasher();

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
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);
}
}
lsx_nobi_dustwasher();

View File

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

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
module neutrik_d_plate_24mm() {
difference() {
neutrik_d_plate();
neutrik_d_mount();
}
}
neutrik_d_plate_24mm();

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module neutrik_d_plate() {
difference() {
cube([30, 35, 2], center=true);
translate([9.5, 12, 0]) neutrik_d_screw_hole();
translate([-9.5, -12, 0]) neutrik_d_screw_hole();
}
}
neutrik_d_plate();

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <misc-neutrik-d-plate.scad>
module rocker_plate_20mm() {
difference() {
neutrik_d_plate();
rocker_20mm_mount();
}
}
rocker_plate_20mm();

View File

@@ -1,31 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
module spdt_neutrik_d_plate() {
difference() {
cube([30, 35, 2], center=true);
translate([9.5, 12, 0]) neutrik_d_screw_hole();
translate([-9.5, -12, 0]) neutrik_d_screw_hole();
cylinder(r=10+hole_tolerance, h=5, $fn=50, center=true);
cube([2.2, 22, 5], center=true);
}
}
spdt_neutrik_d_plate();

71
src/parameters.scad Normal file
View File

@@ -0,0 +1,71 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
// adjustments
hole_tolerance = 0.15;
// M2
m2_screw_selftap_radius = 0.95;
// M3
m3_screw_selftap_radius = 1.3;
// M4
m4_bolt_radius = 2 + hole_tolerance;
m4_bolt_countersink_radius = 6.1 + hole_tolerance;
m4_bolt_hex_exterior_radius = 3.6 + hole_tolerance;
// 24mm button
small_button_radius = 12 + hole_tolerance;
// 30mm button
big_button_radius = 15 + hole_tolerance;
// JLF mount dimensions
lever_mount_x = 53;
lever_mount_y = 95;
lever_mount_z = 2;
// standard lever hole
lever_plate_hole = 12;
// case dimensions
// base frame box. reminder: top of inside (including mounts) is chopped by panel_z for plates
frame_x = 233;
frame_y = 208;
frame_z = 57;
frame_center_to_neutrik = 70;
// depth of the "lip" of the frame that the top plate sets into/supports the overhang
frame_wall = 4;
// per neutrik (mm)
neutrik_panel_thickness = 3;
// top plate, which can either be the whole plate ("inset") or the mounting frame for a plate that overhangs
panel_x = frame_x - (frame_wall * 2);
panel_y = frame_y - (frame_wall * 2);
panel_z = 5;
// how much the top plate x/y is expanded to overhang the frame
// note that this is relative to the top plate (so the wall is added back)
panel_overhang_amount = 8.5;
overhang_panel_x = panel_x + (frame_wall * 2) + (panel_overhang_amount * 2);
overhang_panel_y = panel_y + (frame_wall * 2) + (panel_overhang_amount * 2);
panel_to_frame_point_x = (panel_x/2)-10;
panel_to_frame_point_y = (panel_y/2)-10;
// frame interior that supports the top plates
panel_support_width = 5;
// neutrik D screw holes
neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance;
// additional button radius for decorative panels, etc.
decorative_radius_scale = 1.75;
jumbo_decorative_radius_scale = 2;

View File

@@ -1,27 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
use <top-panel-dir_arc-plus-w-30mm-plus-one.scad>
module dir_arc_w_30mm_plus_one_panel_with_mount() {
dir_arc_w_30mm_plus_one_panel();
translate([65, 55, -(top_plate_z/2) - 3]) pcb_mount();
}
dir_arc_w_30mm_plus_one_panel_with_mount();

View File

@@ -1,28 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
module dir_arc_w_30mm_plus_one_panel() {
difference() {
translate([top_plate_x/2, top_plate_y/2, 0]) topplate();
dir_arc_w_30mm_plus_one();
}
}
dir_arc_w_30mm_plus_one_panel();

View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <top-panel-inset-dir_arc-plus-w-30mm-plus-one.scad>
module dir_arc_w_30mm_plus_one_panel_with_mount() {
dir_arc_w_30mm_plus_one_panel();
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -15]) pcb_mount();
}
dir_arc_w_30mm_plus_one_panel_with_mount();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module dir_arc_w_30mm_plus_one_panel() {
difference() {
panel();
dir_arc_w_30mm_plus_one();
}
}
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>
module top_panel_inset_lever_and_dir_arc_w_30mm() {
difference() {
panel();
dir_arc_w_30mm();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountcountersinks();
}
}
top_panel_inset_lever_and_dir_arc_w_30mm();

View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <top-panel-inset-lever.scad>
module lever_panel_with_mount() {
lever_panel();
translate([0, -panel_y/2+25, -(panel_z/2) - 3]) pcb_mount();
}
lever_panel_with_mount();

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
// combine the lever mount and generic plate, with mounting holes
module lever_panel() {
difference() {
// base plate
translate([0,-20,0]) panel();
// holes to mount the lever
levermountholes();
levermountcountersinks();
}
}
lever_panel();

View File

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

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module namco_noir_plus_two_panel() {
difference() {
panel();
noir_plus_one();
translate([32.94-3.47-3.47, -78+7.37+4.49, 0]) noir_button_p1();
}
}
namco_noir_plus_two_panel();

View File

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

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>
module top_panel_inset_sega_2p_plus_one_plus_control() {
difference() {
panel();
sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole();
}
}
top_panel_inset_sega_2p_plus_one_plus_control();

View File

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

View File

@@ -1,40 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
// combine the lever mount and generic plate, with mounting holes
module left_lever_panel() {
difference() {
// base plate
union() {
translate([20,-20,0])
topplate();
translate([0, 0, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase();
}
// holes to mount the lever
levermountholes();
}
}
module left_lever_panel_with_mount() {
left_lever_panel();
translate([0, -top_plate_y/2+25, -(top_plate_z/2) - 3]) pcb_mount();
}
left_lever_panel_with_mount();

View File

@@ -1,27 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
use <top-panel-lever.scad>
module lever_panel_with_mount() {
lever_panel();
translate([0, -top_plate_y/2+25, -(top_plate_z/2) - 3]) pcb_mount();
}
lever_panel_with_mount();

View File

@@ -1,36 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
// combine the lever mount and generic plate, with mounting holes
module lever_panel() {
difference() {
// base plate
union() {
translate([0,-20,0])
topplate();
translate([0, 0, -((top_plate_z/2)+(lever_mount_z/2))])
levermountbase();
}
// holes to mount the lever
levermountholes();
}
}
lever_panel();

View File

@@ -1,28 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
module namco_noir_plus_one_panel() {
difference() {
translate([top_plate_x/2, top_plate_y/2, 0]) topplate();
noir_plus_one();
}
}
namco_noir_plus_one_panel();

View File

@@ -1,29 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
module namco_noir_plus_two_panel() {
difference() {
translate([top_plate_x/2, top_plate_y/2, 0]) topplate();
noir_plus_one();
translate([32.94-3.47-3.47, -78+7.37+4.49, 0]) noir_button_p1();
}
}
namco_noir_plus_two_panel();

View File

@@ -0,0 +1,19 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module top_panel_left_lever_and_dir_arc_w_30mm() {
difference() {
panel_with_raised_overhang();
dir_arc_w_30mm();
side_chopper();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountcountersinks();
}
}
top_panel_left_lever_and_dir_arc_w_30mm();

View File

@@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
// combine the lever mount and generic plate, with mounting holes
module top_panel_left_lever() {
difference() {
// base plate
panel_with_raised_overhang();
// holes to mount the lever
translate([0, 20, 0]) levermountholes();
translate([0, 20, 0]) levermountcountersinks();
side_chopper();
}
}
top_panel_left_lever();

View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <top-panel-overhang-middle-dir_arc-plus-w-30mm.scad>
module top_panel_middle_dir_arc_w_30mm_with_mount() {
top_panel_middle_dir_arc_w_30mm();
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount();
}
top_panel_middle_dir_arc_w_30mm_with_mount();

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>
module top_panel_middle_dir_arc_w_30mm() {
difference() {
panel_with_raised_overhang();
dir_arc_w_30mm();
rotate([0, 0, 180]) side_chopper();
side_chopper();
}
}
top_panel_middle_dir_arc_w_30mm();

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 <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
module top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled() {
difference() {
top_panel_right_sega_2p_plus_one_plus_control_with_mount();
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
}
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
}
top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled();

View File

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

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>
module top_panel_right_sega_2p_plus_one_plus_control() {
difference() {
panel_with_raised_overhang();
sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole();
}
}
top_panel_right_sega_2p_plus_one_plus_control();

View File

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

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module top_panel_right_sega_2p_plus_one() {
difference() {
panel_with_raised_overhang();
sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper();
}
}
top_panel_right_sega_2p_plus_one();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module dir_arc_24mm_6_button_panel() {
difference() {
panel_with_raised_overhang();
translate([-71.5, -panel_y/2+122.5, 0]) dir_arc_24mm_6_button();
}
}
dir_arc_24mm_6_button_panel();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module dir_arc_plus_w_24mm_8_button_panel() {
difference() {
panel_with_raised_overhang();
translate([-80.5, panel_y/6, 0]) dir_arc_plus_w_24mm_8_button();
}
}
dir_arc_plus_w_24mm_8_button_panel();

View File

@@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module top_panel_solo_lever_and_sega_2p_6_button() {
difference() {
// base plate
union() {
panel_with_raised_overhang();
translate([-60, 18, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
}
translate([95, -20, 0]) sega_2p_6_button();
translate([-60, 18, 0]) levermountholes();
}
}
top_panel_solo_lever_and_sega_2p_6_button();

View File

@@ -1,28 +0,0 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* 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/>.
*/
include <components.scad>
module sega_2p_plus_one_panel() {
difference() {
translate([top_plate_x/2, top_plate_y/2, 0]) topplate();
sega_2p_plus_one();
}
}
sega_2p_plus_one_panel();