After adding the Bafang motor to my Tour Easy, the chain has fallen off the chainring a few times, prompting the gap filler between the motor and the chainring spider. That this has never happened to Mary’s essentially identical Tour Easy suggests I have a different shift technique, but adding a chain catcher seemed easier than re-learning shifting:

It’s more properly called a “chain guide” and is basically a shifter cage minus the mechanism:

Because the Tour Easy frame has a 25 mm tube where the guide’s clamp expects a minimum 31.8 mm tube, a 3D printed adapter fills the gap:

The hole is off-center because it seemed like a good idea, although it’s not strictly necessary. The flange helps align the pieces while tightening the clamp screw.
The guide cage clears the chain on all sides while up on the work stand, but there’s nothing like getting out on the road to find out why something doesn’t work as you expect.
The OpenSCAD source code as a GitHub Gist:
// Chain catcher adapter ring | |
// Ed Nisley - KE4ZNU - 2023-05 | |
/* [Hidden] */ | |
ThreadThick = 0.25; | |
ThreadWidth = 0.40; | |
HoleWindage = 0.2; | |
Protrusion = 0.1; // make holes end cleanly | |
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
ID = 0; | |
OD = 1; | |
LENGTH = 2; | |
inch = 25.4; | |
//---------------------- | |
// Dimensions | |
TubeOD = 26.0; // frame tube with silicone tape | |
Clamp = [35.0,39.0,12.0]; // Chain catcher clamp ring | |
Flange = [Clamp[ID],Clamp[OD],3*ThreadThick]; | |
Kerf = 1.0; | |
Offset = (Clamp[ID] - TubeOD)/2 - 3*ThreadWidth; | |
NumSides = 2*3*4; | |
//----------------------- | |
$fn=NumSides; | |
difference() { | |
union() { | |
cylinder(d=Flange[OD],h=Flange[LENGTH]); | |
cylinder(d=Clamp[ID],h=Clamp[LENGTH]+Flange[LENGTH]); | |
} | |
cube([2*Flange[OD],Kerf,3*Clamp[LENGTH]],center=true); | |
translate([0,Offset,0]) | |
cylinder(d=TubeOD,h=3*Clamp[LENGTH],center=true); | |
} |