Files
aqhomecontrol/avr/devices/n29/enclosure.scad
Martin Preuss 56f2cf6870 minor changes on enclosure for N29 devices.
- decreased height of holding ridge (was a bit tight)
- moved drilling holes in lid (the lower one was conflicting with the
  network connectors)
2026-02-26 17:35:15 +01:00

245 lines
7.0 KiB
OpenSCAD

$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);
}
*/