Kaynağa Gözat

remove TinySpHEAR code (four capsule microphone) for old shock mount (internal ring, external ring and connecting rods), add ridges and channels to guide rubber bands in internal ring, connect internal ring columns with walls so they cannot bend, add parameters for new shock mount, redo rendering code for the different parts, update EM182 and EM200 versions of the microphone to render the new shock mount

Fernando Pablo Lopez-Lezcano 9 yıl önce
ebeveyn
işleme
9be86c043e
4 değiştirilmiş dosya ile 39 ekleme ve 196 silme
  1. 17 135
      SpHEAR_common.scad
  2. 2 6
      TinySpHEAR_EM182.scad
  3. 2 7
      TinySpHEAR_EM200.scad
  4. 18 48
      TinySpHEAR_mount_pcb.scad

+ 17 - 135
SpHEAR_common.scad

@@ -3,7 +3,7 @@
 //
 // Common Modules and Variables
 //
-// Copyright 2015-2016, Fernando Lopez-Lezcano, All Rights Reserved
+// Copyright 2015-2017, Fernando Lopez-Lezcano, All Rights Reserved
 // nando@ccrma.stanford.edu
 //
 //  This program is free software: you can redistribute it and/or modify
@@ -347,135 +347,6 @@ module shock_mount_ring(outside_radius, inside_radius, thickness) {
     }
 }
 
-// internal ring of shock mount
-
-module shock_mount_internal_ring(height, xradius, yradius, corner, gap, lip) {
-    slot_sep = xradius * 2 / 2.5;
-    slot_w = 5;
-    slot_o = height / 3;
-    difference() {
-        union() {
-            // base ring
-            difference() {
-                rounded_block_relative(slot_o, xradius + gap, yradius + gap, corner, 3 * wall);
-                rounded_block(slot_o, xradius + gap, yradius + gap, corner);
-            }
-            // upper ring with slots for rubber bands
-            difference() {
-                rounded_block_relative(height, xradius + gap + 2 * wall, yradius + gap + 2 * wall, corner, 2 * wall);
-                rounded_block_relative(height, xradius + gap + wall, yradius + gap + wall, corner, 1 * wall);
-                for (rot = [0, 90, 180, 270]) rotate([0, 0, rot]) {
-                    // slots for rubber bands
-                    minkr = 1.5;
-                    for (m = [0, 1]) mirror([0, m, 0]) {
-                        translate([-slot_w / 2 + slot_sep, ((rot % 180) ? xradius : yradius) + gap, slot_o + minkr]) {
-                            minkowski() {
-                                cube([slot_w - minkr, 10, slot_o - minkr]);
-                                rotate([90, 0, 0]) cylinder(r = minkr, h = 1, $fn = facets);
-                            }
-                        }
-                    }
-                    // cut holes in slots
-                    rotate([0, 0, -45]) {
-                        translate([-thin_mint, 0, slot_o]) {
-                            for (m = [0, 1]) mirror([0, m, 0]) {
-                                // this should be a pizza slice, not a cube
-                                cube([6.0, xradius + gap + 3 * wall + 5.0, height]);
-                            }
-                        }
-                    }
-                }
-            }
-            // body for bars that connect both rings together
-            for (rot = [0, 90, 180, 270]) rotate([0, 0, rot]) {
-                translate([((rot % 180) ? yradius : xradius) + gap + 3 * wall, -(connector_w/2 + wall), 0]) {
-                    cube([connector_d + wall, connector_w + 2 * wall, height]);
-                }
-                for (m = [0, 1]) mirror([0, m, 0]) {
-                    translate([((rot % 180) ? yradius : xradius) + gap + 4 * wall, -(connector_w/2 + wall), 0]) {
-                        cylinder(r = wall * 2, h = height, $fn = 3);
-                    }
-                }
-            }
-        }
-        // carve holes for bars that connect both rings
-        for (rot = [0, 90, 180, 270]) rotate([0, 0, rot]) {
-            translate([((rot % 180) ? yradius : xradius) + gap + 3 * wall, -connector_w/2, 0]) {
-                cube([connector_d, connector_w, height - 2.75 * wall]);
-                translate([connector_d / 2, 0, height - 3 * wall]) {
-                    rotate([-90, 0, 0]) {
-                        cylinder(r = connector_d / 2, h = connector_w, $fn = facets);
-                    }
-                }
-            }
-        }
-    }
-    for (rot = [0, 90, 180, 270]) rotate([0, 0, rot]) {
-        // lip to support microphone on lower ring only
-        if (lip == 1) {
-            lip_w = 10;
-            translate([((rot % 180) ? yradius : xradius) + gap + 2.5 * wall, -lip_w/2, height]) {
-                rotate([90, 90, 180]) {
-                    linear_extrude(height = lip_w) {
-                        polygon([[0, 0], [0, 4], [1, 4], [height * 2/3, 0]]);
-                    }
-                }
-            }
-        }
-    }    
-}
-
-// external ring of shock mount (connects to stand mount)
-
-module shock_mount_external_ring(height, xradius, yradius, corner, gap, lip) {
-    difference() {
-        rounded_block_relative(ring_ext_height, xradius, yradius, corner, gap);
-        rounded_block_relative(ring_ext_height, xradius, yradius, corner, gap - ring_wall);
-    }
-    for (rot = [0, 90, 180, 270]) {
-        rotate([0, 0, rot]) {
-            translate([((rot % 180) ? yradius : xradius) + gap + ring_wall, -7.5, 0]) {
-                cube([4, 15, ring_ext_height]);
-            }
-            translate([((rot % 180) ? yradius : xradius) + gap, -2, 0]) {
-                cube([7, 4, ring_ext_height]);
-            }
-        }
-    }
-    // connection to stand mount
-    intersection() {
-        translate([ring_arm_gap, 0, 0]) {
-            difference() {
-                rounded_block_relative(ring_ext_height, xradius, yradius, corner, gap);
-                rounded_block_relative(ring_ext_height, xradius, yradius, corner, gap - ring_wall);
-            }
-        }
-        translate([ring_arm_gap / 2, -(yradius + 2 * corner), 0]) {
-            cube([(xradius + 2 * corner) + ring_arm_gap, 2 * (yradius + 2 * corner), ring_ext_height]);
-        }
-    }
-    // connection to hub
-    translate([xradius + corner + ring_arm_gap, -2, 0]) {
-        cube([8, 4, ring_ext_height]);
-    }
-    // rotating mount
-    o_rad = 8;
-    i_rad = 3;
-    rotate([0, 90, -90]) {
-        translate([-o_rad, xradius + corner + ring_arm_gap + o_rad + ring_wall / 2 + 4, -2]) {
-            shock_mount_ring(o_rad, i_rad, ring_wall);
-        }
-    }
-}
-
-// connector that joins the two internal rings
-
-module shock_mount_connector(length, lip, width, thickness, fit) {
-    cube([length + 2 * lip , width - 2 * fit, thickness - 2 * fit]);
-    translate([lip, -(thickness / 2), 0])
-        cube([length , width + thickness, thickness * 3 / 2]);
-}
-
 // one eyelet for connection to shock mount or permanent mount
 
 module mount_stand_eyelet(outside_radius, inside_radius, thickness) {
@@ -613,12 +484,21 @@ module tetra_shock_mount_band(band_height, radius, corner, gap) {
 
 module tetra_shock_mount_internal_ring(height, radius, band_height, corner, gap) {
     difference() {
-        // four sided band
-        tetra_shock_mount_band(band_height, radius, corner, gap);
-        // slots so that the band clears the lower screws
+        // four sided ring
+        union() {
+            tetra_shock_mount_band(band_height, radius, corner, gap);
+            // ridge so that rubber bands stay in the shock mount
+            tetra_shock_mount_band(wall, radius, corner, gap + wall);
+        }
+        // slots inside body so that the ring clears the lower screws
         for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
             translate([radius + gap + 2.5, -2.0, 0]) cube([2.0, 4.0, band_height]);
         }
+        // channels in body for upper rubber band
+        for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
+            rotate([90, 0, 0]) translate([radius + 8.75, 2 * wall + 0.2, 0])
+                cylinder(r = 1.0, h = height, center = true, $fn = facets);
+        }
     }
     // 8 columns for mounting rubber bands
     for (r = [0, 90, 180, 270]) rotate([0, 0, r]) {
@@ -631,8 +511,11 @@ module tetra_shock_mount_internal_ring(height, radius, band_height, corner, gap)
                             translate([3, 0, 0]) rotate([0, 0, 45]) scale([1.2, 0.85, 1.0]) 
                                 cylinder(r = 3, h = height, $fn = facets);
                             // connect column to body
-                            translate([-2, -2, 0]) rotate([0, 0, 0])
+                            translate([-2, -2, 0])
                                 cube([4, 3, band_height]);
+                            // connect columns together so they cannot bend
+                            translate([2, -7, 0])
+                                cube([wall, 6, height]);
                         }
                         // lower slots for rubber bands
                         rotate([0, 0, 45]) translate([2.5, radius/2, 0]) scale([1.0, 1.0, 3.0]) rotate([90, 0, 0]) {
@@ -696,4 +579,3 @@ module tetra_shock_mount_external_ring(height, radius, corner, gap) {
     }
 }
 
-

+ 2 - 6
TinySpHEAR_EM182.scad

@@ -90,14 +90,10 @@ facets = 128;
 
 *render_tetra_shock_mount_external_ring(0);
 
-*render_tetra_shock_mount_internal_ring_bot(0);
-
-*render_tetra_shock_mount_internal_ring_top(0);
-
-*render_tetra_shock_mount_ring_connectors(5);
+*render_tetra_shock_mount_internal_ring(0);
 
 // the full mount
-*render_tetra_shock_mount(0);
+*render_tetra_shock_mount(12);
 
 // individual capsule holders
 

+ 2 - 7
TinySpHEAR_EM200.scad

@@ -85,16 +85,11 @@ facets = 128;
 
 *render_tetra_shock_mount_external_ring(0);
 
-*render_tetra_shock_mount_internal_ring_bot(0);
-
-*render_tetra_shock_mount_internal_ring_top(0);
-
-*render_tetra_shock_mount_ring_connectors(5);
+*render_tetra_shock_mount_internal_ring(0);
 
 // the full mount
-*render_tetra_shock_mount(-3);
+*render_tetra_shock_mount(12);
 
 // individual capsule holders
 
 *render_tetra_capsule_top(0);
-

+ 18 - 48
TinySpHEAR_mount_pcb.scad

@@ -4,7 +4,7 @@
 // TinySpHEAR, First Order (B-format) Ambisonics Microphone
 // Mount for four Zapnspark phantom power printed circuit boards
 // 
-// Copyright 2015-2016, Fernando Lopez-Lezcano, All Rights Reserved
+// Copyright 2015-2017, Fernando Lopez-Lezcano, All Rights Reserved
 // nando@ccrma.stanford.edu
 //
 //  This program is free software: you can redistribute it and/or modify
@@ -157,13 +157,17 @@ conn_core_overlap = 3.00;
 // shock mount parameters
 //
 
-ring_sep = 30.0;
-ring_height = 10.0;
+// angle in degrees of rubber bands
 rubber_band_angle = 40;
-main_radius_inc = (ring_sep / 2) / tan(rubber_band_angle);
-
+// height of external ring
+external_ring_height = 6.0;
+external_ring_radius = (40.0 / 2) / tan(rubber_band_angle);
+// height of internal ring posts
+internal_ring_height = 50.0;
+//height of internal ring band that slips over microphone body
+internal_band_height = 20.0;
 // gap between internal ring and microphone body
-internal_ring_gap = 1.0;
+internal_ring_gap = 2.75;
 
 // connector that joins the two internal rings
 connector_w = 10.0;
@@ -765,36 +769,15 @@ module render_tetra_shock_mount_stand(z_offset) {
 
 module render_tetra_shock_mount_external_ring(z_offset) {
     translate([0, 0, z_offset]) {
-        shock_mount_external_ring(ring_height, box_radius + wall, box_radius + wall, mount_corner, main_radius_inc, 0);
+        tetra_shock_mount_external_ring(external_ring_height, box_radius, mount_corner, external_ring_radius);
     }
 }
 
 // shock mount: bottom internal ring
 //
-
-module render_tetra_shock_mount_internal_ring_bot(z_offset) {
+module render_tetra_shock_mount_internal_ring(z_offset) {
     translate([0, 0, z_offset]) {
-        shock_mount_internal_ring(ring_height, box_radius + wall, box_radius + wall, mount_corner, internal_ring_gap, 1);
-    }
-}
-
-// shock mount: all four internal ring connectors
-//
-
-module render_tetra_shock_mount_ring_connectors(offset) {
-    for (o = [0, 1, 2, 3]) {
-        translate([-18, (10 + offset) * o, 0]) {
-            shock_mount_connector(ring_sep, 4, connector_w, connector_d, 0.1);
-        }
-    }
-}
-
-// shock mount: top internal ring
-//
-
-module render_tetra_shock_mount_internal_ring_top(z_offset) {
-    translate([0, 0, z_offset]) {
-        shock_mount_internal_ring(ring_height, box_radius + wall, box_radius + wall, mount_corner, internal_ring_gap, 0);
+        tetra_shock_mount_internal_ring(internal_ring_height, box_radius, internal_band_height, mount_corner, internal_ring_gap);
     }
 }
 
@@ -802,31 +785,18 @@ module render_tetra_shock_mount_internal_ring_top(z_offset) {
 //
 
 module render_tetra_shock_mount(z_offset) {
-    // internal rings
-    translate([0, 0, z_offset + ring_sep / 2]) {
-        render_tetra_shock_mount_internal_ring_top(0);
+    // internal ring
+    translate([0, 0, z_offset + (internal_ring_height + external_ring_height) / 2 - 1]) {
         rotate([0, 180, 0]) {
-            render_tetra_shock_mount_internal_ring_bot(ring_sep + 2);
-        }
-        // insert the connecting rods
-        for (r = [0, 90, 180, 270]) {
-            rotate([0, 0, r]) {
-                translate([box_radius + 3 * wall + internal_ring_gap, 0, -1]) {
-                    rotate([0, 90, 0]) {
-                        translate([-4, -5, 1]) {
-                            shock_mount_connector(ring_sep, 4, connector_w, connector_d, 0.1);
-                        }
-                    }
-                }
-            }
+            render_tetra_shock_mount_internal_ring(0);
         }
     }
     // external ring
-    translate([0, 0, z_offset - ring_height / 4]) {
+    translate([0, 0, z_offset]) {
         render_tetra_shock_mount_external_ring(0);
     }
     // mount to stand
-    translate([box_radius + mount_corner + ring_wall + ring_arm_gap + 8 + ring_wall / 2 + 1, 0, -(mic_mount_height + mic_mount_radius + ring_height / 4 + 2.2)]) {
+    translate([box_radius + mount_corner + ring_wall + ring_arm_gap, 0, -(mic_mount_height + mic_mount_radius + 13.25) + z_offset]) {
         render_tetra_shock_mount_stand(0);
     }
 }