//
// Spherical Harmonics Ear Project (*SpHEAR)
//
// OctaSpHEAR or Octathingy, Second Order Ambisonics Microphone
//
// based on:
// "A second-order soundfield microphone with improved polar pattern shape"
// by Eric Benjamin, Audio Engineering Society Convention Paper 8728,
// October 2012, San Francisco
//
// Microphone optimized for EM200 14mm capsules and Zapnspark interface
//
// Copyright 2015-2019, Fernando Lopez-Lezcano, All Rights Reserved
// nando@ccrma.stanford.edu
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// 3d Models released under the Creative Commons license as follows:
// Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
// http://creativecommons.org/licenses/by-nc-sa/4.0/
// microphone version
// 1 -> original
// 2 -> flower power
mic_version = 2;
// printed circuit board version
// 1 -> single layer, milled in house
// 2 -> double layer with ground plane, smaller, fabricated
pcb_version = 2;
// type of octathingy (for mic_version -> 1)
// 0 -> regular octathingy (equilateral triangles in the square antiprism)
// 1 -> tetrahedral compatible octathingy (same elevation angle as the tetrahedral mic)
tetra_compat = 1;
// dimensions of the EM200 electret microphone capsule
capsule_radius = 14.55 / 2;
capsule_height = 4.75;
// radius of capsule array
mic_radius = (mic_version == 1) ? 18 : 20.5;
// include shared modules
//
// http://dkprojects.net/openscad-threads/
include ;
include
include ;
include ;
include ;
include ;
////
//// overrides and parameters
////
// override Octathingy_common fudge (0.15)
// 0.17 for Ultimaker 2+
// 0.12 for Ultimaker 3
fudge = 0.12;
// mic_version 1: make triangular legs have the right height
connect = 4;
leg_thick = capsule_height * 0.55;
// radius of windscreen thread
//
// adjusted with offset so that it is inset with respect to the body
// so that the new shock mount sleeve fits over the thread into the body
//
// octa_pcb_radius for pcb v2 is 27.42, the radius used is 25.6
windscreen_thread_offset = (pcb_version == 2 ? -1.82 : -1.82);
windscreen_thread_radius = octa_pcb_radius + windscreen_thread_offset;
windscreen_radius = windscreen_thread_radius + 5.0;
// windscreen thread for pcb version 1
// this is used for the upper part of the windscreen
windscreen_thread_radius_pcb1 = 31.425;
windscreen_radius_pcb1 = windscreen_thread_radius_pcb1 + 5.0;
// do we need to override thread height?
windscreen_thread_height = 8;
windscreen_height = pcb_version == 2 ? 68.5 : 72;
windscreen_thread_fit = 5 * fit;
//
ridge_width = 1.5;
// up from 1.7 in _common.scad
capsule_cable_diam = 2.0;
cable_wall = wall;
////////
//// ready to print individual parts
////////
// NOTE: remove the "*" at the beginning of a line to render that part
// make sure mic_version and pcb_version are set to the right version
// single capsule holder
*if (mic_version == 2) {
// 3d print with support
rotate([180, 0, 0]) capsule_holder(holder_ratio, transition_ratio);
} else {
// upper
render_octa_capsule_top(0);
// lower
*render_octa_capsule_bot(0);
}
// capsule array core and stalk
//
if (mic_version == 2) {
// upper half (3d print with support)
*capsule_holder_core(mount_radius + wall, stalk_height, 1);
// lower half (with stalk - 3d print with support)
*rotate([180, 0, 0]) capsule_holder_core(mount_radius + wall, stalk_height, -1);
// connection ring
*translate([0, 0, 0]) capsule_holder_ring(shift = -0.2);
} else {
*render_octa_capsule_stalk(0);
}
// flare from body to capsule array stalk
*rotate([0, 0, -22.5]) render_octa_capsule_flare(0);
// body
*rotate([0, 0, -22.5]) render_octa_pcb_mount(0, 1);
// flare from body to db25 connector
// (3d print with support)
*rotate([0, 0, 0 + 22.5]) {
conn_offset = 2.0;
octa_mount_flare_dsub(pcb_low_clear + pcb_low_exp - 5, mount_lip, 33 - 13,
octa_pcb_radius,
conn_core_o_diam / 2, conn_core_o_diam + conn_offset);
}
// shock mount
//
// sleeve
*octa_shock_mount_sleeve(octa_pcb_radius, internal_ring_height, true, true);
// external ring
*render_octa_shock_mount_external_ring(0);
// quick lock microphone stand mount
*render_octa_shock_mount_stand(0);
// threaded microphone stand mount
*shock_mount_threaded_stand(20, 2, 1);
// windscreen
//
*if (pcb_version == 2) {
// tapered lower windscreen for pcb2 (from pcb2 to pcb1 diameter)
render_sphear_lower_tapered_windscreen(windscreen_radius - 3, windscreen_radius_pcb1, 0);
} else {
// regular lower windscreen for pcb1
render_sphear_lower_windscreen(windscreen_radius, 0);
}
// upper windscreen
*render_sphear_upper_windscreen(windscreen_thread_radius_pcb1 + 5.0, 0);
// windscreen or shock mount attachment ring
*sphear_windscreen_round_mount(windscreen_thread_height, windscreen_thread_radius, windscreen_radius - 1.75, 2 * wall, true);
////////
//// full microphone with height offset for different parts
////////
// set to true to render printed circuit board and components for testing
render_pcb = false;
// reduce resolution for quick tests
// facets = 64;
// cfacets = 64;
difference() {
// separate the parts slightly to show joints
stretch = 0.1;
//
union() {
// the capsule array
//
*if (mic_version == 1) {
// version 1 capsule array
//
rotate([0, 0, -22.5]) render_octa_capsule_array(202.8);
// stalk from flare to capsule array
rotate([0, 0, -22.5]) render_octa_capsule_stalk(pcb_version == 2 ? 43.2 : 49.2);
} else {
// version 2 flower power capsule array
//
translate([0, 0, 194.2]) rotate([0, 0, -22.5]) {
difference() {
union() {
// capsule array
render_octa_capsule_holder_array();
// upper half of spherical core
capsule_holder_core(mount_radius + wall, stalk_height, 1);
// lower half of spherical core (with stalk)
translate([0, 0, -0.05]) capsule_holder_core(mount_radius + wall, stalk_height, -1);
// connection ring
*translate([0, 0, 0]) capsule_holder_ring(shift = -0.2);
}
*rotate([0, 0, 0]) translate([-50, -25, -25]) cube([50, 50, 50]);
}
}
}
// flare from body to stalk
*rotate([0, 0, -22.5]) render_octa_capsule_flare(pcb_version == 2 ? 42.4 + stretch : 49.2);
// body
*rotate([0, 0, -22.5]) render_octa_pcb_mount(0, 1);
// flare from body to db25 connector
*rotate([180, 0, 90 - 22.5]) {
conn_offset = 2.0;
translate([0, 0, -mount_lip]) octa_mount_flare_dsub(pcb_low_clear + pcb_low_exp - 5, mount_lip, 33 - 13,
octa_pcb_radius,
conn_core_o_diam / 2, conn_core_o_diam + conn_offset);
}
// thread cover (protects thread or locks down shock mount when windscreen not used)
*translate([0, 0, pcb_mount_height - 10 + 15]) {
sphear_windscreen_round_mount(windscreen_thread_height, windscreen_thread_radius,
windscreen_radius - 1.75, 2 * wall, true);
}
//
// windscreen
//
*if (pcb_version == 2) {
// tapered lower windscreen for pcb2 (from pcb2 to pcb1 diameter)
render_sphear_lower_tapered_windscreen(windscreen_radius - 3, windscreen_radius_pcb1, pcb_mount_height - 10 + 15);
} else {
// regular lower windscreen for pcb1
render_sphear_lower_windscreen(windscreen_radius, pcb_mount_height - 10 + 15);
}
// upper windscreen for both designs
*render_sphear_upper_windscreen(windscreen_thread_radius_pcb1 + 5.0, pcb_mount_height - 10 + 15 + windscreen_height);
//
// shock mount
//
// internal sleeve (slides over body from the top)
*translate([0, 0, pcb_version == 2 ? 3.0 : 9.1]) rotate([0, 0, 0]) {
octa_shock_mount_sleeve(octa_pcb_radius, internal_ring_height, true, true);
}
// external ring
*translate([0, 0, (pcb_version == 2 ? 3.0 : 9.1) + (internal_ring_height/2) - (external_ring_height/2)]) {
render_octa_shock_mount_external_ring(0);
}
// quick lock microphone stand mount
*translate([pcb_version == 2 ? 72.5 : 76, 0, pcb_version == 2 ? -25.5 : -19.5]) {
render_octa_shock_mount_stand(0);
}
}
//
// render to have a cutout view of microphone for debugging
//
z_rotation = 0;
*rotate([0, 0, z_rotation]) translate([-100, -100, -100]) {
cube([100, 100, 400]);
}
}
// serial number tests
//
*difference() {
union() {
// add a serial number
*translate([-25.5, 0, 43.2 + 7]) rotate([90, 0, -90]) scale ([0.2, 0.2, 0.5])
linear_extrude(0.5) text("8S004", halign = "center");
}
}
////
//// old versions
////
// the whole body
*translate([0, 0, -20]) render_octa_body(0, 10, 0);
// the whole microphone
// or use render_octa_microphone_cutout(0, 0) for a "transparent" view
//
*rotate([0, 0, 90 - 22.5]) render_octa_microphone_cutout(0, 0, 0);
*rotate([0, 0, 90 - 22.5]) render_octa_microphone(0, 0, 0);
////
//// old microphone shock mount
////
// sleeve (body slips into it)
*rotate([180, 0, 0]) translate([0, 0, -55/2 - 21 - (pcb_version == 2 ? -5 : 0)]) {
octa_shock_mount_internal_ring(internal_ring_height, octa_pcb_radius, 20, 0, 0);
}