Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
2166df5e3d
|
|||
|
12bf410aee
|
|||
|
7c8e504c46
|
|||
|
78d30db0c9
|
|||
|
522d960a37
|
|||
|
13e75fe71f
|
|||
|
0612a11e1e
|
|||
|
0d9657cf7c
|
|||
|
95cb69d268
|
|||
|
e87f579413
|
|||
|
0fd3880fa2
|
|||
|
d028736d5a
|
|||
|
80ce81c465
|
|||
|
8b5d994847
|
|||
|
852cef821c
|
|||
|
bf2f8a8a17
|
|||
|
1aea9221ff
|
|||
|
ea4beca89d
|
|||
|
aa92e57fe0
|
|||
|
0d121e834a
|
|||
|
d187312cd3
|
|||
|
4c045951c7
|
|||
|
bcf2adcaa2
|
|||
|
5e25a27d58
|
|||
|
462b4d45e0
|
|||
|
b0e5082064
|
|||
|
6df2d7a84f
|
|||
|
ef32076d98
|
|||
|
d9d1183488
|
|||
|
fe8826d86f
|
|||
|
8b96f60f37
|
@@ -6,8 +6,8 @@ all:
|
||||
cp ./docs/* ./build/docs/
|
||||
cp ./LICENSE ./build/LICENSE
|
||||
cp ./CHANGELOG.md ./build/CHANGELOG.md
|
||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls-and-docs.zip . -r; popd
|
||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip extras frames misc panels -r; popd
|
||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty --always`-stls-and-docs.zip . -r; popd
|
||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty --always`-stls.zip models -r; popd
|
||||
|
||||
clean:
|
||||
rm -rf ./build
|
||||
|
||||
@@ -16,7 +16,7 @@ Randomus](https://webirc.randomus.net/#buildable-stick-system)!**
|
||||
|
||||

|
||||
|
||||
[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.
|
||||
|
||||
@@ -11,8 +11,8 @@ import re
|
||||
import subprocess
|
||||
|
||||
PROJECT_ROOT = os.path.abspath(os.getcwd())
|
||||
BUILD_DIR = os.path.join(PROJECT_ROOT, 'build/')
|
||||
SOURCE_DIR = os.path.join(PROJECT_ROOT, 'src/')
|
||||
BUILD_DIR = os.path.join(PROJECT_ROOT, 'build', 'models')
|
||||
SOURCE_DIR = os.path.join(PROJECT_ROOT, 'src')
|
||||
|
||||
EXCLUDES = ['components.scad', 'parameters.scad']
|
||||
|
||||
@@ -25,6 +25,9 @@ processes = []
|
||||
os.chdir(SOURCE_DIR)
|
||||
for root, dirs, files in os.walk('.'):
|
||||
print(f"{root} {dirs} {files}")
|
||||
if root == './lib':
|
||||
continue
|
||||
|
||||
# make the current directory so that openscad can write stuff into it
|
||||
try:
|
||||
os.makedirs(os.path.join(BUILD_DIR, root))
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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";
|
||||
|
||||
+13
-19
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
+100
-8
@@ -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,90 @@ 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_eight_30mm() {
|
||||
translate([-51.75, 65.5, 0]) rotate([0, 0, 10]) {
|
||||
wasd_eight_30mm();
|
||||
}
|
||||
}
|
||||
|
||||
module ergo_nine_30mm() {
|
||||
ergo_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_eight_24mm() {
|
||||
translate([-63.25, 65.5, 0]) rotate([0, 0, 10]) {
|
||||
wasd_eight_24mm();
|
||||
}
|
||||
}
|
||||
|
||||
module ergo_nine_24mm() {
|
||||
ergo_eight_24mm();
|
||||
translate([0, 0, 0]) sega_2p_nine_thumb_button();
|
||||
}
|
||||
|
||||
module shiokenstar() {
|
||||
translate([-172, 32, 0]) dir_arc_24mm_directionals();
|
||||
sega_2p();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
// Library: MinkowskiRound.scad
|
||||
// Version: 1.0
|
||||
// Author: IrevDev
|
||||
// Copyright: 2020
|
||||
// License: MIT
|
||||
|
||||
/*
|
||||
---Modules
|
||||
round2d(outside radius,internal radius) -> takes 2d children
|
||||
This module will round 2d any shape
|
||||
|
||||
minkowskiRound(outsideRadius,internalRadius,enable,envelopecube[x,y,z]) -> takes 3d children
|
||||
This module will round any 3d shape though it takes a long time, possibly more than 12 hours (use a low $fn value, 10-15 to begin with) so make sure enable is set to 0 untill you are ready for final render,the envelopecube must be bigger than the object you are rounding, default values are [500,500,500].
|
||||
|
||||
minkowskiOutsideRound(radius,enable,envelopecube[x,y,z])
|
||||
minkowskiInsideRound(radius,enable,envelopecube[x,y,z])
|
||||
Both this modules do the same thing as minkowskiRound() but focus on either inside or outside radiuses, which means these modules use one less minkowski() (two instead of three) making them quicker if you don't want both inside and outside radiuses.
|
||||
|
||||
--Examples
|
||||
*/
|
||||
|
||||
//round2d(1,6)difference(){square([20,20]);square([10,10]);}
|
||||
//minkowskiRound(3,1.5,1)theshape();
|
||||
//minkowskiInsideRound(3,1)theshape();
|
||||
//minkowskiOutsideRound(3,1)theshape();
|
||||
|
||||
//---good test child for examples
|
||||
//module theshape(){//example shape
|
||||
// difference(){
|
||||
// cube([20,20,20]);
|
||||
// cube([10,10,10]);
|
||||
// }
|
||||
//}
|
||||
|
||||
// $fn=20;
|
||||
// minkowskiRound(0.7,1.5,1,[50,50,50])union(){//--example in the thiniverse thumbnail/main image
|
||||
// cube([6,6,22]);
|
||||
// rotate([30,45,10])cylinder(h=22,d=10);
|
||||
// }//--I rendered this out with a $fn=25 and it took more than 12 hours on my computer
|
||||
|
||||
|
||||
module round2d(OR=3,IR=1){
|
||||
offset(OR){
|
||||
offset(-IR-OR){
|
||||
offset(IR){
|
||||
children();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module minkowskiRound(OR=1,IR=1,enable=1,boundingEnvelope=[500,500,500]){
|
||||
if(enable==0){//do nothing if not enabled
|
||||
children();
|
||||
} else {
|
||||
minkowski(){//expand the now positive shape back out
|
||||
difference(){//make the negative shape positive again
|
||||
cube(boundingEnvelope-[0.1,0.1,0.1],center=true);
|
||||
minkowski(){//expand the negative shape inwards
|
||||
difference(){//create a negative of the children
|
||||
cube(boundingEnvelope,center=true);
|
||||
minkowski(){//expand the children
|
||||
children();
|
||||
sphere(IR);
|
||||
}
|
||||
}
|
||||
sphere(OR+IR);
|
||||
}
|
||||
}
|
||||
sphere(OR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module minkowskiOutsideRound(r=1,enable=1,boundingEnvelope=[500,500,500]){
|
||||
if(enable==0){//do nothing if not enabled
|
||||
children();
|
||||
} else {
|
||||
minkowski(){//expand the now positive shape
|
||||
difference(){//make the negative positive
|
||||
cube(boundingEnvelope-[0.1,0.1,0.1],center=true);
|
||||
minkowski(){//expand the negative inwards
|
||||
difference(){//create a negative of the children
|
||||
cube(boundingEnvelope,center=true);
|
||||
children();
|
||||
}
|
||||
sphere(r);
|
||||
}
|
||||
}
|
||||
sphere(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module minkowskiInsideRound(r=1,enable=1,boundingEnvelope=[500,500,500]){
|
||||
if(enable==0){//do nothing if not enabled
|
||||
children();
|
||||
} else {
|
||||
difference(){//make the negative positive again
|
||||
cube(boundingEnvelope-[0.1,0.1,0.1],center=true);
|
||||
minkowski(){//expand the negative shape inwards
|
||||
difference(){//make the expanded children a negative shape
|
||||
cube(boundingEnvelope,center=true);
|
||||
minkowski(){//expand the children
|
||||
children();
|
||||
sphere(r);
|
||||
}
|
||||
}
|
||||
sphere(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/* Fit a pin for the assembly holes.
|
||||
*
|
||||
* SPDX-FileCopyrightText: © 2026 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
// adjust the pin to have a good friction fit based on parameters
|
||||
pin_fit_scale = ((m4_bolt_hex_exterior_radius-hole_tolerance)*2)/(m4_bolt_hex_exterior_radius*2);
|
||||
|
||||
module frame_assembly_pin() {
|
||||
difference() {
|
||||
scale([pin_fit_scale, pin_fit_scale, 0.95]) resize([0, 0, inner_frame_z]) frame_hex_bolt_hole();
|
||||
scale([0.8, 0.8, 1]) resize([0, 0, inner_frame_z]) m4_hole();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
frame_assembly_pin();
|
||||
@@ -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();
|
||||
@@ -0,0 +1,17 @@
|
||||
/* A simple shim for improving panel-to-frame fit.
|
||||
*
|
||||
* SPDX-FileCopyrightText: © 2026 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module shim() {
|
||||
difference() {
|
||||
cube([frame_wall*2, frame_wall*2, 2]);
|
||||
rotate([0, 5, 0]) translate([-frame_wall, 0, 0.75]) cube([frame_wall*3, frame_wall*3, 2]);
|
||||
}
|
||||
}
|
||||
|
||||
shim();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
+2
-2
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
+2
-2
@@ -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();
|
||||
@@ -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();
|
||||
+8
-1
@@ -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
|
||||
|
||||
|
||||
@@ -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();
|
||||
@@ -0,0 +1,20 @@
|
||||
include <parameters.scad>
|
||||
decorative_radius_scale = 1.5;
|
||||
include <components.scad>
|
||||
include <lib/MinkowskiRound.scad>
|
||||
|
||||
module rounded_ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate() {
|
||||
difference() {
|
||||
linear_extrude(2) round2d(1, 50, $fn=100) projection(cut=true) union() {
|
||||
translate([-panel_x/2, 0, -50]) mirror([1, 0, 0]) ergo_wasd_five_30mm();
|
||||
translate([panel_x/2, 0, -50]) ergo_nine_30mm();
|
||||
}
|
||||
// cut out the normal holes
|
||||
union() {
|
||||
translate([-panel_x/2, 0, -1]) mirror([1, 0, 0]) ergo_wasd_five_30mm();
|
||||
translate([panel_x/2, 0, -1]) ergo_nine_30mm();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rounded_ergo_wasd_five_30mm_and_ergo_nine_30mm_decorative_plate();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
Reference in New Issue
Block a user