Compare commits

..

No commits in common. "341f6cfc6a0855de996e3c6c5bff6ce040024343" and "155cba6d85e89aebfde91d2656a8fadecfee38ba" have entirely different histories.

8 changed files with 86 additions and 78 deletions

View File

@ -22,23 +22,6 @@ 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 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. 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 ## 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 These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the
@ -85,8 +68,6 @@ 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) * 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) * 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) * 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) * 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
of 2023-09-12) of 2023-09-12)

10
TODO.md
View File

@ -2,6 +2,14 @@
Notes for "next time". Notes for "next time".
## v4.x ## v3.3
* Try not using roundedcube and instead bezel the top, to get cleaner seams everywhere else
## v4
* 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
* 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,6 +3,8 @@
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
include <roundedcube.scad>
module m4_hole() { module m4_hole() {
cylinder(r=m4_bolt_radius, h=100, $fn=50, center=true); cylinder(r=m4_bolt_radius, h=100, $fn=50, center=true);
} }
@ -211,28 +213,7 @@ module bottom_panel() {
} }
module overhang_plate() { module overhang_plate() {
top_points = [ roundedcube([overhang_panel_x, overhang_panel_y, panel_z], center=true, radius=1);
// 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 // this takes the base_panel and makes it a small frame, putting a larger top plate
@ -264,40 +245,24 @@ module frame_box() {
difference() { difference() {
top_points = [ top_points = [
// top bevel // top bevel
[(frame_x/2)-(frame_bevel_height*2), [(frame_x/2)-4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
(frame_y/2)-(frame_bevel_height*2), [-(frame_x/2)+4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
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_x/2)+4, -(frame_y/2)+4, frame_z/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 = [ base_points = [
// majority of shape // majority of shape
[(frame_x/2)-frame_bevel_height, (frame_y/2)-frame_bevel_height, 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)+2, (frame_y/2)-2, 0],
[(frame_x/2)-frame_bevel_height, -(frame_y/2)+frame_bevel_height, 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)+2, -(frame_y/2)+2, 0],
]; ];
bottom_points = [ bottom_points = [
// bottom bevel // bottom bevel
[(frame_x/2)-(frame_bevel_height*2), [(frame_x/2)-4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
(frame_y/2)-(frame_bevel_height*2), [-(frame_x/2)+4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
-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_x/2)+4, -(frame_y/2)+4, -frame_z/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() { hull() {
for (p = top_points) { for (p = top_points) {

View File

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

View File

@ -38,9 +38,8 @@ frame_y = 208;
frame_z = 57; frame_z = 57;
// this sinks the bottom and top of the frame inward a bit, and is used to math out two shapes // 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 / overhang panel // when creating the frame box
frame_bevel_height = 2; frame_bevel_height = 2;
overhang_panel_bevel_height = 1;
frame_center_to_neutrik = 70; frame_center_to_neutrik = 70;

55
src/roundedcube.scad Normal file
View File

@ -0,0 +1,55 @@
// 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);
}
}
}
}
}
}
}