main.scad

tol = 1;
screw_extra = 2;
fudge = 0.1;
$fa = 1;
$fs = 1;

servo_length = 22.58;
servo_height = 12.28;
flange_thickness = 2.38;
flange_to_back = 17.82 - flange_thickness;
flange_to_front = 4.36;
mounting_hole_diamter = 2.13;
hole_out_dist = 30.28;
hole_center_dist = hole_out_dist - mounting_hole_diamter;
screw_length = 9.42;
buffer_length = 3;

plate_thickness = screw_length + screw_extra;
plate_length = hole_center_dist + mounting_hole_diamter + 2*buffer_length;
plate_height = servo_height + + 2*buffer_length;
inner_length = servo_length + tol*2;
inner_height = servo_height + tol*2;

module servo_mount_plate() {
    difference() {
        cube([plate_length,plate_thickness,plate_height], true);
        translate([0, 0, buffer_length/2]) cube([inner_length,plate_thickness + fudge, inner_height + buffer_length + fudge], true);
        translate([-hole_center_dist/2, (plate_thickness + fudge)/2, 0])
            rotate([90,0,0])
                cylinder(plate_thickness + fudge, d=mounting_hole_diamter, true);
        translate([hole_center_dist/2, (plate_thickness + fudge)/2, 0])
            rotate([90,0,0])
                cylinder(plate_thickness + fudge, d=mounting_hole_diamter, true);
    }
}

base_length = 90;
base_width = 90;
base_thickness = 4;
module base() {
        union() {
        translate([base_length/4 -fudge, 0, 0]) cube([base_length/2, base_width, base_thickness], center=true);
        cylinder(base_thickness, d=base_length, center=true);
        }
}


horn_diameter = 26.66;
horn_center = 11.35;
horn_tip = 4.25;
horn_in = 7.94;
horn_thickness = 2.2;

module servo_horn() {
    union() {
    linear_extrude(horn_thickness,true) offset(r=0.4)
    union() {
        square(horn_in, true);
        for (i = [0 : 90 : 270])
            union() {
            rotate([0, 0, i]) translate([horn_diameter/2 - horn_tip/2, 0, 0])circle(d=horn_tip);
             rotate([0, 0, i]) polygon(points=[[-horn_in/2, horn_in/2],[horn_in/2, horn_in/2],[horn_tip/2, (horn_diameter/2 - horn_tip/2)],[-horn_tip/2, (horn_diameter/2 - horn_tip/2)]]);
            }
    }
    cylinder(h = 100, d=7, center=true);
}
}

wheel_diameter = 60;
wheel_thickness = 5;
wheel_cut_diameter = 12;
module wheel() {
    difference() {
        translate([0, 0, 0]) cylinder(wheel_thickness,d=wheel_diameter, true);
        translate([0, 0, wheel_thickness - horn_thickness + fudge])servo_horn();
        for (i = [0 : 45 : 360-45])
             rotate([0, 0, i]) translate([wheel_diameter/2 - wheel_cut_diameter/2 - buffer_length, 0, -fudge])cylinder(wheel_thickness + 2*fudge,d=wheel_cut_diameter, true);
    }
}

post_diameter = 15;
cone_extenstion = 2;

triangle_width = 20;
triangle_height = 10;
triangle_offset = 5;
triangle_thickness = 100;
module round_triangle() {
    translate([-triangle_height-2*triangle_offset, 0, -triangle_thickness/2]) linear_extrude(triangle_thickness) offset(triangle_offset, chamfer) translate([0, -triangle_width/2, 0])polygon([[0, 0], [0, triangle_width], [triangle_height, triangle_width/2]]);
}

module robot() {
    difference() {
    union() {
        translate([base_length/2 - plate_length/2, base_width / 2 - plate_thickness/2, plate_height/2 + base_thickness/2 - fudge]) servo_mount_plate();
        translate([base_length/2 - plate_length/2, - (base_width / 2 - plate_thickness/2), plate_height/2 + base_thickness/2 - fudge]) servo_mount_plate();
        base();
    }
    translate([-base_length/2 + post_diameter /2 + cone_extenstion, 0, -(base_thickness/2 + fudge)]) cylinder(base_thickness + 2*fudge,d=post_diameter,true);
    round_triangle();
    rotate([0, 0, 180]) translate([0, 0, 0]) round_triangle();
    rotate([0, 0, 90]) union(){
        round_triangle();
        rotate([0, 0, 180]) translate([0, 0, 0]) round_triangle();
    }
    }
}

module drag() {
    translate([0, 0, post_diameter/2])
    union() {
        offset = plate_height/2 + base_thickness;
        needed = wheel_diameter / 2 - offset - post_diameter/2;
        cylinder(needed,d1=post_diameter,d2=post_diameter+2*cone_extenstion,true);
        translate([0, 0, needed]) cylinder(base_thickness + fudge,d=post_diameter - tol/2 ,true);
        sphere(d=post_diameter);
    }
}