$fn=60; l1=[48,24,8]; l2=[24,18,5]; treads(n=15,link_size=l2); module treads(n, link_size){ tread_link(link_size); for(i=[1:1:(n-1)]){ translate([(link_size[1]-link_size[2])*i,0,0]) tread_link(link_size); translate([(link_size[1]-link_size[2])*(i),0,0]) pin(link_size); } } module master_pin(){ } module pin(s){ pin_diameter = floor(s[2]/2); union(){ translate([0,0,2*0.2]) cylinder(h=s[0]-4*0.2,r=pin_diameter/2); translate([0,0,2*0.2]) union(){ cylinder(h=s[2]/2,r=s[2]/3); translate([-(s[2]/3),-s[2]/2,0]) cube([(s[2]/3)*2,s[2]/2,s[2]/2]); } translate([0,0,s[0]-2*0.2-s[2]/2]) union(){ cylinder(h=s[2]/2,r=s[2]/3); translate([-(s[2]/3),-s[2]/2,0]) cube([(s[2]/3)*2,s[2]/2,s[2]/2]); } } } module tread_link(s, gap=0.2){ pin_diameter = floor(s[2]/2); echo("Pin diameter: ", pin_diameter); difference(){ union(){ tread_base(s); translate([s[1]*0.16,s[2]/2,s[0]/2]) rotate([180,0,90]) chevron(1,s[0]*0.48,135); translate([s[1]*0.88,s[2]/2,s[0]/2]) rotate([180,0,90]) chevron(1,s[0]*0.48,135); translate([s[1]*0.50,s[2]/2,s[0]/2]) rotate([180,0,90]) chevron(1,s[0]*0.50,135); } pin_holes(pin_diameter, s, gap); insets(s, gap); tooth_hole(s); } } module tread_base(s){ union(){ linear_extrude(s[0]) hull(){ circle(r=s[2]/2); translate([s[1]-s[2],0,0]) circle(r=s[2]/2); } } } module pin_holes(d, s,gap){ cylinder(h=s[0], r=((d+gap)/2)+0.1); translate([s[1]-s[2],0,0]) cylinder(h=s[0], r=((d+gap)/2)+0.1); } module insets(s,gap){ i_d=s[0]*0.25; rear_inset(s,i_d,gap); translate([0,0,s[0]-i_d]) rear_inset(s,i_d,gap); front_inset(s,i_d,gap); } module rear_inset(s,i_d,gap){ translate([-s[2]/2,-(s[2]*2)/2,-gap]) cube([s[2]+gap,s[2]*2,i_d+gap*2]); } module front_inset(s,i_d,gap){ translate([(s[1]-s[2])-(s[2]/2)-gap,-(s[2]*2)/2,i_d]) cube([s[2]+gap+2,s[2]*2,s[0]-(2*i_d)]); translate([(s[1]-s[2])-(s[2]/2)-gap,-s[2]/2,-(s[2]/2)+3*gap]) cube([s[2]+gap,s[2]+2,s[2]]); translate([(s[1]-s[2])-(s[2]/2)-gap,-s[2]/2,s[0]-(s[2]/2)-3*gap]) cube([s[2]+gap,s[2]+2,s[2]]); } module tooth_hole(s){ w=s[0]*0.5; d=s[1]*0.25; translate([s[1]*0.25,-(s[2]*2)/2,(s[0]-w)/2]) cube([d,s[2]*2,w]); } module chevron(s,l,a){ union(){ rotate([-(90-(a/2)),0,0]) translate([s/2,-s/2,-l/2]) cube([s+0.1,s,l],center=true); rotate([90-(a/2),0,0]) translate([s/2,-s/2,l/2]) cube([s+.1,s,l],center=true); } }