57 Commits

Author SHA1 Message Date
6a4980165d write down a thing to try if I ever get time 2023-11-10 15:49:45 -06:00
7d3b4c0a6c update notes on bolts/plate heights 2023-11-10 15:49:26 -06:00
f2efee40ee include a finished photo, this time of an inset-based stick 2023-11-10 15:49:14 -06:00
53ecd27047 convert decorative plates to scaling the base button rather than adding 2023-11-09 12:47:05 -06:00
544f4fb4ce cleanups to the decorative plates 2023-11-09 12:29:18 -06:00
b9d66a4a2f remove commented out code 2023-11-09 08:02:47 -06:00
696697f574 more inset panels, my normal 9+1 buttons 2023-11-09 07:52:05 -06:00
d2a1a5be13 scoot the dir arc in and up a bit
the horizontal move sends the dir arc closer to the edge, and the
vertical move puts the top back where it used to be before moving the
rest of the layouts down

both of these choices are entirely subjective
2023-11-08 18:38:06 -06:00
56f2214339 scoot the button layouts down a bit
this gives a bit more space at the front, mostly so that the decorative
plate doesn't hang over the edge of an inset panel
2023-11-08 18:37:02 -06:00
6fa474b748 update README, need 40mm spacers since chopping the bottom 2023-11-08 18:14:19 -06:00
e13946e883 inset panel for a lever + directionals + W 2023-11-07 14:39:36 -06:00
fbf0dc6896 allow the frame bottom to take insets/raised panels too
this complicates the print, in that now printing the frame requires
supports, but by cutting in on the bottom the same way as the top, we
can center some stuff better and also make the plates a bit more
interchangeable. this also eliminates the slightly unsightly bottom
panel hanging out in the open, so overall I think it's worth the
printing complication
2023-11-02 16:34:08 -05:00
538fb1430b add a dustwasher for JLF mounts 2023-10-26 18:09:41 -05:00
8025038db5 improve 24mm + W layout components, add decorative plate 2023-10-04 16:47:06 -05:00
11107fe826 add lever + 6 30mm button sega 2P layout panel
a bit tight but totally possible
2023-10-04 16:45:53 -05:00
4ec97b9f36 add components for an OLED cutout and panel using it 2023-10-04 16:44:59 -05:00
a960e57bd1 docs updates for v3 2023-09-17 11:33:49 -05:00
c67722d0da simple button outline for a single 24mm button 2023-09-17 11:29:31 -05:00
fa1f6927c5 new demo for v3 --- two panels 2023-09-17 11:28:56 -05:00
1da14d6dc3 remove stuff taken care of, bump engraving down again 2023-09-15 15:32:24 -05:00
0611e23975 keep some notes on filament while I'm at it 2023-09-15 15:30:10 -05:00
87db45df15 complete the cost estimation: total ~$26 for an enclosure 2023-09-15 15:20:17 -05:00
28809230bc sega 2p panel with a button for start or whatever 2023-09-15 15:03:49 -05:00
2253889430 remove unnecessary difference/union duplication 2023-09-15 15:01:39 -05:00
a26f87a9d2 fit an arcade layout in one panel 2023-09-13 21:17:45 -05:00
962402c291 new top panels for my current two-frame experiment
seems good so far
2023-09-13 20:46:00 -05:00
63c7113d9f more notes for next time 2023-09-12 23:52:32 -05:00
163dfc2c63 commit my new target assembly 2023-09-12 23:51:37 -05:00
aa633584e5 don't mirror, mostly duplicate the left frame components into right frame
doing a naive mirror meant the neutrik D mount holes were in the wrong
spot. fine for a 20mm + plate mount, but not good for any actual
component
2023-09-12 23:40:51 -05:00
767b38acef more TODO notes 2023-09-12 23:40:48 -05:00
56367369b7 more panel estimates 2023-09-12 20:19:43 -05:00
fa304606df generalize the top panel cost, they should all come in around this 2023-09-12 17:09:30 -05:00
5d5eb34f8a top panel cost for something like the lever + dir_arc panel 2023-09-12 13:03:35 -05:00
17ab4815a6 more cost estimate documentation 2023-09-12 10:36:15 -05:00
afd548f8d9 correct hardware notes, since v2 the M4 standoffs are 45mm 2023-09-12 10:14:45 -05:00
e2549694ea start estimating cost of build 2023-09-12 09:24:33 -05:00
2aab029905 use the same frame cutout for neutrik D and 24mm holes 2023-09-11 20:34:09 -05:00
0f11aacec4 un-rotate the solo frame now that X is longer 2023-09-11 20:28:33 -05:00
3f0712af70 try making the frame wider than it is deep
the goal is to try to fit a hitstick-w into two frames
2023-09-11 13:29:40 -05:00
51ba220a5a refer to proper parent filename 2023-09-11 12:01:27 -05:00
47d9a523c3 remove double translation of dir_arc-30mm layouts 2023-09-11 11:43:25 -05:00
3e74f3d915 refer to proper parent filename 2023-09-11 11:28:18 -05:00
cfb48574b2 change 30mm dir_arc layouts to be based on the thumb position
this will hopefully make some moving of stuff around a bit easier
2023-09-11 11:25:59 -05:00
36a96fbe26 tighten up the inner hole a bit, to no noticeable detriment 2023-09-11 10:37:46 -05:00
86ba641ba6 modularize the directional arc part of the 24mm all buttons layout
this was for a failed experiment, but it's probably good to do this
regardless
2023-09-11 10:37:43 -05:00
3d24dad1ae spread out the frame connection holes a bit 2023-09-11 09:56:52 -05:00
fe961e8a7e make neutrik D cutout bigger, simplifies that frame wall 2023-09-11 09:45:09 -05:00
28c0c0e475 properly and relatively position neutrik cutouts 2023-09-11 09:33:39 -05:00
2960151d98 remove more magic numbers, overhang relative to base frame stuff 2023-09-08 14:08:40 -05:00
82d1913551 remove more magic numbers, top plate is a derivative of base frame dimensions 2023-09-08 13:53:51 -05:00
88fc53988e remove some magic numbers that are derived from base dimensions 2023-09-08 13:44:05 -05:00
f73c94be2f move the rotated top plate into something reusable 2023-09-08 13:17:04 -05:00
cd21b4dd0a remove unused import 2023-09-08 13:14:53 -05:00
7a71c8cd81 simple naming consistency change
sed -i 's/topplate_with_raised/top_plate_with_raised/' **/*.scad
2023-09-08 12:22:53 -05:00
350fc27285 break up the sega 2P layout into parts
messing with something that may never see the light of day, but no harm
in doing this
2023-09-08 12:15:46 -05:00
3b3b857568 build improvements, create zip file 2023-09-07 19:53:56 -05:00
fddb5d450e commit my scratch file since it's a good demo 2023-09-07 19:17:48 -05:00
38 changed files with 750 additions and 141 deletions

View File

@@ -1,11 +1,14 @@
SRCDIR = ./src SRC_FILES := $(wildcard ./src/*.scad)
all: $(SRCDIR)/* SRC_FILES := $(filter-out ./src/blown-up-demo.scad, $(SRC_FILES))
mkdir -p build SRC_FILES := $(filter-out ./src/components.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/roundedcube.scad, $(SRC_FILES))
all: $(SRC_FILES)
mkdir -p ./build
for file in $^ ; do \ for file in $^ ; do \
openscad -o $${file}.stl $${file} ; \ openscad -o $${file}.stl $${file} ; \
mv $${file}.stl build ; \ mv $${file}.stl ./build/ ; \
done done
zip ./build/buildable-stick-system-`git describe --dirty`-stls.zip ./build/*
clean: clean:
rm build/*.stl rm -rf ./build
rmdir build

View File

@@ -2,7 +2,13 @@
Files for 3D printing an arcade stick. Files for 3D printing an arcade stick.
![An example of stick components displayed in OpenSCAD](docs/three-panel-example-v2.png) ![An example of stick components displayed in OpenSCAD](docs/two-panel-example-v3.png)
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
![A photo of a completed stick](docs/finished-v3.1.jpg)
[Photo of a completed inset panel-based stick.]
Originally an attempt to make a couple customized STL files for the [OpenStickCommunity Fightstick Originally an attempt to make a couple customized STL files for the [OpenStickCommunity Fightstick
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), the changes ballooned to fit my Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), the changes ballooned to fit my
@@ -30,18 +36,58 @@ What you'll need beyond these objects:
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board)) Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
* 4 M3 8mm hex bolts to secure the PCB to a panel * 4 M3 8mm hex bolts to secure the PCB to a panel
* Per frame and plate combo: * Per frame and plate combo:
* 4 40mm M4 hex brass standoffs * 4 40mm M4 hex brass standoffs (or equivalent)
* 8 12-16mm M4 countersunk hex bolts * 8 M4 countersunk hex bolts
* Overhang plates should use 12-16mm length bolts since they are taller
* Inset plates should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
too long to go flush
* If making the 40mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
* Per frame connection point: * Per frame connection point:
* 8 16mm M4 bolts * 8 16mm M4 bolts
* 8 M4 flange nuts * 8 M4 flange nuts
* For a lever: * For a lever:
* 4 12-16mm M4 countersunk hex bolts * 4 12-16mm M4 countersunk hex bolts
* 4 M4 flange nuts * 4 M4 flange nuts
* For Neutrik D connections:
* 2 10mm M3 hex bolts
* 2 M3 flange nuts
* Buttons and levers as desired * Buttons and levers as desired
* Wiring as required * Wiring as required
### Issues and Limitations ## Rough Costs
This is a rough estimate of the cost to produce one of these sticks, assuming a usual 2-frame design and layout.
Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
* Left and right frame: **$7.08 USD** (141.84g each, as of 2023-09-12)
* Left and right (overhang) top panels: **~$6.74 USD** (~135g each, as of 2023-09-12)
* Left and right (overhang) bottom panels: **$5.90 USD** (118.16g each, as of 2023-09-12)
* Miscellaneous mounting plates, decorative plates, etc.: **~$1.00 USD** (~40g, as of 2023-09-12)
* 8 16mm M4 bolts to connect the frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of 2023-09-12)
* 8 M4 flange nuts to connect the frames: **$0.68 USD** (you can get a pack of 100 on Amazon for $8.50, as of 2023-09-12)
* 4 10mm M3 bolts to connect Neutrik D plates to frames: **$0.40 USD** (you can get a pack of 100 on Amazon for $10, as
of 2023-09-12)
* 4 M3 flange nuts to connect Neutrik D plates to frames: **$0.34 USD** (you can get a pack of 100 on Amazon for $8.50,
as of 2023-09-12)
* 8 40mm M4 spacers to connect panels to frames: **$2.40 USD** (you can get a pack of 10 on AliExpress for $3, as of
2023-09-12)
* You could 3D print these too, but you're probably better off with brass ones as they give some weight to the
stick anyway
* You can also use a shorter length with longer bolts, or combine multiple spacers, if either of those yield better
prices
* 8 16mm M4 bolts to connect top plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
* 8 12mm M4 bolts to connect bottom plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
2023-09-12)
With an enclosure coming in around $26, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
Board, ~$60 for Sanwa buttons and a lever, and ~$20 for miscellaneous connectors and wiring --- you can put a
full-featured controller with an open source foundation together for around $135.
## Miscellany
See the `/docs/` directory for more thoughts too scattered for this document.
## Issues and Limitations
This is a living repository, and as such, there are likely issues with the objects, known or otherwise. This is a living repository, and as such, there are likely issues with the objects, known or otherwise.
These issues may be fixed in the future; see `TODO.md` for details. These issues may be fixed in the future; see `TODO.md` for details.

View File

@@ -2,8 +2,10 @@
Notes for "next time". Notes for "next time".
## v3 ## v4
* Check that the 24mm cutouts in the frame are good enough, somehow I didn't have them when I printed v2
* Engraving some cosmetic stuff? Or maybe a place to mount other plates? * Engraving some cosmetic stuff? Or maybe a place to mount other plates?
* Try making it so top plates are bolted in from the side of the frame rather than the top * Try making it so top plates are bolted in from the side of the frame rather than the top
* I'm thinking of abandoning this, because it makes the frame more complicated to have a portion of a column rather
than the full column, but I'll keep it here for a bit longer
* Try making frames out of four pieces connected at joints on the hex posts, rather than one large piece?

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

24
docs/materials.md Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

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

@@ -0,0 +1,39 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
use <frame-left.scad>
use <frame-right.scad>
use <top-panel-left-lever-and-dir_arc-plus-w-30mm.scad>
use <top-panel-right-sega-2p-plus-one-plus-control-with-mount.scad>
use <bottom-panel-left.scad>
use <bottom-panel-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([-top_plate_x/2-25, 0, frame_z/2+75]) top_panel_left_lever_and_dir_arc_w_30mm();
color("#C12E1F") translate([top_plate_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([-top_plate_x/2-25, 0, -5-frame_z/2-75]) bottom_panel_left();
color("#C12E1F") translate([top_plate_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([top_plate_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();

View File

@@ -21,7 +21,7 @@ include <components.scad>
module bottom_panel() { module bottom_panel() {
difference() { difference() {
mirror([0, 0, 1]) topplate(); mirror([0, 0, 1]) topplate();
translate([0, 0, top_plate_z/2]) cube([top_plate_x*5/6, top_plate_y*5/6, top_plate_z], center=true); translate([0, 0, top_plate_z/2]) cube([top_plate_x-40, top_plate_y-40, top_plate_z], center=true);
} }
} }

View File

@@ -21,7 +21,7 @@ include <components.scad>
module bottom_panel_solo() { module bottom_panel_solo() {
difference() { difference() {
bottom_plate_with_overhang(); bottom_plate_with_overhang();
translate([0, 0, top_plate_z/2]) cube([top_plate_x*5/6, top_plate_y*5/6, top_plate_z], center=true); translate([0, 0, top_plate_z/2]) cube([top_plate_x-40, top_plate_y-40, top_plate_z], center=true);
} }
} }

View File

@@ -23,6 +23,9 @@ include <roundedcube.scad>
// adjustments // adjustments
hole_tolerance = 0.15; hole_tolerance = 0.15;
// M2
m2_screw_selftap_radius = 0.95;
// M3 // M3
m3_screw_selftap_radius = 1.3; m3_screw_selftap_radius = 1.3;
@@ -43,13 +46,31 @@ lever_mount_y = 95;
lever_mount_z = 2; lever_mount_z = 2;
// case dimensions // case dimensions
frame_x = 183; // base frame box. reminder: top of inside (including mounts) is chopped by top_plate_z for plates
frame_x = 233;
frame_y = 208; frame_y = 208;
frame_z = 50; // reminder: inside (including mounts) is chopped by top_plate_z for plates frame_z = 50;
top_plate_x = 175;
top_plate_y = 200; // depth of the "lip" of the frame that the top plate sets into/supports the overhang
frame_wall = 8;
// per neutrik (mm)
neutrik_panel_thickness = 3;
// top plate, which can either be the whole plate ("inset") or the mounting frame for a plate that overhangs
top_plate_x = frame_x - frame_wall;
top_plate_y = frame_y - frame_wall;
top_plate_z = 5; top_plate_z = 5;
// how much the top plate x/y is expanded to overhang the frame
// note that this is relative to the top plate (so the wall is added back)
top_plate_overhang_amount = frame_wall + 17;
overhang_top_plate_x = top_plate_x + top_plate_overhang_amount;
overhang_top_plate_y = top_plate_y + top_plate_overhang_amount;
plate_to_frame_point_x = (top_plate_x/2)-10;
plate_to_frame_point_y = (top_plate_y/2)-10;
// frame interior that supports the top plates // frame interior that supports the top plates
panel_support_width = 5; panel_support_width = 5;
@@ -58,8 +79,8 @@ neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance; neutrik_d_radius = 12 + hole_tolerance;
// additional button radius for decorative panels, etc. // additional button radius for decorative panels, etc.
decorative_radius = 12; decorative_radius_scale = 1.75;
jumbo_decorative_radius = 15; jumbo_decorative_radius_scale = 2;
/* PARTS */ /* PARTS */
@@ -73,15 +94,15 @@ module m4_hole_countersink() {
module top_plate_holes() { module top_plate_holes() {
// holes for mount bolts // holes for mount bolts
translate([77.5, 90, 0]) m4_hole(); translate([plate_to_frame_point_x, plate_to_frame_point_y, 0]) m4_hole();
translate([77.5, -90, 0]) m4_hole(); translate([plate_to_frame_point_x, -plate_to_frame_point_y, 0]) m4_hole();
translate([-77.5, 90, 0]) m4_hole(); translate([-plate_to_frame_point_x, plate_to_frame_point_y, 0]) m4_hole();
translate([-77.5, -90, 0]) m4_hole(); translate([-plate_to_frame_point_x, -plate_to_frame_point_y, 0]) m4_hole();
// holes for mount bolt countersinks // holes for mount bolt countersinks
translate([77.5, 90, 2]) m4_hole_countersink(); translate([plate_to_frame_point_x, plate_to_frame_point_y, 2]) m4_hole_countersink();
translate([77.5, -90, 2]) m4_hole_countersink(); translate([plate_to_frame_point_x, -plate_to_frame_point_y, 2]) m4_hole_countersink();
translate([-77.5, 90, 2]) m4_hole_countersink(); translate([-plate_to_frame_point_x, plate_to_frame_point_y, 2]) m4_hole_countersink();
translate([-77.5, -90, 2]) m4_hole_countersink(); translate([-plate_to_frame_point_x, -plate_to_frame_point_y, 2]) m4_hole_countersink();
} }
// button hole, with extra wide bits for various uses (cutting out space // button hole, with extra wide bits for various uses (cutting out space
@@ -93,8 +114,8 @@ module button_24mm_hole() {
// translation is to leave 3mm thickness in the plate without recentering anything // translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=small_button_radius+6, h=49, $fn=50, center=true); translate([0, 0, -25]) cylinder(r=small_button_radius+6, h=49, $fn=50, center=true);
// space for decorative button surround stuff // space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=small_button_radius+decorative_radius, h=20, $fn=50, center=true); translate([0, 0, 50]) cylinder(r=small_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=small_button_radius+jumbo_decorative_radius, h=20, $fn=50, center=true); translate([0, 0, 70]) cylinder(r=small_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
} }
// button hole, with extra wide bits for various uses (cutting out space // button hole, with extra wide bits for various uses (cutting out space
@@ -106,8 +127,8 @@ module button_30mm_hole() {
// translation is to leave 3mm thickness in the plate without recentering anything // translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+6, h=49, $fn=50, center=true); translate([0, 0, -25]) cylinder(r=big_button_radius+6, h=49, $fn=50, center=true);
// space for decorative button surround stuff // space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=big_button_radius+decorative_radius, h=20, $fn=50, center=true); translate([0, 0, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=big_button_radius+jumbo_decorative_radius, h=20, $fn=50, center=true); translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
} }
module frame_hex_bolt_hole() { module frame_hex_bolt_hole() {
@@ -130,7 +151,30 @@ module neutrik_d_mount() {
neutrik_d_hole(); neutrik_d_hole();
translate([9.5, 12, 0]) neutrik_d_screw_hole(); translate([9.5, 12, 0]) neutrik_d_screw_hole();
translate([-9.5, -12, 0]) neutrik_d_screw_hole(); translate([-9.5, -12, 0]) neutrik_d_screw_hole();
translate([0, 0, 25]) cube([32, 37, 50], center=true); }
// space for a neutrik D mount or 24mm button
module frame_cutout() {
cube([36.5, 8, 40], center=true);
}
module m2_mount_post() {
difference() {
cylinder(r=m2_screw_selftap_radius*2.25, h=3, $fn=6, center=true);
cylinder(r=m2_screw_selftap_radius, h=3*2, $fn=50, center=true);
}
}
module oled_ssd1306_mount() {
translate([11.5, 12, 0]) m2_mount_post();
translate([11.5, -12, 0]) m2_mount_post();
translate([-11.5, 12, 0]) m2_mount_post();
translate([-11.5, -12, 0]) m2_mount_post();
}
module oled_ssd1306_mount_cutout() {
translate([0, 1.9, 0]) cube([25, 14, 5], center=true);
translate([0, 0, -1.0]) cube([35, 35, 4], center=true);
} }
module m3_mount_post() { module m3_mount_post() {
@@ -188,20 +232,20 @@ module base_topplate() {
} }
module overhang_plate() { module overhang_plate() {
roundedcube([top_plate_x+25, top_plate_y+25, top_plate_z], center=true, radius=1); roundedcube([overhang_top_plate_x, overhang_top_plate_y, top_plate_z], center=true, radius=1);
} }
// this takes the base_topplate and makes it a small frame, putting a larger top plate // this takes the base_topplate and makes it a small frame, putting a larger top plate
module base_topplate_with_raised_overhang() { module base_top_plate_with_raised_overhang() {
// make a frame out of the top plate (and keep the main plate on the center plane) // make a frame out of the top plate (and keep the main plate on the center plane)
translate([0, 0, -5]) difference() { translate([0, 0, -5]) difference() {
base_topplate(); base_topplate();
cube([top_plate_x-(panel_support_width*2), top_plate_y-(panel_support_width*2), top_plate_z*2], center=true); cube([top_plate_x-(panel_support_width*2), top_plate_y-(panel_support_width*2), top_plate_z*2], center=true);
} }
translate([(top_plate_x/2)-10, (top_plate_y/2)-10, -2.5]) resize([0, 0, 10]) frame_mount_column(); translate([plate_to_frame_point_x, plate_to_frame_point_y, -2.5]) resize([0, 0, 10]) frame_mount_column();
translate([-((top_plate_x/2)-10), (top_plate_y/2)-10, -2.5]) resize([0, 0, 10]) frame_mount_column(); translate([-(plate_to_frame_point_x), plate_to_frame_point_y, -2.5]) resize([0, 0, 10]) frame_mount_column();
translate([(top_plate_x/2)-10, -((top_plate_y/2)-10), -2.5]) resize([0, 0, 10]) frame_mount_column(); translate([plate_to_frame_point_x, -(plate_to_frame_point_y), -2.5]) resize([0, 0, 10]) frame_mount_column();
translate([-((top_plate_x/2)-10), -((top_plate_y/2)-10), -2.5]) resize([0, 0, 10]) frame_mount_column(); translate([-(plate_to_frame_point_x), -(plate_to_frame_point_y), -2.5]) resize([0, 0, 10]) frame_mount_column();
overhang_plate(); overhang_plate();
} }
@@ -214,14 +258,14 @@ module topplate() {
module bottom_plate_with_overhang() { module bottom_plate_with_overhang() {
difference() { difference() {
overhang_plate(); rotate([180, 0, 0]) base_top_plate_with_raised_overhang();
rotate([180, 0, 0]) top_plate_holes(); rotate([180, 0, 0]) top_plate_holes();
} }
} }
module topplate_with_raised_overhang() { module top_plate_with_raised_overhang() {
difference() { difference() {
base_topplate_with_raised_overhang(); base_top_plate_with_raised_overhang();
top_plate_holes(); top_plate_holes();
} }
} }
@@ -242,15 +286,15 @@ module side_chopper() {
} }
module frame_connection_holes() { module frame_connection_holes() {
translate([frame_x/2, (frame_y/4)+10, (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)+15, (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)+10, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)+15, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)-10, (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)-15, (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, (frame_y/4)-10, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, (frame_y/4)-15, -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)+10), (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)+15), (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)+10), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)+15), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)-10), (frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)-15), (frame_z/4)]) rotate([0, 90, 0]) m4_hole();
translate([frame_x/2, -((frame_y/4)-10), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole(); translate([frame_x/2, -((frame_y/4)-15), -(frame_z/4)]) rotate([0, 90, 0]) m4_hole();
} }
module frame_cable_routing_hole() { module frame_cable_routing_hole() {
@@ -259,28 +303,21 @@ module frame_cable_routing_hole() {
module base_frame() { module base_frame() {
frame_box(); frame_box();
translate([(top_plate_x/2)-10, (top_plate_y/2)-10, 0]) translate([plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_mount_column();
frame_mount_column(); translate([-plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_mount_column();
translate([-((top_plate_x/2)-10), (top_plate_y/2)-10, 0]) translate([plate_to_frame_point_x, -(plate_to_frame_point_y), 0]) frame_mount_column();
frame_mount_column(); translate([-plate_to_frame_point_x, -(plate_to_frame_point_y), 0]) frame_mount_column();
translate([(top_plate_x/2)-10, -((top_plate_y/2)-10), 0])
frame_mount_column();
translate([-((top_plate_x/2)-10), -((top_plate_y/2)-10), 0])
frame_mount_column();
} }
module frame() { module frame() {
difference() { difference() {
base_frame(); base_frame();
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_topplate(); translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_topplate();
translate([(top_plate_x/2)-10, (top_plate_y/2)-10, 0]) translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_topplate();
frame_hex_bolt_hole(); translate([plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-((top_plate_x/2)-10), (top_plate_y/2)-10, 0]) translate([-plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
frame_hex_bolt_hole(); translate([plate_to_frame_point_x, -plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([(top_plate_x/2)-10, -((top_plate_y/2)-10), 0]) translate([-plate_to_frame_point_x, -plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
frame_hex_bolt_hole();
translate([-((top_plate_x/2)-10), -((top_plate_y/2)-10), 0])
frame_hex_bolt_hole();
} }
} }
@@ -288,52 +325,69 @@ module frame() {
// Directional Arc (both hands) // Directional Arc (both hands)
module dir_arc_24mm_6_button() { module dir_arc_24mm_directionals() {
button_24mm_hole(); button_24mm_hole();
translate([29.5, 0, 0]) button_24mm_hole(); translate([29.5, 0, 0]) button_24mm_hole();
translate([29.5+26.3, -12.9, 0]) button_24mm_hole(); translate([29.5+26.3, -12.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6, 0, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6+26.9, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6+26.9+29.6, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7, -29.4, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6+26.9-1.7, 10.9-30.1, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6+26.9+29.6, 10.9-30.1, 0]) button_24mm_hole();
translate([29.5+26.3+15.5, -65.2, 0]) button_30mm_hole(); translate([29.5+26.3+15.5, -65.2, 0]) button_30mm_hole();
} }
module dir_arc_24mm_6_button() {
dir_arc_24mm_directionals();
translate([29.5+26.3+27.8, 0, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6, 10.9, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7, -29.4, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9-1.7, 10.9-30.1, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6-0.2, 10.9-30.1, 0]) button_24mm_hole();
}
module dir_arc_24mm_8_button() {
dir_arc_24mm_6_button();
translate([29.5+26.3+27.8+26.9+29.6+29.5, 7.1, 0]) button_24mm_hole();
translate([29.5+26.3+27.8+26.9+29.6+29.5-0.3, -23.9, 0]) button_24mm_hole();
}
// 6 button plus the normal fourth column for 8 button actually on a third row // 6 button plus the normal fourth column for 8 button actually on a third row
module dir_arc_24mm_8_button_compressed() { module dir_arc_24mm_8_button_compressed() {
dir_arc_24mm_6_button(); dir_arc_24mm_6_button();
translate([29.5+26.3+15.5+9.7+2.6+2.6, 29.4, 0]) button_24mm_hole(); translate([29.5+26.3+27.8+2.6, 29.4, 0]) button_24mm_hole();
translate([29.5+26.3+15.5+9.7+2.6+26.9+2.6, 40.3, 0]) button_24mm_hole(); translate([29.5+26.3+27.8+26.9+2.6, 40.3, 0]) button_24mm_hole();
}
module dir_arc_plus_w_24mm_8_button() {
dir_arc_24mm_8_button();
translate([36, 28, 0]) button_24mm_hole();
} }
// Directional Arc (left hand) // Directional Arc (left hand)
module dir_arc_30mm_button_l() { module dir_arc_30mm_thumb_button() {
translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([73, 132, 0]) button_30mm_hole(); // just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored)
translate([(top_plate_x/2)-28.06, (-top_plate_y/2)+62, 0]) button_30mm_hole();
}
module dir_arc_30mm() {
dir_arc_30mm_thumb_button();
translate([0, 57.2, 0]) dir_arc_30mm_thumb_button();
translate([-33.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button();
translate([-33.8-34.8, 57.2+12.9, 0]) dir_arc_30mm_thumb_button();
} }
module dir_arc_w_30mm() { module dir_arc_w_30mm() {
dir_arc_30mm_button_l(); dir_arc_30mm();
translate([35, 0, 0]) dir_arc_30mm_button_l(); translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
translate([35+33.5, -12.9, 0]) dir_arc_30mm_button_l();
translate([35+7, 34.5, 0]) dir_arc_30mm_button_l();
// just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored)
translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([top_plate_x-28.06, 145-19-9-11-19-9-11, 0]) button_30mm_hole();
} }
module dir_arc_w_30mm_plus_one() { module dir_arc_w_30mm_plus_one() {
dir_arc_w_30mm(); dir_arc_w_30mm();
translate([-33.5, -12.9, 0]) dir_arc_30mm_button_l(); translate([-33.8-34.8-33.8, 57.2, 0]) dir_arc_30mm_thumb_button();
} }
// Namco Noir (right hand) // Namco Noir (right hand)
module noir_button_p1() { module noir_button_p1() {
translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([35, 145, 0]) button_30mm_hole(); translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([35, 140, 0]) button_30mm_hole();
} }
module noir_plus_one() { module noir_plus_one() {
@@ -354,20 +408,27 @@ module noir_plus_one() {
// Sega Astro City 2P (right hand) // Sega Astro City 2P (right hand)
module sega_2p_p1() { module sega_2p_p1() {
translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([28.06, 145, 0]) button_30mm_hole(); translate([-top_plate_x/2, -top_plate_y/2, 0]) translate([28.06, 140, 0]) button_30mm_hole();
} }
module sega_2p_plus_one() { module sega_2p_6_button() {
// via slagcoin // via slagcoin
sega_2p_p1(); sega_2p_p1();
translate([30.5, 11+9, 0]) sega_2p_p1(); translate([30.5, 11+9, 0]) sega_2p_p1();
translate([30.5+36, 11+9, 0]) sega_2p_p1(); translate([30.5+36, 11+9, 0]) sega_2p_p1();
translate([30.5+36+36, 11, 0]) sega_2p_p1();
translate([0, -19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11, 0]) sega_2p_p1();
translate([30.5, -19, 0]) sega_2p_p1(); translate([30.5, -19, 0]) sega_2p_p1();
translate([30.5+36, -19, 0]) sega_2p_p1(); translate([30.5+36, -19, 0]) sega_2p_p1();
translate([30.5+36+36, -19-9, 0]) sega_2p_p1(); }
// just my guesstimate on this one, but note that this is the same position as sega 2p module sega_2p() {
sega_2p_6_button();
translate([30.5+36+36, 11, 0]) sega_2p_p1();
translate([30.5+36+36, -19-9, 0]) sega_2p_p1();
}
module sega_2p_plus_one() {
sega_2p();
// just my guesstimate on this one
translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1(); translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1();
} }

View File

@@ -30,15 +30,22 @@ module left_frame() {
difference() { difference() {
base_left_frame(); base_left_frame();
// connection holes to other frames // connection holes to other frames
translate([0, 0, -top_plate_z/2]) frame_connection_holes(); frame_connection_holes();
// cable routing hole // cable routing hole
translate([0, 0, -top_plate_z/2]) frame_cable_routing_hole(); frame_cable_routing_hole();
// aux button holes // aux button holes
translate([0, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole(); translate([-30, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([-40, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole(); translate([-30, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole(); translate([-70, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([-70, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([10, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([10, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole
translate([70, (frame_y/2)-neutrik_panel_thickness, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([70, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
} }
} }

View File

@@ -31,17 +31,20 @@ module middle_frame() {
difference() { difference() {
base_middle_frame(); base_middle_frame();
// connection holes to other frames // connection holes to other frames
translate([0, 0, -top_plate_z/2]) frame_connection_holes(); frame_connection_holes();
translate([0, 0, -top_plate_z/2]) mirror([1, 0, 0]) frame_connection_holes(); mirror([1, 0, 0]) frame_connection_holes();
// cable routing holes // cable routing holes
translate([0, 0, -top_plate_z/2]) frame_cable_routing_hole(); frame_cable_routing_hole();
translate([0, 0, -top_plate_z/2]) mirror([1, 0, 0]) frame_cable_routing_hole(); mirror([1, 0, 0]) frame_cable_routing_hole();
// neutrik mounts for connector, switches // neutrik mounts for connector, switches
translate([0, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-neutrik_panel_thickness, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, 100, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([-40, (frame_y/2)-neutrik_panel_thickness, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, (frame_y/2)-neutrik_panel_thickness, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
} }
} }

View File

@@ -17,10 +17,36 @@
*/ */
include <components.scad> include <components.scad>
use <frame-left.scad>
module base_right_frame() {
difference() {
frame();
// chop the left edge off
mirror([1, 0, 0]) side_chopper();
}
}
module right_frame() { module right_frame() {
mirror([1, 0, 0]) left_frame(); difference() {
base_right_frame();
// connection holes to other frames
mirror([1, 0, 0]) frame_connection_holes();
// cable routing hole
mirror([1, 0, 0]) frame_cable_routing_hole();
// aux button holes
translate([30, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([30, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([70, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([70, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-10, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();
translate([-10, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole
translate([-70, (frame_y/2)-neutrik_panel_thickness, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-70, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
}
} }
right_frame(); right_frame();

View File

@@ -20,26 +20,35 @@ include <components.scad>
module solo_frame() { module solo_frame() {
difference() { difference() {
rotate([0, 0, 90]) frame(); frame();
// neutrik mounts for connector, switches // neutrik mounts for connector, switches
translate([0, (frame_x/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_x/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, (frame_x/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount(); translate([-40, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// aux button holes // aux button holes
translate([-frame_y/2+2.5, 0, 0]) rotate([0, 0, 270]) translate([-frame_x/2+2.5, 0, 0]) rotate([0, 0, 270])
translate([0, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([0, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([-frame_y/2+2.5, 0, 0]) rotate([0, 0, 270]) translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
translate([-frame_x/2+2.5, 0, 0]) rotate([0, 0, 270])
translate([-40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([-40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([-frame_y/2+2.5, 0, 0]) rotate([0, 0, 270]) translate([(frame_x/2)-neutrik_panel_thickness-4, -40, 0]) rotate([0, 0, 90]) frame_cutout();
translate([-frame_x/2+2.5, 0, 0]) rotate([0, 0, 270])
translate([40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([frame_y/2-2.5, 0, 0]) rotate([0, 0, 90]) translate([(frame_x/2)-neutrik_panel_thickness-4, 40, 0]) rotate([0, 0, 90]) frame_cutout();
translate([frame_x/2-2.5, 0, 0]) rotate([0, 0, 90])
translate([0, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([0, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([frame_y/2-2.5, 0, 0]) rotate([0, 0, 90]) translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
translate([frame_x/2-2.5, 0, 0]) rotate([0, 0, 90])
translate([-40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([-40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([frame_y/2-2.5, 0, 0]) rotate([0, 0, 90]) translate([-(frame_x/2)+neutrik_panel_thickness+4, -40, 0]) rotate([0, 0, 90]) frame_cutout();
translate([frame_x/2-2.5, 0, 0]) rotate([0, 0, 90])
translate([40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole(); translate([40, 0, 0]) rotate([90, 0, 0]) button_24mm_hole();
translate([-(frame_x/2)+neutrik_panel_thickness+4, 40, 0]) rotate([0, 0, 90]) frame_cutout();
} }
} }

View File

@@ -0,0 +1,32 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module button_24mm_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) button_24mm_hole();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([0, 0, -1]) button_24mm_hole();
}
}
button_24mm_decorative_plate();

View File

@@ -0,0 +1,32 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module dir_arc_plus_w_24mm_8_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) dir_arc_plus_w_24mm_8_button();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([0, 0, -1]) dir_arc_plus_w_24mm_8_button();
}
}
dir_arc_plus_w_24mm_8_button_decorative_plate();

View File

@@ -20,7 +20,7 @@ include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() { module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() {
difference() { difference() {
// get a 1mm slice of the bigger button cylinders // get a 2mm slice of the bigger button cylinders
union() { union() {
translate([-top_plate_x/2, 0, -65]) dir_arc_w_30mm(); translate([-top_plate_x/2, 0, -65]) dir_arc_w_30mm();
translate([top_plate_x/2, 0, -65]) sega_2p_plus_one(); translate([top_plate_x/2, 0, -65]) sega_2p_plus_one();
@@ -31,8 +31,6 @@ module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() {
translate([-top_plate_x/2, 0, -1]) dir_arc_w_30mm(); translate([-top_plate_x/2, 0, -1]) dir_arc_w_30mm();
translate([top_plate_x/2, 0, -1]) sega_2p_plus_one(); translate([top_plate_x/2, 0, -1]) sega_2p_plus_one();
} }
/* // fill in some space */
/* translate([-6, -6, 0]) cube([23, 23, 1], center=true); */
} }
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate(); dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();

View File

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

View File

@@ -0,0 +1,32 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module sega_2p_6_button_decorative_plate() {
difference() {
// get a 2mm slice of the bigger button cylinders
translate([0, 0, -55]) sega_2p_6_button();
translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, 100]) cube([500, 500, 198], center=true);
// cut out the normal holes
translate([0, 0, -1]) sega_2p_6_button();
}
}
sega_2p_6_button_decorative_plate();

View File

@@ -20,11 +20,10 @@ include <components.scad>
module sega_2p_plus_one_decorative_plate() { module sega_2p_plus_one_decorative_plate() {
difference() { difference() {
decorative_add=10; // get a 2mm slice of the bigger button cylinders
// get a 1mm slice of the bigger button cylinders translate([0, 0, -55]) sega_2p_plus_one();
translate([0, 0, -45]) sega_2p_plus_one(); translate([0, 0, -100]) cube([500, 500, 198], center=true);
translate([0, 0, -50]) cube([500, 500, 98], center=true); translate([0, 0, 100]) cube([500, 500, 198], center=true);
translate([0, 0, 50]) cube([500, 500, 98], center=true);
// cut out the normal holes // cut out the normal holes
translate([0, 0, -1]) sega_2p_plus_one(); translate([0, 0, -1]) sega_2p_plus_one();
} }

View File

@@ -0,0 +1,29 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module jlf_dustwasher() {
difference() {
cylinder(r=jumbo_decorative_radius+5+hole_tolerance, h=2, $fn=50, center=true);
// 5.25 = 4.55 (diameter of shaft is 9.10mm) + .25 to let it take an angle
cylinder(r=4.8, h=2.1, $fn=50, center=true);
}
}
jlf_dustwasher();

View File

@@ -21,8 +21,8 @@ include <components.scad>
module lsx_nobi_dustwasher() { module lsx_nobi_dustwasher() {
difference() { difference() {
cylinder(r=jumbo_decorative_radius+5+hole_tolerance, h=2, $fn=50, center=true); cylinder(r=jumbo_decorative_radius+5+hole_tolerance, h=2, $fn=50, center=true);
// 5.5 = 5 (diameter of shaft is 10mm) + .5 to let it take an angle // 5.25 = 5 (diameter of shaft is 10mm) + .25 to let it take an angle
cylinder(r=5.5+hole_tolerance, h=2.1, $fn=50, center=true); cylinder(r=5.25+hole_tolerance, h=2.1, $fn=50, center=true);
} }
} }

View File

@@ -17,7 +17,7 @@
*/ */
include <components.scad> include <components.scad>
use <top-panel-dir_arc-plus-w-30mm-plus-one.scad> use <top-panel-inset-dir_arc-plus-w-30mm-plus-one.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

@@ -0,0 +1,32 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module top_panel_inset_lever_and_dir_arc_w_30mm() {
difference() {
union() {
topplate();
translate([(-top_plate_x/2)+55, (top_plate_y/2)-75, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase();
}
dir_arc_w_30mm();
translate([(-top_plate_x/2)+55, (top_plate_y/2)-75, 0]) levermountholes();
}
}
top_panel_inset_lever_and_dir_arc_w_30mm();

View File

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

View File

@@ -0,0 +1,27 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
use <top-panel-inset-sega-2p-plus-one-plus-control.scad>
module top_panel_inset_sega_2p_plus_one_plus_control_with_mount() {
top_panel_inset_sega_2p_plus_one_plus_control();
translate([30, -50, -(top_plate_z/2) - 3]) pcb_mount();
}
top_panel_inset_sega_2p_plus_one_plus_control_with_mount();

View File

@@ -0,0 +1,30 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module top_panel_inset_sega_2p_plus_one_plus_control() {
difference() {
topplate();
sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole();
}
}
top_panel_inset_sega_2p_plus_one_plus_control();

View File

@@ -0,0 +1,33 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module top_panel_left_lever_and_dir_arc_w_30mm() {
difference() {
union() {
top_plate_with_raised_overhang();
translate([(-top_plate_x/2)+55, (top_plate_y/2)-75, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase();
}
dir_arc_w_30mm();
side_chopper();
translate([(-top_plate_x/2)+55, (top_plate_y/2)-75, 0]) levermountholes();
}
}
top_panel_left_lever_and_dir_arc_w_30mm();

View File

@@ -23,7 +23,7 @@ module top_panel_left_lever() {
difference() { difference() {
// base plate // base plate
union() { union() {
translate([0,-20,0]) topplate_with_raised_overhang(); translate([0,-20,0]) top_plate_with_raised_overhang();
translate([0, 0, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase(); translate([0, 0, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase();
} }
// holes to mount the lever // holes to mount the lever

View File

@@ -20,7 +20,7 @@ include <components.scad>
module top_panel_middle_dir_arc_w_30mm() { module top_panel_middle_dir_arc_w_30mm() {
difference() { difference() {
topplate_with_raised_overhang(); top_plate_with_raised_overhang();
dir_arc_w_30mm(); dir_arc_w_30mm();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
side_chopper(); side_chopper();

View File

@@ -0,0 +1,30 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
use <top-panel-right-sega-2p-plus-one-plus-control-with-mount.scad>
module top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled() {
difference() {
top_panel_right_sega_2p_plus_one_plus_control_with_mount();
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
}
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
}
top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled();

View File

@@ -0,0 +1,27 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
use <top-panel-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, -(top_plate_z/2) - 3]) pcb_mount();
}
top_panel_right_sega_2p_plus_one_plus_control_with_mount();

View File

@@ -0,0 +1,30 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module top_panel_right_sega_2p_plus_one_plus_control() {
difference() {
top_plate_with_raised_overhang();
sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper();
translate([89, 30, 0]) button_24mm_hole();
}
}
top_panel_right_sega_2p_plus_one_plus_control();

View File

@@ -0,0 +1,27 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
use <top-panel-right-sega-2p-plus-one.scad>
module top_panel_right_sega_2p_plus_one_with_mount() {
top_panel_right_sega_2p_plus_one();
translate([30, -50, -(top_plate_z/2) - 3]) pcb_mount();
}
top_panel_right_sega_2p_plus_one_with_mount();

View File

@@ -20,7 +20,7 @@ include <components.scad>
module top_panel_right_sega_2p_plus_one() { module top_panel_right_sega_2p_plus_one() {
difference() { difference() {
topplate_with_raised_overhang(); top_plate_with_raised_overhang();
sega_2p_plus_one(); sega_2p_plus_one();
rotate([0, 0, 180]) side_chopper(); rotate([0, 0, 180]) side_chopper();
} }

View File

@@ -20,8 +20,8 @@ include <components.scad>
module dir_arc_24mm_6_button_panel() { module dir_arc_24mm_6_button_panel() {
difference() { difference() {
rotate([0, 0, -90]) topplate_with_raised_overhang(); top_plate_with_raised_overhang();
translate([-top_plate_x+105, -top_plate_y/2+135, 0]) dir_arc_24mm_6_button(); translate([-71.5, -top_plate_y/2+122.5, 0]) dir_arc_24mm_6_button();
} }
} }

View File

@@ -17,13 +17,11 @@
*/ */
include <components.scad> include <components.scad>
use <top-panel-solo-dir_arc-24mm-6-button.scad>
module dir_arc_plus_w_24mm_8_button_panel() { module dir_arc_plus_w_24mm_8_button_panel() {
difference() { difference() {
rotate([0, 0, -90]) topplate_with_raised_overhang(); top_plate_with_raised_overhang();
translate([-top_plate_x+105, -top_plate_y/2+123, 0]) dir_arc_24mm_8_button_compressed(); translate([-80.5, top_plate_y/6, 0]) dir_arc_plus_w_24mm_8_button();
translate([-34.5, 51, 0]) button_24mm_hole();
} }
} }

View File

@@ -0,0 +1,33 @@
/* Copyright Brian Stephan 2023
*
* This file is part of the Buildable Stick System.
*
* The Buildable Stick System is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The Buildable Stick System is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* the Buildable Stick System. If not, see <https://www.gnu.org/licenses/>.
*/
include <components.scad>
module top_panel_solo_lever_and_sega_2p_6_button() {
difference() {
// base plate
union() {
top_plate_with_raised_overhang();
translate([-60, 18, -((top_plate_z/2)+(lever_mount_z/2))]) levermountbase();
}
translate([95, -20, 0]) sega_2p_6_button();
translate([-60, 18, 0]) levermountholes();
}
}
top_panel_solo_lever_and_sega_2p_6_button();