discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

Eccentrically Cycloidal Gears

J
jon
Sun, Aug 20, 2023 2:53 PM

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty. 
Is this worth adding to the BOSL2 library?

Jon

Interesting video: https://www.youtube.com/watch?v=qMDU5tlGUwU I looked in the BOSL2 documentation for "cycloidal" and came up empty.  Is this worth adding to the BOSL2 library? Jon
RD
Revar Desmera
Wed, Aug 23, 2023 7:13 AM

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.  Is this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric design requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not be buggy, and certainly needs argument name reworking:

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius - contraction, number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center, slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true, do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10, hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar
> On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > Interesting video: > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. Is this worth adding to the BOSL2 library? > Definitely interesting, though I suspect the simplified eccentric design requires a lot of rigidity to function well. A first-pass attempt comes up with the following, which may or may not be buggy, and certainly needs argument name reworking:  include <BOSL2/std.scad> $fa = 2; $fs = 2; function cycloidal2d( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, ring_hole_count=3, ring_hole_diam=15, offset=false ) = let( rolling_circle_radius = pin_circle_radius / number_of_pins, reduction_ratio = number_of_pins - 1, cycloid_base_radius = reduction_ratio * rolling_circle_radius, steps = segs(pin_radius) * (number_of_pins-1), step = 360 / steps, path = [ for (i = [0:1:steps-1]) let( angle = i * step, xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle), xy2 = xy + polar_to_xy(rolling_circle_radius - contraction, number_of_pins*angle) ) xy2 ], path2 = resample_path(path, n=ceil(steps/4)), path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), rgn = [ path3, if (hub_diam>0) circle(d=hub_diam), if (ring_hole_count>0 && ring_hole_diam>0) for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2)) apply(m, circle(d=ring_hole_diam)) ], out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn ) out_rgn; module cycloidal2d( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, ring_hole_count=3, ring_hole_diam=15, offset=false ) { rgn = cycloidal2d( pin_circle_radius=pin_circle_radius, pin_radius=pin_radius, contraction=contraction, number_of_pins=number_of_pins, hub_diam=hub_diam, ring_hole_count=ring_hole_count, ring_hole_diam=ring_hole_diam, offset=offset ); region(rgn); } function eccentric_cycloidal_gear( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, height=20, center=false, do_twist=false ) = let( twist = do_twist? 360 / (number_of_pins-1) : 0, rgn = cycloidal2d( pin_circle_radius=pin_circle_radius, pin_radius=pin_radius, contraction=contraction, number_of_pins=number_of_pins, hub_diam=hub_diam, ring_hole_count=0, offset=false ), vnf = linear_sweep(rgn, height=height, twist=twist, center=center, slices=twist? ceil(height) : 1) ) vnf; module eccentric_cycloidal_gear( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, height=20, center=false, do_twist=false ) { vnf = eccentric_cycloidal_gear( pin_circle_radius=pin_circle_radius, pin_radius=pin_radius, contraction=contraction, number_of_pins=number_of_pins, hub_diam=hub_diam, height=height, center=center, do_twist=do_twist ); vnf_polyhedron(vnf, convexity=number_of_pins); } function eccentric_cycloidal_pinion( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, height=20, center=false ) = let( rolling_circle_radius = pin_circle_radius / number_of_pins, slices = max(36,segs(pin_radius)), circ_path = path3d(circle(r=pin_radius-contraction)), rows = [ for (i=[0:1:slices]) let( u = i/slices, a = 360 * u, r = rolling_circle_radius - contraction*2, z = (u - (center?0.5:0)) * height, xyz = cylindrical_to_xyz(r, a, z), m = move(xyz) ) apply(m, circ_path) ], vnf_wall = vnf_vertex_array(rows, col_wrap=true), cap_path = path2d(rows[0]), hub_circ = hub_diam<=0? [] : circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), cap_rgn = [ cap_path, if (hub_circ) hub_circ ], top = last(rows)[0].z, bot = rows[0][0].z, vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), vnf_cap2 = vnf_from_region(cap_rgn, up(top)), vnf_hub = !hub_circ? EMPTY_VNF : vnf_vertex_array([ up(bot, p=path3d(hub_circ)), up(top, p=path3d(hub_circ)) ], col_wrap=true, caps=false, reverse=true), vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) ) vnf; module eccentric_cycloidal_pinion( pin_circle_radius=50, pin_radius=5, contraction=1, number_of_pins=10, hub_diam=20, height=20, center=false ) { vnf = eccentric_cycloidal_pinion( pin_circle_radius=pin_circle_radius, pin_radius=pin_radius, contraction=contraction, number_of_pins=number_of_pins, hub_diam=hub_diam, height=height, center=center ); vnf_polyhedron(vnf, convexity=6); } function cycloidal_pin_array2d( pin_circle_radius=50, pin_radius=5, contraction=2, number_of_pins=10 ) = let( rgn = [ for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) apply(m, circle(r=pin_radius)) ] ) rgn; zrot(360*$t/11) eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true, do_twist=true); color("lightblue") right(50-1) zrot(-360*$t) eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10, hub_diam=5, center=true); //region(cycloidal_pin_array2d()); - Revar
NH
nop head
Wed, Aug 23, 2023 7:35 AM

In the video it looked like the output rotation is not a constant speed. Is
this actually the case, in which case it wouldn't be very useful.

On Wed, 23 Aug 2023 at 08:14, Revar Desmera revarbat@gmail.com wrote:

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.  Is
this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric design
requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not be
buggy, and certainly needs argument name reworking:

[image: Screenshot 2023-08-22 at 11.56.23 PM.png]

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius +
rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius -
contraction, number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count,
r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) :
rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center,
slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12,
center=true, do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50,
pin_radius=10, hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar

OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

In the video it looked like the output rotation is not a constant speed. Is this actually the case, in which case it wouldn't be very useful. On Wed, 23 Aug 2023 at 08:14, Revar Desmera <revarbat@gmail.com> wrote: > On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > Interesting video: > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. Is > this worth adding to the BOSL2 library? > > > Definitely interesting, though I suspect the simplified eccentric design > requires a lot of rigidity to function well. > > A first-pass attempt comes up with the following, which may or may not be > buggy, and certainly needs argument name reworking: > > > [image: Screenshot 2023-08-22 at 11.56.23 PM.png] > > > include <BOSL2/std.scad> > $fa = 2; > $fs = 2; > > function cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > reduction_ratio = number_of_pins - 1, > cycloid_base_radius = reduction_ratio * rolling_circle_radius, > steps = segs(pin_radius) * (number_of_pins-1), > step = 360 / steps, > path = [ > for (i = [0:1:steps-1]) > let( > angle = i * step, > xy = polar_to_xy(cycloid_base_radius + > rolling_circle_radius, angle), > xy2 = xy + polar_to_xy(rolling_circle_radius - > contraction, number_of_pins*angle) > ) xy2 > ], > path2 = resample_path(path, n=ceil(steps/4)), > path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), > rgn = [ > path3, > if (hub_diam>0) > circle(d=hub_diam), > if (ring_hole_count>0 && ring_hole_diam>0) > for (m = zrot_copies(n=ring_hole_count, > r=pin_circle_radius/2)) > apply(m, circle(d=ring_hole_diam)) > ], > out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : > rgn > ) out_rgn; > > module cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) { > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=ring_hole_count, > ring_hole_diam=ring_hole_diam, > offset=offset > ); > region(rgn); > } > > function eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) = let( > twist = do_twist? 360 / (number_of_pins-1) : 0, > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=0, > offset=false > ), > vnf = linear_sweep(rgn, height=height, twist=twist, center=center, > slices=twist? ceil(height) : 1) > ) vnf; > > module eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) { > vnf = eccentric_cycloidal_gear( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center, > do_twist=do_twist > ); > vnf_polyhedron(vnf, convexity=number_of_pins); > } > > function eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > slices = max(36,segs(pin_radius)), > circ_path = path3d(circle(r=pin_radius-contraction)), > rows = [ > for (i=[0:1:slices]) > let( > u = i/slices, > a = 360 * u, > r = rolling_circle_radius - contraction*2, > z = (u - (center?0.5:0)) * height, > xyz = cylindrical_to_xyz(r, a, z), > m = move(xyz) > ) apply(m, circ_path) > ], > vnf_wall = vnf_vertex_array(rows, col_wrap=true), > cap_path = path2d(rows[0]), > hub_circ = hub_diam<=0? [] : > circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), > cap_rgn = [ cap_path, if (hub_circ) hub_circ ], > top = last(rows)[0].z, > bot = rows[0][0].z, > vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), > vnf_cap2 = vnf_from_region(cap_rgn, up(top)), > vnf_hub = !hub_circ? EMPTY_VNF : > vnf_vertex_array([ > up(bot, p=path3d(hub_circ)), > up(top, p=path3d(hub_circ)) > ], col_wrap=true, caps=false, reverse=true), > vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) > ) vnf; > > module eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) { > vnf = eccentric_cycloidal_pinion( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center > ); > vnf_polyhedron(vnf, convexity=6); > } > > function cycloidal_pin_array2d( > pin_circle_radius=50, > pin_radius=5, > contraction=2, > number_of_pins=10 > ) = let( > rgn = [ > for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) > apply(m, circle(r=pin_radius)) > ] > ) rgn; > > > zrot(360*$t/11) > eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, > center=true, do_twist=true); > color("lightblue") > right(50-1) > zrot(-360*$t) > eccentric_cycloidal_pinion(pin_circle_radius=50, > pin_radius=10, hub_diam=5, center=true); > //region(cycloidal_pin_array2d()); > > > > - Revar > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
RW
Rogier Wolff
Wed, Aug 23, 2023 9:23 AM

On Wed, Aug 23, 2023 at 08:35:32AM +0100, nop head wrote:

In the video it looked like the output rotation is not a constant speed. Is
this actually the case, in which case it wouldn't be very useful.

It might be hard-to-verify for the "single off-center-circle" to see
that the big gear is running at constant velocity. However once the
single-tooth-gear is extruded and rotated through 360 degrees, there
is one "phase" of the gear engaged at each and every moment.

Think of this moment in the video.
https://youtu.be/qMDU5tlGUwU?t=70

Assume the big gear is driven faster when the lump of the small gear
is pointing in its direction and slower when pointed the other way. Then
the construction with two halves offset by 180 degrees would lock up. The
big gear can't be moving both faster and slower than the average.

I'm not sure his assertion that there is no sliding is true.

If we start out with a small wheel rolling on the outside of a bigger
wheel. then we offset the small wheel a small amount, but modify the
bigger wheel to have a dent where the small wheel is pointed towards
the center of the bigger wheel and a bump when the other way
around. If you assume no sliding, the gear-ratio indeed changes.

So the bumps and valleys in the bigger gear are calculated to allow
space for the offcenter-small wheel, but the smaller wheel is no
longer rolling on the outside of the bigger wheel.

Roger. 

On Wed, 23 Aug 2023 at 08:14, Revar Desmera revarbat@gmail.com wrote:

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.  Is
this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric design
requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not be
buggy, and certainly needs argument name reworking:

[image: Screenshot 2023-08-22 at 11.56.23 PM.png]

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius +
rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius -
contraction, number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count,
r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) :
rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center,
slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12,
center=true, do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50,
pin_radius=10, hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar

OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

--
** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 **
**    Delftechpark 11 2628 XJ  Delft, The Netherlands.  KVK: 27239233    **
f equals m times a. When your f is steady, and your m is going down
your a is going up.  -- Chris Hadfield about flying up the space shuttle.

On Wed, Aug 23, 2023 at 08:35:32AM +0100, nop head wrote: > In the video it looked like the output rotation is not a constant speed. Is > this actually the case, in which case it wouldn't be very useful. It might be hard-to-verify for the "single off-center-circle" to see that the big gear is running at constant velocity. However once the single-tooth-gear is extruded and rotated through 360 degrees, there is one "phase" of the gear engaged at each and every moment. Think of this moment in the video. https://youtu.be/qMDU5tlGUwU?t=70 Assume the big gear is driven faster when the lump of the small gear is pointing in its direction and slower when pointed the other way. Then the construction with two halves offset by 180 degrees would lock up. The big gear can't be moving both faster and slower than the average. I'm not sure his assertion that there is no sliding is true. If we start out with a small wheel rolling on the outside of a bigger wheel. then we offset the small wheel a small amount, but modify the bigger wheel to have a dent where the small wheel is pointed towards the center of the bigger wheel and a bump when the other way around. If you assume no sliding, the gear-ratio indeed changes. So the bumps and valleys in the bigger gear are calculated to allow space for the offcenter-small wheel, but the smaller wheel is no longer rolling on the outside of the bigger wheel. Roger. > > On Wed, 23 Aug 2023 at 08:14, Revar Desmera <revarbat@gmail.com> wrote: > > > On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > > > Interesting video: > > > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. Is > > this worth adding to the BOSL2 library? > > > > > > Definitely interesting, though I suspect the simplified eccentric design > > requires a lot of rigidity to function well. > > > > A first-pass attempt comes up with the following, which may or may not be > > buggy, and certainly needs argument name reworking: > > > > > > [image: Screenshot 2023-08-22 at 11.56.23 PM.png] > > > > > > include <BOSL2/std.scad> > > $fa = 2; > > $fs = 2; > > > > function cycloidal2d( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > ring_hole_count=3, > > ring_hole_diam=15, > > offset=false > > ) = let( > > rolling_circle_radius = pin_circle_radius / number_of_pins, > > reduction_ratio = number_of_pins - 1, > > cycloid_base_radius = reduction_ratio * rolling_circle_radius, > > steps = segs(pin_radius) * (number_of_pins-1), > > step = 360 / steps, > > path = [ > > for (i = [0:1:steps-1]) > > let( > > angle = i * step, > > xy = polar_to_xy(cycloid_base_radius + > > rolling_circle_radius, angle), > > xy2 = xy + polar_to_xy(rolling_circle_radius - > > contraction, number_of_pins*angle) > > ) xy2 > > ], > > path2 = resample_path(path, n=ceil(steps/4)), > > path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), > > rgn = [ > > path3, > > if (hub_diam>0) > > circle(d=hub_diam), > > if (ring_hole_count>0 && ring_hole_diam>0) > > for (m = zrot_copies(n=ring_hole_count, > > r=pin_circle_radius/2)) > > apply(m, circle(d=ring_hole_diam)) > > ], > > out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : > > rgn > > ) out_rgn; > > > > module cycloidal2d( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > ring_hole_count=3, > > ring_hole_diam=15, > > offset=false > > ) { > > rgn = cycloidal2d( > > pin_circle_radius=pin_circle_radius, > > pin_radius=pin_radius, > > contraction=contraction, > > number_of_pins=number_of_pins, > > hub_diam=hub_diam, > > ring_hole_count=ring_hole_count, > > ring_hole_diam=ring_hole_diam, > > offset=offset > > ); > > region(rgn); > > } > > > > function eccentric_cycloidal_gear( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > height=20, > > center=false, > > do_twist=false > > ) = let( > > twist = do_twist? 360 / (number_of_pins-1) : 0, > > rgn = cycloidal2d( > > pin_circle_radius=pin_circle_radius, > > pin_radius=pin_radius, > > contraction=contraction, > > number_of_pins=number_of_pins, > > hub_diam=hub_diam, > > ring_hole_count=0, > > offset=false > > ), > > vnf = linear_sweep(rgn, height=height, twist=twist, center=center, > > slices=twist? ceil(height) : 1) > > ) vnf; > > > > module eccentric_cycloidal_gear( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > height=20, > > center=false, > > do_twist=false > > ) { > > vnf = eccentric_cycloidal_gear( > > pin_circle_radius=pin_circle_radius, > > pin_radius=pin_radius, > > contraction=contraction, > > number_of_pins=number_of_pins, > > hub_diam=hub_diam, > > height=height, > > center=center, > > do_twist=do_twist > > ); > > vnf_polyhedron(vnf, convexity=number_of_pins); > > } > > > > function eccentric_cycloidal_pinion( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > height=20, > > center=false > > ) = let( > > rolling_circle_radius = pin_circle_radius / number_of_pins, > > slices = max(36,segs(pin_radius)), > > circ_path = path3d(circle(r=pin_radius-contraction)), > > rows = [ > > for (i=[0:1:slices]) > > let( > > u = i/slices, > > a = 360 * u, > > r = rolling_circle_radius - contraction*2, > > z = (u - (center?0.5:0)) * height, > > xyz = cylindrical_to_xyz(r, a, z), > > m = move(xyz) > > ) apply(m, circ_path) > > ], > > vnf_wall = vnf_vertex_array(rows, col_wrap=true), > > cap_path = path2d(rows[0]), > > hub_circ = hub_diam<=0? [] : > > circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), > > cap_rgn = [ cap_path, if (hub_circ) hub_circ ], > > top = last(rows)[0].z, > > bot = rows[0][0].z, > > vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), > > vnf_cap2 = vnf_from_region(cap_rgn, up(top)), > > vnf_hub = !hub_circ? EMPTY_VNF : > > vnf_vertex_array([ > > up(bot, p=path3d(hub_circ)), > > up(top, p=path3d(hub_circ)) > > ], col_wrap=true, caps=false, reverse=true), > > vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) > > ) vnf; > > > > module eccentric_cycloidal_pinion( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=1, > > number_of_pins=10, > > hub_diam=20, > > height=20, > > center=false > > ) { > > vnf = eccentric_cycloidal_pinion( > > pin_circle_radius=pin_circle_radius, > > pin_radius=pin_radius, > > contraction=contraction, > > number_of_pins=number_of_pins, > > hub_diam=hub_diam, > > height=height, > > center=center > > ); > > vnf_polyhedron(vnf, convexity=6); > > } > > > > function cycloidal_pin_array2d( > > pin_circle_radius=50, > > pin_radius=5, > > contraction=2, > > number_of_pins=10 > > ) = let( > > rgn = [ > > for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) > > apply(m, circle(r=pin_radius)) > > ] > > ) rgn; > > > > > > zrot(360*$t/11) > > eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, > > center=true, do_twist=true); > > color("lightblue") > > right(50-1) > > zrot(-360*$t) > > eccentric_cycloidal_pinion(pin_circle_radius=50, > > pin_radius=10, hub_diam=5, center=true); > > //region(cycloidal_pin_array2d()); > > > > > > > > - Revar > > > > > > _______________________________________________ > > OpenSCAD mailing list > > To unsubscribe send an email to discuss-leave@lists.openscad.org > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org -- ** R.E.Wolff@BitWizard.nl ** https://www.BitWizard.nl/ ** +31-15-2049110 ** ** Delftechpark 11 2628 XJ Delft, The Netherlands. KVK: 27239233 ** f equals m times a. When your f is steady, and your m is going down your a is going up. -- Chris Hadfield about flying up the space shuttle.
MH
Matthieu Hendriks
Wed, Aug 23, 2023 10:32 AM

I was trying ihe included example from Revar.

WARNING: Ignoring unknown function 'list_unwrap' in file
eccentric_cycloidal.scad, line 29 [1]

Than the rest fails.

What of where is this list_unwrap function?

nop head schreef op 2023-08-23 09:35:

In the video it looked like the output rotation is not a constant
speed. Is this actually the case, in which case it wouldn't be very
useful.

On Wed, 23 Aug 2023 at 08:14, Revar Desmera revarbat@gmail.com wrote:

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.
Is this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric
design requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not
be buggy, and certainly needs argument name reworking:

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius - contraction,
number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center,
slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true,
do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10,
hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar

OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I was trying ihe included example from Revar. WARNING: Ignoring unknown function 'list_unwrap' in file eccentric_cycloidal.scad, line 29 [1] Than the rest fails. What of where is this list_unwrap function? ------------------------- nop head schreef op 2023-08-23 09:35: > In the video it looked like the output rotation is not a constant > speed. Is this actually the case, in which case it wouldn't be very > useful. > > On Wed, 23 Aug 2023 at 08:14, Revar Desmera <revarbat@gmail.com> wrote: > > On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > Interesting video: > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. > Is this worth adding to the BOSL2 library? > > Definitely interesting, though I suspect the simplified eccentric > design requires a lot of rigidity to function well. > > A first-pass attempt comes up with the following, which may or may not > be buggy, and certainly needs argument name reworking: > > include <BOSL2/std.scad> > $fa = 2; > $fs = 2; > > function cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > reduction_ratio = number_of_pins - 1, > cycloid_base_radius = reduction_ratio * rolling_circle_radius, > steps = segs(pin_radius) * (number_of_pins-1), > step = 360 / steps, > path = [ > for (i = [0:1:steps-1]) > let( > angle = i * step, > xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle), > xy2 = xy + polar_to_xy(rolling_circle_radius - contraction, > number_of_pins*angle) > ) xy2 > ], > path2 = resample_path(path, n=ceil(steps/4)), > path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), > rgn = [ > path3, > if (hub_diam>0) > circle(d=hub_diam), > if (ring_hole_count>0 && ring_hole_diam>0) > for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2)) > apply(m, circle(d=ring_hole_diam)) > ], > out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn > ) out_rgn; > > module cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) { > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=ring_hole_count, > ring_hole_diam=ring_hole_diam, > offset=offset > ); > region(rgn); > } > > function eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) = let( > twist = do_twist? 360 / (number_of_pins-1) : 0, > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=0, > offset=false > ), > vnf = linear_sweep(rgn, height=height, twist=twist, center=center, > slices=twist? ceil(height) : 1) > ) vnf; > > module eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) { > vnf = eccentric_cycloidal_gear( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center, > do_twist=do_twist > ); > vnf_polyhedron(vnf, convexity=number_of_pins); > } > > function eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > slices = max(36,segs(pin_radius)), > circ_path = path3d(circle(r=pin_radius-contraction)), > rows = [ > for (i=[0:1:slices]) > let( > u = i/slices, > a = 360 * u, > r = rolling_circle_radius - contraction*2, > z = (u - (center?0.5:0)) * height, > xyz = cylindrical_to_xyz(r, a, z), > m = move(xyz) > ) apply(m, circ_path) > ], > vnf_wall = vnf_vertex_array(rows, col_wrap=true), > cap_path = path2d(rows[0]), > hub_circ = hub_diam<=0? [] : > circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), > cap_rgn = [ cap_path, if (hub_circ) hub_circ ], > top = last(rows)[0].z, > bot = rows[0][0].z, > vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), > vnf_cap2 = vnf_from_region(cap_rgn, up(top)), > vnf_hub = !hub_circ? EMPTY_VNF : > vnf_vertex_array([ > up(bot, p=path3d(hub_circ)), > up(top, p=path3d(hub_circ)) > ], col_wrap=true, caps=false, reverse=true), > vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) > ) vnf; > > module eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) { > vnf = eccentric_cycloidal_pinion( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center > ); > vnf_polyhedron(vnf, convexity=6); > } > > function cycloidal_pin_array2d( > pin_circle_radius=50, > pin_radius=5, > contraction=2, > number_of_pins=10 > ) = let( > rgn = [ > for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) > apply(m, circle(r=pin_radius)) > ] > ) rgn; > > zrot(360*$t/11) > eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true, > do_twist=true); > color("lightblue") > right(50-1) > zrot(-360*$t) > eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10, > hub_diam=5, center=true); > //region(cycloidal_pin_array2d()); > > - Revar > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org Links: ------ [1] http://digirent.nl/29,/home/matthieu/openscad_drawings/proef/eccentric_cycloidal.scad
AM
Adrian Mariano
Wed, Aug 23, 2023 11:19 AM

Try updating to the latest BOSL2.

On Wed, Aug 23, 2023 at 6:33 AM Matthieu Hendriks mhendriks@digirent.nl
wrote:

I was trying ihe included example from Revar.
WARNING: Ignoring unknown function 'list_unwrap' in file
eccentric_cycloidal.scad, line 29
http://29,/home/matthieu/openscad_drawings/proef/eccentric_cycloidal.scad

Than the rest fails.

What of where is this list_unwrap function?

nop head schreef op 2023-08-23 09:35:

In the video it looked like the output rotation is not a constant speed.
Is this actually the case, in which case it wouldn't be very useful.

On Wed, 23 Aug 2023 at 08:14, Revar Desmera revarbat@gmail.com wrote:

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.  Is
this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric design
requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not be
buggy, and certainly needs argument name reworking:

[image: Screenshot 2023-08-22 at 11.56.23 PM.png]

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius +
rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius -
contraction, number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count,
r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) :
rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center,
slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12,
center=true, do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50,
pin_radius=10, hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar

OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Try updating to the latest BOSL2. On Wed, Aug 23, 2023 at 6:33 AM Matthieu Hendriks <mhendriks@digirent.nl> wrote: > I was trying ihe included example from Revar. > WARNING: Ignoring unknown function 'list_unwrap' in file > eccentric_cycloidal.scad, line 29 > <http://29,/home/matthieu/openscad_drawings/proef/eccentric_cycloidal.scad> > > Than the rest fails. > > What of where is this list_unwrap function? > ------------------------------ > > > nop head schreef op 2023-08-23 09:35: > > In the video it looked like the output rotation is not a constant speed. > Is this actually the case, in which case it wouldn't be very useful. > > On Wed, 23 Aug 2023 at 08:14, Revar Desmera <revarbat@gmail.com> wrote: > > On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > Interesting video: > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. Is > this worth adding to the BOSL2 library? > > Definitely interesting, though I suspect the simplified eccentric design > requires a lot of rigidity to function well. > > A first-pass attempt comes up with the following, which may or may not be > buggy, and certainly needs argument name reworking: > > [image: Screenshot 2023-08-22 at 11.56.23 PM.png] > > > > include <BOSL2/std.scad> > $fa = 2; > $fs = 2; > > function cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > reduction_ratio = number_of_pins - 1, > cycloid_base_radius = reduction_ratio * rolling_circle_radius, > steps = segs(pin_radius) * (number_of_pins-1), > step = 360 / steps, > path = [ > for (i = [0:1:steps-1]) > let( > angle = i * step, > xy = polar_to_xy(cycloid_base_radius + > rolling_circle_radius, angle), > xy2 = xy + polar_to_xy(rolling_circle_radius - > contraction, number_of_pins*angle) > ) xy2 > ], > path2 = resample_path(path, n=ceil(steps/4)), > path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), > rgn = [ > path3, > if (hub_diam>0) > circle(d=hub_diam), > if (ring_hole_count>0 && ring_hole_diam>0) > for (m = zrot_copies(n=ring_hole_count, > r=pin_circle_radius/2)) > apply(m, circle(d=ring_hole_diam)) > ], > out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : > rgn > ) out_rgn; > > module cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) { > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=ring_hole_count, > ring_hole_diam=ring_hole_diam, > offset=offset > ); > region(rgn); > } > > function eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) = let( > twist = do_twist? 360 / (number_of_pins-1) : 0, > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=0, > offset=false > ), > vnf = linear_sweep(rgn, height=height, twist=twist, center=center, > slices=twist? ceil(height) : 1) > ) vnf; > > module eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) { > vnf = eccentric_cycloidal_gear( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center, > do_twist=do_twist > ); > vnf_polyhedron(vnf, convexity=number_of_pins); > } > > function eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > slices = max(36,segs(pin_radius)), > circ_path = path3d(circle(r=pin_radius-contraction)), > rows = [ > for (i=[0:1:slices]) > let( > u = i/slices, > a = 360 * u, > r = rolling_circle_radius - contraction*2, > z = (u - (center?0.5:0)) * height, > xyz = cylindrical_to_xyz(r, a, z), > m = move(xyz) > ) apply(m, circ_path) > ], > vnf_wall = vnf_vertex_array(rows, col_wrap=true), > cap_path = path2d(rows[0]), > hub_circ = hub_diam<=0? [] : > circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), > cap_rgn = [ cap_path, if (hub_circ) hub_circ ], > top = last(rows)[0].z, > bot = rows[0][0].z, > vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), > vnf_cap2 = vnf_from_region(cap_rgn, up(top)), > vnf_hub = !hub_circ? EMPTY_VNF : > vnf_vertex_array([ > up(bot, p=path3d(hub_circ)), > up(top, p=path3d(hub_circ)) > ], col_wrap=true, caps=false, reverse=true), > vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) > ) vnf; > > module eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) { > vnf = eccentric_cycloidal_pinion( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center > ); > vnf_polyhedron(vnf, convexity=6); > } > > function cycloidal_pin_array2d( > pin_circle_radius=50, > pin_radius=5, > contraction=2, > number_of_pins=10 > ) = let( > rgn = [ > for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) > apply(m, circle(r=pin_radius)) > ] > ) rgn; > > > zrot(360*$t/11) > eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, > center=true, do_twist=true); > color("lightblue") > right(50-1) > zrot(-360*$t) > eccentric_cycloidal_pinion(pin_circle_radius=50, > pin_radius=10, hub_diam=5, center=true); > //region(cycloidal_pin_array2d()); > > > > > - Revar > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
MH
Matthieu Hendriks
Wed, Aug 23, 2023 11:23 AM

That fixed it. Tnx.

Matthieu


Adrian Mariano schreef op 2023-08-23 13:19:

Try updating to the latest BOSL2.

On Wed, Aug 23, 2023 at 6:33 AM Matthieu Hendriks
mhendriks@digirent.nl wrote:

I was trying ihe included example from Revar.

WARNING: Ignoring unknown function 'list_unwrap' in file
eccentric_cycloidal.scad, line 29 [1]

Than the rest fails.

What of where is this list_unwrap function?

nop head schreef op 2023-08-23 09:35:

In the video it looked like the output rotation is not a constant
speed. Is this actually the case, in which case it wouldn't be very
useful.

On Wed, 23 Aug 2023 at 08:14, Revar Desmera revarbat@gmail.com wrote:

On Aug 20, 2023, at 7:53 AM, jon jon@jonbondy.com wrote:

Interesting video:

https://www.youtube.com/watch?v=qMDU5tlGUwU

I looked in the BOSL2 documentation for "cycloidal" and came up empty.
Is this worth adding to the BOSL2 library?

Definitely interesting, though I suspect the simplified eccentric
design requires a lot of rigidity to function well.

A first-pass attempt comes up with the following, which may or may not
be buggy, and certainly needs argument name reworking:

include <BOSL2/std.scad>
$fa = 2;
$fs = 2;

function cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
reduction_ratio = number_of_pins - 1,
cycloid_base_radius = reduction_ratio * rolling_circle_radius,
steps = segs(pin_radius) * (number_of_pins-1),
step = 360 / steps,
path = [
for (i = [0:1:steps-1])
let(
angle = i * step,
xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle),
xy2 = xy + polar_to_xy(rolling_circle_radius - contraction,
number_of_pins*angle)
) xy2
],
path2 = resample_path(path, n=ceil(steps/4)),
path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true),
rgn = [
path3,
if (hub_diam>0)
circle(d=hub_diam),
if (ring_hole_count>0 && ring_hole_diam>0)
for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2))
apply(m, circle(d=ring_hole_diam))
],
out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn
) out_rgn;

module cycloidal2d(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
ring_hole_count=3,
ring_hole_diam=15,
offset=false
) {
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=ring_hole_count,
ring_hole_diam=ring_hole_diam,
offset=offset
);
region(rgn);
}

function eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) = let(
twist = do_twist? 360 / (number_of_pins-1) : 0,
rgn = cycloidal2d(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
ring_hole_count=0,
offset=false
),
vnf = linear_sweep(rgn, height=height, twist=twist, center=center,
slices=twist? ceil(height) : 1)
) vnf;

module eccentric_cycloidal_gear(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false,
do_twist=false
) {
vnf = eccentric_cycloidal_gear(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center,
do_twist=do_twist
);
vnf_polyhedron(vnf, convexity=number_of_pins);
}

function eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) = let(
rolling_circle_radius = pin_circle_radius / number_of_pins,
slices = max(36,segs(pin_radius)),
circ_path = path3d(circle(r=pin_radius-contraction)),
rows = [
for (i=[0:1:slices])
let(
u = i/slices,
a = 360 * u,
r = rolling_circle_radius - contraction*2,
z = (u - (center?0.5:0)) * height,
xyz = cylindrical_to_xyz(r, a, z),
m = move(xyz)
) apply(m, circ_path)
],
vnf_wall = vnf_vertex_array(rows, col_wrap=true),
cap_path = path2d(rows[0]),
hub_circ = hub_diam<=0? [] :
circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))),
cap_rgn = [ cap_path, if (hub_circ) hub_circ ],
top = last(rows)[0].z,
bot = rows[0][0].z,
vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true),
vnf_cap2 = vnf_from_region(cap_rgn, up(top)),
vnf_hub = !hub_circ? EMPTY_VNF :
vnf_vertex_array([
up(bot, p=path3d(hub_circ)),
up(top, p=path3d(hub_circ))
], col_wrap=true, caps=false, reverse=true),
vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub])
) vnf;

module eccentric_cycloidal_pinion(
pin_circle_radius=50,
pin_radius=5,
contraction=1,
number_of_pins=10,
hub_diam=20,
height=20,
center=false
) {
vnf = eccentric_cycloidal_pinion(
pin_circle_radius=pin_circle_radius,
pin_radius=pin_radius,
contraction=contraction,
number_of_pins=number_of_pins,
hub_diam=hub_diam,
height=height,
center=center
);
vnf_polyhedron(vnf, convexity=6);
}

function cycloidal_pin_array2d(
pin_circle_radius=50,
pin_radius=5,
contraction=2,
number_of_pins=10
) = let(
rgn = [
for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius))
apply(m, circle(r=pin_radius))
]
) rgn;

zrot(360*$t/11)
eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true,
do_twist=true);
color("lightblue")
right(50-1)
zrot(-360*$t)
eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10,
hub_diam=5, center=true);
//region(cycloidal_pin_array2d());

  • Revar

OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Links:

[1]
http://29,/home/matthieu/openscad_drawings/proef/eccentric_cycloidal.scad

That fixed it. Tnx. Matthieu ------------------------- Adrian Mariano schreef op 2023-08-23 13:19: > Try updating to the latest BOSL2. > > On Wed, Aug 23, 2023 at 6:33 AM Matthieu Hendriks > <mhendriks@digirent.nl> wrote: > > I was trying ihe included example from Revar. > > WARNING: Ignoring unknown function 'list_unwrap' in file > eccentric_cycloidal.scad, line 29 [1] > > Than the rest fails. > > What of where is this list_unwrap function? > ------------------------- > > nop head schreef op 2023-08-23 09:35: > > In the video it looked like the output rotation is not a constant > speed. Is this actually the case, in which case it wouldn't be very > useful. > > On Wed, 23 Aug 2023 at 08:14, Revar Desmera <revarbat@gmail.com> wrote: > > On Aug 20, 2023, at 7:53 AM, jon <jon@jonbondy.com> wrote: > > Interesting video: > > https://www.youtube.com/watch?v=qMDU5tlGUwU > > I looked in the BOSL2 documentation for "cycloidal" and came up empty. > Is this worth adding to the BOSL2 library? > > Definitely interesting, though I suspect the simplified eccentric > design requires a lot of rigidity to function well. > > A first-pass attempt comes up with the following, which may or may not > be buggy, and certainly needs argument name reworking: > > include <BOSL2/std.scad> > $fa = 2; > $fs = 2; > > function cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > reduction_ratio = number_of_pins - 1, > cycloid_base_radius = reduction_ratio * rolling_circle_radius, > steps = segs(pin_radius) * (number_of_pins-1), > step = 360 / steps, > path = [ > for (i = [0:1:steps-1]) > let( > angle = i * step, > xy = polar_to_xy(cycloid_base_radius + rolling_circle_radius, angle), > xy2 = xy + polar_to_xy(rolling_circle_radius - contraction, > number_of_pins*angle) > ) xy2 > ], > path2 = resample_path(path, n=ceil(steps/4)), > path3 = offset(list_unwrap(path2), r=-pin_radius, closed=true), > rgn = [ > path3, > if (hub_diam>0) > circle(d=hub_diam), > if (ring_hole_count>0 && ring_hole_diam>0) > for (m = zrot_copies(n=ring_hole_count, r=pin_circle_radius/2)) > apply(m, circle(d=ring_hole_diam)) > ], > out_rgn = offset? left(rolling_circle_radius-contraction, p=rgn) : rgn > ) out_rgn; > > module cycloidal2d( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > ring_hole_count=3, > ring_hole_diam=15, > offset=false > ) { > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=ring_hole_count, > ring_hole_diam=ring_hole_diam, > offset=offset > ); > region(rgn); > } > > function eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) = let( > twist = do_twist? 360 / (number_of_pins-1) : 0, > rgn = cycloidal2d( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > ring_hole_count=0, > offset=false > ), > vnf = linear_sweep(rgn, height=height, twist=twist, center=center, > slices=twist? ceil(height) : 1) > ) vnf; > > module eccentric_cycloidal_gear( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false, > do_twist=false > ) { > vnf = eccentric_cycloidal_gear( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center, > do_twist=do_twist > ); > vnf_polyhedron(vnf, convexity=number_of_pins); > } > > function eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) = let( > rolling_circle_radius = pin_circle_radius / number_of_pins, > slices = max(36,segs(pin_radius)), > circ_path = path3d(circle(r=pin_radius-contraction)), > rows = [ > for (i=[0:1:slices]) > let( > u = i/slices, > a = 360 * u, > r = rolling_circle_radius - contraction*2, > z = (u - (center?0.5:0)) * height, > xyz = cylindrical_to_xyz(r, a, z), > m = move(xyz) > ) apply(m, circ_path) > ], > vnf_wall = vnf_vertex_array(rows, col_wrap=true), > cap_path = path2d(rows[0]), > hub_circ = hub_diam<=0? [] : > circle(d=hub_diam, $fn=max(12,segs(hub_diam/2))), > cap_rgn = [ cap_path, if (hub_circ) hub_circ ], > top = last(rows)[0].z, > bot = rows[0][0].z, > vnf_cap1 = vnf_from_region(cap_rgn, up(bot), reverse=true), > vnf_cap2 = vnf_from_region(cap_rgn, up(top)), > vnf_hub = !hub_circ? EMPTY_VNF : > vnf_vertex_array([ > up(bot, p=path3d(hub_circ)), > up(top, p=path3d(hub_circ)) > ], col_wrap=true, caps=false, reverse=true), > vnf = vnf_join([vnf_wall, vnf_cap1, vnf_cap2, vnf_hub]) > ) vnf; > > module eccentric_cycloidal_pinion( > pin_circle_radius=50, > pin_radius=5, > contraction=1, > number_of_pins=10, > hub_diam=20, > height=20, > center=false > ) { > vnf = eccentric_cycloidal_pinion( > pin_circle_radius=pin_circle_radius, > pin_radius=pin_radius, > contraction=contraction, > number_of_pins=number_of_pins, > hub_diam=hub_diam, > height=height, > center=center > ); > vnf_polyhedron(vnf, convexity=6); > } > > function cycloidal_pin_array2d( > pin_circle_radius=50, > pin_radius=5, > contraction=2, > number_of_pins=10 > ) = let( > rgn = [ > for(m = zrot_copies(n=number_of_pins,r=pin_circle_radius)) > apply(m, circle(r=pin_radius)) > ] > ) rgn; > > zrot(360*$t/11) > eccentric_cycloidal_gear(pin_radius=10, number_of_pins=12, center=true, > do_twist=true); > color("lightblue") > right(50-1) > zrot(-360*$t) > eccentric_cycloidal_pinion(pin_circle_radius=50, pin_radius=10, > hub_diam=5, center=true); > //region(cycloidal_pin_array2d()); > > - Revar > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org _______________________________________________ OpenSCAD mailing list To unsubscribe send an email to discuss-leave@lists.openscad.org Links: ------ [1] http://29,/home/matthieu/openscad_drawings/proef/eccentric_cycloidal.scad