// Droid stand // General th = 3; // Part thickness fn = 64; // Facets cl = 0.01; // Clearance - just to prevent shared faces // Droid - rough dimensions dth = 11; // Droid, thickness dw = 70; // Droid, width dl = 131; // Droid, length // Speaker dimensions spth = dth+2; // Speaker thickness spw = 3; // Speaker width spl = 12; // Speaker length sr = 3; // Speaker radius scl = 16-sr; // Screen length offset // scw = 9-sr; // Screen width offset scw = 0; // Speaker Tube depth offset speakerTubeDepth = -13; // USB dimensions usbr = 13/2; // USB radius usbZoffset = 42; // USB Z offset // Stand standR = 18; // Stand, height standXScale = 1.19; // Stand, X scale standYScale = 1.5; // Stand, Y scale standZScale = 1.9; // Stand, Z scale standXOffset = 6; // Stand X offset standYOffset = 0; // Stand Y offset standTilt = 30; // Stand, tilt stand(); module stand(tilt=standTilt) { translate([-standXOffset,-standYOffset,0]) difference() { standAlone(tilt); translate([0,0,cl]) droid(tilt); } } module standAlone(tilt=20) { union() { // Overall, describe the stand translate([standXOffset,standYOffset,0]) difference() { scale([standXScale,standYScale,standZScale]) sphere(r=standR, $fn=fn); translate([0,0,-standR*2]) cube(standR*4, center=true); } rotate([0,tilt,0]) translate([0,0,10+spl/2]) { // Sound Tube! translate([0,7,0]) rotate([0,-90,0]) difference() { cylinder(r1=spl/2+sr+th, h=(standR*standXScale), r2=(spl/2+sr)+(standR*standXScale)/2+th, $fn=fn, center=false); translate([0,0,(standR*standXScale+th)*2+speakerTubeDepth]) cube((standR*standXScale+th)*2, center=true); } } } } module droid(tilt) { rotate([0,tilt,0]) { translate([-dth/2,-dl/2,dw/2]) { // Main Droid cube([dth, dl, dw], center=true); translate([-(dth+50)/2,0,0]) cube([dth+50, dl-scl*2, dw-scw*2], center=true); // Speaker - commented out because this was really just a guide * translate([0,dl/2-3/2-6.5,12/2-dw/2+10]) render() minkowski() { cube([spth,spw, spl], center=true); sphere(r=sr, center=true, $fn=fn); } } // Speaker Channel translate([0,0,10+spl/2]) { intersection() { // Spherical edging scale([1.0,1.0,0.8]) sphere(spl/2+sr+7); // Tubular channel difference() { // Circular Tube cylinder(r=spl/2+sr+7, h=(spl/2+sr)*2, center=true, $fn=fn); // Cutout of circular tube translate([-(spl/2+sr+7)-cl,-(spl/2+sr+7)-cl,cl]) cube((spl/2+sr+7)*2, center=true); } } // Sound Tube! translate([0,7,0]) rotate([0,-90,0]) cylinder(r1=spl/2+sr, h=standR*standXScale+cl, r2=(spl/2+sr)+(standR*standXScale)/2, $fn=fn); } // Charging Cable Space translate([-dth/2,-1,usbZoffset]) { rotate([-90,0,0]) cylinder(r=usbr, h=standR, center=false); } } }