Archive for September 6th, 2011
Stepper Dynamometer: Sync Wheel
Posted by Ed in Machine Shop on 2011-09-06
This is a modification of that sync gadget to work on the prototype stepper dynamometer. The key differences:
- The wheel has a notch rather than a flag
- The opto switch mounts on a sturdy post
The wheel fits the shaft with a 4-40 setscrew to hold it in place. The post has 4-40 mounting holes for one of those optical switches, plus a big hole for the wiring. The solid models look about like you’d expect:
I located the post’s holes on the baseplate with a spindly pair of transfer punches, after transferring the wheel’s centerline by eyeballometric guesstimation:
Then aligned the baseplate on the Sherline, located the holes, and drilled ’em with manual CNC to get the proper spacing:
And then it went together quite smoothly:
What’s really nice about 3D printing is you can build stuff like this without too much fuss & bother: figure out the solid model, walk gingerly through the software minefield, and (usually) assemble the parts later that day.
A bit of wiring to power the LED and pull up the phototransistor should do the trick.
The OpenSCAD code, including a few tweaks that rationalize spacings and sizes and suchlike:
// Optical Interrupter for stepper dynamometer // Suited for low speed demonstrations! // Ed Nisley KE4ZNU August 2011 include </home/ed/Thing-O-Matic/lib/MCAD/units.scad> include </home/ed/Thing-O-Matic/Useful Sizes.scad> // Layout options Layout = "Build"; // Build Show Wheel Switch //- Extrusion parameters - must match reality! // Print with +2 shells and 3 solid layers ThreadThick = 0.33; ThreadWidth = 2.0 * ThreadThick; HoleWindage = 0.3; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; //- Wheel dimensions ShaftDia = (3/8) * inch; ShaftHeight = 27.39; // from motor mount assembly HubDia = IntegerMultiple(ShaftDia,ThreadWidth) + 15*ThreadWidth; HubLength = IntegerMultiple(10.0,ThreadThick); // total, not added to plate SetScrewOffset = 2*Tap4_40; SetScrewDia = Tap4_40; WheelRadius = IntegerMultiple(24.0,ThreadWidth); WheelThick = IntegerMultiple(1.5,ThreadThick); CutoutAngle = (2/50)*360; CutoutWidth = WheelRadius*tan(CutoutAngle); CutoutDepth = 6.0; echo(str("Wheel radius: ",WheelRadius," dia: ",2*WheelRadius," thick: ",WheelThick)); echo(str("Hub sidewall:",(HubDia - ShaftDia)/2)); echo(str("Cutout width: ",CutoutWidth," angle: ",CutoutAngle," depth: ",CutoutDepth)); //- Optical switch dimensions OSBaseLength = (31/32) * inch; OSBaseWidth = (1/4) * inch; OSBaseThick = 0.100 * inch; OSLeadSpace = 0.300 * inch; // leads fit though this opening OSHolesOC = (3/4) * inch; // switch mounting holes OSHoleDia = Tap4_40; SwHeight = IntegerMultiple((ShaftHeight + OSBaseWidth),ThreadThick); SwWidth = IntegerMultiple(OSBaseLength,ThreadWidth); SwThick = IntegerMultiple(OSBaseWidth,ThreadWidth); SwBaseWidth = 4*SwThick; // pillar base width SwBaseOC = IntegerMultiple(2.5*SwThick,1.0); // base screw spacing echo(str("Pillar height: ",SwHeight," width: ",SwWidth," thick: ",SwThick)); echo(str(" base screws: ",SwBaseOC," OC")); //---------------------- // Useful routines module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); FixDia = Dia / cos(180/Sides); cylinder(r=(FixDia + HoleWindage)/2, h=Height, $fn=Sides); } module ShowPegGrid(Space = 10.0,Size = 1.0) { Range = floor(50 / Space); for (x=[-Range:Range]) for (y=[-Range:Range]) translate([x*Space,y*Space,Size/2]) %cube(Size,center=true); } module Sector(OutR,InR,Thick,Angle) { difference() { cylinder(r=OutR,h=Thick); cylinder(r=InR,h=Thick); rotate([0,0,CutoutAngle/2]) translate([0,OutR,Thick/2]) cube([OutR*2,OutR*2,Thick],center=true); rotate([0,0,-CutoutAngle/2]) translate([0,-OutR,Thick/2]) cube([OutR*2,OutR*2,Thick],center=true); } } //-- Interrupter Wheel module Wheel() { difference() { union() { cylinder(r=WheelRadius,h=WheelThick); // base plate cylinder(r=HubDia/2,h=HubLength); // hub } translate([0,0,-Protrusion]) // shaft hole PolyCyl(ShaftDia,(HubLength + 2*Protrusion)); translate([0,0,(HubLength - SetScrewOffset)]) rotate([0,270,0]) PolyCyl(SetScrewDia,HubDia); translate([0,0,-Protrusion]) // sector cutout Sector((WheelRadius + Protrusion), (WheelRadius - CutoutDepth), (WheelThick + 2*Protrusion), CutoutAngle); } } //-- Optical Switch Mount module SwitchMount() { difference() { union() { // mounting pillar translate([0,0,SwHeight/2]) cube([SwThick,SwWidth,SwHeight],center=true); translate([0,0,SwThick/2]) cube([SwBaseWidth,SwWidth,SwThick],center=true); } translate([0,0,ShaftHeight]) { translate([-(SwThick/2 + Protrusion),0,0]) // lead clearance slot rotate([0,90,0]) scale([(OSBaseWidth/OSLeadSpace),1,1]) PolyCyl(OSLeadSpace,(SwThick + 2*Protrusion)); for (y=[-1,1]) // switch screws translate([0,(y*OSHolesOC/2),0]) rotate([0,90,0]) cylinder(r=Tap4_40/2,h=(SwThick + 2*Protrusion),center=true,$fn=6); } for (x=[-1,1]) // base screws translate([(x*SwBaseOC/2),0,-Protrusion]) rotate([0,0,(x-1)*90]) // get points outward PolyCyl(Clear4_40,(SwThick + 2*Protrusion)); } } //------------------- // Build it! ShowPegGrid(); if (Layout == "Build") { translate([0,WheelRadius,0]) Wheel(); translate([0,-SwWidth,0]) SwitchMount(); } if (Layout == "Wheel") Wheel(); if (Layout == "Switch") SwitchMount(); if (Layout == "Show") { translate([0,WheelThick/2,ShaftHeight]) rotate([90,0,0]) Wheel(); translate([(WheelRadius + OSBaseThick + SwThick/2),0,0]) SwitchMount(); }
The sizes differ slightly from the photos, but you’d never see the difference.
Blowback