//sgn, January 2022. //digitizer arm sketch - ball bearing test //not really designed for public consumption, but here's the openscad code anyways. $fn = 128; set_screw_dia = 3.05; arrow_size = 7.8; //nominal ball bearing size (just used for modeling). nom_ball_bearing = 6.35; //diameter of race ball_bearing_race_dia = 32.75; //individual ball bearing race diameter ball_bearing_size = 6.4; num_of_bearings = 32; encoder_shaft_dia = 6.0; //counter bore diameter cb_dia = 7; //counter bore height cb_height = 5; //rotary encoder bolt spacing radius enc_bolt_r = 15; //clearance for m3 bolt bolt_through_hole = 4; ball_bearings(); //arm base base(); //rotating part of base base_rotary(); //space for ball bearings //translate([0,0,15]) //rotate_extrude(convexity = 10) //translate([32.5, 0, 0]) //circle(r = 3.2, $fn = 128); module ball_bearings(){ //32 1/4" ball bearings for( i = [0:num_of_bearings-1]){ translate([0,0,15]) rotate([0,0,i*11.25]) translate([32.75,0,0]) sphere(d = nom_ball_bearing); } } module base(){ difference(){ union(){ //main case translate([0,0,8.5]) cylinder(d = 80, h = 13, center = true); } //CUT FOR TESTING translate([0,0,-100]) cube([200,200,200]); //empty main body translate([0,0,-21]) cylinder(d1 = 85, d2 = 51, 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,-50]) rotate([0,0,i*120]) translate([55,0,0]) sphere(d = 6.5); } //bolt clearance for( i = [0:2]){ translate([0,0,10]) rotate([0,0,i*120+30]) translate([enc_bolt_r,0,0]) cylinder(d = bolt_through_hole, 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_rotary(){ difference(){ union(){ //arm bottom rotary holder translate([0,0,22]) cylinder(d = 80, h = 12.7, 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); } } //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); } } }