diff --git a/avr/devices/n29/enclosure.scad b/avr/devices/n29/enclosure.scad new file mode 100644 index 0000000..e323e3e --- /dev/null +++ b/avr/devices/n29/enclosure.scad @@ -0,0 +1,245 @@ +$fn = 50; + +width = 45; +length = 60; +height = 20; + +corner_radius = 2; +wall_thickness = 1.5; +post_diameter = 8; +post_height = 0; + +hole_diameter = 3; + +lid_height = 4; +lid_tolerance = .3; + +hook_height = 1; +hook_tolerance = 0.75; +hook_slit_height = 2.5; + +airslit_height = 1.75; + +ridge_height = 16; +ridge_width = 1; +ridge_depth = 2.5; + +netconn_width = 17; +netcomm_length = 6; +netcomm_height = 20; +netcomm_tolerance = .3; + + + +module posts(x, y, z, h, r){ + translate([x, y, z]) + cylinder(r = r, h = h); + + translate([-x, y, z]) + cylinder(r = r, h = h); + + translate([-x, -y, z]) + cylinder(r = r, h = h); + + translate([x, -y, z]) + cylinder(r = r, h = h); +} + + +union() { + difference() { + // box + hull() { + posts( + x=(width/2 - corner_radius), + y=(length/2 - corner_radius), + z=0, + h=height, + r=corner_radius); + } + + // hollow + hull() { + posts( + x=(width/2 - corner_radius - wall_thickness), + y=(length/2 - corner_radius - wall_thickness), + z=wall_thickness, + h=height, + r=corner_radius); + } + + // lip inside box + *hull() { + posts( + x=(width/2 - corner_radius - lid_lip), + y=(length/2 - corner_radius - lid_lip), + z=(height - lid_thickness), + h=(lid_thickness + 1), + r=corner_radius); + } + + // ventilation slits left 1 + for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) { + translate([(-width/2)-wall_thickness, (-length/4), i]) + cube([10, length/5, airslit_height], center=true); + } + + // ventilation slits top + for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) { + translate([0, -(length/2), i]) + cube([width/2, 10, airslit_height], center=true); + } + + // ventilation slits right 1 + for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) { + translate([(width/2)-wall_thickness, (-length/4), i]) + cube([10, length/5, 1.75], center=true); + } + + // network connector hole 1 + translate([(netconn_width-netcomm_tolerance)/2, + (length/2), + wall_thickness+2+10]) + cube([netconn_width+netcomm_tolerance, + netcomm_length, + netcomm_height], + center=true); + + // network connector hole 2 + translate([-(netconn_width-netcomm_tolerance)/2, + (length/2), + wall_thickness+2+10]) + cube([netconn_width+netcomm_tolerance, + netcomm_length, + netcomm_height], + center=true); + + // LED hole + translate([12, -16, -wall_thickness]) + cylinder(r = 5.5/2, h = 6); + + // Motion sensor hole + translate([0, -16, -wall_thickness]) + cylinder(r = 11/2, h = 6); + + // Photodiode hole + translate([-11, -16, -wall_thickness]) + cylinder(r = 5.5/2, h = 6); + + } + + // hooks upward facing side + translate([-(width/2)-0.25, length/8, height-(hook_height/2)]) + cube([2.5, 7, hook_height], center=true); + translate([-(width/2)-0.25, -length/8, height-(hook_height/2)]) + cube([2.5, 7, hook_height], center=true); + + // hooks downward facing side + translate([(width/2)+0.25, length/8, height-(hook_height/2)]) + cube([2.5, 7, hook_height], center=true); + translate([(width/2)+0.25, -length/8, height-(hook_height/2)]) + cube([2.5, 7, hook_height], center=true); + + // ridges to hold the pcb + translate([(width/2)-wall_thickness, 0, ridge_height/2+(height-ridge_height)]) + cube([ridge_depth, ridge_width, ridge_height], center=true); + + translate([-((width/2)-wall_thickness), + length/8, + ridge_height/2+(height-ridge_height)]) + cube([ridge_depth, ridge_width, ridge_height], center=true); + + translate([-((width/2)-wall_thickness), + -length/8, + ridge_height/2+(height-ridge_height)]) + cube([ridge_depth, ridge_width, ridge_height], center=true); + + +} + + +/* lid */ +translate([0, 0, 50]) { /* match at Z=16.5, otherwise 50*/ + difference() { + union() { + difference() { + hull() { + posts( + x=(width/2 - corner_radius + wall_thickness + lid_tolerance), + y=(length/2 - corner_radius + lid_tolerance), + z=0, + h=lid_height+wall_thickness, + r=corner_radius); + } + + hull() { + posts( + x=(width/2 - corner_radius ), + y=(length/2 - corner_radius)+5, + z=-(wall_thickness), + h=lid_height+wall_thickness, + r=corner_radius); + } + + // slits for hooks (upward facing side) + translate([-((width/2)+wall_thickness/2), + length/8, + lid_height-((hook_slit_height)/2)]) + cube([4, 9, hook_slit_height], center=true); + translate([-((width/2)+wall_thickness/2), + -length/8, + lid_height-((hook_slit_height)/2)]) + cube([4, 9, hook_slit_height], center=true); + + // slits for hooks (downward facing side) + translate([(width/2)+(wall_thickness/2), + length/8, + lid_height-((hook_slit_height)/2)]) + cube([4, 9, hook_slit_height], center=true); + translate([(width/2)+(wall_thickness/2), + -length/8, + lid_height-((hook_slit_height)/2)]) + cube([4, 9, hook_slit_height], center=true); + } + + + // hooks downward facing side + *translate([(width/2)-lid_lip, 0, 1]) + cube([2, 5, hook_thickness], center=true); + *translate([(width/2)-lid_lip, length/4, 1]) + cube([2, 5, hook_thickness], center=true); + *translate([(width/2)-lid_lip, -length/4, 1]) + cube([2, 5, hook_thickness], center=true); + + } + + // drilling holes + translate([0, 0, -wall_thickness]) + cylinder(r = hole_diameter, h = 10); + + translate([0, -(length/3), -wall_thickness]) + cylinder(r = hole_diameter, h = 10); + + } +} + + + +// support posts for pcb +/*difference() { + translate([0, length/4, wall_thickness]) + cylinder(r = post_diameter/2, h = post_height); + + translate([0, length/4, wall_thickness]) + cylinder(r = hole_diameter/2, h = post_height+3); +} + + +difference() { + translate([0, -length/4, wall_thickness]) + cylinder(r = post_diameter/2, h = post_height); + + translate([0, -length/4, wall_thickness]) + cylinder(r = hole_diameter/2, h = post_height+3); +} +*/ \ No newline at end of file