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.]