Ver código fonte

add modules for attaching to the robotic arm test system

Fernando Pablo Lopez-Lezcano 7 anos atrás
pai
commit
f40e6df768
1 arquivos alterados com 117 adições e 2 exclusões
  1. 117 2
      SpHEAR_common.scad

+ 117 - 2
SpHEAR_common.scad

@@ -3,7 +3,7 @@
 //
 // Common Modules and Variables
 //
-// 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
@@ -496,7 +496,7 @@ module shock_mount_stand(height, wall, stand_wall) {
 // 5/8-27 for US mic stands
 // 3/8-16 for European
 
-module stand_mount_thread(length, band, wall, diameter = 5/8, threads_per_inch = 27, wall = 2.0, fit = 0.) {
+module stand_mount_thread(length, band, wall, diameter = 5/8, threads_per_inch = 27, wall = 2.0, fit = 0.1) {
     diam = diameter * 25.4;
     pitch = (1.0/threads_per_inch)*25.4;
     difference() {
@@ -629,3 +629,118 @@ module tetra_shock_mount_external_ring(height, radius, corner, gap) {
     }
 }
 
+// shock mount to test rig
+
+// model WidowXL
+//
+// sliding block
+arm_l = 10.2 + 0.38;
+arm_w = 21.5 + 0.38;
+arm_d = 17.6 + 0.1;
+// x profile
+arm_profile_s = 10.25;
+arm_b_prof = 4.25;
+// connection socket
+arm_s_h = 20.0;
+
+module arm_gripper_block () {
+    difference() {
+        // body
+        translate([-(4 * wall)/2, -2 * wall, 0]) {
+            cube([arm_l + 4 * wall, arm_w + 4 * wall, arm_d + arm_s_h]);
+        }
+        // carve out corners for better fit
+        translate([0.2, 0.2, 0]) cylinder(r = 0.4, h = arm_d + arm_s_h, $fn = facets);
+        translate([arm_l, 0.2, 0]) cylinder(r = 0.4, h = arm_d + arm_s_h, $fn = facets);
+        translate([arm_l, arm_w, 0]) cylinder(r = 0.4, h = arm_d + arm_s_h, $fn = facets);
+        translate([0.2, arm_w, 0]) cylinder(r = 0.4, h = arm_d + arm_s_h, $fn = facets);
+        // arm gripper block
+        union() {
+            cube([arm_l, arm_w, arm_d + arm_s_h]);
+            translate([-arm_l/2, arm_w/2 - arm_profile_s/2, arm_d - arm_b_prof - arm_profile_s - 10]) {
+                cube([20, arm_profile_s, arm_profile_s + 10]);
+            }
+            // screw holes
+            translate([-10 + arm_l/2, 3.15, arm_d - 9.7]) rotate([0, 90, 0]) {
+                cylinder(r = 1.94/2, h = 20.0, $fn = facets);
+            }
+            translate([-10 + arm_l/2, arm_w - 3.15, arm_d - 9.7]) rotate([0, 90, 0]) {
+                cylinder(r = 1.94/2, h = 20.0, $fn = facets);
+            }
+        }
+    }
+    // add ceiling to body and screw hole
+    difference() {
+        translate([-(4 * wall)/2, -2 * wall, arm_d]) {
+            cube([arm_l + 4 * wall, arm_w + 4 * wall, 3 * wall]);
+        }
+        translate([arm_l/2, arm_w/2, 0]) cylinder(r = 3.1/2, h = 30, $fn = facets);
+    }
+}
+
+module tetra_arm_mount(pillar_h, height, radius, band_height, corner, gap) {
+    difference() {
+        // four sided ring
+        union() {
+            tetra_shock_mount_band(band_height, radius, corner, gap);
+            // ridge so that rubber bands stay in the shock mount
+            *tetra_shock_mount_band(wall, radius, corner, gap + wall);
+        }
+        // slots inside body so that the ring clears the lower screws
+        for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
+            translate([radius + gap + 2.5, -2.0, 0]) cube([2.0, 4.0, band_height]);
+        }
+        // channels in body for upper rubber band
+        *for (r = [0, 90, 180, 270]) rotate([0, 0, r + 45]) {
+            rotate([90, 0, 0]) translate([radius + 8.75, 2 * wall + 0.2, 0])
+                cylinder(r = 1.0, h = height, center = true, $fn = facets);
+        }
+    }
+    // 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, pillar_h, grip_sep, grip_width);
+}
+
+// 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);
+            }
+        }
+    }
+}