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