Compare commits

...

6 Commits

Author SHA1 Message Date
Brian S. Stephan 341f6cfc6a
add to the complications of the box frame method in the notes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-06 13:02:43 -06:00
Brian S. Stephan 308c21fb61
add more parts notes to the README
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-06 12:01:26 -06:00
Brian S. Stephan c7befe0800
update the TODO
I did the "four pieces" one, yay!

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-06 11:41:50 -06:00
Brian S. Stephan 41bfe3a661
bevel overhang panels in the same way as the frame
this also ends our last usage of roundedcube.scad

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-06 11:41:17 -06:00
Brian S. Stephan 412e6231d5
better parameterize frame bevel based on frame_bevel_height
replace hardcoded values creating the 45 degree bevel with the parameter
itself, so that htis is a bit more flexible in the future

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-06 11:33:09 -06:00
Brian S. Stephan 0ed6b32911
move the "extra lip" to the side pieces instead of the top/bottom
this is just an aesthetic choice, but I think 2+ tone colorways will
look slightly nicer if the whole side panel color runs along the whole
side rather than stopping at the top/bottom "lip". the actual difference
is arbitrary but I'm going to toy with this for now as I suspect side
colors and panels will be more interesting than top/bottom ones

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-03-05 14:33:06 -06:00
8 changed files with 78 additions and 86 deletions

View File

@ -22,6 +22,23 @@ component objects or create new ones. The OpenSCAD language is essentially a fun
it easy to reuse, alter, and compose objects. If you do not see the object you would like, you can likely create it by
starting with an existing object and constructing what you'd like with new or existing components.
## Usage of Parts
There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help
about when/how to use specific parts:
* `foo-panel-inset`s --- these fit flush into a frame, creating a closed box enclosure.
* `foo-panel-overhang`s --- these have a tray that fits into a frame with the actual face extending beyond the frame,
creating an ice cream sandwich enclosure.
* These also yield a bit more space inside the box, for tall levers or whatever.
* `frame`s (non-pieces) --- these create the box of the enclosure, as one part. These can be hard to print well ---
shrinkage forces tend to curl up the corners no matter what you do, and some points need supports --- but if you don't
care about that because you're printing an ice cream sandwich, they are simpler than...
* `frame-piece`s --- these break up the frame box into four faces, and are held together by friction fit and the hex
bolts. This is more stable than you might expect, but it does introduce some variability in the overall sturdiness of
the enclosure compared with the frame as one box piece.
* The `interconnect` replaces the need to bolt multiple frames together.
## Printing
These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the
@ -68,6 +85,8 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
* Left and right (non-overhang) bottom panels: **$6.80 USD** (135.99g each, as of 2024-02-22)
* Miscellaneous mounting plates, decorative plates, etc.: **~$1.83 USD** (~73g, as of 2024-02-22)
* 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)
* These are only necessary if you are using the whole frames, but as a heads up, the material cost of the
pieces-based interconnect piece costs around $1, so it's roughly a wash since that's also a frame wall.
* 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)

10
TODO.md
View File

@ -2,14 +2,6 @@
Notes for "next time".
## v3.3
* Try not using roundedcube and instead bezel the top, to get cleaner seams everywhere else
## v4
## v4.x
* 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
* 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?

View File

@ -3,8 +3,6 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <roundedcube.scad>
module m4_hole() {
cylinder(r=m4_bolt_radius, h=100, $fn=50, center=true);
}
@ -213,7 +211,28 @@ module bottom_panel() {
}
module overhang_plate() {
roundedcube([overhang_panel_x, overhang_panel_y, panel_z], center=true, radius=1);
top_points = [
// top bevel
[(overhang_panel_x/2)-(overhang_panel_bevel_height*2),
(overhang_panel_y/2)-(overhang_panel_bevel_height*2),
panel_z/2-overhang_panel_bevel_height/2],
[-(overhang_panel_x/2)+(overhang_panel_bevel_height*2),
(overhang_panel_y/2)-(overhang_panel_bevel_height*2),
panel_z/2-overhang_panel_bevel_height/2],
[(overhang_panel_x/2)-(overhang_panel_bevel_height*2),
-(overhang_panel_y/2)+(overhang_panel_bevel_height*2),
panel_z/2-overhang_panel_bevel_height/2],
[-(overhang_panel_x/2)+(overhang_panel_bevel_height*2),
-(overhang_panel_y/2)+(overhang_panel_bevel_height*2),
panel_z/2-overhang_panel_bevel_height/2],
];
hull() {
for (p = top_points) {
translate(p) cylinder(r=overhang_panel_bevel_height, h=overhang_panel_bevel_height, center=true);
}
translate([0, 0, -overhang_panel_bevel_height])
cube([overhang_panel_x, overhang_panel_y, panel_z-overhang_panel_bevel_height*2], center=true);
}
}
// this takes the base_panel and makes it a small frame, putting a larger top plate
@ -245,24 +264,40 @@ module frame_box() {
difference() {
top_points = [
// 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],
[(frame_x/2)-(frame_bevel_height*2),
(frame_y/2)-(frame_bevel_height*2),
frame_z/2-frame_bevel_height/2],
[-(frame_x/2)+(frame_bevel_height*2),
(frame_y/2)-(frame_bevel_height*2),
frame_z/2-frame_bevel_height/2],
[(frame_x/2)-(frame_bevel_height*2),
-(frame_y/2)+(frame_bevel_height*2),
frame_z/2-frame_bevel_height/2],
[-(frame_x/2)+(frame_bevel_height*2),
-(frame_y/2)+(frame_bevel_height*2),
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],
[(frame_x/2)-frame_bevel_height, (frame_y/2)-frame_bevel_height, 0],
[-(frame_x/2)+frame_bevel_height, (frame_y/2)-frame_bevel_height, 0],
[(frame_x/2)-frame_bevel_height, -(frame_y/2)+frame_bevel_height, 0],
[-(frame_x/2)+frame_bevel_height, -(frame_y/2)+frame_bevel_height, 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],
[(frame_x/2)-(frame_bevel_height*2),
(frame_y/2)-(frame_bevel_height*2),
-frame_z/2+frame_bevel_height/2],
[-(frame_x/2)+(frame_bevel_height*2),
(frame_y/2)-(frame_bevel_height*2),
-frame_z/2+frame_bevel_height/2],
[(frame_x/2)-(frame_bevel_height*2),
-(frame_y/2)+(frame_bevel_height*2),
-frame_z/2+frame_bevel_height/2],
[-(frame_x/2)+(frame_bevel_height*2),
-(frame_y/2)+(frame_bevel_height*2),
-frame_z/2+frame_bevel_height/2],
];
hull() {
for (p = top_points) {

View File

@ -14,9 +14,9 @@ module bottom_left_or_right_frame_piece() {
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
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}

View File

@ -14,9 +14,9 @@ module top_left_frame_piece() {
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
// ...minus the frame wall and lip on the left
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}

View File

@ -14,9 +14,9 @@ module top_right_frame_piece() {
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
// ...minus the frame wall and lip on the right
translate([frame_x/2-frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
cube([frame_wall, frame_y, frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}

View File

@ -38,8 +38,9 @@ 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
// when creating the frame box / overhang panel
frame_bevel_height = 2;
overhang_panel_bevel_height = 1;
frame_center_to_neutrik = 70;

View File

@ -1,55 +0,0 @@
// More information: https://danielupshaw.com/openscad-rounded-corners/
// Set to 0.01 for higher definition curves (renders slower)
$fs = 0.15;
module roundedcube(size = [1, 1, 1], center = false, radius = 0.5, apply_to = "all") {
// If single value, convert to [x, y, z] vector
size = (size[0] == undef) ? [size, size, size] : size;
translate_min = radius;
translate_xmax = size[0] - radius;
translate_ymax = size[1] - radius;
translate_zmax = size[2] - radius;
diameter = radius * 2;
obj_translate = (center == false) ?
[0, 0, 0] : [
-(size[0] / 2),
-(size[1] / 2),
-(size[2] / 2)
];
translate(v = obj_translate) {
hull() {
for (translate_x = [translate_min, translate_xmax]) {
x_at = (translate_x == translate_min) ? "min" : "max";
for (translate_y = [translate_min, translate_ymax]) {
y_at = (translate_y == translate_min) ? "min" : "max";
for (translate_z = [translate_min, translate_zmax]) {
z_at = (translate_z == translate_min) ? "min" : "max";
translate(v = [translate_x, translate_y, translate_z])
if (
(apply_to == "all") ||
(apply_to == "xmin" && x_at == "min") || (apply_to == "xmax" && x_at == "max") ||
(apply_to == "ymin" && y_at == "min") || (apply_to == "ymax" && y_at == "max") ||
(apply_to == "zmin" && z_at == "min") || (apply_to == "zmax" && z_at == "max")
) {
sphere(r = radius);
} else {
rotate =
(apply_to == "xmin" || apply_to == "xmax" || apply_to == "x") ? [0, 90, 0] : (
(apply_to == "ymin" || apply_to == "ymax" || apply_to == "y") ? [90, 90, 0] :
[0, 0, 0]
);
rotate(a = rotate)
cylinder(h = diameter, r = radius, center = true);
}
}
}
}
}
}
}