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.

The New Hotness

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