Tour Easy: Bafang Mid-drive vs. Cateye Cadence Sensor

For inscrutable reasons, the Bafang 500C display includes all stopped time in its average trip speed. While that is, in fact, the average speed over the entire trip, the Cateye cyclocomputers we’ve been using forever stop averaging after a few seconds at 0 mph.

Bonus: Although the Bafang BBS02 motor knows the pedal cadence, it’s not part of the display.

The Bafang BBS02 bottom bracket shaft put its pedal cranks much farther from the Tour Easy’s frame than the Shimano cranks, to the extent that the existing Cateye cadence sensor position just wasn’t going to work, so I printed a simple clip to fit over the motor’s “fixing plate”:

Tour Easy Bafang BBS02 motor
Tour Easy Bafang BBS02 motor

It turns out putting a magnetic sensor immediately next to the winding end of a high-current three-phase motor isn’t the brightest idea I’ve ever had. The Cateye cadence display spent most of its time maxed out at 199 rpm, far faster than Mary can spin for, well, a single revolution.

A somewhat more complex mount put the sensor roughly where it used to be:

Cateye Cadence Sensor mount - installed
Cateye Cadence Sensor mount – installed

It looks precarious, but it spent nigh onto two decades there without incident, so we have precedent.

Those are the original 165 mm Shimano cranks, because the 170 mm Bafung cranks threatened to lock out her knees. More on this in a while, as it’s a more complex issue than it may appear.

The solid model looks about like you’d expect:

Cateye Cadence Sensor mount - solid model
Cateye Cadence Sensor mount – solid model

The OpenSCAD code replaces the simple clip in the original GitHub Gist:

// Cateye cadence sensor bracket

LockRingDia = [44.0,46.0];
LockRingLen = [4.0,6.5];
LockRingOAD = LockRingDia[1] + 2*WallThick;
LockRingOAL = LockRingLen[0] + LockRingLen[1];

Notches = 16;
SensorAngle = 3*360/Notches;
SensorBase = 10.0;

module Cateye() {

    difference() {
        union() {
            cylinder(d=LockRingOAD,h=LockRingOAL,$fn=Notches);
            translate([LockRingOAD/2 + LockRingOAL/2 - WallThick/2,0,LockRingOAL/2])
                cube([LockRingOAL + WallThick,2*WallThick + Kerf,LockRingOAL],center=true);
      rotate(SensorAngle)
                translate([LockRingOAD/2 + SensorBase - WallThick/2,0,LockRingOAL/2])
                    cube([2*SensorBase + WallThick,2*WallThick,LockRingOAL],center=true);
        }
        translate([0,0,LockRingLen[0]])
            PolyCyl(LockRingDia[1],LockRingOAL,Notches);
        translate([0,0,-Protrusion])
            PolyCyl(LockRingDia[0],2*LockRingOAL,Notches);

        translate([LockRingDia[0],0,0])
            cube([2*LockRingDia[0],Kerf,4*LockRingOAL],center=true);
        translate([LockRingOAD/2 + LockRingOAL/2,2*WallThick,LockRingOAL/2])
            rotate([90,0,0])
                PolyCyl(3.0,4*WallThick,6);

        rotate(SensorAngle)
            translate([LockRingOAD/2 + 2*SensorBase - SensorBase/2,2*WallThick,LockRingOAL/2])
                rotate([90,0,0])
                    PolyCyl(3.0,4*WallThick,6);
    }

}