|
@@ -1,14 +1,14 @@
|
|
|
-//
|
|
|
|
|
|
|
+////
|
|
|
// Spherical Harmonics Ear Project (*SpHEAR)
|
|
// Spherical Harmonics Ear Project (*SpHEAR)
|
|
|
//
|
|
//
|
|
|
-// Octathingy, Second Order Ambisonics Microphone
|
|
|
|
|
|
|
+// OctaSpHEAR or Octathingy, Second Order Ambisonics Microphone
|
|
|
//
|
|
//
|
|
|
// based on:
|
|
// based on:
|
|
|
// "A second-order soundfield microphone with improved polar pattern shape"
|
|
// "A second-order soundfield microphone with improved polar pattern shape"
|
|
|
// by Eric Benjamin, Audio Engineering Society Convention Paper 8728,
|
|
// by Eric Benjamin, Audio Engineering Society Convention Paper 8728,
|
|
|
// October 2012, San Francisco
|
|
// October 2012, San Francisco
|
|
|
//
|
|
//
|
|
|
-// Copyright 2015-2018, Fernando Lopez-Lezcano, All Rights Reserved
|
|
|
|
|
|
|
+// Copyright 2015-2019, Fernando Lopez-Lezcano, All Rights Reserved
|
|
|
// nando@ccrma.stanford.edu
|
|
// nando@ccrma.stanford.edu
|
|
|
//
|
|
//
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// This program is free software: you can redistribute it and/or modify
|
|
@@ -28,84 +28,17 @@
|
|
|
// Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
|
|
// Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
|
|
|
// http://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
// http://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
|
|
|
|
-include <Octathingy_common.scad>;
|
|
|
|
|
-include <CCRMA_logo.scad>;
|
|
|
|
|
-
|
|
|
|
|
// d-sub connector
|
|
// d-sub connector
|
|
|
include <db25.scad>;
|
|
include <db25.scad>;
|
|
|
|
|
|
|
|
-////
|
|
|
|
|
-//// overrides
|
|
|
|
|
-
|
|
|
|
|
-// inner radius of mount stalk
|
|
|
|
|
-mount_radius = 4.0;
|
|
|
|
|
-
|
|
|
|
|
////
|
|
////
|
|
|
//// default model parameters
|
|
//// default model parameters
|
|
|
////
|
|
////
|
|
|
|
|
|
|
|
-// size of Zapnspark printed circuit board
|
|
|
|
|
-// kicad length = 79.375
|
|
|
|
|
-// measured length = 79.20 (2016.08.25)
|
|
|
|
|
-pcb_length = pcb_version == 2 ? 72.39 : 79.20;
|
|
|
|
|
-// kicad width = 19.050
|
|
|
|
|
-// measured width = 18.82 (2016.08.25)
|
|
|
|
|
-pcb_width = pcb_version == 2 ? 15.34 : 18.85;
|
|
|
|
|
-// ultimaker spec thickness = 1.61
|
|
|
|
|
-// measured thickness = 1.56 (w/ copper)
|
|
|
|
|
-pcb_thickness = pcb_version == 2 ? 1.68 + 0.02 : 1.58;
|
|
|
|
|
-
|
|
|
|
|
-// tolerance to add to length and width of pcb
|
|
|
|
|
-//
|
|
|
|
|
-// measured 3d print width = 18.70 (with pcb_fit = 0.3)
|
|
|
|
|
-// actual printed = 18.70 - 0.3 = 16.97
|
|
|
|
|
-// total correction = 18.85 - 16.97 = 1.88
|
|
|
|
|
-//
|
|
|
|
|
-pcb_fit = 0.4;
|
|
|
|
|
-
|
|
|
|
|
-// tolerance add to thickness of pcb
|
|
|
|
|
-//
|
|
|
|
|
-// printed with pcb_tfit = 0.15 -> 1.58 + 0.15 = 1.73 (ideal printed)
|
|
|
|
|
-// measured print channel = 1.63 : 0.1 thinner (ultimaker 2 plus, 2016.08.24)
|
|
|
|
|
-// measured pcb thickness = 1.58 (othermill)
|
|
|
|
|
-//
|
|
|
|
|
-pcb_tfit = 0.15;
|
|
|
|
|
-
|
|
|
|
|
-// we leave part of the pcb exposed on the bottom of the body so that we
|
|
|
|
|
-// can solder the wires that connect the microphone with the
|
|
|
|
|
-// preamplifier, same at the top of the pcb to solder the wires
|
|
|
|
|
-// to the capsules
|
|
|
|
|
-pcb_low_exp = 12.0;
|
|
|
|
|
-pcb_hi_exp = 8.0;
|
|
|
|
|
-
|
|
|
|
|
-// lip fit for flares
|
|
|
|
|
-lip_fit = 0.15;
|
|
|
|
|
-
|
|
|
|
|
-// clearance from the bottom and top of pcb's to the start of the flare,
|
|
|
|
|
-// this adds space for the protuding molex pins on which we solder
|
|
|
|
|
-pcb_low_clear = 15.0;
|
|
|
|
|
-pcb_hi_clear = 15.0;
|
|
|
|
|
-
|
|
|
|
|
-// depth of slot into which the printed circuit board fits
|
|
|
|
|
-pcb_slot_depth = 1.0;
|
|
|
|
|
-
|
|
|
|
|
-// diameter of four conductor cable
|
|
|
|
|
-cable_diam = 9.5;
|
|
|
|
|
-
|
|
|
|
|
-// lip that mounts flares into main body box
|
|
|
|
|
-mount_lip = 10.0;
|
|
|
|
|
-
|
|
|
|
|
// capsule array mount, height of flare and stalk
|
|
// capsule array mount, height of flare and stalk
|
|
|
flare_height = 50;
|
|
flare_height = 50;
|
|
|
stalk_height = 60;
|
|
stalk_height = 60;
|
|
|
|
|
|
|
|
-// wall thickness
|
|
|
|
|
-wall = 1.0;
|
|
|
|
|
-
|
|
|
|
|
-// back and front clearance of pcb (components and leads)
|
|
|
|
|
-pcb_front = pcb_version == 2 ? 2.50 : 3.00;
|
|
|
|
|
-pcb_back = pcb_version == 2 ? 1.70 : 1.80;
|
|
|
|
|
-
|
|
|
|
|
// calculated minimum "radius" of microphone box
|
|
// calculated minimum "radius" of microphone box
|
|
|
box_radius = pcb_front + (pcb_thickness + pcb_tfit) + pcb_back + 2 * wall;
|
|
box_radius = pcb_front + (pcb_thickness + pcb_tfit) + pcb_back + 2 * wall;
|
|
|
|
|
|
|
@@ -116,39 +49,10 @@ mount_corner = box_radius - pcb_width / 2 + pcb_slot_depth + 4.0;
|
|
|
render_screw_holes = true;
|
|
render_screw_holes = true;
|
|
|
radial_pcb_offset = pcb_version == 2 ? 15.0 : 17.0;
|
|
radial_pcb_offset = pcb_version == 2 ? 15.0 : 17.0;
|
|
|
octa_pcb_mount_height = pcb_length - pcb_low_exp - pcb_hi_exp;
|
|
octa_pcb_mount_height = pcb_length - pcb_low_exp - pcb_hi_exp;
|
|
|
-octa_pcb_radius = radial_pcb_offset + pcb_width/2 + (pcb_version == 2 ? 4.75 : 5) * wall;
|
|
|
|
|
-
|
|
|
|
|
-// body to flares snap joint arm slot width
|
|
|
|
|
-snap_joint_slot_w = 0.75;
|
|
|
|
|
-
|
|
|
|
|
-// width and radius of snap joint hook that locks upper and lower flanges to body
|
|
|
|
|
-snap_joint_hook_w = 5.0;
|
|
|
|
|
-snap_joint_hook_r = 1.4;
|
|
|
|
|
-
|
|
|
|
|
-// dimensions of 12 pin male bottom connector
|
|
|
|
|
-//
|
|
|
|
|
-// Amphenol T 3635 002
|
|
|
|
|
-// 12 pin DIN male to cable, gold plated contacts
|
|
|
|
|
-//
|
|
|
|
|
-// inner diameter of connector core
|
|
|
|
|
-conn_core_diam = 13.00 + 0.2;
|
|
|
|
|
-// outer diameter of connector core sleeve
|
|
|
|
|
-conn_core_o_diam = 17.00;
|
|
|
|
|
-// inner diameter of connector core sleeve
|
|
|
|
|
-conn_core_s_diam = 15.00;
|
|
|
|
|
-
|
|
|
|
|
-// from top of connector to sleeve
|
|
|
|
|
-conn_core_sleeve = 13.00;
|
|
|
|
|
-// from top of connector to holes
|
|
|
|
|
-conn_core_holes_h = 6.00;
|
|
|
|
|
-// between holes
|
|
|
|
|
-conn_core_holes_w = 9.20;
|
|
|
|
|
-// hole diameter
|
|
|
|
|
-conn_core_holes_d = 1.95 + 0.2;
|
|
|
|
|
-// screw head diameter
|
|
|
|
|
-conn_core_screw_d = 2.75 + 0.5;
|
|
|
|
|
-// sleeve overlap
|
|
|
|
|
-conn_core_overlap = 3.00;
|
|
|
|
|
|
|
+octa_pcb_wall = (pcb_version == 2 ? 4.75 : 5) * wall;
|
|
|
|
|
+// windscreen thread offset
|
|
|
|
|
+octa_pcb_thread_offset = (pcb_version == 2 ? -1.82 : 0.0);
|
|
|
|
|
+octa_pcb_radius = radial_pcb_offset + pcb_width/2 + octa_pcb_wall;
|
|
|
|
|
|
|
|
// shock mount parameters
|
|
// shock mount parameters
|
|
|
//
|
|
//
|
|
@@ -175,19 +79,19 @@ ring_arm_gap = 16;
|
|
|
|
|
|
|
|
// the main body that holds the phantom power interfaces
|
|
// the main body that holds the phantom power interfaces
|
|
|
|
|
|
|
|
-module one_pcb_slot (pcb_w, pcb_l, pcb_t, slot_d, front, back, test = false) {
|
|
|
|
|
|
|
+module one_pcb_slot_old (height, pcb_w, pcb_l, pcb_t, pcb_offset, slot_d, front, back, test = false) {
|
|
|
d = pcb_t + front + back;
|
|
d = pcb_t + front + back;
|
|
|
render() translate([-(pcb_w/2 + wall/2), -back, 0]) {
|
|
render() translate([-(pcb_w/2 + wall/2), -back, 0]) {
|
|
|
// make cage with slots for pcb
|
|
// make cage with slots for pcb
|
|
|
difference() {
|
|
difference() {
|
|
|
translate([-2 * wall, 0, 0]) {
|
|
translate([-2 * wall, 0, 0]) {
|
|
|
- cube([pcb_w + 4 * wall, d, pcb_l]);
|
|
|
|
|
|
|
+ cube([pcb_w + 4 * wall, d, height]);
|
|
|
}
|
|
}
|
|
|
translate([slot_d, 0, 0]) {
|
|
translate([slot_d, 0, 0]) {
|
|
|
- cube([pcb_w - 2 * slot_d, pcb_t + front + back, pcb_l]);
|
|
|
|
|
|
|
+ cube([pcb_w - 2 * slot_d, pcb_t + front + back, height]);
|
|
|
}
|
|
}
|
|
|
translate([0, back, 0]) {
|
|
translate([0, back, 0]) {
|
|
|
- cube([pcb_w, pcb_t, pcb_l]);
|
|
|
|
|
|
|
+ cube([pcb_w, pcb_t, height]);
|
|
|
}
|
|
}
|
|
|
// make top and bottom entry channels
|
|
// make top and bottom entry channels
|
|
|
translate([slot_d, back + pcb_t/2, 0]) {
|
|
translate([slot_d, back + pcb_t/2, 0]) {
|
|
@@ -196,20 +100,20 @@ module one_pcb_slot (pcb_w, pcb_l, pcb_t, slot_d, front, back, test = false) {
|
|
|
translate([pcb_w - slot_d, back + pcb_t/2, 0]) {
|
|
translate([pcb_w - slot_d, back + pcb_t/2, 0]) {
|
|
|
rotate([0, 0, 45]) cylinder(r1 = pcb_t * 1.1, r2 = 0, h = 8.0, $fn = 4);
|
|
rotate([0, 0, 45]) cylinder(r1 = pcb_t * 1.1, r2 = 0, h = 8.0, $fn = 4);
|
|
|
}
|
|
}
|
|
|
- translate([slot_d, back + pcb_t/2, pcb_l - 8.0]) {
|
|
|
|
|
|
|
+ translate([slot_d, back + pcb_t/2, height - 8.0]) {
|
|
|
rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
|
}
|
|
}
|
|
|
- translate([pcb_w - slot_d, back + pcb_t/2, pcb_l - 8.0]) {
|
|
|
|
|
|
|
+ translate([pcb_w - slot_d, back + pcb_t/2, height - 8.0]) {
|
|
|
rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
// add spar in the back
|
|
// add spar in the back
|
|
|
translate([-2 * wall, -back + wall, 0]) {
|
|
translate([-2 * wall, -back + wall, 0]) {
|
|
|
- cube([pcb_w + 4 * wall, wall, pcb_l]);
|
|
|
|
|
|
|
+ cube([pcb_w + 4 * wall, wall, height]);
|
|
|
}
|
|
}
|
|
|
// pcb for testing fit
|
|
// pcb for testing fit
|
|
|
if (test) {
|
|
if (test) {
|
|
|
- translate([0, back, 0]) {
|
|
|
|
|
|
|
+ translate([0, back, pcb_offset]) {
|
|
|
cube([pcb_w, pcb_t, pcb_l]);
|
|
cube([pcb_w, pcb_t, pcb_l]);
|
|
|
}
|
|
}
|
|
|
// small electrolytic capacitors (pcb_version == 2)
|
|
// small electrolytic capacitors (pcb_version == 2)
|
|
@@ -238,6 +142,56 @@ module one_pcb_slot (pcb_w, pcb_l, pcb_t, slot_d, front, back, test = false) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// one printed circuit board with space in the back and front
|
|
|
|
|
+
|
|
|
|
|
+module one_pcb_slot (height, pcb_w, pcb_l, pcb_t, pcb_offset, slot_d, front, back, test = false) {
|
|
|
|
|
+ render() translate([-(pcb_w/2 + 0.5), 0, 0]) {
|
|
|
|
|
+ // printed circuit board with space for solder and components
|
|
|
|
|
+ cube([pcb_w, pcb_t, pcb_l]);
|
|
|
|
|
+ // open space in back and front
|
|
|
|
|
+ // tune front and back by hand
|
|
|
|
|
+ translate([slot_d, -2.0, 0]) cube([pcb_w - (2.0 * slot_d), 15, pcb_l]);
|
|
|
|
|
+ // make top and bottom entry channels
|
|
|
|
|
+ translate([slot_d, pcb_t/2, 0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r1 = pcb_t * 1.1, r2 = 0, h = 8.0, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([pcb_w - slot_d, pcb_t/2, 0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r1 = pcb_t * 1.1, r2 = 0, h = 8.0, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([slot_d, pcb_t/2, height - 8.0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([pcb_w - slot_d, pcb_t/2, height - 8.0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r2 = pcb_t * 1.1, r1 = 0, h = 8.0, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// the partition that connects inner and outer sections of body
|
|
|
|
|
+
|
|
|
|
|
+module one_pcb_parts (height, pcb_w, pcb_l, pcb_t, pcb_offset, slot_d, front, back) {
|
|
|
|
|
+ //render() translate([-(pcb_w/2 + wall), -(back + wall), 0]) {
|
|
|
|
|
+ render() translate([-(pcb_w/2 + 0.5), 0, 0]) {
|
|
|
|
|
+ // printed circuit board
|
|
|
|
|
+ translate([0, 0, pcb_offset]) cube([pcb_w, pcb_t, pcb_l]);
|
|
|
|
|
+ // small electrolytic capacitors (pcb_version == 2)
|
|
|
|
|
+ // https://www.mouser.com/datasheet/2/293/e-umw-1219455.pdf
|
|
|
|
|
+ cap_diam = 8.0;
|
|
|
|
|
+ // should be 5, but transistors are a bit taller;
|
|
|
|
|
+ cap_len = 6.0;
|
|
|
|
|
+ translate([pcb_w/2, cap_len + pcb_t, 6]) {
|
|
|
|
|
+ rotate([90, 0, 0]) cylinder(r = (cap_diam/2), h = cap_len, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ // film capacitors
|
|
|
|
|
+ cap_h = 12;
|
|
|
|
|
+ cap_w = 9;
|
|
|
|
|
+ cap_t = 5.5;
|
|
|
|
|
+ translate([pcb_w/2 - cap_w/2, pcb_t, 10]) {
|
|
|
|
|
+ cube([cap_w, cap_t, cap_h]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
module rounded_octagon(height, radius) {
|
|
module rounded_octagon(height, radius) {
|
|
|
intersection() {
|
|
intersection() {
|
|
|
cylinder(r = radius, h = height, $fn = 8);
|
|
cylinder(r = radius, h = height, $fn = 8);
|
|
@@ -252,9 +206,13 @@ module rounded_octagon_wall(height, radius, wall) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-octa_pcb_twist = pcb_version == 2 ? 12 : 16;
|
|
|
|
|
|
|
+// twist angle to optimize space usage inside body
|
|
|
|
|
+//octa_pcb_twist = pcb_version == 2 ? 12 : 16;
|
|
|
|
|
+octa_pcb_twist = pcb_version == 2 ? 13.5 : 16;
|
|
|
|
|
+// tilt angle to clear upper flare thread
|
|
|
|
|
+octa_pcb_tilt = pcb_version == 2 ? -0.7 : 0.0;
|
|
|
|
|
|
|
|
-module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
|
|
|
|
|
|
|
+module octa_mount_body_old(height, radius, lower_lip, upper_lip, clear) {
|
|
|
// rotate pcb assembly so it does not interfere with the screws
|
|
// rotate pcb assembly so it does not interfere with the screws
|
|
|
offset_angle = -octa_pcb_twist;
|
|
offset_angle = -octa_pcb_twist;
|
|
|
// rotate individual pcb's to better use the internal space of the body
|
|
// rotate individual pcb's to better use the internal space of the body
|
|
@@ -267,10 +225,10 @@ module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
|
|
|
rounded_octagon_wall(height, radius, 2 * wall);
|
|
rounded_octagon_wall(height, radius, 2 * wall);
|
|
|
// slots for printed circuit boards
|
|
// slots for printed circuit boards
|
|
|
intersection() {
|
|
intersection() {
|
|
|
- for (r = [0:360/8:360]) rotate([0, 0, r + offset_angle]) {
|
|
|
|
|
|
|
+ for (r = [0:360/8:360]) rotate([0, octa_pcb_tilt, r + offset_angle]) {
|
|
|
translate([radial_pcb_offset, 0, 0]) {
|
|
translate([radial_pcb_offset, 0, 0]) {
|
|
|
rotate([0, 0, 180 + twist_angle]) {
|
|
rotate([0, 0, 180 + twist_angle]) {
|
|
|
- one_pcb_slot(pcb_width + pcb_fit, height * 2/3, pcb_thickness + pcb_tfit,
|
|
|
|
|
|
|
+ one_pcb_slot(height * 2/3, pcb_width + pcb_fit, pcb_length, pcb_thickness + pcb_tfit, -10,
|
|
|
pcb_slot_depth, pcb_front, pcb_back, false);
|
|
pcb_slot_depth, pcb_front, pcb_back, false);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -316,6 +274,87 @@ module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
|
|
|
|
|
+ // rotate pcb assembly so it does not interfere with the screws
|
|
|
|
|
+ offset_angle = -octa_pcb_twist;
|
|
|
|
|
+ // rotate individual pcb's to better use the internal space of the body
|
|
|
|
|
+ twist_angle = octa_pcb_twist;
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ union() {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ union() {
|
|
|
|
|
+ // main body
|
|
|
|
|
+ rounded_octagon_wall(height, radius, 2 * wall);
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ // fill the inside of the body
|
|
|
|
|
+ translate([0, 0, -1]) rounded_octagon(height * 2/3, radius);
|
|
|
|
|
+ // remove everything else
|
|
|
|
|
+ union() {
|
|
|
|
|
+ translate([0, 0, -1]) for (r = [0:360/8:360]) rotate([0, octa_pcb_tilt, r + offset_angle]) {
|
|
|
|
|
+ translate([radial_pcb_offset, 0, 0]) {
|
|
|
|
|
+ rotate([0, 0, 180 + twist_angle]) {
|
|
|
|
|
+ one_pcb_slot(height * 2/3, pcb_width + pcb_fit, pcb_length, pcb_thickness + pcb_tfit, -10,
|
|
|
|
|
+ pcb_slot_depth, pcb_front, pcb_back);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // make center hole
|
|
|
|
|
+ cylinder(r = 6.0, h = height, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([0, 0, -1]) for (r = [0:360/8:360]) rotate([0, octa_pcb_tilt, r + offset_angle]) {
|
|
|
|
|
+ translate([radial_pcb_offset, 0, 0]) {
|
|
|
|
|
+ rotate([0, 0, 180 + twist_angle]) {
|
|
|
|
|
+ // add wall that connects core with outer shell
|
|
|
|
|
+ translate([-(pcb_width/2 + 2 * wall), -(wall + pcb_back), 0]) {
|
|
|
|
|
+ cube([pcb_width + 2 * wall, wall, height * 2/3]);
|
|
|
|
|
+ }
|
|
|
|
|
+ // add components if we are testing for fit
|
|
|
|
|
+ *one_pcb_parts(height * 2/3, pcb_width + pcb_fit, pcb_length, pcb_thickness + pcb_tfit, -10,
|
|
|
|
|
+ pcb_slot_depth, pcb_front, pcb_back);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // clip inside of body below body (we need this because of pcb tilt)
|
|
|
|
|
+ translate([0, 0, -2.0]) rounded_octagon(2.0, radius);
|
|
|
|
|
+ // upper lip for flare to microphone
|
|
|
|
|
+ translate([0, 0, height - upper_lip]) {
|
|
|
|
|
+ rounded_octagon_wall(upper_lip, radius, wall + lip_fit);
|
|
|
|
|
+ }
|
|
|
|
|
+ // lower lip for flare to cable or connector
|
|
|
|
|
+ translate([0, 0, 0]) {
|
|
|
|
|
+ rounded_octagon_wall(upper_lip, radius, wall + lip_fit);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (render_screw_holes) {
|
|
|
|
|
+ // add backplates for upper lip screws
|
|
|
|
|
+ for (r = [45, 135, 225, 315]) {
|
|
|
|
|
+ rotate([0, 0, r]) translate([-(radius - 3 * wall), -2.5, 0]) {
|
|
|
|
|
+ cube([2, 5, height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (render_screw_holes) {
|
|
|
|
|
+ // make eight holes in the the body for screws that hold both flares
|
|
|
|
|
+ // (number 0 size, 1/4" long = thread diameter: 1.6mm, head diameter: 2.75)
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ for (z = [lower_lip/2, height - upper_lip/2]) {
|
|
|
|
|
+ for (r = [45, 135, 225, 315]) {
|
|
|
|
|
+ rotate([0, 0, r]) translate([-(radius + 2 * wall), 0, z]) {
|
|
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
|
|
+ cylinder(r = 0.7, h = radius + wall, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ cylinder(r = radius/2, h = height);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// flare from the body to the microphone stalk
|
|
// flare from the body to the microphone stalk
|
|
|
|
|
|
|
|
module octa_mount_flare_no_ws(height, lip, transition, radius, top_radius, stalk_height, dot) {
|
|
module octa_mount_flare_no_ws(height, lip, transition, radius, top_radius, stalk_height, dot) {
|
|
@@ -537,13 +576,55 @@ module octa_mount_flare_old(height, lip, transition, radius, top_radius, stalk_h
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// stalk from flare to capsule array mount
|
|
|
|
|
+
|
|
|
|
|
+module octa_mount_stalk(height, lip, transition, radius, top_radius, stalk_height, dot) {
|
|
|
|
|
+ translate([0, 0, height + transition]) {
|
|
|
|
|
+ translate ([0, 0, -10.0]) difference() {
|
|
|
|
|
+ cylinder(r = top_radius, h = stalk_height + 10.0, $fn = facets);
|
|
|
|
|
+ cylinder(r = top_radius - wall, h = stalk_height + 10.0, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ // close stalk and add holes for cables
|
|
|
|
|
+ translate([0, 0, stalk_height - top_radius - wall]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(r = top_radius - wall, h = top_radius + wall, $fn = facets);
|
|
|
|
|
+ translate([0, 0, 0]) {
|
|
|
|
|
+ sphere(r = top_radius - wall, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ wire_diam = mic_wire_diam + mic_wire_fit;
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) rotate([0, 0, r]) {
|
|
|
|
|
+ for (t = [0, 1]) {
|
|
|
|
|
+ rotate([0, 0, 45 * t]) translate([top_radius - wire_diam - t * wire_diam * 2/3, 0, wall]) {
|
|
|
|
|
+ cylinder(r = wire_diam / 2, h = top_radius * 2, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([0, 0, wall]) cylinder(r = wire_diam, h = top_radius * 2, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // add flange for coupling into flare
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(r2 = top_radius, r1 = top_radius + wall, h = 10.0, $fn = facets);
|
|
|
|
|
+ cylinder(r2 = top_radius - wall, r1 = top_radius, h = 10.0, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([top_radius, 0, -10.0]) {
|
|
|
|
|
+ // add key to stalk so orientation is always correct
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(r = 0.4, h = 10.0, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// flare from body to capsule array stalk
|
|
|
|
|
+
|
|
|
module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_height, dot) {
|
|
module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_height, dot) {
|
|
|
// transition from bottom box to windscreen mounting thread
|
|
// transition from bottom box to windscreen mounting thread
|
|
|
transition_to_threads = 5;
|
|
transition_to_threads = 5;
|
|
|
// bottom box
|
|
// bottom box
|
|
|
difference() {
|
|
difference() {
|
|
|
union() {
|
|
union() {
|
|
|
- rounded_octagon_wall(height, radius, 2 * wall);
|
|
|
|
|
|
|
+ rounded_octagon_wall(height - windscreen_thread_height, radius, 2 * wall);
|
|
|
if (render_screw_holes) {
|
|
if (render_screw_holes) {
|
|
|
// small pedestals for the screws that attach the flare to the body
|
|
// small pedestals for the screws that attach the flare to the body
|
|
|
// (number 0 size, 1/4" long = thread diameter: 1.6mm, head diameter: 2.75)
|
|
// (number 0 size, 1/4" long = thread diameter: 1.6mm, head diameter: 2.75)
|
|
@@ -557,13 +638,14 @@ module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_heigh
|
|
|
}
|
|
}
|
|
|
// indicator of "front" of microphone
|
|
// indicator of "front" of microphone
|
|
|
rotate([0, 0, 180 + 22.5]) translate([radius - 2, 0, 0]) {
|
|
rotate([0, 0, 180 + 22.5]) translate([radius - 2, 0, 0]) {
|
|
|
- cylinder(r = 1.0, h = lip/2, $fn = facets);
|
|
|
|
|
|
|
+ cylinder(r = 1.0, h = lip/3, $fn = facets);
|
|
|
}
|
|
}
|
|
|
// stops for shock mount
|
|
// stops for shock mount
|
|
|
for (r = [0, 90, 180, 270]) rotate([0, 0, r - 22.5]) {
|
|
for (r = [0, 90, 180, 270]) rotate([0, 0, r - 22.5]) {
|
|
|
translate([radius - 3.4, 0, 0]) scale([2.0, 1.0, 1.0]) {
|
|
translate([radius - 3.4, 0, 0]) scale([2.0, 1.0, 1.0]) {
|
|
|
difference() {
|
|
difference() {
|
|
|
- cylinder(r = 2.0, h = lip + transition_to_threads, $fn = facets);
|
|
|
|
|
|
|
+ // cylinder(r = 2.0, h = lip + transition_to_threads, $fn = facets);
|
|
|
|
|
+ cylinder(r = 2.0, h = 5.0, $fn = facets);
|
|
|
translate([-2, -2.0, 0]) cube([2.0, 4.0, lip + transition_to_threads]);
|
|
translate([-2, -2.0, 0]) cube([2.0, 4.0, lip + transition_to_threads]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -592,28 +674,16 @@ module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_heigh
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- // flare to windscreen threads
|
|
|
|
|
- translate([0, 0, height - windscreen_thread_height - transition_to_threads]) {
|
|
|
|
|
- difference() {
|
|
|
|
|
- hull() {
|
|
|
|
|
- rounded_octagon(thin_mint, radius);
|
|
|
|
|
- translate([0, 0, transition_to_threads]) {
|
|
|
|
|
- cylinder(r = windscreen_thread_radius + 0.5, h = thin_mint, $fn = facets);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- hull() {
|
|
|
|
|
- rounded_octagon(thin_mint, radius - wall);
|
|
|
|
|
- translate([0, 0, transition_to_threads]) {
|
|
|
|
|
- cylinder(r = windscreen_thread_radius - windscreen_thread_depth - wall, h = thin_mint, $fn = facets);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
// windscreen mounting threads
|
|
// windscreen mounting threads
|
|
|
translate([0, 0, height - windscreen_thread_height]) difference() {
|
|
translate([0, 0, height - windscreen_thread_height]) difference() {
|
|
|
metric_thread(diameter = windscreen_thread_radius * 2, pitch = windscreen_thread_pitch,
|
|
metric_thread(diameter = windscreen_thread_radius * 2, pitch = windscreen_thread_pitch,
|
|
|
length = windscreen_thread_height, angle = windscreen_thread_angle, internal = false);
|
|
length = windscreen_thread_height, angle = windscreen_thread_angle, internal = false);
|
|
|
cylinder(r = windscreen_thread_radius - wall - windscreen_thread_depth, h = windscreen_thread_height + thin_mint, $fn = facets);
|
|
cylinder(r = windscreen_thread_radius - wall - windscreen_thread_depth, h = windscreen_thread_height + thin_mint, $fn = facets);
|
|
|
|
|
+ // clip thread tips
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(r = windscreen_thread_radius + wall, h = windscreen_thread_height + thin_mint, $fn = facets);
|
|
|
|
|
+ cylinder(r = windscreen_thread_radius - windscreen_thread_depth * 0.3, h = windscreen_thread_height + thin_mint, $fn = facets);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
// flare to stalk
|
|
// flare to stalk
|
|
|
translate([0, 0, height - 1.5]) {
|
|
translate([0, 0, height - 1.5]) {
|
|
@@ -647,7 +717,7 @@ module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_heigh
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// flares from the body to a dual cable housing
|
|
|
|
|
|
|
+// flare from the body to a dual cable housing
|
|
|
|
|
|
|
|
module octa_mount_flare_dual(height, lip, transition, xradius, yradius, corner, top_radius, stalk_height) {
|
|
module octa_mount_flare_dual(height, lip, transition, xradius, yradius, corner, top_radius, stalk_height) {
|
|
|
// hack to get it to render, fix problem in rounded_block when radius is equal to corner...
|
|
// hack to get it to render, fix problem in rounded_block when radius is equal to corner...
|
|
@@ -1016,7 +1086,6 @@ module octa_shock_mount_band(band_height, radius, delta_radius) {
|
|
|
// shock mount internal ring
|
|
// shock mount internal ring
|
|
|
|
|
|
|
|
module octa_shock_mount_internal_ring(height, radius, band_height, corner) {
|
|
module octa_shock_mount_internal_ring(height, radius, band_height, corner) {
|
|
|
- echo(radius);
|
|
|
|
|
delta_radius = pcb_version == 2 ? 7.5 : 6;
|
|
delta_radius = pcb_version == 2 ? 7.5 : 6;
|
|
|
// octagonal band
|
|
// octagonal band
|
|
|
octa_shock_mount_band(band_height, radius, delta_radius);
|
|
octa_shock_mount_band(band_height, radius, delta_radius);
|
|
@@ -1050,9 +1119,106 @@ module octa_shock_mount_internal_ring(height, radius, band_height, corner) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// shock mount sleeve, slips over microphone body and has hooks for the elastic bands
|
|
|
|
|
+
|
|
|
|
|
+module elastic_band_hook (slot_r = 1.1) {
|
|
|
|
|
+ hook_l = 6.0;
|
|
|
|
|
+ translate([slot_r, hook_l/2, 0]) {
|
|
|
|
|
+ rotate([90, 0, 0]) scale([1, 2.2, 1]) cylinder(r = slot_r, h = hook_l, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module octa_shock_mount_sleeve(radius, height, hooks = true, logo = true) {
|
|
|
|
|
+ // gap between body and sleeve
|
|
|
|
|
+ gap = internal_ring_gap + 0;
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ // fit gap for slide tubes
|
|
|
|
|
+ sgap = 0.2;
|
|
|
|
|
+ stop_ro = 2.0 + 2 * wall + sgap;
|
|
|
|
|
+ union() {
|
|
|
|
|
+ // sleeve
|
|
|
|
|
+ rotate([0, 0, 22.5]) rounded_octagon_wall(height, radius + 2 * wall + gap, 2 * wall);
|
|
|
|
|
+ // tubes for stops
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) {
|
|
|
|
|
+ rotate([0, 0, r + 45]) {
|
|
|
|
|
+ translate([radius - 2 * wall + gap, 0, 0]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ scale([1, 1.4, 1]) cylinder(r = stop_ro, h = height, $fn = facets);
|
|
|
|
|
+ translate([-2 * stop_ro, -2 * stop_ro, 0]) {
|
|
|
|
|
+ cube([2 * stop_ro, 4 * stop_ro, height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // pillars for elastic band hooks
|
|
|
|
|
+ if (hooks) {
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
|
|
|
|
|
+ pill_r = 2.5;
|
|
|
|
|
+ translate([radius + stop_ro + gap - 2 * wall, 0, 0]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ scale([2, 1, 1]) cylinder(r = pill_r, h = height, $fn = facets);
|
|
|
|
|
+ translate([-7 * wall, -pill_r, 0]) cube([6 * wall, pill_r * 2, height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // add ccrma logo
|
|
|
|
|
+ if (logo) {
|
|
|
|
|
+ rotate([0, 0, 90]) {
|
|
|
|
|
+ translate([0, -(radius - (pcb_version == 2 ? gap + 1.4 : 0) + 2 * wall),
|
|
|
|
|
+ height / 2]) {
|
|
|
|
|
+ rotate([90, 270, 0]) {
|
|
|
|
|
+ logo_scale = 1 / (pcb_version == 2 ? 3.0 : 2.4);
|
|
|
|
|
+ scale([logo_scale, logo_scale, 1.0]) {
|
|
|
|
|
+ ccrma_logo(1.65);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // slots for stops and screws
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) {
|
|
|
|
|
+ // stops
|
|
|
|
|
+ stop_r = 2.0 + sgap;
|
|
|
|
|
+ rotate([0, 0, r + 45]) {
|
|
|
|
|
+ translate([radius - 2 * wall + gap, 0, 0]) {
|
|
|
|
|
+ // there is a little bit of play between the wd assembly and the top
|
|
|
|
|
+ ws_play = 0.4;
|
|
|
|
|
+ cylinder(r = stop_r, h = height - 10.0 - ws_play, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // screws
|
|
|
|
|
+ screw_h = 1.3;
|
|
|
|
|
+ rotate([0, 0, r + 22.5]) {
|
|
|
|
|
+ translate([radius - 1.5 * wall + gap, -3.5/2, 0]) {
|
|
|
|
|
+ cube([screw_h + sgap, 3.5, height - 8]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // slot for front mark
|
|
|
|
|
+ translate([radius - 2 * wall, 0, 0]) cylinder(r = 1.5, h = height, $fn = facets);
|
|
|
|
|
+ // shave channel for logo
|
|
|
|
|
+ translate([radius - 2 * wall, -10/2, 0]) cube([wall/3, 10, height]);
|
|
|
|
|
+ // upper elastic band hooks
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
|
|
|
|
|
+ translate([radius + stop_ro + gap - 2*wall, 0, height - 1.6]) {
|
|
|
|
|
+ elastic_band_hook();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // lower elastic band hooks
|
|
|
|
|
+ for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
|
|
|
|
|
+ translate([radius + stop_ro + gap - 2*wall, 0, 1.6]) {
|
|
|
|
|
+ rotate([180, 0, 0]) elastic_band_hook();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// shock mount external ring
|
|
// shock mount external ring
|
|
|
|
|
|
|
|
-module octa_shock_mount_external_ring(height, radius, corner) {
|
|
|
|
|
|
|
+module octa_shock_mount_external_ring_old(height, radius, corner) {
|
|
|
// main ring
|
|
// main ring
|
|
|
rotate([0, 0, 22.5]) rounded_octagon_wall(ring_ext_height, radius, ring_wall);
|
|
rotate([0, 0, 22.5]) rounded_octagon_wall(ring_ext_height, radius, ring_wall);
|
|
|
for (rot = [0, 90, 180, 270]) {
|
|
for (rot = [0, 90, 180, 270]) {
|
|
@@ -1104,6 +1270,60 @@ module octa_shock_mount_external_ring(height, radius, corner) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+module octa_shock_mount_external_ring(height, radius, corner) {
|
|
|
|
|
+ // main ring
|
|
|
|
|
+ rotate([0, 0, 22.5]) rounded_octagon_wall(ring_ext_height, radius, ring_wall);
|
|
|
|
|
+ for (m = [0, 1]) mirror([0, m, 0]) {
|
|
|
|
|
+ for (rot = [0, 90, 180, 270]) {
|
|
|
|
|
+ // anchors for rubber bands
|
|
|
|
|
+ rotate([0, 0, rot + 20]) {
|
|
|
|
|
+ translate([radius * cos(22.5) + ring_wall + 2.0, -5, 0]) {
|
|
|
|
|
+ minkowski() {
|
|
|
|
|
+ cube([4 - 3, 6, ring_ext_height]);
|
|
|
|
|
+ cylinder(r = 1.0, h = thin_mint, $fn = facets);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([radius * cos(22.5), -2, 0]) {
|
|
|
|
|
+ cube([7, 4, ring_ext_height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // connection to hub
|
|
|
|
|
+ translate([radius * cos(22.5), -2, 0]) {
|
|
|
|
|
+ cube([10, 4, ring_ext_height * 2]);
|
|
|
|
|
+ }
|
|
|
|
|
+ // reinforce connection to ring
|
|
|
|
|
+ intersection() {
|
|
|
|
|
+ translate([radius * cos(22.5), 0, 0]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(r = 6, h = ring_ext_height * 2, $fn = 4);
|
|
|
|
|
+ translate([-10, -5, 0]) {
|
|
|
|
|
+ cube([10, 10, ring_ext_height * 2]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([radius + ring_wall - 7, 0, 0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r1 = radius * 1.5, r2 = ring_wall/2 + 1, h = ring_ext_height * 2, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // reinforcement
|
|
|
|
|
+ intersection() {
|
|
|
|
|
+ rotate([0, 0, 22.5]) rounded_octagon_wall(ring_ext_height * 2, radius, ring_wall);
|
|
|
|
|
+ translate([radius - 6.5, 0, 0]) {
|
|
|
|
|
+ rotate([0, 0, 45]) cylinder(r1 = radius * 1.5, r2 = ring_wall/2 + 1, h = ring_ext_height * 2, $fn = 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // rotating mount
|
|
|
|
|
+ o_rad = 8;
|
|
|
|
|
+ i_rad = 3;
|
|
|
|
|
+ rotate([0, 90, -90]) {
|
|
|
|
|
+ translate([-o_rad, radius * cos(22.5) + o_rad + ring_wall * 2, -2]) {
|
|
|
|
|
+ shock_mount_ring(o_rad, i_rad, ring_wall);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
// stand mount with quick clip connector
|
|
// stand mount with quick clip connector
|
|
|
|
|
|
|
@@ -1136,46 +1356,6 @@ module octa_quik_release_stand_mount(band_height, radius) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// mount pillars that plug into robotic arm sockets
|
|
|
|
|
-
|
|
|
|
|
-module sphear_arm_mount_pillars(radius, height, grip_sep, grip_width) {
|
|
|
|
|
- // pillars for arm grips
|
|
|
|
|
- m_r = 1.0;
|
|
|
|
|
- for (m = [0, 1]) mirror([m, 0, 0]) translate([radius + 3 * wall + m_r, - grip_width/2 + m_r, 0]) {
|
|
|
|
|
- minkowski() {
|
|
|
|
|
- cube([5 - 2*m_r, grip_width - 2*m_r, height]);
|
|
|
|
|
- cylinder(r = m_r, h = thin_mint, $fn = 32);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- // transition
|
|
|
|
|
- tran_h = 30.0;
|
|
|
|
|
- for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
- hull() {
|
|
|
|
|
- translate([radius + 3 * wall + m_r, -grip_width/2 + m_r, height]) {
|
|
|
|
|
- minkowski() {
|
|
|
|
|
- cube([5 - 2 * m_r, grip_width - 2 * m_r, thin_mint]);
|
|
|
|
|
- cylinder(r = m_r, h = thin_mint, $fn = 32);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- translate([grip_sep - wall + m_r, -(arm_w + 2 * fit + 2 * wall)/2 + m_r, height + tran_h]) {
|
|
|
|
|
- minkowski() {
|
|
|
|
|
- cube([arm_l - 2 * fit + 2 * wall - 2 * m_r, arm_w - 2 * fit + 2 * wall - 2 * m_r, thin_mint]);
|
|
|
|
|
- cylinder(r = m_r, h = thin_mint, $fn = 32);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- // grip pillar, plugs into slots
|
|
|
|
|
- for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
- translate([grip_sep + m_r, -(arm_w + 2 * fit)/2 + m_r, height + tran_h]) {
|
|
|
|
|
- minkowski() {
|
|
|
|
|
- cube([arm_l - 2 * fit - 2 * m_r, arm_w - 2 * fit - 2 * m_r, 20 - 3.0]);
|
|
|
|
|
- cylinder(r = m_r, h = thin_mint, $fn = 32);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
// octathingy arm mount for robotic arm
|
|
// octathingy arm mount for robotic arm
|
|
|
|
|
|
|
|
module octa_arm_mount(band_height, radius, height) {
|
|
module octa_arm_mount(band_height, radius, height) {
|
|
@@ -1184,26 +1364,36 @@ module octa_arm_mount(band_height, radius, height) {
|
|
|
// octagonal band
|
|
// octagonal band
|
|
|
octa_shock_mount_band(band_height, radius, pcb_version == 2 ? 7.5 : 6);
|
|
octa_shock_mount_band(band_height, radius, pcb_version == 2 ? 7.5 : 6);
|
|
|
// pillars for arm grips
|
|
// pillars for arm grips
|
|
|
- //
|
|
|
|
|
- // this separation between pillars comes from original arm gripper (it
|
|
|
|
|
- // could be something else now), this should be move to a common parameter
|
|
|
|
|
- grip_sep = 25.4 * 1.5 / 2;
|
|
|
|
|
- grip_width = 15.0;
|
|
|
|
|
sphear_arm_mount_pillars(radius, height - 50.0, grip_sep, grip_width);
|
|
sphear_arm_mount_pillars(radius, height - 50.0, grip_sep, grip_width);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+module octa_arm_mount_pillars(band_height, radius, height, grip_width, grip_depth) {
|
|
|
|
|
+ vertical_offset = 18;
|
|
|
|
|
+ mount_offset = 3.0;
|
|
|
|
|
+ // pillars for arm grips
|
|
|
|
|
+ sphear_arm_mount_pillars(radius, height - 60.0, grip_sep, grip_width, grip_depth);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
////
|
|
////
|
|
|
//// render all the different parts
|
|
//// render all the different parts
|
|
|
////
|
|
////
|
|
|
|
|
|
|
|
|
|
+// microphone body: stalk from capsule flare to capsule array (for microphone version 1)
|
|
|
|
|
+//
|
|
|
|
|
+module render_octa_capsule_stalk(z_offset) {
|
|
|
|
|
+ translate([0, 0, z_offset]) {
|
|
|
|
|
+ octa_mount_stalk(pcb_hi_clear + pcb_hi_exp, mount_lip, flare_height, octa_pcb_radius, mount_radius + wall, stalk_height, 1);
|
|
|
|
|
+ translate([0, 0, pcb_hi_clear + pcb_hi_exp + flare_height + stalk_height]) {
|
|
|
|
|
+ octa_capsule_array_mount([45, 135, -45, -135]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// microphone body: flare to capsule array (slips into PCB holder body)
|
|
// microphone body: flare to capsule array (slips into PCB holder body)
|
|
|
//
|
|
//
|
|
|
module render_octa_capsule_flare(z_offset) {
|
|
module render_octa_capsule_flare(z_offset) {
|
|
|
translate([0, 0, z_offset]) {
|
|
translate([0, 0, z_offset]) {
|
|
|
octa_mount_flare(pcb_hi_clear + pcb_hi_exp, mount_lip, flare_height, octa_pcb_radius, mount_radius + wall, stalk_height, 1);
|
|
octa_mount_flare(pcb_hi_clear + pcb_hi_exp, mount_lip, flare_height, octa_pcb_radius, mount_radius + wall, stalk_height, 1);
|
|
|
- *translate([0, 0, pcb_hi_clear + pcb_hi_exp + flare_height + stalk_height]) {
|
|
|
|
|
- octa_capsule_array_mount([45, 135, -45, -135]);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1300,8 +1490,9 @@ module render_octa_body(z_offset, spread, showint) {
|
|
|
module render_octa_microphone(z_offset, spread) {
|
|
module render_octa_microphone(z_offset, spread) {
|
|
|
render_octa_body(z_offset, spread);
|
|
render_octa_body(z_offset, spread);
|
|
|
lippy = spread - mount_lip;
|
|
lippy = spread - mount_lip;
|
|
|
- *render_octa_capsule_array(z_offset + octa_pcb_mount_height + mount_top_height +
|
|
|
|
|
|
|
+ render_octa_capsule_array(z_offset + octa_pcb_mount_height + mount_top_height +
|
|
|
flare_height + stalk_height + pcb_hi_clear + pcb_hi_exp + 2 * lippy + spread + mic_radius);
|
|
flare_height + stalk_height + pcb_hi_clear + pcb_hi_exp + 2 * lippy + spread + mic_radius);
|
|
|
|
|
+ render_octa_capsule_stalk(z_offset + (pcb_version == 2 ? 43.2 : 49.2) - 10.0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// microphone: render the full assembly with vertical separation between components
|
|
// microphone: render the full assembly with vertical separation between components
|