From 775167b4e99d732b9404da5bb7bd82f67256add7 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Mon, 22 Sep 2025 12:01:37 +0100 Subject: [PATCH 1/4] Tactical commit while reworking the lower knuckle. --- model/fourbar.scad | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/model/fourbar.scad b/model/fourbar.scad index aa8e814..84a4fbd 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -35,11 +35,30 @@ module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { module lower_knuckle(chord=100, pivot_radius=12) { + l_body=chord * 1.5; + w_body=pivot_radius * 2.5; + h_axis=pivot_radius * 3; + difference() { - cube([chord * 1.5, pivot_radius * 3, chord*.66]); - translate([ chord*0.25, -1, pivot_radius * 2]) + union () { + translate([0, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=l_body, r=w_body/2); + cube([l_body, w_body, h_axis]); + translate([chord * 1.25, w_body, 0]) + rotate([90, 0, 0]) + cylinder(h=w_body, r=pivot_radius * 2); + } + translate([ chord*0.25, -1, pivot_radius * 3]) cube([chord, pivot_radius * 4, pivot_radius * 4]); - } + translate([ chord*0.25, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=chord, r=pivot_radius * 1.5); + // throough hole for pivot axle + translate([-1, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=l_body+2, r=pivot_radius/3); + } } module fourbar_axle_half( length, chord, long_skew) { @@ -100,6 +119,16 @@ module fourbar(length=1000, chord=100, long_skew=30, lat_skew=30, shoulder=650) fourbar_axle_half(w, chord, long_skew); } -// lower_knuckle(); +translate([-125, 0, 0]) + color("blue") + lower_knuckle(); +/* translate([0, 77, 0]) + rotate([270, 0, 0]) + wheel();*/ +translate([0, 40, 0]) + color("silver") + rotate([90, 0, 0]) + cylinder(h=1.5, r=75); + // fourbar(); // fourbar_axle_half(1000,100, 30); \ No newline at end of file From 72797decb0fff3182412c62b77a88f0a01c97c2d Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Mon, 22 Sep 2025 13:49:57 +0100 Subject: [PATCH 2/4] Much work on the lower knuckle, and I've learned a lot. However, because I forgot to allow for all the weird skews, this is wrong. It's remediable, but not now! --- model/fourbar.scad | 58 ++++++++++++++++++++++++++----------- model/wheel.scad | 71 +++++++++++++++++++++++----------------------- 2 files changed, 78 insertions(+), 51 deletions(-) diff --git a/model/fourbar.scad b/model/fourbar.scad index 84a4fbd..40d146a 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -2,7 +2,7 @@ // (c) Simon Brooke 2025; CC-BY-SA - +include include include include @@ -34,31 +34,58 @@ module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { } -module lower_knuckle(chord=100, pivot_radius=12) { +module loawer_bar_end_knuckle(chord=100, pivot_radius=12, rise=8) { l_body=chord * 1.5; w_body=pivot_radius * 2.5; - h_axis=pivot_radius * 3; + h_axis=pivot_radius * 2.75; difference() { union () { - translate([0, w_body/2, h_axis]) + translate([l_body/2, w_body/2, h_axis]) rotate([0, 90, 0]) - cylinder(h=l_body, r=w_body/2); - cube([l_body, w_body, h_axis]); - translate([chord * 1.25, w_body, 0]) + cyl(h=l_body, r=w_body/2, rounding=5); + translate([l_body/2, w_body/2, h_axis/2]) + cuboid([l_body, w_body, h_axis], rounding=5, except=TOP); + // bulge for wheel axle; the fork insertion end of + // a lefty axle is 25mm diameter + translate([chord * 1.25, w_body/2, 0]) rotate([90, 0, 0]) - cylinder(h=w_body, r=pivot_radius * 2); + cyl(h=w_body, r=25, rounding=5); + // fairing for this + translate([chord * 1.25, w_body/2, -7.5]) + rotate([80, 0, 270]) + prismoid([w_body, 35], [w_body, 10], rounding=5, h=l_body/2); + } translate([ chord*0.25, -1, pivot_radius * 3]) cube([chord, pivot_radius * 4, pivot_radius * 4]); + // scoop for leg-bottom knuckle to rotate within translate([ chord*0.25, w_body/2, h_axis]) rotate([0, 90, 0]) - cylinder(h=chord, r=pivot_radius * 1.5); - // throough hole for pivot axle + cylinder(h=chord, r=pivot_radius * 1.3); + // through hole for pivot axle translate([-1, w_body/2, h_axis]) rotate([0, 90, 0]) - cylinder(h=l_body+2, r=pivot_radius/3); + cylinder(h=l_body+2, r=pivot_radius/3); + // through hole for wheel axle + translate([chord * 1.25, w_body +1, 0]) + rotate([90, 0, 0]) + cylinder(h=w_body-5, r=12.5); } + + // airfoil stub to be epoxied into the lower bar of + // the linkage + translate([(chord * 1.25) - 1, 5 - chord, 0]) + rotate([90-rise, 0, 180]) + airfoil(h=chord, L=chord-2); + // root reinforcement for the above + translate([chord * 1.25, 5 - chord/3, 9]) + rotate([90, 0, 180]) + airfoil(h=chord/3, L=chord); + translate([(chord * .75), 0, 10]) + rotate([90, 0, 0]) + prismoid([chord -1, 6], [chord -2, 0], h=(chord/3)); + } module fourbar_axle_half( length, chord, long_skew) { @@ -85,7 +112,7 @@ module fourbar_axle_half( length, chord, long_skew) { translate([(0 - (chord*1.25)), l_hlb * cos(rise), 30]) rotate([0, long_skew, 0]) color("black") - lower_knuckle(chord, 12); + loawer_bar_end_knuckle(chord, 12, rise); // wheel translate([-50, l_hlb + 72, -40]) @@ -121,10 +148,9 @@ module fourbar(length=1000, chord=100, long_skew=30, lat_skew=30, shoulder=650) translate([-125, 0, 0]) color("blue") - lower_knuckle(); -/* translate([0, 77, 0]) - rotate([270, 0, 0]) - wheel();*/ + loawer_bar_end_knuckle(); +translate([0, 77, 0]) + wheel(); translate([0, 40, 0]) color("silver") rotate([90, 0, 0]) diff --git a/model/wheel.scad b/model/wheel.scad index eb9dcce..dfb7f72 100644 --- a/model/wheel.scad +++ b/model/wheel.scad @@ -20,42 +20,43 @@ module wheel (iso=451) { radius=(iso/2)+7; - // rim - color("grey") - difference() { - cylinder(h=22, r=radius, center=true); - translate([0,0, -11]) - cylinder(h=26, r=(radius-10)); + rotate([270, 0, 0]) { + // rim + color("grey") + difference() { + cylinder(h=22, r=radius, center=true); + translate([0,0, -11]) + cylinder(h=26, r=(radius-10)); + } + + // carbon cones covering the spokes + color("black") + translate([0,0, 4]) + cylinder(h=26.6, r1=radius, r2=22.5); + color("black") + mirror([0, 0, -1]) + translate([0,0, 4]) + cylinder(h=14.4, r1=radius, r2=29); + + // tyre + color("black") + rotate_extrude(convexity = 10) + translate([radius +10, 0, 0]) + circle(r = 12, $fn = 100); + + // hub + color("grey") + translate([0, 0, -40]) + cylinder(h=65, r=22.5); + + // axle + color("silver") { + translate([0, 0, -45]) + cylinder(h=70, r1=12.5, r2=7.5); + translate([0, 0, -60]) + cylinder(h=25, r=12.5); + } } - - // carbon cones covering the spokes - color("black") - translate([0,0, 4]) - cylinder(h=26.6, r1=radius, r2=22.5); - color("black") - mirror([0, 0, -1]) - translate([0,0, 4]) - cylinder(h=14.4, r1=radius, r2=29); - - // tyre - color("black") - rotate_extrude(convexity = 10) - translate([radius +10, 0, 0]) - circle(r = 12, $fn = 100); - - // hub - color("grey") - translate([0, 0, -40]) - cylinder(h=65, r=22.5); - - // axle - color("silver") { - translate([0, 0, -45]) - cylinder(h=70, r1=12.5, r2=7.5); - translate([0, 0, -85]) - cylinder(h=40, r=12.5); - } - } // wheel(); \ No newline at end of file From 0a3c55351251492ffa5790294c2bfe3c4353d906 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Wed, 24 Sep 2025 10:25:49 +0100 Subject: [PATCH 3/4] Tactical commit before experimental redesign of knuckle. --- model/fourbar.scad | 119 ++++++++++++++++++++++---------------------- model/subframe.scad | 2 +- model/tricycle.scad | 2 +- 3 files changed, 61 insertions(+), 62 deletions(-) diff --git a/model/fourbar.scad b/model/fourbar.scad index 40d146a..77966db 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -7,10 +7,19 @@ include include include -module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { +$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! @@ -23,7 +32,12 @@ module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { translate([0 - chord, 0, (chord/2 * sin(long_skew))]) rotate([0, 90+long_skew, 0]) color("black") - cylinder(h=chord, r=12); + 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]) @@ -34,7 +48,7 @@ module fourbar_leg(length=1000, chord=100, long_skew=30, lat_skew=30) { } -module loawer_bar_end_knuckle(chord=100, pivot_radius=12, rise=8) { +module lower_bar_end_knuckle(chord=100, pivot_radius=12, rise=8,lat_skew=30) { l_body=chord * 1.5; w_body=pivot_radius * 2.5; h_axis=pivot_radius * 2.75; @@ -44,17 +58,19 @@ module loawer_bar_end_knuckle(chord=100, pivot_radius=12, rise=8) { translate([l_body/2, w_body/2, h_axis]) rotate([0, 90, 0]) cyl(h=l_body, r=w_body/2, rounding=5); - translate([l_body/2, w_body/2, h_axis/2]) - cuboid([l_body, w_body, h_axis], rounding=5, except=TOP); + + // 'except=TOP' in phrase introduces the spurious hulls + translate([l_body/2, w_body/2, h_axis*.75]) + cuboid([l_body, w_body, h_axis * .75], rounding=5); // bulge for wheel axle; the fork insertion end of // a lefty axle is 25mm diameter - translate([chord * 1.25, w_body/2, 0]) - rotate([90, 0, 0]) + translate([chord * 0.25, w_body/2, 0]) + rotate([90, 0, 0]) cyl(h=w_body, r=25, rounding=5); // fairing for this - translate([chord * 1.25, w_body/2, -7.5]) - rotate([80, 0, 270]) - prismoid([w_body, 35], [w_body, 10], rounding=5, h=l_body/2); + translate([chord * 0.25, w_body/2, -3]) + rotate([80, 0, 90]) + prismoid([w_body, 45], [w_body, 10], rounding=5, h=l_body * .75); } translate([ chord*0.25, -1, pivot_radius * 3]) @@ -68,93 +84,76 @@ module loawer_bar_end_knuckle(chord=100, pivot_radius=12, rise=8) { rotate([0, 90, 0]) cylinder(h=l_body+2, r=pivot_radius/3); // through hole for wheel axle - translate([chord * 1.25, w_body +1, 0]) + translate([ chord * 0.25, w_body +1, 0]) rotate([90, 0, 0]) cylinder(h=w_body-5, r=12.5); } // airfoil stub to be epoxied into the lower bar of // the linkage - translate([(chord * 1.25) - 1, 5 - chord, 0]) - rotate([90-rise, 0, 180]) - airfoil(h=chord, L=chord-2); - // root reinforcement for the above - translate([chord * 1.25, 5 - chord/3, 9]) - rotate([90, 0, 180]) - airfoil(h=chord/3, L=chord); - translate([(chord * .75), 0, 10]) - rotate([90, 0, 0]) - prismoid([chord -1, 6], [chord -2, 0], h=(chord/3)); + translate([chord*1.25, 1, 30]) + rotate([90 + rise, 360 - lat_skew, 0]) + airfoil(h=chord, L=2 - chord); + +// // brake disk +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), 1]) +// rotate([90, 0, 0]) +// color("silver") +// cylinder( h=1.5, r=75); +// // wheel (obviously) +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), -10]) +// wheel(); } -module fourbar_axle_half( length, chord, long_skew) { - shoulder=650; - lat_skew=30; +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. + // 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 * sin(lat_skew) ) + ( shoulder / 2)); + w = ((length * cos(lat_skew) )); l_hlb= w * (1/cos(rise)) + fudge; - v_offset=l_hlb * sin(rise); - - echo("long_skew", long_skew); + v_offset=(l_hlb * sin(rise)) + 38; - translate([0, 0, 0 - v_offset]) + translate([-15, 0, 0 - v_offset]) rotate([90-rise, 0, 180]) - color("black") - airfoil(h=l_hlb, L=chord); + color("black") + airfoil(h=l_hlb, L=chord); // lower knuckle - translate([(0 - (chord*1.25)), l_hlb * cos(rise), 30]) - rotate([0, long_skew, 0]) - color("black") - loawer_bar_end_knuckle(chord, 12, rise); - - // wheel - translate([-50, l_hlb + 72, -40]) - rotate([270, 0, 0]) - wheel(iso=451); - - // brake disk - translate([-50, l_hlb + 35, -40]) - color("silver") - rotate([90, 0, 0]) - cylinder(h=1.5, r=75); - // brake caliper + 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); } -module fourbar(length=1000, chord=100, long_skew=30, lat_skew=30, shoulder=650) { - w = (length * sin( lat_skew)) + ( shoulder / 2); - - +module fourbar(length=1000, chord=100, lat_skew=30, long_skew=30, shoulder=650) { translate([0, 0-(shoulder/2), 0]) - fourbar_leg( length, chord, long_skew, lat_skew); + fourbar_leg( length, chord, lat_skew, long_skew); translate([0, (shoulder/2), 0]) mirror([0, 1, 0]) - fourbar_leg(length, chord, long_skew, lat_skew); + fourbar_leg(length, chord, lat_skew, long_skew); - fourbar_axle_half(w, chord, long_skew); + fourbar_axle_half(length, chord, lat_skew, long_skew, shoulder); mirror([0, 1, 0]) - fourbar_axle_half(w, chord, long_skew); + fourbar_axle_half(length, chord, lat_skew, long_skew, shoulder); } translate([-125, 0, 0]) color("blue") - loawer_bar_end_knuckle(); -translate([0, 77, 0]) + lower_bar_end_knuckle(); +translate([-100, 74, 0]) wheel(); -translate([0, 40, 0]) +translate([-100, 34, 0]) color("silver") rotate([90, 0, 0]) cylinder(h=1.5, r=75); -// fourbar(); +// fourbar(length=1000, chord=100, long_skew=30, lat_skew=35, shoulder=650); // fourbar_axle_half(1000,100, 30); \ No newline at end of file diff --git a/model/subframe.scad b/model/subframe.scad index 705c543..a61f099 100644 --- a/model/subframe.scad +++ b/model/subframe.scad @@ -11,7 +11,7 @@ include module subframe_cycleparts(rim=451, chainring_teeth=82, crank=140) { // wheel translate([0, 382, 93]) - rotate([0, 90, 0]) + rotate([0, 0, 90]) wheel(iso=rim); translate([-42, 382, 93]) diff --git a/model/tricycle.scad b/model/tricycle.scad index b05b4f7..6548999 100644 --- a/model/tricycle.scad +++ b/model/tricycle.scad @@ -12,7 +12,7 @@ rotate([0, 0, 270]) translate([0, 1300, 180]) subframe(structure="carbon"); translate([0, 0, 320]) -fourbar(700, 100, 30, 35, 650); +fourbar(length=1000, chord=100, long_skew=30, lat_skew=35, shoulder=650); translate([800, 0, 120]) rotate([0, 4, 0]) From 35376827d163eda8b03079e6d2b7432a3ddcef93 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Wed, 24 Sep 2025 12:07:28 +0100 Subject: [PATCH 4/4] Moved the lower knuckle out into its own file, and substantially improved it. I'm still having problems with fudge factors which I need to resolve; I need to learn more about filletting, rounding, radiusing and fairing. --- model/fourbar.scad | 80 ++++------------------ model/lowerknuckle.scad | 144 ++++++++++++++++++++++++++++++++++++++++ model/tricycle.scad | 2 +- 3 files changed, 157 insertions(+), 69 deletions(-) create mode 100644 model/lowerknuckle.scad diff --git a/model/fourbar.scad b/model/fourbar.scad index 77966db..3f07b39 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -5,6 +5,7 @@ include include include +include include $fn=64; @@ -48,64 +49,6 @@ module fourbar_leg(length=1000, chord=100, lat_skew=35, long_skew=30) { } -module lower_bar_end_knuckle(chord=100, pivot_radius=12, rise=8,lat_skew=30) { - l_body=chord * 1.5; - w_body=pivot_radius * 2.5; - h_axis=pivot_radius * 2.75; - - difference() { - union () { - translate([l_body/2, w_body/2, h_axis]) - rotate([0, 90, 0]) - cyl(h=l_body, r=w_body/2, rounding=5); - - // 'except=TOP' in phrase introduces the spurious hulls - translate([l_body/2, w_body/2, h_axis*.75]) - cuboid([l_body, w_body, h_axis * .75], rounding=5); - // bulge for wheel axle; the fork insertion end of - // a lefty axle is 25mm diameter - translate([chord * 0.25, w_body/2, 0]) - rotate([90, 0, 0]) - cyl(h=w_body, r=25, rounding=5); - // fairing for this - translate([chord * 0.25, w_body/2, -3]) - rotate([80, 0, 90]) - prismoid([w_body, 45], [w_body, 10], rounding=5, h=l_body * .75); - - } - translate([ chord*0.25, -1, pivot_radius * 3]) - cube([chord, pivot_radius * 4, pivot_radius * 4]); - // scoop for leg-bottom knuckle to rotate within - translate([ chord*0.25, w_body/2, h_axis]) - rotate([0, 90, 0]) - cylinder(h=chord, r=pivot_radius * 1.3); - // through hole for pivot axle - translate([-1, w_body/2, h_axis]) - rotate([0, 90, 0]) - cylinder(h=l_body+2, r=pivot_radius/3); - // through hole for wheel axle - translate([ chord * 0.25, w_body +1, 0]) - rotate([90, 0, 0]) - cylinder(h=w_body-5, r=12.5); - } - - // airfoil stub to be epoxied into the lower bar of - // the linkage - translate([chord*1.25, 1, 30]) - rotate([90 + rise, 360 - lat_skew, 0]) - airfoil(h=chord, L=2 - chord); - -// // brake disk -// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), 1]) -// rotate([90, 0, 0]) -// color("silver") -// cylinder( h=1.5, r=75); -// // wheel (obviously) -// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), -10]) -// wheel(); - -} - module fourbar_axle_half( length=1000, chord=100, lat_skew=35, long_skew=30, shoulder=650) { rise=8; @@ -127,6 +70,16 @@ module fourbar_axle_half( length=1000, chord=100, lat_skew=35, long_skew=30, sho 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); + } @@ -145,15 +98,6 @@ module fourbar(length=1000, chord=100, lat_skew=30, long_skew=30, shoulder=650) fourbar_axle_half(length, chord, lat_skew, long_skew, shoulder); } -translate([-125, 0, 0]) - color("blue") - lower_bar_end_knuckle(); -translate([-100, 74, 0]) - wheel(); -translate([-100, 34, 0]) - color("silver") - rotate([90, 0, 0]) - cylinder(h=1.5, r=75); // fourbar(length=1000, chord=100, long_skew=30, lat_skew=35, shoulder=650); -// fourbar_axle_half(1000,100, 30); \ No newline at end of file +// fourbar_axle_half(); \ No newline at end of file diff --git a/model/lowerknuckle.scad b/model/lowerknuckle.scad new file mode 100644 index 0000000..4377230 --- /dev/null +++ b/model/lowerknuckle.scad @@ -0,0 +1,144 @@ +// lowerknuckle.scad + +// (c) Simon Brooke 2025; CC-BY-SA + +include +include +include +include + +$fn=64; + + +module lower_bar_end_knuckle_old(chord=100, pivot_radius=12, rise=8,lat_skew=30) { + l_body=chord * 1.5; + w_body=pivot_radius * 2.5; + h_axis=pivot_radius * 2.75; + + difference() { + union () { + translate([l_body/2, w_body/2, h_axis]) + rotate([0, 90, 0]) + cyl(h=l_body, r=w_body/2, rounding=5); + + // 'except=TOP' in phrase introduces the spurious hulls + translate([l_body/2, w_body/2, h_axis*.75]) + cuboid([l_body, w_body, h_axis * .75], rounding=5); + // bulge for wheel axle; the fork insertion end of + // a lefty axle is 25mm diameter + translate([chord * 0.25, w_body/2, 0]) + rotate([90, 0, 0]) + cyl(h=w_body, r=25, rounding=5); + // fairing for this + translate([chord * 0.25, w_body/2, -3]) + rotate([80, 0, 90]) + prismoid([w_body, 45], [w_body, 10], rounding=5, h=l_body * .75); + + } + translate([ chord*0.25, -1, pivot_radius * 3]) + cube([chord, pivot_radius * 4, pivot_radius * 4]); + // scoop for leg-bottom knuckle to rotate within + translate([ chord*0.25, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=chord, r=pivot_radius * 1.3); + // through hole for pivot axle + translate([-1, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=l_body+2, r=pivot_radius/3); + // through hole for wheel axle + translate([ chord * 0.25, w_body +1, 0]) + rotate([90, 0, 0]) + cylinder(h=w_body-5, r=12.5); + } + + // airfoil stub to be epoxied into the lower bar of + // the linkage + translate([chord*1.25, 1, 30]) + rotate([90 + rise, 360 - lat_skew, 0]) + airfoil(h=chord, L=2 - chord); + +// // brake disk +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), 1]) +// rotate([90, 0, 0]) +// color("silver") +// cylinder( h=1.5, r=75); +// // wheel (obviously) +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), -10]) +// wheel(); + +} + +module lower_bar_end_knuckle(chord=100, pivot_radius=12, rise=8,lat_skew=30, colour="blue") { + l_body=chord * 2; + w_body=pivot_radius * 2.5; + h_axis=pivot_radius * 2.75; + + difference() { + union () { + // (more streamlined) body + translate([160, w_body/2, -22]) + rotate([0,0,180]) + scale([1, 2, 1]) + color( colour) + airfoil(h=70, L=l_body); + // boss for wheel axle + translate([ chord * 0.25, w_body * 0.9, 0]) + rotate([90, 0, 0]) + color( colour) + cyl(h=w_body * 1.25, r=20, rounding=5); + + } + // scoop for leg-bottom knuckle to rotate within + translate([ chord*0.25, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=chord, r=pivot_radius * 1.3); + // space for the airfoil leg to emerge + translate([ chord*0.25, w_body*.75, pivot_radius * 2.25]) + rotate([lat_skew + 45, 0, 0]) + cube([chord, pivot_radius * 4, pivot_radius * 4]); + // through hole for pivot axle + translate([-1, w_body/2, h_axis]) + rotate([0, 90, 0]) + cylinder(h=250, r=pivot_radius/3); + // through hole for wheel axle + translate([ chord * 0.25, w_body *1.5, 0]) + rotate([90, 0, 0]) + cylinder(h=w_body * 1.4, r=12.5); + // slice off the front bottom + translate([chord * 1.25, w_body/2, 0 - w_body]) + rotate([270-lat_skew, 0, 90]) + color( colour) + cuboid([2* w_body, 2*w_body, l_body *.75]); + // slice off the upper back + translate([0, w_body/2, w_body * 2.5]) + rotate([270-lat_skew, 0, 90]) + color( colour) + cuboid([2* w_body, 2*w_body, l_body *.75]); + } + + // airfoil stub to be epoxied into the lower bar of + // the linkage + translate([chord*1.25, 1, 30]) + rotate([90 + rise, 360 - lat_skew, 0]) + color( colour) + airfoil(h=chord, L=2 - chord); + +// // brake disk +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), 1]) +// rotate([90, 0, 0]) +// color("silver") +// cylinder( h=1.5, r=75); +// // wheel (obviously) +// translate([(0 - (chord*1.25)), (l_hlb * cos(rise)), -10]) +// wheel(); + +} + +//translate([-125, 0, 0]) +// lower_bar_end_knuckle(); +//translate([-125, 0, 125]) +// color("blue") +// lower_bar_end_knuckle(); +//translate([-100, 74, 0]) +// wheel(); + diff --git a/model/tricycle.scad b/model/tricycle.scad index 6548999..3874f72 100644 --- a/model/tricycle.scad +++ b/model/tricycle.scad @@ -11,7 +11,7 @@ include rotate([0, 0, 270]) translate([0, 1300, 180]) subframe(structure="carbon"); -translate([0, 0, 320]) +translate([0, 0, 250]) fourbar(length=1000, chord=100, long_skew=30, lat_skew=35, shoulder=650); translate([800, 0, 120])