2024-09-27 02:15:30 +00:00
|
|
|
$fn = 50;
|
|
|
|
threshold = 0.1;
|
|
|
|
|
|
|
|
board_length = 92;
|
|
|
|
board_width = 72;
|
|
|
|
board_height = 21.5;
|
2024-10-15 13:41:52 +00:00
|
|
|
wall_thickness = 4;
|
2024-09-27 02:15:30 +00:00
|
|
|
bevel = 0.5;
|
|
|
|
|
|
|
|
hinge_radius = 2.5;
|
|
|
|
|
|
|
|
case_width = board_width + wall_thickness * 2;
|
|
|
|
case_length = board_length + wall_thickness * 2;
|
|
|
|
case_height = board_height + wall_thickness;
|
|
|
|
|
2024-10-15 13:41:52 +00:00
|
|
|
handlebar_radius = 15;
|
|
|
|
clasp_thickness = 4;
|
|
|
|
circular_face_count = 48;
|
|
|
|
clasp_width = 35;
|
|
|
|
|
2024-09-27 02:15:30 +00:00
|
|
|
include <./common.scad>;
|
|
|
|
|
2024-10-15 13:41:52 +00:00
|
|
|
module top_clasp() {
|
|
|
|
difference() {
|
|
|
|
union() {
|
|
|
|
cylinder(h = clasp_width, r = handlebar_radius + clasp_thickness, center = true, $fn = circular_face_count);
|
|
|
|
translate([0, 0, -clasp_width / 2]) cylinder(h = 1, r = handlebar_radius + clasp_thickness + 1, center = true, $fn = circular_face_count);
|
|
|
|
translate([0, 0, -clasp_width / 2 + 4]) cylinder(h = 1, r = handlebar_radius + clasp_thickness + 1, center = true, $fn = circular_face_count);
|
|
|
|
translate([0, 0, clasp_width / 2]) cylinder(h = 1, r = handlebar_radius + clasp_thickness + 1, center = true, $fn = circular_face_count);
|
|
|
|
translate([0, 0, clasp_width / 2 - 4]) cylinder(h = 1, r = handlebar_radius + clasp_thickness + 1, center = true, $fn = circular_face_count);
|
|
|
|
translate([-handlebar_radius-5, -10, -clasp_width / 2 + 6]) cube([6, 20, clasp_width - 12]);
|
|
|
|
}
|
|
|
|
translate([-0.5, 0, 0]) cylinder(h = clasp_width+2, r = handlebar_radius + 1, center = true, $fn = circular_face_count);
|
|
|
|
translate([-0.5, -handlebar_radius - 10, -clasp_width / 2 - 1]) cube([handlebar_radius + 10, handlebar_radius * 2 + 20, clasp_width + 2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-27 02:15:30 +00:00
|
|
|
module hinge(length) {
|
|
|
|
difference() {
|
|
|
|
union() {
|
|
|
|
cylinder(h = length, r = hinge_radius);
|
|
|
|
translate([0, -hinge_radius, 0])
|
|
|
|
cube([hinge_radius, hinge_radius * 2, length]);
|
|
|
|
}
|
|
|
|
translate([0, 0, -threshold / 2]) cylinder(h = length + threshold, r = 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-15 13:41:52 +00:00
|
|
|
module base_case(length, width, height, bevel = 0) {
|
|
|
|
difference() {
|
|
|
|
union() {
|
|
|
|
channel(length + wall_thickness / 2, width, height, bevel);
|
|
|
|
|
|
|
|
translate([-bevel, 0, bevel])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 90, 0])
|
|
|
|
box_face([width, height, wall_thickness], bevel);
|
|
|
|
|
2024-10-15 17:11:06 +00:00
|
|
|
// These are the sleds at the bottom of the case that should hold the lower of the two boards down
|
2024-10-15 13:41:52 +00:00
|
|
|
color("blue") translate([0, wall_thickness - 2, wall_thickness + 4]) cube([length - 8, 4, wall_thickness / 2]);
|
|
|
|
color("blue") translate([wall_thickness - 2, wall_thickness - 4, wall_thickness + 4]) cube([4, width, wall_thickness / 2]);
|
2024-10-15 17:11:06 +00:00
|
|
|
color("blue") translate([length - 25, width - wall_thickness * 3 / 2, wall_thickness + 6]) cube([16, wall_thickness, wall_thickness / 2]);
|
2024-10-15 13:41:52 +00:00
|
|
|
}
|
|
|
|
|
2024-10-15 17:11:06 +00:00
|
|
|
// This makes an indent at the bottom to accomodate solder joins
|
|
|
|
translate([wall_thickness + 2, wall_thickness + 2, wall_thickness / 2]) cube([length, width - wall_thickness * 2 - 4, wall_thickness / 2 + threshold]);
|
|
|
|
|
|
|
|
// This creates a cutout that lets the power plug slide in better.
|
|
|
|
translate([wall_thickness, width - wall_thickness, wall_thickness]) cube([length, 2, 6]);
|
|
|
|
|
|
|
|
// These two put in the slots that should allow the fourth wall to be slotted into place.
|
|
|
|
color("red") translate([length - 1, wall_thickness - 2, 4]) cube([2, 2, height]);
|
|
|
|
color("red") translate([length - 1, width - wall_thickness, 4]) cube([2, 2, height]);
|
2024-10-15 13:41:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-27 02:15:30 +00:00
|
|
|
module main_case() {
|
|
|
|
hinge_length = board_length / 4;
|
|
|
|
hinge_y_offset = board_width + wall_thickness + hinge_radius;
|
|
|
|
hinge_z_offset = board_height;
|
|
|
|
|
|
|
|
difference() {
|
|
|
|
union() {
|
2024-10-15 13:41:52 +00:00
|
|
|
base_case(case_length,
|
2024-09-27 02:15:30 +00:00
|
|
|
case_width,
|
|
|
|
case_height,
|
|
|
|
bevel);
|
|
|
|
|
2024-10-15 13:41:52 +00:00
|
|
|
translate([-bevel, 0, bevel])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 90, 0])
|
|
|
|
box_face([case_width, case_height, wall_thickness], bevel);
|
|
|
|
|
2024-09-27 02:15:30 +00:00
|
|
|
translate([0, -hinge_radius - bevel + threshold, hinge_z_offset + bevel])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 90, 0])
|
|
|
|
hinge(case_length / 4);
|
|
|
|
|
|
|
|
translate([case_length - hinge_length, -hinge_radius - bevel + threshold, hinge_z_offset + bevel])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 90, 0])
|
|
|
|
hinge(case_length / 4);
|
|
|
|
|
|
|
|
translate([43, case_width, wall_thickness + 8])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 180, 0])
|
|
|
|
linear_extrude(1)
|
|
|
|
text("lights", size = 3);
|
|
|
|
|
|
|
|
translate([67, case_width, wall_thickness + 8])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 180, 0])
|
|
|
|
linear_extrude(1)
|
|
|
|
text("left", size = 3);
|
|
|
|
|
|
|
|
translate([55, case_width, wall_thickness + 8])
|
|
|
|
rotate([90, 0, 0])
|
|
|
|
rotate([0, 180, 0])
|
|
|
|
linear_extrude(1)
|
|
|
|
text("right", size = 3);
|
2024-10-15 17:11:06 +00:00
|
|
|
// translate([case_length / 2, case_width / 2, -20]) rotate([0, 90, 0]) top_clasp();
|
2024-09-27 02:15:30 +00:00
|
|
|
}
|
|
|
|
|
2024-10-15 17:11:06 +00:00
|
|
|
translate([case_length / 2, case_width / 2, -threshold]) hexagon(4.5, 6);
|
|
|
|
|
2024-09-27 02:15:30 +00:00
|
|
|
color("green", 1) translate([8.5 + wall_thickness, case_width - wall_thickness - threshold, wall_thickness])
|
|
|
|
cube([60, wall_thickness * 2, 7]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module lid() {
|
|
|
|
lid_width = case_width + hinge_radius * 2 + wall_thickness;
|
|
|
|
union() {
|
|
|
|
difference() {
|
|
|
|
box_face([case_length,
|
|
|
|
lid_width,
|
|
|
|
wall_thickness],
|
|
|
|
bevel);
|
|
|
|
translate([(case_length - 60) / 2, 14 + hinge_radius * 2, -threshold / 2])
|
|
|
|
cube([60, 16, wall_thickness + threshold]);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate([case_length / 4 + 1, hinge_radius - 0.4, -hinge_radius])
|
|
|
|
rotate([180, 0, 0])
|
|
|
|
rotate([0, 90, 0]) hinge(case_length / 2 - 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-15 13:41:52 +00:00
|
|
|
module box_side() {
|
|
|
|
box_side_slider(case_length, case_width, case_height);
|
|
|
|
}
|