parent
ac56267252
commit
3d7d394437
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in new issue