/*////////////////////////////////////////////////////////////////// - FB Aka Heartman/Hearty 2016 - - http://heartygfx.blogspot.com - - OpenScad Parametric Box - - CC BY-NC 3.0 License - //////////////////////////////////////////////////////////////////// 12/02/2016 - Fixed minor bug 28/02/2016 - Added holes ventilation option 09/03/2016 - Added PCB feet support, fixed the shell artefact on export mode. */////////////////////////// - Info - ////////////////////////////// // All coordinates are starting as integrated circuit pins. // From the top view : // CoordD <--- CoordC // ^ // ^ // ^ // CoordA ---> CoordB //////////////////////////////////////////////////////////////////// ////////// - Paramètres de la boite - Box parameters - ///////////// /* [PCB_Feet--TheBoard_Will_NotBeExported) ] */ //All dimensions are from the center foot axis // - Coin bas gauche - Low left corner X position PCBPosX = 0; // - Coin bas gauche - Low left corner Y position PCBPosY = 0; // - Longueur PCB - PCB Length PCBLength = 30*2.54; // - Largeur PCB - PCB Width PCBWidth = 17*2.54; // - Heuteur pied - Feet height FootHeight = 7; // - Diamètre pied - Foot diameter FootDia = 6; // - Diamètre trou - Hole diameter FootHole = 1.8; // - 3-foot mode, one foot width-asymmetric, 0 for normal 4-foot mode Foot3Width = 0*2.54; // those clearances should be larger than // the PCB edge to hole centers distances FootClrX = 6; // foot center to panel clearance FootClrY = 6; // foot center to shell wall clearance // - Epaisseur - Wall thickness Thick = 2;//[2:5] /* [Box dimensions] */ // - Longueur - Length Length = PCBLength+2*(2*Thick+FootClrX); // - Largeur - Width Width = PCBWidth+2*(Thick+FootClrY); // - Hauteur - Height Height = 13; /* [Box options] */ // Pieds PCB - PCB feet (x4) PCBFeet = 1;// [0:No, 1:Yes] // - Decorations to ventilation holes Vent = 0;// [0:No, 1:Yes] // - Decoration-Holes width (in mm) Vent_width = 1.5; // - Text you want txt = "12*"; // - Font size TxtSize = 5; // - Font Police ="Arial Black"; // - Diamètre Coin arrondi - Filet diameter Filet = 2;//[0.1:12] // - lissage de l'arrondi - Filet smoothness Resolution = 20;//[1:100] // - Tolérance - Tolerance (Panel/rails gap) m = 1.5; // mounting legs clearance MountClearance = 0.1; // clearance between Top and Bottom shell ShellClearance = 0.1; // mounting hole diameters MountOuterHole = 2.5; MountInnerHole = 1.8; /* [STL element to export] */ //Coque haut - Top shell TShell = 0;// [0:No, 1:Yes] //Coque bas- Bottom shell BShell = 1;// [0:No, 1:Yes] //Panneau arrière - Back panel BPanel = 0;// [0:No, 1:Yes] //Panneau avant - Front panel FPanel = 0;// [0:No, 1:Yes] //Texte façade - Front text Text = 1;// [0:No, 1:Yes] /* [Hidden] */ // - Couleur coque - Shell color Couleur1 = "Orange"; // - Couleur panneaux - Panels color Couleur2 = "OrangeRed"; // Thick X 2 - making decorations thicker if it is a vent to make sure they go through shell Dec_Thick = Vent ? Thick*2 : Thick; // - Depth decoration Dec_size = Vent ? Thick*2 : 0.8; //////////////////// Oversize PCB limitation -Actually disabled - //////////////////// //PCBL= PCBLength+PCBPosX>Length-(Thick*2+7) ? Length-(Thick*3+20+PCBPosX) : PCBLength; //PCBW= PCBWidth+PCBPosY>Width-(Thick*2+10) ? Width-(Thick*2+12+PCBPosY) : PCBWidth; PCBL=PCBLength; PCBW=PCBWidth; //echo (" PCBWidth = ",PCBW); /////////// - Boitier générique bord arrondis - Generic Fileted box - ////////// module RoundBox($a=Length, $b=Width, $c=Height){// Cube bords arrondis $fn=Resolution; translate([0,Filet,Filet]){ minkowski (){ cube ([$a-(Length/2),$b-(2*Filet),$c-(2*Filet)], center = false); rotate([0,90,0]){ cylinder(r=Filet,h=Length/2, center = false); } } } }// End of RoundBox Module ////////////////////////////////// - Module Coque/Shell - ////////////////////////////////// module Coque(top=0){//Coque - Shell Thick = Thick*2; difference(){ difference(){//sides decoration union(){ difference() {//soustraction de la forme centrale - Substraction Fileted box difference(){//soustraction cube median - Median cube slicer union() {//union difference(){//Coque RoundBox(); translate([Thick/2,Thick/2,Thick/2]){ RoundBox($a=Length-Thick, $b=Width-Thick, $c=Height-Thick); } }//Fin diff Coque difference(){//largeur Rails translate([Thick+m,Thick/2,Thick/2]){// Rails RoundBox($a=Length-((2*Thick)+(2*m)), $b=Width-Thick, $c=Height-(Thick*2)); }//fin Rails translate([((Thick+m/2)*1.55),Thick/2,Thick/2+0.1]){ // +0.1 added to avoid the artefact RoundBox($a=Length-((Thick*3)+2*m), $b=Width-Thick, $c=Height-Thick); } }//Fin largeur Rails }//Fin union translate([-Thick,-Thick,Height/2]){// Cube à soustraire cube ([Length+100, Width+100, Height], center=false); } }//fin soustraction cube median - End Median cube slicer translate([-Thick/2,Thick,Thick]){// Forme de soustraction centrale RoundBox($a=Length+Thick, $b=Width-Thick*2, $c=Height-Thick); } } if(top > 0.5) for(i = [0:1]) difference(){// Fixation box legs union(){ translate([i*(Length-6*Thick-10)+3*Thick+5,Thick,Height/2]){ rotate([90,0,0]){ $fn=6; cylinder(d=16,Thick/2); } } translate([i*(Length-6*Thick-10)+3*Thick+5,Width-Thick,Height/2]){ rotate([-90,0,0]){ $fn=6; cylinder(d=16,Thick/2); } } } // angular cut 45 deg translate([4,Thick+Filet,Height/2-57]){ rotate([45,0,0]){ cube([Length,40,40]); } } // angular cut 45 deg translate([4,Width-(Thick+Filet),Height/2-57]){ rotate([45,0,0]){ cube([Length,40,40]); } } // clearance cut translate([0,-(Thick*1.5-MountClearance),Height/2]){ cube([Length,Thick*2,10]); } // clearance cut translate([0,Width-Thick*2+(Thick*1.5-MountClearance),Height/2]){ rotate([0,0,0]) cube([Length,Thick*2,10]); } } //Fin fixation box legs } union(){// outbox sides decorations //if(Thick==1){Thick=2; for(i=[0:Thick:Length/4]){ // Ventilation holes part code submitted by Ettie - Thanks ;) translate([10+i,-Dec_Thick+Dec_size,1]){ cube([Vent_width,Dec_Thick,Height/4]); } translate([(Length-10) - i,-Dec_Thick+Dec_size,1]){ cube([Vent_width,Dec_Thick,Height/4]); } translate([(Length-10) - i,Width-Dec_size,1]){ cube([Vent_width,Dec_Thick,Height/4]); } translate([10+i,Width-Dec_size,1]){ cube([Vent_width,Dec_Thick,Height/4]); } }// fin de for // } }//fin union decoration }//fin difference decoration if(top < 0.5) for(i = [0:1]) union(){ //sides inner holes $fn=20; translate([i*(Length - 6*Thick-10) + 3*Thick+5,20,Height/2+4]){ rotate([90,0,0]){ cylinder(d=MountInnerHole,20); } } translate([i*(Length - 6*Thick-10) + 3*Thick+5,Width-20,Height/2+4]){ rotate([-90,0,0]){ cylinder(d=MountInnerHole,20); } } } if(top > 0.5) for(i = [0:1]) union() // sides outer holes { $fn=20; translate([i*(Length - 6*Thick-10) + 3*Thick+5,5,Height/2-4+ShellClearance]){ rotate([90,0,0]){ cylinder(d=MountOuterHole,20); } } translate([i*(Length - 6*Thick-10) + 3*Thick+5,Width+5,Height/2-4+ShellClearance]){ rotate([90,0,0]){ cylinder(d=MountOuterHole,20); } } }//fin de sides holes }//fin de difference holes }// fin coque ////////////////////////////// - Experiment - /////////////////////////////////////////// ///////////////////////////////// - Module Front/Back Panels - ////////////////////////// module Panels(){//Panels color(Couleur2){ translate([Thick+m,m/2,m/2]){ difference(){ translate([0,Thick,Thick]){ RoundBox(Length,Width-((Thick*2)+m),Height-((Thick*2)+m));} translate([Thick,-5,0]){ cube([Length,Width+10,Height]);} } } } } /////////////////////// - Foot with base filet - ///////////////////////////// module foot(FootDia,FootHole,FootHeight){ Filet=2; color("Orange") translate([0,0,Filet-1.5]) difference(){ difference(){ //translate ([0,0,-Thick]){ union() { cylinder(d=FootDia+Filet,FootHeight-Thick, $fn=100); // add centering cylinder for 3.2 mm hole translate([0,0,FootHeight-Thick-0.01]) cylinder(d=3,h=1.5,$fn=32); } //} rotate_extrude($fn=100){ translate([(FootDia+Filet*2)/2,Filet,0]){ minkowski(){ square(10); circle(Filet, $fn=100); } } } } cylinder(d=FootHole,FootHeight+1, $fn=100); } }// Fin module foot module Feet(){ //////////////////// - PCB only visible in the preview mode - ///////////////////// translate([2*Thick+2,Thick+5,FootHeight+(Thick/2)-0.5]){ %square ([PCBL+10,PCBW+10]); translate([PCBL/2,PCBW/2,0.5]){ color("Olive") %text("PCB", halign="center", valign="center", font="Arial black"); } } // Fin PCB ////////////////////////////// - 4 Feet - ////////////////////////////////////////// translate([2*Thick+FootClrX,Thick+FootClrY,Thick/2]){ foot(FootDia,FootHole,FootHeight); } translate([2*Thick+FootClrX,(Thick)+PCBW+FootClrY,Thick/2]){ foot(FootDia,FootHole,FootHeight); } if(Foot3Width < 0.001) { // 4-foot mode translate([(2*Thick)+PCBL+FootClrX,(Thick)+PCBW+FootClrY,Thick/2]){ foot(FootDia,FootHole,FootHeight); } translate([(2*Thick)+PCBL+FootClrX,Thick+FootClrY,Thick/2]){ foot(FootDia,FootHole,FootHeight); } } else { // 3-foot mode translate([(2*Thick)+PCBL+FootClrX,(Thick)+Foot3Width+FootClrY,Thick/2]){ foot(FootDia,FootHole,FootHeight); } } } // Fin du module Feet ///////////////////////////////////// - Main - /////////////////////////////////////// if(BPanel==1) //Back Panel translate ([-m/2,0,0]){ difference() { Panels(); // cut off opening for micro USB connector translate([Thick*1.5+m,Width/2,21]) cube([Thick*2,11,6],center=true); } } if(FPanel==1) { //Front Panel rotate([0,0,180]){ translate([-Length-m/2,-Width,0]){ difference() { Panels(); // cut off opening for USB connector translate([Thick*1.5+m,Width/2,10]) cube([Thick*2,15,7],center=true); } } } if(Text==1) // Front text color(Couleur1){ translate([Length-(Thick),Width/2+Thick*0,(Height-(Thick*3+(TxtSize/2)))]){// x,y,z rotate([90,0,90]){ linear_extrude(height = 1.0){ text(txt, font = Police, size = TxtSize, valign ="center", halign ="center"); } } } } } if(BShell==1) // Coque bas - Bottom shell color(Couleur1){ difference() { Coque(top=0); // cut off for WiFi translate([24,0,6]) cube([21,10,3],center=true); // cut off for HDMI translate([52,60,8]) cube([22,10,6],center=true); // cut off for AUDIO translate([31.5,60,10]) rotate([90,0,0]) cylinder(d=13,h=10,$fn=32,center=true); // cut off for USB1 translate([19.0,60,8]) cube([12,10,6],center=true); // cut off for USB2 translate([77.30,60,8]) cube([12,10,6],center=true); } if (PCBFeet==1) // Feet translate([PCBPosX,PCBPosY,0]) difference() { Feet(); } } if(TShell==1) // Coque haut - Top Shell color( Couleur1,1){ translate([Length,0,Height+ShellClearance]){ rotate([0,180,0]){ Coque(top=1); } } }