diff --git a/README.md b/README.md index 8a182a8..b471bbd 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,9 @@ Design of a highly experimental recumbent tricycle, not software at all. Still at a very preliminary, pre-prototype stage. Work is documented [here](https://www.journeyman.cc/blog/tags-output/Tricycle/). -## Copyright +## Dependencies -Copyright © Simon Brooke, 2024-2025; may be used and modified under [Creative Commons Attribution-Share Alike](https://creativecommons.org/licenses/by-sa/4.0/deed.en) licence. - -#### Parts of the following libraries are incorporated into this model +The following libraries are used into this model. They should be downloaded and installed into your [OpenSCAD library directory](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries), which on Linux systems is usually `$HOME/.local/share/OpenSCAD/libraries`. | Library | Referenced as | Author | Licence | | ------------------------------------------------------------ | ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | @@ -24,4 +22,6 @@ Copyright © Simon Brooke, 2024-2025; may be used and modified under [Creat - but (currently) uses elements from's [BentSim](https://github.com/PRouzeau/BentSim) project, which is [GPL](https://github.com/PRouzeau/BentSim/blob/master/LICENSE) licensed, and sprockets from s, which is licensed under . \ No newline at end of file +## Copyright + +Copyright © Simon Brooke, 2024-2025; may be used and modified under [Creative Commons Attribution-Share Alike](https://creativecommons.org/licenses/by-sa/4.0/deed.en) licence. diff --git a/model/chainset.scad b/model/chainset.scad index d04c620..6719eec 100644 --- a/model/chainset.scad +++ b/model/chainset.scad @@ -3,17 +3,16 @@ // (c) Simon Brooke 2025; CC-BY-SA // Derived from Hampus Andersson's Sprocket Generator - include include include -function sprocket_radius(teeth=52, roller=7.9, pitch=12.7) = let(roller_radius = roller/2, - radius = pitch/(2*sin(180/teeth))) - sqrt((radius*radius) - (pitch*(roller_radius+tolerance))+((roller_radius+tolerance)*(roller_radius+tolerance))); +function sprocket_radius(teeth=52, roller=7.9, pitch=12.7) = + let(roller_radius = roller/2, + radius = pitch/(2*sin(180/teeth))) + sqrt((radius*radius) - (pitch*(roller_radius+tolerance))+((roller_radius+tolerance)*(roller_radius+tolerance))); - module chainring( teeth=52, roller=7.9, pitch=12.7) { radius = sprocket_radius(teeth=teeth, roller=roller, pitch=pitch); @@ -36,6 +35,14 @@ module spider(radius, arms) { } +/** + * parameterised chainset with, currently, only one chainring; and, + * currently, derailleur-sized chain. Parameters are: + * `teeth`: the number of teeth, obviously; + * `arms`: the number of arms on the spider; + * `crank`: the length of the crank, in millimetres; + * `bbshell`: the width of the bottom bracket shell, in millimetres. + */ module chainset(teeth=53, arms=5, crank=172, bbshell=68) { radius = sprocket_radius(teeth=teeth); @@ -54,9 +61,9 @@ module chainset(teeth=53, arms=5, crank=172, bbshell=68) { prismoid(size1=[10, 25], size2=[7, 18], h=crank +20); // pedals - translate([0-crank, 0, 20 + bbshell]) + translate([0-crank, 0, 8+bbshell]) pedal(); - translate([crank, 0, 0-4]) + translate([crank, 0, 0-2]) mirror([0, 0, 1]) pedal(); @@ -73,4 +80,4 @@ module chainset(teeth=53, arms=5, crank=172, bbshell=68) { // chainring(); // spider(90, 1); -chainset(teeth=82, crank=140); \ No newline at end of file +// chainset(teeth=82, crank=140); \ No newline at end of file diff --git a/model/fourbar.scad b/model/fourbar.scad index f94f0bc..7ab7953 100644 --- a/model/fourbar.scad +++ b/model/fourbar.scad @@ -3,7 +3,7 @@ // (c) Simon Brooke 2025; CC-BY-SA -include +include include include diff --git a/model/library/skew.scad b/model/library/skew.scad new file mode 100644 index 0000000..ec76370 --- /dev/null +++ b/model/library/skew.scad @@ -0,0 +1,43 @@ +/* Taken from https://gist.github.com/boredzo/fde487c724a40a26fa9c?permalink_comment_id=4258747 */ + +/* skew takes an array of six angles: + * x along y + * x along z + * y along x + * y along z + * z along x + * z along y + */ +module skew(dims) { +matrix = [ + [ 1, dims[0]/45, dims[1]/45, 0 ], + [ dims[2]/45, 1, dims[4]/45, 0 ], + [ dims[5]/45, dims[3]/45, 1, 0 ], + [ 0, 0, 0, 1 ] +]; +multmatrix(matrix) +children(); +} + +/* example: + * skew([45, 0, 0, 0, 0, 0]) + * cube([10,10,10]); + */ + +// Skews the child geometry. +// xy: Angle towards X along Y axis. +// xz: Angle towards X along Z axis. +// yx: Angle towards Y along X axis. +// yz: Angle towards Y along Z axis. +// zx: Angle towards Z along X axis. +// zy: Angle towards Z along Y axis. +module skew2(xy = 0, xz = 0, yx = 0, yz = 0, zx = 0, zy = 0) { + matrix = [ + [ 1, tan(xy), tan(xz), 0 ], + [ tan(yx), 1, tan(yz), 0 ], + [ tan(zx), tan(zy), 1, 0 ], + [ 0, 0, 0, 1 ] + ]; + multmatrix(matrix) + children(); +} diff --git a/model/pedal.scad b/model/pedal.scad index c0d0902..8c4d861 100644 --- a/model/pedal.scad +++ b/model/pedal.scad @@ -2,15 +2,31 @@ // (c) Simon Brooke 2025; CC-BY-SA +include module pedal(){ - rotate([0, 270, 0]) - scale([.6, .6, .6]) - translate([-50, -160, 0]) - linear_extrude(height = 10, center = true) - // color("black") - import("library/look-keo.svg"); - cylinder(h=80, r=6); + color("black") + intersection() { + rotate([0, 270, 0]) + scale([.45, .45, .45]) + translate([-20, -160, 0]) + linear_extrude(height = 40, center = true) + import("library/look-keo.svg"); + + rotate([0, 90, 90]) + translate([-50, 0, -43]) + prismoid(size1=[60, 25], size2=[60, 5], height=90); + } + + // axle + color("black") + cylinder(h=80, r=7.1); + translate([0, 0, 8]) + color("black") + cylinder(h=3, r=9); + translate([0, 0, 12]) + color("black") + cylinder(h=12, r1=10, r2=9); } // pedal(); \ No newline at end of file diff --git a/model/subframe.scad b/model/subframe.scad index 61e94b3..cc0ade0 100644 --- a/model/subframe.scad +++ b/model/subframe.scad @@ -12,31 +12,31 @@ include module subframe () { // front leg (supports cross-shaft, epicyclic, motor translate([-25, 1820, -550]) - color("grey") + color("silver") cube([50, 25, 230]); // bottom bracket leg translate([-25, 1690, -578]) - color("grey") + color("silver") cube([50, 25, 310]); // wheel leg translate([-70, 1430, -593]) rotate([0, 5, 0]) - color("grey") + color("silver") cube([25, 75, 363]); // front upper translate([-25, 2000, -385]) rotate([70, 0, 0]) - color("grey") + color("silver") cube([50, 25, 330]); // central upper translate([-25, 1700, -275]) rotate([82, 0, 0]) - color("grey") + color("silver") cube([50, 25, 370]); // rear leg translate([-25, 1200, -515]) rotate([-23, 0, 0]) - color("grey") + color("silver") cube([50, 25, 344]); // wheel @@ -46,6 +46,12 @@ module subframe () { scale([0.70, 0.70, 0.70]) wheel(rim=451, spoke_nbr=0); + translate([-30, 1467.5, -450]) + rotate([0, 90, 0]) + color("grey") + sprocket(teeth=30, roller=7.9, pitch=12.7); + + rotate([90, 0, 90]) translate([1680, -410, -40]) chainset( teeth=82, crank=140);