-
Stepper Motor Sync Wheel
A need for pix of the current waveforms in a stepper motor produced a need to synchronize to the shaft rotation. Rather than cobble something up using random spare parts, I printed a wheel with a tab:

Final rotation sync disk The model looks about like you’d expect:

Synch wheel solid model Those stretched pentagonal holes give it a vaguely religious aspect, don’t they?
The tab is 2/50 of the circumference, so that the resulting pulse neatly brackets two consecutive groups of four full-step pulses. There’s no way to align the tab with the rotor position, so producing a good scope sync pulse becomes a simple matter of software.
The tab’s length and radial position corresponds to this carefully engineered bit of mayhem:

Optical interrupter on stepper isolator bushing The shaft hole will be just slightly too small for the motor shaft, which is perfectly fine. Drill the hole to 5 mm using a #9 drill, working your way up from about #12 to keep the hole concentric.
Actually, that was the second version. The first was a quick-and-dirty disk with a tab, but it came out too floppy at only 1 mm thick and utterly boring:

Simple rotation sync disk But it served as the prototype to settle the tab dimensions and location:

First synch disk with optical interrupter The OpenSCAD source:
// Optical Interrupter // Suited for low speed demonstrations! // Ed Nisley KE4ZNU June 2011 //- Extrusion parameters - must match reality! // Print with +2 shells and 3 solid layers ThreadThick = 0.33; ThreadWidth = 2.0 * ThreadThick; //- Plate dimensions MotorShaftDia = 5.0; MotorShaftDiaSides = 8; MotorShaftPolyRadius = (MotorShaftDia/2)/cos(180/MotorShaftDiaSides); HubDia = MotorShaftDia + 16*ThreadWidth; HubThick = ceil(10.0/ThreadThick)*ThreadThick; // total, not added to plate HubSides = 8; BladeRadius = 31.5; // to center of optical switch gap BladeThick = 2*ThreadWidth; // measured radially BladeAngle = (2/50)*360; // 50 repeats of 4 full step sequences per rev BladeHeight = 7.0; // beyond ribs PlateRadius = BladeRadius + 5.0; PlateThick = ceil(3.0/ThreadThick) * ThreadThick; HoleCenterRad = (BladeRadius + HubDia/2)/2; HoleDia = 0.75 * (3.14159 * 2 * HoleCenterRad)/HubSides; HoleSides = 5; //- Convenience items Protrusion = 0.1; $fn = 128; // make large circles very smooth //- Build it! difference() { union() { cylinder(r=PlateRadius,h=PlateThick); // base plate cylinder(r=HubDia/2,h=HubThick,$fn=HubSides); // hub translate([0,0,PlateThick]) // blade difference() { cylinder(r=BladeRadius+BladeThick/2,h=BladeHeight); cylinder(r=BladeRadius-BladeThick/2,h=BladeHeight + Protrusion); rotate([0,0,(180 - BladeAngle/2)]) translate([PlateRadius,0,(BladeHeight + Protrusion)/2]) cube([PlateRadius*2,PlateRadius*2,BladeHeight+Protrusion],center=true); rotate([0,0,(BladeAngle/2)]) translate([PlateRadius,0,(BladeHeight + Protrusion)/2]) cube([PlateRadius*2,PlateRadius*2,BladeHeight+Protrusion],center=true); } } translate([0,0,-Protrusion]) // shaft hole cylinder(r=MotorShaftPolyRadius, h=HubThick+2*Protrusion, $fn=MotorShaftDiaSides); for (Angle = [0:(HubSides-1)]) // beautification holes rotate([0,0,Angle*(360/HubSides)]) translate([HoleCenterRad,0,-Protrusion]) rotate([0,0,180]) scale([1.33,1.0,1.0]) cylinder(r=HoleDia/2, h=(PlateThick + 2*Protrusion), $fn=HoleSides); }Yeah, that optical switch really is older than you are…