42 Commits

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

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

OUTER  INTER  INNER
INTER  INTER  INTER
INNER  INTER  OUTER

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

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

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

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

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

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

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

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

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

make is hard, let's go shopping

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

this also commits a demo of combining everything extended-style

phew

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-04-01 16:11:43 -05:00
92 changed files with 1048 additions and 458 deletions

85
CHANGELOG.md Normal file
View File

@@ -0,0 +1,85 @@
# CHANGELOG
Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.4.0
### Features
* New "windowed" frame box walls have been added, which allow for seeing through the outer wall to something else, such
as an inner wall of a different color, or for people who like showing off their wiring, nothing.
* An attempt at a two-panel "shiokenstar" layout has been added.
* The "plates" decorative plate for my favorite layout was altered since I wasn't using it anyway.
### Improvements
* The frame routing hole, in either the whole frames or the interconnect, is a semicircle on one side, making it easier
to wire (and rewire) a completed arcade stick, and it also makes button layouts that span the connection point more
possible.
* Less of the inner wall is cut out for e.g. Neutrik and aux buttons now, removing the possibility for inset panels to
allow for a tiny bit of light to seep the cracks and giving panels a bit more support.
* The piece-based frame walls now meet at 45 degree angles at the corners, which makes for fewer print anomalies to
catch your hand or clothing on. These 45 degree angles are not used for the TE1-style extended panels, which still
meet at 90 degree angles.
* All of the core arcade stick parts, and extras, have been reorganized and renamed into subdirectories that make their
purpose more obvious. This also makes it clearer what you're looking at when looking at the project file structure.
Documentation was updated throughout for this change.
### Miscellaneous
* A stand for showing off inset-based sticks has been added to extras. This may get more love in a future release.
* The blown up demo now uses frame pieces, as these are quickly becoming the standard build.
* Cleanups to CONTRIBUTING.md
* Demos have been given their own place in the repository.
* The Makefile has been altered to use a Python script to build the files, due to the complexity of reorganizing the
project into subdirectories.
* An abandoned floating stand has been moved into the attic --- it barely works right.
## v4.3.x
This finally removed the posts added to the panels introduced in v4.0.
## v4.2.x
This added TE1-like bevels to the repository, which look pretty neat.
## v4.1.0
Having improved the internals in v4.0.0, this broke out the frame into modular pieces, making them easier and more
reliable to print, with only a trivial effect on the overall stability of the stick. This also made the bottom panels
identical to the top, easing reuse.
## v4.0.x
This was an experiment that didn't survive scrutiny to add more posts to the frames and panels, in order to improve the
friction fit, but it really just make the whole thing more obnoxious to work with. However, this redesign also came with
some key improvements to the construction of the stick, which has made the subsequent releases easier to work with.
## v3.3.x
Largely a cleanup, this improved the component reuse and added more complete licensing information to the project.
## v3.2.x
This improved the frame height to accommodate more levers in inset panels, along with some cleanup.
## v3.1.x
This added panels for more layouts with more buttons, establishing my go-to of a lever, a directional arc with an extra
button in a W-as-in-WASD position, and a Sega 2P-inspired 9-button action button layout.
## v3.0.x
I think the project really took shape at this point, as it resized the panels and frames to accommodate a two-panel
layout for nice, long sticks.
## v2.0.x
This added the overhang plates to the mix, while still sticking to the three-panel design. It also started adding
dustwashers and decorative plates, which improved the aesthetics of the project.
## v1.0.x
This was a simple three-panel stick that was somewhat ridiculously long, but worked, and built a lot of the foundation
for the project. Its start as being inspired by the Open Stick really showed at this point, but things were coming
together.

View File

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

34
DCO.txt
View File

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

View File

@@ -1,19 +1,12 @@
EXCLUDES = blown-up-demo components parameters all:
OBJECTS := $(filter-out $(EXCLUDES),$(patsubst src/%.scad,%,$(wildcard src/*.scad))) python build.py
dir_guard=@mkdir -p ./build
all: $(OBJECTS)
$(dir_guard)
mkdir -p ./build/docs mkdir -p ./build/docs
cp ./docs/README-objects.md ./build/README.md cp ./docs/README-objects.md ./build/README.md
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.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/printing-and-materials.md ./build/docs/printing-and-materials.md
cp ./LICENSE ./build/LICENSE 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.zip . -r; popd
$(OBJECTS):
$(dir_guard)
openscad -o build/$@.stl src/$@.scad
clean: clean:
rm -rf ./build rm -rf ./build

View File

@@ -11,7 +11,7 @@ know someone or a library with a 3D printer? The Buildable Stick System may be t
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.] [OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
![A photo of a completed stick](docs/finished-v4.2.jpg) ![A photo of a completed stick](docs/finished-v4.4.jpg)
[Photo of a completed inset panel-based stick.] [Photo of a completed inset panel-based stick.]
@@ -30,19 +30,42 @@ starting with an existing object and constructing what you'd like with new or ex
## Usage of Parts ## Usage of Parts
There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help
about when/how to use specific parts: about what the types of parts are and how to use them:
* `panel-inset` --- these fit flush into a frame, creating a closed box enclosure. * `frames/`
* `panel-overhang` --- these have a tray that fits into a frame with the actual face extending beyond the frame, * `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
creating an ice cream sandwich enclosure. larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
* These also yield a bit more space inside the box, for tall levers or whatever. are harder to print because the physics of the material cooling will probably pull the corners up. They also need
* `frame` (non-pieces) --- these create the box of the enclosure, as one part. These can be hard to print well --- supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
shrinkage forces tend to curl up the corners no matter what you do, and some points need supports --- but if you don't * `pieces/`
care about that because you're printing an ice cream sandwich, they are simpler than... * `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
* `frame-piece` --- these break up the frame box into four faces, and are held together by friction fit and the hex modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
bolts. This is more stable than you might expect, but it does introduce some variability in the overall sturdiness of can lay them all face down on the print surface for better adhesion and surface patterns. There are also
the enclosure compared with the frame as one box piece. variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
* The `interconnect` replaces the need to bolt multiple frames together. * `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of
course need more material) --- watch your surface adhesion.
* `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
a two-panel-long stick.
* `panels/`
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space
inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix.
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
variants depending on where you put things.
* `misc/`
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
desired height. You don't *need* any of these, but you'll probably use a few.
* `extras/`
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes.
## Printing ## Printing
@@ -57,14 +80,14 @@ What you'll need beyond these objects:
* An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout * An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board)) Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
* 4 M3 8mm hex bolts to secure the PCB to a panel * 4 M3 8mm hex bolts to secure the PCB to a panel
* Per frame and plate combo: * Per frame and panel combo:
* 4 45mm M4 hex brass standoffs (or equivalent) * 4 45mm M4 hex brass standoffs (or equivalent)
* 8 M4 countersunk hex bolts * 8 M4 countersunk hex bolts
* Overhang plates should use 12-16mm length bolts since they are taller * Overhang panels should use 12-16mm length bolts since they are taller
* Inset plates should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm * Inset panels should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
too long to go flush too long to go flush
* If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts! * If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
* Per frame connection point: * Per frame connection point (only necessary if you are using complete frames and not frame pieces):
* 8 16mm M4 bolts * 8 16mm M4 bolts
* 8 M4 flange nuts * 8 M4 flange nuts
* For a lever: * For a lever:
@@ -99,8 +122,8 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic, 20% gyroid i
stick anyway stick anyway
* You can also use a shorter length with longer bolts, or combine multiple standoffs, if either of those yield better * You can also use a shorter length with longer bolts, or combine multiple standoffs, if either of those yield better
prices prices
* 8 16mm M4 bolts to connect top plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of * 8 16mm M4 bolts to connect top panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
* 8 12mm M4 bolts to connect bottom plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of * 8 12mm M4 bolts to connect bottom panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
2023-09-12) 2023-09-12)
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout

View File

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

4
attic/README.md Normal file
View File

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

View File

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

50
build.py Normal file
View File

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

View File

@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/extended/front-or-back.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-plus-one-plus-control-panel-with-mount.scad>
use <misc/decorative-plate-24mm-button.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
use <misc/dustwasher-lsx-nobi.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#8E9089";
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount();
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) extra_extended_left_or_right_frame_piece();
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) extended_front_or_back_frame_piece();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) extended_front_or_back_frame_piece();
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

View File

@@ -0,0 +1,35 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad>
use <frames/pieces/box/front-or-back.scad>
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/sega-2p-plus-one-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-plus-one.scad>
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
use <misc/dustwasher-lsx-nobi.scad>
panel_color = "red";
base_color = "gray";
top_deco_color = "white";
color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount();
color(base_color) translate([-frame_x/2+5, 0, -2.5]) left_frame();
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([0, 180, 0]) side_box_frame_piece();
color(base_color) translate([panel_x/2, 0, -2.5]) front_or_back_box_frame_piece();
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece();
color(base_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
color(base_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();

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

@@ -0,0 +1,33 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/interconnect.scad>
use <frames/pieces/box/side.scad>
use <frames/pieces/box/front-or-back.scad>
use <frames/pieces/box/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-plus-one-plus-control-panel-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-plus-one.scad>
use <misc/dustwasher-lsx-nobi.scad>
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) lever_and_dir_arc_w_30mm_left_overhang_panel();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
color("black") translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece();
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece();
color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece();
color("black") rotate([180, 0, 0]) rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece();
color("black") rotate([0, 180, 0]) interconnect_frame_piece();
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();
color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();

View File

@@ -6,26 +6,40 @@ Files for 3D printing an arcade stick.
The following notes document the objects in the Buildable Stick System and how you can use them: The following notes document the objects in the Buildable Stick System and how you can use them:
* `bottom-panel-inset`: a simple solid panel that fits into the bottom of a frame box. * `frames/`
* `bottom-panel-overhang-*`: solid panels whose base fits into the bottom of a frame box, but have a longer sheet that * `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
extends beyond the frame, creating a sandwich kind of look; the various forms hang over more or less of the frame, larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
expecting it will be connected to other frames. are harder to print because the physics of the material cooling will probably pull the corners up. They also need
* `frame-{left,middle,right,solo}`: the core frame of the stick, these are complete boxes; since they are long and supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
narrow, and need supports to print the space for the insets, these may be difficult to print nicely. * `pieces/`
* `frame-piece-*`: the core frame broken up by individual faces, which are easier to print and essentially just as * `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
sturdy. modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
* `frame-piece-*-extended*`: frame pieces that have been stretched out beyond the normal frame dimensions in order to can lay them all face down on the print surface for better adhesion and surface patterns. There are also
make a nice bevel on the sides and/or bottom; this, interestingly, tends to make the stick look a bit thinner than if variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
it was just a simple box. * `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
* `misc-decorative-plate-*`: things you can print to snazz up face buttons mounting, auxillary button points, etc.. box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of
* `misc-dustwasher-*`: simple dustwashers for levers. course need more material) --- watch your surface adhesion.
* `misc-lever-mount-*`: lever mounts of various shapes and depths to get the desired lever height when mounting a lever * `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
to a panel (with the appropriate cutouts). that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
* `misc-neutrik-*`: like the decorative plates, but these are a bit more necessary by their design. a two-panel-long stick.
* `misc-rocker-*`: rocker SPDT switches don't have mounting holes, this allows you to attach them to the frame. * `panels/`
* `top-panel-inset-*`: various lever and/or button layouts for using as the face(s) of a stick. * `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
* `top-panel-overhang-`: same idea as the inset top panels, but overhung over the frame to make the sandwich look; these top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space
also leave a bit more space inside the frame, which might accommodate a taller lever. inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix.
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
variants depending on where you put things.
* `misc/`
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
desired height. You don't *need* any of these, but you'll probably use a few.
* `extras/`
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes.
Feel free to request or contribute to more objects, see the links to Git repos below. Feel free to request or contribute to more objects, see the links to Git repos below.

View File

@@ -5,45 +5,32 @@ Just some miscellaneous notes for any dear reader, or more likely, my own forget
## Putting a BSS Stick Together ## Putting a BSS Stick Together
Assembly of a stick is pretty straightforward, but there are some choices that can make it easier or harder. The Assembly of a stick is pretty straightforward, but there are some choices that can make it easier or harder. The
following is the most consistent way I've found to put one together. This is assuming a v4.1 or beyond stick, with two following is the most consistent way I've found to put one together. This is assuming a v4.2 or beyond stick, with two
panels to make a long standard stick, and the frame made of pieces. panels to make a long standard stick, and the frame made of pieces.
1. Prepare the frame top pieces --- `frame-piece-top-{left,right}`: this is your best shot to get auxillary buttons, 1. Prepare the frame pieces: this is your best shot to get the e.g. Neutrik plates for the USB mount, SPDT switches, etc.
panel connectors, and the like installed, so do it now, and give them a good tighten. You shouldn't need to adjust installed, so do it now, and give them a good tighten. You shouldn't need to adjust these again, so finish their
these again, so finish their installation while the pieces are free. installation while the pieces are free.
1. This of course includes decorative plates --- e.g. `misc-decorative-plate-aux-control-three-button-cluster` --- 1. You could also do the decorative plates and related buttons, but it might be just as well to leave those for step 7,
you may choose to use. These are held to the top pieces by the buttons or component mounting screws. just to make sure the buttons don't get in the way of other buttons or a lever or so on.
2. Start the top panels --- `top-panel-(inset|overhang)-*`: you want both to get the components installed now 2. Start the top panels: you want both to get the components installed now when it's easy, and to make sure that the
when it's easy, and to make sure that the overall assembly works with your components, so again get your buttons, overall assembly works with your components, so again get your buttons, lever, etc., in place. You can secure them at
lever, etc., in place. this point.
1. If you are using a button decorative plate that spans two panels --- e.g. 1. If you are using a button decorative plate that spans two panels --- e.g.
`src/misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- don't tighten the buttons all the way, `misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as tightly
as you may need some wiggle to align the panels to the frame in a later step. as possible, and accurately, as they will be hard to adjust once everything is secured and in the frame.
2. If the above isn't the case, you can tighten all your buttons now. 2. If using a lever, don't forget the lever mount spacer --- `misc/lever-mount-sanwa-seimitsu` --- if you want it,
3. If using a lever, don't forget the lever mount spacer --- `src/misc-lever-mount-sanwa-seimitsu` --- if you want and tighten those mounting bolts now as well.
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
3. Create the frame box by combining your `frame-piece-*` parts together. This will be relatively stable just via just via friction fit.
friction fit. 4. Rest the frame top-up on a desk, and put the standoffs through the holes. This will probably be tight, and you may
4. Rest the frame top-up on a desk, and put the standoffs through the holes. even need a rubber mallet or similar to drive the standoffs through the holes.
5. Insert the top panels into the frame. The friction on this will probably be tight, and you may not be able to muscle 5. Insert the top panels into the frame.
it in on your own. Get the panel posts at least partially into the frame columns, in any event. If you get all the 6. Insert the bolts for the top panels, make any last adjustments, and tighten them.
panels completely in, the next steps will be easier, but it's not imperative.
6. Start the bolts for the top panels. Get it so that the bolts catch the standoffs, but don't tighten them completely.
You will want some wiggle when connecting the bottom panels, which is maybe the hardest part. Depending on your bolts
and how deep into the frame you got the top panels, you might need to push the standoffs up the column in order to
catch them with the bolts.
7. At this point you have an open box with access to all your components. Do all of your wiring. 7. At this point you have an open box with access to all your components. Do all of your wiring.
1. Tighten the buttons and etc. if you didn't in step 2. 1. Tighten the buttons and etc. if you didn't in step 2.
2. TEST YOUR BOARD AND COMPONENTS NOW! You don't want to have to undo the rest of the steps for something trivial, 8. Insert the bottom panels into the frame.
trust me. 9. Insert the bottom bolts for the bottom panels, and tighten them.
8. Insert the bottom panels into the frame. This may be difficult. If you got the top panels into the frame in step 4,
and left the bolts loose in step 5, you can make the standoffs rise outside of the frame column, which makes it
easier to line up the standoffs with the bottom panel posts.
9. Drive the bottom bolts into the standoffs. You probably don't have the panels all the way into the frame, but if you
can at least get the standoffs in the posts, you can catch them with the bottom bolts, and then let them guide the
panels into the frame.
10. Tighten all the bolts. If you didn't get the top panels flush in step 4, you can apply the same logic as in step 8
and tighten the bolts to guide the panels into the frame.
In the end, this should be extremely sturdy. None of the frame or panels should be loose at all, and you should be able In the end, this should be extremely sturdy. None of the frame or panels should be loose at all, and you should be able
to move, flip, gently toss, etc. the stick without anything moving or feeling loose. to move, flip, gently toss, etc. the stick without anything moving or feeling loose.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 66 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

View File

@@ -27,17 +27,8 @@ perfect pattern, making the long lines stand out even more.
seem to have issues with filling curves and you still want to try to maximize contact with walls. Concentric is great seem to have issues with filling curves and you still want to try to maximize contact with walls. Concentric is great
here if you dial it in. here if you dial it in.
Panels may have tiny gaps against the circular button cutouts; this is largely not a problem as buttom rims, decorative The concentric pattern is a good default and prints awesome parts, with the only exception being the top panels, which
plates, etc. will cover it up. However, I've had some interesting results with: benefit from using a Hilbert curve initial layer pattern instead of concentric.
* Initial layer line width: 0.42mm (down .08mm)
* Initial layer height: 0.25mm (up .05mm)
* Initial layer nozzle temperature: 230°C (up 10°C)
* Initial layer bed temperature: 70°C (up 5°C)
* Initial layer pattern: concentric
These are good defaults and print awesome parts, with the only exception being the top panels, which benefit from using
a Hilbert curve initial layer pattern instead of concentric.
## Materials ## Materials

View File

@@ -1,27 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-left.scad>
use <frame-right.scad>
use <top-panel-overhang-left-lever-and-dir_arc-plus-w-30mm.scad>
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
use <bottom-panel-overhang-left.scad>
use <bottom-panel-overhang-right.scad>
use <misc-decorative-plate-24mm-button.scad>
use <misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
use <misc-dustwasher-lsx-nobi.scad>
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) top_panel_left_lever_and_dir_arc_w_30mm();
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) top_panel_right_sega_2p_plus_one_plus_control_with_mount();
color("black") translate([-frame_x/2+5-25, 0, -2.5]) left_frame();
color("black") translate([frame_x/2+25, 0, -2.5]) right_frame();
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) bottom_panel_left();
color("#C12E1F") translate([panel_x/2+25, 0, -5-frame_z/2-75]) bottom_panel_right();
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();
color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();

View File

@@ -1,14 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <bottom-panel-overhang-left.scad>
module bottom_panel_right() {
rotate([0, 0, 180]) bottom_panel_left();
}
bottom_panel_right();

View File

@@ -55,7 +55,7 @@ module frame_hex_bolt_hole() {
} }
module frame_interchange_hole() { module frame_interchange_hole() {
cylinder(r=18, h=50, $fn=4, center=true); cylinder(r=37, h=50, $fn=50, center=true);
} }
module neutrik_d_hole() { module neutrik_d_hole() {
@@ -79,9 +79,10 @@ module rocker_20mm_mount() {
translate([-9.5, -12, 0]) neutrik_d_screw_hole(); translate([-9.5, -12, 0]) neutrik_d_screw_hole();
} }
// space for a neutrik D mount or 24mm button - Z is to cut the whole inside without affecting panel lip // space for a neutrik D mount or 24mm button --- Z is meant to leave some lip now that frames
// are primarily printed on their side
module frame_cutout() { module frame_cutout() {
cube([30.5, 8, frame_z-(panel_z*2)], center=true); cube([30.5, 8, frame_z-(panel_z*3)], center=true);
} }
// bank of three 24mm buttons, commonly on a frame face // bank of three 24mm buttons, commonly on a frame face
@@ -164,36 +165,7 @@ module levermountcountersinks() {
} }
module base_panel() { module base_panel() {
difference() {
union() {
cube([panel_x, panel_y, panel_z], center=true); cube([panel_x, panel_y, panel_z], center=true);
// add posts that sink into the frame, just to give
// a somewhat more sturdy/tight connection
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
}
// the posts mentioned above need space for the actual hex bolts
// used in connecting to the frame
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
scale([1, 1, 0.1]) frame_hex_bolt_hole();
}
}
module base_bottom_panel() {
mirror([0, 0, 1]) base_panel();
} }
module panel() { module panel() {
@@ -203,13 +175,6 @@ module panel() {
} }
} }
module bottom_panel() {
difference() {
base_bottom_panel();
mirror([0, 0, 1]) panel_holes();
}
}
module overhang_plate() { module overhang_plate() {
top_points = [ top_points = [
// top bevel // top bevel
@@ -260,7 +225,7 @@ module panel_with_raised_overhang() {
} }
} }
module frame_box() { module frame_solid() {
difference() { difference() {
top_points = [ top_points = [
// top bevel // top bevel
@@ -310,6 +275,12 @@ module frame_box() {
translate(p) cylinder(r=2, h=frame_bevel_height, center=true); translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
} }
} }
}
}
module frame_box() {
difference() {
frame_solid();
// cut out the middle to make it a box // cut out the middle to make it a box
cube([panel_x-(panel_support_width*2), panel_y-(panel_support_width*2), frame_z+5], center=true); cube([panel_x-(panel_support_width*2), panel_y-(panel_support_width*2), frame_z+5], center=true);
} }
@@ -319,7 +290,11 @@ module frame_mount_column() {
cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true); cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true);
// add some corners back to do a lame chamfer // add some corners back to do a lame chamfer
linear_extrude(height=frame_z, center=true) linear_extrude(height=frame_z, center=true)
polygon([[10, 10], [-20, 10], [10, -20]]); polygon([
[frame_mount_column_width/2, frame_mount_column_width/2],
[-frame_mount_column_width, frame_mount_column_width/2],
[frame_mount_column_width/2, -frame_mount_column_width]
]);
} }
module side_chopper() { module side_chopper() {
@@ -340,7 +315,8 @@ module frame_connection_holes() {
} }
module frame_cable_routing_hole() { module frame_cable_routing_hole() {
translate([frame_x/2, 0, 0]) rotate([0, 90, 0]) frame_interchange_hole(); // frame_y/12 is a hack for "kinda a bit above the center point"
translate([frame_x/2, frame_y/12+1, 25]) rotate([0, 90, 0]) frame_interchange_hole();
} }
module base_frame() { module base_frame() {
@@ -355,21 +331,11 @@ module frame() {
difference() { difference() {
base_frame(); base_frame();
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel(); translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) bottom_panel(); translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_panel();;
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole(); translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole(); translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole(); translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole(); translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
// slightly larger holes than the posts in the base_panel
translate([panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
} }
} }
@@ -484,3 +450,8 @@ module sega_2p_plus_one() {
// just my guesstimate on this one // just my guesstimate on this one
translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1();
} }
module shiokenstar() {
translate([-172, 32, 0]) dir_arc_24mm_directionals();
sega_2p();
}

View File

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

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

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

View File

@@ -1,29 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-piece-bottom-left-or-right.scad>
module bottom_piece_wall() {
// get a slice of the piece, to use it in extruding
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-frame_bevel_height, 0])
bottom_left_or_right_frame_piece();
}
module bottom_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
linear_extrude(height=frame_bevel_height) bottom_piece_wall();
}
}
module extended_bottom_left_or_right_frame_piece() {
bottom_left_or_right_frame_piece();
translate([0, -frame_y/2+frame_bevel_height*2, 0]) rotate([90, 0, 0]) bottom_piece_extension();
}
extended_bottom_left_or_right_frame_piece();

View File

@@ -1,26 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-left.scad>
module top_left_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_left_frame_piece();

View File

@@ -1,26 +0,0 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-right.scad>
module top_right_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
right_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall and lip on the right
translate([frame_x/2-frame_wall/2, 0, 0])
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_right_frame_piece();

View File

@@ -24,9 +24,9 @@ module left_frame() {
frame_cable_routing_hole(); frame_cable_routing_hole();
// aux button holes // aux button holes
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster(); translate([-35.25, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([-35.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([-72.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole // neutrix button hole

View File

@@ -24,9 +24,9 @@ module right_frame() {
mirror([1, 0, 0]) frame_cable_routing_hole(); mirror([1, 0, 0]) frame_cable_routing_hole();
// aux button holes // aux button holes
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster(); translate([35.25, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([35.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([72.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout(); translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole // neutrix button hole

View File

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

View File

@@ -0,0 +1,31 @@
/* The inner top/bottom wall of the frame, for being displayed through a windowed part.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
module mount_column_cutout() {
intersection() {
frame_mount_column();
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*5/8], center=true);
}
}
module front_or_back_inner_wall_frame_piece() {
difference() {
front_or_back_box_frame_piece();
// minus the outer wall
translate([0, -(frame_y-frame_wall)/2, 0]) cube([frame_x, frame_wall, frame_z], center=true);
// minus half of the mounting posts (the other half provided by the outer wall)
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 180])
mount_column_cutout();
translate([panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 270])
mount_column_cutout();
}
}
front_or_back_inner_wall_frame_piece();

View File

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

View File

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

View File

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

View File

@@ -5,9 +5,9 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-left.scad> use <frames/complete/left-frame.scad>
module bottom_left_or_right_frame_piece() { module front_or_back_box_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width; piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() { intersection() {
left_frame(); left_frame();
@@ -16,11 +16,15 @@ module bottom_left_or_right_frame_piece() {
translate([0, -(frame_y/2)+(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true); translate([0, -(frame_y/2)+(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall and lip on the left // ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y, frame_z], center=true); cube([frame_wall, frame_y-frame_wall*2, frame_z], center=true);
linear_extrude(height=frame_z, center=true) polygon([
[-frame_x/2, -frame_y/2], [-frame_x/2+frame_wall, -frame_y/2+frame_wall],
[-frame_x/2, -frame_y/2+frame_wall]
]);
// ...minus a slot for the combining piece to go into // ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true); cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, inner_frame_z/3], center=true);
} }
} }
} }
bottom_left_or_right_frame_piece(); front_or_back_box_frame_piece();

View File

@@ -0,0 +1,35 @@
/* The inner side wall of the frame, for being displayed through a windowed part.
*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
module mount_column_cutout() {
intersection() {
frame_mount_column();
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*21/24], center=true);
}
}
module side_inner_wall_frame_piece() {
difference() {
side_box_frame_piece();
// minus the outer wall
translate([-(frame_x-frame_wall)/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
// minus half of the mounting posts (the other half provided by the outer wall)
translate([-panel_to_frame_point_x, panel_to_frame_point_y, inner_frame_z/2]) rotate([0, 0, 90])
mount_column_cutout();
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), -inner_frame_z/2]) rotate([0, 0, 180])
mount_column_cutout();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -inner_frame_z/2]) rotate([0, 0, 90])
mount_column_cutout();
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), inner_frame_z/2]) rotate([0, 0, 180])
mount_column_cutout();
}
}
side_inner_wall_frame_piece();

View File

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

View File

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

View File

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

View File

@@ -5,20 +5,19 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-piece-top-left.scad> use <front-or-back.scad>
use <frame-piece-bottom-left-or-right.scad>
module side_frame_piece() { module side_box_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width; piece_width = panel_support_width+frame_wall+frame_mount_column_width;
difference() { difference() {
// side piece is left/right agnostic // side piece is left/right agnostic
frame(); frame();
// minus the top and bottom // minus the top and bottom
top_left_frame_piece(); front_or_back_box_frame_piece();
bottom_left_or_right_frame_piece(); rotate([180, 0, 0]) front_or_back_box_frame_piece();
// and just chop out the rest of the frame // and just chop out the rest of the frame
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true); translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
} }
} }
side_frame_piece(); side_box_frame_piece();

View File

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

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/box/front-or-back.scad>
module front_or_back_box_frame_piece_for_extended_side() {
difference() {
front_or_back_box_frame_piece();
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
}
}
front_or_back_box_frame_piece_for_extended_side();

View File

@@ -0,0 +1,37 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back-clean-for-extended-side.scad>
module clean_front_or_back() {
difference() {
front_or_back_box_frame_piece_for_extended_side();
// chop off the lip we left on the basic piece
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
};
}
module bottom_piece_wall() {
// get a slice of the piece (before the bevel), to use it in extruding
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-(frame_wall-frame_bevel_height)*3/2, 0])
clean_front_or_back();
}
module bottom_piece_extension() {
// combine the original with a shrunken piece to "pull" the wall out
hull() {
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
linear_extrude(height=(frame_wall-frame_bevel_height)) bottom_piece_wall();
}
}
module extended_front_or_back_frame_piece() {
clean_front_or_back();
translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) bottom_piece_extension();
}
extended_front_or_back_frame_piece();

View File

@@ -5,13 +5,16 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-piece-bottom-left-or-right-extended.scad> use <frames/complete/left-frame.scad>
use <frame-piece-side.scad> use <frames/pieces/box/side.scad>
use <front-or-back.scad>
module side_and_bottom_frame_piece_wall() { module side_and_bottom_frame_piece_wall() {
// get a slice of the pieces, to use it in extruding // get a slice of the pieces, to use it in extruding
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0]) // this doesn't use the side_frame_piece because of the 45 degree angle geometry
side_frame_piece(); // 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) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
} }
@@ -25,7 +28,7 @@ module side_and_bottom_frame_piece_extension() {
module extra_extended_left_or_right_frame_piece() { module extra_extended_left_or_right_frame_piece() {
difference() { difference() {
side_frame_piece(); side_box_frame_piece();
// chop off the old edge which is getting replaced with the extension // chop off the old edge which is getting replaced with the extension
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true); translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
} }

View File

@@ -5,12 +5,16 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-piece-side.scad> use <frames/complete/left-frame.scad>
use <frames/pieces/box/side.scad>
use <front-or-back-clean-for-extended-side.scad>
module side_frame_piece_wall() { module side_frame_piece_wall() {
// get a slice of the piece, to use it in extruding // get a slice of the piece, to use it in extruding
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0]) // this doesn't use the side_frame_piece because of the 45 degree angle geometry
side_frame_piece(); // not creating a clean thing to cut, so we just take the whole wall and use that
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
left_frame();
} }
module side_frame_piece_extension() { module side_frame_piece_extension() {
@@ -23,7 +27,7 @@ module side_frame_piece_extension() {
module extended_bottom_left_or_right_frame_piece() { module extended_bottom_left_or_right_frame_piece() {
difference() { difference() {
side_frame_piece(); side_box_frame_piece();
// chop off the old edge which is getting replaced with the extension // chop off the old edge which is getting replaced with the extension
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true); translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
decorative_radius_scale = 1.5;
jumbo_decorative_radius_scale = 0;
include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates() {
difference() {
// get a 2mm slice of the bigger button cylinders
union() {
translate([-panel_x/2, 0, -25]) hull() dir_arc_w_30mm();
translate([panel_x/2, 0, -25]) hull() sega_2p_plus_one();
}
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
translate([panel_x/2, 0, -1]) sega_2p_plus_one();
}
}
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,4 +6,4 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
bottom_panel(); panel();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <top-panel-inset-sega-2p-plus-one-plus-control.scad> use <sega-2p-plus-one-plus-control-panel.scad>
module top_panel_inset_sega_2p_plus_one_plus_control_with_mount() { module sega_2p_plus_one_plus_control_panel_with_mount() {
top_panel_inset_sega_2p_plus_one_plus_control(); sega_2p_plus_one_plus_control_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount(); translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
} }
top_panel_inset_sega_2p_plus_one_plus_control_with_mount(); sega_2p_plus_one_plus_control_panel_with_mount();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_inset_sega_2p_plus_one_plus_control() { module sega_2p_plus_one_plus_control_panel() {
difference() { difference() {
panel(); panel();
sega_2p_plus_one(); sega_2p_plus_one();
@@ -15,4 +15,4 @@ module top_panel_inset_sega_2p_plus_one_plus_control() {
} }
} }
top_panel_inset_sega_2p_plus_one_plus_control(); sega_2p_plus_one_plus_control_panel();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module shiokenstar_left_panel() {
difference() {
translate([-frame_x/2+frame_wall, 0, 0]) panel();
translate([75, 0, 0]) shiokenstar();
}
}
shiokenstar_left_panel();

View File

@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module shiokenstar_right_panel() {
difference() {
translate([frame_x/2-frame_wall, 0, 0]) panel();
translate([75, 0, 0]) shiokenstar();
}
}
shiokenstar_right_panel();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_left_lever_and_dir_arc_w_30mm() { module lever_and_dir_arc_w_30mm_left_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
dir_arc_w_30mm(); dir_arc_w_30mm();
@@ -16,4 +16,4 @@ module top_panel_left_lever_and_dir_arc_w_30mm() {
} }
} }
top_panel_left_lever_and_dir_arc_w_30mm(); lever_and_dir_arc_w_30mm_left_overhang_panel();

View File

@@ -7,7 +7,7 @@ include <parameters.scad>
include <components.scad> include <components.scad>
// combine the lever mount and generic plate, with mounting holes // combine the lever mount and generic plate, with mounting holes
module top_panel_left_lever() { module lever_left_overhang_panel() {
difference() { difference() {
// base plate // base plate
panel_with_raised_overhang(); panel_with_raised_overhang();
@@ -18,4 +18,4 @@ module top_panel_left_lever() {
} }
} }
top_panel_left_lever(); lever_left_overhang_panel();

View File

@@ -5,14 +5,14 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <bottom-panel-overhang-solo.scad> use <solo-panel.scad>
module bottom_panel_left() { module left_or_right_overhang_panel() {
difference() { difference() {
bottom_panel_solo(); solo_overhang_panel();
// chop the right edge off // chop the right edge off
side_chopper(); side_chopper();
} }
} }
bottom_panel_left(); left_or_right_overhang_panel();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <top-panel-overhang-middle-dir_arc-plus-w-30mm.scad> use <middle-dir_arc-plus-w-30mm-panel.scad>
module top_panel_middle_dir_arc_w_30mm_with_mount() { module dir_arc_w_30mm_middle_overhang_panel_with_mount() {
top_panel_middle_dir_arc_w_30mm(); dir_arc_w_30mm_middle_overhang_panel();
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount(); translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount();
} }
top_panel_middle_dir_arc_w_30mm_with_mount(); dir_arc_w_30mm_middle_overhang_panel_with_mount();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_middle_dir_arc_w_30mm() { module dir_arc_w_30mm_middle_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
dir_arc_w_30mm(); dir_arc_w_30mm();
@@ -15,4 +15,4 @@ module top_panel_middle_dir_arc_w_30mm() {
} }
} }
top_panel_middle_dir_arc_w_30mm(); dir_arc_w_30mm_middle_overhang_panel();

View File

@@ -5,14 +5,13 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <bottom-panel-overhang-left.scad> use <left-or-right-panel.scad>
use <bottom-panel-overhang-right.scad>
module bottom_panel_middle() { module middle_overhang_panel() {
intersection() { intersection() {
bottom_panel_left(); left_or_right_overhang_panel();
bottom_panel_right(); mirror([1, 0, 0]) left_or_right_overhang_panel();
} }
} }
bottom_panel_middle(); middle_overhang_panel();

View File

@@ -5,11 +5,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <top-panel-overhang-right-sega-2p-plus-one.scad> use <right-sega-2p-plus-one-panel.scad>
module top_panel_right_sega_2p_plus_one_with_mount() { module sega_2p_plus_one_with_mount_right_overhang_panel() {
top_panel_right_sega_2p_plus_one(); sega_2p_plus_one_right_overhang_panel();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount(); translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
} }
top_panel_right_sega_2p_plus_one_with_mount(); sega_2p_plus_one_with_mount_right_overhang_panel();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_right_sega_2p_plus_one() { module sega_2p_plus_one_right_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
sega_2p_plus_one(); sega_2p_plus_one();
@@ -14,4 +14,4 @@ module top_panel_right_sega_2p_plus_one() {
} }
} }
top_panel_right_sega_2p_plus_one(); sega_2p_plus_one_right_overhang_panel();

View File

@@ -5,14 +5,14 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad> use <right-sega-2p-plus-one-plus-control-panel-with-mount.scad>
module top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled() { module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled() {
difference() { difference() {
top_panel_right_sega_2p_plus_one_plus_control_with_mount(); sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout(); translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
} }
translate([75, 77.5, 0.5]) oled_ssd1306_mount(); translate([75, 77.5, 0.5]) oled_ssd1306_mount();
} }
top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled(); sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled();

View File

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

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_right_sega_2p_plus_one_plus_control() { module sega_2p_plus_one_plus_control_right_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
sega_2p_plus_one(); sega_2p_plus_one();
@@ -15,4 +15,4 @@ module top_panel_right_sega_2p_plus_one_plus_control() {
} }
} }
top_panel_right_sega_2p_plus_one_plus_control(); sega_2p_plus_one_plus_control_right_overhang_panel();

View File

@@ -6,11 +6,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module dir_arc_24mm_6_button_panel() { module dir_arc_24mm_6_button_solo_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
translate([-71.5, -panel_y/2+122.5, 0]) dir_arc_24mm_6_button(); translate([-71.5, -panel_y/2+122.5, 0]) dir_arc_24mm_6_button();
} }
} }
dir_arc_24mm_6_button_panel(); dir_arc_24mm_6_button_solo_overhang_panel();

View File

@@ -6,11 +6,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module dir_arc_plus_w_24mm_8_button_panel() { module dir_arc_plus_w_24mm_8_button_solo_overhang_panel() {
difference() { difference() {
panel_with_raised_overhang(); panel_with_raised_overhang();
translate([-80.5, panel_y/6, 0]) dir_arc_plus_w_24mm_8_button(); translate([-80.5, panel_y/6, 0]) dir_arc_plus_w_24mm_8_button();
} }
} }
dir_arc_plus_w_24mm_8_button_panel(); dir_arc_plus_w_24mm_8_button_solo_overhang_panel();

View File

@@ -6,7 +6,7 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module top_panel_solo_lever_and_sega_2p_6_button() { module lever_and_sega_2p_6_button_solo_overhang_panel() {
difference() { difference() {
// base plate // base plate
union() { union() {
@@ -18,4 +18,4 @@ module top_panel_solo_lever_and_sega_2p_6_button() {
} }
} }
top_panel_solo_lever_and_sega_2p_6_button(); lever_and_sega_2p_6_button_solo_overhang_panel();

View File

@@ -6,11 +6,11 @@
include <parameters.scad> include <parameters.scad>
include <components.scad> include <components.scad>
module bottom_panel_solo() { module solo_overhang_panel() {
difference() { difference() {
rotate([180, 0, 0]) base_panel_with_raised_overhang(); rotate([180, 0, 0]) base_panel_with_raised_overhang();
rotate([180, 0, 0]) panel_holes(); rotate([180, 0, 0]) panel_holes();
} }
} }
bottom_panel_solo(); solo_overhang_panel();

View File

@@ -37,6 +37,11 @@ frame_x = 233;
frame_y = 208; frame_y = 208;
frame_z = 57; frame_z = 57;
// stand dimensions to display a stick
stand_x = 5;
stand_y = frame_z;
stand_z = 15;
// degree to which the extended frame pieces stick out from the end of the frame // degree to which the extended frame pieces stick out from the end of the frame
frame_extension_x = 25; frame_extension_x = 25;
frame_extension_y = 25; frame_extension_y = 25;
@@ -62,6 +67,9 @@ panel_x = frame_x - (frame_wall * 2);
panel_y = frame_y - (frame_wall * 2); panel_y = frame_y - (frame_wall * 2);
panel_z = 5; panel_z = 5;
// inside the frame
inner_frame_z = frame_z - (panel_z * 2);
// how much the top plate x/y is expanded to overhang the frame // how much the top plate x/y is expanded to overhang the frame
// note that this is relative to the top plate (so the wall is added back) // note that this is relative to the top plate (so the wall is added back)
panel_overhang_amount = 8.5; panel_overhang_amount = 8.5;

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 <top-panel-overhang-right-sega-2p-plus-one-plus-control.scad>
module top_panel_right_sega_2p_plus_one_plus_control_with_mount() {
top_panel_right_sega_2p_plus_one_plus_control();
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
}
top_panel_right_sega_2p_plus_one_plus_control_with_mount();