Compare commits
6 Commits
155cba6d85
...
341f6cfc6a
Author | SHA1 | Date |
---|---|---|
Brian S. Stephan | 341f6cfc6a | |
Brian S. Stephan | 308c21fb61 | |
Brian S. Stephan | c7befe0800 | |
Brian S. Stephan | 41bfe3a661 | |
Brian S. Stephan | 412e6231d5 | |
Brian S. Stephan | 0ed6b32911 |
19
README.md
19
README.md
|
@ -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
10
TODO.md
|
@ -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?
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue