From 3d7d3944372cf2e6617ed7f786090f2c84211d30 Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 26 Dec 2017 17:41:52 +0100 Subject: [PATCH] box: 3D printable bottom side protection --- box/upbox-ulx3s.scad | 443 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 443 insertions(+) create mode 100644 box/upbox-ulx3s.scad diff --git a/box/upbox-ulx3s.scad b/box/upbox-ulx3s.scad new file mode 100644 index 0000000..8f2b735 --- /dev/null +++ b/box/upbox-ulx3s.scad @@ -0,0 +1,443 @@ + +/*////////////////////////////////////////////////////////////////// + - 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); +} +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); + } + } +} +