//sgn, January 2022. //digitizer arm sketch //not really designed for public consumption, but here's the openscad code anyways. $fn = 128; set_screw_dia = 3.05; rod_size = 22.4; rod_length = 170; //spacing between rods rod_distance = 0; //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(); //flat base flat_base(); //arm base base(); //rotating part of base base_rotary_top(); //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(); //second arm rod 1 translate([90,rod_distance,290]) rotate([0,75,0]) //rod(); tube(); translate([200,0,320]) rotate([0,75,0]) tiny_probe(); translate([200,0,320]) rotate([0,75,0]) button(); translate([123,0,300]) rotate([0,75+ 180,0]) button_bottom(); translate([161,0,313]) rotate([0,75+270,0]) small_pushbutton(); //third arm rod 1 //translate([250,rod_distance,210]) //rotate([0,155,0]) //rod(); //tube(); //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(); //probe end 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); module tiny_probe(){ difference(){ union(){ //pen end effector /* color("silver", 1){ translate([0,0,10]) cylinder(d = 7.7, h = 70, center=true); //pen tip translate([0,0,50]) cylinder(d1 = 7.7, d2 = .1, h = 10, center=true); } */ //connector to tubing translate([0,0,-45]) cylinder(d = 30, h = 60, center = true); translate([0,0,-5]) cylinder(d1 = 30, d2 = 12, h = 20, center = true); translate([0,0,-76.5]) cylinder(d1 = 26, d2 = 30, h = 3, center = true); } //ROD through hole translate([0,rod_distance,-53]) cylinder(d = rod_size, h = 54, center = true); //pen through hole translate([0,0,-10]) cylinder(d = 7.75, h = 35, center=true); //button hole translate([-10,0,-40]) rotate([0,90,0]) cylinder(d = 15.7, h = 20, center=true); //CUT IN HALF TO SHOW //translate([-20,-40,-80]) //cube([40,40,80]); } } module button(){ difference(){ union(){ intersection(){ //button color("red", 1){ translate([-12,0,-40]) rotate([0,90,0]) cylinder(d = 15, h = 12, center=true); } //to curve top of button translate([0,0,-40]) cylinder(d = 35, h = 20, center=true); } intersection(){ //bottom of button translate([-10,0,-40]) rotate([0,90,0]) cylinder(d = 17, h = 8, center=true); //ROD through hole translate([0,rod_distance,-52]) cylinder(d = rod_size, h = 50, center = true); } } //for pushbutton clearance translate([-5,0,-40]) rotate([0,90,0]) cylinder(d = 5, h = 8.5, center = true); } } //this provides the support for bottom of actual switch. module button_bottom(){ intersection(){ //bottom of button translate([-10,0,-40]) rotate([0,90,0]) cylinder(d = 17, h = 14, center=true); //ROD through hole translate([0,rod_distance,-52]) cylinder(d = rod_size, h = 50, center = true); } } module small_pushbutton(){ color("black", 1){ cylinder(d1 = 3.5, d2 = 3.15, h = 8.5, center = true); translate([0,0,-6]) cube([6.3,6.3,4], 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 = rod_size, h = 40, center = true); //SIDE through hole 2 translate([rod_distance,0,-35]) cylinder(d = rod_size, h = 40, center = true); //through hole 1 translate([0,-rod_distance,-35]) cylinder(d = rod_size, h = 40, center = true); //through hole 2 //translate([0,rod_distance,-35]) //cylinder(d = rod_size, h = 40, center = true); //through hole 3 translate([0,-rod_distance+42,-35]) cylinder(d = rod_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([30,30,24], center = true); //old STICKOUT rod support structure cube //translate([0,5,43]) //cube([30,42,24], center = true); //STICKOUT rod support structure cube translate([0,-1,43]) cube([30,30,24], center = true); } //ROD through hole translate([0,rod_distance,46]) cylinder(d = rod_size, h = 81, center = true); //chamfer for rod insertion translate([0,rod_distance,53]) cylinder(d1 = rod_size - 5, d2 = rod_size + 5, h = 10, center = true); //encoder through hole translate([0,-1,0]) rotate([90,0,0]) cylinder(d = encoder_shaft_dia + .12, h = 40, center = true); //cable in/out hole translate([0,-9,0]) rotate([90,0,0]) cylinder(d = 22, h = 20, center = true); //rod set screw hole in connector 2 translate([0,-rod_distance,25]) 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); //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 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 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,26,0]) rotate([90,0,0]) cylinder(d = 55, h = 20, center = true); //translate([0,15,-48]) //cube([38,62,50], center = true); translate([0,17,-48]) cube([38,38,50], center = true); translate([0,0,-48]) cylinder( d = 38.5, h = 50, center = true); //Supports for body translate([11.6,26,-24]) rotate([0,105,0]) cube([42,20,20], center = true); mirror([1,0,0]){ translate([11.6,26,-24]) rotate([0,105,0]) cube([42,20,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 //ROD through hole translate([0,rod_distance,-55]) cylinder(d = rod_size, h = 68, center = true); //chamfer for rod insertion translate([0,rod_distance,-71]) cylinder(d1 = rod_size + 5, d2 = rod_size - 5, h = 10, center = true); //wire in/out hole translate([0,-12,-27]) rotate([0,90,90]) cylinder(d = 22, h = 20, center = true); //wire through hole (to get from encoder to rod) translate([0,20,-35]) rotate([0,90,90]) cylinder(d = 10, h = 50, center = true); //front set screw translate([0,10,-45]) rotate([0,90,90]) cylinder(d = set_screw_dia, h = 80, center = true); //front set screw 2 translate([0,10,-60]) rotate([0,90,90]) cylinder(d = set_screw_dia, h = 80, center = true); //cross set screw 1 translate([0,rod_distance,-45]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); //cross set screw 2 translate([0,rod_distance,-60]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 60, center = true); // More clearance for rod translate([0,-1,-22]) cube([50,34,20], center = true); //side cutoffs for rod clearance translate([15,-1,-22]) rotate([0,45,0]) cube([34,34,20], center = true); mirror([1,0,0]){ translate([15,-1,-22]) 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([67,10,-35]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 128); translate([-67,10,-35]) rotate([0,90,90]) cylinder(d = 100, h = 80, center = true, $fn = 128); //cutout for top for wire in/out translate([0,-18,-25]) rotate([45,0,0]) cube([38,34,20], center = true); //slice bottom at 45 degree angle translate([0,45,-70]) rotate([40,0,0]) cube([40,50,30], center = true); } } module flat_base() { difference(){ union(){ translate([0,80,-60.35]) cube([120, 275, 10], center = true); translate([0,205,-43]) cylinder(d = 25.4, h = 35, center = true); } translate([0,205,-33]) cylinder(d = 10, h = 35, center = true); } } module base(){ difference(){ union(){ //bottom translate([0,0,-41]) cylinder(d = 125, h = 20, center = true); translate([0,0,-11]) cylinder(d1 = 125, d2 = 80, h = 40, 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,-1]) cylinder(d1 = 82.2, d2 = 53, h = 22, center = true); translate([0,0,-32]) cylinder(d = 82, h = 41, 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 // UNCOMMENT BEFORE MAKING!!!!!!! /* translate([0,0,15]) rotate_extrude(convexity = 10, $fn = 256) translate([ball_bearing_race_dia, 0, 0]) circle(d = ball_bearing_size, $fn = 64); */ } } 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,75]) cube([30,30,27], center = true); //STICKOUT rod support structure cube translate([0,3,100]) cube([30,38,24], center = true); } //through hole translate([0,-1,54]) rotate([90,0,0]) cylinder(d = encoder_shaft_dia + .12, h = 40, center = true); //wire in/out hole translate([0,-11,54]) rotate([0,90,90]) cylinder(d = 24, h = 20, center = true); //rod set screw hole in connector translate([0,0,74]) rotate([90,0,90]) cylinder(d = set_screw_dia, h = 40, center = true); //rod set screw hole in support translate([0,0,82]) 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); //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 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,104]) cylinder(d = rod_size, h = 90, 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_top(){ 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 // UNCOMMENT BEFORE MAKING!!!!!!! /* translate([0,0,15]) rotate_extrude(convexity = 10, $fn = 256) translate([ball_bearing_race_dia, 0, 0]) circle(d = ball_bearing_size, $fn = 64); translate([0,0,18]) rotate_extrude(convexity = 10, $fn = 128) translate([ball_bearing_race_dia, 0, 0]) circle(d = ball_bearing_size-4, $fn = 32); */ //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 = 22, 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); } } }