You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							453 lines
						
					
					
						
							16 KiB
						
					
					
				
			
		
		
	
	
							453 lines
						
					
					
						
							16 KiB
						
					
					
				| 
 | |
| /*//////////////////////////////////////////////////////////////////
 | |
|               -    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);
 | |
|                 }
 | |
|         }
 | |
| }
 | |
| 
 |