TinySpHEAR_H2N_EM200.scad 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //
  2. // Spherical Harmonics Ear Project (*SpHEAR)
  3. //
  4. // TinySpHEAR, First Order (B-format) Ambisonics Microphone
  5. // Add-on array for H2N with EM200 capsules
  6. //
  7. // Copyright 2015-2017, Fernando Lopez-Lezcano, All Rights Reserved
  8. // nando@ccrma.stanford.edu
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. // 3d Models released under the Creative Commons license as follows:
  24. // Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
  25. // http://creativecommons.org/licenses/by-nc-sa/4.0/
  26. include <SpHEAR_common.scad>;
  27. include <SpHEAR_windscreen.scad>;
  28. include <TinySpHEAR_common.scad>;
  29. include <TinySpHEAR_mount_pcb.scad>;
  30. include <TinySpHEAR_H2N_common.scad>;
  31. // dimensions of the EM200 electret microphone capsule
  32. capsule_radius = 14.6 / 2;
  33. capsule_height = 4.75;
  34. mic_radius = 11;
  35. // make triangular legs have the right height
  36. connect = 1;
  37. leg_thick = capsule_height;
  38. // adjust the depth of slots in mount
  39. mic_to_mount_fit = -0.7;
  40. ////
  41. //// render the different assemblies
  42. ////
  43. facets = 128;
  44. //// microphone body and array
  45. windscreen_thread_radius = mic_radius * 1.6;
  46. windscreen_thread_height = 8;
  47. // make winscreen radius and height the same as for the EM200 standalone microphone
  48. windscreen_height = 66;
  49. windscreen_radius = box_corner_radius + 6.0;
  50. // height of the lower windscreen
  51. windscreen_lower_height = 25;
  52. // render the whole thing
  53. difference() {
  54. union() {
  55. *h2n_ring(h2n_width_m, h2n_depth_m, h2n_depth * 0.425, h2n_band_height, h2n_col_tilt,
  56. h2n_side_band_w, h2n_side_band, h2n_band_wall, h2n_band_wall, mount_radius, h2n_col_wall);
  57. *h2n_columns(h2n_width_m, h2n_column_height, h2n_band_height, h2n_col_tilt,
  58. transition_height, h2n_mount_radius, h2n_col_wall, wall);
  59. translate([0, 0, h2n_column_height]) {
  60. h2n_bridge((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2,
  61. h2n_bridge_base_height, h2n_bridge_stalk_height, mount_radius, h2n_col_wall, h2n_stalk_wall, wall,
  62. windscreen_thread_radius, windscreen_thread_height);
  63. }
  64. // capsule array mount
  65. rotate([0, 0, -90]) translate([0, 0, 95]) {
  66. tetra_capsule_array_mount([-45, 135], mount_radius, wall);
  67. }
  68. // cylindrical stalk
  69. translate([0, 0, 65]) {
  70. difference() {
  71. cylinder(r = mount_radius + wall, h = 30.0, $fn = facets);
  72. cylinder(r = mount_radius, h = 30.0, $fn = facets);
  73. }
  74. }
  75. // conical stalk
  76. translate([0, 0, 44]) {
  77. difference() {
  78. cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth, r2 = mount_radius + wall,
  79. h = 21, $fn = facets);
  80. cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth - wall, r2 = mount_radius,
  81. h = 21, $fn = facets);
  82. }
  83. }
  84. render_sphear_upper_windscreen(37.2 + 23 - 0.5);
  85. render_h2n_lower_windscreen(37.2);
  86. *translate([0, 0, h2n_column_height]) {
  87. h2n_bridge_connector((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2,
  88. h2n_bridge_base_height, mount_radius, h2n_col_wall, h2n_stalk_wall, wall);
  89. }
  90. *translate([0, 0, h2n_column_height + 40]) {
  91. h2n_connector_to_stalk((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2,
  92. h2n_xlr_height, h2n_xlr_thread_height, h2n_xlr_thread_diam, h2n_xlr_thread_pitch, h2n_xlr_shoulder, h2n_stalk_wall);
  93. }
  94. *translate([0, 0, h2n_column_height + h2n_xlr_height + 5 + 40]) {
  95. h2n_stalk_to_array_mount((h2n_width_m / 2 + mount_radius - h2n_col_wall - h2n_column_height * tan(h2n_col_tilt)) * 2,
  96. h2n_xlr_stalk_height, h2n_stalk_wall);
  97. }
  98. rotate([0, 0, 90]) {
  99. render_tetra_capsule_array(h2n_column_height + h2n_bridge_base_height + h2n_bridge_stalk_height + 46);
  100. }
  101. translate([0, 0, 100]) {
  102. *h2n_wind_screen_vertical_ring(h2n_width_m, 1.6, 10.0);
  103. *rotate([0, 0, 180]) h2n_wind_screen_vertical_ring(h2n_width_m, 1.6, 10.0);
  104. *h2n_wind_screen_horizontal_ring(h2n_width_m, 1.6);
  105. *h2n_wind_screen_vertical_aux_ring(h2n_width_m, 1.6);
  106. }
  107. *rotate([0, 90, 0])
  108. h2n_wind_screen_vertical_ring(h2n_width_m, 1.6, 10.0);
  109. *h2n_wind_screen_horizontal_ring(h2n_width_m, 1.6);
  110. *rotate([90, 180, 0])
  111. h2n_wind_screen_vertical_aux_ring(h2n_width_m, 1.6);
  112. }
  113. *rotate([0, 0, 22.5/2]) translate([-40, -50, 0]) {
  114. cube([80, 50, 170]);
  115. }
  116. }
  117. // individual capsule holders
  118. *render_tetra_capsule_top(0);
  119. *render_tetra_capsule_bot(0);
  120. // make sure dimensions are fine
  121. *translate([-(h2n_width_m - 0.1) / 2, - 0.5, 0]) {
  122. cube([h2n_width_m - 0.1, 1, 1]);
  123. }
  124. *translate([-0.5, -(h2n_depth_m - 0.1) / 2, 0]) {
  125. cube([1, h2n_depth_m - 0.1, 1]);
  126. }
  127. // some tests with traced profiles
  128. *difference() {
  129. translate([0, -2.5, 0]) {
  130. scale([2.15, 2.15, 1.0]) {
  131. H2N_top_up_outline(5.0);
  132. }
  133. }
  134. // scale([1.75, 1.75, 1.0]) {
  135. translate([0, -2.4, 0]) {
  136. scale([2.02, 2.02, 1.0]) {
  137. H2N_top_up_outline(5.0);
  138. }
  139. }
  140. }
  141. *scale(1.665) {
  142. translate([0, 10, -0]) {
  143. rotate([0, 0, 0]) {
  144. H2N_front_outline(1.0);
  145. }
  146. }
  147. }
  148. *rotate([0, 0, 4]) translate([35, 0, 0])
  149. cube([2, 80, 4]);