// v2 // Reduced rail width from 2 to 1.7 // Adjust ethernet and micro-usb // Ease assembly $w=2.5; // wall thickness $wf=1.5; // wall thickness for front and back faces $g=.2; // gap $hl=123; // heatsink length $hw=100; // heatsink width $hrailh=1.7 - $g; // heatsink rail height $hrailw=1.7 - $g; // heatsink rail witdth $boxh=52.5; // box height $boxw=$hw + 2 * ($w + $g); // box width $boxl=$hl / 2 + ($wf + $g); // box length $feeth=5.3; // feet height // ======================================== translate([0, 0, 0]) frontBox(); translate([0, 0, 0]) rotate([0, 0, 180]) color("orange") backBox(); // ================ MODULES ================ module frontBox() { difference() { union() { box(); color("red") hdd(); } frontHoles(); frontScrewoles(); frontLabel(); } } module backBox() { difference() { union() { box(); connectors(); } backHoles(); backScrewoles(); backLabel(); } } module frontLabel() { color("green") translate([$boxw / 2 - 6, $boxl - .5, $feeth + 7.5]) rotate([90, 0, 180]) union() { translate([4,10.5,0]) linear_extrude(2) text("Projet CLIC", size=5); translate([54,10.5,0]) linear_extrude(2) text("projetclic.cc", size=5); translate([4,4,0]) linear_extrude(2) text("YesWiki", size=5); translate([55.75,4,0]) linear_extrude(2) text("yeswiki.net", size=5); translate([4,-2.5,0]) linear_extrude(2) text("Le DistriLab", size=5); translate([60,-2.5,0]) linear_extrude(2) text("distrilab.fr", size=5); } translate([0, $boxl, $feeth + $boxh - 38.5]) corners(23, 92); } module backLabel() { color("green") translate([$boxw / 2 - 6, $boxl - .5, $feeth + 7.5]) rotate([90, 0, 180]) union() { translate([4,10.5,0]) linear_extrude(2) text("YUNoHost", size=5); translate([50,10.5,0]) linear_extrude(2) text("yunohost.org", size=5); translate([4,4,0]) linear_extrude(2) text("example", size=5); translate([49,4,0]) linear_extrude(2) text("example.com", size=5); translate([4,-2.5,0]) linear_extrude(2) text("example", size=5); translate([49,-2.5,0]) linear_extrude(2) text("example.com", size=5); } translate([0, $boxl, $feeth + $boxh - 38.5]) corners(23, 92); } module frontScrewoles() { translate([0, 4.2, $feeth + $boxh - 25.3]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=1.1, center=true, $fn=20); translate([37, 4.2, 0]) rotate([0, 0, 90]) cylinder(h=50, r=1.1, center=true, $fn=20); translate([-37, 4.2, 0]) rotate([0, 0, 90]) cylinder(h=50, r=1.1, center=true, $fn=20); } module backScrewoles() { translate([0, -4.2, $feeth + $boxh - 25.3]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=0.8, center=true, $fn=20); translate([37, -4.2, 0]) rotate([0, 0, 90]) cylinder(h=50, r=0.8, center=true, $fn=20); translate([-37, -4.2, 0]) rotate([0, 0, 90]) cylinder(h=50, r=0.8, center=true, $fn=20); } module connectors() { difference() { union() { connector($boxw - 2 * $w); translate([-$boxw / 2, 0, $feeth + $w + ($boxh-15.5)/2+0.05]) rotate([0, 90, 0]) connector($boxh-15.5, 0); translate([$boxw / 2, 0, $feeth + $w + ($boxh-15.5)/2+0.05]) rotate([0, -90, 0]) connector($boxh-15.5, 0); } translate([$boxw / 2 - .5 * $w, -5, $feeth + $w]) rotate([0, -45, 0]) cube([10, 10, 2 * $w], center=true); translate([-($boxw / 2 - .5 * $w), -5, $feeth + $w]) rotate([0, 45, 0]) cube([10, 10, 2 * $w], center=true); translate([-($boxw / 2 - .5 * $w), -7.7, $feeth + $w]) rotate([0, 45, 45]) cube([10, 10, 2 * $w], center=true); translate([$boxw / 2 - .5 * $w, -7.7, $feeth + $w]) rotate([0, -45, -45]) cube([10, 10, 2 * $w], center=true); } } module connector($width, $z = $feeth) { difference() { union() { translate([0, 0, $z + 1.5 * $w]) cube([$width, 18, $w], center=true); translate([0, 4.5, $z + $w]) cube([$width, 9, $w], center=true); } // translate([0, -9.3, $z + 1.5 * $w]) // rotate([45, 0, 0]) // cube([$width + $g, 18, $w], center=true); translate([0, 9.3, $z + 1.5 * $w]) rotate([-45, 0, 0]) cube([$width + $g, 18, $w], center=true); translate([0, -9.3, $z + 1.5 * $w]) rotate([-45, 0, 0]) cube([$width + $g, 18, $w], center=true); } } module backHoles() { color("green") { translate([0, $boxl, $feeth + $boxh - 13.8]) corners(24.26, 92); translate([31.9, $boxl, $boxh - 9.92]) cube([12.8, 5+$w, 3.1], center=true); translate([19, $boxl, $feeth + $boxh - 13.8]) rotate([90, 0, 0]) cylinder(h=5+$w, r=3, center=true, $fn=100); translate([-32.33, $boxl, $feeth + $boxh - 9.4]) rotate([90, 0, 0]) cylinder(h=5+$w, r=2.85, center=true, $fn=100); } } module frontHoles() { color("green") { translate([0, $boxl, $feeth + $boxh - 13.8]) corners(24.26, 92); // ethernet translate([34.42, $boxl, $feeth + $boxh - 14]) cube([15.32, 5+$wf, 13.5], center=true); // usb translate([-2.87, $boxl, $feeth + $boxh - 15.5]) cube([14.5, 5+$wf, 16], center=true); translate([-21, $boxl, $feeth + $boxh - 15.5]) cube([14.5, 5+$wf, 16], center=true); // power translate([-38.8, $boxl, $feeth + $boxh - 14.07]) rotate([90, 0, 0]) cylinder(h=5+$wf, r=3.725, center=true, $fn=100); // hdmi translate([17.13, $boxl, $feeth + $boxh - 10.8]) { difference() { cube([15.35, 5+$wf, 6], center=true); translate([-10, 0, 3]) rotate([0, 45, 0]) cube([6, 6+$wf, 6], center=true); translate([10, 0, 3]) rotate([0, -45, 0]) cube([6, 6+$wf, 6], center=true); } } // micro-usb translate([-21.21, $boxl, $feeth + $boxh - 4.3]) difference() { cube([8, 5+$wf, 3], center=true); translate([-5, 0, -1.5]) rotate([0, -45, 0]) cube([3, 6+$wf, 3], center=true); translate([5, 0, -1.5]) rotate([0, 45, 0]) cube([3, 6+$wf, 3], center=true); } translate([-39, $boxl - 3.5, $feeth + $boxh - 13.3]) cube([11, 5+$wf, 13], center=true); translate([16.8, $boxl - 3.5, $feeth + $boxh - 11]) cube([19, 5+$wf, 10], center=true); } } module corners($height = 0, $width = 0) { $r = 4; $h = $height - $r * 2; $w = $width - $r * 2; rotate([0, 90, 90]) union() { translate([-$h / 2, -$w / 2, 0]) difference() { cylinder(h=1, r=$r, center=true, $fn=100); cylinder(h=2, r=$r - 1, center=true, $fn=100); translate([0, 5, 0]) cube([20, 10, 2], center=true); translate([5, 0, 0]) cube([10, 20, 2], center=true); } translate([-$h / 2, $w / 2, 0]) difference() { cylinder(h=1, r=$r, center=true, $fn=100); cylinder(h=2, r=$r - 1, center=true, $fn=100); translate([0, -5, 0]) cube([20, 10, 2], center=true); translate([5, 0, 0]) cube([10, 20, 2], center=true); } translate([$h / 2, -$w / 2, 0]) difference() { cylinder(h=1, r=$r, center=true, $fn=100); cylinder(h=2, r=$r - 1, center=true, $fn=100); translate([0, 5, 0]) cube([20, 10, 2], center=true); translate([-5, 0, 0]) cube([10, 20, 2], center=true); } translate([$h / 2, $w / 2, 0]) difference() { cylinder(h=1, r=$r, center=true, $fn=100); cylinder(h=2, r=$r - 1, center=true, $fn=100); translate([0, -5, 0]) cube([20, 10, 2], center=true); translate([-5, 0, 0]) cube([10, 20, 2], center=true); } translate([$h / 2 + $r - .5, 0, 0]) cube([1, $w + .02, 1], center=true); translate([-($h / 2 + $r - .5), 0, 0]) cube([1, $w + .02, 1], center=true); translate([0, $w / 2 + $r - .5, 0]) cube([$h + .02, 1, 1], center=true); translate([0, -($w / 2 + $r - .5), 0]) cube([$h + .02, 1, 1], center=true); } } module hdd() { // vertical translate([37, $boxl / 2 + ($boxl - 53 - $w) / 2, $feeth + 7]) cube([$w, 53, 13], center=true); difference() { // horizontal translate([$boxw / 2 - 12.5 - $w / 2, $boxl / 2 + ($boxl - 53 - $w) / 2, $feeth + 13]) cube([25, 53, $w], center=true); // screw hole translate([61.72 / 2, $boxl - $w - 10, $feeth + 13.7]) cylinder(h=10, r=1.85, center=true, $fn=20); } // vertical translate([-37, $boxl / 2 + ($boxl - 53 - $w) / 2, $feeth + 7]) cube([$w, 53, 13], center=true); difference() { // horizontal translate([-($boxw / 2 - 12.5 - $w / 2), $boxl / 2 + ($boxl - 53 - $w) / 2, $feeth + 13]) cube([25, 53, $w], center=true); // screw hole translate([-61.72 / 2, $boxl - $w - 10, $feeth + 13.7]) cylinder(h=10, r=1.85, center=true, $fn=20); } } module box() { union() { walls(); rails(); feet(); } } module walls() { difference() { union() { // front wall translate([0, $boxl - $wf / 2, $feeth + $boxh / 2]) cube([$boxw, $wf, $boxh], center=true); // left wall translate([($boxw - $w) / 2, $boxl / 2, $feeth + $boxh / 2]) cube([$w, $boxl, $boxh], center=true); // right wall translate([-($boxw - $w) / 2, $boxl / 2, $feeth + $boxh / 2]) cube([$w, $boxl, $boxh], center=true); } // corners cuts translate([($boxw - $w) / 2 + 5, $boxl / 2, $feeth + $boxh + 0.6]) rotate([0,45,0]) cube([20, $boxl + 10, 15],center=true); translate([-(($boxw - $w) / 2 + 5), $boxl / 2, $feeth + $boxh + 0.6]) rotate([0,-45,0]) cube([20, $boxl + 10, 15],center=true); translate([0, 12, $feeth + $boxh - 15]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=2.5, center=true, $fn=20); translate([0, 24, $feeth + $boxh - 15]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=2.5, center=true, $fn=20); translate([0, 36, $feeth + $boxh - 15]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=2.5, center=true, $fn=20); translate([0, 48, $feeth + $boxh - 15]) rotate([0, 90, 0]) cylinder(h=$boxw + 10, r=2.5, center=true, $fn=20); } // bottom wall difference() { translate([0, $boxl / 2, $feeth + $w / 2]) cube([$boxw, $boxl, $w], center=true); // bottom cuts translate([0, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([10, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([-10, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([20, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([-20, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([30, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([-30, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([40, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); translate([-40, $boxl / 2, $feeth + $w / 2]) cube([3, 40, $w * 2], center=true); } } module rails() { translate([($boxw / 2 - $w) - ($hrailw - $w / 2) / 2, $boxl / 2, $feeth + $boxh-6.7]) cube([$hrailw + $w / 2, $boxl - $w, $hrailh], center=true); translate([-(($boxw / 2 - $w) - ($hrailw - $w / 2) / 2), $boxl / 2, $feeth + $boxh-6.7]) cube([$hrailw + $w / 2, $boxl - $w, $hrailh], center=true); } module feet() { $f = $feeth + $w / 2; difference() { translate([($boxw - $f * 2) / 2, $boxl - $w / 2, $f / 2]) cube([$f * 2, $w, $f], center=true); translate([($boxw - $f) / 2 - 1.5 * $f, $boxl - $w / 2, 0]) rotate([0, 45, 0]) cube([$f * 2, $w * 2, $f * 2], center=true); } difference() { translate([-($boxw - $f * 2) / 2, $boxl - $w / 2, $f / 2]) cube([$f * 2, $w, $f], center=true); translate([-($boxw - $f) / 2 + 1.5 * $f, $boxl - $w / 2, 0]) rotate([0, 45, 0]) cube([$f * 2, $w * 2, $f * 2], center=true); } difference() { translate([-($boxw - $w) / 2, $boxl - $f, $f / 2]) cube([$w, $f * 2, $f], center=true); translate([-($boxw - $w) / 2, $boxl - $f / 2 - 1.5 * $f, 0]) rotate([45, 0, 0]) cube([$w * 2, $f * 2, $f * 2], center=true); } difference() { translate([($boxw - $w) / 2, $boxl - $f, $f / 2]) cube([$w, $f * 2, $f], center=true); translate([($boxw - $w) / 2, $boxl - $f / 2 - 1.5 * $f, 0]) rotate([45, 0, 0]) cube([$w * 2, $f * 2, $f * 2], center=true); } }