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
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
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
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
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])
            rotate([0,90 + SpaceAngle,0]) rotate(180/FrameSides)
        translate([DownTube[LENGTH]/2,0,DownTube[ID]/2 - DownTube[LENGTH]*sin(SpaceAngle)/2])       // concentric with ID
            rotate([0,90 + SpaceAngle,0]) rotate(180/FrameSides)
        translate([MotorOffset,0,-(MotorOD/2 + ShiftSpace)])
            rotate([90,0,0]) rotate(180/48)


Nothing like actual riding to reveal what needs more thought!