|
@@ -60,9 +60,9 @@ pcb_fit = 0.25 / 2;
|
|
|
// add to thickness of pcb
|
|
// add to thickness of pcb
|
|
|
pcb_tfit = 0.3;
|
|
pcb_tfit = 0.3;
|
|
|
|
|
|
|
|
-// lip fit for flares (fit = 0.25)
|
|
|
|
|
-// tried with 0.30 and seems to be fine
|
|
|
|
|
-lip_fit = 0.30 / 2;
|
|
|
|
|
|
|
+// lip fit for flares
|
|
|
|
|
+// 0.20 seems to be fine (0.3 was too lose)
|
|
|
|
|
+lip_fit = 0.20 / 2;
|
|
|
|
|
|
|
|
// wall thickness
|
|
// wall thickness
|
|
|
wall = 1.0;
|
|
wall = 1.0;
|
|
@@ -157,7 +157,73 @@ module tetra_mount_body(height, radius, corner, lower_lip, upper_lip, clear) {
|
|
|
translate([0, 0, 0]) {
|
|
translate([0, 0, 0]) {
|
|
|
difference() {
|
|
difference() {
|
|
|
tetra_mount_box(lower_lip, radius, corner);
|
|
tetra_mount_box(lower_lip, radius, corner);
|
|
|
- tetra_mount_box(lower_lip, radius, corner, -(wall + lip_fit));
|
|
|
|
|
|
|
+ tetra_mount_box_relative(lower_lip, radius, corner, -(wall + lip_fit));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // external slot for microphone holder
|
|
|
|
|
+ if (0) {
|
|
|
|
|
+ mount_slot_len = 30;
|
|
|
|
|
+ mount_slot_stem = 4;
|
|
|
|
|
+ mount_slot_width = 2;
|
|
|
|
|
+ mount_slot_radius = 2;
|
|
|
|
|
+ translate([-(radius + mount_slot_stem), -(mount_slot_width/2), 0]) {
|
|
|
|
|
+ cube([mount_slot_stem, mount_slot_width, mount_slot_len]);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([-(radius + mount_slot_stem), 0, 0]) {
|
|
|
|
|
+ cylinder(r = mount_slot_radius, h = mount_slot_len, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // add parts for clearance check
|
|
|
|
|
+ if (clear == 1) {
|
|
|
|
|
+ // electrolytic capacitors
|
|
|
|
|
+ cap_diam = 10.2;
|
|
|
|
|
+ for (rot = [0, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
|
|
+ translate([-pcb_front + cap_diam/2, 0, 0]) {
|
|
|
|
|
+ cylinder(r = (cap_diam/2), h = 20, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 12.3 x 10.53 caps
|
|
|
|
|
+ cap_h = 12.3;
|
|
|
|
|
+ cap_w = 10.53/2;
|
|
|
|
|
+ for (rot = [0, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
|
|
+ translate([-pcb_front + cap_h, -cap_w/2 - 2.5, 0]) {
|
|
|
|
|
+ cube([cap_h, cap_w, 20]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module tetra_mount_body_new(height, radius, corner, lower_lip, upper_lip, clear) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tetra_mount_box(height, radius, corner);
|
|
|
|
|
+ union() {
|
|
|
|
|
+ // hollow out the inside with slots for pcbs
|
|
|
|
|
+ tetra_pcb_clear(pcb_length, pcb_width, pcb_thickness, 1.0, pcb_front, pcb_back);
|
|
|
|
|
+ // trim square angles
|
|
|
|
|
+ cylinder(r = pcb_front, h = height, $fn = facets);
|
|
|
|
|
+ // remove slots from inside body
|
|
|
|
|
+ slot_len = 30;
|
|
|
|
|
+ translate([0, 0, slot_len]) {
|
|
|
|
|
+ tetra_mount_box_relative(height, radius, corner, - (2 * wall));
|
|
|
|
|
+ }
|
|
|
|
|
+ // upper lip for flare to microphone
|
|
|
|
|
+ translate([0, 0, height - upper_lip]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tetra_mount_box(upper_lip, radius, corner);
|
|
|
|
|
+ tetra_mount_box_relative(upper_lip, radius, corner, -(wall + lip_fit));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // lower lip for flare to cable
|
|
|
|
|
+ translate([0, 0, 0]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tetra_mount_box(lower_lip, radius, corner);
|
|
|
|
|
+ tetra_mount_box_relative(lower_lip, radius, corner, -(wall + lip_fit));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -207,7 +273,8 @@ module tetra_mount_flare(height, lip, transition, bot_radius, bot_corner, top_ra
|
|
|
tetra_mount_box(height, bot_radius, bot_corner);
|
|
tetra_mount_box(height, bot_radius, bot_corner);
|
|
|
tetra_mount_box_relative(height, bot_radius, bot_corner, -(2 * wall));
|
|
tetra_mount_box_relative(height, bot_radius, bot_corner, -(2 * wall));
|
|
|
// flange to mount on body
|
|
// flange to mount on body
|
|
|
- tetra_mount_box_relative(lip + 1.0, bot_radius, bot_corner, - wall);
|
|
|
|
|
|
|
+ // temporarily add 0.05 for best fit on already printed body (FIXME)
|
|
|
|
|
+ tetra_mount_box_relative(lip + 1.0, bot_radius, bot_corner, - (wall + 0.05));
|
|
|
}
|
|
}
|
|
|
// flare to round section
|
|
// flare to round section
|
|
|
translate([0, 0, height]) {
|
|
translate([0, 0, height]) {
|
|
@@ -258,48 +325,67 @@ module tetra_capsule_array_mount(angles) {
|
|
|
|
|
|
|
|
// internal ring of shock mount
|
|
// internal ring of shock mount
|
|
|
|
|
|
|
|
-module tetra_shock_mount_body_ring(height, radius, corner, rinc, lip) {
|
|
|
|
|
|
|
+module tetra_shock_mount_body_ring(height, radius, corner, gap, lip) {
|
|
|
slot_sep = radius * 2 / 2.7;
|
|
slot_sep = radius * 2 / 2.7;
|
|
|
slot_w = 6;
|
|
slot_w = 6;
|
|
|
slot_o = height / 3;
|
|
slot_o = height / 3;
|
|
|
- // base ring
|
|
|
|
|
- *difference() {
|
|
|
|
|
- tetra_mount_box_relative(slot_o, radius + rinc, corner, 3 * wall);
|
|
|
|
|
- tetra_mount_box(slot_o, radius + rinc, corner);
|
|
|
|
|
- }
|
|
|
|
|
- // upper ring with slots for rubber bands
|
|
|
|
|
|
|
+ // connecting bar dimensions
|
|
|
|
|
+ bar_w = 10;
|
|
|
|
|
+ bar_d = 2;
|
|
|
difference() {
|
|
difference() {
|
|
|
- tetra_mount_box_relative(height, radius + rinc, corner, 4 * wall);
|
|
|
|
|
- tetra_mount_box_relative(height, radius + rinc, corner, 2 * wall);
|
|
|
|
|
- for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
- rotate([0, 0, rot]) {
|
|
|
|
|
- for (xo = [1, -1] * slot_sep) {
|
|
|
|
|
- translate([-slot_w / 2 + xo, radius + rinc, slot_o]) {
|
|
|
|
|
|
|
+ union() {
|
|
|
|
|
+ // base ring
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tetra_mount_box_relative(slot_o, radius + gap, corner, 3 * wall);
|
|
|
|
|
+ tetra_mount_box(slot_o, radius + gap, corner);
|
|
|
|
|
+ }
|
|
|
|
|
+ // upper ring with slots for rubber bands
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tetra_mount_box_relative(height, radius + gap + 2 * wall, corner, 2 * wall);
|
|
|
|
|
+ tetra_mount_box_relative(height, radius + gap + wall, corner, 1 * wall);
|
|
|
|
|
+ for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
// slots for rubber bands
|
|
// slots for rubber bands
|
|
|
- cube([slot_w, 10, slot_o]);
|
|
|
|
|
- translate([slot_w / 3, 0, 0]) {
|
|
|
|
|
- cube([slot_w / 3, 10, 10]);
|
|
|
|
|
|
|
+ for (m = [0, 1]) mirror([0, m, 0]) {
|
|
|
|
|
+ translate([-slot_w / 2 + slot_sep, radius + gap, slot_o]) {
|
|
|
|
|
+ cube([slot_w, 10, slot_o]);
|
|
|
|
|
+ translate([slot_w / 3, 0, 0]) {
|
|
|
|
|
+ cube([slot_w /3, 10, 10]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ // body for bars that connect both rings together
|
|
|
|
|
+ for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
|
|
+ translate([radius + gap + 3 * wall, -(bar_w/2 + wall), 0]) {
|
|
|
|
|
+ cube([bar_d + wall, bar_w + 2 * wall, height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
- rotate([0, 0, rot]) {
|
|
|
|
|
- // slots for connecting the upper and lower rings
|
|
|
|
|
- translate([radius + rinc + 2 * wall, -(slot_sep + slot_w/3)/2, 0]) {
|
|
|
|
|
- difference() {
|
|
|
|
|
- cube([5, slot_sep + slot_w/3, height]);
|
|
|
|
|
- translate([0, wall, 0]) {
|
|
|
|
|
- cube([4, slot_sep + slot_w/3 - 2 * wall, 4]);
|
|
|
|
|
|
|
+ // carve holes for bars that connect both rings
|
|
|
|
|
+ for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
|
|
+ translate([radius + gap + 3 * wall, -bar_w/2, 0]) {
|
|
|
|
|
+ cube([bar_d, bar_w, height - 2.75 * wall]);
|
|
|
|
|
+ translate([bar_d / 2, 0, height - 3 * wall]) {
|
|
|
|
|
+ rotate([-90, 0, 0]) {
|
|
|
|
|
+ cylinder(r = bar_d / 2, h = bar_w, $fn = facets);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, rot]) {
|
|
|
// lip to support microphone on lower ring only
|
|
// lip to support microphone on lower ring only
|
|
|
if (lip == 1) {
|
|
if (lip == 1) {
|
|
|
lip_w = 10;
|
|
lip_w = 10;
|
|
|
- translate([radius + rinc + 2 * wall, -lip_w/2, height]) {
|
|
|
|
|
|
|
+ translate([radius + gap + 2.5 * wall, -lip_w/2, height]) {
|
|
|
rotate([90, 90, 180]) {
|
|
rotate([90, 90, 180]) {
|
|
|
linear_extrude(height = lip_w) {
|
|
linear_extrude(height = lip_w) {
|
|
|
polygon([[0, 0], [0, 4], [1, 4], [height * 2/3, 0]]);
|
|
polygon([[0, 0], [0, 4], [1, 4], [height * 2/3, 0]]);
|
|
@@ -311,34 +397,50 @@ module tetra_shock_mount_body_ring(height, radius, corner, rinc, lip) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-module tetra_shock_mount_main_ring(height, radius, corner, rinc, lip) {
|
|
|
|
|
|
|
+module tetra_shock_mount_main_ring(height, radius, corner, gap, lip) {
|
|
|
difference() {
|
|
difference() {
|
|
|
- tetra_mount_box_relative(6, box_radius, mount_corner, rinc);
|
|
|
|
|
- tetra_mount_box_relative(6, box_radius, mount_corner, rinc - 4 * wall);
|
|
|
|
|
|
|
+ tetra_mount_box_relative(6, radius, mount_corner, gap);
|
|
|
|
|
+ tetra_mount_box_relative(6, radius, mount_corner, gap - 4 * wall);
|
|
|
}
|
|
}
|
|
|
for (rot = [0, 90, 180, 270]) {
|
|
for (rot = [0, 90, 180, 270]) {
|
|
|
rotate([0, 0, rot]) {
|
|
rotate([0, 0, rot]) {
|
|
|
- translate([box_radius + rinc + 4 * wall, -7.5, 0]) {
|
|
|
|
|
|
|
+ translate([radius + gap + 4 * wall, -7.5, 0]) {
|
|
|
cube([4, 15, 6]);
|
|
cube([4, 15, 6]);
|
|
|
}
|
|
}
|
|
|
- translate([box_radius + rinc, -2, 0]) {
|
|
|
|
|
|
|
+ translate([radius + gap, -2, 0]) {
|
|
|
cube([7, 4, 6]);
|
|
cube([7, 4, 6]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ // connection to stand mount
|
|
|
|
|
+ for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
+ rotate([0, 0, 20]) {
|
|
|
|
|
+ translate([25, radius * 1.36, 0]) cube([4, 50, 6]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+module tetra_shock_mount_connector(length, width, thickness, fit) {
|
|
|
|
|
+ cube([length, width - 2 * fit, thickness - 2 * fit]);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+*tetra_shock_mount_connector(ring_sep, 9, 3.3, 0.1);
|
|
|
|
|
+*translate([0, 15, 0])
|
|
|
|
|
+ tetra_shock_mount_connector(ring_sep, 9, 3.3, 0.1);
|
|
|
|
|
+
|
|
|
// main body of microphone mount
|
|
// main body of microphone mount
|
|
|
//
|
|
//
|
|
|
-*translate([0, 0, -(pcb_length - pcb_low_exp - pcb_hi_exp + 10)]) {
|
|
|
|
|
- tetra_mount_body(pcb_length - pcb_low_exp - pcb_hi_exp, box_radius + wall, mount_corner, mount_lip, mount_lip, 0);
|
|
|
|
|
-}
|
|
|
|
|
|
|
+//translate([0, 0, -(pcb_length - pcb_low_exp - pcb_hi_exp + 10)]) {
|
|
|
|
|
+ *tetra_mount_body_new(pcb_length - pcb_low_exp - pcb_hi_exp, box_radius + wall, mount_corner, mount_lip, mount_lip, 0);
|
|
|
|
|
+//}
|
|
|
|
|
|
|
|
// flare to microphone stalk
|
|
// flare to microphone stalk
|
|
|
//
|
|
//
|
|
|
|
|
|
|
|
//translate([0, 0, pcb_length - pcb_low_exp - pcb_hi_exp + 10]) {
|
|
//translate([0, 0, pcb_length - pcb_low_exp - pcb_hi_exp + 10]) {
|
|
|
-*translate([0, 0, 0]) {
|
|
|
|
|
|
|
+translate([0, 0, 0]) {
|
|
|
tetra_mount_flare(10 + pcb_hi_exp, mount_lip, flare_height, box_radius + wall, mount_corner,
|
|
tetra_mount_flare(10 + pcb_hi_exp, mount_lip, flare_height, box_radius + wall, mount_corner,
|
|
|
mount_radius + wall, stalk_height);
|
|
mount_radius + wall, stalk_height);
|
|
|
translate([0, 0, 10 + pcb_hi_exp + flare_height + stalk_height]) {
|
|
translate([0, 0, 10 + pcb_hi_exp + flare_height + stalk_height]) {
|
|
@@ -350,7 +452,7 @@ module tetra_shock_mount_main_ring(height, radius, corner, rinc, lip) {
|
|
|
//
|
|
//
|
|
|
|
|
|
|
|
//translate([0, 0, -(10 + pcb_length - pcb_low_exp - pcb_hi_exp + 10)]) {
|
|
//translate([0, 0, -(10 + pcb_length - pcb_low_exp - pcb_hi_exp + 10)]) {
|
|
|
-translate([0, 0, -14]) {
|
|
|
|
|
|
|
+*translate([0, 0, -5]) {
|
|
|
rotate([0, 180, 0]) {
|
|
rotate([0, 180, 0]) {
|
|
|
tetra_mount_flare(10 + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, cable_diam / 2 + wall, 10);
|
|
tetra_mount_flare(10 + pcb_low_exp, mount_lip, 20, box_radius + wall, mount_corner, cable_diam / 2 + wall, 10);
|
|
|
}
|
|
}
|
|
@@ -364,19 +466,22 @@ ring_height = 6;
|
|
|
band_angle = 40;
|
|
band_angle = 40;
|
|
|
main_radius_inc = (ring_sep / 2) / tan(band_angle);
|
|
main_radius_inc = (ring_sep / 2) / tan(band_angle);
|
|
|
|
|
|
|
|
-translate([0, 0, -3]) {
|
|
|
|
|
|
|
+body_ring_gap = 0.5;
|
|
|
|
|
+
|
|
|
|
|
+translate([0, 0, 0]) {
|
|
|
//rotate([0, 180, 0]) {
|
|
//rotate([0, 180, 0]) {
|
|
|
- tetra_shock_mount_body_ring(10, box_radius, mount_corner, 0.5, 0);
|
|
|
|
|
- rotate([0, 180, 0]) {
|
|
|
|
|
|
|
+ *tetra_shock_mount_body_ring(10, box_radius + wall, mount_corner, body_ring_gap, 0);
|
|
|
|
|
+ *rotate([0, 180, 0]) {
|
|
|
translate([0, 0, ring_sep]) {
|
|
translate([0, 0, ring_sep]) {
|
|
|
- tetra_shock_mount_body_ring(10, box_radius, mount_corner, 0.5, 1);
|
|
|
|
|
|
|
+ tetra_shock_mount_body_ring(10, box_radius + wall, mount_corner, body_ring_gap, 1);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
//}
|
|
//}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-translate([0, 0, - ring_sep / 2 - 5]) {
|
|
|
|
|
- tetra_shock_mount_main_ring(10, box_radius, mount_corner, main_radius_inc, 0);
|
|
|
|
|
|
|
+//translate([0, 0, - ring_sep / 2 - 5]) {
|
|
|
|
|
+*translate([0, 0, 0]) {
|
|
|
|
|
+ tetra_shock_mount_main_ring(10, box_radius + wall, mount_corner, main_radius_inc, 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// first try at a ccrma logo
|
|
// first try at a ccrma logo
|