Compare commits

...

7 Commits

Author SHA1 Message Date
Brian S. Stephan 155cba6d85
modularize the frame into separate wall pieces
this provides a system for interlocking frame walls as separate pieces,
rather than a whole frame box as one piece. the primary motivation for
this was to improve print quality. these pieces can be printed flat side
down, meaning improvements due to:

1. printing the box required the long, thin bottom to be the side on the
   print surface, which meant shrinkage force would curl the corners
   with essentially no remedy outside of bed adhesive
2. printing the box bottom up created poor circles for the button holes,
   sometimes bad enough to be a visible problem, as well as making small
   flow glitches to stand out (especially on non-matte PLA)
3. printing the box also required supports when the frame bottom was
   inset-style, leading to an annoying post-print step
4. the outward side is now what rests on the print surface, yielding a
   nicer, more consistent surface

the box modules still exist in the event someone wants them, but I
personally will probably be focused on this method going forward. this
also opens up some exciting options regarding color mixing, different
side panel shapes, and the like, so I expect to see more of these even
if the boxes don't go away (especially since these new pieces are all
derived from the boxes anyway).

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-03 18:33:55 -06:00
Brian S. Stephan 0708540ac7
restore the inset tray to the bottom overhang panel
yes I keep going back and forth on this, but I think I'm done now that I
have a better frame approach

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-03 14:03:31 -06:00
Brian S. Stephan 4c224b8a60
rename bottom-panel.scad to -inset.scad for clarity's sake
this will be inset again, might as well follow the pattern

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-03 13:58:04 -06:00
Brian S. Stephan e2e6acc0ca
use the same plate with posts for the bottom panel
this makes the bottom panels have posts, now that the frame is looking
like it will be composed of parts where printing the column hole in this
fashion is not a problem

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-03 13:55:35 -06:00
Brian S. Stephan 3b886d3994
simplify the interchange hole to make print easier
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-03 13:46:50 -06:00
Brian S. Stephan d97f68a5cd
improve the edge (and name) of the frame bevel
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-01 13:42:41 -06:00
Brian S. Stephan 390df34f2b
frames: re-bevel the bottom and top, center buttons
this undoes my work to simplify the bottom of the frame and move button
holes in the frames accordingly. the top and bottom are now symmetrical
in terms of their bevel, and the buttons are centered. this will make
the print of the frame difficult again, but I have an upcoming change to
modularize the frame walls and that will print far better, so I'm
thinking this is what I want. testing ongoing

This reverts commit ed031b9308.
This reverts commit f90fc095e0.

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-01 10:01:50 -06:00
13 changed files with 197 additions and 49 deletions

View File

@ -8,7 +8,7 @@ include <components.scad>
module bottom_panel_solo() {
difference() {
overhang_plate();
rotate([180, 0, 0]) base_panel_with_raised_overhang();
rotate([180, 0, 0]) panel_holes();
}
}

View File

@ -57,7 +57,7 @@ module frame_hex_bolt_hole() {
}
module frame_interchange_hole() {
cylinder(r=15, h=50, $fn=50, center=true);
cylinder(r=18, h=50, $fn=4, center=true);
}
module neutrik_d_hole() {
@ -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
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
@ -195,7 +195,7 @@ module base_panel() {
}
module base_bottom_panel() {
cube([panel_x, panel_y, panel_z], center=true);
mirror([0, 0, 1]) base_panel();
}
module panel() {
@ -244,15 +244,35 @@ module panel_with_raised_overhang() {
module frame_box() {
difference() {
top_points = [
// top part, majority of shape
[(frame_x/2)-3, (frame_y/2)-3, panel_z/2],
[-(frame_x/2)+3, (frame_y/2)-3, panel_z/2],
[(frame_x/2)-3, -(frame_y/2)+3, panel_z/2],
[-(frame_x/2)+3, -(frame_y/2)+3, panel_z/2],
// top bevel
[(frame_x/2)-4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
[-(frame_x/2)+4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
[(frame_x/2)-4, -(frame_y/2)+4, frame_z/2-frame_bevel_height/2],
[-(frame_x/2)+4, -(frame_y/2)+4, frame_z/2-frame_bevel_height/2],
];
base_points = [
// majority of shape
[(frame_x/2)-2, (frame_y/2)-2, 0],
[-(frame_x/2)+2, (frame_y/2)-2, 0],
[(frame_x/2)-2, -(frame_y/2)+2, 0],
[-(frame_x/2)+2, -(frame_y/2)+2, 0],
];
bottom_points = [
// bottom bevel
[(frame_x/2)-4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
[-(frame_x/2)+4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
[(frame_x/2)-4, -(frame_y/2)+4, -frame_z/2+frame_bevel_height/2],
[-(frame_x/2)+4, -(frame_y/2)+4, -frame_z/2+frame_bevel_height/2],
];
hull() {
for (p = top_points) {
translate(p) cylinder(r=3, h=frame_z-panel_z, center=true);
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
}
for (p = base_points) {
translate(p) cylinder(r=2, h=frame_z-(frame_bevel_height*2), center=true);
}
for (p = bottom_points) {
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
}
}
// cut out the middle to make it a box
@ -300,18 +320,12 @@ module frame() {
difference() {
base_frame();
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_panel();
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) bottom_panel();
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
// comfort bevel
translate([frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
translate([-frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
translate([0, frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
translate([0, -frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
// slightly larger holes than the posts in the base_panel
translate([panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();

View File

@ -24,15 +24,15 @@ module left_frame() {
frame_cable_routing_hole();
// aux button holes
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([-72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, 0])
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();
}
}

View File

@ -27,15 +27,15 @@ module middle_frame() {
mirror([1, 0, 0]) frame_cable_routing_hole();
// neutrik mounts for connector, switches
translate([0, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
translate([0, (frame_y/2)-neutrik_panel_thickness, 0])
rotate([90, 0, 0]) neutrik_d_mount();
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
translate([0, (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, 1]) frame_cutout();
translate([40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
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, 1]) frame_cutout();
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
}
}

View File

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

View File

@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-piece-side.scad>
module interconnect_frame_half_piece() {
translate([frame_x/2-frame_wall, 0, 0]) difference() {
side_frame_piece();
rotate([0, 0, 180]) side_chopper();
}
}
module interconnect_frame_piece() {
difference() {
union() {
// slight translate is to make this a 2-manifold in OpenSCAD
translate([-0.01, 0, 0]) interconnect_frame_half_piece();
mirror([1, 0, 0]) interconnect_frame_half_piece();
}
translate([-frame_x/2, 0, 0]) frame_cable_routing_hole();
}
}
interconnect_frame_piece();

24
src/frame-piece-side.scad Normal file
View File

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-piece-top-left.scad>
use <frame-piece-bottom-left-or-right.scad>
module side_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
difference() {
// side piece is left/right agnostic
frame();
// minus the top and bottom
top_left_frame_piece();
bottom_left_or_right_frame_piece();
// and just chop out the rest of the frame
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
}
}
side_frame_piece();

View File

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

View File

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

View File

@ -24,15 +24,15 @@ module right_frame() {
mirror([1, 0, 0]) frame_cable_routing_hole();
// aux button holes
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([72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
// neutrix button hole
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, 0])
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();
}
}

View File

@ -11,25 +11,25 @@ module solo_frame() {
frame();
// 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)-neutrik_panel_thickness-4, 1]) frame_cutout();
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)-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([0, (frame_y/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_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
translate([-frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
translate([-frame_x/2+2.5, 0, 0]) rotate([90, 0, 270])
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, -37, 1]) 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, 0, 0]) 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, 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, 0]) rotate([90, 0, 270])
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, -37, 1]) 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, 0, 0]) 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, 0]) rotate([0, 0, 90]) frame_cutout();
}
}

View File

@ -37,6 +37,10 @@ frame_x = 233;
frame_y = 208;
frame_z = 57;
// this sinks the bottom and top of the frame inward a bit, and is used to math out two shapes
// when creating the frame box
frame_bevel_height = 2;
frame_center_to_neutrik = 70;
// depth of the "lip" of the frame that the top plate sets into/supports the overhang