diff --git a/bike-lights/case/common.scad b/bike-lights/case/common.scad index 9597f9d..a142752 100644 --- a/bike-lights/case/common.scad +++ b/bike-lights/case/common.scad @@ -1,6 +1,6 @@ module hexagon(r, h) { - cylinder(r = r, h = h, $fn = 6); + cylinder(r = r, h = h, center = 2, $fn = 6); } module pill(length, bevel) { @@ -10,6 +10,27 @@ module pill(length, bevel) { } } +module rounded_cube(dimensions, bevel = 0) { + x = dimensions[0]; + y = dimensions[1]; + z = dimensions[2]; + + if (bevel > 0) { + hull() { + translate([-x / 2 + bevel, -y / 2 + bevel, -z / 2 + bevel]) sphere(r = bevel); + translate([ x / 2 - bevel, -y / 2 + bevel, -z / 2 + bevel]) sphere(r = bevel); + translate([ x / 2 - bevel, y / 2 - bevel, -z / 2 + bevel]) sphere(r = bevel); + translate([-x / 2 + bevel, y / 2 - bevel, -z / 2 + bevel]) sphere(r = bevel); + translate([-x / 2 + bevel, -y / 2 + bevel, z / 2 - bevel]) sphere(r = bevel); + translate([ x / 2 - bevel, -y / 2 + bevel, z / 2 - bevel]) sphere(r = bevel); + translate([ x / 2 - bevel, y / 2 - bevel, z / 2 - bevel]) sphere(r = bevel); + translate([-x / 2 + bevel, y / 2 - bevel, z / 2 - bevel]) sphere(r = bevel); + } + } else { + cube(dimensions, center = true); + } +} + module box_face(dimensions, bevel = 0) { x = dimensions[0]; y = dimensions[1]; diff --git a/bike-lights/case/control_panel.scad b/bike-lights/case/control_panel.scad index 7061394..d09285f 100644 --- a/bike-lights/case/control_panel.scad +++ b/bike-lights/case/control_panel.scad @@ -38,11 +38,10 @@ module top_clasp() { module hinge(length) { difference() { union() { - cylinder(h = length, r = hinge_radius); - translate([0, -hinge_radius, 0]) - cube([hinge_radius, hinge_radius * 2, length]); + cube([hinge_radius * 2, length, hinge_radius], center = true); + translate([0, 0, -1.5]) rotate([90, 0, 0]) cylinder(h = length, r = hinge_radius, center = true); } - translate([0, 0, -threshold / 2]) cylinder(h = length + threshold, r = 1); + translate([0, threshold / 2, -1.5]) rotate([90, 0, 0]) cylinder(h = length + threshold * 2, r = 1, center = true); } } @@ -123,29 +122,85 @@ module main_case() { translate([case_length / 2, case_width / 2, -threshold]) hexagon(4.5, 6); - color("green", 1) translate([8.5 + wall_thickness, case_width - wall_thickness - threshold, wall_thickness]) - cube([60, wall_thickness * 2, 7]); + # translate([8.5 + wall_thickness, case_width - wall_thickness - threshold, wall_thickness]) + # cube([60, wall_thickness * 2, 7]); + } +} + +module lamp() { + union() { + translate([0, 0, -0.5]) cube([12.9 + threshold, 8, 4], center = true); + translate([0, 0, .88]) cube([5 + threshold, 5 + threshold, 1.56], center = true); + /* + translate([0, 0, -1.56]) cube([12.9, 7.6, wall_thickness], center = true); + */ + } +} + +module button() { + union() { + cube([3.5 + threshold, 6.1 + threshold, 4 + threshold], center = true); + translate([0, 0, -0.5]) cube([1.2, 7, 3 + threshold], center = true); } } module lid() { lid_width = case_width + hinge_radius * 2 + wall_thickness; + hinge_length = case_length / 4; union() { difference() { - box_face([case_length, + rounded_cube([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([0, lid_width / 5, 0.4]) lamp(); + translate([-15, lid_width / 5, 0.4]) lamp(); + translate([15, lid_width / 5, 0.4]) lamp(); + translate([-30, lid_width / 5, 0]) button(); + translate([30, lid_width / 5, 0]) button(); + + translate([0, lid_width / 5, -2]) cube([20, 7, 3], center = true); + + color("black") translate([-2, lid_width / 5 - 5, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h=5, r = 1, center = true, $fn = circular_face_count); + color("black") translate([-17, lid_width / 5 - 5, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h=5, r = 1, center = true, $fn = circular_face_count); + color("black") translate([13, lid_width / 5 - 5, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h=5, r = 1, center = true, $fn = circular_face_count); + color("black") translate([-30, lid_width / 5 - 5, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h=5, r = 1, center = true, $fn = circular_face_count); + color("black") translate([30, lid_width / 5 - 5, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h=5, r = 1, center = true, $fn = circular_face_count); + color("black") translate([0, 10, -2]) rotate([0, 90, 0]) cylinder(h = 62, r = 1, center = true, $fn = circular_face_count); + + color("red") translate([-33, 21, -2]) rotate([0, 90, 0]) cylinder(h = 5, r = 1, center = true, $fn = circular_face_count); + color("red") translate([-35, 13, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h = 18, r = 1, center = true, $fn = circular_face_count); + color("red") translate([33, 21, -2]) rotate([0, 90, 0]) cylinder(h = 5, r = 1, center = true, $fn = circular_face_count); + color("red") translate([35, 13, -2]) rotate([0, 0, 90]) rotate([0, 90, 0]) cylinder(h = 18, r = 1, center = true, $fn = circular_face_count); + color("red") translate([0, 5, -2]) rotate([0, 90, 0]) cylinder(h = 70, r = 1, center = true, $fn = circular_face_count); } - translate([case_length / 4 + 1, hinge_radius - 0.4, -hinge_radius]) - rotate([180, 0, 0]) - rotate([0, 90, 0]) hinge(case_length / 2 - 2); + translate([case_length / 2 - hinge_length / 2, lid_width / 2 - wall_thickness / 2 - 0.5, -wall_thickness / 2]) rotate([0, 0, 90]) hinge(hinge_length); + translate([-case_length / 2 + hinge_length / 2, lid_width / 2 - wall_thickness / 2 - 0.5, -wall_thickness / 2]) rotate([0, 0, 90]) hinge(hinge_length); } } module box_side() { box_side_slider(case_length, case_width, case_height); } + +module case_base() { + difference() { + rounded_cube([case_length, case_width, wall_thickness + 2], bevel = 0.5); + translate([wall_thickness, 0, 2]) rounded_cube([case_length + threshold, board_width + threshold, 2 + threshold]); + + // These give a screw-hole in the center which will allow the clamp to be attached + translate([0, 0, -1]) hexagon(4.5, 2); + translate([0, 0, -wall_thickness / 2]) cylinder(r = 2, h = wall_thickness + threshold, center = true); + + // and now a bit of an indentation to help the clip remain in place + translate([0, 0, -4.5]) cube([clasp_width + threshold, clasp_width + threshold, wall_thickness], center = true); + + // here are some grooves along the edges that can be used to piece parts together + translate([wall_thickness / 2, case_width / 2 - wall_thickness / 2, wall_thickness / 2]) + cube([board_length + wall_thickness, wall_thickness / 2, wall_thickness / 2 + threshold], center = true); + translate([wall_thickness / 2, -case_width / 2 + wall_thickness / 2, wall_thickness / 2]) + cube([board_length + wall_thickness, wall_thickness / 2, wall_thickness / 2 + threshold], center = true); + } +} + diff --git a/bike-lights/case/control_panel_case.scad b/bike-lights/case/control_panel_case.scad index 9ba0bf7..6b496af 100644 --- a/bike-lights/case/control_panel_case.scad +++ b/bike-lights/case/control_panel_case.scad @@ -1,4 +1,11 @@ include <./control_panel.scad> -main_case(); +/* +difference() { + color("blue") rounded_cube([5, 5, 5], bevel = 0.5); + translate([0, 0, 1]) rounded_cube([4, 4, 4]); +}; +*/ + +case_base(); diff --git a/bike-lights/case/control_panel_lid.scad b/bike-lights/case/control_panel_lid.scad index 6824eca..f5b6756 100644 --- a/bike-lights/case/control_panel_lid.scad +++ b/bike-lights/case/control_panel_lid.scad @@ -2,4 +2,5 @@ include <./control_panel.scad> lid(); +// lamp(); diff --git a/bike-lights/case/control_panel_lid.stl b/bike-lights/case/control_panel_lid.stl new file mode 100644 index 0000000..f76da43 Binary files /dev/null and b/bike-lights/case/control_panel_lid.stl differ