diff --git a/config.scad b/config.scad new file mode 100644 index 0000000..151e4d5 --- /dev/null +++ b/config.scad @@ -0,0 +1,157 @@ + +use <./models/common/metric_bolt_functions.scad>; +use <./models/brake/brake_assembly_functions.scad>; +use <./models/fixings/tube_clamp_round_tee_long_104_functions.scad>; +use <./models/fixings/tube_clamp_round_3_way_through_116_functions.scad>; +use <./models/fixings/tube_clamp_round_base_plate_132_functions.scad>; +use <./models/fixings/tube_clamp_square_base_plate_132_functions.scad>; + +// Configuration +R_BED = [400, 1200, 18]; +T_WHEEL = 100; +D_WHEEL = 400; +D_WHEEL_BORE = 25; + +T_PLATE = 8; +T_CLAMP = 20; + +// D_AXIS = 25; +D_AXLE_FRONT = 42; +D_AXLE_REAR = 27; +Y_POS_AXLE_FRONT = R_BED[1] / 2 - D_WHEEL / 2; +Y_POS_AXLE_REAR = -R_BED[1] / 2 + D_WHEEL / 2; +X_POS_WHEEL_CENTRE = R_BED[0] / 2 + T_WHEEL / 2; + +SPACING_XY_BED_BORDER = 10; +Z_OVERLAP_TEE_CLAMP_ROUND = 80; +Z_OFFSET_WHEEL_TO_BED_BASE = 5; +Z_OFFSET_BED_TO_AXLE = D_WHEEL / 2 + Z_OFFSET_WHEEL_TO_BED_BASE; +M_TOTAL = 160; + +L_BOLT_EXTENSION = 10; +SIZE_BOLT = 25; // M25 +SIZE_BOLT_REAR_WHEEL_POSITIONING = 10; +T_WASHER_BOLT_REAR_WHEEL_POSITIONING = 1.5; +D_WASHER_BOLT_REAR_WHEEL_POSITIONING = 30; // get_metric_bolt_washer_diameter_safe_working_clearance(SIZE_BOLT_REAR_WHEEL_POSITIONING); +T_WASHER_AXLE_REAR_WHEEL_POSITIONING = 4; +D_WASHER_AXLE_REAR_WHEEL_POSITIONING = 50; +SPACING_WASHER_AXLE_REAR_WHEEL_POSITIONING = 1; + +R_FIXING_AXLE_LEG_REAR_TO_BED = get_R_plate_round_base_plate_132(D_AXLE_REAR); +L_SHAFT_AXLE_FIXING_AXLE_REAR_TO_LEG = get_L_shaft_long_round_tee_long_104(D_AXLE_REAR); +X_POS_AXLE_LEG_REAR = min(X_POS_WHEEL_CENTRE - T_WHEEL / 2 - SPACING_WASHER_AXLE_REAR_WHEEL_POSITIONING - T_WASHER_AXLE_REAR_WHEEL_POSITIONING - D_WASHER_BOLT_REAR_WHEEL_POSITIONING - L_SHAFT_AXLE_FIXING_AXLE_REAR_TO_LEG / 2, R_BED[0] / 2 - SPACING_XY_BED_BORDER - R_FIXING_AXLE_LEG_REAR_TO_BED[0] / 2); + +// BRAKE +// THICKNESS_SHELL_BRAKE_BEAM = 5; +// L_BEAM_BRAKE_BELT_TENSION_FIXING = 150; +D_BEAM_BRAKE = 40; +T_BEAM_BRAKE = 5; +D_BRAKE_BALLSCREW_AXLE = 16; // M16 pitch 1.5 +L_BRAKE_BALLSCREW_AXLE = 700; +D_BRAKE_BALLSCREW_POWER_WHEEL = 120; +T_BRAKE_BALLSCREW_POWER_WHEEL = get_metric_bolt_head_height(D_BRAKE_BALLSCREW_AXLE); +D_WASHER_BRAKE_BALLSCREW_POWER_WHEEL = 50; // get_metric_bolt_washer_diameter_safe_working_clearance(D_BRAKE_BALLSCREW_AXLE); +T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL = 3; +Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE = 125; // D_BRAKE_BALLSCREW_POWER_WHEEL / 2 + 25; +Y_OFFSET_BALLSCREW_LEG_REAR_FIXING_FROM_END = 100; +Y_OFFSET_BALLSCREW_LEG_FRONT_FIXING_FROM_END = Y_OFFSET_BALLSCREW_LEG_REAR_FIXING_FROM_END + 100; +// L_BEAM_FIXING_BALLSCREW_TO_BED = D_BRAKE_BALLSCREW_AXLE + D_WASHER_FIXING_BALLSCREW_TO_BED * 2; // beam lying along bed, not perpendicular to bed +R_BASE_PLATE_FIXING_LEG_BRAKE_BALLSCREW_TO_BED = get_R_plate_square_base_plate_132(D_BEAM_BRAKE); +L_LEG_FIXING_BRAKE_BALLSCREW_TO_BED = Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE - R_BASE_PLATE_FIXING_LEG_BRAKE_BALLSCREW_TO_BED[2] + D_BEAM_BRAKE / 2; +R_LEAD_FIXING_BRAKE_BALLSCREW_TO_BRAKE_ARMS = [100, 10, D_BEAM_BRAKE]; +X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE = D_BEAM_BRAKE; +ANGLE_BRAKE_ROD_MIN = 50; // angle between ballscrew axle and brake rod radius about pivot +ANGLE_BRAKE_ROD_MAX = 60; // atan((X_POS_AXLE_LEG_REAR - X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE) / Y_OFFSET_LEAD_FIXING_TO_AXLE_REAR_MIN); +SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 6; // M6 +L_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 20; // 20-25mm +D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 25; // get_metric_bolt_washer_diameter_safe_working_clearance(SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD); +T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 1.5; +R_BRAKE_PAD = [10, 75, 10]; +T_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 4.8; +W_FIXING_BRAKE_ARM_TO_BRAKE_PAD = 25.4; +R_BRAKE_ARM = [240, 75, 5]; // (X_POS_WHEEL_CENTRE - T_WHEEL / 2 - R_BRAKE_PAD[0] - T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD - X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE + tan(90 - ANGLE_BRAKE_ROD_MAX) * 75 / 2) / sin(ANGLE_BRAKE_ROD_MAX) // TOO SHORT? +L_FIXING_BRAKE_ARM_TO_BRAKE_PAD = D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD * 3; // R_BRAKE_PAD[1]; +L_BRAKE_ARM_TOTAL = R_BRAKE_ARM[0] + R_BRAKE_PAD[0] + L_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD; +// Y_OFFSET_LEAD_FIXING_TO_AXLE_REAR_MIN = 50; +X_OFFSET_FIXING_BRAKE_ARM_TO_BRAKE_PAD_FROM_END = R_BRAKE_ARM[1] / 2 * tan(ANGLE_BRAKE_ROD_MAX); +// X_OFFSET_HOLE_AXLE_FROM_BRAKE_ARM_END_INNER = (X_POS_AXLE_LEG_REAR - X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE) / tan(ANGLE_BRAKE_ROD_MAX); +DELTA_L_SPRING_BALLSCREW_MAX = get_y_pos_lead_fixing_ballscrew_to_brake_arms(ANGLE_BRAKE_ROD_MIN, Y_POS_AXLE_REAR, X_POS_AXLE_LEG_REAR, X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE) - get_y_pos_lead_fixing_ballscrew_to_brake_arms(ANGLE_BRAKE_ROD_MAX, Y_POS_AXLE_REAR, X_POS_AXLE_LEG_REAR, X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE); +SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG = 10; +D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG = 30; // get_metric_bolt_washer_diameter_safe_working_clearance(SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG); +T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG = 1.5; +D_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG = 50; +T_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG = 4; + +// ANGLE_INCLINE_TILLER = 20; // [-20:5:135] +ANGLE_INCLINE_TILLER_MAX = 101; +L_TILLER = R_BED[1] / 2 - Y_POS_AXLE_FRONT + D_AXLE_FRONT / 2 + Z_OFFSET_BED_TO_AXLE * tan(ANGLE_INCLINE_TILLER_MAX - 90); +// T_WASHER_UNIVERSAL_JOINT = 2; // Deprecated +L_TILLER_EXTENSION = 1000; +L_JOINT_TILLER_EXTENSION = 85; +SIZE_BOLT_JOINT_TILLER_EXTENSION = SIZE_BOLT_REAR_WHEEL_POSITIONING; // 6; +D_WASHER_TILLER_JOINT = D_WASHER_BOLT_REAR_WHEEL_POSITIONING; // 25; +T_WASHER_TILLER_JOINT = T_WASHER_BOLT_REAR_WHEEL_POSITIONING; // 3; +OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL = SIZE_BOLT_JOINT_TILLER_EXTENSION * 3 / 2; + +D_HANDLE_BAR = 27; +W_HANDLE_BAR = 300; + +SIZE_BOLT_FRONT_AXLE_BEARING = 20; +DEPTH_BOLT_FRONT_AXLE_BEARING = get_metric_bolt_head_height(SIZE_BOLT_FRONT_AXLE_BEARING); +T_JOINT_FRONT_AXLE_TO_TILLER = get_thickness_round_3_way_through_116(D_AXLE_FRONT); +T_WASHER_JOINT_FRONT_AXLE_TO_TILLER = 3; +D_WASHER_JOINT_FRONT_AXLE_TO_TILLER = 39; // get_metric_bolt_washer_diameter_safe_working_clearance(SIZE_BOLT_FRONT_AXLE_BEARING); +COUNT_WASHERS_JOINT_FRONT_AXLE_TO_TILLER = 3; +L_BOLT_FRONT_AXLE_BEARING = T_JOINT_FRONT_AXLE_TO_TILLER + 2 * DEPTH_BOLT_FRONT_AXLE_BEARING + D_AXLE_FRONT + COUNT_WASHERS_JOINT_FRONT_AXLE_TO_TILLER * T_WASHER_JOINT_FRONT_AXLE_TO_TILLER; + +T_WASHER_BASE_PLATE = T_WASHER_BOLT_REAR_WHEEL_POSITIONING; +D_WASHER_BASE_PLATE = D_WASHER_BOLT_REAR_WHEEL_POSITIONING; + +L_SHAFT_TOP_CRATE = 333; +D_SHAFT_TOP_CRATE = 16; +D_WASHER_SHAFT_TOP_CRATE = 50; // get_metric_bolt_washer_diameter_safe_working_clearance(D_SHAFT_TOP_CRATE); +T_WASHER_SHAFT_TOP_CRATE = 3; +COUNT_SHAFTS_TOP_CRATE_X = 2; +COUNT_SHAFTS_TOP_CRATE_Y = 3; +COUNT_WASHERS_SHAFT_TOP_CRATE_EACH_END = 3; + + +// Constants +SAFETY_FACTOR = 2; +PI = 3.1415926536; +G = 9.81; + +COLOUR_ROD_THREADED = "Gray"; +COLOUR_BEAM_ALUMINIUM = "DarkGray"; +COLOUR_FILAMENT_3D_PRINTER = "HotPink"; + + +// Engineering analysis +W_TOTAL_SAFE = M_TOTAL * G * SAFETY_FACTOR; + +SHEAR_STRESS_YIELD_STAINLESS_STEEL = 200 * 10 ^ 6; +SHEAR_STRESS_YIELD_ALUMINIUM = 200 * 10 ^ 6; + +/* +T_BOLT_MAX = PI * (D_AXLE_FRONT / 1000) ^ 3 / 16 * SHEAR_STRESS_YIELD_ALUMINIUM; + +T_BOLT_ACTUAL = W_TOTAL_SAFE * (3 * T_BEAM / 1000); +*/ + +T_FRONT_WHEEL_AXIS_CENTRE_Y = W_TOTAL_SAFE * (R_BED[1] / 2 + T_WHEEL / 2) / 1000; +T_FRONT_WHEEL_AXIS_X = W_TOTAL_SAFE * (D_WHEEL / 2) / 1000; + +F_FRONT_WHEEL_AXIS_INTERSECTION_Z_MAX = SHEAR_STRESS_YIELD_ALUMINIUM * PI * (SIZE_BOLT / 1000) ^ 3 / 32 / ((R_BED[0] + T_WHEEL) / 1000); + +T_REAR_WHEEL_AXIS_Y_MAX = PI * (D_AXLE_REAR / 1000) ^ 3 / 16 * SHEAR_STRESS_YIELD_ALUMINIUM; +// T_REAR_WHEEL_AXIS_Y_ACTUAL = W_TOTAL_SAFE * (T_WHEEL / 2 + SPACING_XY_BED_BORDER + R_FIXING_ROUND[0] / 2) / 1000; + +/* output +// echo("L_TILLER: ", L_TILLER, "mm"); +echo("load safe max: ", W_TOTAL_SAFE, "N"); +echo("T_front_wheel_axis_centre_y: ", T_FRONT_WHEEL_AXIS_CENTRE_Y, "Nm"); +echo("T_front_wheel_axis_x: ", T_FRONT_WHEEL_AXIS_X, "Nm - fully dispersed by wheel"); +echo("F_front_wheel_axis_intersection_z_max: ", F_FRONT_WHEEL_AXIS_INTERSECTION_Z_MAX, "N"); +echo("T_rear_wheel_axis_y_max: ", T_REAR_WHEEL_AXIS_Y_MAX, "Nm"); +echo("T_rear_wheel_axis_y_actual: ", T_REAR_WHEEL_AXIS_Y_ACTUAL, "Nm"); +*/ \ No newline at end of file diff --git a/docs/.~lock.UBOM.ods# b/docs/.~lock.UBOM.ods# new file mode 100644 index 0000000..6c2e65a --- /dev/null +++ b/docs/.~lock.UBOM.ods# @@ -0,0 +1 @@ +,teddy,lord-T-1024,20.02.2025 13:01,file:///home/teddy/.config/libreoffice/4; \ No newline at end of file diff --git a/docs/UBOM.ods b/docs/UBOM.ods new file mode 100644 index 0000000..6c52c27 Binary files /dev/null and b/docs/UBOM.ods differ diff --git a/main.json b/main.json new file mode 100644 index 0000000..b2b4dd1 --- /dev/null +++ b/main.json @@ -0,0 +1,7 @@ +{ + "parameterSets": { + "ANGLE": "" + }, + "parameterSets": "", + "fileFormatVersion": "1" +} diff --git a/main.scad b/main.scad new file mode 100644 index 0000000..933823d --- /dev/null +++ b/main.scad @@ -0,0 +1,22 @@ +// Molly Dog Towing Cart +echo("Shopping"); + +include <./config.scad>; +use <./models/dog_cart/dog_cart.scad>; + +// Customisable parameters +angle_incline_tiller = 20; // [-20:5:135] +angle_brake_rod = 60; // [45:5:60] + +$fn = 100; + +// output +dog_cart(angle_incline_tiller, angle_brake_rod); + +/* +Shopping +Components + +Tools +M10 tap (HSS) - size change, check spreadsheet +*/ \ No newline at end of file diff --git a/models/bed/bed.scad b/models/bed/bed.scad new file mode 100644 index 0000000..67a8f34 --- /dev/null +++ b/models/bed/bed.scad @@ -0,0 +1,41 @@ +include <../../config.scad>; +use <../fixings/tube_clamp_round_base_plate_132.scad>; + +module bed() { + offset_hole_y_front = get_offset_hole_y_round_base_plate_132(D_AXLE_FRONT); + d_hole_front = get_diameter_hole_round_base_plate_132(D_AXLE_FRONT); + offset_hole_y_rear = get_offset_hole_y_round_base_plate_132(D_AXLE_REAR); + d_hole_rear = get_diameter_hole_round_base_plate_132(D_AXLE_REAR); + count_shafts_y = 3; + color("burlywood") difference() { + cube(R_BED, center = true); + // front axle leg holes + translate([0, Y_POS_AXLE_FRONT, 0]) for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + translate([0, offset_hole_y_front, 0]) cylinder(R_BED[2], d_hole_front / 2, d_hole_front / 2, center = true); + } + } + // rear axle leg holes + translate([0, Y_POS_AXLE_REAR, 0]) for (index_side_x = [0 : 1 : 1]) { + mirror([index_side_x, 0, 0]) { + translate([X_POS_AXLE_LEG_REAR, 0, 0]) for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + translate([0, offset_hole_y_rear, 0]) cylinder(R_BED[2], d_hole_rear / 2, d_hole_rear / 2, center = true); + } + } + } + } + // top crate perimeter shaft holes + for (index_side_x = [0 : 1 : 1]) { + mirror([index_side_x, 0, 0]) { + translate([R_BED[0] / 2 - D_WASHER_SHAFT_TOP_CRATE / 2, 0, 0]) for (index_shaft_y = [0 : 1 : count_shafts_y]) { + translate([0, -R_BED[1] / 2 + D_WASHER_SHAFT_TOP_CRATE / 2 + index_shaft_y * (R_BED[1] - D_WASHER_SHAFT_TOP_CRATE) / (count_shafts_y - 1), 0]) cylinder(R_BED[2], D_SHAFT_TOP_CRATE / 2, D_SHAFT_TOP_CRATE / 2, center = true); + } + } + } + } + // Shopping + echo(str("Bed: MDF board ", R_BED[1], "mm x ", R_BED[0], "mm x ", R_BED[2], "mm - x1")); +} + +bed(); \ No newline at end of file diff --git a/models/brake/beam_leg_ballscrew_to_bed.scad b/models/brake/beam_leg_ballscrew_to_bed.scad new file mode 100644 index 0000000..329a5df --- /dev/null +++ b/models/brake/beam_leg_ballscrew_to_bed.scad @@ -0,0 +1,10 @@ +include <../../config.scad>; +use <../common/beam_hollow_square.scad>; + +module beam_leg_ballscrew_to_bed() { + color(COLOUR_BEAM_ALUMINIUM) beam_hollow_square(L_LEG_FIXING_BRAKE_BALLSCREW_TO_BED, D_BEAM_BRAKE, T_BEAM_BRAKE); + // Shopping + // Beam leg ballscrew to bed +} + +beam_leg_ballscrew_to_bed(); \ No newline at end of file diff --git a/models/brake/brake_arm.scad b/models/brake/brake_arm.scad new file mode 100644 index 0000000..1868d25 --- /dev/null +++ b/models/brake/brake_arm.scad @@ -0,0 +1,16 @@ +include <../../config.scad>; + + +module brake_arm() { + L_big = 2 * max(R_BRAKE_ARM); + color(COLOUR_BEAM_ALUMINIUM) difference() { + // body + cube(R_BRAKE_ARM, center = true); + // chamfer across end face for wheel overlap + translate([R_BRAKE_ARM[0] / 2 - R_BRAKE_ARM[1] / 2 * tan(ANGLE_BRAKE_ROD_MAX), 0, 0]) rotate([0, 0, 90 - ANGLE_BRAKE_ROD_MAX]) translate([0, -L_big / 2, -L_big / 2]) cube(L_big, center = false); + } + // Shopping + echo(str("Brake arm: Aluminium sheet ", R_BRAKE_ARM[1], "mm x ", R_BRAKE_ARM[0], "mm x ", R_BRAKE_ARM[2], "mm - x1")); +} + +brake_arm(); diff --git a/models/brake/brake_assembly.scad b/models/brake/brake_assembly.scad new file mode 100644 index 0000000..7d1d16a --- /dev/null +++ b/models/brake/brake_assembly.scad @@ -0,0 +1,76 @@ +include <../../config.scad>; +use <../common/metric_bolt.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/washer.scad>; +use <../fixings/tube_clamp_square_base_plate_132.scad>; +use <../fixings/tube_clamp_square_base_plate_132_functions.scad>; +use <./brake_assembly_functions.scad>; +use <./fixing_ballscrew_to_bed.scad>; +use <./power_wheel_assembly.scad>; +use <./fixing_brake_ballscrew_to_brake_arms.scad>; +use <./brake_arm.scad>; +use <./fixing_brake_arm_to_brake_pad.scad>; +use <./brake_pad.scad>; +use <./fixing_brake_arm_to_rear_axle_leg.scad>; +use <./brake_spring_load_assembly.scad>; + + + +module brake_assembly(angle_brake_rod) { + echo("Brake assembly:"); + // Y_POS_LEAD_FIXING_BALLSCREW_TO_BRAKE_ARMS + y_pos_lead_fixing_ballscrew_to_brake_arms = get_y_pos_lead_fixing_ballscrew_to_brake_arms(angle_brake_rod, Y_POS_AXLE_REAR, X_POS_AXLE_LEG_REAR, X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE); + y_pos_ballscrew_end_front = -R_BED[1] / 2 + L_BRAKE_BALLSCREW_AXLE; + union() { + // ballscrew axle + color(COLOUR_ROD_THREADED) translate([0, y_pos_ballscrew_end_front, -Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE]) rotate([90, 0, 0]) cylinder(L_BRAKE_BALLSCREW_AXLE, D_BRAKE_BALLSCREW_AXLE / 2, D_BRAKE_BALLSCREW_AXLE / 2, center = false); + // fixing ballscrew to bed front + translate([0, y_pos_ballscrew_end_front - Y_OFFSET_BALLSCREW_LEG_FRONT_FIXING_FROM_END, 0]) fixing_ballscrew_to_bed(); + // fixing ballscrew to bed rear + translate([0, -R_BED[1] / 2 + Y_OFFSET_BALLSCREW_LEG_REAR_FIXING_FROM_END, 0]) fixing_ballscrew_to_bed(); + // ballscrew power wheel + translate([0, -R_BED[1] / 2 + Y_OFFSET_BALLSCREW_LEG_REAR_FIXING_FROM_END - D_BEAM_BRAKE / 2 - T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL - T_BRAKE_BALLSCREW_POWER_WHEEL / 2, -Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE]) power_wheel_assembly(); + // ballscrew power wheel washer + translate([0, -R_BED[1] / 2 + Y_OFFSET_BALLSCREW_LEG_REAR_FIXING_FROM_END - D_BEAM_BRAKE / 2 - T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL / 2, -Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE]) rotate([90, 0, 0]) washer(T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_AXLE); + // fixing ballscrew to brake rod + translate([0, y_pos_lead_fixing_ballscrew_to_brake_arms, -Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE]) { + fixing_brake_ballscrew_to_brake_arms(); + + for (index_side_x = [0:1:1]) { + mirror([index_side_x, 0, 0]) { + translate([X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE, 0, 0]) rotate([0, 0, -(90 - angle_brake_rod)]) { + // brake arm + translate([R_BRAKE_ARM[0] / 2, 0, 0]) brake_arm(); + // fixing brake arm to brake pad + translate([R_BRAKE_ARM[0] - X_OFFSET_FIXING_BRAKE_ARM_TO_BRAKE_PAD_FROM_END, 0, R_BRAKE_ARM[2] / 2]) rotate([0, 0, 90 - ANGLE_BRAKE_ROD_MAX]) fixing_brake_arm_to_brake_pad(); + // brake pad + translate([R_BRAKE_ARM[0] - X_OFFSET_FIXING_BRAKE_ARM_TO_BRAKE_PAD_FROM_END, 0, R_BRAKE_ARM[2] / 2 + T_FIXING_BRAKE_ARM_TO_BRAKE_PAD + (W_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_FIXING_BRAKE_ARM_TO_BRAKE_PAD) / 2]) rotate([0, 0, 90 - ANGLE_BRAKE_ROD_MAX]) translate([T_FIXING_BRAKE_ARM_TO_BRAKE_PAD, 0, 0]) brake_pad(); + } + // fixing brake arm to rear axle leg + translate([X_POS_AXLE_LEG_REAR, -y_pos_lead_fixing_ballscrew_to_brake_arms + Y_POS_AXLE_REAR, 0]) fixing_brake_arm_to_rear_axle_leg(); + } + } + } + // Spring-loading assembly + translate([0, y_pos_ballscrew_end_front - Y_OFFSET_BALLSCREW_LEG_FRONT_FIXING_FROM_END + D_BEAM_BRAKE / 2, -Z_OFFSET_BALLSCREW_AXLE_TO_BED_BASE]) brake_spring_load_assembly(); + } + + // Shopping + echo(str("Ballscrew axle: Threaded Steel rod M", D_BRAKE_BALLSCREW_AXLE, " x ", L_BRAKE_BALLSCREW_AXLE, " - x1")); + // Fixing ballscrew to bed front + // Fixing ballscrew to bed rear + // Ballscrew power wheel + // Ballscrew power wheel washer + // Fixing ballscrew to brake arms + // Brake arms + // Fixings brake arm to brake pad + // Brake pads + // fixing brake arm to rear axle leg + // Spring-load assembly +} + + +angle_brake_rod = ANGLE_BRAKE_ROD_MAX; + +brake_assembly(angle_brake_rod); + diff --git a/models/brake/brake_assembly_functions.scad b/models/brake/brake_assembly_functions.scad new file mode 100644 index 0000000..d319680 --- /dev/null +++ b/models/brake/brake_assembly_functions.scad @@ -0,0 +1,3 @@ +// include <../../config.scad>; // circular reference! + +function get_y_pos_lead_fixing_ballscrew_to_brake_arms(angle_brake_rod, y_pos_axle_rear, x_pos_axle_leg_rear, x_offset_fixing_brake_arm_to_lead_plate) = y_pos_axle_rear + (x_pos_axle_leg_rear - x_offset_fixing_brake_arm_to_lead_plate) / tan(angle_brake_rod); // (X_POS_AXLE_LEG_REAR - X_OFFSET_FIXING_BRAKE_ARM_TO_LEAD_PLATE) \ No newline at end of file diff --git a/models/brake/brake_pad.scad b/models/brake/brake_pad.scad new file mode 100644 index 0000000..a8b9608 --- /dev/null +++ b/models/brake/brake_pad.scad @@ -0,0 +1,13 @@ +include <../../config.scad>; + + +module brake_pad() { + union() { + color("black") cube(R_BRAKE_PAD, center = true); + color("gray") translate([-R_BRAKE_PAD[0] / 2 - L_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, center = true); + } + // Shopping + echo(str("Brake pad: Bike V-brake pad - x1")); +} + +brake_pad(); \ No newline at end of file diff --git a/models/brake/brake_spring_load_assembly.scad b/models/brake/brake_spring_load_assembly.scad new file mode 100644 index 0000000..e76a831 --- /dev/null +++ b/models/brake/brake_spring_load_assembly.scad @@ -0,0 +1,43 @@ +include <../../config.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/metric_nut.scad>; +use <../common/compression_spring.scad>; +use <../common/washer.scad>; + + +module brake_spring_load_assembly() { + echo("Brake spring-load assembly:"); + /* design variables + echo(str("DELTA_L_SPRING_BALLSCREW_MAX: ", DELTA_L_SPRING_BALLSCREW_MAX, "mm")); = 19 + */ + L_spring_free = 110; + d_spring_outer = 21.6; + d_spring_wire = 1.6; + pitch = L_spring_free / 8; + + h_nut = get_metric_bolt_head_height(D_BRAKE_BALLSCREW_AXLE); + d_nut = get_metric_bolt_head_diameter(D_BRAKE_BALLSCREW_AXLE); + + union() { + // washer rear + rotate([-90, 0, 0]) washer(T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_AXLE, false); + // spring + translate([0, T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL + L_spring_free / 2, 0]) rotate([-90, 0, 0]) compression_spring(L_spring_free, d_spring_outer, d_spring_outer - d_spring_wire * 2, pitch); + // washer front + translate([0, T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL + L_spring_free, 0]) rotate([-90, 0, 0]) washer(T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_AXLE, false); + // nut(s) + color("gray") for (index_nut = [0 : 1 : 1]) { + translate([0, T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL * 2 + L_spring_free + index_nut * h_nut, 0]) rotate([-90, 0, 0]) rotate([0, 0, index_nut * 30]) metric_nut(D_BRAKE_BALLSCREW_AXLE, centre = false); // cylinder(h_nut, d_nut / 2, d_nut / 2, center = false); + } + } + // Shopping + // spring + // https://uk.rs-online.com/web/p/compression-springs/0121242 + // washers + // nuts +} + +// $fn = 20; +brake_spring_load_assembly(); + + diff --git a/models/brake/fixing_ballscrew_to_bed.scad b/models/brake/fixing_ballscrew_to_bed.scad new file mode 100644 index 0000000..04d8317 --- /dev/null +++ b/models/brake/fixing_ballscrew_to_bed.scad @@ -0,0 +1,42 @@ +include <../../config.scad>; +use <../common/metric_bolt.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/washer.scad>; +use <../fixings/tube_clamp_square_base_plate_132.scad>; +use <../fixings/tube_clamp_square_base_plate_132_functions.scad>; +use <./beam_leg_ballscrew_to_bed.scad>; + + +module fixing_ballscrew_to_bed() { + echo("Fixing ballscrew to bed: "); + y_offset_hole_bed_fastener = get_offset_hole_x_square_base_plate_132(D_BEAM_BRAKE); + d_hole_fastener = get_diameter_hole_square_base_plate_132(); + h_head_fastener = get_metric_bolt_head_height(d_hole_fastener); + L_fastener = R_BED[2] + 2 * (T_WASHER_BASE_PLATE + h_head_fastener) + R_BASE_PLATE_FIXING_LEG_BRAKE_BALLSCREW_TO_BED[2] + L_BOLT_EXTENSION; + // d_washer_outer = get_metric_bolt_washer_diameter_safe_working_clearance(d_hole_fastener); + union() { + // fixing tube clamp + rotate([0, 180, 90]) tube_clamp_square_base_plate_132(D_BEAM_BRAKE); + + for (index_side_y = [0:1:1]) { + mirror([0, index_side_y, 0]) translate([0, y_offset_hole_bed_fastener, 0]) { + // fastener bolt + translate([0, 0, -L_fastener / 2 + R_BED[2] + T_WASHER_BASE_PLATE + h_head_fastener]) metric_bolt(d_hole_fastener, L_fastener, true, L_BOLT_EXTENSION); + // fastener washers + // bed side + translate([0, 0, R_BED[2] + T_WASHER_BASE_PLATE / 2]) washer(T_WASHER_BASE_PLATE, D_WASHER_BASE_PLATE, d_hole_fastener); + // axle side + translate([0, 0, -R_BASE_PLATE_FIXING_LEG_BRAKE_BALLSCREW_TO_BED[2] - T_WASHER_BASE_PLATE / 2]) washer(T_WASHER_BASE_PLATE, D_WASHER_BASE_PLATE, d_hole_fastener); + } + } + // leg + translate([0, 0, -R_BASE_PLATE_FIXING_LEG_BRAKE_BALLSCREW_TO_BED[2] - L_LEG_FIXING_BRAKE_BALLSCREW_TO_BED / 2]) beam_leg_ballscrew_to_bed(); + } + // Shopping + // Fixing leg to bed + // Fixing fasteners + // Fixing fastener washers + // Leg +} + +fixing_ballscrew_to_bed(); diff --git a/models/brake/fixing_brake_arm_to_brake_pad.scad b/models/brake/fixing_brake_arm_to_brake_pad.scad new file mode 100644 index 0000000..3421cba --- /dev/null +++ b/models/brake/fixing_brake_arm_to_brake_pad.scad @@ -0,0 +1,50 @@ +include <../../config.scad>; +use <../common/angle_beam.scad>; +use <../common/metric_bolt.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/washer.scad>; + + +module fixing_brake_arm_to_brake_pad() { + echo("Fixing brake arm to brake pad:"); + h_head_fastener = get_metric_bolt_head_height(SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD); + L_fastener = 2 * (h_head_fastener + T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD) + R_BRAKE_ARM[2] + T_FIXING_BRAKE_ARM_TO_BRAKE_PAD + L_BOLT_EXTENSION; + union() { + // fixing + color(COLOUR_BEAM_ALUMINIUM) difference() { + // body + rotate([90, 0, 180]) translate([0, 0, -L_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2]) angle_beam(L_FIXING_BRAKE_ARM_TO_BRAKE_PAD, W_FIXING_BRAKE_ARM_TO_BRAKE_PAD, T_FIXING_BRAKE_ARM_TO_BRAKE_PAD, false); + // brake pad fastener hole + translate([0, 0, T_FIXING_BRAKE_ARM_TO_BRAKE_PAD + (W_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_FIXING_BRAKE_ARM_TO_BRAKE_PAD) / 2]) rotate([0, 90, 0]) cylinder(W_FIXING_BRAKE_ARM_TO_BRAKE_PAD * 2, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, center = true); + // brake arm fastener holes + for (index_side_y = [0:1:1]) { + mirror([0, index_side_y, 0]) { + translate([-T_FIXING_BRAKE_ARM_TO_BRAKE_PAD - (W_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_FIXING_BRAKE_ARM_TO_BRAKE_PAD) / 2, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, 0]) cylinder(W_FIXING_BRAKE_ARM_TO_BRAKE_PAD * 2, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, center = true); + } + } + } + // fasteners to brake arm + for (index_side_y = [0:1:1]) { + mirror([0, index_side_y, 0]) { + translate([-T_FIXING_BRAKE_ARM_TO_BRAKE_PAD - (W_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_FIXING_BRAKE_ARM_TO_BRAKE_PAD) / 2, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, 0]) { + // bolt + translate([0, 0, -L_fastener / 2 + T_FIXING_BRAKE_ARM_TO_BRAKE_PAD + T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD + h_head_fastener]) metric_bolt(SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, L_fastener, true, L_BOLT_EXTENSION); + // washers + // upper + translate([0, 0, T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2 + T_FIXING_BRAKE_ARM_TO_BRAKE_PAD]) washer(T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD); + // lower + translate([0, 0, -T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2 - R_BRAKE_ARM[2]]) washer(T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD); + } + } + } + // fastener to brake pad + // washer + translate([-T_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD / 2, 0, T_FIXING_BRAKE_ARM_TO_BRAKE_PAD + (W_FIXING_BRAKE_ARM_TO_BRAKE_PAD - T_FIXING_BRAKE_ARM_TO_BRAKE_PAD) / 2]) rotate([0, 90, 0]) washer(T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD, SIZE_BOLT_FIXING_BRAKE_ARM_TO_BRAKE_PAD); + } + // Shopping + // Angle beam + // Fasteners + // Washers +} + +fixing_brake_arm_to_brake_pad(); \ No newline at end of file diff --git a/models/brake/fixing_brake_arm_to_rear_axle_leg.scad b/models/brake/fixing_brake_arm_to_rear_axle_leg.scad new file mode 100644 index 0000000..365541a --- /dev/null +++ b/models/brake/fixing_brake_arm_to_rear_axle_leg.scad @@ -0,0 +1,35 @@ +include <../../config.scad>; +use <../common/metric_bolt.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/washer.scad>; + + +module fixing_brake_arm_to_rear_axle_leg() { + echo("Fixing brake arm to rear axle leg:"); + count_washers_each_end = 3; + h_nut = get_metric_bolt_head_height(SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG); + L_bolt = D_AXLE_REAR + 2 * (T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG * count_washers_each_end + h_nut) + L_BOLT_EXTENSION; + rotate([0, 0, ANGLE_BRAKE_ROD_MAX]) for (index_side_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_z]) translate([0, 0, R_BRAKE_ARM[2] / 2]) { + // axle washer + translate([0, 0, 0]) washer(T_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, D_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, D_AXLE_REAR, centre = false); + // bolt + translate([0, -L_bolt / 2 + D_AXLE_REAR / 2 + T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG + h_nut, T_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG + D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG / 2]) rotate([-90, 0, 0]) metric_bolt(SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, L_bolt, true, L_BOLT_EXTENSION); + // bolt washer + for (index_washer = [0 : 1 : count_washers_each_end]) { + // front + translate([0, D_AXLE_REAR / 2 + index_washer * T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, T_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG + D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG / 2]) rotate([-90, 0, 0]) washer(T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, centre = false); + // rear + translate([0, -D_AXLE_REAR / 2 - index_washer * T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, T_WASHER_AXLE_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG + D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG / 2]) rotate([90, 0, 0]) washer(T_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, D_WASHER_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, SIZE_BOLT_FIXING_BRAKE_ARM_TO_REAR_AXLE_LEG, centre = false); + } + } + } + // Shopping + // Axle washers + // Bolts + // Bolt washers front + // Bolt washers rear +} + +fixing_brake_arm_to_rear_axle_leg(); + diff --git a/models/brake/fixing_brake_ballscrew_to_brake_arms.scad b/models/brake/fixing_brake_ballscrew_to_brake_arms.scad new file mode 100644 index 0000000..66434ce --- /dev/null +++ b/models/brake/fixing_brake_ballscrew_to_brake_arms.scad @@ -0,0 +1,29 @@ +include <../../config.scad>; +use <../common/metric_nut.scad>; +use <../common/washer.scad>; + +module fixing_brake_ballscrew_to_brake_arms() { + h_nut = get_metric_bolt_head_height(D_BRAKE_BALLSCREW_AXLE); + count_nuts_each_side = 2; + union() { + // ballscrew positioning plate + color(COLOUR_FILAMENT_3D_PRINTER) cube(R_LEAD_FIXING_BRAKE_BALLSCREW_TO_BRAKE_ARMS, center = true); + + for (index_side_y = [0:1:1]) { + mirror([0, index_side_y, 0]) { + // washers + translate([0, R_LEAD_FIXING_BRAKE_BALLSCREW_TO_BRAKE_ARMS[1] / 2 + T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL / 2, 0]) rotate([-90, 0, 0]) washer(T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_WASHER_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_AXLE); + // nuts + for (index_nut = [0 : 1 : count_nuts_each_side - 1]) { + translate([0, R_LEAD_FIXING_BRAKE_BALLSCREW_TO_BRAKE_ARMS[1] / 2 + T_WASHER_BRAKE_BALLSCREW_POWER_WHEEL + h_nut * index_nut, 0]) rotate([-90, 0, 0]) rotate([0, 0, 30 * index_nut]) metric_nut(D_BRAKE_BALLSCREW_AXLE, centre = false); + } + } + } + } + // Shopping + echo("Fixing brake ballscrew to brake arms: 3D printed component - x1"); + // Axle fastener washers + // Axle fastener nuts +} + +fixing_brake_ballscrew_to_brake_arms(); \ No newline at end of file diff --git a/models/brake/power_wheel_assembly.scad b/models/brake/power_wheel_assembly.scad new file mode 100644 index 0000000..99cecb4 --- /dev/null +++ b/models/brake/power_wheel_assembly.scad @@ -0,0 +1,39 @@ +include <../../config.scad>; +use <../common/beam_hexagonal.scad> +use <../common/metric_nut.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/washer.scad> + + +module power_wheel_assembly() { + echo("Power wheel assembly:"); + d_nut = get_metric_bolt_head_diameter(D_BRAKE_BALLSCREW_AXLE); + h_nut = get_metric_bolt_head_height(D_BRAKE_BALLSCREW_AXLE); + union() { + // power wheel + rotate([90, 0, 0]) { + color(COLOUR_FILAMENT_3D_PRINTER) difference() { + // body + cylinder(T_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_POWER_WHEEL / 2, D_BRAKE_BALLSCREW_POWER_WHEEL / 2, center = true); + // nut slot + beam_hexagonal(h_nut, d_nut, centre = true, suppress_shopping_outputs = true); // cylinder(T_BRAKE_BALLSCREW_POWER_WHEEL, d_nut / 2, d_nut / 2, center = true); + } + // ballscrew bearing (nut) + /* + color("gray") difference() { + // body + cylinder(T_BRAKE_BALLSCREW_POWER_WHEEL, d_nut / 2, d_nut / 2, center = true); + // hole + cylinder(T_BRAKE_BALLSCREW_POWER_WHEEL, D_BRAKE_BALLSCREW_AXLE / 2, D_BRAKE_BALLSCREW_AXLE / 2, center = true); + } + */ + metric_nut(D_BRAKE_BALLSCREW_AXLE); + } + } + // Shopping + echo("Power wheel: 3D printed component - x1"); + // Power wheel bearing (nut) +} + +power_wheel_assembly(); + diff --git a/models/common/angle_beam.scad b/models/common/angle_beam.scad new file mode 100644 index 0000000..82bd2dc --- /dev/null +++ b/models/common/angle_beam.scad @@ -0,0 +1,13 @@ + +module angle_beam(L, w, t, centre = true) { + R_offset_centre = [-w / 2, -w / 2, -L / 2]; + translate(centre ? R_offset_centre : [0, 0, 0]) union() { + cube([w, t, L], center = false); + cube([t, w, L], center = false); + } + // Shopping + echo(str("Rectangular Aluminium angle beam: Rectangular Aluminium angle beam ", L, "mm x ", w, "mm x ", t, "mm - x1")); + // https://www.metals4u.co.uk/materials/aluminium/aluminium-angle/aa25-4x25-4x4-8-p +} + +angle_beam(500, 50, 5); \ No newline at end of file diff --git a/models/common/ball_socket_joint.scad b/models/common/ball_socket_joint.scad new file mode 100644 index 0000000..5c4d02c --- /dev/null +++ b/models/common/ball_socket_joint.scad @@ -0,0 +1,51 @@ +include <../../config.scad>; + +/* +function get_universal_joint_length() = 40; +function get_universal_joint_d_bore_hole() = 6; +function get_universal_joint_d_hole() = 4; +function get_universal_joint_d() = 11; +function get_universal_joint_thickness() = (get_universal_joint_d() - get_universal_joint_d_bore_hole()) / 2; +function get_universal_joint_joint_axial_offset() = get_universal_joint_thickness() * 2; +function get_universal_joint_pin_axial_offset() = get_universal_joint_thickness() + get_universal_joint_d_hole() / 2; + +module ball_socket_joint() { + L = get_universal_joint_length(); + t = get_universal_joint_thickness(); + joint_axial_offset = get_universal_joint_joint_axial_offset(); + translate([L / 2, 0, 0]) mirror([1, 0, 0]) universal_joint_half(); + translate([L / 2 - joint_axial_offset, 0, 0]) rotate([90, -ANGLE_INCLINE_TILLER, 0]) translate([-joint_axial_offset, 0, 0]) universal_joint_half(); +} + +module universal_joint_half() { + d_hole_bore = get_universal_joint_d_bore_hole(); + d_hole = get_universal_joint_d_hole(); + d = get_universal_joint_d(); + L = get_universal_joint_length(); + t = get_universal_joint_thickness(); + joint_axial_offset = get_universal_joint_joint_axial_offset(); + pin_axial_offset = get_universal_joint_pin_axial_offset(); + color("orange") union() { + difference() { + // body + rotate([0, 90, 0]) cylinder(L / 2, d / 2, d / 2, center = false); + // threaded hole + translate([L - pin_axial_offset, 0, 0]) cylinder(d, d_hole / 2, d_hole / 2, center = true); + // bore hole + rotate([0, 90, 0]) cylinder(L / 2, d_hole / 2, d_hole / 2, center = false); + // joint slot + translate([L / 8, 0, 0]) cube([L / 4, d - t * 2, d], center = true); + } + // joint + translate([joint_axial_offset, 0, 0]) rotate([90, 0, 0]) cylinder(d, t, t, center = true); + } +} + +// output +translate([100, 0, 0]) universal_joint_half(); +universal_joint(); + +*/ + +// shopping +// https://www.amazon.co.uk/HiPicco-Universal-M5-Automotive-Cupboard/dp/B0BK28WXY8/ref=sr_1_21?crid=6A6OMRNKNXFR&dib=eyJ2IjoiMSJ9.e8gSWrg3UPxR5gMbATNC91I6qERE0rN5FCcOtnZJmGbFIHW9Rz6Rtq02WZj_C2CYgbwA8KHdd1W1xyOxZrH60UtwiGKd9MkmAbd09h9ACi4yGnbOLjhWb-Iboe0IZ_tvxh3XFdo4ygZ-iV98DODCXzl1WdVpTyUg3N4bok5qGtTP2CWfzPOmUFwyTe7_snV4fb7jlTGHK_ks3tR4FSDiUtCwEnuzxJUqdZSRNp4EhGo.2_e9Kal7A7FfEcIzWVEzQXH2zOWiECkGj9UqjIb_8XQ&dib_tag=se&keywords=metric%2Bball%2BJOINT&qid=1739814661&sprefix=metric%2Bball%2Bjoint%2Caps%2C99&sr=8-21&th=1 \ No newline at end of file diff --git a/models/common/beam_hexagonal.scad b/models/common/beam_hexagonal.scad new file mode 100644 index 0000000..aaecfab --- /dev/null +++ b/models/common/beam_hexagonal.scad @@ -0,0 +1,13 @@ +// include <../../config.scad>; + +module beam_hexagonal(L, d, centre = true, suppress_shopping_outputs = false) { + radius = d / 2; + linear_extrude(L, center = centre) polygon([[radius, 0], [radius * cos(60), radius * sin(60)], [radius * cos(120), radius * sin(120)], [radius * cos(180), radius * sin(180)], [radius * cos(240), radius * sin(240)], [radius * cos(300), radius * sin(300)]]); + // Shopping + if (!suppress_shopping_outputs) { + echo(str("Hexagonal beam: Hexagonal beam Φ", d, "mm x ", L, "mm - x1")); + } +} + +// $fn = 200; +beam_hexagonal(500, 50); \ No newline at end of file diff --git a/models/common/beam_hollow_rectangular.scad b/models/common/beam_hollow_rectangular.scad new file mode 100644 index 0000000..cce4264 --- /dev/null +++ b/models/common/beam_hollow_rectangular.scad @@ -0,0 +1,13 @@ + +module beam_hollow_rectangular(L, w, d, t, suppress_shopping_outputs = false) { + difference() { + cube([w, d, L], center = true); + cube([w - t * 2, d - t * 2, L], center = true); + } + // Shopping + if (!suppress_shopping_outputs) { + echo(str("Rectangular Aluminium hollow beam: Rectangular Aluminium hollow beam ", L, "mm x ", w, "mm x ", d, "mm x ", t, "mm - x1")); + } +} + +beam_hollow_rectangular(500, 50, 30, 5); \ No newline at end of file diff --git a/models/common/beam_hollow_square.scad b/models/common/beam_hollow_square.scad new file mode 100644 index 0000000..dcd84e8 --- /dev/null +++ b/models/common/beam_hollow_square.scad @@ -0,0 +1,10 @@ +include <../../config.scad>; +use <./beam_hollow_rectangular.scad>; + +module beam_hollow_square(L, D, T) { + color(COLOUR_BEAM_ALUMINIUM) beam_hollow_rectangular(L, D, D, T, suppress_shopping_outputs = true); + // Shopping + echo(str("Square Aluminium hollow beam: Square Aluminium hollow beam ", L, "mm x ", D, "mm x ", D, "mm x ", T, "mm - x1")); +} + +beam_hollow_square(L, D, T); \ No newline at end of file diff --git a/models/common/compression_spring.json b/models/common/compression_spring.json new file mode 100644 index 0000000..b2b4dd1 --- /dev/null +++ b/models/common/compression_spring.json @@ -0,0 +1,7 @@ +{ + "parameterSets": { + "ANGLE": "" + }, + "parameterSets": "", + "fileFormatVersion": "1" +} diff --git a/models/common/compression_spring.scad b/models/common/compression_spring.scad new file mode 100644 index 0000000..a45999b --- /dev/null +++ b/models/common/compression_spring.scad @@ -0,0 +1,23 @@ +// include <../../config.scad>; + +module compression_spring(L_free, d_outer, d_inner, pitch) { + r_wire = (d_outer - d_inner) / 2; + r_mean = (d_outer + d_inner) / 4; + angle_rotation = 360 * L_free / pitch; + color("DimGray") union() { + difference() { + // spiral + linear_extrude(height = L_free - r_wire * 2, center = true, convexity = 10, twist = angle_rotation) translate([r_mean, 0, 0]) scale([1, 3, 1]) circle(r_wire); + // end blocks + } + // ring top + translate([0, 0, L_free / 2 - r_wire]) rotate_extrude(angle = 360) translate([r_mean, 0, 0]) circle(r_wire); + // ring bottom + translate([0, 0, -L_free / 2 + r_wire]) rotate_extrude(angle = 360) translate([r_mean, 0, 0]) circle(r_wire); + } + // Shopping + echo(str("Compression spring: Compression spring Φ", d_outer, "mm x ", d_inner, "mm x ", L_free, "mm - x1")); +} + +// $fn = 20; +compression_spring(100, 25, 20, 10); diff --git a/models/common/hollow_cuboid.scad b/models/common/hollow_cuboid.scad new file mode 100644 index 0000000..6b274e9 --- /dev/null +++ b/models/common/hollow_cuboid.scad @@ -0,0 +1,12 @@ +// include <../../config.scad>; + +module hollow_cuboid(R, t) { + difference() { + cube(R, center = true); + cube([R[0] - t * 2, R[1] - t * 2, R[2] - t * 2], center = true); + } + // Shopping + echo(str("Hollow cuboid: Hollow cuboid ", R[0], "mm x ", R[1], "mm x ", R[2], "mm x ", R[3], "mm - x1")); +} + +hollow_cuboid([100, 200, 300], 5); \ No newline at end of file diff --git a/models/common/metric_bolt.scad b/models/common/metric_bolt.scad new file mode 100644 index 0000000..ef39763 --- /dev/null +++ b/models/common/metric_bolt.scad @@ -0,0 +1,28 @@ +// include <../../config.scad>; +use <./beam_hexagonal.scad>; +use <./metric_bolt_functions.scad>; +use <./metric_nut.scad>; + +module metric_bolt(size, length, has_nut = true, offset_nut_from_end = 0) { + echo("Metric bolt assembly:"); + head_height = get_metric_bolt_head_height(size); + head_diameter = get_metric_bolt_head_diameter(size); + head_radius = head_diameter / 2; + color("gray") union() { + // Stem + cylinder(length, size / 2, size / 2, center = true); + // Head + translate([0, 0, length / 2 - size / 2]) beam_hexagonal(head_height, head_diameter, centre = true, suppress_shopping_outputs = true); + if (has_nut) { + // Nut + translate([0, 0, -(length / 2 - size / 2) + offset_nut_from_end]) metric_nut(size); + } + } + // Shopping + echo(str("Bolt: Bolt M", size, " x ", length, "mm - x1")); +} + +// $fn = 200; +metric_bolt(12, 100); +translate([30, 0, 0]) metric_bolt(12, 100, false); +translate([60, 0, 0]) metric_bolt(12, 100, true, 5); \ No newline at end of file diff --git a/models/common/metric_bolt_functions.scad b/models/common/metric_bolt_functions.scad new file mode 100644 index 0000000..67374a3 --- /dev/null +++ b/models/common/metric_bolt_functions.scad @@ -0,0 +1,9 @@ + +function get_metric_bolt_head_height(size) = size; +function get_metric_bolt_head_diameter(size) = size * 2; +function get_metric_bolt_washer_diameter_safe_working_clearance(size) = + (size < 20) ? + 4 * size + : + 3 * size +; \ No newline at end of file diff --git a/models/common/metric_nut.json b/models/common/metric_nut.json new file mode 100644 index 0000000..b2b4dd1 --- /dev/null +++ b/models/common/metric_nut.json @@ -0,0 +1,7 @@ +{ + "parameterSets": { + "ANGLE": "" + }, + "parameterSets": "", + "fileFormatVersion": "1" +} diff --git a/models/common/metric_nut.scad b/models/common/metric_nut.scad new file mode 100644 index 0000000..a91ec8b --- /dev/null +++ b/models/common/metric_nut.scad @@ -0,0 +1,20 @@ +// include <../../config.scad>; +use <./beam_hexagonal.scad>; +use <./metric_bolt_functions.scad>; + +module metric_nut(size, centre = true) { + height = get_metric_bolt_head_height(size); + diameter = get_metric_bolt_head_diameter(size); + radius = diameter / 2; + color("gray") difference() { + // body + beam_hexagonal(height, diameter, centre = centre, suppress_shopping_outputs = true); + // hole + cylinder(height, size / 2, size / 2, center = centre); + } + // Shopping + echo(str("Nut: Nut M", size, " - x1")); +} + +// $fn = 200; +metric_nut(12); \ No newline at end of file diff --git a/models/common/universal_joint.scad b/models/common/universal_joint.scad new file mode 100644 index 0000000..a8c6efd --- /dev/null +++ b/models/common/universal_joint.scad @@ -0,0 +1,49 @@ +include <../../config.scad>; + +function get_universal_joint_length() = 40; +function get_universal_joint_d_bore_hole() = 6; +function get_universal_joint_d_hole() = 4; +function get_universal_joint_d() = 11; +function get_universal_joint_thickness() = (get_universal_joint_d() - get_universal_joint_d_bore_hole()) / 2; +function get_universal_joint_joint_axial_offset() = get_universal_joint_thickness() * 2; +function get_universal_joint_pin_axial_offset() = get_universal_joint_thickness() + get_universal_joint_d_hole() / 2; + +module universal_joint() { + echo("Universal joint assembly: ERROR MISSING"); + L = get_universal_joint_length(); + t = get_universal_joint_thickness(); + joint_axial_offset = get_universal_joint_joint_axial_offset(); + translate([L / 2, 0, 0]) mirror([1, 0, 0]) universal_joint_half(); + translate([L / 2 - joint_axial_offset, 0, 0]) rotate([90, -ANGLE_INCLINE_TILLER, 0]) translate([-joint_axial_offset, 0, 0]) universal_joint_half(); +} + +module universal_joint_half() { + d_hole_bore = get_universal_joint_d_bore_hole(); + d_hole = get_universal_joint_d_hole(); + d = get_universal_joint_d(); + L = get_universal_joint_length(); + t = get_universal_joint_thickness(); + joint_axial_offset = get_universal_joint_joint_axial_offset(); + pin_axial_offset = get_universal_joint_pin_axial_offset(); + color("orange") union() { + difference() { + // body + rotate([0, 90, 0]) cylinder(L / 2, d / 2, d / 2, center = false); + // threaded hole + translate([L - pin_axial_offset, 0, 0]) cylinder(d, d_hole / 2, d_hole / 2, center = true); + // bore hole + rotate([0, 90, 0]) cylinder(L / 2, d_hole / 2, d_hole / 2, center = false); + // joint slot + translate([L / 8, 0, 0]) cube([L / 4, d - t * 2, d], center = true); + } + // joint + translate([joint_axial_offset, 0, 0]) rotate([90, 0, 0]) cylinder(d, t, t, center = true); + } +} + +// output +translate([100, 0, 0]) universal_joint_half(); +universal_joint(); + +// shopping +//https://www.amazon.co.uk/Ohamtes-diameter-universal-coupling-Rotatable/dp/B09NXCKJY7/ref=sr_1_1_sspa?crid=3DS7BH7WHYTF4&dib=eyJ2IjoiMSJ9.qTSAOeHpLAIx1plz8THvnJuCvLh8y4zf-H37BRTvT5TTF4M6kqHBg50e-40C5hjdmTAPJLEgHg0Jx5cbB8m_wQM7WCaEibSQJBNZnTwHBZ3w0jHw-znfaRDSaMRP0xlHOblYtwBc9XbF5-KNpHR9dtRmXPDooHcnFM8vchBOqGp-5rR5c6o9Nh0TCq9APO-csslNPAa4bTVjWtniflkcqc39VaQL55CghNaz2NQGdQRrifAgcEqwIM5BpJODfEizqzlotNlbrk6F1gdAZw2clQOw5dIVvjbKLGTCgXnK2xI.vL2JYm04p6ohOn9Jf1OMaPuo9PoqjzItE0AQg2irL0E&dib_tag=se&keywords=UNIVERSAL%2BJOINT&qid=1739725484&sprefix=universal%2Bjoint%2Caps%2C66&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&th=1 \ No newline at end of file diff --git a/models/common/washer.json b/models/common/washer.json new file mode 100644 index 0000000..b2b4dd1 --- /dev/null +++ b/models/common/washer.json @@ -0,0 +1,7 @@ +{ + "parameterSets": { + "ANGLE": "" + }, + "parameterSets": "", + "fileFormatVersion": "1" +} diff --git a/models/common/washer.scad b/models/common/washer.scad new file mode 100644 index 0000000..6dabd5d --- /dev/null +++ b/models/common/washer.scad @@ -0,0 +1,15 @@ +include <../../config.scad>; + +module washer(t, d_outer, d_inner, centre = true) { + r_outer = d_outer / 2; + r_inner = d_inner / 2; + color("silver") difference() { + cylinder(t, r_outer, r_outer, center = centre); + cylinder(t, r_inner, r_inner, center = centre); + } + // Shopping + echo(str("Washer: Washer Φ", d_outer, "mm x ", d_inner, "mm x ", t, "mm - x1")); +} + +// $fn = 200; +washer(3, 10, 40); \ No newline at end of file diff --git a/models/common/wheel.scad b/models/common/wheel.scad new file mode 100644 index 0000000..575d876 --- /dev/null +++ b/models/common/wheel.scad @@ -0,0 +1,12 @@ +include <../../config.scad>; + +module wheel() { + r_wheel = D_WHEEL / 2; + r_wheel_bore = D_WHEEL_BORE / 2; + color("red") rotate([0, 90, 0]) difference() { + cylinder(T_WHEEL, r_wheel, r_wheel, center = true); + cylinder(T_WHEEL, r_wheel_bore, r_wheel_bore, center = true); + } + // Shopping + echo("Wheel: Wheel - x1"); +} \ No newline at end of file diff --git a/models/dog_cart/dog_cart.scad b/models/dog_cart/dog_cart.scad new file mode 100644 index 0000000..ee77089 --- /dev/null +++ b/models/dog_cart/dog_cart.scad @@ -0,0 +1,31 @@ +// Molly Dog Towing Cart + +include <../../config.scad>; +use <../bed/bed.scad>; +use <../top_crate/top_crate_shaft_assembly.scad>; +use <../rear_drive/rear_drive_assembly.scad>; +use <../brake/brake_assembly.scad>; +use <../front_drive/front_drive_assembly.scad>; + +module dog_cart(angle_incline_tiller, angle_brake_rod) { + echo("Dog cart assembly:"); + // bed + bed(); + // top crate shaft assembly + top_crate_shaft_assembly(); + // rear drive assembly + rear_drive_assembly(); + // brake assembly + translate([0, 0, -R_BED[2] / 2]) brake_assembly(angle_brake_rod); + // front drive assembly + front_drive_assembly(angle_incline_tiller); + + // Shopping + // bed + // top crate shaft assembly + // rear drive assembly + // front drive assembly +} + +// output +dog_cart(20); diff --git a/models/fixings/tube_clamp_round_3_way_outlet_tee_176.scad b/models/fixings/tube_clamp_round_3_way_outlet_tee_176.scad new file mode 100644 index 0000000..e6b674c --- /dev/null +++ b/models/fixings/tube_clamp_round_3_way_outlet_tee_176.scad @@ -0,0 +1,39 @@ +include <../../config.scad>; + +function get_L_shaft_long_round_3_way_outlet_tee_176(tube_diameter) = + (tube_diameter == 27) ? + 85 + : (tube_diameter == 42) ? + 122 + : 25 +; +function get_L_shaft_short_round_3_way_outlet_tee_176(tube_diameter) = + (tube_diameter == 27) ? + 42 + : (tube_diameter == 42) ? + 61 + : 10 +; + +module tube_clamp_round_3_way_outlet_tee_176(tube_diameter) { + t = 7; + L_shaft_long = get_L_shaft_long_round_3_way_outlet_tee_176(tube_diameter); + L_shaft_short = get_L_shaft_short_round_3_way_outlet_tee_176(tube_diameter); + color("LightGrey") difference() { + union() { + // long edge + cylinder(L_shaft_long, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + // short perpendicular section + translate([L_shaft_short / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + } + cylinder(L_shaft_long, tube_diameter / 2, tube_diameter / 2, center = true); + translate([L_shaft_short / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2, tube_diameter / 2, center = true); + rotate([90, 0, 0]) cylinder(L_shaft_long, tube_diameter / 2, tube_diameter / 2, center = true); + } + // Shopping + echo("Round 3-way outlet tee 176: Tube clamp - x1"); +} + +// test output +tube_clamp_round_3_way_outlet_tee_176(27); +translate([200, 0, 0]) tube_clamp_round_3_way_outlet_tee_176(42); \ No newline at end of file diff --git a/models/fixings/tube_clamp_round_3_way_through_116.scad b/models/fixings/tube_clamp_round_3_way_through_116.scad new file mode 100644 index 0000000..9bbddb2 --- /dev/null +++ b/models/fixings/tube_clamp_round_3_way_through_116.scad @@ -0,0 +1,27 @@ +include <../../config.scad>; +use <./tube_clamp_round_3_way_through_116_functions.scad>; + +module tube_clamp_round_3_way_through_116(tube_diameter) { + t = get_thickness_round_3_way_through_116(tube_diameter); + L_shaft_long = get_L_shaft_long_round_3_way_through_116(tube_diameter); + L_shaft_short = get_L_shaft_short_round_3_way_through_116(tube_diameter); + color("LightGrey") difference() { + union() { + // short horizontal section + rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + // long vertical section + translate([0, 0, L_shaft_long / 2]) rotate([0, 0, 0]) cylinder(L_shaft_long, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + // long horizontal section + translate([0, L_shaft_long / 2, 0]) rotate([90, 0, 0]) cylinder(L_shaft_long, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + } + rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2, tube_diameter / 2, center = true); + translate([0, 0, L_shaft_long / 2]) rotate([0, 0, 0]) cylinder(L_shaft_long, tube_diameter / 2, tube_diameter / 2, center = true); + translate([0, L_shaft_long / 2, 0]) rotate([90, 0, 0]) cylinder(L_shaft_long, tube_diameter / 2, tube_diameter / 2, center = true); + } + // Shopping + echo("Round 3-way through 116: Tube clamp - x1"); +} + +// test output +tube_clamp_round_3_way_through_116(27); +translate([200, 0, 0]) tube_clamp_round_3_way_through_116(42); \ No newline at end of file diff --git a/models/fixings/tube_clamp_round_3_way_through_116_functions.scad b/models/fixings/tube_clamp_round_3_way_through_116_functions.scad new file mode 100644 index 0000000..1aee241 --- /dev/null +++ b/models/fixings/tube_clamp_round_3_way_through_116_functions.scad @@ -0,0 +1,10 @@ + +function get_L_shaft_long_round_3_way_through_116(tube_diameter) = + (tube_diameter == 27) ? + 42 + : (tube_diameter == 42) ? + 60 + : 25 +; +function get_thickness_round_3_way_through_116(tube_diameter) = 7; +function get_L_shaft_short_round_3_way_through_116(tube_diameter) = tube_diameter + 2 * get_thickness_round_3_way_through_116(); \ No newline at end of file diff --git a/models/fixings/tube_clamp_round_base_plate_132.scad b/models/fixings/tube_clamp_round_base_plate_132.scad new file mode 100644 index 0000000..edad366 --- /dev/null +++ b/models/fixings/tube_clamp_round_base_plate_132.scad @@ -0,0 +1,29 @@ +include <../../config.scad>; +use <./tube_clamp_round_base_plate_132_functions.scad>; + +module tube_clamp_round_base_plate_132(tube_diameter) { + L_shaft_with_base_plate = get_L_shaft_with_base_plate_round_base_plate_132(tube_diameter); + R_plate = get_R_plate_round_base_plate_132(tube_diameter); + t = R_plate[2]; + offset_hole_y = get_offset_hole_y_round_base_plate_132(tube_diameter); + d_hole_bolt_round_base_plate_132 = get_diameter_hole_round_base_plate_132(tube_diameter); + color("LightGrey") union() { + // cylinder section + translate([0, 0, L_shaft_with_base_plate / 2]) difference() { + cylinder(L_shaft_with_base_plate, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + cylinder(L_shaft_with_base_plate, tube_diameter / 2, tube_diameter / 2, center = true); + } + // base plate + translate([0, 0, R_plate[2] / 2]) difference() { + cube(R_plate, center = true); + translate([0, offset_hole_y, 0]) cylinder(R_plate[2], d_hole_bolt_round_base_plate_132 / 2, d_hole_bolt_round_base_plate_132 / 2, center = true); + translate([0, -offset_hole_y, 0]) cylinder(R_plate[2], d_hole_bolt_round_base_plate_132 / 2, d_hole_bolt_round_base_plate_132 / 2, center = true); + } + } + // Shopping + echo("Round base plate 132: Tube clamp - x1"); +} + +// test output +tube_clamp_round_base_plate_132(27); +translate([200, 0, 0]) tube_clamp_round_base_plate_132(42); \ No newline at end of file diff --git a/models/fixings/tube_clamp_round_base_plate_132_functions.scad b/models/fixings/tube_clamp_round_base_plate_132_functions.scad new file mode 100644 index 0000000..de7a8e0 --- /dev/null +++ b/models/fixings/tube_clamp_round_base_plate_132_functions.scad @@ -0,0 +1,23 @@ + +function get_L_shaft_with_base_plate_round_base_plate_132(tube_diameter) = + (tube_diameter == 27) ? + 85 + : (tube_diameter == 42) ? + 122 + : 25 +; +function get_R_plate_round_base_plate_132(tube_diameter) = + (tube_diameter == 27) ? + [64, 114, 7] + : (tube_diameter == 42) ? + [80, 140, 10] + : [10, 20, 1] +; +function get_offset_hole_y_round_base_plate_132(tube_diameter) = + (tube_diameter == 27) ? + 38 + : (tube_diameter == 42) ? + 50 + : 10 +; +function get_diameter_hole_round_base_plate_132(tube_diameter) = 10; diff --git a/models/fixings/tube_clamp_round_tee_long_104.scad b/models/fixings/tube_clamp_round_tee_long_104.scad new file mode 100644 index 0000000..eef8a43 --- /dev/null +++ b/models/fixings/tube_clamp_round_tee_long_104.scad @@ -0,0 +1,24 @@ +include <../../config.scad>; +use <./tube_clamp_round_tee_long_104_functions.scad>; + +module tube_clamp_round_tee_long_104(tube_diameter) { + t = 7; + L_shaft_long = get_L_shaft_long_round_tee_long_104(tube_diameter); + L_shaft_short = get_L_shaft_short_round_tee_long_104(tube_diameter); + color("LightGrey") difference() { + union() { + // long edge + cylinder(L_shaft_long, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + // short perpendicular section + translate([L_shaft_short / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2 + t, tube_diameter / 2 + t, center = true); + } + cylinder(L_shaft_long, tube_diameter / 2, tube_diameter / 2, center = true); + translate([L_shaft_short / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_shaft_short, tube_diameter / 2, tube_diameter / 2, center = true); + } + // Shopping + echo("Round tee long 104: Tube clamp - x1"); +} + +// test output +tube_clamp_round_tee_long_104(27); +translate([200, 0, 0]) tube_clamp_round_tee_long_104(42); \ No newline at end of file diff --git a/models/fixings/tube_clamp_round_tee_long_104_functions.scad b/models/fixings/tube_clamp_round_tee_long_104_functions.scad new file mode 100644 index 0000000..9ed2cf8 --- /dev/null +++ b/models/fixings/tube_clamp_round_tee_long_104_functions.scad @@ -0,0 +1,16 @@ +// include <../../config.scad>; + +function get_L_shaft_long_round_tee_long_104(tube_diameter) = + (tube_diameter == 27) ? + 85 + : (tube_diameter == 42) ? + 122 + : 25 +; +function get_L_shaft_short_round_tee_long_104(tube_diameter) = + (tube_diameter == 27) ? + 42 + : (tube_diameter == 42) ? + 61 + : 10 +; diff --git a/models/fixings/tube_clamp_square_base_plate_132.scad b/models/fixings/tube_clamp_square_base_plate_132.scad new file mode 100644 index 0000000..4b6bda0 --- /dev/null +++ b/models/fixings/tube_clamp_square_base_plate_132.scad @@ -0,0 +1,28 @@ +include <../../config.scad>; +use <./tube_clamp_square_base_plate_132_functions.scad>; + +module tube_clamp_square_base_plate_132(beam_width) { + L_shaft_with_base_plate = get_L_shaft_with_base_plate_square_base_plate_132(beam_width); + R_plate = get_R_plate_square_base_plate_132(beam_width); + t = get_thickness_square_base_plate_132(beam_width); + offset_hole_x = get_offset_hole_x_square_base_plate_132(beam_width); + d_hole_bolt_square_base_plate_132 = get_diameter_hole_square_base_plate_132(beam_width); + color("LightGrey") union() { + // shaft section + translate([0, 0, L_shaft_with_base_plate / 2]) difference() { + cube([beam_width + t * 2, beam_width + t * 2, L_shaft_with_base_plate], center = true); + cube([beam_width, beam_width, L_shaft_with_base_plate], center = true); + } + // base plate + translate([0, 0, R_plate[2] / 2]) difference() { + cube(R_plate, center = true); + translate([offset_hole_x, 0, 0]) cylinder(R_plate[2], d_hole_bolt_square_base_plate_132 / 2, d_hole_bolt_square_base_plate_132 / 2, center = true); + translate([-offset_hole_x, 0, 0]) cylinder(R_plate[2], d_hole_bolt_square_base_plate_132 / 2, d_hole_bolt_square_base_plate_132 / 2, center = true); + } + } + // Shopping + echo("Square base plate 132: Tube clamp - x1"); +} + +// test output +tube_clamp_square_base_plate_132(42); \ No newline at end of file diff --git a/models/fixings/tube_clamp_square_base_plate_132_functions.scad b/models/fixings/tube_clamp_square_base_plate_132_functions.scad new file mode 100644 index 0000000..6f75496 --- /dev/null +++ b/models/fixings/tube_clamp_square_base_plate_132_functions.scad @@ -0,0 +1,21 @@ + +function get_L_shaft_with_base_plate_square_base_plate_132(beam_width) = + // (beam_width == 40) ? + 75 +; +function get_R_plate_square_base_plate_132(beam_width) = + // (beam_width == 40) ? + [143, 75, 18.5] +; +function get_thickness_square_base_plate_132(beam_width) = + // (beam_width == 40) ? + 8 +; +function get_offset_hole_x_square_base_plate_132(beam_width) = + // (beam_width == 40) ? + 100 / 2 +; +function get_diameter_hole_square_base_plate_132(beam_width) = + // (beam_width == 40) ? + 10 +; diff --git a/models/front_drive/front_drive_assembly.scad b/models/front_drive/front_drive_assembly.scad new file mode 100644 index 0000000..f7ba6ca --- /dev/null +++ b/models/front_drive/front_drive_assembly.scad @@ -0,0 +1,80 @@ +include <../../config.scad>; +use <../front_drive/front_leg_fixing.scad>; +use <../front_drive/tiller_assembly.scad>; +use <../rear_drive/rear_wheel_fastener.scad>; +use <../common/metric_bolt.scad>; +use <../common/washer.scad>; +use <../common/wheel.scad>; + +module front_drive_assembly(angle_incline_tiller) { + echo("Front drive assembly:"); + y_pos_axis = R_BED[1] / 2 - D_WHEEL / 2; + L_axle_long = R_BED[0] - T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 2; + L_axle_short = T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 2 + T_WHEEL + D_WASHER_BOLT_REAR_WHEEL_POSITIONING; + height_bolt_head = get_metric_bolt_head_height(SIZE_BOLT_REAR_WHEEL_POSITIONING); + L_bolt_axle_extension = D_AXLE_FRONT + 2 * (T_WASHER_BOLT_REAR_WHEEL_POSITIONING + height_bolt_head) + L_BOLT_EXTENSION; + offset_axle_extension_fastener_axial = 2 * SIZE_BOLT_REAR_WHEEL_POSITIONING; + L_bolt_wheel_positioning = D_AXLE_REAR + 2 * (T_WASHER_BOLT_REAR_WHEEL_POSITIONING + height_bolt_head) + L_BOLT_EXTENSION; + translate([0, y_pos_axis, -R_BED[2] / 2]) union() { + // leg fixing + front_leg_fixing(); + // left-right symmetry + translate([0, 0, -Z_OFFSET_BED_TO_AXLE]) for (index_side = [0:1:1]) { + mirror([index_side, 0, 0]) { + // axle extensions + color(COLOUR_BEAM_ALUMINIUM) translate([L_axle_long / 2 + L_axle_short / 2, 0, 0]) rotate([0, 90, 0]) cylinder(L_axle_short, D_AXLE_REAR / 2, D_AXLE_REAR / 2, center = true); + // axle extension fixing bolt + translate([L_axle_long / 2 - offset_axle_extension_fastener_axial, 0, -L_BOLT_EXTENSION / 2]) metric_bolt(SIZE_BOLT_REAR_WHEEL_POSITIONING, L_bolt_axle_extension, true, L_BOLT_EXTENSION); + // axle extension fixing bolt washers + translate([L_axle_long / 2 - offset_axle_extension_fastener_axial, 0, 0]) for (index_side_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_z]) { + translate([0, 0, D_AXLE_FRONT / 2 + T_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2]) washer(T_WASHER_BOLT_REAR_WHEEL_POSITIONING, D_WASHER_BOLT_REAR_WHEEL_POSITIONING, SIZE_BOLT_REAR_WHEEL_POSITIONING); + } + } + // inner wheel axis washers + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING / 2, 0, 0]) rotate([0, 90, 0]) washer(T_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_AXLE_REAR); + // wheels + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING + T_WHEEL / 2, 0, 0]) wheel(); + // outer wheel axis washers + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 3 / 2 + T_WHEEL, 0, 0]) rotate([0, 90, 0]) washer(T_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_AXLE_REAR); + + /* replaced with rear_wheel_fastener below + // wheel positioning bolts + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 2 + T_WHEEL + D_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2, 0, -L_BOLT_EXTENSION / 2]) metric_bolt(SIZE_BOLT_REAR_WHEEL_POSITIONING, L_bolt_wheel_positioning, true, L_BOLT_EXTENSION); + // wheel positioning bolt washers + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 2 + T_WHEEL + D_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2, 0, 0]) for (index_side_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_z]) { + translate([0, 0, D_AXLE_REAR / 2 + T_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2]) washer(T_WASHER_BOLT_REAR_WHEEL_POSITIONING, D_WASHER_BOLT_REAR_WHEEL_POSITIONING, SIZE_BOLT_REAR_WHEEL_POSITIONING); + } + } + */ + translate([L_axle_long / 2 + T_WASHER_AXLE_REAR_WHEEL_POSITIONING * 2 + T_WHEEL + D_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2, 0, 0]) rear_wheel_fastener(); + } + } + // axle + color(COLOUR_BEAM_ALUMINIUM) translate([0, 0, -Z_OFFSET_BED_TO_AXLE]) rotate([0, 90, 0]) cylinder(L_axle_long, D_AXLE_FRONT / 2, D_AXLE_FRONT / 2, center = true); + // tiller + translate([0, D_AXLE_FRONT / 2, -Z_OFFSET_BED_TO_AXLE]) tiller_assembly(angle_incline_tiller); + // joint axle to tiller + translate([0, 0, -Z_OFFSET_BED_TO_AXLE + L_BOLT_FRONT_AXLE_BEARING / 2 - D_AXLE_FRONT / 2 - T_JOINT_FRONT_AXLE_TO_TILLER - DEPTH_BOLT_FRONT_AXLE_BEARING - COUNT_WASHERS_JOINT_FRONT_AXLE_TO_TILLER * T_WASHER_JOINT_FRONT_AXLE_TO_TILLER]) mirror([0, 0, 1]) metric_bolt(SIZE_BOLT_FRONT_AXLE_BEARING, L_BOLT_FRONT_AXLE_BEARING, false); + // joint axle to tiller washers + for (index_washer = [0 : 1 : COUNT_WASHERS_JOINT_FRONT_AXLE_TO_TILLER - 1]) { + translate([0, 0, -Z_OFFSET_BED_TO_AXLE - D_AXLE_FRONT / 2 - T_JOINT_FRONT_AXLE_TO_TILLER - T_WASHER_JOINT_FRONT_AXLE_TO_TILLER * (index_washer + 1 / 2)]) washer(T_WASHER_JOINT_FRONT_AXLE_TO_TILLER, D_WASHER_JOINT_FRONT_AXLE_TO_TILLER, SIZE_BOLT_FRONT_AXLE_BEARING); + } + } + // Shopping + // front leg fixing + echo(str("Axle extension: Round Aluminium bar Φ", D_AXLE_REAR, "mm x ", L_axle_short, "mm - x2")); + // Axle extension fixing bolt + // echo(str("Axle extension fixing bolt washer: Washer Φ", D_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm x ", T_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm - x4")); // Axle extension fixing bolt washers + // echo(str("Wheel positioning washer: Washer Φ", D_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm x ", T_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm - x4")); // Wheel positioning washers + // wheels + // wheel positioning fastener + // echo(str("Wheel positioning bolt washer: Washer Φ", D_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm x ", T_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm - x4")); // Wheel positioning bolt washers + echo(str("Axle: Round Aluminium bar Φ", D_AXLE_FRONT, "mm x ", L_axle_long, "mm - x1")); + // tiller assembly + // front axis bearing bolt + // echo(str("Front axis bearing washers: Washer Φ", D_WASHER_JOINT_FRONT_AXLE_TO_TILLER, "mm x ", T_WASHER_JOINT_FRONT_AXLE_TO_TILLER, "mm - x", COUNT_WASHERS_JOINT_FRONT_AXLE_TO_TILLER)); // Front axis bearing washers +} + +front_drive_assembly(20); \ No newline at end of file diff --git a/models/front_drive/front_leg_fixing.scad b/models/front_drive/front_leg_fixing.scad new file mode 100644 index 0000000..930f0d9 --- /dev/null +++ b/models/front_drive/front_leg_fixing.scad @@ -0,0 +1,50 @@ +include <../../config.scad>; +use <../fixings/tube_clamp_round_3_way_through_116.scad>; +use <../fixings/tube_clamp_round_base_plate_132.scad>; +use <../common/metric_bolt.scad>; +use <../common/washer.scad>; + +module front_leg_fixing() { + echo("Front leg fixing assembly:"); + R_base_plate = get_R_plate_round_base_plate_132(D_AXLE_FRONT); + h_leg = Z_OFFSET_BED_TO_AXLE - D_AXLE_FRONT / 2 - R_base_plate[2]; + offset_y_hole_base_plate = get_offset_hole_y_round_base_plate_132(D_AXLE_FRONT); + size_hole_base_plate = get_diameter_hole_round_base_plate_132(D_AXLE_FRONT); + h_bolt_head = get_metric_bolt_head_height(size_hole_base_plate); + L_fastener = h_bolt_head * 2 + T_WASHER_BASE_PLATE * 2 + R_base_plate[2] + R_BED[2] + L_BOLT_EXTENSION; + difference() { + union() { + // bracket - top, under bed + // translate([0, 0, -R_fixing[2] / 2]) cylinder(R_fixing[2], R_fixing[0] / 2, R_fixing[0] / 2, center = true); + rotate([0, 180, 0]) tube_clamp_round_base_plate_132(D_AXLE_FRONT); + // bed bracket fastening bolt + for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + // bracket at bed fastener + translate([0, offset_y_hole_base_plate, L_fastener / 2 - R_base_plate[2] - L_BOLT_EXTENSION - h_bolt_head - T_WASHER_BASE_PLATE]) metric_bolt(size_hole_base_plate, L_fastener, true, L_BOLT_EXTENSION); + translate([0, offset_y_hole_base_plate, h_bolt_head / 2 - T_WASHER_BASE_PLATE / 2]) for (index_side_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_z]) { + // bracket fastener washers + translate([0, 0, L_fastener / 2 - L_BOLT_EXTENSION / 2 - h_bolt_head - T_WASHER_BASE_PLATE / 2]) washer(T_WASHER_BASE_PLATE, D_WASHER_BASE_PLATE, size_hole_base_plate); + } + } + } + } + // leg + color(COLOUR_BEAM_ALUMINIUM) translate([0, 0, -R_base_plate[2] - h_leg / 2]) cylinder(h_leg, D_AXLE_FRONT / 2, D_AXLE_FRONT / 2, center = true); + // bracket - bottom, against axle + translate([0, 0, -Z_OFFSET_BED_TO_AXLE]) rotate([0, 0, 0]) tube_clamp_round_3_way_through_116(D_AXLE_FRONT); // translate([0, 0, -R_fixing[2] * 3 / 2 - h_leg - T_PLATE * 2 - D_AXLE_FRONT + z_overlap_tee_clamp_round * 1]) cylinder(R_fixing[2], R_fixing[0] / 2, R_fixing[0] / 2, center = true); + } + // front axle bearing hole + translate([0, 0, -Z_OFFSET_BED_TO_AXLE + D_AXLE_FRONT / 2 + DEPTH_BOLT_FRONT_AXLE_BEARING - L_BOLT_FRONT_AXLE_BEARING]) cylinder(L_BOLT_FRONT_AXLE_BEARING, SIZE_BOLT_FRONT_AXLE_BEARING / 2, SIZE_BOLT_FRONT_AXLE_BEARING / 2, center = false); + } + // Shopping + // bed fixing + echo(str("Leg: Round Aluminium bar Φ", D_AXLE_FRONT, "mm x ", h_leg, "mm - x1")); + // Base plate fastening bolts and nuts + // echo(str("Base plate fastening washers: Washer Φ", D_WASHER_BASE_PLATE, "mm x ", T_WASHER_BASE_PLATE, "mm - x4")); // Base plate fastening washers + // axle fixing + echo(str("Tool: M", SIZE_BOLT_FRONT_AXLE_BEARING, " HSS tapping tool - x1")); +} + +front_leg_fixing(); diff --git a/models/front_drive/tiller_assembly.scad b/models/front_drive/tiller_assembly.scad new file mode 100644 index 0000000..44dc36f --- /dev/null +++ b/models/front_drive/tiller_assembly.scad @@ -0,0 +1,64 @@ +include <../../config.scad>; +use <./tiller_joint.scad>; +use <../common/metric_bolt.scad>; +use <../fixings/tube_clamp_round_tee_long_104.scad>; + +module tiller_assembly(angle_incline_tiller) { + echo("Tiller assembly:"); + /* + t_universal_joint = get_universal_joint_thickness(); + d_universal_joint = get_universal_joint_d(); + d_hole_universal_joint = get_universal_joint_d_hole(); + d_hole_bore_universal_joint = get_universal_joint_d_bore_hole(); + L_universal_joint = get_universal_joint_length(); + joint_axial_offset = get_universal_joint_joint_axial_offset(); + pin_axial_offset = get_universal_joint_pin_axial_offset(); + L_hole = t_universal_joint + d_hole_universal_joint / 2 + pin_axial_offset; + L_bolt_fastener = D_AXLE_FRONT + d_hole_universal_joint * 4 + T_WASHER_UNIVERSAL_JOINT; + echo("t_universal_joint", t_universal_joint, "mm"); + echo("d_hole_universal_joint", d_hole_universal_joint, "mm"); + echo("pin_axial_offset", pin_axial_offset, "mm"); + echo("L_hole", t_universal_joint + d_hole_universal_joint / 2 + pin_axial_offset, "mm"); + echo("L_universal_joint / 2 - joint_axial_offset - L_hole", L_universal_joint / 2 - joint_axial_offset - L_hole, "mm"); + */ + + union() { + // tiller + color(COLOUR_BEAM_ALUMINIUM) difference() { + // body + rotate([-90, 0, 0]) cylinder(L_TILLER, D_AXLE_FRONT / 2, D_AXLE_FRONT / 2, center = false); + // joint fastening hole normal + translate([L_TILLER - OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL, 0, 0]) cylinder(D_AXLE_FRONT, SIZE_BOLT_JOINT_TILLER_EXTENSION / 2, SIZE_BOLT_JOINT_TILLER_EXTENSION / 2, center = false); + } + /* + // universal joint + translate([L_TILLER - L_hole, 0, 0]) universal_joint(); + // tiller universal joint fastening + translate([L_TILLER - L_hole / 2, 0, 0]) metric_bolt(d_hole_universal_joint, L_bolt_fastener); + */ + // tiller joint + translate([0, L_TILLER + L_JOINT_TILLER_EXTENSION / 2 - OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL * 2, 0]) tiller_joint(); + // tiller extension + translate([0, L_TILLER + L_JOINT_TILLER_EXTENSION - OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL * 4, 0]) rotate([angle_incline_tiller, 0, 0]) { + color(COLOUR_BEAM_ALUMINIUM) difference() { + // body + rotate([-90, 0, 0]) cylinder(L_TILLER_EXTENSION, D_HANDLE_BAR / 2, D_HANDLE_BAR / 2, center = false); + // joint fastening hole normal + translate([0, OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL, 0]) cylinder(D_AXLE_FRONT, SIZE_BOLT_JOINT_TILLER_EXTENSION / 2, SIZE_BOLT_JOINT_TILLER_EXTENSION / 2, center = false); + } + // handle beam + color(COLOUR_BEAM_ALUMINIUM) translate([0, L_TILLER_EXTENSION + D_HANDLE_BAR / 2, 0]) rotate([0, 90, 0]) cylinder(W_HANDLE_BAR, D_HANDLE_BAR / 2, D_HANDLE_BAR / 2, center = true); + // handle fixing + translate([0, L_TILLER_EXTENSION + D_HANDLE_BAR / 2, 0]) rotate([90, 0, -90]) tube_clamp_round_tee_long_104(D_HANDLE_BAR); + } + } + // Shopping + echo(str("Tiller: Round Aluminium bar Φ", D_AXLE_FRONT, "mm x ", L_TILLER, "mm - x1")); + // Tiller extension joint + echo(str("Tiller extension: Round Aluminium bar Φ", D_HANDLE_BAR, "mm x ", L_TILLER_EXTENSION, "mm - x1")); + echo(str("Handle bar: Round Aluminium bar Φ", D_HANDLE_BAR, "mm x ", W_HANDLE_BAR, "mm - x1")); + // Handle fixing +} + +// $fn = 100; +tiller_assembly(20); \ No newline at end of file diff --git a/models/front_drive/tiller_joint.scad b/models/front_drive/tiller_joint.scad new file mode 100644 index 0000000..2289234 --- /dev/null +++ b/models/front_drive/tiller_joint.scad @@ -0,0 +1,50 @@ +include <../../config.scad>; +use <../common/metric_bolt.scad>; +use <../common/washer.scad>; + +module tiller_joint() { + echo("Tiller joint assembly:"); + R_plate_tiller = [T_PLATE, L_JOINT_TILLER_EXTENSION, 3 * SIZE_BOLT_JOINT_TILLER_EXTENSION]; + x_pos_plate = (D_AXLE_FRONT + R_plate_tiller[0]) / 2 + T_WASHER_TILLER_JOINT; + h_bolt_head = get_metric_bolt_head_height(SIZE_BOLT_JOINT_TILLER_EXTENSION); + L_bolt = D_AXLE_FRONT + 2 * (h_bolt_head + T_WASHER_TILLER_JOINT * 2 + R_plate_tiller[0]) + L_BOLT_EXTENSION; + y_pos_bolt = R_plate_tiller[1] / 2 - OFFSET_BOLT_JOINT_TILLER_EXTENSION_AXIAL; + x_pos_washer_internal = D_AXLE_FRONT / 2 + T_WASHER_TILLER_JOINT / 2; + x_pos_washer_external = L_bolt / 2 - L_BOLT_EXTENSION / 2 - h_bolt_head - T_WASHER_TILLER_JOINT / 2; + count_washers_each_side_front = 5; + union() { + for (index_side_x = [0 : 1 : 1]) { + mirror([index_side_x, 0, 0]) { + // plates + color(COLOUR_BEAM_ALUMINIUM) translate([x_pos_plate, 0, 0]) cube(R_plate_tiller, center = true); + + for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + // washers + // external + translate([x_pos_washer_external, y_pos_bolt, 0]) rotate([0, 90, 0]) washer(T_WASHER_TILLER_JOINT, D_WASHER_TILLER_JOINT, SIZE_BOLT_JOINT_TILLER_EXTENSION); + } + } + // rear internal washers + translate([x_pos_washer_internal, -y_pos_bolt, 0]) rotate([0, 90, 0]) washer(T_WASHER_TILLER_JOINT, D_WASHER_TILLER_JOINT, SIZE_BOLT_JOINT_TILLER_EXTENSION); + // front internal washers + for (index_washer_front = [0 : 1 : count_washers_each_side_front]) { + translate([x_pos_washer_internal - T_WASHER_TILLER_JOINT * index_washer_front, y_pos_bolt, 0]) rotate([0, 90, 0]) washer(T_WASHER_TILLER_JOINT, D_WASHER_TILLER_JOINT, SIZE_BOLT_JOINT_TILLER_EXTENSION); + } + } + } + for (index_side_y_only = [0 : 1 : 1]) { + mirror([0, index_side_y_only, 0]) { + // bolts + translate([-L_BOLT_EXTENSION / 2, y_pos_bolt, 0]) rotate([0, 90, 0]) metric_bolt(SIZE_BOLT_JOINT_TILLER_EXTENSION, L_bolt, true, L_BOLT_EXTENSION); + } + } + } + // Shopping + echo(str("Plate: Aluminium sheet ", R_plate_tiller[0], "mm x ", R_plate_tiller[1], "mm x ", R_plate_tiller[2], "mm - x2")); + // echo(str("Washer: Washer Φ", D_WASHER_TILLER_JOINT, "mm x ", T_WASHER_TILLER_JOINT, "mm - x8")); // Tiller joint washers + // Bolts +} + +// output +tiller_joint(); diff --git a/models/rear_drive/rear_drive_assembly.scad b/models/rear_drive/rear_drive_assembly.scad new file mode 100644 index 0000000..23c5dee --- /dev/null +++ b/models/rear_drive/rear_drive_assembly.scad @@ -0,0 +1,45 @@ + +include <../../config.scad>; +use <../fixings/tube_clamp_round_tee_long_104.scad>; +use <../fixings/tube_clamp_round_base_plate_132.scad>; +use <../rear_drive/rear_leg_fixing.scad>; +use <../rear_drive/rear_wheel_fastener.scad>; +use <../common/washer.scad>; +use <../common/wheel.scad>; + +module rear_drive_assembly() { + echo("Rear drive assembly:"); + L_shaft_short_leg_to_axle = get_L_shaft_short_round_tee_long_104(D_AXLE_REAR); + L_shaft_long_leg_to_axle = get_L_shaft_long_round_tee_long_104(D_AXLE_REAR); + // L_axial_rear_wheel_fastener = SPACING_WASHER_AXLE_REAR_WHEEL_POSITIONING + T_WASHER_AXLE_REAR_WHEEL_POSITIONING + D_WASHER_BOLT_REAR_WHEEL_POSITIONING; + // x_pos_wheel_centre = X_POS_AXLE_LEG_REAR + L_shaft_long_leg_to_axle / 2 + L_axial_rear_wheel_fastener + T_WHEEL / 2; + L_axle = 2 * (X_POS_WHEEL_CENTRE + T_WHEEL / 2 + SPACING_WASHER_AXLE_REAR_WHEEL_POSITIONING + T_WASHER_AXLE_REAR_WHEEL_POSITIONING + D_WASHER_BOLT_REAR_WHEEL_POSITIONING); + translate([0, Y_POS_AXLE_REAR, -R_BED[2] / 2]) union() { + for (index_side_bed = [0:1:1]) { + mirror([index_side_bed, 0, 0]) { + // leg fixings + translate([X_POS_AXLE_LEG_REAR, 0, 0]) rear_leg_fixing(); + // wheels + translate([X_POS_WHEEL_CENTRE, 0, -Z_OFFSET_BED_TO_AXLE]) wheel(); + translate([X_POS_WHEEL_CENTRE, 0, -Z_OFFSET_BED_TO_AXLE]) for(index_side_wheel = [0:1:1]) { + mirror([index_side_wheel, 0, 0]) translate([T_WHEEL / 2 + SPACING_WASHER_AXLE_REAR_WHEEL_POSITIONING + T_WASHER_AXLE_REAR_WHEEL_POSITIONING + D_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2, 0, 0]) { + // wheel positioning fasteners + rear_wheel_fastener(); + // washer + translate([-D_WASHER_BOLT_REAR_WHEEL_POSITIONING / 2 - T_WASHER_AXLE_REAR_WHEEL_POSITIONING / 2, 0, 0]) rotate([0, 90, 0]) washer(T_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_WASHER_AXLE_REAR_WHEEL_POSITIONING, D_AXLE_REAR); + } + } + } + } + // axle + color(COLOUR_BEAM_ALUMINIUM) translate([0, 0, -Z_OFFSET_BED_TO_AXLE]) rotate([0, 90, 0]) cylinder(L_axle, D_AXLE_REAR / 2, D_AXLE_REAR / 2, center = true); + } + // Shopping + // Rear leg fixing + // Wheel + // Rear wheel fastener + // echo(str("Rear wheel positioning axle washer: Washer Φ", D_WASHER_AXLE_REAR_WHEEL_POSITIONING, "mm x ", T_WASHER_AXLE_REAR_WHEEL_POSITIONING, "mm - x4")); // Rear wheel positioning axle washer + echo(str("Rear axle: Round Aluminium bar Φ", D_AXLE_REAR, "mm x ", L_axle, "mm - x1")); +} + +rear_drive_assembly(); diff --git a/models/rear_drive/rear_leg_fixing.scad b/models/rear_drive/rear_leg_fixing.scad new file mode 100644 index 0000000..9186a92 --- /dev/null +++ b/models/rear_drive/rear_leg_fixing.scad @@ -0,0 +1,45 @@ +include <../../config.scad>; +use <../fixings/tube_clamp_round_tee_long_104.scad>; +use <../fixings/tube_clamp_round_base_plate_132.scad>; +use <../common/metric_bolt.scad>; +use <../common/washer.scad>; + +module rear_leg_fixing() { + echo("Rear leg fixing:"); + R_base_plate = get_R_plate_round_base_plate_132(D_AXLE_REAR); + h_leg = Z_OFFSET_BED_TO_AXLE - R_base_plate[2] - D_AXLE_REAR / 2; + offset_y_hole_base_plate = get_offset_hole_y_round_base_plate_132(D_AXLE_REAR); + size_hole_base_plate = get_diameter_hole_round_base_plate_132(D_AXLE_REAR); + h_bolt_head = get_metric_bolt_head_height(size_hole_base_plate); + L_fastener = h_bolt_head * 2 + T_WASHER_BASE_PLATE * 2 + R_base_plate[2] + R_BED[2] + L_BOLT_EXTENSION; + union() { + // bracket bed + rotate([0, 180, 0]) tube_clamp_round_base_plate_132(D_AXLE_REAR); // cylinder(R_fixing[2], R_fixing[0] / 2, R_fixing[0] / 2, center = true); // cube(R_fixing, center = true); + + for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + // bracket at bed fastener + translate([0, offset_y_hole_base_plate, L_fastener / 2 - R_base_plate[2] - L_BOLT_EXTENSION - h_bolt_head - T_WASHER_BASE_PLATE]) metric_bolt(size_hole_base_plate, L_fastener, true, L_BOLT_EXTENSION); + translate([0, offset_y_hole_base_plate, h_bolt_head / 2 - 0* T_WASHER_BASE_PLATE / 2]) for (index_side_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_z]) { + // bracket fastener washers + translate([0, 0, L_fastener / 2 - L_BOLT_EXTENSION / 2 - h_bolt_head - T_WASHER_BASE_PLATE / 2]) washer(T_WASHER_BASE_PLATE, D_WASHER_BASE_PLATE, size_hole_base_plate); + } + } + } + } + // leg + color(COLOUR_BEAM_ALUMINIUM) translate([0, 0, -R_base_plate[2] - h_leg / 2]) cylinder(h_leg, D_AXLE_REAR / 2, D_AXLE_REAR / 2, center = true); // cube([t_beam, t_beam, h_leg], center = true); + // bracket axle-side + translate([0, 0, -Z_OFFSET_BED_TO_AXLE]) rotate([0, -90, 0]) tube_clamp_round_tee_long_104(D_AXLE_REAR); // cylinder(R_fixing[2], R_fixing[0] / 2, R_fixing[0] / 2, center = true); + } + // Shopping + // bracket at bed + // bracket bolt + // echo(str("Base plate fastening washers: Washer Φ", D_WASHER_BASE_PLATE, "mm x ", T_WASHER_BASE_PLATE, "mm - x4")); // Base plate fastening washers + echo(str("Leg: Round Aluminium bar Φ", D_AXLE_REAR, "mm x ", h_leg, "mm - x1")); + // bracket at axle +} + +rear_leg_fixing(); + diff --git a/models/rear_drive/rear_wheel_fastener.scad b/models/rear_drive/rear_wheel_fastener.scad new file mode 100644 index 0000000..2ec3401 --- /dev/null +++ b/models/rear_drive/rear_wheel_fastener.scad @@ -0,0 +1,28 @@ + +include <../../config.scad>; +use <../common/metric_bolt.scad>; +use <../common/washer.scad>; + +module rear_wheel_fastener() { + echo("Rear wheel fastener:"); + height_bolt_head = get_metric_bolt_head_height(SIZE_BOLT_REAR_WHEEL_POSITIONING); + count_washers_each_end = 7; + L_bolt = D_AXLE_REAR + 2 * height_bolt_head + 2 * T_WASHER_BOLT_REAR_WHEEL_POSITIONING * count_washers_each_end + L_BOLT_EXTENSION; + union() { + // bolt + translate([0, 0, -L_BOLT_EXTENSION / 2]) metric_bolt(SIZE_BOLT_REAR_WHEEL_POSITIONING, L_bolt, true, L_BOLT_EXTENSION); + for (index_side_bolt = [0 : 1 : 1]) { + mirror([0, 0, index_side_bolt]) { + // washer + for (index_washer = [0 : 1 : max(0, count_washers_each_end - 1)]) { + translate([0, 0, D_AXLE_REAR / 2 + T_WASHER_BOLT_REAR_WHEEL_POSITIONING * (index_washer + 1/2)]) washer(T_WASHER_BOLT_REAR_WHEEL_POSITIONING, D_WASHER_BOLT_REAR_WHEEL_POSITIONING, SIZE_BOLT_REAR_WHEEL_POSITIONING); + } + } + } + } + // Shopping + // bolt + // echo(str("Bolt washer: Washer Φ", D_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm x ", T_WASHER_BOLT_REAR_WHEEL_POSITIONING, "mm - x", 2 * count_washers_each_end)); // Rear wheel fastener bolt washers +} + +rear_wheel_fastener(); diff --git a/models/top_crate/fixing_top_crate_shaft.scad b/models/top_crate/fixing_top_crate_shaft.scad new file mode 100644 index 0000000..1abadde --- /dev/null +++ b/models/top_crate/fixing_top_crate_shaft.scad @@ -0,0 +1,30 @@ +include <../../config.scad>; +use <../common/metric_bolt_functions.scad>; +use <../common/metric_nut.scad>; +use <../common/washer.scad>; + +module fixing_top_crate_shaft() { + echo("Fixing top crate shaft:"); + h_nut = get_metric_bolt_head_height(D_SHAFT_TOP_CRATE); + union() { + // shaft (threaded rod) + color(COLOUR_ROD_THREADED) translate([0, 0, -R_BED[2] / 2 - T_WASHER_SHAFT_TOP_CRATE * COUNT_WASHERS_SHAFT_TOP_CRATE_EACH_END - h_nut]) cylinder(L_SHAFT_TOP_CRATE, D_SHAFT_TOP_CRATE / 2, D_SHAFT_TOP_CRATE / 2, center = false); + // fixing + for (index_side_bed_z = [0 : 1 : 1]) { + mirror([0, 0, index_side_bed_z]) { + // washers + for (index_washer = [0 : 1 : COUNT_WASHERS_SHAFT_TOP_CRATE_EACH_END]) { + translate([0, 0, R_BED[2] / 2 + T_WASHER_SHAFT_TOP_CRATE * index_washer]) washer(T_WASHER_SHAFT_TOP_CRATE, D_WASHER_SHAFT_TOP_CRATE, D_SHAFT_TOP_CRATE, centre = false); + } + // nuts + translate([0, 0, R_BED[2] / 2 + T_WASHER_SHAFT_TOP_CRATE * COUNT_WASHERS_SHAFT_TOP_CRATE_EACH_END]) metric_nut(D_SHAFT_TOP_CRATE, centre = false); + } + } + } + // Shopping + echo(str("Top crate shaft: Threaded Steel rod M", D_SHAFT_TOP_CRATE, " x ", L_SHAFT_TOP_CRATE, "mm - x1")); + // Fixing washers + // Fixing nuts +} + +fixing_top_crate_shaft(); \ No newline at end of file diff --git a/models/top_crate/top_crate_shaft_assembly.scad b/models/top_crate/top_crate_shaft_assembly.scad new file mode 100644 index 0000000..4b8b922 --- /dev/null +++ b/models/top_crate/top_crate_shaft_assembly.scad @@ -0,0 +1,29 @@ +include <../../config.scad>; +use <./fixing_top_crate_shaft.scad>; + +module top_crate_shaft_assembly() { + echo("Top crate shaft assembly:"); + union() { + // shafts along y + for (index_side_x = [0 : 1 : 1]) { + mirror([index_side_x, 0, 0]) { + translate([R_BED[0] / 2 - D_WASHER_SHAFT_TOP_CRATE / 2, 0, 0]) for (index_shaft_y = [0 : 1 : COUNT_SHAFTS_TOP_CRATE_Y - 1]) { + translate([0, -R_BED[1] / 2 + D_WASHER_SHAFT_TOP_CRATE / 2 + index_shaft_y * (R_BED[1] - D_WASHER_SHAFT_TOP_CRATE) / (COUNT_SHAFTS_TOP_CRATE_Y - 1), 0]) fixing_top_crate_shaft(); + } + } + } + // shafts along x + if (COUNT_SHAFTS_TOP_CRATE_X > 2) { + for (index_side_y = [0 : 1 : 1]) { + mirror([0, index_side_y, 0]) { + translate([0, R_BED[1] / 2 - D_WASHER_SHAFT_TOP_CRATE / 2, 0]) for (index_shaft_x = [1 : 1 : COUNT_SHAFTS_TOP_CRATE_X - 2]) { + translate([-R_BED[0] / 2 + D_WASHER_SHAFT_TOP_CRATE / 2 + index_shaft_x * (R_BED[0] - D_WASHER_SHAFT_TOP_CRATE) / (COUNT_SHAFTS_TOP_CRATE_X - 1), 0, 0]) fixing_top_crate_shaft(); + } + } + } + } + } + // Shopping +} + +top_crate_shaft_assembly(); \ No newline at end of file