|
|
@@ -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
|
|
|
//
|
|
|
|