The ones that I'm aware of don't print the outer part of the wheel, they just do the teeth. Post a link if you know of one that does that outer ring.
Been years, but a quick google search turned up this one:
This download link looks legit, but I haven't verified.
http://www.societyofrobots.com/downloads/
EDIT: now get on that 3D printed 720° controller with it's unique encoder wheel
If anyone wants to make a custom 720°-style encoder wheel, I've remixed the OpenSCAD Customizable Optical Encoder generator
here to include a 6mm (d=6) indexing hole.
Inserted this code just before the last line. (new lines 281 and 282)
translate ([0, outer_diameter/2 - rim_width - slit_length * 2, 0])
cylinder (wheel_height + 1 ,d=6,center=true);
Translate means move, so if you want to move the index hole along the Y-axis, add to or subtract from the Y-axis value.
Current Y-axis location value: "outer_diameter/2 - rim_width - slit_length * 2"
Move 3mm closer to the rim: "outer_diameter/2 - rim_width - slit_length * 2
+ 3"
Move 5mm closer to the center: "outer_diameter/2 - rim_width - slit_length * 2
- 5"
Full remix code:
//customizable optical encoder
// James Wickware - 7/18/2016
// preview[view:north east, tilt:top diagonal]
/* [Encoder] */
// the outer diameter of the optical encoder in millimeters.
outer_diameter = 150; //[0:150]
// the height of the encoder wheel in millimeters.
wheel_height = 2; //[0.1:0.1:20]
// the length of the slits in millimeters.
slit_length = 6; //[0:0.5:75]
// the number of slits in the encoder.
slit_count = 72; // [2:100]
// the ratio of the slit opening to the solid section between the slits. (0.5 is equal )
slit_ratio = 0.5; // [0.05:0.05:0.95]
// the distance between the outer diameter and the opening of the slits in millimeters.
rim_width = 1.8; // [0:0.25:25]
/* [Hub] */
// the diameter of the inner hub in millimeters.
hub_diameter = 12; // [0:0.25:25]
// the length that the hub shaft extends from the encoder wheel in millimeters.
hub_height = 4; // [0:0.5:50]
/* [Shaft] */
// the type of shaft 0 for circular shaft, 1 d shaft (circular with 1 flat, 2 double d shaft (circular with 2 flats), 3 for square shaft 4 for hex shaft, 5 for octagonal shaft.
shaft_type =2; //[0:Cylindrical Shaft, 1:D Type Shaft,2:Double D type Shaft,3:Square Shaft, 4:Hexagonal Shaft, 5:Octagonal Shaft]
// the diameter of the hole for the shaft in millimeters.
shaft_diameter = 4.5; //[0:0.1:20]
// Choose whether or not you want the shaft to go all the way through the encoder wheel.
shaft_goes_through_encoder =0 ; // [0:False,1:True]
// the depth of the flat from the outside edge of the shaft in millimeters (for d and double d shaft type only).
shaft_flat_depth = 1; // [0:0.1:10]
/* [Set Screw] */
// choose whether to include a hole for a set screw
set_screw = 1; // [0:False,1:True]
// the size of the set screw in millimeters
set_screw_diameter = 3; // [0:0.5:10]
// choose whether to include a slot for a set screw nut (automatically disabled when there is not enough room for it).
set_screw_nut = 1; // [0:False,1:True]
// the set screw nut diameter in millimeters. (for hex nuts, the distance from one corner to the opposite corner)
set_screw_nut_diameter = 5; // [1:0.25:14]
// the set screw nut thickness in millimeters
set_screw_nut_thickness = 2; //[0.25:0.25:10]
/* [Hidden] */
// the outer radius
outer_radius = max(outer_diameter/2, hub_diameter/2);
// the hub radius.
hub_radius = hub_diameter/2;
shaft_radius = shaft_diameter/2;
// the depth of the hole for the shaft in millimeters.
shaft_depth = hub_height + (wheel_height*shaft_goes_through_encoder);
// calcuate whether or not the set screw and or nut can safely be included.
min_set_screw_nut_diameter = set_screw_diameter + 0.5;
max_set_screw_nut_diameter = (hub_diameter - shaft_diameter) * 0.6; // allow 60% of distance between shaft and hub
max_set_screw_nut_thickness = (hub_radius - shaft_radius) * 0.6; // allow 60% of distance between shaft and hub
can_have_screw = (hub_height-0.99 > set_screw_diameter) ? 1:0 ;
can_have_nut = ((set_screw_diameter > 0) ? 1: 0)
* ((set_screw_diameter < set_screw_nut_diameter) ? 1:0)
* ((set_screw_nut_thickness < max_set_screw_nut_thickness) ? 1:0)
* set_screw_nut
* can_have_screw;
echo(can_have_screw);
echo(can_have_nut);
set_screw_nut_offset = (((shaft_type == 0) ? 1:0) * .95)
+(((shaft_type == 1) ? 1:0) * .85)
+(((shaft_type == 2) ? 1:0) * .85)
+(((shaft_type == 3) ? 1:0) * .925)
+(((shaft_type == 4) ? 1:0) * .925)
+(((shaft_type == 5) ? 1:0) * .925)
+(((shaft_type == 6) ? 1:0) * .925)
+(((shaft_type == 7) ? 1:0) * .925)
+(((shaft_type == 8) ? 1:0) * .925)
;
echo(set_screw_nut_offset);
// fudge factor to prevent coplanar boolean issues
fudge = 0.01;
difference(){
union(){
// Setup variables for wheel
outer_rad = max((outer_radius - rim_width ) + fudge, hub_radius + fudge) ;
inner_rad = max((outer_radius - rim_width - max(slit_length,0)) + fudge , hub_radius + fudge );
step = 360/slit_count;
half_step = step/2;
qtr_step = half_step / 2 ;
echo("step");
echo (step);
ratio_angle = (slit_ratio-0.5) * half_step;
// don't create slits if some touch-hard has made the hub too big
if(outer_rad > inner_rad){
// create the wheel
difference(){
cylinder(r = outer_diameter/2, h= wheel_height, $fn = slit_count * 2, center = true);
if( slit_count%2 == 0){
// create slits
for (i = [0 : step : 360 - fudge ])
{
points = [
[ sin(i +ratio_angle)*outer_rad, cos(i+ratio_angle)*outer_rad , -wheel_height ],
[ sin(i +ratio_angle)*inner_rad, cos(i+ratio_angle)*inner_rad, -wheel_height ],
[ sin(i+half_step - ratio_angle)*inner_rad , cos(i+half_step- ratio_angle)*inner_rad, -wheel_height ],
[ sin(i+half_step - ratio_angle)*outer_rad, cos(i+half_step- ratio_angle)*outer_rad, -wheel_height ],
[ sin(i+ratio_angle)*outer_rad, cos(i+ratio_angle)*outer_rad, wheel_height ],
[ sin(i+ratio_angle)*inner_rad, cos(i+ratio_angle)*inner_rad, wheel_height ],
[ sin(i+half_step - ratio_angle)*inner_rad , cos(i+half_step- ratio_angle)*inner_rad, wheel_height ],
[ sin(i+half_step - ratio_angle)*outer_rad, cos(i+half_step- ratio_angle)*outer_rad, wheel_height ]
];
faces = [
[0,1,2,3],
[4,5,1,0],
[7,6,5,4],
[5,6,2,1],
[6,7,3,2],
[7,4,0,3]];
rotate(0,0,i)
polyhedron( points, faces ) ;
}
}
else{
for (i = [0 : step : 360 - fudge])
{
points = [
[ sin(i-qtr_step)*outer_rad, cos(i-qtr_step)*outer_rad , -wheel_height ],
[ sin(i-qtr_step)*inner_rad, cos(i-qtr_step)*inner_rad, -wheel_height ],
[ sin(i+qtr_step)*inner_rad , cos(i+qtr_step)*inner_rad, -wheel_height ],
[ sin(i+qtr_step)*outer_rad, cos(i+qtr_step)*outer_rad, -wheel_height ],
[ sin(i-qtr_step)*outer_rad, cos(i-qtr_step)*outer_rad, wheel_height ],
[ sin(i-qtr_step)*inner_rad, cos(i-qtr_step)*inner_rad, wheel_height ],
[ sin(i+qtr_step)*inner_rad , cos(i+qtr_step)*inner_rad, wheel_height ],
[ sin(i+qtr_step)*outer_rad, cos(i+qtr_step)*outer_rad, wheel_height ]
];
faces = [
[0,1,2,3],
[4,5,1,0],
[7,6,5,4],
[5,6,2,1],
[6,7,3,2],
[7,4,0,3]];
rotate(0,0,i)
polyhedron( points, faces ) ;
}
}
}
}
// create hub
if(hub_height > 0){
if(set_screw == 1 && set_screw_diameter > 0 && can_have_screw == 1){
difference(){
translate([0,0, ((hub_height/2) + (wheel_height /2))] )
cylinder(r= min(hub_diameter/2, (outer_diameter/2)-fudge ), h = hub_height +(fudge*2), $fn = slit_count *2, center = true);
// set screw hole
translate([0,0, ((hub_height/2) + (wheel_height/2 ))] )
rotate([-90,0,0])
cylinder(r=set_screw_diameter/2, h=hub_diameter, $fn=16);
if(can_have_nut == 1){
// set screw nut
translate([0,(hub_radius - ((hub_radius-shaft_radius)/2))*set_screw_nut_offset, ((hub_height/2) + (wheel_height/2 ))] )
rotate([90,00,00])
cylinder(r=max(min_set_screw_nut_diameter/2,set_screw_nut_diameter/2), h=max(set_screw_nut_thickness,0.25) +fudge, $fn=6, center = true);
translate([0,(hub_radius - ((hub_radius-shaft_radius)/2))*set_screw_nut_offset, ((hub_height/2) + (wheel_height/2 )) +
(((hub_height/2) + (wheel_height/2 )+set_screw_nut_diameter /2 )-fudge) /2] )
cube([max(min_set_screw_nut_diameter ,set_screw_nut_diameter ) ,max(set_screw_nut_thickness,0.25)-fudge,(((hub_height/2) + (wheel_height/2 )+max(min_set_screw_nut_diameter ,set_screw_nut_diameter ) /2 )) ],center=true);
}
}
}
else {
translate([0,0, ((hub_height/2) + (wheel_height /2))] )
cylinder(r= min(hub_diameter/2, (outer_diameter/2)-fudge ), h = hub_height +(fudge*2), $fn = slit_count *2, center = true);
}
}
};
// shaft
// cylindrical shaft
if(shaft_type == 0){
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = max(slit_count*2, 6) ,center = true);
}
// d type shaft
if(shaft_type == 1)
{
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
difference(){
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = max(slit_count*2, 6) ,center = true);
translate([0, max( shaft_diameter - shaft_flat_depth , shaft_diameter/2),0 ])
cube ( [shaft_diameter*2,shaft_diameter, shaft_depth*2 ], center = true) ;
}
}
// double d type shaft -- double D = big breasts --
if (shaft_type == 2)
{
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
difference(){
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = max(slit_count*2, 6) ,center = true);
translate([0, max( shaft_diameter - shaft_flat_depth , shaft_diameter/2),0 ])
cube ( [shaft_diameter*2,shaft_diameter, shaft_depth*2 ], center = true);
translate([0, min( -( shaft_diameter - shaft_flat_depth), -(shaft_diameter/2)),0 ])
cube ( [shaft_diameter*2,shaft_diameter, shaft_depth*2 ], center = true);
}
}
// square shaft
if (shaft_type == 3)
{
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
rotate([0,0,45])
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = 4 ,center = true);
}
// hex shaft
if (shaft_type == 4)
{
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = 6 ,center = true);
}
// octopus shaft
if (shaft_type == 5)
{
translate([0,0, ((shaft_depth/2) + (wheel_height /2) + (hub_height ))]) // move shaft to the top of the hub
translate([0,0,-min(shaft_depth, hub_height+wheel_height)]) // insert the shaft until it hits bottom >:)
rotate([0,0,22.5])
cylinder(r= shaft_diameter/2, h=shaft_depth + (fudge*4) , $fn = 8 ,center = true);
}
translate ([0, outer_diameter/2 - rim_width - slit_length * 2, 0])
cylinder (wheel_height + 1 ,d=6,center=true);
}
Scott