Compare commits

..

No commits in common. "05dab4515230dc82a2e3e1ab8fd929991d68ade3" and "296e6da14bbf2b34d85772aff60731ba31805a2e" have entirely different histories.

14 changed files with 49 additions and 65 deletions

View File

@ -1,5 +1,4 @@
SRC_FILES := $(wildcard ./src/*.scad) SRC_FILES := $(wildcard ./src/*.scad)
SRC_FILES := $(filter-out ./src/all-together-demo.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/blown-up-demo.scad, $(SRC_FILES)) SRC_FILES := $(filter-out ./src/blown-up-demo.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/components.scad, $(SRC_FILES)) SRC_FILES := $(filter-out ./src/components.scad, $(SRC_FILES))
SRC_FILES := $(filter-out ./src/roundedcube.scad, $(SRC_FILES)) SRC_FILES := $(filter-out ./src/roundedcube.scad, $(SRC_FILES))

View File

@ -2,7 +2,7 @@
Files for 3D printing an arcade stick. Files for 3D printing an arcade stick.
![An example of stick components displayed in OpenSCAD](docs/blown-up-demo.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.] [OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
@ -28,10 +28,6 @@ These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what
OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple
weird things, in my experience. weird things, in my experience.
My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives the models a bit more weight and
stability, but something like 2 wall loops, 15% grid sparse infill is fine and does not lead to a weak enclosure. The
costs below have been made against my settings.
## Assembling ## Assembling
What you'll need beyond these objects: What you'll need beyond these objects:
@ -63,10 +59,10 @@ What you'll need beyond these objects:
This is a rough estimate of the cost to produce one of these sticks, assuming a usual 2-frame design and layout. 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. Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
* Left and right frame: **$10.42 USD** (208.50g each, as of 2024-02-22) * Left and right frame: **$7.08 USD** (141.84g each, as of 2023-09-12)
* Left and right (inset) top panels: **~$6.40 USD** (~128g each, as of 2024-02-22) * Left and right (overhang) top panels: **~$6.74 USD** (~135g each, as of 2023-09-12)
* Left and right (non-overhang) bottom panels: **$6.80 USD** (135.99g each, as of 2024-02-22) * Left and right (overhang) bottom panels: **$5.90 USD** (118.16g each, as of 2023-09-12)
* Miscellaneous mounting plates, decorative plates, etc.: **~$1.83 USD** (~73g, as of 2024-02-22) * 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 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) * 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 * 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
@ -83,10 +79,9 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
* 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 plates 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 $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 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 $140. Reducing wall and infill settings full-featured controller with an open source foundation together for around $135.
will probably save you around $5 of material, and you can probably decide what you want to do from there.
## Miscellany ## Miscellany

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

View File

@ -7,10 +7,10 @@ include <parameters.scad>
include <components.scad> include <components.scad>
use <frame-left.scad> use <frame-left.scad>
use <frame-right.scad> use <frame-right.scad>
use <top-panel-overhang-left-lever-and-dir_arc-plus-w-30mm.scad> use <top-panel-left-lever-and-dir_arc-plus-w-30mm.scad>
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad> use <top-panel-right-sega-2p-plus-one-plus-control-with-mount.scad>
use <bottom-panel-overhang-left.scad> use <bottom-panel-left.scad>
use <bottom-panel-overhang-right.scad> use <bottom-panel-right.scad>
use <misc-decorative-plate-24mm-button.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.scad>
use <misc-dustwasher-lsx-nobi.scad> use <misc-dustwasher-lsx-nobi.scad>

View File

@ -83,7 +83,7 @@ module rocker_20mm_mount() {
// 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 to cut the whole inside without affecting panel lip
module frame_cutout() { module frame_cutout() {
cube([30.5, 8, frame_z-(panel_z*2)-2], center=true); cube([30.5, 8, frame_z-(panel_z*2)], center=true);
} }
// bank of three 24mm buttons, commonly on a frame face // bank of three 24mm buttons, commonly on a frame face
@ -151,9 +151,6 @@ module levermountholes() {
m4_hole(); m4_hole();
translate([-20, -42.5, 0]) translate([-20, -42.5, 0])
m4_hole(); m4_hole();
}
module levermountcountersinks() {
// holes for joystick bolt countersinks // holes for joystick bolt countersinks
translate([20, 42.5, 2]) translate([20, 42.5, 2])
m4_hole_countersink(); m4_hole_countersink();

View File

@ -25,14 +25,14 @@ module left_frame() {
// aux button holes // aux button holes
translate([-35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster(); translate([-35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole // neutrix button hole
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2]) translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1]) translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 0])
frame_cutout(); frame_cutout();
} }
} }

View File

@ -29,13 +29,13 @@ module middle_frame() {
// neutrik mounts for connector, switches // neutrik mounts for connector, switches
translate([0, (frame_y/2)-neutrik_panel_thickness, panel_z/2]) translate([0, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-40, (frame_y/2)-neutrik_panel_thickness, panel_z/2]) translate([-40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, (frame_y/2)-neutrik_panel_thickness, panel_z/2]) translate([40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
} }
} }

View File

@ -25,14 +25,14 @@ module right_frame() {
// aux button holes // aux button holes
translate([35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster(); translate([35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole // neutrix button hole
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2]) translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
rotate([90, 0, 0]) neutrik_d_mount(); rotate([90, 0, 0]) neutrik_d_mount();
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1]) translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 0])
frame_cutout(); frame_cutout();
} }
} }

View File

@ -12,24 +12,24 @@ module solo_frame() {
// neutrik mounts for connector, switches // neutrik mounts for connector, switches
translate([0, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount(); translate([0, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount(); translate([-40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount(); translate([40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout(); translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// aux button holes // aux button holes
translate([-frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270]) translate([-frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
aux_control_three_button_cluster(); aux_control_three_button_cluster();
translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 1]) rotate([0, 0, 90]) frame_cutout(); translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
translate([(frame_x/2)-neutrik_panel_thickness-4, -37, 1]) rotate([0, 0, 90]) frame_cutout(); translate([(frame_x/2)-neutrik_panel_thickness-4, -37, 0]) rotate([0, 0, 90]) frame_cutout();
translate([(frame_x/2)-neutrik_panel_thickness-4, 37, 1]) rotate([0, 0, 90]) frame_cutout(); translate([(frame_x/2)-neutrik_panel_thickness-4, 37, 0]) rotate([0, 0, 90]) frame_cutout();
translate([frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270]) translate([frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
aux_control_three_button_cluster(); aux_control_three_button_cluster();
translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 1]) rotate([0, 0, 90]) frame_cutout(); translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
translate([-(frame_x/2)+neutrik_panel_thickness+4, -37, 1]) rotate([0, 0, 90]) frame_cutout(); translate([-(frame_x/2)+neutrik_panel_thickness+4, -37, 0]) rotate([0, 0, 90]) frame_cutout();
translate([-(frame_x/2)+neutrik_panel_thickness+4, 37, 1]) rotate([0, 0, 90]) frame_cutout(); translate([-(frame_x/2)+neutrik_panel_thickness+4, 37, 0]) rotate([0, 0, 90]) frame_cutout();
} }
} }

View File

@ -1,16 +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>
module sanwa_seimitsu_lever_mount() {
difference() {
levermountbase();
levermountholes();
}
}
sanwa_seimitsu_lever_mount();

View File

@ -8,10 +8,13 @@ include <components.scad>
module top_panel_inset_lever_and_dir_arc_w_30mm() { module top_panel_inset_lever_and_dir_arc_w_30mm() {
difference() { difference() {
panel(); union() {
panel();
translate([(-panel_x/2)+55, (panel_y/2)-75, -((panel_z/2)+(lever_mount_z/2))])
levermountbase();
}
dir_arc_w_30mm(); dir_arc_w_30mm();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes(); translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountcountersinks();
} }
} }

View File

@ -10,10 +10,12 @@ include <components.scad>
module lever_panel() { module lever_panel() {
difference() { difference() {
// base plate // base plate
translate([0,-20,0]) panel(); union() {
translate([0,-20,0]) panel();
translate([0, 0, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
}
// holes to mount the lever // holes to mount the lever
levermountholes(); levermountholes();
levermountcountersinks();
} }
} }

View File

@ -8,11 +8,13 @@ include <components.scad>
module top_panel_left_lever_and_dir_arc_w_30mm() { module top_panel_left_lever_and_dir_arc_w_30mm() {
difference() { difference() {
panel_with_raised_overhang(); union() {
panel_with_raised_overhang();
translate([(-panel_x/2)+55, (panel_y/2)-75, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
}
dir_arc_w_30mm(); dir_arc_w_30mm();
side_chopper(); side_chopper();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes(); translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountholes();
translate([(-panel_x/2)+55, (panel_y/2)-75, 0]) levermountcountersinks();
} }
} }

View File

@ -10,10 +10,12 @@ include <components.scad>
module top_panel_left_lever() { module top_panel_left_lever() {
difference() { difference() {
// base plate // base plate
panel_with_raised_overhang(); union() {
panel_with_raised_overhang();
translate([0, 0, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
}
// holes to mount the lever // holes to mount the lever
translate([0, 20, 0]) levermountholes(); translate([0, 20, 0]) levermountholes();
translate([0, 20, 0]) levermountcountersinks();
side_chopper(); side_chopper();
} }
} }