//sgn, January 2022. //digitizer arm sketch //not really designed for public consumption, but here's the openscad code anyways. $fn = 64; set_screw_dia = 3.05; arrow_size = 7.8; rod_length = 200; //spacing between rods rod_distance = 7; //diameter of race ball_bearing_race_dia = 32.75; //individual ball bearing size ball_bearing_size = 6.4; probe_shaft = 17; //ball feet diameter feet_dia = 12.7; encoder_shaft_dia = 6.0; //counter bore diameter cb_dia = 7; //counter bore height cb_height = 5; //rotary encoder bolt hold circle radius enc_bolt_r = 15; //view point for animation /* $vpt = [32, 61, 42]; $vpr = [73, 0, 159]; $vpd = 1600; */ //for testing /* translate([0,0,267]) connector_encoder(); translate([0,0,267]) rotate([0,119,0]) connector_rod(); translate([0,43,540]) encoder(); */ //surface_plate(); //example_part(); //arm base base(); //rotating part of base base_rotary(); //base to rod connector base_arm_connector(); //base encoder translate([0,0,-10]) rotate([270,0,0]) encoder(); //omron rotary encoder side of base translate([0,43,54]) rotate([0,180,0]) encoder(); //first arm rod 1 translate([0,rod_distance,150]) rod(); //tube(); //first arm rod 2 translate([0,-rod_distance,150]) rod(); //first arm rod 3 translate([0,-rod_distance+42,150]) rod(); //second arm rod 1 translate([90,rod_distance,290]) rotate([0,75,0]) rod(); //tube(); //second arm rod 2 translate([90,-rod_distance,290]) rotate([0,75,0]) rod(); //second arm rod 3 translate([90,-rod_distance+42,290]) rotate([0,75,0]) rod(); //third arm rod 1 translate([250,rod_distance,210]) rotate([0,155,0]) rod(); //tube(); //third arm rod 2 translate([250,-rod_distance,210]) rotate([0,155,0]) rod(); //third arm rod 3 translate([250,-rod_distance+42,210]) rotate([0,155,0]) rod(); //1st connector for rods 1-2 translate([0,0,267]) connector_encoder(); translate([0,0,267]) rotate([0,75,0]) connector_rod(); //omron rotary encoder first connector translate([0,46,267]) encoder(); //probe for if only 2 arms //translate([200,0,320]) //rotate([0,75,0]) //probe(); //2nd connector for Rods 2-3 translate([200,0,320]) rotate([0,75,0]) connector_encoder(); translate([200,0,320]) rotate([0,157,0]) connector_rod(); //omron rotary encoder first connector translate([200,46,320]) encoder(); //Simple probe for 3 arms //translate([287,0,130]) //rotate([0,155,0]) //probe(); //Probe with rotation translate([341,0,45]) rotate([-24,180,270]) probe(); translate([287,0,130]) rotate([-24,180,270]) connector_probe(); translate([287,0,130]) rotate([-24,180,270]) probe_connector_encoder(); translate([337,0,152]) rotate([-24,180,270]) encoder(); //electronics box //box(); //alt_base(); //mouse //translate([0,0,-30]) //#cube([120,60,40], center = true); //alternative base encoder module alt_base(){ //arm side rod holder translate([0,-13.4,54]) rotate([90,0,0]) cylinder(d = 35, h = 30, center = true); //encoder holder translate([-55,10,64]) rotate([0,50,0]) cube([100,20,20], center = true); //encoder "gear" translate([-81,6,100]) rotate([90,0,0]) cylinder(d = 60, h = 12, center = true); //encoder translate([-81,22,100]) encoder(); //encoder "gear" translate([-81,-15,100]) rotate([90,0,0]) cylinder(d = 20, h = 25, center = true); difference(){ //BIG arm rotary connector translate([0,-22,54]) rotate([90,0,0]) cylinder(d = 167, h = 12.7, center = true, $fn = 128); //clear front translate([50,-22,30]) cube([80,50,240], center = true); //clear bottom translate([18,-22,17.5]) cube([80,50,40], center = true); //clear back bottom translate([-12,-22,4]) rotate([90,0,0]) cylinder(d = 70, h = 16, center = true); //clear top front translate([20,-22,95]) rotate([90,0,0]) cylinder(d = 70, h = 16, center = true); } } module probe_connector_encoder(){ difference(){ union(){ //arm rotary //translate([0,0,0]) //rotate([90,0,0]) //cylinder(d = 40, h = 35, center = true); //arm rotary holder translate([0,31,0]) rotate([90,0,0]) cylinder(d = 62, h = 30, center = true); translate([0,15,-25]) cube([62,62,50], center = true); //Supports for body translate([14,31,-24]) rotate([0,105,0]) cube([48.4,30,20], center = true); mirror([1,0,0]){ translate([14,31,-24]) rotate([0,105,0]) cube([48.4,30,20], center = true); } } //bolt clearance for( i = [0:2]){ translate([0,20,0]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = 4, h = 20, center = true); } //bolt counterbore for( i = [0:2]){ translate([0,17,0]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = cb_dia, h = cb_height, center = true); } //clearance for encoder shaft translate([0,10,0]) rotate([0,90,90]) cylinder(d = 7.5, h = 60, center = true); //clearance for encoder small part translate([0,23,0]) rotate([0,90,90]) cylinder(d = 22, h = 11, center = true); //clearance for encoder body translate([0,37,0]) rotate([0,90,90]) cylinder(d = 43, h = 26, center = true); //ROD HOLDER //SIDE through hole 1 translate([-rod_distance,0,-35]) cylinder(d = arrow_size, h = 40, center = true); //SIDE through hole 2 translate([rod_distance,0,-35]) cylinder(d = arrow_size, h = 40, center = true); //through hole 1 translate([0,-rod_distance,-35]) cylinder(d = arrow_size, h = 40, center = true); //through hole 2 translate([0,rod_distance,-35]) cylinder(d = arrow_size, h = 40, center = true); //through hole 3 translate([0,-rod_distance+42,-35]) cylinder(d = arrow_size, h = 40, center = true); //front set screw translate([0,10,-30]) rotate([0,90,90]) cylinder(d = set_screw_dia, h = 80, center = true); //cross set screw 1 translate([0,rod_distance,-35]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); //cross set screw 2 translate([0,-rod_distance,-35]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); //front clearance (to clean stuff up.) translate([0,-1,-5]) cube([70,34,40], center = true); //side cutoffs for rod clearance translate([22,-1,-15]) rotate([0,45,0]) cube([45,34,20], center = true); mirror([1,0,0]){ translate([22,-1,-15]) rotate([0,45,0]) cube([45,34,20], center = true); } //cutout for side body supports (defeats the purpose the supports, kind of. But whatever.) translate([74,10,-20]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 100); translate([-74,10,-20]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 100); } } module connector_probe(){ difference(){ union(){ //arm side rod holder translate([0,-1,0]) rotate([90,0,0]) cylinder(d = 35, h = 30, center = true); //PROBE support structure translate([0,15,52]) cylinder(d = 35, h = 20, center = true); translate([0,15,37]) cylinder(d1 = 24, d2 = 35, h = 10, center = true); //rod support structure cube translate([0,-1,22]) cube([28,30,24], center = true); //STICKOUT rod support structure cube translate([0,15,44]) cube([28,62,24], center = true); } //PROBE shaft holder translate([0,15,52]) cylinder(d = probe_shaft, h = 27, center = true); //encoder through hole translate([0,-1,0]) rotate([90,0,0]) cylinder(d = 6.12, h = 40, center = true); //side rod set screw hole 1 translate([0,15,47]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //front rod set screw hole in support 2 translate([0,0,10]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 60, center = true); //front rod set screw hole in support 3 translate([0,10,47]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 80, center = true); //set screw for encoder shaft translate([0,8,-10]) cylinder(d = set_screw_dia, h = 20, center = true); //2nd and 3rd set screw for encoder shaft translate([0,8,0]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); } } module probe(){ cylinder(d = 70, h = 50, center = true); translate([0,0,-15]) cylinder(d = 20, h = 70, center = true); color("silver", 1){ translate([0,0,40]) cylinder(d = 3, h = 50, center = true); } color("red", 1){ translate([0,0,65]) sphere(d = 6); } } module connector_rod(){ difference(){ union(){ //arm side rod holder translate([0,-1,0]) rotate([90,0,0]) cylinder(d = 35, h = 30, center = true); //rod support structure (for tube) translate([0,0,20]) cylinder(d = 17.5, h = 20, center = true); //rod support structure cube translate([0,-1,20]) cube([22,30,24], center = true); //STICKOUT rod support structure cube translate([0,15,43]) cube([22,62,24], center = true); } //encoder through hole translate([0,-1,0]) rotate([90,0,0]) cylinder(d = 6.12, h = 40, center = true); //rod set screw hole in connector 1 translate([0,rod_distance,10]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //rod set screw hole in connector 2 translate([0,-rod_distance,10]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 1 translate([0,-rod_distance,47]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 2 translate([0,rod_distance,47]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 3 translate([0,-rod_distance+42,47]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //front rod set screw hole in support translate([0,0,24]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 60, center = true); //front rod set screw hole in support 2 translate([0,0,10]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 60, center = true); //front rod set screw hole in support 3 translate([0,10,47]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 80, center = true); //rod connection through hole translate([0,rod_distance,46]) cylinder(d = arrow_size, h = 80, center = true); //rod connection through hole 2 translate([0,-rod_distance,46]) cylinder(d = arrow_size, h = 80, center = true); //rod connection through hole 3 translate([0,-rod_distance+42,46]) cylinder(d = arrow_size, h = 80, center = true); //set screw for encoder shaft translate([0,8,-10]) cylinder(d = set_screw_dia, h = 20, center = true); //2nd and 3rd set screw for encoder shaft translate([0,8,0]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); } } module connector_encoder(){ difference(){ union(){ //arm rotary //translate([0,0,0]) //rotate([90,0,0]) //cylinder(d = 40, h = 35, center = true); //arm rotary holder translate([0,31,0]) rotate([90,0,0]) cylinder(d = 60, h = 30, center = true); translate([0,15,-35]) cube([34,62,30], center = true); //Supports for body translate([14,31,-24]) rotate([0,105,0]) cube([48.4,30,20], center = true); mirror([1,0,0]){ translate([14,31,-24]) rotate([0,105,0]) cube([48.4,30,20], center = true); } } //bolt clearance for( i = [0:2]){ translate([0,20,0]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = 4, h = 20, center = true); } //bolt counterbore for( i = [0:2]){ translate([0,17,0]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = cb_dia, h = cb_height, center = true); } //clearance for encoder shaft translate([0,10,0]) rotate([0,90,90]) cylinder(d = 7.5, h = 60, center = true); //clearance for encoder small part translate([0,23,0]) rotate([0,90,90]) cylinder(d = 22, h = 11, center = true); //clearance for encoder body translate([0,37,0]) rotate([0,90,90]) cylinder(d = 43, h = 26, center = true); //ROD HOLDER //through hole 1 translate([0,-rod_distance,-35]) cylinder(d = arrow_size, h = 40, center = true); //through hole 2 translate([0,rod_distance,-35]) cylinder(d = arrow_size, h = 40, center = true); //through hole 3 translate([0,-rod_distance+42,-35]) cylinder(d = arrow_size, h = 40, center = true); //front set screw translate([0,10,-30]) rotate([0,90,90]) cylinder(d = set_screw_dia, h = 80, center = true); //cross set screw 1 translate([0,rod_distance,-35]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); //cross set screw 2 translate([0,-rod_distance,-35]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); //side cutoffs for rod clearance translate([17,-1,-15]) rotate([0,45,0]) cube([34,34,20], center = true); mirror([1,0,0]){ translate([17,-1,-15]) rotate([0,45,0]) cube([34,34,20], center = true); } //cutout for side body supports (defeats the purpose the supports, kind of. But whatever.) translate([70,10,-35]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 100); translate([-70,10,-35]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 100); } } module base(){ difference(){ union(){ //bottom translate([0,0,-38]) cylinder(d = 125, h = 24, center = true); translate([0,0,-11]) cylinder(d1 = 125, d2 = 80, h = 30, center = true); //main case translate([0,0,-10]) cylinder(d = 80, h = 50, center = true); } //CUT FOR TESTING translate([0,0,-100]) cube([200,200,200]); //empty main body translate([0,0,-21]) cylinder(d1 = 75, d2 = 53, h = 61, center = true); //through hole for rotary encoder shaft translate([0,0,12]) cylinder(d = 7, h = 40, center = true); //encoder through hole translate([0,0,20]) cylinder(d = 21, h = 70, center = true); //base through hole for wiring translate([-50,0,-49]) rotate([90,0,90]) cylinder(d = 16, h = 100, center = true); //holes for ball bearing feet //this won't work well, it's a design feature, but they will have to be made another way. 3d printing hemispheres like this probably won't work well. for( i = [0:2]){ translate([0,0,-49]) rotate([0,0,i*120]) translate([52,0,0]) #sphere(d = feet_dia); } //bolt clearance for( i = [0:2]){ translate([0,0,10]) rotate([0,0,i*120+30]) translate([enc_bolt_r,0,0]) cylinder(d = 4, h = 20, center = true); } //bolt counterbore for( i = [0:2]){ translate([0,0,15]) rotate([0,0,i*120+30]) translate([enc_bolt_r,0,0]) cylinder(d = cb_dia, h = cb_height + 1, center = true); } //space for ball bearings translate([0,0,15]) rotate_extrude(convexity = 10) translate([ball_bearing_race_dia, 0, 0]) circle(d = ball_bearing_size, $fn = 128); } } module base_arm_connector(){ difference(){ union(){ //arm side rod holder translate([0,-1,54]) rotate([90,0,0]) cylinder(d = 35, h = 30, center = true); //rod support structure (for tube) translate([0,0,74]) cylinder(d = 17.5, h = 20, center = true); //rod support structure cube translate([0,-1,76]) cube([22,30,24], center = true); //STICKOUT rod support structure cube translate([0,15,100]) cube([22,62,24], center = true); } //through hole translate([0,-1,54]) rotate([90,0,0]) cylinder(d = 6.12, h = 40, center = true); //rod set screw hole in connector translate([0,0,64]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //rod set screw hole in support translate([0,0,78]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 40, center = true); //rod set screw hole in connector 1 translate([0,rod_distance,84]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //rod set screw hole in connector 2 translate([0,-rod_distance,84]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 1 translate([0,-rod_distance,107]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 2 translate([0,rod_distance,107]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //side rod set screw hole 3 translate([0,-rod_distance+42,107]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //front rod set screw hole in support translate([0,0,94]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 60, center = true); //front rod set screw hole in support 2 translate([0,0,84]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 60, center = true); //front rod set screw hole in support 3 translate([0,10,107]) rotate([90,0,0]) cylinder(d = set_screw_dia, h = 80, center = true); //rod connection through hole translate([0,rod_distance,106]) cylinder(d = arrow_size, h = 80, center = true); //rod connection through hole 2 translate([0,-rod_distance,106]) cylinder(d = arrow_size, h = 80, center = true); //rod connection through hole 3 translate([0,-rod_distance+42,106]) cylinder(d = arrow_size, h = 80, center = true); //set screw for encoder shaft translate([0,8,44]) cylinder(d = set_screw_dia, h = 20, center = true); //2nd and 3rd set screw for encoder shaft translate([0,8,54]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); } } module base_rotary(){ difference(){ union(){ //arm bottom rotary holder translate([0,0,22]) cylinder(d = 80, h = 12.7, center = true); //arm rotary base connector translate([0,20,54]) rotate([90,0,0]) cylinder(d = 67, h = 35, center = true); } //through hole for rotary encoder shaft translate([0,0,12]) cylinder(d = encoder_shaft_dia, h = 40, center = true); //set screw through hole - ridiculously long for( i = [0:2]){ translate([0,0,22]) rotate([0,90,i*120]) translate([0,0,25]) cylinder(d = set_screw_dia, h = 50, center = true); } //space for ball bearings translate([0,0,15]) rotate_extrude(convexity = 10) translate([ball_bearing_race_dia, 0, 0]) circle(d = ball_bearing_size, $fn = 128); //cut off top of holder //translate([0,22,90]) //cube([60,40,30], center = true); //cut off top and side of holder translate([0,-5,70]) cube([90,40,50], center = true); //clearance for arm connector translate([0,-5,54]) rotate([0,90,90]) cylinder(d = 45, h = 40, center = true); //clearance for encoder translate([0,43,54]) rotate([0,90,90]) cylinder(d = 47, h = 40, center = true); //clearance for encoder small part translate([0,20,54]) rotate([0,90,90]) cylinder(d = 22, h = 40, center = true); //bolt clearance for( i = [0:2]){ translate([0,20,54]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = 4, h = 20, center = true); } //bolt counterbore for( i = [0:2]){ translate([0,16,54]) rotate([90,i*120+30,0]) translate([enc_bolt_r,0,0]) cylinder(d = cb_dia, h = cb_height, center = true); } } } //Carbon Fiber Rod module rod(){ //rod arm color("black", 1){ translate([0,0,0]) cylinder(d = 7.65, h = rod_length, center = true); } } //Carbon Fiber tube (20mm OD, 18mm ID) module tube(){ //rod arm color("black", 1){ translate([0,0,0]) cylinder(d = 20, h = rod_length, center = true); } } //electronics box module box(){ translate([0,200,-27]) cube([125,100,35], center = true); } //Omron Encoder module encoder(){ difference(){ union(){ //body color("BurlyWood", 1.0){ rotate([0,90,90]) cylinder(d = 40, h = 39, center = true); //top of encoder (20mm) translate([0,-22,0]) rotate([0,90,90]) cylinder(d = 20, h = 5, center = true); //cable support translate([0,7.5,25]) rotate([0,0,90]) cylinder(d = 10, h = 12, center = true); } //cable stub color("black", 1.0){ translate([0,7.5,37]) rotate([0,0,90]) cylinder(d = 8, h = 12, center = true); } //shaft color("silver", 1.0){ translate([0,-32,0]) rotate([0,90,90]) cylinder(d = 6, h = 15, center = true); } } //bolt holes for( i = [0:2]){ translate([0,-16,0]) rotate([90,i*120,0]) translate([enc_bolt_r,0,0]) cylinder(d = 3, h = 8, center = true); } } } module surface_plate(){ color("gainsboro", 1){ translate([0,00,-120]) cube([1000,800,150], center = true); } } //Example Part module example_part(){ color("grey", 1){ difference(){ union(){ translate([300,0,-20]) cylinder(d = 140, h = 50, center = true); translate([300,50,0]) cylinder(d = 40, h = 70, center = true); translate([350,0,0]) cylinder(d = 20, h = 90, center = true); } translate([300,-30,0]) cube([50,50,50], center = true); translate([230,-30,10]) rotate([0,45,0]) cube([50,200,50], center = true); translate([300,50,20]) cylinder(d = 20, h = 70, center = true); } } }