From 4cdce5dc0a707b5ce52ba88eef82b92ad1b3e7da Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Thu, 4 Sep 2025 22:09:22 +0100 Subject: [PATCH] A good enough for now, working, parameterised, four bar linkage. Pleased! --- model/fourbar.scad | 69 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/model/fourbar.scad b/model/fourbar.scad index a9c374b..4cd7e7e 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -5,31 +5,66 @@ include include module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { - // upper pivot needs a complex trig transformation! - translate([(length * cos(long_skew) * cos(lat_skew)) - (2 * chord), - length * cos(long_skew) * sin(lat_skew), 0]) - rotate([0, 90+long_skew, 0]) - cylinder(h=chord, r=12); + h = length * cos(lat_skew) * cos( long_skew); + w = length * sin( lat_skew); + d = length * sin( long_skew); - // lower pivot: - translate([0-chord, -12, (chord/2) * sin(long_skew) * sin(lat_skew)]) - rotate([0, 90+long_skew, 0]) - cylinder(h=chord, r=12); - - // aerofoil section - skew([0, long_skew, 0, 0, 0, 0]) - rotate([lat_skew, 0, 180]) - airfoil(h=length, L=chord); + 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") + cylinder(h=chord, r=12); + + // aerofoil section + skew([0, long_skew, 0, 0, 0, 0]) + rotate([lat_skew, 0, 180]) + color("black") + airfoil(h=length, L=chord); + } } +module fourbar_axle_half( length, chord) { + translate([0, 0, -120]) + rotate([82, 0, 180]) + color("black") + airfoil(h=length, L=chord); + + // lower knuckle + translate([-chord, length, -60]) + color("black") + cube([chord, chord/4, chord/2]); + + // wheel + translate([0, length + 50, -50]) + // Pierre Rouzeau's wheel is beautifully modelled and parameterised, but it doesn't seem to be scaled as I'd expect... + wheel(rim=451, spoke_nbr=32); +} + + + module fourbar(length=1000, chord=100, long_skew=30, lat_skew=30, shoulder=650) { + w = (length * sin( lat_skew)) + ( shoulder / 2); + + translate([0, 0-(shoulder/2), 0]) fourbar_leg( length, chord, long_skew, lat_skew); - translate([0, shoulder/2, 0]) + translate([0, (shoulder/2), 0]) mirror([0, 1, 0]) fourbar_leg(length, chord, long_skew, lat_skew); - } + + fourbar_axle_half(w, chord); + + mirror([0, 1, 0]) + fourbar_axle_half(w, chord); +} -fourbar(600, 100, 30, 30, 650); +fourbar(700, 100, 30, 35, 650);