-
Bafang BBS02: Improved Motor Reaction Spacer
The original BBS02 reaction spacer for Gee’s Terry Symmetry didn’t work quite the way I expected:

Bafang BBS02 – reaction block displacement The motor evidently vibrates enough to propel the block forward, shearing the double-sticky foam tape which was never intended to resist force in that plane. I thought the block was located at the point where the motor casing was tangent to the frame tube, so as to equalize the forces in both directions, but … nope.
A revised design based on measurements informed by new knowledge:

Terry – Bafang motor spacer – improved – solid model The upper curve is now symmetric and the whole block mounts more rearward under the bottom bracket lug, where some tedious work with a machinists square located the real tangent point:

Bafang BBS02 – reaction block improvement The motor sure doesn’t look like it’s tangent, but a dry fit showed all the curves laid against the case and tubes.
The brazing fillet means the step fitting the downtube can’t sit snug against the edge of the lug, but most of the reaction force should go through the section into the lug, near the center of the block.
A crude marker will keep track of any motion:

Bafang BBS02 – reaction block marker I think the symmetric curve against the motor has enough projection to keep the block from wandering off, even if I haven’t gotten the location exactly right.
Stipulated: Hope is not a strategy.
The OpenSCAD source code:
MotorOD = 111; // motor frame dia MotorOffset = 10.0; // motor OD tangent wrt lug edge ShiftSpace = 6.0; // motor to frame space LugLength = 25.0; // length of section over BB lug Spacer = [5.0 + LugLength,DownTube[ID]/2,4*ShiftSpace]; SpaceAngle = 0*atan(1.8/Spacer.x); // tilt due to non-right-angle meeting echo(str("Spacer angle: ",SpaceAngle)); module MotorSpacer() { difference() { translate([LugLength - Spacer.x/2,0,0]) cube(Spacer,center=true); translate([0,0,DownTube[ID]/2]) rotate([0,90 + SpaceAngle,0]) rotate(180/FrameSides) cylinder(d=DownTube[ID],h=DownTube[LENGTH],$fn=FrameSides,center=true); translate([DownTube[LENGTH]/2,0,DownTube[ID]/2 - DownTube[LENGTH]*sin(SpaceAngle)/2]) // concentric with ID rotate([0,90 + SpaceAngle,0]) rotate(180/FrameSides) cylinder(d=DownTube[OD],h=DownTube[LENGTH],$fn=FrameSides,center=true); translate([MotorOffset,0,-(MotorOD/2 + ShiftSpace)]) rotate([90,0,0]) rotate(180/48) cylinder(d=MotorOD,h=2*Spacer.y,$fn=48,center=true); } }Nothing like actual riding to reveal what needs more thought!