use ; use ; // total outer dimension of the lasttretrad ltr_length = 3000; ltr_width = 1000; ltr_height = 160; bed_height = 18; // the universal standard board used during prototype construction board_width=25; board_height=120; module frame() { bessel=sqrt(3/2) -1; // translate([-l/2, -w/2, 0]) // cube([l, w, h]); translate([0, 0, -board_height - bed_height]) { // front/back boards for (pos = [-0.9, -0.4, 0, 0.4, 0.9]) translate([pos * (ltr_length - board_width)/2 - board_width + board_width/2, -ltr_width/2, 0]) cube([board_width, ltr_width, board_height]); // left/right boards // Positioned at the bessel points (yields minimal mean bend // assuming equal load on the cargo bed); see // https://de.wikipedia.org/wiki/Bessel-Punkt for (pos = [-1,1]) translate([-ltr_length/2, pos * (1 - 2*bessel) * (ltr_width - board_width)/2 - board_width/2, 0]) cube([ltr_length, board_width, board_height]); } } // use a large plywood board module cargo_bed() { translate([0, 0, -bed_height/2]) cube([ltr_length, ltr_width, bed_height], center=true); } // specify (f)ront/(c)enter/(b)ack as -1/0/1 and (l)eft/(r)ight as -1/1 module wheel_position(fcb, lr) { translate([1250 * fcb, (fcb == 0) ? (340 * lr) : (370 * lr), 0]) children(); } // specify (f)ront/(b)ack and (l)eft/(r)ight as -1/1 module steered_wheel(fb=-1, lr=-1, rot=0, suspension_depth=0) { rotate([ 0, 0, fb*rot]) suspension_fork(suspension_depth); translate([0, 0, wheel_offset(suspension_depth)]) rotate([90, 0, fb*rot]) wheel(); } // specify (l)eft/(r)ight as -1/1 module powered_wheel(lr=-1, suspension_depth=0) { axis_distance = 500; board_length = axis_distance + board_height; default_suspension_depth = 0; // used to calculate anchor point axis_offset = board_height/2 + bed_height; // distance from upper axis to cargo floor rot = asin((250 - suspension_depth ) / axis_distance); default_rot = asin((250 - default_suspension_depth - axis_offset) / axis_distance); translate([-axis_distance * cos(default_rot), 0, -axis_offset]) rotate([0, rot, 0]) { translate([axis_distance, 0, 0]) rotate([90]) wheel(); for (i = [-1,1]) translate([0, i*40 - lr*5, 0]) // board with rounded edges hull() for (i = [0, 1]) translate([i * axis_distance, 0, 0]) rotate([90, 0, 0]) cylinder(r=board_height/2, h=board_width, center=true); } } module lasttretrad(rot=0, suspension_depth=0) { color("SaddleBrown") frame(); color("Cornsilk") cargo_bed(); for (lr = [-1,1]) for (fb = [-1,1]) wheel_position(fb, lr) steered_wheel(fb, lr, rot=rot, suspension_depth=suspension_depth); for (lr = [-1,1]) wheel_position(0, lr) powered_wheel(lr, suspension_depth=suspension_depth); } lasttretrad(30, 50);