/* */ $fs = 2; // change me to 2 for viewing/alterations, and 0.5 for final export render extrusion_width = 0.5; layer_height = 0.2; ribs = 10; outer_diameter = 90; tread_teeth = 12; tread_depth = 4.5; tread_layers = 5; bell_radius = 24; height = 25; hex_diameter = 12; hole_diameter = 4; socket_depth = 5; socket_diameter = 14; /* */ $fa = 0.01; wall_width = extrusion_width * 2; outer_radius = outer_diameter / 2; rim_width = wall_width * 1.5; rib_width = wall_width; bell_width = wall_width * 2; module treadsection(r = outer_radius - tread_depth, a=7, h=5) { render() linear_extrude(height = h, convexity = 5) hull() { difference() { circle(r - 0.1); circle(r - 0.2); for (i=[0:1]) mirror([0, i, 0]) rotate(a) translate([-outer_diameter, 0]) square(outer_diameter * 2); } for (i=[0:1]) translate([outer_radius - 1, (1 - (i * 2)) * 1.4]) circle(1); } } module tread(h = 5) { for (i=[0:tread_layers - 1]) translate([0, 0, i * h]) rotate([0, 0, (i % 2) * 180 / tread_teeth]) treadsection(h=height / tread_layers); } module inner(r1 = bell_radius, r2 = 3) { render() hull() { translate([0, 0, r2]) rotate_extrude(convexity=5) translate([r1 - r2, 0]) circle(r2); translate([0, 0, height]) cylinder(r=r1, h=1); cylinder(r=r1 - r2, h=1); } } module rib(r1=(outer_radius - tread_depth - rim_width) - (bell_radius + bell_width) - rib_width, r2=bell_radius + bell_width - 0.5, w=rib_width, a=110, h=height) { #render() linear_extrude(height=h, convexity=5) intersection() { circle(outer_radius - tread_depth - 0.1); translate([r2, -r1 + w * 0.5, 0]) difference() { circle(r1); rotate(-a) translate([0, -r1 * 1.5]) square([r1 * 3, r1 * 3]); if (a < 90) translate([-r1, -r1]) square([r1 * 2, r1]); translate([-r1, -r1]) square([r1, r1 * 2]); circle(r1 - w); } } } module wheel() { difference() { cylinder(r=outer_radius - tread_depth, h=height); translate([0, 0, socket_depth + layer_height]) cylinder(r=hole_diameter / 2 + 0.1, h=height); translate([0, 0, -1]) cylinder(r=socket_diameter / 2 + 0.5, h=socket_depth + 1); translate([0, 0, 5 + 1.55]) cylinder(r=hex_diameter / 2 / cos(180 / 6) + 0.05, h=50, $fn=6); translate([0, 0, 10]) inner(); translate([0, 0, -1]) difference() { cylinder(r=outer_radius - tread_depth - rim_width, h=height + 2); cylinder(r=bell_radius + bell_width, h=height + 2); } } for (i=[0:tread_teeth]) { rotate([0, 0, i * 360 / tread_teeth]) tread(); } for (i=[0:ribs]) { rotate([0, 0, i * 360 / ribs]) rib(); } } for (x=[0:1]) for (i=[0:1]) mirror([0, i, 0]) translate([(1 - (x * 2)) * (outer_radius+ 2), outer_radius + 2, 0]) wheel();