|
|
@@ -181,13 +181,13 @@ ring_arm_gap = 20;
|
|
|
|
|
|
windscreen_height = 60;
|
|
|
windscreen_w = 4.0;
|
|
|
-beam_radius = 1.4;
|
|
|
+beam_radius = 1.3;
|
|
|
windscreen_thread_height = 10.0;
|
|
|
-windscreen_thread_pitch = 1.5;
|
|
|
+windscreen_thread_pitch = 2.0;
|
|
|
windscreen_thread_angle = 30;
|
|
|
-windscreen_thread_depth = cos(windscreen_thread_angle) * windscreen_thread_pitch * 5/8;
|
|
|
+windscreen_thread_depth = cos(windscreen_thread_angle) * windscreen_thread_pitch * 5/8 + 0.5;
|
|
|
windscreen_thread_radius = box_corner_radius + windscreen_thread_depth;
|
|
|
-
|
|
|
+windscreen_thread_fit = 4 * fit;
|
|
|
|
|
|
// all four printed circuit boards
|
|
|
|
|
|
@@ -427,7 +427,7 @@ module tetra_mount_array_stalk(height, radius) {
|
|
|
cylinder(r = radius - wall, h = height, $fn = facets);
|
|
|
}
|
|
|
// add marker for "back of microphone" orientation
|
|
|
- rotate([0, 0, 90]) {
|
|
|
+ *rotate([0, 0, 90]) {
|
|
|
translate([0, radius - wall * 2 / 3, height - radius]) {
|
|
|
difference() {
|
|
|
sphere(r = radius / 3, $fn = 32);
|
|
|
@@ -576,19 +576,18 @@ module tetra_capsule_array_mount(angles, mount_radius, mount_wall) {
|
|
|
// windscreen frame
|
|
|
|
|
|
module tetra_windscreen(radius, corner, height, beam_radius, twist, support) {
|
|
|
- // hex helix windscreen frame
|
|
|
- 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) {
|
|
|
- translate([radius + beam_radius + windscreen_thread_depth, 0, 0]) {
|
|
|
- circle(r = beam_radius, $fn = facets);
|
|
|
- }
|
|
|
+ // octagonal helix windscreen frame
|
|
|
+ for (r = [0, 45, 90, 135, 180, -135, -90, -45]) for (t = [1, -1]) rotate([0, 0, r]) {
|
|
|
+ linear_extrude(height = height, center = false, convexity = 0, twist = twist * t, $fn = facets) {
|
|
|
+ translate([radius + beam_radius + windscreen_thread_depth, 0, 0]) {
|
|
|
+ // square(size = beam_radius * 1.5, center = true);
|
|
|
+ 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]) {
|
|
|
+ for (r = [0, 45, 90, 135, 180, -135, -90, -45]) rotate([0, 0, r + twist]) {
|
|
|
translate([radius + beam_radius + windscreen_thread_depth, 0, 0]) {
|
|
|
// cylinder(r = beam_radius * 2/3, h = 2.0, $fn = facets);
|
|
|
cylinder(r = beam_radius * 1, h = 2.0, $fn = facets);
|
|
|
@@ -607,19 +606,58 @@ module tetra_windscreen(radius, corner, height, beam_radius, twist, support) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// windscreen frame
|
|
|
+
|
|
|
+module tetra_windscreen_frame(sides, radius, height, beam_radius, twist) {
|
|
|
+ inc = 360/sides;
|
|
|
+ for (r = [0:inc:360]) for (t = [1, -1]) rotate([0, 0, r]) {
|
|
|
+ linear_extrude(height = height, center = false, convexity = 0, twist = twist * t, $fn = facets) {
|
|
|
+ translate([radius, 0, 0]) {
|
|
|
+ circle(r = beam_radius, $fn = facets);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// windscreen inset frame
|
|
|
+
|
|
|
+module tetra_windscreen_inset_frame(sides, radius, iradius, height, beam_radius, xscale = 1.0, yscale = 1.0) {
|
|
|
+ inc = 360/sides;
|
|
|
+ for (r = [0:inc:360]) for (t = [1, -1]) rotate([0, 0, r]) {
|
|
|
+ translate([0, 0, 0]) {
|
|
|
+ hull() {
|
|
|
+ translate([iradius, 0, 0]) {
|
|
|
+ scale([xscale, yscale, 1.0]) cylinder(r = beam_radius, h = thin_mint, $fn = facets);
|
|
|
+ }
|
|
|
+ rotate([0, 0, inc/2 * t]) translate([radius, 0, height]) {
|
|
|
+ cylinder(r = beam_radius, h = thin_mint, $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 + windscreen_thread_depth, 0, 0]) {
|
|
|
- circle(r = beam_radius, $fn = facets);
|
|
|
+ rad = radius * cos(180/8);
|
|
|
+ difference() {
|
|
|
+ for (r = [0, 90]) rotate([0, 0, r]) {
|
|
|
+ for (t = [1, -1]) {
|
|
|
+ translate([(rad/2 - 1.73 * beam_radius) * t, rad, 0]) rotate([0, 90, 0]) {
|
|
|
+ translate([0, -rad, 0]) {
|
|
|
+ rotate_extrude(convexity = 10, $fn = facets) {
|
|
|
+ translate([rad, 0, 0]) {
|
|
|
+ circle(r = beam_radius, $fn = facets);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- translate([0, -radius * 1.5, -1.4]) {
|
|
|
- cube([radius * 3, radius * 3, beam_radius * 3]);
|
|
|
- }
|
|
|
+ }
|
|
|
+ brad = rad + beam_radius + thin_mint;
|
|
|
+ translate([-brad, -brad, - 2 * brad]) {
|
|
|
+ cube([2 * brad, 2 * brad, 2 * brad]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -627,16 +665,16 @@ module tetra_windscreen_dome(radius, beam_radius) {
|
|
|
// windscreen mount to body with thread
|
|
|
|
|
|
module tetra_windscreen_mount(height, radius, beam_radius) {
|
|
|
- hexagon_radius = (radius + wall) * 2/3 * sqrt(3);
|
|
|
+ octagon_radius = (radius + 2 * beam_radius + wall) * cos(PI/8);
|
|
|
difference() {
|
|
|
cylinder(r = radius + 2 * beam_radius + windscreen_thread_depth, h = height, $fn = facets);
|
|
|
- metric_thread(diameter = radius * 2 + fit, pitch = windscreen_thread_pitch,
|
|
|
- length = height, windscreen_thread_angle = 45, internal = true);
|
|
|
- // make outside be a hexagon instead of a circle
|
|
|
- rotate([0, 0, 30]) translate([0, 0, -thin_mint]) {
|
|
|
+ metric_thread(diameter = radius * 2 + windscreen_thread_fit, pitch = windscreen_thread_pitch,
|
|
|
+ length = height, angle = windscreen_thread_angle, internal = true);
|
|
|
+ // make outside be a octagon instead of a circle
|
|
|
+ rotate([0, 0, 22.5]) translate([0, 0, -thin_mint]) {
|
|
|
difference() {
|
|
|
cylinder(r = 1.5 * radius, h = height + 2 * thin_mint);
|
|
|
- cylinder(r = hexagon_radius, h = height + 2 * thin_mint, $fn = 6);
|
|
|
+ cylinder(r = octagon_radius, h = height + 2 * thin_mint, $fn = 8);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -646,6 +684,28 @@ module tetra_windscreen_mount(height, radius, beam_radius) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+module tetra_windscreen_round_mount(height, radius, wall) {
|
|
|
+ difference() {
|
|
|
+ cylinder(r = radius + wall, h = height, $fn = facets);
|
|
|
+ metric_thread(diameter = radius * 2 + windscreen_thread_fit, pitch = windscreen_thread_pitch,
|
|
|
+ length = height, angle = windscreen_thread_angle, internal = true);
|
|
|
+ }
|
|
|
+ // add better attachment points for windscreen
|
|
|
+ difference() {
|
|
|
+ union() {
|
|
|
+ cylinder(r = radius + 2 * wall, h = height/2, $fn = facets);
|
|
|
+ translate([0, 0, height/2]) {
|
|
|
+ cylinder(r1 = radius + 2 * wall, r2 = radius + wall, h = height/2, $fn = facets);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cylinder(r = radius + wall, h = height, $fn = facets);
|
|
|
+ }
|
|
|
+ // marker for center of microphone
|
|
|
+ rotate([0, 0, 22.5]) translate([-(radius + wall), 0, 0]) {
|
|
|
+ cylinder(r = 1.0, h = height, $fn = facets);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// small tube to connect both helical windscreen mounts
|
|
|
|
|
|
module tetra_windscreen_connector(beam_radius) {
|
|
|
@@ -764,18 +824,18 @@ module render_tetra_microphone_cutout(z_offset, spread) {
|
|
|
|
|
|
module render_tetra_windscreen_top(z_offset) {
|
|
|
translate([0, 0, z_offset]) {
|
|
|
- rotate([0, 0, 30]) scale([1, 1, 6/7]) {
|
|
|
+ rotate([0, 0, 22.5]) 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);
|
|
|
+ rotate([0, 180, 22.5]) {
|
|
|
+ tetra_windscreen(box_corner_radius + beam_radius/2, mount_corner, windscreen_height, beam_radius, 45);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
+ translate([0, 0, z_offset]) rotate([0, 0, 22.5]) {
|
|
|
+ tetra_windscreen(box_corner_radius + beam_radius/2, mount_corner, windscreen_height, beam_radius, 45);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -787,8 +847,8 @@ module render_tetra_windscreen_mount(z_offset) {
|
|
|
|
|
|
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]) {
|
|
|
+ for (r = [0, 45, 90, 135, 180, -135, -90, -45]) rotate([0, 0, r + 22.5]) {
|
|
|
+ translate([box_corner_radius + beam_radius * 2 + 0.5, 0, 0]) {
|
|
|
tetra_windscreen_connector(beam_radius);
|
|
|
}
|
|
|
}
|