diff --git a/README.md b/README.md index 9f6826b..becf74d 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,8 @@ Also, Python codes are provided for the calibration of the Spherical Microphone # opensCAD designs The designs are in the `cad` folder: -- `sma_open.scad` for open SMA configuration with cylindrical shaped microphones, -- `sma_rigid.scad` for rigid SMA configuration with cylindrical shaped microphones, -- `sma_rigid_mchstreamer.scad` for rigid SMA configuration with digital MEMS microphone and embedded USB sound card. +- `sma_open.scad` for open SMA configuration, +- `sma_rigid.scad` for rigid SMA configuration, Examples of SMA configurations are provide in `.json` files. See the documentation in `.scad` files to create or customize a SMA design. diff --git a/cad/sma_rigid.scad b/cad/sma_rigid.scad index 1dc19ba..3984e38 100644 --- a/cad/sma_rigid.scad +++ b/cad/sma_rigid.scad @@ -1,10 +1,8 @@ /* - * Rigid SMA design for cylindrical microphone capsules + * Rigid SMA design * Copyright 2023 Pierre Lecomte - sekisushai@gmail.com */ -include - /* The rigid SMA is composed of two hemispherical shells to render separately for 3D printing. */ @@ -19,7 +17,7 @@ res = 32; /*[ Array parameters ]*/ // sphere radius (mm): -r = 60; +r = 80; // shell thickness (mm): e = 6; @@ -30,6 +28,12 @@ theta = [0, 90, 90, 90, 90, 180, 54.7356, 54.7356, 54.7356, 54.7356, 125.264, 12 // microphone azimuth coordinates (°): phi = [0, 0, 90, 180, 270, 0, 45, 135, 225, 315, 45, 135, 225, 315]; +// microphone type +mic_type = "1/4"; // [1/4:Quarter_Inch, PDM:PDM MEMS] + +// include USB sound card (only for digital MEMS mics) +usb_card = true; + /* the microphone array can be rotated to be in accordance with the array cut and mic stand position */ // microphones global rotation (°): @@ -69,6 +73,7 @@ The mic stand threaded hole should be close to the passing cable hole. It's dire dir_thread = [13, 0]; // DO NOT EDIT BELOW HERE +include // Hollow sphere module hollow(r1=r-e, r2=r, fn1=$fn, fn2=$fn){ @@ -78,8 +83,7 @@ module hollow(r1=r-e, r2=r, fn1=$fn, fn2=$fn){ } } -// Torus for "joint torique" for B&K 1/4" mics - +// Torus for O-ring for 1/4" mics module b_k(){ mirror([0,0,-1]) rotate_extrude($fn=32){ @@ -91,12 +95,69 @@ square([3.55, 1.1*e]); } } -module mics(){ +// Adafruit PDM MEMS breakout. +// https://www.adafruit.com/product/3492 +module pdm_breakout(l=14-5, w=13-5){ +$fn=64; + +translate([-l/2,-w/2,-5]){ + +// big condo +linear_extrude(7){ +translate([l/2+4.5,w/2,0]) +square([3,4],center=true); +} + +// small condo +linear_extrude(5.75){ +translate([l/2+2.75,w/2,0]) +square([3,4],center=true); +} + +// tiny resistor +linear_extrude(5.5){ +translate([l/2-2.9,w/2+1,0]) +square([3,2],center=true); +} + +// mic +linear_extrude(6){ +translate([l/2,w/2-0.5,0]) +square([3.5,4.5],center=true); +} +linear_extrude(50){ +translate([l/2,w/2,0]) +circle(d=2); +} + + +// wires +translate([0,0,5]) +linear_extrude(2){ +translate([l/2,w,0]) +square([l+4,2.5],center=true); +} + +linear_extrude(5){ +difference(){ +minkowski(){ +square([l,w]); +circle(2.6); +} +} +} +} +} + +module mics(type){ rotate(mics_rotate) for (i = [0 : len(theta)-1]){ rotate([theta[i], 0, phi[i]]) translate([0, 0, r-e+1]){ + if (type=="1/4") b_k(); + else + pdm_breakout(); translate([3,3,e-1.8]) linear_extrude(3) text(str(i+1), size=3); @@ -104,6 +165,45 @@ for (i = [0 : len(theta)-1]){ } } +module mchstreamer(){ + $fn=64; + adj = 0.2; // adjustment + // usb_cart dimensions + w_usb = 40+adj; + l_usb = 60+adj; + h_usb = 15+adj; + attach_l = 20; + attach_w = 7.3 + adj; + attach_h = 8.2+adj; + rotate([0,-90,90]) + translate([r-l_usb-attach_l/2,-w_usb/2,-h_usb/2]) + union(){ + cube(size = [l_usb, w_usb, h_usb], center = false); + plug_l = 20; + plug_w = 12+adj; + plug_h = 10.7+adj; + translate([l_usb - plug_l/2, w_usb/2 - plug_w/2, 1.8+adj]) + cube(size = [1.5*plug_l, plug_w, plug_h], center =false); + translate([l_usb - attach_l + 2, 1, 2.4+adj]) + attach(); + translate([l_usb - attach_l + 2, w_usb - attach_h -1, 2.4+adj]) + attach(); + translate([w_usb + 2, 0, 0]) + cube(size=[attach_l, w_usb, 2.7]); + + } + module attach(){ + + rotate([0, 90, 0]){ + translate([-attach_w/2, attach_h/2, attach_l/2]){ +union(){ + cube(size=[attach_w, attach_h, attach_l], center = true); + cylinder(r=1.5, h=2*attach_l ); + } + }} +} +} + module bottom_shell(r1= r-e, r2=r-e/2, r3=r, delta=0.2) { union(){ difference(){ @@ -155,8 +255,12 @@ cylinder(d=param[1]+0.2, h=param[0]+1, $fn=6); } module attach() { -rotate([(angle_min+angle_max)/2,0,hole_phi_offset]) +rotate([(angle_min+angle_max)/2,0,hole_phi_offset]){ +if (usb_card==false) cylinder(d=d_hole, h=100); +else +mchstreamer(); + } rotate([(angle_min+angle_max)/2 + dir_thread[0],0, hole_phi_offset + dir_thread[1]]) translate([0,0,(r-3*e)]) render() @@ -181,7 +285,7 @@ difference(){ bottom_shell(); attach(); vis_all(); -mics(); +mics(mic_type); } } @@ -189,7 +293,7 @@ module top_shell_all(){ difference(){ top_shell(); attach(); -mics(); +mics(mic_type); vis_all(); } }