diff --git a/013-PSU-Enclosure/box.scad b/013-PSU-Enclosure/box.scad new file mode 100644 index 0000000..0a793cc --- /dev/null +++ b/013-PSU-Enclosure/box.scad @@ -0,0 +1,139 @@ +include ; +include +use ; + +module one_unit(unit_height) { + translate([ 0, unit_height ]) { + unit_voltmeter_size = [ 23 * mm, 10.5 * mm, wall_size + 2 * epsilon ]; + unit_voltmeter_spacing = 15 * mm; + translate([ 0, unit_voltmeter_spacing ]) + cube(unit_voltmeter_size); + + unit_hole_diameter = 8 * mm; + unit_hole_spacing = 10 * mm; + translate([ unit_voltmeter_size.x / 2 - unit_hole_spacing / 2 - unit_hole_diameter / 2, 0 ]) + cylinder(d = unit_hole_diameter, h = wall_size + 2 * epsilon); + translate([ unit_voltmeter_size.x / 2 + unit_hole_spacing / 2 + unit_hole_diameter / 2, 0 ]) + cylinder(d = unit_hole_diameter, h = wall_size + 2 * epsilon); + } +} + +module three_units(unit_height) { + rotate([ 90, 0, 0 ]) { + translate([ 30 * mm, 0, -epsilon ]) + one_unit(unit_height); + translate([ 65 * mm, 0, -epsilon ]) + one_unit(unit_height); + translate([ 100 * mm, 0, -epsilon ]) + one_unit(unit_height); + } +} + +module main_socket(socket_position) { + // Main socket + socket_dimension = [ wall_size + 2 * epsilon, 31 * mm, 22 * mm ]; + socket_mounting_holes_diameter = 2.5 * mm; + socket_mounting_holes_position = [ 0, - 4.5 * mm, socket_dimension.z / 2 ]; + translate([ -wall_size - epsilon + socket_position.x, useful_size.y + socket_position.y, socket_position.z ]) { + cube(socket_dimension); + translate(socket_mounting_holes_position) + rotate([ 0, 90, 0 ]) + cylinder(d = socket_mounting_holes_diameter, h = wall_size + 2 * epsilon); + translate([ socket_mounting_holes_position.x, socket_dimension.y - socket_mounting_holes_position.y, socket_mounting_holes_position.z ] ) + rotate([ 0, 90, 0 ]) + cylinder(d = socket_mounting_holes_diameter, h = wall_size + 2 * epsilon); + } +} + +module main_switch(switch_position) { + // Main switch + switch_dimension = [ wall_size + 2 * epsilon, 19 * mm, 13 * mm ]; + translate([ -wall_size - epsilon + switch_position.x, useful_size.y + switch_position.y, switch_position.z ]) { + cube(switch_dimension); + } +} + +module fan_vent(fan_vent_position) { + // Fan vent + fan_vent_size = [ 76.5 * mm, 76.5 * mm, wall_size + 2 * epsilon ]; + fan_vent_diameter = 90 * mm; + fan_vent_mounting_hole_position = [ 36 * mm, 36 * mm ]; + fan_vent_mounting_hole_diameter = 5.5 * mm; + translate([ -wall_size - epsilon, useful_size.y - fan_vent_position.x - fan_vent_size.x / 2, fan_vent_position.y + fan_vent_size.y / 2 ]) + rotate([ 0, 90, 0 ]) { + intersection() { + translate(-[ fan_vent_size.x, fan_vent_size.y] / 2) + cube(fan_vent_size); + cylinder(d = fan_vent_diameter, h = wall_size + 2 * epsilon, $fn = 180); + spray_pattern([ fan_vent_size / -2, fan_vent_size / 2 ], [ [ 2 * vent_xstep, 0 ], [ vent_xstep, vent_ystep ] ]) { + cylinder(d = vent_alveolus_size, h = wall_size + 2 * epsilon, $fn = 6); + } + } + + at_four_corners([ -fan_vent_mounting_hole_position, fan_vent_mounting_hole_position ]) + cylinder(d = fan_vent_mounting_hole_diameter, h = wall_size + 2 * epsilon); + } +} + +module back_vent() { + // Back vents + back_vent_crop = [ [ 10 * mm, 10 * mm ], + [ 30 * mm, 10 * mm ] ]; + back_vent_additional_margin = 30 * mm; + back_vent_size = [ useful_size.y - back_vent_crop[0].x - back_vent_crop[1].x, useful_size.z - back_vent_crop[0].y - back_vent_crop[1].y ]; + translate([ useful_size.x - epsilon, 0, 0 ]) + rotate([ 0, 0, 180 ]) + rotate([ 0, -90, 0 ]) + rotate([ 0, 0, -90 ]) + intersection() { + spray_pattern([ back_vent_crop[1], back_vent_size + back_vent_crop[1] ], [ [ 2 * vent_xstep, 0 ], [ vent_xstep, vent_ystep ] ]) { + cylinder(d = vent_alveolus_size, h = wall_size + 2 * epsilon, $fn = 6); + } + translate(back_vent_crop[1]) + cube([ back_vent_size.x, back_vent_size.y, wall_size + 2 * epsilon ]); + } +} + +module two_leds(position) { + rotate([ 90, 0, 0 ]) { + led_hole_diameter = 5 * mm; + led_margin = 10 * mm; + translate(position + [ 0, 0, -epsilon ]) + cylinder(d = led_hole_diameter, h = wall_size + 2 * epsilon); + translate(position + [ 0, led_margin, -epsilon ]) + cylinder(d = led_hole_diameter, h = wall_size + 2 * epsilon); + } +} + +module main_switch(position) { + rotate([ 90, 0, 0 ]) { + main_switch_size = [ 12 * mm, 19.5 * mm, 0 ]; + translate(position - main_switch_size / 2 + [ 0, 0, -epsilon ]) + cube(main_switch_size + [ 0, 0, wall_size + 2 * epsilon ]); + } +} + +module backplate_mount(position) { + backplate_mount_screw_hole_diameter = 2.5 * mm; + backplate_mount_screw_hole_height = 8 * mm; + + at_four_corners([ position, position + [ 94.75 * mm, -135 * mm ] ]) { + difference() { + cylinder(d = backplate_mount_screw_hole_diameter + wall_size * 2, h = backplate_mount_screw_hole_height); + translate([ 0, 0, epsilon ]) + cylinder(d = backplate_mount_screw_hole_diameter, h = backplate_mount_screw_hole_height + 2 * epsilon); + } + } +} + +difference() { + rounded_box(useful_size, wall_size, round_radius, cover_screw_hole_diameter); + main_socket([ 0, -133 * mm, 20 * mm ]); + main_switch([ 0, -127 * mm, 60 * mm ]); + fan_vent([ 10 * mm, 5 * mm ]); + back_vent(); + three_units(unit_height = 40 * mm); + two_leds([ 15 * mm, 60 * mm, 0 ]); + main_switch([ 15 * mm, 20 * mm, 0 ]); +} +backplate_mount([ 36 * mm, useful_size.y - 8 * mm, 0 ]); diff --git a/013-PSU-Enclosure/common.scad b/013-PSU-Enclosure/common.scad new file mode 100644 index 0000000..4299f67 --- /dev/null +++ b/013-PSU-Enclosure/common.scad @@ -0,0 +1,83 @@ +include ; + +$fn = 36; + +// Size of the enclosure +useful_size = [ 15 * cm, 17 * cm, 9 * cm ]; + +// Thickness of the walls +wall_size = 3 * mm; + +// Edges are soften with this radius +round_radius = 3 * mm; + +// Vent Parameters (hexagon structure) +vent_alveolus_size = 8 * mm; +vent_margin = 1 * mm; +vent_xstep = cos(30) * (vent_margin + sqrt(3) * vent_alveolus_size / 2); +vent_ystep = sin(30) * (vent_margin + sqrt(3) * vent_alveolus_size / 2); + +// Screw hole diameter for the four screws holding the cover +cover_screw_hole_diameter = 2.5 * mm; + +module box(useful_size, wall_size) { + difference() { + translate([ -wall_size, -wall_size, -wall_size ]) + cube([ useful_size.x + 2 * wall_size, useful_size.y + 2 * wall_size, useful_size.z + wall_size ]); + translate([ 0, 0, epsilon]) + cube([ useful_size.x, useful_size.y, useful_size.z ]); + } +} + +module rounded_corner(round_radius, length) { + difference() { + cube([ round_radius, round_radius, length ]); + translate([ round_radius, round_radius, -epsilon ]) + cylinder(r=round_radius, h=length + 2 * epsilon); + } +} + +module at_four_corners(box) { + translate([ box[0].x, box[0].y, 0 ]) + children(); + translate([ box[1].x, box[0].y, 0 ]) + rotate([ 0, 0, 90 ]) + children(); + translate([ box[1].x, box[1].y, 0 ]) + rotate([ 0, 0, 180 ]) + children(); + translate([ box[0].x, box[1].y, 0 ]) + rotate([ 0, 0, 270 ]) + children(); +} + +module rounded_box(useful_size, wall_size, round_radius, cover_screw_hole_diameter = 0) { + difference() { + union() { + box(useful_size, wall_size); + if (cover_screw_hole_diameter == 0) { + at_four_corners([ [ 0, 0 ], useful_size ]) + rounded_corner(round_radius, useful_size.z); + } else { + at_four_corners([ [ 0, 0 ], useful_size ]) { + reinforcement_size = wall_size + cover_screw_hole_diameter; + difference() { + cube([ reinforcement_size, reinforcement_size, useful_size.z ]); + translate([ reinforcement_size + epsilon, reinforcement_size + epsilon, -epsilon ]) + rotate([ 0, 0, 180 ]) + rounded_corner(round_radius, useful_size.z + 2 * epsilon); + translate([ cover_screw_hole_diameter / 2, cover_screw_hole_diameter / 2, epsilon ]) + cylinder(d = cover_screw_hole_diameter, h = useful_size.z + epsilon); + } + translate([ 0, reinforcement_size, 0 ]) + rounded_corner(round_radius, useful_size.z); + translate([ reinforcement_size, 0, 0 ]) + rounded_corner(round_radius, useful_size.z); + } + } + } + at_four_corners([ [ -wall_size, -wall_size ], useful_size + [ wall_size, wall_size ] ]) + translate([ -epsilon, -epsilon, -wall_size - epsilon ]) + rounded_corner(round_radius, useful_size.z + wall_size + 2 * epsilon); + } +} diff --git a/013-PSU-Enclosure/cover.scad b/013-PSU-Enclosure/cover.scad new file mode 100644 index 0000000..65e565d --- /dev/null +++ b/013-PSU-Enclosure/cover.scad @@ -0,0 +1,10 @@ +include ; +include + +difference() { + rounded_box([ useful_size.x, useful_size.y, 0 ], wall_size, round_radius); + at_four_corners([ [ 0, 0 ], useful_size ]) { + translate([ (cover_screw_hole_diameter + 0.5) / 2 , (cover_screw_hole_diameter + 0.5) / 2 , -wall_size - epsilon ]) + cylinder(d = cover_screw_hole_diameter + 0.5, h = wall_size + 2 * epsilon); + } +} diff --git a/013-PSU-Enclosure/psu-enclosure.scad b/013-PSU-Enclosure/psu-enclosure.scad deleted file mode 100644 index 2c4330a..0000000 --- a/013-PSU-Enclosure/psu-enclosure.scad +++ /dev/null @@ -1,117 +0,0 @@ - -include ; -use ; - -$fn = 36; -useful_size = [ 14 * cm, 17 * cm, 9 * cm ]; -wall_size = 3 * mm; -round_radius = 3 * mm; - -// Vent Parameters -vent_alveolus_size = 8 * mm; -vent_margin = 1 * mm; -vent_xstep = cos(30) * (vent_margin + sqrt(3) * vent_alveolus_size / 2); -vent_ystep = sin(30) * (vent_margin + sqrt(3) * vent_alveolus_size / 2); - -module box(useful_size, wall_size) { - difference() { - translate([ -wall_size, -wall_size, -wall_size ]) - cube([ useful_size.x + 2 * wall_size, useful_size.y + 2 * wall_size, useful_size.z + wall_size ]); - translate([ 0, 0, epsilon]) - cube([ useful_size.x, useful_size.y, useful_size.z ]); - } -} - -module rounded_corner(round_radius, length) { - difference() { - cube([ round_radius, round_radius, length ]); - translate([ round_radius, round_radius, -epsilon ]) - cylinder(r=round_radius, h=length + 2 * epsilon); - } -} - -module at_four_corners(box) { - translate([ box[0].x, box[0].y, 0 ]) - children(); - translate([ box[1].x, box[0].y, 0 ]) - rotate([ 0, 0, 90 ]) - children(); - translate([ box[1].x, box[1].y, 0 ]) - rotate([ 0, 0, 180 ]) - children(); - translate([ box[0].x, box[1].y, 0 ]) - rotate([ 0, 0, 270 ]) - children(); -} - -module rounded_box(useful_size, wall_size, round_radius) { - difference() { - union() { - box(useful_size, wall_size); - at_four_corners([ [ 0, 0 ], useful_size ]) - rounded_corner(round_radius, useful_size.z); - } - at_four_corners([ [ -wall_size, -wall_size ], useful_size + [ wall_size, wall_size ] ]) - translate([ -epsilon, -epsilon, -wall_size - epsilon ]) - rounded_corner(round_radius, useful_size.z + wall_size + 2 * epsilon); - } -} - -difference() { - rounded_box(useful_size, wall_size, round_radius); - - // Main socket - socket_position = [ 0, -133 * mm, 20 * mm ]; - socket_dimension = [ wall_size + 2 * epsilon, 31 * mm, 22 * mm ]; - socket_mounting_holes_diameter = 2.5 * mm; - socket_mounting_holes_position = [ 0, - 4.5 * mm, socket_dimension.z / 2 ]; - translate([ -wall_size - epsilon + socket_position.x, useful_size.y + socket_position.y, socket_position.z ]) { - cube(socket_dimension); - translate(socket_mounting_holes_position) - rotate([ 0, 90, 0 ]) - cylinder(d = socket_mounting_holes_diameter, h = wall_size + 2 * epsilon); - translate([ socket_mounting_holes_position.x, socket_dimension.y - socket_mounting_holes_position.y, socket_mounting_holes_position.z ] ) - rotate([ 0, 90, 0 ]) - cylinder(d = socket_mounting_holes_diameter, h = wall_size + 2 * epsilon); - } - - // Main switch - switch_position = [ 0, -127 * mm, 60 * mm ]; - switch_dimension = [ wall_size + 2 * epsilon, 19 * mm, 13 * mm ]; - translate([ -wall_size - epsilon + switch_position.x, useful_size.y + switch_position.y, switch_position.z ]) { - cube(switch_dimension); - } - - // Fan vent - fan_vent_size = [ 76.5 * mm, 76.5 * mm, wall_size + 2 * epsilon ]; - fan_vent_position = [ 10 * mm, 5 * mm ]; - fan_vent_diameter = 90 * mm; - fan_vent_mounting_hole_position = [ 36 * mm, 36 * mm ]; - fan_vent_mounting_hole_diameter = 5.5 * mm; - translate([ -wall_size - epsilon, useful_size.y - fan_vent_position.x - fan_vent_size.x / 2, fan_vent_position.y + fan_vent_size.y / 2 ]) - rotate([ 0, 90, 0 ]) { - intersection() { - translate(-[ fan_vent_size.x, fan_vent_size.y] / 2) - cube(fan_vent_size); - cylinder(d = fan_vent_diameter, h = wall_size + 2 * epsilon, $fn = 180); - spray_pattern([ fan_vent_size / -2, fan_vent_size / 2 ], [ [ 2 * vent_xstep, 0 ], [ vent_xstep, vent_ystep ] ]) { - cylinder(d = vent_alveolus_size, h = wall_size + 2 * epsilon, $fn = 6); - } - } - - at_four_corners([ -fan_vent_mounting_hole_position, fan_vent_mounting_hole_position ]) - cylinder(d = fan_vent_mounting_hole_diameter, h = wall_size + 2 * epsilon); - } - - // Back vents - back_vent_crop = [ 10 * mm, 10 * mm ]; - back_vent_size = [ useful_size.y - 2 * back_vent_crop.x, useful_size.z - 2 * back_vent_crop.y ]; - translate([ useful_size.x - epsilon, 0, 0 ]) - rotate([ 0, 0, 180 ]) - rotate([ 0, -90, 0 ]) - rotate([ 0, 0, -90 ]) - spray_pattern([ back_vent_crop, back_vent_size + back_vent_crop ], [ [ 2 * vent_xstep, 0 ], [ vent_xstep, vent_ystep ] ]) { - cylinder(d = vent_alveolus_size, h = wall_size + 2 * epsilon, $fn = 6); - } - -}