The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Category: Recumbent Bicycling

Cruisin’ the streets

  • Bafang BBS02: Drop-bar Throttle Adapter

    Bafang BBS02: Drop-bar Throttle Adapter

    The Bafang BBS02 package includes a thumb-activated throttle which, like the display, should clamp onto a 22.2 mm handlebar. The one on Mary’s bike fit neatly at the end of the left handgrip:

    Tour Easy grips - left installed
    Tour Easy grips – left installed

    There’s no similar location on a drop-bar bike that doesn’t get in the way, particularly on my friend Gee’s bike with narrow bars.

    With a display handlebar adapter in hand, this seemed less awful than anything else I had in mind:

    Bafang Throttle adapter - front view
    Bafang Throttle adapter – front view

    That’s the front view, so it’s on the right side in front of the handlebar. I think it’s usable with either a thumb or fingertips from a hand on the top of the bar. The handlebar lacks tape, as mounting the brake sensors poses a challenge.

    The view from the rear isn’t too revealing:

    Bafang Throttle adapter - rear view
    Bafang Throttle adapter – rear view

    Not too unsightly, but definitely not a standard setup!

  • Bafang BBS02: Drop-bar Display Adapter

    Bafang BBS02: Drop-bar Display Adapter

    All of the Bafang BBS02 displays have a compression clamp intended for more-or-less standard 22.2 mm handlebars, as found on typical upright BMX-ish bikes suitable for conversion to e-bikes and, oddly, our Tour Easy recumbents. My friend’s bike has drop-bar handlebars with a 25.4 mm (yes, exactly 1 inch) center section that just isn’t going to fit through that hole.

    The least awful solution involved summoning an adapter from the vasty digital deep:

    Display adapter mount - solid model
    Display adapter mount – solid model

    The hole clamps around the handlebar with an M3 SHCS pulling it snug and the display clamps around the peg to hold everything together:

    Bafang Display adapter - front view
    Bafang Display adapter – front view

    There’s not much to see from the side:

    Bafang Display adapter - left view
    Bafang Display adapter – left view

    Those scuffs arrived on the protective plastic film!

    The OpenSCAD source code includes some cruft from an idea that didn’t work out quite right:

    HandlebarMax = 1*inch;                      // middle handlebar diameter
    HandlebarMin = 24.0;                        //  .. tape section
    
    BafangClampID = 22.3;                       // new handlebar diameter
    
    
    … snippage …
    
    // Handlebar mount for controller
    
    module DispMount() {
    
    ClampRing = [HandlebarMax,HandlebarMax + 2*WallThick,10.0];
    ClampOffset = (HandlebarMax + BafangClampID)/2 + 6.0;
    
    DispStudLenth = 16.5;
    
    NumSides = 24;
    
    Tilt = 0*atan2((ClampRing[OD] - BafangClampID)/2,ClampOffset);
    echo(str("Tilt: ",Tilt));
    
        difference() {
            union() {
                hull() {
                    cylinder(d=ClampRing[OD],h=ClampRing[LENGTH],$fn=NumSides);
                    translate([0,ClampOffset,0])
                        cylinder(d=BafangClampID,h=ClampRing[LENGTH],$fn=NumSides);
                }
                translate([0,ClampOffset,0])
                    cylinder(d=BafangClampID,h=ClampRing[LENGTH] + DispStudLenth,$fn=NumSides);
                translate([-ClampRing[ID]/4,-(ClampRing[OD]/2),ClampRing[LENGTH]/2])
                    rotate([0,90,0]) rotate(180/8)
                        cylinder(d=ClampRing[LENGTH]/cos(180/8),h=ClampRing[ID]/2,$fn=8);
            }
            cube([Kerf,4*ClampOffset,4*DispStudLenth],center=true);
            translate([0,0,-Protrusion])
                cylinder(d=ClampRing[ID],h=ClampRing[LENGTH] + 2*Protrusion,$fn=NumSides);
            translate([-ClampRing[ID]/2,-(ClampRing[OD]/2),ClampRing[LENGTH]/2])
                rotate([0,90,0]) rotate(180/8)
                    PolyCyl(Screw3[ID],ClampRing[ID],8);
            for (i=[-1,1])
                translate([i*ClampRing[ID]/4,-(ClampRing[OD]/2),ClampRing[LENGTH]/2])
                    rotate([0,i*90,0]) rotate(180/8)
                        PolyCyl(Washer3[OD],ClampRing[ID],$fn=8);
    
            translate([-5,25,EmbossDepth/2 - Protrusion/2])
                rotate(Tilt)
                    cube([4.5,21.5,EmbossDepth + Protrusion],center=true);
    
        }
    
        translate([-5,25,0])
            linear_extrude(height=EmbossDepth)
                rotate(90 + Tilt) mirror([0,1,0])
                  text(text="KE4ZNU",size=3.3,spacing=1.05,font="Bitstream Vera Sans:style=Bold",
                       halign="center",valign="center");
    
    }
    

    It’s rock-solid stable: pushing the buttons doesn’t budge it in the least.

  • Bafang BBS02 Programming Adapter: CP2102 Version

    Bafang BBS02 Programming Adapter: CP2102 Version

    The last view before sticking the lid in place with hot melt glue:

    Bafang BBS02 - CP2102 Programming Adapter
    Bafang BBS02 – CP2102 Programming Adapter

    The cable on the right goes to the motor controller through the display pigtail cable, sporting colors from a parallel universe.

    A (possibly not counterfeit) CP2102 USB-to-serial adapter allows a slightly smaller case than one with the known-fake FTDI adapter and added some identification:

    Bafang BBS02 - CP2102 Programming Adapter - case solid model
    Bafang BBS02 – CP2102 Programming Adapter – case solid model

    It splits along the midline for printing, of course.

    The OpenSCAD source code replaces the previous version:

    // Programming cable case
    
    ProgCavity = [60.0,18.0,7.0];
    ProgBlock = [70.0,24.0,13.0];
    ProgCableOD = 4.0;
    
    module ProgrammerCase() {
    
        difference() {
            hull() {
                for (i=[-1,1], j=[-1,1])
                    translate([i*(ProgBlock.x/2 - CornerRadius),j*i*(ProgBlock.y/2 - CornerRadius),-ProgBlock.z/2])
                        cylinder(r=CornerRadius,h=ProgBlock.z,$fn=12);
                }
            translate([-ProgBlock.x,0,0])
                rotate([0,90,0])
                    PolyCyl(ProgCableOD,3*ProgBlock.x,6);
            cube(ProgCavity,center=true);
    
            translate([0,0,ProgBlock.z/2 + ProgCavity.z/2 - EmbossDepth])
                cube(ProgCavity,center=true);
            translate([0,0,-(ProgBlock.z/2 + ProgCavity.z/2 - EmbossDepth)])
                cube(ProgCavity,center=true);
    
        }
    
        translate([0,4,ProgBlock.z/2 - EmbossDepth])
            linear_extrude(height=EmbossDepth)
                text(text="Bafang BBS02",
                     size=5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
                     halign="center",valign="center");
    
        translate([0,-4,ProgBlock.z/2 - EmbossDepth])
            linear_extrude(height=EmbossDepth)
                text(text="Programmer",
                     size=5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
                     halign="center",valign="center");
    
        translate([0,4,-ProgBlock.z/2])
            linear_extrude(height=EmbossDepth)
                mirror([1,0])
                    text(text="Ed Nisley",
                        size=5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
                        halign="center",valign="center");
        translate([0,-4,-ProgBlock.z/2])
            linear_extrude(height=EmbossDepth)
                mirror([1,0])
                    text(text="softsolder.com",
                        size=5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
                        halign="center",valign="center");
    
    }
    
    // Half case sections for printing
    
    module HalfCase(Section = "Upper") {
    
        intersection() {
           translate([0,0,ProgBlock.z/4])
                cube([2*ProgBlock.x,2*ProgBlock.y,ProgBlock.z/2],center=true);
            if (Section == "Upper")
                ProgrammerCase();
            else
                translate([0,0,ProgBlock.z/2])
                    ProgrammerCase();
        }
    }
    
    // .. snippage ..
    
            translate([0,2*Block.x/2 * gap,0]) {
    
                translate([gap*ProgBlock.x/2,0,ProgBlock.z/2])
                    rotate([180,0,0])
                        HalfCase("Upper");
                translate([-gap*ProgBlock.x/2,0,0])
                    HalfCase("Lower");
            }
    

    My friend rides about the same way we do, except from a much higher perch, so I’ll start her off with a configuration similar to the one we settled on for Mary’s Tour Easy.

  • Bafang BBS02: Speed Sensor Nut Reshaping

    Bafang BBS02: Speed Sensor Nut Reshaping

    A Bafang BBS02 (for a friend’s upright bike) arrived with a deformed speed sensor nut:

    Bafang BBS02 - Deformed speed sensor nut - end view
    Bafang BBS02 – Deformed speed sensor nut – end view

    It traveled halfway around the planet while trapped underneath the motor and, if it rode in the top layer or two of containers, the combination of pressure and heat would be irresistible.

    The plastic was stiff and I couldn’t force the nut over the connector using as much force as seemed reasonable:

    Bafang BBS02 - Deformed speed sensor nut - test assembly
    Bafang BBS02 – Deformed speed sensor nut – test assembly

    On the upside, the nut just compresses the silicone washer between the connector and the sensor to make a waterproof joint, so it need not have perfect threads or a uniform shape. Once the nut is in place, it will likely never be removed and should never bother anyone else.

    Being unwilling to apply a hot-air gun near the cable, I decided to try slowly cold-forming the nut inside a mold:

    Sensor Nut mold - solid model
    Sensor Nut mold – solid model

    The gap isn’t a kerf: the two halves meet to form a cylindrical pocket. The smaller holes fit a pair of brass tubes keeping the halves lined up while I arrange things:

    Bafang BBS02 - Deformed speed sensor nut - clamp detail
    Bafang BBS02 – Deformed speed sensor nut – clamp detail

    A pair of swivel-pad clamps apply the pressure:

    Bafang BBS02 - Deformed speed sensor nut - compression clamp
    Bafang BBS02 – Deformed speed sensor nut – compression clamp

    A few days of squashing made it round-er, whereupon I applied the clamp directly against the remaining high point with the other side cradled in the mold. It still doesn’t slide over the connector body, but I’m not in a rush.

    Bafang tech support generously sent a speed sensor extension cable from which I can extract a good nut, which will require cutting and splicing the cable from the motor.

    I’m still hoping gentle suasion will prevail.

    The OpenSCAD source code tucks into the overall file producing various useful bits:

    // Mold to reshape speed sensor nut
    
    SensorNut = [0,14.4,13.0];
    SensorMold = [SensorNut[OD] + 2*WallThick,SensorNut[OD] + 2*WallThick,SensorNut[LENGTH] + WallThick];
    MoldSides = 20;
    RodOD = 1.6;
    
    module NutMoldBlock() {
    
        difference() {
    
            translate([0,0,SensorMold.z/2])
                cube(SensorMold,center=true);
    
            translate([0,0,WallThick])
                rotate(180/MoldSides)
                    PolyCyl(SensorNut[OD],2*SensorNut[LENGTH],MoldSides);
            translate([0,0,-Protrusion])
                rotate(180/8)
                    PolyCyl(SpeedOD,2*SensorMold.z,8);
    
            for (i=[-1,1])
                translate([i*(SensorMold.x/2 - WallThick/2),SensorMold.y,SensorMold.z/2])
                    rotate([90,0,0])
                        PolyCyl(RodOD,2*SensorMold.y,6);
        }
    }
    
    module NutMold() {
        gap = 1.0;
    
        for (j=[-1,1])
            translate([0,j*gap,0])
                intersection() {
                    translate([0,j*SensorMold.y,0])
                        cube(2*SensorMold,center=true);
                    NutMoldBlock();
                }
    }
    
    … snippage …
    
    if (Layout == "NutMold")
        NutMold();
    
    

    I haven’t worked on a safety bike in years!

  • Rt 376 at Zack’s Way: Almost a Right Hook

    Rt 376 at Zack’s Way: Almost a Right Hook

    I’m approaching Zack’s Way at about 20 mph when a truck appears to my left:

    Rt 376 at Zacks Way - Right Hook Setup - 2021-06-04
    Rt 376 at Zacks Way – Right Hook Setup – 2021-06-04

    I cannot see the turn signals, but I’ve been around this block several times.

    This time, however, what I know (and the driver apparently doesn’t) is that Zack’s Way has been closed for two days while a film crew does something to create The White House Plumbers along that stretch of road, with barricades and City of Poughkeepsie police cars across the entrance to prevent bystanders from wandering in.

    At least I’ll have witnesses …

    NYS DOT installed a pair of Variable Message Signs showing ZACK'S WAY | CLOSED | Thursday & Friday on either side of the intersection:

    Rt 376 at Zacks Way - Closure VMS - 2021-06-04
    Rt 376 at Zacks Way – Closure VMS – 2021-06-04

    Fortunately, the driver figured it out before our paths crossed:

    Rt 376 at Zacks Way - Right Hook Miss - 2021-06-04
    Rt 376 at Zacks Way – Right Hook Miss – 2021-06-04

    But, hey, those signs are easy to overlook, too …

    I have typed “Zach’s Way”, rather than the correct “Zack’s Way”, on several posts.

  • Bicycle Helmet Mirror: Stalk Repair

    Bicycle Helmet Mirror: Stalk Repair

    The mirror on my bike helmet snagged on a mesh fence while walking the bike to Mary’s garden:

    Helmet Mirror - bent stalk
    Helmet Mirror – bent stalk

    One of the good things about building your own stuff is that you have all the parts when something breaks:

    Helmet Mirror - damaged parts
    Helmet Mirror – damaged parts

    The decorative M2 screw and insert pulled out of the ball. The rim of the nail set punch (intruding from the top) just barely caught the edge of the stub inside the ball, so a few taps could extract it. A Dremel cutoff wheel peeled the crumpled end off the stalk.

    Reassembly proceeded without incident:

    Helmet Mirror - installed
    Helmet Mirror – installed

    The bizarrely blurred mirror over on the left comes from the Pixel phone camera app deciding this was a Portrait, applying a background blur, and running into trouble with those hard edges in the foreground. The camera app has a distinct Portrait mode that, perhaps, I inadvertently engaged while fumbling around.

  • Tour Easy: Rear Fender Bracket Installed

    Tour Easy: Rear Fender Bracket Installed

    A rainy day finally produced an opportunity to install the rear fender bracket on my bike:

    Tour Easy Rear Fender Bracket - improved
    Tour Easy Rear Fender Bracket – improved

    It’s actually another iteration, tweaked to hold the fender snugly against the bracket, because it’s tucked in a location where I can’t measure anything.

    The brake noodle isn’t connected yet, but it has plenty of room in front of the fender block.