$fn = 20; e = 0.01; s = [6, 16+5, 5]; t = 2; os = [90, t, 7]; module mount() { w = 1; m = 2.5; module holes() { for (y=[m:m*2:s[1]-m]) { translate([s[0]/2, y, -e]) cylinder(d=m+0.2, s[0]); } } difference() { cube(s); // translate([w, -e, -e]) cube([s[0]-w*2, s[1]-w, w]); translate([w, -e, s[2]-w+e]) cube([s[0]-w*2, s[1]-w, w]); holes(); } } module bar() { m = 3; t = 2; i = 20; translate([0, s[1], 0]) { difference() { cube(os); for (x = [os[2]-m, os[0]/2, os[0]-os[2]+m]) { translate([x, -e, os[2]/2]) rotate(-90, [1, 0, 0]) cylinder(d=m, t*2); } } } } module assembly(mw) { inset = (os[0]-mw-s[0])/2; translate([inset, 0, 0]) { mount(); translate([mw, 0, 0 ]) mount(); } bar(); } module front() { assembly(51); } module back() { assembly(40); } module cam() { tol = 0.5; lens = 7; s = [59.5+tol, 41+tol, 24.5+lens]; t = 1.5; r = 2; extra = 20; module outer() { hull() { translate([0, 0, s[2]/2-t]) cube([r*2, r*2, s[2]], center=true); translate([s[0], 0, s[2]/2-t]) cube([r*2, r*2, s[2]], center=true); translate([s[0], s[1], -t]) cylinder(r=r, h=s[2]); translate([0, s[1], -t]) cylinder(r=r, h=s[2]); } } module okbut() { x = 6; h = 12; d = 14; translate([x+d/2, s[1]-e, h]) { rotate(-90, [1, 0, 0]) cylinder(d=d, extra); translate([-d/2, 0, 0]) cube([d, d, extra]); } } module bands() { d = 3; for (y = [s[1]/3, s[1]/3*2]) { translate([-10, y, s[2]-lens]) { rotate(90, [0, 1, 0]) cylinder(d=d, s[0]*2); translate([0, -d/2, 0]) cube([s[0]*2, d, extra]); } } } module screen() { u = [31, 24, extra]; translate([s[0]/2, 11+u[1]/2, 0]) cube(u+[t*2, t*2, 0], center=true); } module leds() { u = [2, 12, extra]; translate([s[0]-t-2, 5, -t*2]) cube(u); } difference() { outer(); cube(s+[0, 0, extra]); okbut(); bands(); screen(); leds(); } mw = 51; // translate([0, 0, s[2]/2-5]) rotate(-5, [1, 0, 0]) { translate([1, -22, 0]) { mount(); translate([mw, 0, 0]) mount(); } } } module cage() { mw = 40; h = 30; r = 10; os = [os[0], os[1], s[2]]; mount(); module outer() { hull() { translate([h, h-r, 0]) cylinder(r=r, os[2]); translate([os[0]-h, h-r, 0]) cylinder(r=r, os[2]); cube(os); } } module holes() { r = h/2-t*2; r2 = r*6/10; extra = 10; translate([os[0]/2, r+t*2, -e]) cylinder(r=r, extra); translate([os[0]/2-r*2, r2+t*2, -e]) cylinder(r=r2, extra); translate([os[0]/2+r*2, r2+t*2, -e]) cylinder(r=r2, extra); } translate([mw, 0, 0]) mount(); translate([-os[0]/2+mw/2+s[0]/2, s[1], 0]) difference() { outer(); holes(); } } cam(); //cage(); //back(); //front();