1include <BOSL/constants.scad>
  2include <asanoha.scad>
  3use <BOSL/masks.scad>
  4
  5// Start config
  6// Pi Board
  7pi_board_size = [51,21]; //mm
  8pi_board_screw_holes_center_from_board_edge_distance = [3.7/2/*3.7 is the difference between screen and pi pcb height 21-24.7 */+4.8,2]; //mm
  9pi_board_screw_holes_diameter = 2.1; //mm
 10pi_board_padding = 1; //mm
 11
 12// Screen
 13screen_pcb_size = [24.7,27,13.3]; //mm (+- 0.2) 13.3mm are pin headers.
 14screen_pcb_screw_holes_center_from_board_edge_distance = 2.1; //mm
 15screen_pcb_screw_holes_diameter=2.8; //mm
 16screen_pcb_screw_holes_spacing=[20.5,23]; //mm
 17active_screen_area = [24.7,16.9,3.5]; //mm (old: 13.86)
 18active_screen_area_offset_from_corner = [0,5.08]; //mm
 19
 20// MEMS Package (HCLGA)
 21mems_microphone_package_size = [3,4,1.06]; //mm https://cdn-learn.adafruit.com/assets/assets/000/049/977/original/MP34DT01-M.pdf
 22mems_microphone_position_offset_from_corner = [11.5,pi_board_padding+screen_pcb_size.x/2-mems_microphone_package_size.y/2,0]; //mm
 23mems_border_size = 0.6; // mm
 24
 25// Asanoha pattern
 26asanoha_pattern_size = [40.7,20.35,1]; //mm 
 27asanoha_pattern_offset_from_corner = [(pi_board_padding+pi_board_screw_holes_diameter)*2,pi_board_padding+screen_pcb_size.x/2-asanoha_pattern_size.y/2,mems_microphone_position_offset_from_corner.z]; //mm
 28
 29
 30// Screws
 31m2_screw_nut_size = [5,5,1.6];
 32
 33// Misc
 34walls_thickness = 2; //mm
 35rounding_radius=1.5; //mm
 36
 37resolution = 80;
 38// End config
 39
 40// Modules
 41module sector(radius, angles, fn = resolution) {
 42    r = radius / cos(180 / fn);
 43    step = -360 / fn;
 44
 45    points = concat([[0, 0]],
 46        [for(a = [angles[0] : step : angles[1] - 360]) 
 47            [r * cos(a), r * sin(a)]
 48        ],
 49        [[r * cos(angles[1]), r * sin(angles[1])]]
 50    );
 51
 52    difference() {
 53        circle(radius, $fn = fn);
 54        polygon(points);
 55    }
 56}
 57
 58module arc(radius, angles, width = 1, fn = resolution) {
 59    difference() {
 60        sector(radius + width, angles, fn);
 61        sector(radius, angles, fn);
 62    }
 63}
 64
 65// Modeling
 66difference(){
 67// Body
 68cube(size=[pi_board_size.x+2*pi_board_padding,screen_pcb_size.x+2*pi_board_padding,walls_thickness]);
 69   // Fillet Edge
 70    fillet_mask_z(l=walls_thickness, r=rounding_radius, align=V_UP, $fn=resolution);
 71    
 72   translate([pi_board_size.x+2*pi_board_padding,screen_pcb_size.x+2*pi_board_padding,0])
 73    fillet_mask_z(l=walls_thickness, r=rounding_radius, align=V_UP, $fn=resolution);
 74    
 75   translate([pi_board_size.x+2*pi_board_padding,0,0]) fillet_mask_z(l=walls_thickness, r=rounding_radius, align=V_UP, $fn=resolution);
 76    
 77   translate([0,screen_pcb_size.x+2*pi_board_padding,0]) fillet_mask_z(l=walls_thickness, r=rounding_radius, align=V_UP, $fn=resolution);
 78    // MEMS Package (HCLGA)
 79    translate(mems_microphone_position_offset_from_corner) cube(size=[mems_microphone_package_size.x,mems_microphone_package_size.y,walls_thickness]);
 80    // Screws + Nuts
 81    translate([pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,0]) cylinder(walls_thickness,pi_board_screw_holes_diameter/2,pi_board_screw_holes_diameter/2,$fn=resolution);
 82    
 83    translate([pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,walls_thickness-m2_screw_nut_size.z]) cylinder(m2_screw_nut_size.z,m2_screw_nut_size.x/2,m2_screw_nut_size.x/2,$fn=6);
 84    
 85    translate([pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,screen_pcb_size.x-pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,0]) cylinder(walls_thickness,pi_board_screw_holes_diameter/2,pi_board_screw_holes_diameter/2,$fn=resolution);
 86    
 87    translate([pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,screen_pcb_size.x-pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,walls_thickness-m2_screw_nut_size.z]) cylinder(m2_screw_nut_size.z,m2_screw_nut_size.x/2,m2_screw_nut_size.x/2,$fn=6);
 88    
 89    translate([pi_board_size.x-pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,0]) cylinder(walls_thickness,pi_board_screw_holes_diameter/2,pi_board_screw_holes_diameter/2,$fn=resolution);
 90    
 91    translate([pi_board_size.x-pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,walls_thickness-m2_screw_nut_size.z]) cylinder(m2_screw_nut_size.z,m2_screw_nut_size.x/2,m2_screw_nut_size.x/2,$fn=6);
 92    
 93    translate([pi_board_size.x-pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,screen_pcb_size.x-pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,0]) cylinder(walls_thickness,pi_board_screw_holes_diameter/2,pi_board_screw_holes_diameter/2,$fn=resolution);
 94    
 95    translate([pi_board_size.x-pi_board_screw_holes_center_from_board_edge_distance.y+pi_board_padding,screen_pcb_size.x-pi_board_screw_holes_center_from_board_edge_distance.x+pi_board_padding,walls_thickness-m2_screw_nut_size.z]) cylinder(m2_screw_nut_size.z,m2_screw_nut_size.x/2,m2_screw_nut_size.x/2,$fn=6);
 96    
 97    translate(asanoha_pattern_offset_from_corner) cube(size=[asanoha_pattern_size.x,asanoha_pattern_size.y,walls_thickness]);
 98
 99}
100
101difference(){
102    union(){
103        // MEMS Package (HCLGA)
104    translate(asanoha_pattern_offset_from_corner) drawAsanoha();
105    translate([mems_microphone_position_offset_from_corner.x-
106mems_border_size,mems_microphone_position_offset_from_corner.y-
107mems_border_size,mems_microphone_position_offset_from_corner.z]) cube(size=[mems_microphone_package_size.x+mems_border_size*2,mems_microphone_package_size.y+mems_border_size*2,walls_thickness]);
108    }
109    // MEMS Package (HCLGA)
110    translate(mems_microphone_position_offset_from_corner) cube(size=[mems_microphone_package_size.x,mems_microphone_package_size.y,walls_thickness]);
111    
112    
113}