Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
I tried using the Skeinforge Cool plugin in order to print the first layer at a higher temperature than the bulk of the object, with an eye toward improving the first layer’s adhesion to the build platform. Even with Reverse sucking back the filament before Cool begins, the nozzle dribbles little snots as it passes around the object’s perimeter:
Cool snots
The nozzle orbits at exactly the top of the just-extruded layer, so the least little bit of ooze from the nozzle sticks to the layer. The spacing between snots shows that the nozzle fills up on a regular basis, even with the Extruder motor turned off.
Running the extruder motor backwards for a bit would introduce an actual air bubble inside the nozzle, but then the plastic would ooze to the bottom, the air bubble would rise, and the nozzle would fart after starting the next layer. Not a desirable outcome.
These tweaks to the cool_start.gcode and cool_end.gcode routines lift the nozzle during the cooling orbit and lower it at the end:
Alas, Skeinforge inserts those files at every layer change, which means the nozzle jumps up-and-down at the same spot on every layer… and that introduces a major blemish at what used to be a minor seam.
Worse, if you’re building multiple copies of the same object, the G-Code file finishes a layer on the last object, does a little hop, returns to the first object, does a little hop, and then begins the cool-down orbit. Maybe that could be fixed by moving Cool after Multiply, but it’s starting to look like a hackfest instead of Just Working.
Even after printing nice calibration objects, real-world projects sometimes don’t come out quite right.
This set of fairing plates for my Esteemed Wife’s bike was a test case to see if the hole threads would stick together better than before. As it turned out, no, they didn’t:
Upper mount – hole separation
The Infill w/t=1.75 setting seems to be slightly too high (meaning Skeinforge thinks the threads occupy slightly more space than they actually do), so the top isn’t quite as nicely packed as it should be.
The threads around the holes aren’t sticking together at all. A closer look:
Hole details
The first layer of the upper-left and lower-right holes didn’t adhere to the ABS covering the aluminum plate and tangled with the remaining layers. In various combinations: the perimeter didn’t bond to the extra shells, those shells didn’t bond together, and the fill didn’t bond to the shells.
Parameters:
Infill overlap = 0.3
Infill solidity = 0.25
Infill w/t = 1.75
Feed = 40 mm/s
I could dial back the perimeter feed ratio a bit, but that won’t affect the infill-to-shell problem. Adhesion to the build plate depends critically on the initial height of the first layer and the speed of the nozzle across the plate; those I can adjust.
Another mechanical cause: slightly loose drive belts. That usually shows up as backlash causing oval circles, but for small circles a pair of loose belts might just produce a too-small circle. I’m about to take the whole XY stage apart for another purpose, so adjusting the belts will come naturally.
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
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
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
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);
}
}