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

  • Better Bike Mirror Doodles

    Mirror Mount - Unworkable Doodles
    Mirror Mount – Unworkable Doodles

    Having had many bike helmet mirrors disintegrate over the miles and years, I’ve had a background project bubbling along to build something more durable. Whether that’s feasible or not remains to be seen, but here’s another go at it.

    A full-up ball joint seems to be more trouble than it’s worth and, in any event, requires far too much precision to be easily duplicated. That renders those doodles, mmm, inoperative.

    These doodles aren’t workable, either, but they convert the ball joint into two orthogonal rotating joints that could be 3D printed with some attention to detail.

    The general idea:

    • An ordinary inspection mirror has most of the tricky bits
    • An azimuth-elevation mount aligns the shaft relative to the helmet
    •  The mirror shaft extends to put the mirror forward of your eye
    • The existing mirror ball joint aligns the mirror relative to your eye

    What’s not to like:

    • Exposed screw heads
    • Off-center, hard-to-grip adjustments
    • Probably not printable without support due to all the bearing surfaces and cutouts and suchlike
    Mirror Mount - Doodles
    Mirror Mount – Doodles

    A few more days of doodling produced something that seems better. The az-el joint axes and the mirror shaft axis now meet at a common point, so the mirror shaft moves as the radius of a sphere. The elevation screw hides behind the azimuth mount, out of the way, which makes it awkward to adjust the tension.

    The helmet mount plate must be concave to more-or-less match the helmet curvature. I’ve been securing mirrors using double-sided foam tape to good effect, but it requires a fairly large pad to provide enough adhesive force.

    Two glue joints make everything buildable and should have basically the same strength as the parts themselves. The helmet plate builds concave face up. The az and el mounts build with the bearings upward, as do the mating surfaces on the other parts. Maybe the screws need actual nuts embedded in the mating parts, in which case there may be problems.

    The setscrew holding the mirror shaft can crush the tube; I think they’re thin brass, at best. Putting a stud screw on the end will hold the shaft in place, leaving the setscrew to prevent rotation. Perhaps the stud can reinforce the tube.

    What’s not to like:

    • Many parts (but all buildable at once)
    • It sticks out too far from the side of the helmet
    • Ugly on a stick

    But maybe something will come of it.

  • Bike Mirror Re-Repair

    A gust of wind blew Mary’s bike helmet off the seat and, by the conservation of perversity, it landed on the mirror with predictable results:

    Broken helmet mirror mount
    Broken helmet mirror mount

    I affixed the two ends with solvent glue, then epoxied a brass tube around them to stiffen it up. While I had the epoxy and brass out, I added a splint over a previous repair near the mirror ball:

    Re-repaired mirror mount
    Re-repaired mirror mount

    After taking that picture, I heated and bent the remaining shaft just slightly to put the ball near the middle of its range. There’s no possible way this can survive this year’s cycling, so I must get cracking on building some durable mirrors. A 3-D printer should come in handy for something in that project!

  • Thing-O-Matic: Fairing Clamp Plates

    Although those pink clamp plates worked well enough, they did not provide, shall we say, a completely satisfactory user experience. I reprinted new sets in red while varying the extruder speed by 0.1 rev/min, with small tweaks to the overlap between the infill and the loop threads.

    First, the big pictures with details scrawled on the back of the lower plate…

    At 3.2 rpm, which is only slightly too fast:

    Fairing Plate - 3.2 rpm
    Fairing Plate – 3.2 rpm

    At 3.3 rpm, a bit overstuffed:

    Fairing Plate - 3.3 rpm
    Fairing Plate – 3.3 rpm

    At 3.4 rpm, there’s obviously too much plastic:

    Fairing Plate - 3.4 rpm
    Fairing Plate – 3.4 rpm

    Some closeups, in the same order…

    At 3.2 rpm with 0.20 overlap, it looks OK:

    Fairing Plate - 3.2 rpm detail
    Fairing Plate – 3.2 rpm detail

    At 3.3 rpm with 0.25 overlap, which pretty much devours the inner loop thread:

    Fairing Plate - 3.3 rpm detail
    Fairing Plate – 3.3 rpm detail

    At 3.4 rpm with 0.25 overlap there’s serious overfill:

    Fairing Plate - 3.4 rpm detail
    Fairing Plate – 3.4 rpm detail

    In all cases, the extruder left a track while exiting upward from near the middle of the images. Even at 3. 2 rpm there’s slightly too much plastic.

    My ladies don’t care about the fine details. They prefer red to pink and the clamps hold the fairings firmly in place…

  • Tour Easy: Zzipper Fairing Lower Mount Plates

    Those plates handle the upper mount points, but the fairing also attaches to each side of the front fork. A nice rounded oval mates the fairing to the bracket, with two foam pads adapting the flat plates to the curved fairing surface. This view shows the outside of the fairing:

    Lower mount - front
    Lower mount – front

    The hole position requires a mirror-image pair of mounts that, mercifully, all fit on the build platform at once. The solid models look about like you’d expect:

    Lower Bushings
    Lower Bushings

    Those little tabs on the inside edge of the bracket recess printed about as poorly as you’d expect, but they’re not really critical.

    I printed a set of white plates for my bike, installed the new filament tensioner, and went full frontal Barbie for my favorite ladies. This view shows the inside of the fairing:

    Lower mount - rear
    Lower mount – rear

    Turns out my ladies don’t like pink any more than I do.

    The OpenSCAD source:

    // Clamp plates for Zzipper fairing on Tour Easy recumbents
    // Ed Nisley - KE4ZNU - Mar 2011
    
    // Build with...
    //	extrusion parameters matching the values below
    //	4 outer shells
    //	4 solid surfaces at top + bottom
    
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    // Extrusion parameters for successful building
    
    ThreadWidth = 0.55;					// should match extrusion width
    ThreadZ = 0.33;						// should match extrusion thickness
    
    HoleWindage = ThreadWidth;			// enlarge hole dia by extrusion width
    
    // Plate dimensions
    
    Layer1X = 35;						// against fairing surface
    Layer1Y = 30;
    Layer1Z = 2*ThreadZ;
    
    HoleOffsetX = 5.0;					// will be sign-flipped as needed
    HoleOffsetY = -(Layer1Y/2 - 10.0);
    
    Layer2Margin = 1.5;					// uncovered edge
    Layer2X = Layer1X - 2*Layer2Margin;
    Layer2Y = Layer1Y - 2*Layer2Margin;
    Layer2Z = 3*ThreadZ;
    
    MountX = 16.3 + HoleWindage;		// front fork mounting plate
    MountHoleOffset = 13.0;				// Y end to hole center
    MountY = Layer1Y;
    MountZ = 4*ThreadZ;					// recess depth
    MountCap = 3.0;						// endcap arc height
    MountR = (pow(MountCap,2) + 0.25*pow(MountX,2)) / (2*MountCap);	// ... radius
    
    Layer3Margin = 1.5;
    Layer3X = Layer2X - 2*Layer3Margin;
    Layer3Y = Layer2Y - 2*Layer3Margin;
    Layer3Z = 3*ThreadZ;
    
    PlateZ = Layer1Z + Layer2Z + Layer3Z;
    
    HoleDia = 0.25 * inch;				// these are 1/4-20 bolt holes
    
    // Convenience settings
    
    BuildOffsetX = 3.0 + Layer1X/2;		// build X spacing between top & bottom plates
    BuildOffsetY = 3.0 + Layer1Y/2;		//	... Y
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    
    //---------------
    // Create plate
    
    module Plate() {
    
      union() {
    	  translate([0,0,Layer1Z/2])
    		scale([Layer1X,Layer1Y,1]) cylinder(r=0.5,h=Layer1Z,$fn=32,center=true);
    	  translate([0,0,Layer1Z + Layer2Z/2])
    		  scale([Layer2X,Layer2Y,1]) cylinder(r=0.5,h=Layer2Z,$fn=32,center=true);
    	  translate([0,0,Layer1Z + Layer2Z + Layer3Z/2])
    		  scale([Layer3X,Layer3Y,1]) cylinder(r=0.5,h=Layer3Z,$fn=32,center=true);
      }
    
    }
    
    //---------------
    // Create hole
    
    module Hole(OffsetX,OffsetY) {
    
      translate([OffsetX,OffsetY,PlateZ/2])
    	cylinder(r=(HoleDia + HoleWindage)/2,
    			h=(PlateZ + 2*Protrusion),
    			center=true,$fn=10);
    
    }
    
    //---------------
    //-- Build the things...
    
    // Right side
    
    translate([BuildOffsetX,BuildOffsetY,0])
      difference() {
    	Plate();
    	Hole(HoleOffsetX,HoleOffsetY);
      }
    
    translate([BuildOffsetX,-BuildOffsetY,0])
      difference() {
    	  Plate();
    	  Hole(-HoleOffsetX,HoleOffsetY);
    	  translate([-HoleOffsetX,(HoleOffsetY - MountY/2 + MountHoleOffset),(PlateZ - MountZ/2 + Protrusion/2)])
    		intersection() {
    		  cube([MountX,MountY,(MountZ + Protrusion)],center=true);
    		  translate([0,(MountY/2 - MountR),0]) cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		}
      }
    
    // Left side
    
    translate([-BuildOffsetX,BuildOffsetY,0])
      difference() {
    	Plate();
    	Hole(-HoleOffsetX,HoleOffsetY);
      }
    
    translate([-BuildOffsetX,-BuildOffsetY,0])
      difference() {
    	  Plate();
    	  Hole(HoleOffsetX,HoleOffsetY);
    	  translate([HoleOffsetX,(HoleOffsetY - MountY/2 + MountHoleOffset),(PlateZ - MountZ/2 + Protrusion/2)])
    		intersection() {
    		  cube([MountX,MountY,(MountZ + Protrusion)],center=true);
    		  translate([0,(MountY/2 - MountR),0]) cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		}
      }
    
  • Tire Liner Abrasion

    Just fixed a flat on my bike which, like that one, came from the tire liner chewing through the tube. The holes are above the raised 28″ molded into the tube, at the upper-left corner of the tire liner impression.

    Schwalbe tube with tire liner abrasion
    Schwalbe tube with tire liner abrasion

    In this case, the tire liner (which, judging from the color, was a Slime) was too short by maybe 50 mm. This view inside the tire shows a 10 mm gap where the ends didn’t overlap as they should:

    Schwalbe Maration tire with liner abrasion
    Schwalbe Maration tire with liner abrasion

    I don’t trim the rear-tire  liners, but comparing a handful in the drawer shows that the as-sold lengths differ by a few tens of millimeters. The Marathons are husky tires, but the tread OD isn’t all that much different from stock tires: that’s the definition of a 700-series tire.

    That we’re getting repeated flats from tire liners intended to eliminate flats is, mmmm, disturbing. Looking at the condition of the tire treads, however, shows we’re not getting an order of magnitude more flats from road debris, so it’s a net win. I doubt we could get through a month of riding without a flat; I replace tires when the carcasses accumulate enough gashes that the tire liners begin extruding through the tread.

    Also, remember that these samples come from three bikes that travel upwards of 2000 miles a year (each!), not just one bike ridden along a nice rail trail on weekends…

  • Tour Easy: Zzipper Fairing Upper Mount Plates

    The stock Zzipper fairing handlebar mount consists of an aluminum bar with a plate welded to each end at more-or-less the correct angle to match the fairing curve. The plate has a 1/4 inch hole in one end, wherein a 1/4-20 nylon machine screw clamps the fairing to the plate, with a nylon washer distributing the stress. That doesn’t cope well with the vibrations caused by riding around here, let alone our summer vacation trips on crushed-stone rail trails, and the fairings tend to stress-crack at the holes.

    These 3D printed plates are just the latest in a long series of attempts to distribute the stress over a larger area. The outside view:

    Fairing mount - outside
    Fairing mount – outside

    The open hole gets another screw to hold the plates in position. The bump on the far side is an Oozebane turd, about which more later.

    The view from inside the fairing:

    Fairing mount - inside
    Fairing mount – inside

    You can’t see the layer of black foam rubber salvaged from a mouse pad between each plate and the fairing. That should prevent any local stress concentration at the screw and ease the transition to the tapered plate edges.

    The solid model looks about like you’d expect:

    Fairing Mount Plates - Upper
    Fairing Mount Plates – Upper

    The hole position depends on the fairing position, as the fairings have three holes. The pictures show the fairing on my bike; it’s in the lowest position, with the screw in the topmost hole. The OpenSCAD file has an option to put the holes where you need them.

    The plates are only 8 layers thick, printed with 4 solid layers top and bottom to eliminate any fill. You could do the same by setting the fill to 100%, I suppose. Using 4 outer shells (3 additional) makes the flanged edge nice and flat and uniform.

    The layer height is 0.33 mm, with w/t=1.7 for a width of 0.56 mm. Feed rate = 43 mm/s and flow rate = 255. DC Extruder, alas.

    Running the first layer at feed = 0.5  and flow = 0.75 produces some fluffing in the fill, but there’s no way to get a lower flow from the DC extruder motor. Flow = 0.75 corresponds to PWM=191; anything lower sometimes fails to start the motor. If it starts, it’ll run, but … that’s not dependable.

    I printed them on an aluminum plate for a nice flat bottom surface.

    The OpenSCAD source code:

    // Clamp plates for Zzipper fairing on Tour Easy recumbents
    // Ed Nisley - KE4ZNU - Mar 2011
    
    // Build with...
    //	extrusion parameters matching the values below
    //	4 outer shells
    //	4 solid surfaces at top + bottom
    //  slow feeds to ensure hole perimeters stick to fill
    
    include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    // Select hole layout
    // The if statement seems to work only for CSG object trees
    // Fortunately, I need only two different layouts...
    
    HoleSelect = 1;						// 0 = his, 1 = hers
    
    HolesTop 	= (0 == HoleSelect) ? [0,1,1] : [1,0,1];
    HolesBottom = (0 == HoleSelect) ? [0,1,1] : [1,0,1];
    
    // Set these to match the extrusion parameters for successful building
    
    ThreadZ = 0.33;						// extrusion thickness
    ThreadWidth = 0.57;					// extrusion width = ThreadZ x w/t
    
    HoleWindage = ThreadWidth;			// enlarge hole dia by extrusion width
    
    // Plate dimensions
    
    HoleDia = 0.25 * inch;				// these are 1/4-20 bolt holes
    HoleSpace = (1) * inch;				// center-to-center spacing
    									//  usually 1 inch, but 15/16 on one bike
    
    CornerR = 5.0;						// corner rounding
    
    Layer1X = 90;						// against fairing surface
    Layer1Y = 32;
    Layer1Z = 2*ThreadZ;
    
    Layer2Margin = 1.5;					// uncovered edge
    Layer2X = Layer1X - 2*Layer2Margin;
    Layer2Y = Layer1Y - 2*Layer2Margin;
    Layer2Z = 3*ThreadZ;
    
    MountX = 46.3 + HoleWindage;		// handlebar mounting bracket end plate
    MountHoleSpace = 13.0;				//  end to hole center
    MountY = 16.3 + HoleWindage;
    MountZ = 4*ThreadZ;					// recess depth
    MountCap = 3.0;						// endcap arc height
    MountR = (pow(MountCap,2) + 0.25*pow(MountY,2)) / (2*MountCap);	// ... radius
    
    Layer3Margin = 1.5;
    Layer3X = Layer2X - 2*Layer3Margin;
    Layer3Y = max((Layer2Y - 2*Layer3Margin),(MountY + 8*ThreadWidth));
    Layer3Z = 3*ThreadZ;
    
    PlateZ = Layer1Z + Layer2Z + Layer3Z;
    
    // Convenience settings
    
    BuildOffset = 3.0 + Layer1Y/2;		// build Y spacing between top & bottom plates
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    
    //---------------
    // Create plate with selectable holes
    
    module Plate(hs) {
    
      difference() {
    
    	union() {
    		translate([0,0,Layer1Z/2])
    		  roundedBox([Layer1X,Layer1Y,Layer1Z],CornerR,true);
    		translate([0,0,Layer1Z + Layer2Z/2])
    			roundedBox([Layer2X,Layer2Y,Layer2Z],CornerR,true);
    		translate([0,0,Layer1Z + Layer2Z + Layer3Z/2])
    			roundedBox([Layer3X,Layer3Y,Layer3Z],CornerR,true);
    	}
    
    	if (0 != hs[0]) {
    	  translate([-HoleSpace,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
    	if (0 != hs[1]) {
    	  translate([0,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
    	if (0 != hs[2]) {
    	  translate([HoleSpace,0,PlateZ/2])
    		  cylinder(r=(HoleDia + HoleWindage)/2,
    					h=(PlateZ + 2*Protrusion),
    					center=true,$fn=10);
    	}
    
      }
    
    }
    
    //---------------
    //-- Build the things...
    
    translate([0,BuildOffset,0]) Plate(HolesTop);
    
    translate([0,-BuildOffset,0])
      difference() {
    	Plate(HolesBottom);
    
    	translate([-(HoleSpace + MountHoleSpace - MountX/2),0,PlateZ - MountZ/2 + Protrusion/2])
    	  intersection() {
    		cube([MountX,MountY,(MountZ + Protrusion)],center=true);
    		union() {
    		  cube([(MountX - 2*MountCap),MountY,(MountZ + Protrusion)],center=true);
    		  translate([ (MountX/2 - MountR),0,0])
    			cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		  translate([-(MountX/2 - MountR),0,0])
    			cylinder(r=MountR,h=(MountZ + Protrusion),center=true);
    		}
    	  }
      }
    

    I loves me my Thing-O-Matic, despite its annoyances…

    [Update: Stepper extruder parameters and a tweak to make the mount plate track the hole position correctly.]

  • Tour Easy: New Rear Brake

    While I had the bike up on the stand to replace the seat strut screws, I installed a new rear brake. The old brake hadn’t been braking well for a while, which I attributed to different brake pads, but nothing seemed to help.

    New rear brake
    New rear brake

    I had to drive the old brakes off the mounting studs with a drift punch; the studs were pretty well rusted after a decade of continuous use under the hostile conditions that pass for normal around here.  Shined them up, applied a generous layer of Never-Seez, and bolted the new brakes in place.

    Turns out that the rear brakes on a Tour Easy are backwards from their orientation on an upright bike: the studs point spinward, so the cable exits on the right side of the frame. Doesn’t make any difference, as that’s how the front brake studs work, but if you’re thinking of buying some fancy brake with odd mounting requirements, you probably shouldn’t.

    The installation specs require “more than 39 mm” of cable between the clamp bolt and the bracket on the other arm. The Tour Easy frame tubes are closer together than that, allowing a bare 25 mm of cable.

    Rear brake cable and boot
    Rear brake cable and boot

    I trimmed the boot to fit, but the real problem is that the arms aren’t at quite the right angle with respect to the braking surface on the rim and provide a bit less leverage than you’d like; the pad alignment is also trickier. I tried adding spacers to the brake pads, but the mounting studs aren’t quite long enough for that.

    The first road test indicates the new brakes work much better than the old ones…