Initial commit

This commit is contained in:
2025-02-25 12:13:03 +00:00
parent 3476f37b84
commit 659001351e
52 changed files with 1542 additions and 0 deletions

157
config.scad Normal file
View File

@@ -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");
*/

1
docs/.~lock.UBOM.ods# Normal file
View File

@@ -0,0 +1 @@
,teddy,lord-T-1024,20.02.2025 13:01,file:///home/teddy/.config/libreoffice/4;

BIN
docs/UBOM.ods Normal file

Binary file not shown.

7
main.json Normal file
View File

@@ -0,0 +1,7 @@
{
"parameterSets": {
"ANGLE": ""
},
"parameterSets": "",
"fileFormatVersion": "1"
}

22
main.scad Normal file
View File

@@ -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
*/

41
models/bed/bed.scad Normal file
View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);

View File

@@ -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)

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -0,0 +1,7 @@
{
"parameterSets": {
"ANGLE": ""
},
"parameterSets": "",
"fileFormatVersion": "1"
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
;

View File

@@ -0,0 +1,7 @@
{
"parameterSets": {
"ANGLE": ""
},
"parameterSets": "",
"fileFormatVersion": "1"
}

View File

@@ -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);

View File

@@ -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

View File

@@ -0,0 +1,7 @@
{
"parameterSets": {
"ANGLE": ""
},
"parameterSets": "",
"fileFormatVersion": "1"
}

15
models/common/washer.scad Normal file
View File

@@ -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);

12
models/common/wheel.scad Normal file
View File

@@ -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");
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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
;

View File

@@ -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);

View File

@@ -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
;

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();