I'm still having problems with fudge factors which I need to resolve; I need to learn more about filletting, rounding, radiusing and fairing.
103 lines
3.2 KiB
OpenSCAD
103 lines
3.2 KiB
OpenSCAD
// fourbar.scad
|
|
|
|
// (c) Simon Brooke 2025; CC-BY-SA
|
|
|
|
include <BOSL2/std.scad>
|
|
include <NACAAirfoils/files/Naca4.scad>
|
|
include <library/skew.scad>
|
|
include <lowerknuckle.scad>
|
|
include <wheel.scad>
|
|
|
|
$fn=64;
|
|
|
|
// Wherever you see unexplained numbers in this file, they are
|
|
// fudge because I don't yet properly understand the coordinate
|
|
// transforms and can't remember enough of the trigonometry I
|
|
// learned 60 years ago. There REALLY should not be any unexplained
|
|
// numbers.
|
|
|
|
module fourbar_leg(length=1000, chord=100, lat_skew=35, long_skew=30) {
|
|
h = length * cos(lat_skew) * cos( long_skew);
|
|
w = length * sin( lat_skew);
|
|
d = length * sin( long_skew);
|
|
pivot_radius = 12;
|
|
|
|
translate([0, 0-w, 0]) {
|
|
// upper pivot needs a complex trig transformation!
|
|
translate([d - (chord/2), w, h + chord])
|
|
rotate([0, 90+long_skew, 0])
|
|
color("black")
|
|
cylinder(h=chord, r=12);
|
|
|
|
// lower pivot:
|
|
translate([0 - chord, 0, (chord/2 * sin(long_skew))])
|
|
rotate([0, 90+long_skew, 0])
|
|
color("black")
|
|
difference() {
|
|
cylinder(h=chord, r=12);
|
|
// through hole for pivot axle
|
|
translate([0, -1, 0])
|
|
cylinder(h=chord+2, r=pivot_radius/3);
|
|
}
|
|
|
|
// aerofoil section
|
|
sskew([0, long_skew, 0, 0, 0, 0])
|
|
rotate([lat_skew, 0, 180])
|
|
color("black")
|
|
airfoil(h=length, L=chord);
|
|
}
|
|
}
|
|
|
|
|
|
module fourbar_axle_half( length=1000, chord=100, lat_skew=35, long_skew=30, shoulder=650) {
|
|
rise=8;
|
|
|
|
// I've got something wrong in computing the half-lower-bar
|
|
// length, and I don't know what. It scales with lat_skew, but
|
|
// (unsurprisingly) not liniarly. Fudge of 23 works for lat_skew of 30; 34 works for lat_skew of 35
|
|
fudge=0;
|
|
|
|
w = ((length * cos(lat_skew) ));
|
|
l_hlb= w * (1/cos(rise)) + fudge;
|
|
v_offset=(l_hlb * sin(rise)) + 38;
|
|
|
|
translate([-15, 0, 0 - v_offset])
|
|
rotate([90-rise, 0, 180])
|
|
color("black")
|
|
airfoil(h=l_hlb, L=chord);
|
|
|
|
// lower knuckle
|
|
rotate([0, long_skew, 0])
|
|
translate([(0 - (chord*1.25)), (l_hlb * cos(rise) + 72), -62])
|
|
lower_bar_end_knuckle(chord, 12, rise, lat_skew);
|
|
|
|
rotate([0, long_skew, 0])
|
|
translate([(0 - (chord*1.25)), (l_hlb * cos(rise) + 155), -62])
|
|
wheel();
|
|
rotate([0, long_skew, 0])
|
|
translate([(0 - (chord*1.25)), (l_hlb * cos(rise) + 115), -62])
|
|
rotate([90, 0, 0])
|
|
color("silver")
|
|
cylinder( h=1.5, r=75);
|
|
|
|
}
|
|
|
|
|
|
|
|
module fourbar(length=1000, chord=100, lat_skew=30, long_skew=30, shoulder=650) {
|
|
translate([0, 0-(shoulder/2), 0])
|
|
fourbar_leg( length, chord, lat_skew, long_skew);
|
|
|
|
translate([0, (shoulder/2), 0])
|
|
mirror([0, 1, 0])
|
|
fourbar_leg(length, chord, lat_skew, long_skew);
|
|
|
|
fourbar_axle_half(length, chord, lat_skew, long_skew, shoulder);
|
|
|
|
mirror([0, 1, 0])
|
|
fourbar_axle_half(length, chord, lat_skew, long_skew, shoulder);
|
|
}
|
|
|
|
|
|
// fourbar(length=1000, chord=100, long_skew=30, lat_skew=35, shoulder=650);
|
|
// fourbar_axle_half(); |