Parcourir la source

octathingy: many changes tuning for design for version 2 of printed circuit board, add new version of octa_mount_flare without stalk (still needs to be merged with old version to support pcb version 1), add first try at mount for robotic arm measurement rig

Fernando Pablo Lopez-Lezcano il y a 8 ans
Parent
commit
394d8d6692
2 fichiers modifiés avec 184 ajouts et 25 suppressions
  1. 184 25
      Octathingy_mount_pcb.scad
  2. BIN
      pcb/zapnspark/zapnspark_parts_list.ods

+ 184 - 25
Octathingy_mount_pcb.scad

@@ -8,7 +8,7 @@
 // by Eric Benjamin, Audio Engineering Society Convention Paper 8728, 
 // October 2012, San Francisco
 //
-// Copyright 2015-2017, Fernando Lopez-Lezcano, All Rights Reserved
+// Copyright 2015-2018, Fernando Lopez-Lezcano, All Rights Reserved
 // nando@ccrma.stanford.edu
 //
 //  This program is free software: you can redistribute it and/or modify
@@ -104,7 +104,7 @@ 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.50 : 1.80;
+pcb_back = pcb_version == 2 ? 1.70 : 1.80;
 
 // calculated minimum "radius" of microphone box
 box_radius = pcb_front + (pcb_thickness + pcb_tfit) + pcb_back + 2 * wall;
@@ -116,7 +116,7 @@ mount_corner = box_radius - pcb_width / 2 + pcb_slot_depth + 4.0;
 render_screw_holes = true;
 radial_pcb_offset = pcb_version == 2 ? 15.0 : 17.0;
 octa_pcb_mount_height = pcb_length - pcb_low_exp - pcb_hi_exp;
-octa_pcb_radius = radial_pcb_offset + pcb_width/2 + 5 * wall;
+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;
@@ -252,7 +252,7 @@ module rounded_octagon_wall(height, radius, wall) {
     }
 }
 
-octa_pcb_twist = pcb_version == 2 ? 19 : 16;
+octa_pcb_twist = pcb_version == 2 ? 12 : 16;
 
 module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
     // rotate pcb assembly so it does not interfere with the screws
@@ -271,7 +271,7 @@ module octa_mount_body(height, radius, lower_lip, upper_lip, clear) {
                             translate([radial_pcb_offset, 0, 0]) {
                                 rotate([0, 0, 180 + twist_angle]) {
                                     one_pcb_slot(pcb_width + pcb_fit, height * 2/3, pcb_thickness + pcb_tfit, 
-                                        pcb_slot_depth, pcb_front, pcb_back, true);
+                                        pcb_slot_depth, pcb_front, pcb_back, false);
                                 }
                             }
                         }
@@ -415,7 +415,7 @@ module octa_mount_flare_no_ws(height, lip, transition, radius, top_radius, stalk
     }
 }
 
-module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_height, dot) {
+module octa_mount_flare_old(height, lip, transition, radius, top_radius, stalk_height, dot) {
     // transition from bottom box to windscreen mounting thread
     transition_to_threads = 5;
     // bottom box
@@ -537,6 +537,116 @@ module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_heigh
     }
 }
 
+module octa_mount_flare(height, lip, transition, radius, top_radius, stalk_height, dot) {
+    // transition from bottom box to windscreen mounting thread
+    transition_to_threads = 5;
+    // bottom box
+    difference() {
+        union() {
+            rounded_octagon_wall(height, radius, 2 * wall);
+            if (render_screw_holes) {
+                // 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)
+                for (r = [45, 135, 225, 315]) rotate([0, 0, r]) {
+                    translate([radius - wall - 1.75, 0, lip/2]) {
+                        rotate([0, 90, 0]) {
+                            cylinder(r = 1.5, h = 2 * wall, $fn = facets);
+                        }
+                    }
+                }
+            }
+            // indicator of "front" of microphone
+            rotate([0, 0, 180 + 22.5]) translate([radius - 2, 0, 0]) {
+                cylinder(r = 1.0, h = lip/2, $fn = facets);
+            }
+            // stops for shock mount
+            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]) {
+                    difference() {
+                        cylinder(r = 2.0, h = lip + transition_to_threads, $fn = facets);
+                        translate([-2, -2.0, 0]) cube([2.0, 4.0, lip + transition_to_threads]);
+                    }
+                }
+            }
+        }
+        // flange to mount on body
+        rounded_octagon_wall(lip + 1.00, radius - wall, wall);
+        // and make a smooth transition to avoid overhangs
+        translate([0, 0, lip + 1.00]) {
+            hull() {
+                rounded_octagon_wall(thin_mint, radius - wall, wall);
+                translate([0, 0, 1.0]) {
+                    rounded_octagon_wall(thin_mint, radius - 2 * wall, wall);
+                }
+            }
+        }
+        if (render_screw_holes) {
+            // holes for screws that attach the flare to the body
+            // Number 0 Size, 1/4" Long = thread diameter: 1.6mm, head diameter: 2.75
+            for (r = [45, 135, 225, 315]) rotate([0, 0, r]) {
+                translate([radius/2, 0, lip/2]) {
+                    rotate([0, 90, 0]) {
+                        cylinder(r = (1.6 + 0.1)/2, h = radius, $fn = facets);
+                    }
+                }
+            }
+        }
+    }
+    // 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
+    translate([0, 0, height - windscreen_thread_height]) difference() {
+        metric_thread(diameter = windscreen_thread_radius * 2, pitch = windscreen_thread_pitch,
+            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);
+    }
+    // flare to stalk
+    translate([0, 0, height - 1.5]) {
+        difference() {
+            cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth,
+                r2 = top_radius + wall + fit, h = transition + 1.5, $fn = facets);
+            cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth - wall,
+                r2 = top_radius + fit, h = transition + 1.5, $fn = facets);
+        }
+    }
+    // socket for stalk
+    s_length = 10.0;
+    translate([0, 0, height + transition - s_length]) {
+        difference() {
+            cylinder(r = top_radius + wall + fit, h = s_length, $fn = facets);
+            cylinder(r = top_radius + fit, h = s_length, $fn = facets);
+            // add key slot for orientation
+            translate([top_radius, 0, -1]) {
+                cylinder(r = 0.4, h = s_length + 2, $fn = facets);
+            }
+        }
+    }
+    // internal flare for stalk
+    translate([0, 0, height - 1.5]) {
+        difference() {
+            cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth,
+                r2 = top_radius + wall + fit, h = transition + 1.5 - s_length, $fn = facets);
+            cylinder(r1 = windscreen_thread_radius - windscreen_thread_depth - wall,
+                r2 = top_radius + fit, h = transition + 1.5 - s_length, $fn = facets);
+        }
+    }
+}
+
 // flares from the body to a dual cable housing
 
 module octa_mount_flare_dual(height, lip, transition, xradius, yradius, corner, top_radius, stalk_height) {
@@ -737,7 +847,7 @@ module octa_mount_flare_dsub(height, lip, transition, radius, top_xradius, top_y
         }
     }
     // flare to db25 connector mounting plate
-    expand = 3;
+    expand = pcb_version == 2 ? 1 : 3;
     // height of connector
     guard_height = 9.525;
     // thickness of db25 plate
@@ -747,7 +857,7 @@ module octa_mount_flare_dsub(height, lip, transition, radius, top_xradius, top_y
         difference() {
             hull() {
                 rounded_octagon(thin_mint, radius);
-                rotate([0, 0, -22.5]) translate([0, 0, transition]) {
+                rotate([0, 0, -22.5]) translate([0, 0, transition - 5.0]) {
                     minkowski() {
                         db25_plate(th = thin_mint, border = expand);
                         cylinder(r = minkr, h = thin_mint, $fn = facets);
@@ -756,9 +866,9 @@ module octa_mount_flare_dsub(height, lip, transition, radius, top_xradius, top_y
             }
             hull() {
                 rounded_octagon(thin_mint, radius - 2 * wall);
-                rotate([0, 0, -22.5]) translate([0, 0, transition]) {
+                rotate([0, 0, -22.5]) translate([0, 0, transition - 5.0]) {
                     minkowski() {
-                        db25_plate(th = thin_mint);
+                        db25_plate(th = thin_mint, border = expand - 2 * wall);
                         cylinder(r = minkr, h = thin_mint, $fn = facets);
                     }
                 }
@@ -770,17 +880,18 @@ module octa_mount_flare_dsub(height, lip, transition, radius, top_xradius, top_y
                 db25_plate(th = db25_t, border = expand);
                 db25_cutout(th = db25_t);
             }
-            // add guard wall around connector
-            difference() {
+            // connector border
+            translate([0, 0, -5.0]) difference() {
+                overhang = 3.0;
                 minkowski() {
-                    db25_plate(th = guard_height + db25_t, border = expand);
+                    db25_plate(th = 5.0 + db25_t + overhang, border = expand);
                     cylinder(r = minkr, h = thin_mint, $fn = facets);
                 }
-                db25_plate(th = guard_height + db25_t + thin_mint, border = expand);
+                db25_plate(th = 5.0 + db25_t + overhang + thin_mint, border = expand);
             }
         }
         // for testing
-        *rotate([0, 0, -22.5]) translate([0, 0, 30]) db25_plate(th = 1.0);
+        *rotate([0, 0, -22.5]) translate([0, 0, 40]) db25_plate(th = 1.0, border = 1.0);
     }
 }
 
@@ -877,22 +988,22 @@ module octa_capsule_array_mount(angles) {
 
 // shock mount band that attaches snugly to microphone body
 
-module octa_shock_mount_band(band_height, radius) {
+module octa_shock_mount_band(band_height, radius, delta_radius) {
     rotate([0, 0, 22.5]) {
         // inner octagon, hugs the body
         difference() {
             rounded_octagon_wall(band_height, radius + 3 * wall, 2 * wall);
-            rotate([0, 0, -22.5 + 90]) translate([-40, -20, 0]) {
-                cube([80, 40, band_height + thin_mint]);
+            rotate([0, 0, -22.5 + 90]) translate([-40, -(1.273 * radius)/2, 0]) {
+                cube([80, 1.273 * radius, band_height + thin_mint]);
             }
         }
         // the outer octagon
-        rounded_octagon_wall(band_height, radius + 6, 2 * wall);
+        rounded_octagon_wall(band_height, radius + delta_radius, 2 * wall);
     }
     // joins inner and outer octagons
     for (m = [0, 1]) mirror([m, 0, 0]) {
         translate([radius, -10, 0]) {
-            cube([2, 20, band_height]);
+            cube([delta_radius - 4 * wall, 20, band_height]);
         }
     }
 }
@@ -900,12 +1011,14 @@ module octa_shock_mount_band(band_height, radius) {
 // shock mount internal ring
 
 module octa_shock_mount_internal_ring(height, radius, band_height, corner) {
+    echo(radius);
+    delta_radius = pcb_version == 2 ? 7.5 : 6;
     // octagonal band
-    octa_shock_mount_band(band_height, radius);
+    octa_shock_mount_band(band_height, radius, delta_radius);
     // 8 columns for mounting rubber bands
     for (r = [0, 90, 180, 270]) rotate([0, 0, r]) {
         for (m = [0, 1]) mirror([m, 0, 0]) {
-            translate([radius + 2.25, radius/2 - 2, 0]) {
+            translate([radius + (pcb_version == 2 ? 3.5 : 2.25), radius/2 - 2, 0]) {
                 rotate([0, 0, 0]) {
                     difference() {
                         // columns
@@ -926,7 +1039,7 @@ module octa_shock_mount_internal_ring(height, radius, band_height, corner) {
             }
         }
         // walls between columns so that they cannot bend
-        rotate([0, 0, 45]) translate([radius + 2.25 * wall, -14, 0]) {
+        rotate([0, 0, 45]) translate([radius + (pcb_version == 2 ? 2.7 : 2.25) * wall, -14, 0]) {
             cube([wall, 28, height]);
         }
     }
@@ -993,7 +1106,7 @@ module octa_quik_release_stand_mount(band_height, radius) {
     vertical_offset = 18;
     mount_offset = 3.0;
     // octagonal band
-    octa_shock_mount_band(band_height, radius);
+    octa_shock_mount_band(band_height, radius, pcb_version == 2 ? 7.5 : 6);
     difference() {
         hull() {
             // attachment "plate"
@@ -1018,6 +1131,52 @@ module octa_quik_release_stand_mount(band_height, radius) {
     }
 }
 
+// stand mount for robotic arm
+
+module octa_arm_mount(band_height, radius, height) {
+    vertical_offset = 18;
+    mount_offset = 3.0;
+    // octagonal band
+    octa_shock_mount_band(band_height, radius, pcb_version == 2 ? 7.5 : 6);
+    // pillars for arm grips
+    // grip_width = 21.8;
+    grip_width = 15;
+    for (m = [0, 1]) mirror([m, 0, 0]) translate([radius + 3 * wall, -grip_width/2, 0]) {
+        cube([5, grip_width, height - 50.0]);
+    }
+    // transition
+    grip_sep = 25.4 * 1.5 / 2;
+    for (m = [0, 1]) mirror([m, 0, 0]) {
+        difference() {
+            hull() {
+                translate([radius + 3 * wall, -grip_width/2, height - 50]) {
+                    cube([5, grip_width, thin_mint]);
+                }
+                translate([grip_sep - wall, -(arm_w + 2 * fit + 2 * wall)/2, height - 20.0]) {
+                    cube([arm_l - 2 * fit + 2 * wall, arm_w - 2 * fit + 2 * wall, thin_mint]);
+                }
+            }
+            *hull() {
+                translate([radius + 3 * wall, -grip_width/2, height - 50]) {
+                    translate([2 * wall, 2 * wall, 0]) cube([5 - 4 * wall, grip_width - 4 * wall, thin_mint]);
+                }
+                translate([grip_sep, -(arm_w + 2 * fit)/2, height - 20.0]) {
+                    translate([2 * wall, 2 * wall, 0]) cube([arm_l - 2 * fit - 4 * wall, arm_w - 2 * fit - 4 * wall, thin_mint]);
+                }
+            }
+        }
+    }
+    // grip pillar, plugs into slots
+    for (m = [0, 1]) mirror([m, 0, 0]) {
+        translate([grip_sep, -(arm_w + 2 * fit)/2, height - 20.0]) {
+            difference() {
+                cube([arm_l - 2 * fit, arm_w - 2 * fit, 20 - 3.0]);
+                *translate([2 * wall, 2 * wall, 0]) cube([arm_l - 2 * fit - 4 * wall, arm_w - 2 * fit - 4 * wall, 20]);
+            }
+        }
+    }
+}
+
 ////
 //// render all the different parts
 ////
@@ -1041,7 +1200,7 @@ module render_octa_pcb_mount(z_offset, showint) {
         octa_mount_body(octa_pcb_mount_height, octa_pcb_radius, mount_lip, mount_lip, 0);
         // add ccrma logo
         rotate([0, 0, -90 + 22.5]) {
-            translate([0, -(octa_pcb_radius - 3.7), octa_pcb_mount_height / 2]) {
+            translate([0, -(octa_pcb_radius - (pcb_version == 2 ? 3.4 : 3.7)), octa_pcb_mount_height / 2]) {
                 rotate([90, 270, 0]) {
                     logo_scale = 1 / (pcb_version == 2 ? 3.0 : 2.4);
                     scale([logo_scale, logo_scale, 1.0]) {

BIN
pcb/zapnspark/zapnspark_parts_list.ods