WIDTH = 30; /* track width */ CURVE_RADIUS = 25; /* track wheel cover curve radius */ AXLE_DISTANCE = 195; /* how far is the front motor from back motor */ THICKNESS=1.5; /* plastic thickness all around */ CLEARANCE = 10; /* clearance around axles and suspension mounts */ module mount_pad(left, top, diameter=4) { translate([left, top]) { difference() { union() { cylinder(h=THICKNESS, r1=diameter*1.5, r2=diameter*1.5, $fn=50); translate([-diameter*1.5, 0, 0]) { cube([diameter*3, diameter*3, THICKNESS]); } } cylinder(h=THICKNESS, r1=diameter/2, r2=diameter/2, $fn=50); } } } /* bucket creates cylinder with inner cylinder removed */ module bucket() { difference() { cylinder(h = WIDTH, r1 = CURVE_RADIUS+THICKNESS, r2 = CURVE_RADIUS+THICKNESS, $fn=100); translate([0, 0, THICKNESS]) { cylinder(h = WIDTH, r1 = CURVE_RADIUS, r2 = CURVE_RADIUS, $fn=100); } cylinder(h=THICKNESS, r1=CLEARANCE, r2=CLEARANCE, $fn=50); rotate(135) { cube([CURVE_RADIUS+THICKNESS, CURVE_RADIUS+THICKNESS, WIDTH]); } } } module track_cover() { difference() { union() { /* mounting edge */ translate([0, CLEARANCE, 0]) { cube([AXLE_DISTANCE, CURVE_RADIUS-CLEARANCE, THICKNESS]); } /* wheel covers */ bucket(); translate([AXLE_DISTANCE, 0, 0]) { mirror([1, 0, 0]) { bucket(); } } /* cover on the top */ translate([0, CURVE_RADIUS]) { cube([AXLE_DISTANCE, THICKNESS, WIDTH]); } } union() { /* cutout lower half */ translate([-CURVE_RADIUS-THICKNESS, -CURVE_RADIUS-THICKNESS]) { cube([10000, CURVE_RADIUS+THICKNESS, 10000]); } /* cutout inner arcs */ translate([0, 0, THICKNESS]) { cube([AXLE_DISTANCE, CURVE_RADIUS, WIDTH]); } /* cutout clearance */ cube([AXLE_DISTANCE, CLEARANCE, THICKNESS]); } } mount_pad(28, 5); mount_pad(63, 5); mount_pad(63+39, 5); mount_pad(63+39*2, 5); } module track_cover_set() { track_cover(); mirror([0,1,0]) { translate([0, -CURVE_RADIUS*2-THICKNESS*3, 0]) { track_cover(); } } } track_cover_set();