Преглед изворни кода

h2n: major redesign, hide access to the top microphone mode selection dial as it is not really needed (the h2n needs to be in 4ch mode for the TinySpHEAR mod to work), with that disabled lower the bridge to touch the top of the h2n and hide the dial, use hull to get nicely smooth transitions, redo the columns to match - carefully match dimensions to the old column design as that was correctly hugging the h2n case, still need to test print the whole assembly so more tuning will probably happen soon

Fernando Pablo Lopez-Lezcano пре 9 година
родитељ
комит
699ddeeeca
1 измењених фајлова са 207 додато и 15 уклоњено
  1. 207 15
      TinySpHEAR_H2N_common.scad

+ 207 - 15
TinySpHEAR_H2N_common.scad

@@ -4,7 +4,7 @@
 // TinySpHEAR, First Order (B-format) Ambisonics Microphone
 // Common files for H2N add-on array
 // 
-// Copyright 2016, Fernando Lopez-Lezcano, All Rights Reserved
+// Copyright 2016-2017, Fernando Lopez-Lezcano, All Rights Reserved
 // nando@ccrma.stanford.edu
 //
 //  This program is free software: you can redistribute it and/or modify
@@ -33,6 +33,8 @@ include <TinySpHEAR_mount_pcb.scad>;
 // outline of H2N top
 // include<h2n/H2N_top_up_outline.scad>;
 
+facets = 128;
+
 // dimensions of the EM200 electret microphone capsule (measured 14.59 max)
 capsule_radius = 14.6 / 2;
 capsule_height = 4.75;
@@ -53,7 +55,8 @@ h2n_depth = 42.66;
 
 h2n_width_up = 57.0;
 
-h2n_column_height = 40;
+//h2n_column_height = 40;
+h2n_column_height = 23.2;
 transition_height = 30;
 
 // measured = 11.50, should be 13.1 -> ratio = 
@@ -83,8 +86,17 @@ h2n_mount_radius = mount_radius;
 h2n_mount_fit = 0.04;
 
 // bridge dimensions
-h2n_bridge_base_height = 6.0;
-h2n_bridge_stalk_height = 30.0;
+h2n_bridge_base_height = 7.0;
+h2n_bridge_stalk_height = 45.0;
+
+// bridge base dimensions
+h2n_bridge_circle = 24.00;
+h2n_bridge_band_w = 13.25;
+h2n_bridge_band_h = 26.5 - h2n_column_height;
+
+// we need to make the dial cover slightly elliptical
+h2n_bridge_circle_max = 26.5;
+h2n_bridge_circle_ratio = h2n_bridge_circle_max / h2n_bridge_circle;
 
 
 module tube(or, ir, h) {
@@ -190,7 +202,83 @@ module half_rounded_box(height, width, depth, radius, wall, e = 0.1) {
     }
 }
 
+module h2n_column_core(height, ring_height, tilt, transition, radius, col_wall, wall, offset) {
+    hull() {
+        // angled column
+        difference() {
+            tilted_cylinder(radius + col_wall + offset, height, height * tan(tilt));
+            translate([0, -(radius + col_wall + offset), 0]) {
+                tilted_cube((radius + col_wall) * 2, (radius + col_wall) * 2, height, height * tan(tilt));
+            }
+        }
+        // side sleeves
+        // we should derive the geometry for the aligment magic below...
+        side_fit = 0.5;
+        translate([(radius + col_wall) / 2 + 2 * wall - side_fit, 0, 0]) {
+            difference() {
+                tilted_half_rounded_box(height, 3.8 + offset, h2n_side_band_w / 2 + wall + offset * 1.1,
+                    2.0, wall, height * tan(tilt));
+                translate([col_wall / 2 + wall - radius * 3 / 2 - side_fit, 0, 0]) {
+                    tilted_cylinder(radius, height, height * tan(tilt));
+                }
+            }
+        }
+    }
+}
+
+module h2n_column(height, ring_height, tilt, transition, radius, col_wall, wall) {
+    // side tubes for cables
+    difference() {
+        h2n_column_core(height, ring_height, tilt, transition, radius, col_wall, wall, 0);
+        // hollow out the cylinder
+        tilted_cylinder(radius, height, height * tan(tilt));
+        // this fine adjustment determines how much the side walls "hug" the H2N
+        width_fit = 0.2;
+        translate([radius + 2 * wall - width_fit, 0, 0]) {
+            tilted_half_rounded_box(height, 3.8, h2n_side_band_w / 2, 1.5, 4 * wall, height * tan(tilt));
+        }
+        // trim side of tubes with a vertical plane
+        translate([-(radius * 2 + col_wall) + col_wall / 2, -(radius + col_wall), 0]) {
+            cube([col_wall * 2, (radius + col_wall) * 2, 30]);
+        }
+    }
+   // add a thicker wall at the bottom of the side trim
+    difference() {
+        translate([-(radius), -(radius + col_wall), 0]) {
+            cube([wall, (radius + col_wall) * 2, height]);
+        }
+        difference() {
+            tilted_cylinder(radius * 4, height, height * tan(tilt));
+            tilted_cylinder(radius + col_wall, height, height * tan(tilt));
+        }
+    }
+    // connector to bridge
+    translate([height * tan(tilt), 0, height]) {
+        connector_height = 5.0;
+        difference() {
+            union() {
+                cylinder(r = radius + wall - h2n_mount_fit, h = connector_height, $fn = facets);
+                h2n_column_core(h2n_bridge_band_h, ring_height, 0, transition, radius, col_wall, wall, -(wall + h2n_mount_fit));
+            }
+            cylinder(r = radius, h = connector_height, $fn = facets);
+            translate([1.5, -(radius + wall) * 2, 0]) {
+                cube([radius + wall, (radius + wall) * 4, connector_height]);
+            }
+        }
+    }
+}
+
 module h2n_columns(width, height, ring_height, tilt, transition, radius, col_wall, wall) {
+    for (m = [0, 1]) mirror([m, 0, 0]) {
+        translate([-(width / 2 + col_wall - wall / 2), 0, 0]) {
+            h2n_column(height, ring_height, tilt, transition, radius, col_wall, wall);
+        }
+    }
+}
+
+// old version of columns
+
+module h2n_columns_old(width, height, ring_height, tilt, transition, radius, col_wall, wall) {
     // side tubes for cables
     slot_height = 25.0;
     for (m = [0, 1]) mirror([m, 0, 0]) {
@@ -218,7 +306,7 @@ module h2n_columns(width, height, ring_height, tilt, transition, radius, col_wal
             // add a thicker wall at the bottom of the side trim
             difference() {
                 translate([-(radius), -(radius + col_wall), 0]) {
-                    cube([wall, (radius + col_wall) * 2, 30]);
+                    cube([wall, (radius + col_wall) * 2, height]);
                 }
                 difference() {
                     tilted_cylinder(radius * 4, height, height * tan(tilt));
@@ -237,7 +325,8 @@ module h2n_columns(width, height, ring_height, tilt, transition, radius, col_wal
             }
         }
         // side sleeves
-        sleeve_height = slot_height - mount_radius - col_wall;
+        sleeve_height = slot_height;
+        // XXX sleeve_height = slot_height - mount_radius - col_wall;
         for (m = [0, 1]) mirror([m, 0, 0]) {
             // we should derive the geometry for the aligment magic below...
             side_fit = 1.05;
@@ -288,8 +377,10 @@ module cylcube(width, depth, height, wall) {
     }
 }
 
-module h2n_bridge(width, base_height, stalk_height, radius, col_wall, wall) {
-    // capsule array mount with the right orientation (left front top = #1)0
+// old version of the bridge
+
+module h2n_bridge_old(width, base_height, stalk_height, radius, col_wall, wall) {
+    // capsule array mount with the right orientation (left front top = #1)
     rotate([0, 0, -90]) translate([0, 0, base_height + stalk_height]) {
         tetra_capsule_array_mount([-45, 135]);
     }
@@ -360,24 +451,125 @@ module h2n_bridge(width, base_height, stalk_height, radius, col_wall, wall) {
     }
 }
 
+// base plate for upper band cover
+
+module h2n_center_cover(width, base_height, stalk_height, radius, col_wall, wall, offset) {
+    bot_step = h2n_bridge_band_h;
+    difference() {
+        union() {
+            for (m = [0, 1]) mirror([m, 0, 0]) {
+                // core of bridge
+                translate([width/2, -thin_mint / 2, 0]) {
+                    cylcube(width / 2 + offset, radius + offset + 2 * wall, bot_step, wall);
+                }
+                // we should derive the geometry for the aligment magic below...
+                side_fit = 1.05;
+                corner_radius = 2.0;
+                tilted_half_rounded_box(bot_step, width / 2 + offset - wall / 2, h2n_side_band_w / 2 + offset + wall,
+                    corner_radius, wall, 0);
+            }
+        }
+        // clear the inside
+        // outer frame
+        rounded_block(bot_step + thin_mint, width / 2 + offset - 1.5 * wall, h2n_side_band_w / 2 + offset, 2);
+        // inner frame
+        translate([-(width + offset) / 2, -(radius + wall + offset), 0]) {
+            cube([width + offset, (radius + wall + offset) * 2, bot_step + thin_mint]);
+        }
+    }
+}
+
+// base plate for upper center dial cover
+
+module h2n_center_dial_cover(radius, wall, offset) {
+    scale([h2n_bridge_circle_ratio, 1, 1]) {
+        tube(radius + wall + offset, radius + offset, h2n_bridge_band_h);
+    }
+}
+
+// the core of the bridge, a solid offset-able version
+
+module h2n_bridge_core(width, base_height, stalk_height, radius, col_wall, wall, offset) {
+    hull() {
+        // top of bridge
+        translate([width / 2, 0, base_height]) {
+            rotate([0, -90, 0]) {
+                // curvy ceiling
+                semi_cylinder(r = radius + offset + col_wall, h = width + offset);
+            }
+        }
+        // spherical caps at ends
+        for (m = [0, 1]) mirror([m, 0, 0]) {
+            translate([width / 2, 0, base_height]) {
+                quarter_sphere(r = radius + offset + col_wall);
+            }
+        }
+        // bottom plate
+        h2n_center_cover(width, base_height, stalk_height, radius, col_wall, wall, offset);
+    }
+    // add cover for center dial
+    hull() {
+        cylinder(r = mount_radius, h = base_height + radius);
+        h2n_center_dial_cover(h2n_bridge_circle / 2, wall, offset);
+    }
+}
+
+// the bridge that holds the capsule array
+
+module h2n_bridge(width, base_height, stalk_height, radius, col_wall, wall) {
+    // capsule array mount with the right orientation (left front top = #1)0
+    rotate([0, 0, -90]) translate([0, 0, base_height + stalk_height]) {
+        tetra_capsule_array_mount([-45, 135]);
+    }
+    // stalk
+    translate([0, 0, base_height]) {
+        difference() {
+            tube(radius + wall, radius, stalk_height);
+            // remove stalk segment that is inside the bridge
+            translate([width / 2, 0, -1.0]) {
+                rotate([0, -90, 0]) {
+                    semi_cylinder(r = radius + col_wall, h = width);
+                }
+            }
+        }
+        // add marker for "back of microphone" orientation
+        rotate([0, 0, 0]) {
+            translate([0, radius + wall - wall * 2 / 3, stalk_height - radius]) {
+                difference() {
+                    sphere(r = radius / 3, $fn = 32);
+                    translate([0, -radius + radius / 2, 0]) {
+                        cube([radius, radius, radius], center = true);
+                    }
+                }
+            }
+        }
+    }
+    difference() {
+        h2n_bridge_core(width, base_height, stalk_height, radius, col_wall, wall, 0);
+        h2n_bridge_core(width, base_height, stalk_height, radius, col_wall, wall, -wall);
+        // make a hole for the cables
+        cylinder(r = radius, h = base_height + radius + 2 * wall, $fn = facets);
+    }
+}
+
 // render the whole thing
 
 difference() {
 union() {
 
-*h2n_ring(h2n_width_m, h2n_depth_m, h2n_depth * 0.425, h2n_band_height, h2n_col_tilt, 
+*h2n_ring(h2n_width_m, h2n_depth_m, h2n_depth * 0.425, h2n_band_height, h2n_col_tilt,
          h2n_side_band_w, h2n_side_band, h2n_band_wall, wall, mount_radius, h2n_col_wall);
 
-*h2n_columns(h2n_width_m, h2n_column_height, h2n_band_height, h2n_col_tilt, 
+*h2n_columns(h2n_width_m, h2n_column_height, h2n_band_height, h2n_col_tilt,
             transition_height, h2n_mount_radius, h2n_col_wall, wall);
 
-//translate([0, 0, h2n_column_height]) {
-    *h2n_bridge((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2, 
+*translate([0, 0, h2n_column_height]) {
+    h2n_bridge((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2,
                h2n_bridge_base_height, h2n_bridge_stalk_height, mount_radius, h2n_col_wall, wall);
-//}
+}
 
-*rotate([0, 0, 0]) {
-    render_tetra_capsule_array(h2n_column_height + h2n_bridge_base_height + h2n_bridge_stalk_height + 27);
+*rotate([0, 0, 90]) {
+    render_tetra_capsule_array(h2n_column_height + h2n_bridge_base_height + h2n_bridge_stalk_height + 26);
 }
 
 }