Compare commits

...

10 Commits

Author SHA1 Message Date
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
17 changed files with 169 additions and 54 deletions

View File

@ -30,7 +30,7 @@ What you'll need beyond these objects:
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
* 4 M3 8mm hex bolts to secure the PCB to a panel
* Per frame and plate combo:
* 4 45mm M4 hex brass standoffs
* 4 40mm M4 hex brass standoffs (or equivalent)
* 8 12-16mm M4 countersunk hex bolts
* Per frame connection point:
* 8 16mm M4 bolts
@ -59,10 +59,12 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
of 2023-09-12)
* 4 M3 flange nuts to connect Neutrik D plates to frames: **$0.34 USD** (you can get a pack of 100 on Amazon for $8.50,
as of 2023-09-12)
* 8 45mm M4 spacers to connect panels to frames: **$2.40 USD** (you can get a pack of 10 on AliExpress for $3, as of
* 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)

View File

@ -21,7 +21,7 @@ include <components.scad>
module bottom_panel() {
difference() {
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() {
difference() {
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

@ -79,8 +79,8 @@ neutrik_d_screw_radius = 1.6 + hole_tolerance;
neutrik_d_radius = 12 + hole_tolerance;
// additional button radius for decorative panels, etc.
decorative_radius = 12;
jumbo_decorative_radius = 15;
decorative_radius_scale = 1.75;
jumbo_decorative_radius_scale = 2;
/* PARTS */
@ -114,8 +114,8 @@ module button_24mm_hole() {
// 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);
// 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, 70]) cylinder(r=small_button_radius+jumbo_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_scale, h=20, $fn=50, center=true);
}
// button hole, with extra wide bits for various uses (cutting out space
@ -127,8 +127,8 @@ module button_30mm_hole() {
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+6, h=49, $fn=50, center=true);
// space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=big_button_radius+decorative_radius, 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, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
}
module frame_hex_bolt_hole() {
@ -258,7 +258,7 @@ module topplate() {
module bottom_plate_with_overhang() {
difference() {
overhang_plate();
rotate([180, 0, 0]) base_top_plate_with_raised_overhang();
rotate([180, 0, 0]) top_plate_holes();
}
}
@ -313,6 +313,7 @@ module frame() {
difference() {
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([plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-plate_to_frame_point_x, plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([plate_to_frame_point_x, -plate_to_frame_point_y, 0]) frame_hex_bolt_hole();
@ -363,30 +364,30 @@ module dir_arc_plus_w_24mm_8_button() {
module dir_arc_30mm_thumb_button() {
// just my guesstimate on this one, but note that this is the same position as sega 2p (just mirrored)
translate([(top_plate_x/2)-28.06, (-top_plate_y/2)+67, 0]) button_30mm_hole();
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([-5.4, 52.2, 0]) dir_arc_30mm_thumb_button();
translate([-5.4-33.8, 52.2+12.9, 0]) dir_arc_30mm_thumb_button();
translate([-5.4-33.8-34.8, 52.2+12.9, 0]) 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() {
dir_arc_30mm();
translate([-5.4-26.8, 52.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
}
module dir_arc_w_30mm_plus_one() {
dir_arc_w_30mm();
translate([-5.4-33.8-34.8-33.8, 52.2, 0]) dir_arc_30mm_thumb_button();
translate([-33.8-34.8-33.8, 57.2, 0]) dir_arc_30mm_thumb_button();
}
// Namco Noir (right hand)
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() {
@ -407,7 +408,7 @@ module noir_plus_one() {
// Sega Astro City 2P (right hand)
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_6_button() {

View File

@ -30,10 +30,10 @@ module left_frame() {
difference() {
base_left_frame();
// connection holes to other frames
translate([0, 0, -top_plate_z/2]) frame_connection_holes();
frame_connection_holes();
// cable routing hole
translate([0, 0, -top_plate_z/2]) frame_cable_routing_hole();
frame_cable_routing_hole();
// aux button holes
translate([-30, 101.5, 0]) rotate([270, 0, 0]) button_24mm_hole();

View File

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

View File

@ -30,10 +30,10 @@ module right_frame() {
difference() {
base_right_frame();
// connection holes to other frames
mirror([1, 0, 0]) translate([0, 0, -top_plate_z/2]) frame_connection_holes();
mirror([1, 0, 0]) frame_connection_holes();
// cable routing hole
mirror([1, 0, 0]) translate([0, 0, -top_plate_z/2]) frame_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();

View File

@ -20,11 +20,10 @@ include <components.scad>
module button_24mm_decorative_plate() {
difference() {
decorative_add=10;
// get a 1mm slice of the bigger button cylinders
translate([0, 0, -45]) button_24mm_hole();
translate([0, 0, -50]) cube([500, 500, 98], center=true);
translate([0, 0, 50]) cube([500, 500, 98], center=true);
// 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();
}

View File

@ -20,11 +20,10 @@ include <components.scad>
module dir_arc_plus_w_24mm_8_button_decorative_plate() {
difference() {
decorative_add=10;
// get a 1mm slice of the bigger button cylinders
translate([0, 0, -45]) dir_arc_plus_w_24mm_8_button();
translate([0, 0, -50]) cube([500, 500, 98], center=true);
translate([0, 0, 50]) cube([500, 500, 98], center=true);
// 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();
}

View File

@ -20,7 +20,7 @@ include <components.scad>
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate() {
difference() {
// get a 1mm slice of the bigger button cylinders
// get a 2mm slice of the bigger button cylinders
union() {
translate([-top_plate_x/2, 0, -65]) dir_arc_w_30mm();
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]) 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();

View File

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

View File

@ -20,11 +20,10 @@ include <components.scad>
module sega_2p_6_button_decorative_plate() {
difference() {
decorative_add=10;
// get a 1mm slice of the bigger button cylinders
translate([0, 0, -45]) sega_2p_6_button();
translate([0, 0, -50]) cube([500, 500, 98], center=true);
translate([0, 0, 50]) cube([500, 500, 98], center=true);
// 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();
}

View File

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

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

@ -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

@ -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();