27 Commits

Author SHA1 Message Date
0fd3880fa2 make the 24mm ergo variant quasi-official
I tested it and managed to cram it all onto one panel, and the
dimensions seem cromulent, so I'm going to call it supported, even if it
remains unused
2026-02-09 07:49:02 -06:00
d028736d5a correct label for example photo 2026-02-09 07:44:36 -06:00
80ce81c465 use a smaller frame bevel in order to improve print quality
the bevel was big and looked nice, but the number of layers might have
been contributing to reduced print quality and increased pull on the
corners of the pieces printed face down (so bevels going out as layers
go up). this reduces the size of the bevel in an attempt to make the
problem less pronounced. hopefully.

there was also a bunch of weird math in the trapezoid frame pieces that
relied on the bevel size in broken ways, so the pieces have been
simplified a little bit to work right and not be affected by that
otherwise unrelated parameter.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2026-01-06 16:38:24 -06:00
8b5d994847 cut some volume off of the front or back pieces where they touch sides
there is a printing issue where a fat couple layers jut out a bit on the
edge where the front or back piece would touch a side piece or another
front or back piece, making them not connect that flushly. this removes
a bit in order to let that fat layer be in a gap instead

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2026-01-03 22:18:48 -06:00
852cef821c make "plate" decorative plates for ergo nine and ergo wasd 5
note that the ergo WASD 5 actually includes unused space as if it was 7
buttons, to have the inside edge be symmetrical with the ergo nine. it
looked weird for the angle to cut in on one but not the other, when
lined up next to each other

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2026-01-03 22:15:48 -06:00
bf2f8a8a17 fixing object names; these pieces are *not* for extended sides
the object that made them "for" extended sides actually didn't do
anything, either, so they've been removed

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2026-01-03 22:12:08 -06:00
1aea9221ff rename some of the components for the ergo layouts
I'm already regretting some of my naming choices but not enough to do
anything about it right now

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-09-06 08:51:36 -05:00
ea4beca89d move my many, many decorative plates and similar to their own dir
finally making a plates/ instead of stuffing everything in misc/

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-09-06 08:12:02 -05:00
aa92e57fe0 scoot the PCB mount a bit away from the inner wall
this is mostly to accommodate some slightly longer dongles

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-09-05 15:13:49 -05:00
0d121e834a update the demos I use to use the ergo layout
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-09-05 15:13:49 -05:00
d187312cd3 create new "ergo" layout based on a 30mm WASD layout
for both left and right hands, these layouts have a WASD layout as a
base, with the left and right sides pulled slightly down from the
center, and with 8+ button layouts pulling down even further to match
the arg for the pinky finger locations. I've been playing with this for
a while, and think I like it, at least like it enough to commit it

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

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

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

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

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-28 08:20:07 -05:00
432e6e74d5 put everything in docs/ in the build, in order to include images
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 16:32:30 -05:00
1e64f59134 minor README wording tweak
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 16:11:57 -05:00
a4f2650f00 include a v4.7 photo and add it to the README
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 15:56:46 -05:00
c9a74ebb18 build two zip files for printables uploading
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2025-03-26 14:39:49 -05:00
62 changed files with 497 additions and 213 deletions

View File

@@ -2,6 +2,20 @@
Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.7.1
### Fixes
* Hull-based decorative plates were accidentally grown in v4.7.0 due to ye olde refactoring. They are back to the
dimensions they should be (give or take) because there was an underlying bug in how they were geometried pre-v4.7.1.
* The docs/ directory in the build now includes the images referred to, especially in the README.
### Miscellaneous
* Some README tweaks, including another demonstrative photo.
* The build creates both a ZIP of everything, including docs, for humans to download, and also a ZIP of *just* the STLs,
to ease uploading to Printables.
## v4.7.0
### Features

View File

@@ -3,11 +3,11 @@ all:
mkdir -p ./build/docs
cp ./README.md ./build/README.md
cp ./docs/README-objects.md ./build/README-objects.md
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.md
cp ./docs/printing-and-materials.md ./build/docs/printing-and-materials.md
cp ./docs/* ./build/docs/
cp ./LICENSE ./build/LICENSE
cp ./CHANGELOG.md ./build/CHANGELOG.md
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip . -r; popd
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls-and-docs.zip . -r; popd
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip extras frames misc panels -r; popd
clean:
rm -rf ./build

View File

@@ -1,6 +1,6 @@
# The Buildable Stick System
Files for 3D printing an arcade stick.
Files for 3D printing and building an arcade stick enclosure.
Have you ever wanted to conjure your own arcade stick out of the ether (well, plastic), or to prototype a new layout or
design before sending it to a custom builder? Do you just love having your space filled with arcade stick enclosures,
@@ -16,7 +16,7 @@ Randomus](https://webirc.randomus.net/#buildable-stick-system)!**
![A photo of a completed stick](docs/finished-v4.4.jpg)
[Photo of a completed inset panel-based stick.]
[Photo of a completed overhang panel-based stick.]
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
@@ -57,11 +57,15 @@ about what the types of parts are and how to use them:
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
variants depending on where you put things.
* `misc/`
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
* `plates/`
* Flat pieces used for cosmetic or connective reasons --- decorative plates for top buttons and similar to give
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
desired height. You don't *need* any of these, but you'll probably use a few.
* `misc/`
* Pieces that I haven't organized better (yet) --- odd things and scratch ideas, mostly. There are some decorative
corners for a bit more height/nicer seams, a sleeve to make smaller hex spacers fit in the hole as they're
supposed to, things of that nature.
* `extras/`
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes.
@@ -135,6 +139,16 @@ Board, ~$60 for Sanwa buttons and a lever, and ~$20 for miscellaneous connectors
full-featured controller with an open source foundation together for around $140. Reducing wall and infill settings
will probably save you around $5 of material, and you can probably decide what you want to do from there.
## FAQ
### I get a bunch of warnings on not being able to include files when I open them in OpenSCAD, what do I do?
OpenSCAD pathing is relative to the current working directory by default, which is probably not the `src/` directory.
When you start OpenSCAD, you must either start it from inside the project's `src/` directory, or point it at the path to
the source files via e.g. `OPENSCADPATH=path/to/buildable-stick-system/src/ openscad`.
See <https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Include_Statement>.
## Miscellany
See the `/docs/` directory for more thoughts too scattered for this document.
@@ -195,3 +209,9 @@ like the below should suffice in either electronic or printed form:
> This arcade stick is part of the Buildable Stick System, version X.Y.Z; the source code to this program is available
> under the terms of the GNU General Public License, at [LINK].
## Gallery
More photos.
![A photo of three completed sticks](docs/finished-v4.7-x3.jpg)

View File

@@ -9,10 +9,10 @@ use <frames/pieces/side-trapezoid.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <frames/pieces/front-or-back-windowed-horiz-stripes.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
use <panels/inset/sega-2p-nine-plus-aux-button-with-mount.scad>
use <plates/decorative-plate-24mm-button.scad>
use <plates/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <plates/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
@@ -21,7 +21,7 @@ frame_side_color = "#8E9089";
top_deco_color = "#8E9089";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_control_panel_with_mount();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_aux_button_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) side_trapezoid_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) side_trapezoid_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) horiz_striped_windowed_front_or_back_frame_piece();
@@ -31,7 +31,6 @@ color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate_of_plates(); */
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -5,32 +5,33 @@
include <parameters.scad>
include <components.scad>
use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.scad>
use <frames/pieces/front-or-back-trapezoid.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
use <panels/inset/lever-and-ergo-wasd-five-panel-with-oled.scad>
use <panels/inset/ergo-nine-plus-aux-button-with-mount.scad>
use <plates/decorative-plate-24mm-button.scad>
use <plates/decorative-plate-ergo-wasd-five-30mm-and-ergo-nine-30mm.scad>
use <plates/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#8E9089";
top_panel_color = "#0086D6";
bottom_panel_color = "white";
frame_front_color = "white";
frame_back_color = "white";
frame_side_color = "yellow";
top_deco_color = "white";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_nine_plus_control_panel_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) side_trapezoid_extended_to_front_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) side_trapezoid_extended_to_front_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) front_or_back_trapezoid_frame_piece();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) front_or_back_trapezoid_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z/2+0.001]) lever_and_ergo_wasd_five_panel_with_oled();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z/2+0.001]) ergo_nine_plus_aux_button_panel_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, 0]) side_trapezoid_extended_to_front_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, 0]) mirror([1, 0, 0]) side_trapezoid_extended_to_front_frame_piece();
color(frame_front_color) translate([-frame_x/2+4, 0, 0]) front_or_back_trapezoid_frame_piece();
color(frame_front_color) translate([frame_x/2-4, 0, 0]) front_or_back_trapezoid_frame_piece();
color(frame_back_color) translate([-frame_x/2+4, 0, 0]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(frame_back_color) translate([frame_x/2-4, 0, 0]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
/* color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel(); */
/* color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel(); */
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();
color(top_deco_color) translate([0, 0, 4+frame_z/2-panel_z/2+0.001]) ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate();
color(top_deco_color) translate([-170, 25, 4+frame_z/2-panel_z/2+0.001]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 4+frame_z/2-panel_z/2+0.001]) button_24mm_decorative_plate();

View File

@@ -10,7 +10,7 @@ use <frames/pieces/side-trapezoid-extended-to-front-trapezoid.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/lever-and-sega-2p-6-button-panel-with-aux-with-mount.scad>
use <misc/dustwasher-jlf.scad>
use <plates/dustwasher-jlf.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";

View File

@@ -8,34 +8,28 @@ include <components.scad>
use <frames/pieces/side.scad>
use <frames/pieces/front-or-back.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-nine-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
use <misc/decorative-corner.scad>
use <panels/inset/lever-and-ergo-wasd-five-panel-with-oled.scad>
use <panels/inset/ergo-nine-plus-aux-button-with-mount.scad>
use <plates/decorative-plate-24mm-button.scad>
use <plates/decorative-plate-ergo-wasd-five-30mm-and-ergo-nine-30mm.scad>
use <plates/dustwasher-lsx-nobi.scad>
panel_color = "red";
base_color = "gray";
top_deco_color = "white";
brace_color = "gray";
color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z/2+0.001]) lever_and_dir_arc_w_30mm_panel();
color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z/2+0.001]) sega_2p_nine_plus_control_panel_with_mount();
color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z/2+0.001]) lever_and_ergo_wasd_five_panel_with_oled();
color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z/2+0.001]) ergo_nine_plus_aux_button_panel_with_mount();
color(base_color) translate([panel_x/2, 0, 0]) rotate([0, 180, 0]) side_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) side_frame_piece();
color(base_color) translate([panel_x/2, 0, 0]) front_or_back_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) front_or_back_frame_piece();
color(base_color) translate([panel_x/2, 0, 0]) clean_edge_front_or_back_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) clean_edge_front_or_back_frame_piece();
color(base_color) translate([panel_x/2, 0, 0]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(base_color) translate([-panel_x/2, 0, 0]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_frame_piece();
color(base_color) translate([-panel_x/2, 0, -frame_z/2+panel_z/2]) panel();
color(base_color) translate([panel_x/2, 0, -frame_z/2+panel_z/2]) panel();
/* color(base_color) translate([-panel_x/2, 0, -frame_z/2+panel_z/2]) panel(); */
/* color(base_color) translate([panel_x/2, 0, -frame_z/2+panel_z/2]) panel(); */
color(brace_color) translate([-panel_x/2, 0, 0]) decorative_corner();
color(brace_color) mirror([1, 0, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(brace_color) mirror([0, 1, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(brace_color) mirror([1, 0, 0]) mirror([0, 1, 0]) translate([-panel_x/2, 0, 0]) decorative_corner();
color(top_deco_color) translate([0, 0, 4+frame_z/2-panel_z/2+0.001]) dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate();
color(top_deco_color) translate([-170, 20, 4+frame_z/2-panel_z/2+0.001]) lsx_nobi_dustwasher();
color(top_deco_color) translate([0, 0, 4+frame_z/2-panel_z/2+0.001]) ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate();
color(top_deco_color) translate([-170, 25, 4+frame_z/2-panel_z/2+0.001]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 4+frame_z/2-panel_z/2+0.001]) button_24mm_decorative_plate();

View File

@@ -10,16 +10,16 @@ use <frames/pieces/side.scad>
use <frames/pieces/front-or-back.scad>
use <frames/pieces/front-or-back-aux-and-neutrik.scad>
use <panels/overhang/left-lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/overhang/right-sega-2p-nine-plus-control-panel-with-mount.scad>
use <panels/overhang/right-sega-2p-nine-plus-aux-button-with-mount.scad>
use <panels/overhang/left-or-right-panel.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <misc/dustwasher-lsx-nobi.scad>
use <plates/decorative-plate-24mm-button.scad>
use <plates/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-nine.scad>
use <plates/dustwasher-lsx-nobi.scad>
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) lever_and_dir_arc_w_30mm_left_overhang_panel();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_nine_plus_control_right_overhang_panel_with_mount();
color("black") translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_frame_piece();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_nine_plus_aux_button_right_overhang_panel_with_mount();
color("black") translate([-frame_x/2+5-25, -55, -2.5]) clean_edge_front_or_back_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) clean_edge_front_or_back_frame_piece();
color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_frame_piece();
color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_frame_piece();

View File

@@ -27,17 +27,17 @@ The pieces you need to print (all colors to your taste):
The above gets you the basics. Some common things you may also want:
* **Mounting Neutrik connectors:** Neutrik D connectors can mount flush to the inside of the frame, but you can choose
to have a little decorative plate (`misc/neutrik-d-plate.stl` for added depth or color choices on the outside of the
to have a little decorative plate (`plates/neutrik-d-plate.stl` for added depth or color choices on the outside of the
frame, if you'd like.
* **Mounting a 24mm switch:** a rocker switch can also be mounted in the Neutrik D connector, but it needs to be placed
into a `misc/neutrik-d-plate-24mm-hole.stl` plate, and the plate mounted to the frame.
into a `plates/neutrik-d-plate-24mm-hole.stl` plate, and the plate mounted to the frame.
* **Flair for the auxillary buttons:** the three buttons in a row on the back of the frame can also get some style, just
place a `misc/decorative-plate-aux-control-three-button-cluster.stl` between the buttons and the frame. This only
place a `plates/decorative-plate-aux-control-three-button-cluster.stl` between the buttons and the frame. This only
works for screw-in buttons.
* **Flair for the top buttons:** same as above, a decorative plate for top panel layouts --- e.g.
`misc/decorative-plate-sega-2p.stl` --- can be sandwiched between the buttons and panel to add some style. This also
`plates/decorative-plate-sega-2p.stl` --- can be sandwiched between the buttons and panel to add some style. This also
only tends to work on screw-in buttons.
* **Dustwashers/flair:** same deal, if you want to print one, use e.g. `misc/dustwasher-jlf.stl`.
* **Dustwashers/flair:** same deal, if you want to print one, use e.g. `plates/dustwasher-jlf.stl`.
## Putting a BSS Stick Together
@@ -53,9 +53,9 @@ following is the most consistent way I've found to put one together.
overall assembly works with your components, so again get your buttons, lever, etc., in place. You can secure them at
this point.
1. If you are using a button decorative plate that spans two panels --- e.g.
`misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as tightly
`plates/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as tightly
as possible, and accurately, as they will be hard to adjust once everything is secured and in the frame.
2. If using a lever, don't forget the lever mount spacer --- `misc/lever-mount-sanwa-seimitsu` --- if you want it,
2. If using a lever, don't forget the lever mount spacer --- `plates/lever-mount-sanwa-seimitsu` --- if you want it,
and tighten those mounting bolts now as well.
3. Create the frame box by combining your frame piece parts, box or extended, together. This will be relatively stable
just via friction fit.

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

View File

@@ -107,16 +107,24 @@ module m2_mount_post() {
}
}
module oled_ssd1306_mount() {
translate([11.5, 12, 0]) m2_mount_post();
translate([11.5, -12, 0]) m2_mount_post();
translate([-11.5, 12, 0]) m2_mount_post();
translate([-11.5, -12, 0]) m2_mount_post();
module adafruit_pid_326_oled_ssd1306_mount_post() {
cylinder(r=2.25/2, h=8, $fn=50, center=true);
}
module oled_ssd1306_mount_cutout() {
translate([0, 1.9, 0]) cube([25, 14, 5], center=true);
translate([0, 0, -1.0]) cube([35, 35, 4], center=true);
// aligned to the cutout below
module adafruit_pid_326_oled_ssd1306_mount() {
translate([12, 13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([12, -13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([-12, 13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
translate([-12, -13.25, -2]) adafruit_pid_326_oled_ssd1306_mount_post();
}
module adafruit_pid_326_oled_ssd1306_mount_cutout() {
translate([0, 3.5, 0]) cube([ssd1306_x, ssd1306_y, panel_z+0.1], center=true);
translate([0, 0, -ssd1306_z/2]) cube([adafruit_pid_326_oled_ssd1306_cutout_x,
adafruit_pid_326_oled_ssd1306_cutout_y, panel_z-ssd1306_z+0.1], center=true);
translate([0, 0, -ssd1306_z/2-2]) cube([adafruit_pid_326_oled_ssd1306_cutout_x*3/2,
adafruit_pid_326_oled_ssd1306_cutout_y/2, panel_z/2+0.1], center=true);
}
module m3_mount_post() {
@@ -502,6 +510,82 @@ module sega_2p_eleven() {
translate([sega_2p_column_5_offset, -19-9-11, 0]) sega_2p_p1();
}
// BSS ERGO - 30mm
module wasd_30mm() {
button_30mm_hole(); // W
translate([0, -36, 0]) button_30mm_hole(); // S
translate([-34.5, -36-9, 0]) button_30mm_hole(); // A
translate([34.5, -36-9, 0]) button_30mm_hole(); // D
}
module wasd_six_30mm() {
wasd_30mm();
translate([-34.5, -9, 0]) button_30mm_hole(); // left of W
translate([34.5, -9, 0]) button_30mm_hole(); // right of W
}
module wasd_eight_30mm() {
wasd_six_30mm();
translate([34.5*1.9, -9*3, 0]) button_30mm_hole(); // top right of right of W
translate([34.5*1.9, -36-9*3, 0]) button_30mm_hole(); // right of D
}
module ergo_wasd_five_30mm() {
translate([-51.75, 65.5, 0]) rotate([0, 0, 10]) {
wasd_30mm();
}
translate([0, 0, 0]) sega_2p_nine_thumb_button();
}
module ergo_wasd_seven_30mm() {
translate([-51.75, 65.5, 0]) rotate([0, 0, 10]) {
wasd_six_30mm();
}
translate([0, 0, 0]) sega_2p_nine_thumb_button();
}
module ergo_nine_30mm() {
translate([-51.75, 65.5, 0]) rotate([0, 0, 10]) {
wasd_eight_30mm();
}
translate([0, 0, 0]) sega_2p_nine_thumb_button();
}
// BSS ERGO - 24mm
module wasd_24mm() {
button_24mm_hole(); // W
translate([0, -27, 0]) button_24mm_hole(); // S
translate([-26, -27-7, 0]) button_24mm_hole(); // A
translate([26, -27-7, 0]) button_24mm_hole(); // D
}
module wasd_six_24mm() {
wasd_24mm();
translate([-26, -7, 0]) button_24mm_hole(); // left of W
translate([26, -7, 0]) button_24mm_hole(); // right of W
}
module wasd_eight_24mm() {
wasd_six_24mm();
translate([26*2-2, -7*3, 0]) button_24mm_hole(); // top right of right of W
translate([26*2-2, -27-7*3, 0]) button_24mm_hole(); // top right of right of W
}
module ergo_wasd_five_24mm() {
translate([-63.25, 65.5, 0]) rotate([0, 0, 10]) {
wasd_24mm();
}
translate([0, 0, 0]) sega_2p_nine_thumb_button();
}
module ergo_nine_24mm() {
translate([-63.25, 65.5, 0]) rotate([0, 0, 10]) {
wasd_eight_24mm();
}
translate([0, 0, 0]) sega_2p_nine_thumb_button();
}
module shiokenstar() {
translate([-172, 32, 0]) dir_arc_24mm_directionals();
sega_2p();

View File

@@ -10,11 +10,13 @@ include <components.scad>
module aux_control_three_button_tight_cluster_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -25]) hull() aux_control_three_button_tight_cluster();
// keep a thin slice
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) aux_control_three_button_tight_cluster();
// keep a thin slice
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
}
// cut out the normal holes
translate([0, 0, -1]) aux_control_three_button_tight_cluster();
}

View File

@@ -10,7 +10,7 @@ use <frames/pieces/front-or-back.scad>
module interconnect_frame_half_piece() {
translate([0, frame_y/2-frame_wall, 0]) difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
translate([0, (-frame_y+frame_wall)/2-panel_overhang_amount, 0])
cube([overhang_panel_x, frame_wall+panel_overhang_amount*2, frame_z], center=true);
}

View File

@@ -9,7 +9,7 @@ use <front-or-back.scad>
module front_or_back_aux_and_neutrik_frame_piece() {
difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
// aux button holes
translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster();

View File

@@ -18,7 +18,7 @@ module mount_column_cutout() {
module front_or_back_inner_wall_frame_base_piece() {
difference() {
// Z is scaled so that some part of the original part inner wall is retained
scale([1, 1, inner_frame_z_decorative_scale]) front_or_back_frame_piece();
scale([1, 1, inner_frame_z_decorative_scale]) clean_edge_front_or_back_frame_piece();
// minus the outer wall
translate([0, -(frame_y-frame_wall)/2, 0]) cube([frame_x, frame_wall, frame_z], center=true);
// minus half of the mounting posts (the other half provided by the outer wall)

View File

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

View File

@@ -21,7 +21,7 @@ module backslashes() {
module backslashes_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
// subtract slashes from the frame wall
backslashes();
// subtract the inner wall area that will be provided by the other piece
@@ -29,12 +29,4 @@ module backslashes_windowed_front_or_back_frame_piece() {
}
}
module backslashes_windowed_front_or_back_frame_piece_for_extended_side() {
difference() {
backslashes_windowed_front_or_back_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
backslashes_windowed_front_or_back_frame_piece_for_extended_side();
backslashes_windowed_front_or_back_frame_piece();

View File

@@ -11,7 +11,7 @@ use <front-or-back-windowed-backslashes.scad>
module forwardslashes_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
// subtract slashes from the frame wall
mirror([0, 0, 1]) backslashes();
// subtract the inner wall area that will be provided by the other piece
@@ -19,12 +19,4 @@ module forwardslashes_windowed_front_or_back_frame_piece() {
}
}
module forwardslashes_windowed_front_or_back_frame_piece_for_extended_side() {
difference() {
forwardslashes_windowed_front_or_back_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
forwardslashes_windowed_front_or_back_frame_piece_for_extended_side();
forwardslashes_windowed_front_or_back_frame_piece();

View File

@@ -22,7 +22,7 @@ module front_horiz_stripes() {
module horiz_striped_windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
// subtract frame wall windows
front_horiz_stripes();
// subtract the inner wall area that will be provided by the other piece

View File

@@ -16,7 +16,7 @@ module front_or_back_window() {
module windowed_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
clean_edge_front_or_back_frame_piece();
// subtract frame wall window
front_or_back_window();
// subtract the inner wall area that will be provided by the other piece

View File

@@ -8,8 +8,8 @@ include <components.scad>
use <frames/complete/left-frame.scad>
use <side.scad>
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
module front_or_back_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
@@ -22,4 +22,21 @@ module front_or_back_frame_piece() {
}
}
front_or_back_frame_piece();
// there's something with the print quality/slicing where a couple layers
// around the hex hole get fat in the walls, making this not flush with a
// sibling piece. this removal makes it so the pieces don't touch
// HOWEVER, the side piece uses front_or_back_frame_piece() as a difference,
// so if we removed the little chop from that piece, it'd make the
// side_frame_piece() bigger, defeating the purpose, so what we'll actually
// print is this one and there'll be a little gap in between as desired
//
// front/back pieces that build on this shape should inherit from clean_edge_
module clean_edge_front_or_back_frame_piece() {
difference() {
front_or_back_frame_piece();
translate([panel_x/2, -(panel_y/2-15), 0]) cube([5, 30, inner_frame_z*2], center=true);
translate([-panel_x/2, -(panel_y/2-15), 0]) cube([5, 30, inner_frame_z*2], center=true);
}
}
clean_edge_front_or_back_frame_piece();

View File

@@ -11,18 +11,15 @@ use <front-or-back-trapezoid.scad>
module side_and_bottom_frame_piece_wall() {
// get a slice of the pieces, to use it in extruding
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
// not creating a clean thing to cut, so we just take the whole wall and use that
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
left_frame();
projection(cut=true) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall+0.01, 0, 0]) side_frame_piece();
projection(cut=true) translate([0, -frame_y/2+frame_wall+0.01, 0]) rotate([90, 90, 0]) bottom_piece_extension();
}
module side_and_bottom_frame_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([0.5, 0.90, 1]) side_and_bottom_frame_piece_wall();
linear_extrude(height=frame_bevel_height) side_and_bottom_frame_piece_wall();
linear_extrude(height=frame_wall) side_and_bottom_frame_piece_wall();
}
}
@@ -32,7 +29,7 @@ module side_trapezoid_extended_to_front_frame_piece() {
// chop off the old edge which is getting replaced with the extension
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
}
translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_and_bottom_frame_piece_extension();
translate([-frame_x/2+frame_wall, 0, 0]) rotate([0, -90, 0]) side_and_bottom_frame_piece_extension();
}
side_trapezoid_extended_to_front_frame_piece();

View File

@@ -10,17 +10,14 @@ use <side.scad>
module side_frame_piece_wall() {
// get a slice of the piece, to use it in extruding
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
// not creating a clean thing to cut, so we just take the whole wall and use that
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
left_frame();
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall+0.01, 0, 0]) side_frame_piece();
}
module side_frame_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([0.5, 0.85, 1]) side_frame_piece_wall();
linear_extrude(height=frame_bevel_height) side_frame_piece_wall();
linear_extrude(height=frame_wall) side_frame_piece_wall();
}
}
@@ -30,7 +27,7 @@ module side_trapezoid_frame_piece() {
// chop off the old edge which is getting replaced with the extension
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
}
translate([-frame_x/2+frame_bevel_height*2, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension();
translate([-frame_x/2+frame_wall, 0, 0]) rotate([0, -90, 0]) side_frame_piece_extension();
}
side_trapezoid_frame_piece();

View File

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

View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <ergo-nine-plus-aux-button.scad>
module ergo_nine_plus_aux_button_panel_with_mount() {
ergo_nine_plus_aux_button_panel();
translate([20, -50, -(panel_z/2) - 3]) pcb_mount();
}
ergo_nine_plus_aux_button_panel_with_mount();

View File

@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module ergo_nine_plus_aux_button_panel() {
difference() {
panel();
ergo_nine_30mm();
translate([89, 30, 0]) button_24mm_hole();
}
}
ergo_nine_plus_aux_button_panel();

View File

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

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <lever-and-ergo-wasd-five-panel.scad>
module lever_and_ergo_wasd_five_panel_with_oled() {
difference() {
lever_and_ergo_wasd_five_panel();
translate([0, -(panel_y/2 - 22), 0]) adafruit_pid_326_oled_ssd1306_mount_cutout();
}
translate([0, -(panel_y/2 - 22), 0]) adafruit_pid_326_oled_ssd1306_mount();
}
lever_and_ergo_wasd_five_panel_with_oled();

View File

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

View File

@@ -10,7 +10,7 @@ use <sega-2p-eleven-panel.scad>
module sega_2p_eleven_panel_with_mount() {
sega_2p_eleven_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
translate([20, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_eleven_panel_with_mount();

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 <sega-2p-nine-plus-aux-button.scad>
module sega_2p_nine_plus_aux_button_with_mount() {
sega_2p_nine_plus_aux_button();
translate([20, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_nine_plus_aux_button_with_mount();

View File

@@ -6,7 +6,7 @@
include <parameters.scad>
include <components.scad>
module sega_2p_nine_plus_control_panel() {
module sega_2p_nine_plus_aux_button() {
difference() {
panel();
sega_2p_nine();
@@ -14,4 +14,4 @@ module sega_2p_nine_plus_control_panel() {
}
}
sega_2p_nine_plus_control_panel();
sega_2p_nine_plus_aux_button();

View File

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

View File

@@ -1,18 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <right-sega-2p-nine-plus-control-panel-with-mount.scad>
module sega_2p_nine_plus_control_right_overhang_panel_with_mount_with_oled() {
difference() {
sega_2p_nine_plus_control_right_overhang_panel_with_mount();
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
}
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
}
sega_2p_nine_plus_control_right_overhang_panel_with_mount_with_oled();

View File

@@ -9,7 +9,7 @@ use <right-sega-2p-nine-panel.scad>
module sega_2p_nine_with_mount_right_overhang_panel() {
sega_2p_nine_right_overhang_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
translate([20, -50, -(panel_z/2) - 3]) pcb_mount();
}
sega_2p_nine_with_mount_right_overhang_panel();

View File

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

View File

@@ -6,7 +6,7 @@
include <parameters.scad>
include <components.scad>
module sega_2p_nine_plus_control_right_overhang_panel() {
module sega_2p_nine_plus_aux_button_right_overhang_panel() {
difference() {
panel_with_raised_overhang();
sega_2p_nine();
@@ -15,4 +15,4 @@ module sega_2p_nine_plus_control_right_overhang_panel() {
}
}
sega_2p_nine_plus_control_right_overhang_panel();
sega_2p_nine_plus_aux_button_right_overhang_panel();

View File

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

View File

@@ -74,7 +74,7 @@ frame_extension_y = 25;
// this sinks the bottom and top of the frame inward a bit, and is used to math out two shapes
// when creating the frame box / overhang panel
frame_bevel_height = 2;
frame_bevel_height = 1.25;
overhang_panel_bevel_height = 1;
frame_center_to_neutrik = 70;
@@ -134,6 +134,13 @@ stand_x = 5;
stand_y = frame_z;
stand_z = 15;
// oled cutout stuff
ssd1306_x = 23;
ssd1306_y = 12;
ssd1306_z = 1;
adafruit_pid_326_oled_ssd1306_cutout_x = 30;
adafruit_pid_326_oled_ssd1306_cutout_y = 32;
// LAYOUTS

View File

@@ -9,8 +9,8 @@ include <components.scad>
module button_24mm_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) button_24mm_hole();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) button_24mm_hole();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes

View File

@@ -8,8 +8,8 @@ include <components.scad>
module dir_arc_plus_w_24mm_8_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) dir_arc_plus_w_24mm_8_button();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) dir_arc_plus_w_24mm_8_button();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes

View File

@@ -12,7 +12,7 @@ module dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_superplate() {
difference() {
union() {
hull() difference() {
// get a 2mm slice of the bigger button cylinders
// get a 2mm slice of the decorative button cylinders
union() {
translate([-panel_x/2, 0, -50]) dir_arc_w_30mm();
translate([panel_x/2, 0, -50]) sega_2p_nine();

View File

@@ -8,10 +8,10 @@ include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_nine_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
// get a 2mm slice of the jumbo decorative button cylinders
union() {
translate([-panel_x/2, 0, -65]) dir_arc_w_30mm();
translate([panel_x/2, 0, -65]) sega_2p_nine();
translate([-panel_x/2, 0, -70]) dir_arc_w_30mm();
translate([panel_x/2, 0, -70]) sega_2p_nine();
}
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);

View File

@@ -10,10 +10,12 @@ include <components.scad>
module dir_arc_plus_w_30mm_plate_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([-panel_x/2, 0, -25]) hull() dir_arc_w_30mm();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([-panel_x/2, 0, -50]) dir_arc_w_30mm();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
}
// cut out the normal holes
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
}

View File

@@ -8,8 +8,8 @@ include <components.scad>
module dir_arc_plus_w_30mm_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) dir_arc_w_30mm();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) dir_arc_w_30mm();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes

View File

@@ -0,0 +1,24 @@
/* Decorative plate for ergo action buttons.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad>
module ergo_nine_30mm_plate_decorative_plate() {
difference() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) ergo_nine_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]) ergo_nine_30mm();
}
}
ergo_nine_30mm_plate_decorative_plate();

View File

@@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate() {
difference() {
// get a 2mm slice of the jumbo decorative button cylinders
union() {
translate([-panel_x/2, 0, -70]) mirror([1, 0, 0]) ergo_wasd_five_30mm();
translate([panel_x/2, 0, -70]) ergo_nine_30mm();
}
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([-panel_x/2, 0, -1]) mirror([1, 0, 0]) ergo_wasd_five_30mm();
translate([panel_x/2, 0, -1]) ergo_nine_30mm();
}
}
ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate();

View File

@@ -0,0 +1,24 @@
/* Decorative plate for ergo WASD directional buttons.
*
* SPDX-FileCopyrightText: © 2025 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad>
module ergo_wasd_five_30mm_plate_decorative_plate() {
difference() {
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) ergo_wasd_seven_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]) ergo_wasd_five_30mm();
}
}
ergo_wasd_five_30mm_plate_decorative_plate();

View File

@@ -8,8 +8,8 @@ include <components.scad>
module sega_2p_6_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_6_button();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) sega_2p_6_button();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes

View File

@@ -10,10 +10,12 @@ include <components.scad>
module sega_2p_eleven_plate_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([panel_x/2, 0, -25]) hull() sega_2p_eleven();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([panel_x/2, 0, -50]) sega_2p_eleven();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
}
// cut out the normal holes
translate([panel_x/2, 0, -1]) sega_2p_eleven();
}

View File

@@ -8,17 +8,17 @@ include <parameters.scad>
decorative_radius_scale = 1.5;
include <components.scad>
module sega_2p_nine_decorative_plate_of_plates() {
module sega_2p_nine_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([panel_x/2, 0, -25]) hull() sega_2p_nine();
hull() difference() {
// get a 2mm slice of the decorative button cylinders
translate([panel_x/2, 0, -50]) sega_2p_nine();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
}
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([panel_x/2, 0, -1]) sega_2p_nine();
}
}
sega_2p_nine_decorative_plate_of_plates();
sega_2p_nine_decorative_plate();

View File

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

View File

@@ -9,8 +9,8 @@ include <components.scad>
module sega_2p_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p();
// get a 2mm slice of the decorative button cylinders
translate([0, 0, -50]) sega_2p();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes