Forráskód Böngészése

sphear windscreen improvements, switch to a thread based attachment of the windscreen to the microphone, many fixes, add render functions, modify em200 version to render the full microphone including the windscreen

Fernando Pablo Lopez-Lezcano 9 éve
szülő
commit
ccbb2e3b20
2 módosított fájl, 128 hozzáadás és 79 törlés
  1. 13 5
      TinySpHEAR_EM200.scad
  2. 115 74
      TinySpHEAR_mount_pcb.scad

+ 13 - 5
TinySpHEAR_EM200.scad

@@ -48,7 +48,7 @@ facets = 128;
 
 //// microphone body and array
 
-*render_tetra_capsule_array(0);
+*render_tetra_capsule_array(139.5);
 
 *render_tetra_capsule_flare(0);
 
@@ -56,17 +56,25 @@ facets = 128;
 
 *render_tetra_connector_flare(0);
 
-*render_tetra_connector_lock(0);
-
 *render_tetra_cable_flare(0);
 
 // the whole body
-*render_tetra_body(0, 10, 0);
+*render_tetra_body(0, 0, 0);
 
 // the whole microphone
 // or use render_tetra_microphone_cutout(0, 0) for a "transparent" view
 //
-*render_tetra_microphone_cutout(0, 0, 0);
+*render_tetra_microphone(0, 0, 0);
+
+//// windscreen
+
+*translate([0, 0, tetra_pcb_mount_height - windscreen_thread_height]) {
+    render_tetra_windscreen_bottom(windscreen_thread_height);
+    render_tetra_windscreen_mount(0);
+    render_tetra_windscreen_top(windscreen_height * 2 + windscreen_thread_height + 5);
+    // sleeves that connect the top and bottom frames
+    render_tetra_windscreen_connectors(windscreen_height + windscreen_thread_height);
+}
 
 //// microphone shock mount
 

+ 115 - 74
TinySpHEAR_mount_pcb.scad

@@ -28,6 +28,10 @@ include <SpHEAR_common.scad>;
 include <TinySpHEAR_common.scad>;
 include <CCRMA_logo.scad>;
 
+// http://dkprojects.net/openscad-threads/
+// used for the windscreeen mount threads
+include <threads.scad>;
+
 ////
 //// default model parameters
 ////
@@ -106,6 +110,9 @@ box_radius = pcb_front + (pcb_thickness + pcb_tfit) + pcb_back + 2 * wall;
 // calculated main body corner radius
 mount_corner = box_radius - pcb_width / 2 + pcb_slot_depth + 4.0;
 
+// calculated radius at the corners
+box_corner_radius = (box_radius + wall - mount_corner) / sin(45) + mount_corner;
+
 //// snap joints to join the body to the two flares
 //
 // render snap joints to join all three main assemblies
@@ -169,6 +176,16 @@ ring_ext_height = 6;
 // gap between external ring and support arm
 ring_arm_gap = 20;
 
+// windscreen parameters
+//
+
+windscreen_height = 60;
+windscreen_w = 4.0;
+beam_radius = 1.4;
+windscreen_thread_height = 10.0;
+windscreen_thread_pitch = 1.5;
+windscreen_thread_radius = box_corner_radius + windscreen_thread_pitch * 0.866;
+
 
 // all four printed circuit boards
 
@@ -296,11 +313,22 @@ module tetra_mount_body(height, radius, corner, lower_lip, upper_lip, clear) {
 
 // flares from the body to the microphone stalk and cable
 
-module tetra_mount_flare(height, lip, transition, bot_radius, bot_corner, top_radius) {
+module tetra_mount_flare(height, lip, transition, bot_radius, bot_corner, top_radius, windscreen) {
     // bottom rounded box
     difference() {
         union() {
             rounded_block(height, bot_radius, bot_radius, bot_corner);
+            if (windscreen) {
+                translate([0, 0, lip]) {
+                    metric_thread(diameter = windscreen_thread_radius * 2, pitch = windscreen_thread_pitch,
+                        length = lip, internal = false);
+                }
+                cylinder(r2 = box_corner_radius + 1.5, r1 = box_radius + 0.5, h = windscreen_thread_height, $fn = facets);
+                // index for back of microphone
+                translate([-bot_radius, 0, 0]) {
+                    cylinder(r = 1.0, h = height, $fn = facets);
+                }
+            }
             if (render_screw_holes) {
                 // small supports for the screws that attach the flare to the body
                 // (number 0 size, 1/4" long = thread diameter: 1.6mm, head diameter: 2.75)
@@ -543,102 +571,80 @@ module tetra_capsule_array_mount(angles, mount_radius, mount_wall) {
     }
 }
 
-// windscreen
+// windscreen frame
 
-module tetra_wind_screen_quad(radius, corner, height, band_height, helix_radius, twist) {
-    // quad helix windscreen support
+module tetra_windscreen(radius, corner, height, beam_radius, twist, support) {
+    // hex helix windscreen frame
     translate([0, 0, 0]) {
-        for (r = [0, 90, -90, 180]) for (t = [1, -1]) rotate([0, 0, r]) {
+        for (r = [0, 60, 120, 180, 240, 300]) for (t = [1, -1]) rotate([0, 0, r]) {
             linear_extrude(height = height, center = false, convexity = 0, twist = twist * t, $fn = facets) {
-                translate([radius + helix_radius, 0, 0]) {
-                    circle(r = helix_radius, $fn = facets);
+                translate([radius + beam_radius, 0, 0]) {
+                    circle(r = beam_radius, $fn = facets);
                 }
             }
         }
     }
     // connectors to top
     translate([0, 0, height]) {
-        for (r = [0, 90, -90, 180]) rotate([0, 0, r + twist]) {
-            translate([radius + helix_radius, 0, 0]) {
-                cylinder(r = helix_radius * 2/3, h = 2.0, $fn = facets);
+        for (r = [0, 60, 120, 180, 240, 300]) rotate([0, 0, r + twist]) {
+            translate([radius + beam_radius, 0, 0]) {
+                // cylinder(r = beam_radius * 2/3, h = 2.0, $fn = facets);
+                cylinder(r = beam_radius * 1, h = 2.0, $fn = facets);
+                //
+                // suppport structure for standalone beams
+                // these are removed after printing
+                if (support) {
+                    for (s = [0, -129, 120]) rotate([0, 0, s]) {
+                        translate([0, -0.3, 0]) {
+                            cube([6, 0.6, 2]);
+                        }
+                    }
+                }
             }
         }
     }
 }
 
-module tetra_wind_screen(radius, corner, height, band_height, beam_radius, twist) {
-    // quad helix windscreen support
-    translate([0, 0, 0]) {
-        for (r = [0, 60, 120, 180, 240, 300]) for (t = [1, -1]) rotate([0, 0, r]) {
-            linear_extrude(height = height, center = false, convexity = 0, twist = twist * t, $fn = facets) {
+// windscreen frame dome
+
+module tetra_windscreen_dome(radius, beam_radius) {
+    for (r = [0, 60, 120]) rotate([0, 90, r + 30]) {
+        difference() {
+            rotate_extrude(convexity = 10, $fn = facets) {
                 translate([radius + beam_radius, 0, 0]) {
                     circle(r = beam_radius, $fn = facets);
                 }
             }
-        }
-    }
-    // connectors to top
-    translate([0, 0, height]) {
-        for (r = [0, 60, 120, 180, 240, 300]) rotate([0, 0, r + twist]) {
-            translate([radius + beam_radius, 0, 0]) {
-                cylinder(r = beam_radius * 2/3, h = 2.0, $fn = facets);
+            translate([0, -radius * 1.5, -1.4]) {
+                cube([radius * 3, radius * 3, beam_radius * 3]);
             }
         }
     }
 }
 
-module tetra_wind_screen_top(radius, beam_rad) {
-    // main ring
-    difference() {
-        cylinder(r = radius + beam_rad * 1.5, h = beam_rad * 1.5, $fn = facets);
-        cylinder(r = radius + beam_rad * 0.5, h = beam_rad * 1.5, $fn = facets);
-    }
-    // cross
-    for (r = [0, 90, 180, 270]) rotate([0, 0, r]) {
-        translate([0, -beam_rad/2, 0]) {
-            cube([radius + beam_rad, beam_rad, beam_rad * 1.5]);
-        }
-    }
-}
+// windscreen mount to body with thread
 
-module tetra_wind_screen_mount(radius, helix_radius, corner, beam_rad) {
-    difference() {
-        rounded_block_relative(band_height, radius, radius, corner, 2 * beam_rad);
-        rounded_block_relative(band_height, radius, radius, corner, 1.2); // (lip_fit + 0.5));
-        // indentation to trap nylon screen
-    }
-    // supports for double helix
-    for (r = [0, 60, 120, 180, 240, 300]) rotate([0, 0, r]) {
-        translate([0, helix_radius + beam_rad, 0]) {
-            difference() {
-                union() {
-                    cylinder(r = beam_rad, h = band_height, $fn = facets);
-                    // attach beam to sides (2)
-                    translate([-beam_rad/2, -beam_rad * 2, 0]) {
-                        cube([beam_rad, beam_rad * 2, band_height]);
-                    }
-                }
-                // cut bottom of attachment beams
-                translate([-3, -1.1, 0]) {
-                    rotate([-15, 0, 0]) {
-                        cube([10, 10, 10]);
-                    }
-                }
-            }
+module tetra_windscreen_mount(height, radius, beam_radius) {
+        difference() {
+            cylinder(r = radius + 2 * beam_radius, h = height, $fn = facets);
+            metric_thread(diameter = radius * 2 + fit, pitch = windscreen_thread_pitch, length = height, internal = true);
+        }
+        translate([-(radius + 2 * beam_radius), 0, 0]) {
+            cylinder(r = 1.0, h = height, $fn = facets);
         }
-    }
 }
 
 // small tube to connect both helical windscreen mounts
 
-module tetra_wind_screen_connector(beam_rad) {
+module tetra_windscreen_connector(beam_radius) {
     difference() {
-        cylinder(r = beam_rad * 1.2, h = 4, $fn = facets);
-        cylinder(r = beam_rad * 2/3 + fit, h = 5, $fn = facets);
+        cylinder(r = beam_radius + 0.8, h = 5, $fn = facets);
+        cylinder(r = beam_radius + 2 * fit, h = 5, $fn = facets);
     }
 }
 
 
+
 ////
 //// render all the different parts
 ////
@@ -649,7 +655,7 @@ module tetra_wind_screen_connector(beam_rad) {
 module render_tetra_capsule_flare(z_offset) {
     translate([0, 0, z_offset]) {
         tetra_mount_flare(pcb_hi_clear + pcb_hi_exp, 
-                    mount_lip, flare_height, box_radius + wall,  mount_corner, mount_radius + wall, stalk_height);
+                    mount_lip, flare_height, box_radius + wall,  mount_corner, mount_radius + wall, true);
         translate([0, 0, pcb_hi_clear + pcb_hi_exp + flare_height]) {
             tetra_mount_array_stalk(stalk_height, mount_radius + wall);
         }
@@ -666,14 +672,14 @@ tetra_pcb_mount_height = pcb_length - pcb_low_exp - pcb_hi_exp;
 module render_tetra_pcb_mount(z_offset, showint) {
     translate([0, 0, z_offset]) {
         tetra_mount_body(tetra_pcb_mount_height, box_radius + wall, mount_corner, mount_lip, mount_lip, showint);
-    }
-    // add ccrma logo
-    rotate([0, 0, -90]) {
-        translate([0, -(box_radius - 0.5), tetra_pcb_mount_height / 2]) {
-            rotate([90, 270, 0]) {
-                logo_scale = 1 / 2.4;
-                scale([logo_scale, logo_scale, 1.0]) {
-                    ccrma_logo(1.65);
+        // add ccrma logo
+        rotate([0, 0, -90]) {
+            translate([0, -(box_radius - 0.5), tetra_pcb_mount_height / 2]) {
+                rotate([90, 270, 0]) {
+                    logo_scale = 1 / 2.4;
+                    scale([logo_scale, logo_scale, 1.0]) {
+                        ccrma_logo(1.65);
+                    }
                 }
             }
         }
@@ -685,7 +691,7 @@ module render_tetra_pcb_mount(z_offset, showint) {
 
 module render_tetra_cable_flare(z_offset, flip) {
     translate([0, 0, z_offset]) {
-        tetra_mount_flare(pcb_low_clear + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, cable_diam / 2 + wall, 10);
+        tetra_mount_flare(pcb_low_clear + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, cable_diam / 2 + wall, false);
         translate([0, 0, pcb_low_clear + pcb_low_exp + 20]) {
             tetra_mount_cable_holder(10, cable_diam / 2 + wall);
         }
@@ -697,7 +703,7 @@ module render_tetra_cable_flare(z_offset, flip) {
 
 module render_tetra_connector_flare(z_offset, flip) {
     translate([0, 0, z_offset]) {
-        tetra_mount_flare(pcb_low_clear + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, conn_core_o_diam / 2, 10);
+        tetra_mount_flare(pcb_low_clear + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, conn_core_o_diam / 2, false);
         rotate([0, 0, -90]) translate([0, 0, pcb_low_clear + pcb_low_exp + 20]) {
             tetra_mount_connector_holder(conn_core_sleeve, conn_core_o_diam / 2, conn_core_diam / 2, conn_core_overlap, conn_core_s_diam / 2);
         }
@@ -742,6 +748,41 @@ module render_tetra_microphone_cutout(z_offset, spread) {
     }
 }
 
+// windscreen components
+
+module render_tetra_windscreen_top(z_offset) {
+    translate([0, 0, z_offset]) {
+        rotate([0, 0, 30]) scale([1, 1, 6/7]) {
+            tetra_windscreen_dome(box_corner_radius + beam_radius/2, beam_radius);
+        }
+        rotate([0, 180, 30]) {
+            tetra_windscreen(box_corner_radius + beam_radius/2, mount_corner, windscreen_height, beam_radius, 60);
+        }
+    }
+}
+
+module render_tetra_windscreen_bottom(z_offset) {
+    translate([0, 0, z_offset]) rotate([0, 0, 30]) {
+        tetra_windscreen(box_corner_radius + beam_radius/2, mount_corner, windscreen_height, beam_radius, 60);
+    }
+}
+
+module render_tetra_windscreen_mount(z_offset) {
+    translate([0, 0, z_offset]) {
+        tetra_windscreen_mount(windscreen_thread_height, windscreen_thread_radius, beam_radius);
+    }
+}
+
+module render_tetra_windscreen_connectors(z_offset) {
+    translate([0, 0, z_offset]) {
+        for (r = [0, 60, 120, 180, 240, 300]) rotate([0, 0, r + 30]) {
+            translate([box_corner_radius + beam_radius + beam_radius/2, 0, 0]) {
+                tetra_windscreen_connector(beam_radius);
+            }
+        }
+    }
+}
+
 // shock mount: microphone clip on stand mount
 //