The prototype X Rod Follower turned out to be pretty good fit, after I filed a slot in the back for the belt clamp. The bearings wound up 1.5 mm too close to the centerline, but a pair of #4 washers on each post solved that problem. The tweaked OpenSCAD source below should produce a drop-in replacement.

It’s important to center the bearings on the rod, because they’re designed to support only radial loads. In a normal application the bearings live in a slip-fit pocket that supports the entire outer race, but here an off-center point contact applies an axial force and misaligns the bearing races. They can’t handle axial forces at all: you (well, I) can easily feel the difference an axial millimeter makes.
With the follower in place, the force required to move the beltless X stage dropped from 0.75 pounds to zero: the stage slides back and forth across the entire length of the rods with a finger tap! The mechanical overconstraint on rods simply Went Away, pretty much as I expected.
[Update: In case it’s not obvious from the picture, you must remove both bronze bushings from the front of the X stage when you install this Follower. Leave the back pair in place.]
After installing and tensioning the drive belt, the stage still requires about 1 pound = 0.5 kg = 5 N to push along the rods, but now there’s no mechanical binding at any point along the way. That’s with the motor unplugged from the driver; you don’t want to count the effort required to light the LEDs!
Now, to reassemble and realign the rest of the build platform again.
The OpenSCAD source has only a few dimension numbers changed from the previous version, but here it is in one cut-n-paste lump:
[Update: You should use carmiac’s version, which prints better. The original code says “rear guide rod follower” but it turned out to fit better on the front of the X stage.]
// Thing-O-Matic X Stage front guide rod follower // Ed Nisley - KE4ZNU - Mar 2011 include </home/ed/Thing-O-Matic/lib/MCAD/units.scad> Build = false; // set true to generate buildable layout $fn = 8; // default for holes // Extrusion values // Use 2 extra shells behind the perimeter // ... and 3 solid shells on the top & bottom ThreadThickness = 0.33; ThreadWT = 1.75; ThreadWidth = ThreadThickness * ThreadWT; HoleWindage = ThreadWidth; // enlarge hole dia by extrusion width Protrusion = 0.1; // extend holes beyond surfaces for visibility // Bearing dimensions BearingOD = (3/8) * inch; // I used a hard-inch bearing -- try a 603 or 693 BearingID = (1/8) * inch; BearingThick = (5/32) * inch; BearingBoltDia = 3.0; // allow this to shrink: drill & tap the threads! BearingBoltRadius = BearingBoltDia/2; BearingStemOD = BearingBoltDia + 6*ThreadWidth; BearingStemRadius = BearingStemOD/2; BearingStemLength = 2.0; // X guide rod dimensions RodDia = (3/8) * inch; // hard inch rod RodRadius = RodDia/2; RodLength = 75; // for display convenience RodClearTop = 12.6; // clearance from HBP to rod RodClearSide = 9.7; // ... idler to rod RodClearBottom = 10.7; // ... rod to Y stage RodClearCirc = 1.5; // ... around circumference // Drive mounting piece (from ABP teardown) DriveHolesX = 16.0; // on-center distance DriveHolesZ = 9.0; // on-center distance DriveHoleZOffset = -5.0; // below bottom of HBP platform DriveHeight = 28.0; DriveBoltDia = 3.0 + HoleWindage; // bolt dia to hold follower in place DriveBoltRadius = DriveBoltDia/2; DriveBoltHeadDia = 6.0 + HoleWindage; DriveBoltHeadRadius = DriveBoltHeadDia/2; DriveBoltWeb = 4.5; // leave this on block for 12 mm bolts HBPNutDia = 4.0; // HBP mounting nut in middle of idler HBPNutRadius = HBPNutDia/2; HBPNutRecess = 0.5; // ... pocket for corner of nut HBPNutZOffset = -10.0; // ... below bottom of HBP platform BeltWidth = 7.0; // drive belt slots BeltThick = 1.2; // ... backing only, without teeth BeltZOffset = -22.5; // ... below bottom of HBP platform // Bearing locations Preload = 0.0; // positive to add pressure on lower bearing TopZ = RodRadius + BearingOD/2; BottomZ = Preload - TopZ; // Follower dimensions BlockWidth = 28.0; // along X axis, must clear bolts in idler BlockHeight = RodDia + 2*BearingOD - Preload; BlockThick = (RodClearSide + RodRadius) - BearingThick/2 - BearingStemLength; BlockHeightPad = RodClearTop - BearingOD; echo(str("Block Height: ",BlockHeight)); echo(str("Block Height Pad: ",BlockHeightPad)); echo(str("Block Thick: ",BlockThick)); BottomPlateWidth = 10.0; BottomPlateThick = 5.0; BlockTop = RodRadius + RodClearTop; BlockOffset = BlockThick/2 + BearingStemLength + BearingThick/2; echo(str("Drive wall to rod center: ",BlockThick + BearingStemLength + BearingThick/2)); // Construct the follower block with module Follower() { difference() { union() { translate([0,BlockOffset,0]) difference() { union(){ cube([BlockWidth,BlockThick,BlockHeight],center=true); translate([0,0,(BlockHeight + BlockHeightPad)/2]) cube([BlockWidth,BlockThick,BlockHeightPad],center=true); } for(x=[-1,1]) for(z=[0,1]) translate([x*DriveHolesX/2, Protrusion/2, (BlockHeight/2 + BlockHeightPad + DriveHoleZOffset - z*DriveHolesZ)]) rotate([90,0,0]) cylinder(r=DriveBoltRadius, h=(BlockThick + Protrusion), center=true); for(x=[-1,1]) for(z=[0,1]) translate([x*DriveHolesX/2, (-(DriveBoltWeb + Protrusion)/2), (BlockHeight/2 + BlockHeightPad + DriveHoleZOffset - z*DriveHolesZ)]) rotate([90,0,0]) cylinder(r=DriveBoltHeadRadius, h=(BlockThick - DriveBoltWeb + Protrusion), center=true); translate([0, ((BlockThick - BeltThick + Protrusion)/2), (BlockHeight/2 + BlockHeightPad + BeltZOffset)]) cube([(BlockWidth + 2*Protrusion), (BeltThick + Protrusion), BeltWidth],center=true); } translate([0,BearingStemLength/2 + BearingThick/2,TopZ]) rotate([90,0,0]) cylinder(r=BearingStemRadius,h=BearingStemLength,center=true,$fn=10); translate([0,BearingStemLength/2 + BearingThick/2,BottomZ]) rotate([90,0,0]) cylinder(r=BearingStemRadius,h=BearingStemLength,center=true,$fn=10); } translate([0,(BlockOffset - BearingStemLength/2),TopZ]) rotate([90,0,0]) cylinder(r=BearingBoltRadius, h=(BlockThick + BearingStemLength + 2*Protrusion), center=true); translate([0,(BlockOffset - BearingStemLength/2),BottomZ]) rotate([90,0,0]) cylinder(r=BearingBoltRadius, h=(BlockThick + BearingStemLength + 2*Protrusion), center=true); translate([0, (BlockThick + BearingStemLength + BearingThick/2 - (HBPNutRecess - Protrusion)/2), (BlockHeightPad + BlockHeight/2 + HBPNutZOffset)]) rotate([90,0,0]) cylinder(r=HBPNutRadius,h=(HBPNutRecess + Protrusion),center=true); rotate([0,90,0]) cylinder(r=(RodRadius + RodClearCirc),h=RodLength,center=true,$fn=32); } } // Arrange things for construction if (Build) translate([0,(-BlockHeightPad/2),(BlockOffset + BlockThick/2)]) rotate([-90,0,0]) Follower(); // Arrange things for convenient inspection if (!Build) { Follower(); translate([0,0,TopZ]) rotate([90,0,0]) #cylinder(r=BearingOD/2,h=BearingThick,center=true,$fn=32); translate([0,0,BottomZ]) rotate([90,0,0]) #cylinder(r=BearingOD/2,h=BearingThick,center=true,$fn=32); rotate([0,90,0]) #cylinder(r=RodDia/2,h=RodLength,center=true,$fn=32); }
Nice to hear that it works so well! I’ve been planning on installing this next time I do a XY teardown. Are you planning on posting the script up on Thingiverse?
It’s easy to print, only moderately annoying to install, and definitely a win!
Somebody must report back on how well it fits the ABP plastic frame. Perhaps removing the padding block I added to the top will work better in that situation.
I suppose I should, but I admit to not being particularly enthusiastic about starting Yet Another Spot for updates & discussion… I have enough trouble keeping up with stuff here!
If you think it works well enough to add to your list of TOM updates, that should suffice.
You had. We’re just back from a week of the DC touristy thing after a spur-of-the-moment decision. My wrists thank me for seven days of not typing, but the first couple of cold-turkey days were rough.
Now that you’ve had a post approved, your comments will appear automagically. Alas, I must moderate first posts to weed out spammers.
I’ve made a few changes to the script to make the belt notch more printable. Basically, I just flipped it on its side and added supports for the bearing stems. I’d like to release my version on Thingiverse, but since it is almost entirely your work, I feel I should have your permission and input on licenses. I would, of course, link back here and give you credit as primary author.
Thanks!
Go for it!
Everything here is under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License, which is, I think, OK by Thingiverse. If not, let me know and we can puzzle something out.
Now I’ll have a good reason to figure out how support works; be sure to mention all the weird parameters that go into making it happen…
Very nice! This is where having a second machine comes in handy, to use each to upgrade the other. ;-)
Great, it’s up at http://www.thingiverse.com/thing:8158
The bearing stem support was an easy trick. I just turned it into a partial cone instead of a cylinder, so the overhang angle wasn’t too big.
Oh! It fits great into an ABP just as is.
When I print it again, it’ll be your version on the platform!
Can’t find “units.scad” include file.
Did acuire some bearings in the sugesset size 3x8x4 – the dont match – therefore i neet the include file to be able to do the mod for the new bearings.
Joakim
That’s part of the invaluable MCAD collection that no OpenSCAD program should be without…
Ok- trouble coming. Please provide a *.dxf file. I can’t run OpenSCAD on my dynosaur abacus.
Looks like it’s time to upgrade the abacus, because OpenSCAD tells me it can’t turn the Follower into a DXF file: “Current top level object is not a 2D object.”