mirror of
https://github.com/nophead/Mendel90.git
synced 2025-08-30 16:30:08 +02:00
Various design improvements:
The X ends now have much stronger bar clamps and the nut traps are moved to the top for less lead screw wobble. X motor bracket now has two screws in the front of the motor and one at the back allowing it to be much smaller. The Z couplings now use neoprene tubing instead of PVC and close completely. The tube end caps are now nut traps to allow the tube to just have a single hole. The rear fixing blocks now have the central screw going the other way so have onyl two nut traps. The extruder springs now have washers to increase the default tension. The spool holder now has the washers on the outside of the spool. The carriage fan bracket has been strengthened. The fan duct now has a hole to cool the top of the hot end. Small printed parts now aggregated onto one build plate. Hole in the Wade's big gear increased slightly. The heat shield is now 5 layers of cardboard instead of foil and an air gap. Bom generation and exploded view mode can now be enabled on the command line. The assembly diagrams for the manual are now built from the command line. Some mods for the Huxley version but still broken. Fixed the long ATX bracket holes ending coincident with the face. Can now have non square print beds. Cap screws now shown silver instead of black as now all BZP. Now shows the motor wire position. % operator no longer used for transparency as OpenScad behaviour has changed. Now includes the Skeinforge and Pronteface configurations on the SD card of priovided in the kit.
This commit is contained in:
@@ -63,7 +63,7 @@ module atx_long_bracket_stl() {
|
||||
for(end = [-1, 1])
|
||||
translate([end * (length / 2 - psu_hole_x), 0, (end == -1 ? psu_hole_z : psu_hole_z2) - thickness / 2])
|
||||
rotate([90, 0, 0])
|
||||
teardrop_plus(r = screw_clearance_radius(No632_pan_screw), h = 100);
|
||||
teardrop_plus(r = screw_clearance_radius(No632_pan_screw), h = 100, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -15,14 +15,14 @@ module bed_assembly(y = 0) {
|
||||
//
|
||||
// Screws pillars and washers
|
||||
//
|
||||
for(x = [-bed_holes / 2, bed_holes /2]) {
|
||||
translate([x, bed_holes / 2, 0])
|
||||
for(x = [-bed_holes[0] / 2, bed_holes[0] / 2]) {
|
||||
translate([x, bed_holes[1] / 2, 0])
|
||||
washer(M3_washer);
|
||||
|
||||
translate([x, -bed_holes / 2 - washer_diameter(M3_washer) / 2 - 3 / 2, 0])
|
||||
translate([x, -bed_holes[1] / 2 - washer_diameter(M3_washer) / 2 - 3 / 2, 0])
|
||||
washer(M3_washer);
|
||||
|
||||
for(y = [-bed_holes / 2, bed_holes /2])
|
||||
for(y = [-bed_holes[1] / 2, bed_holes[1] /2])
|
||||
translate([x, y, washer_thickness(M3_washer)]) {
|
||||
hex_pillar(bed_pillars);
|
||||
|
||||
@@ -34,7 +34,7 @@ module bed_assembly(y = 0) {
|
||||
//
|
||||
// Mark the origin
|
||||
//
|
||||
translate([0, 0, pillar_height(bed_pillars) + pcb_thickness + sheet_thickness(bed_glass)])
|
||||
*translate([0, 0, pillar_height(bed_pillars) + pcb_thickness + sheet_thickness(bed_glass)])
|
||||
color("green")
|
||||
render()
|
||||
sphere();
|
||||
|
@@ -34,7 +34,7 @@ brass_nut_color = brass;
|
||||
soft_washer_color = grey20;
|
||||
hard_washer_color = grey80;
|
||||
star_washer_color = brass;
|
||||
screw_cap_color = grey20;
|
||||
screw_cap_color = grey80;
|
||||
screw_grub_color = grey20;
|
||||
screw_hex_color = grey80;
|
||||
screw_pan_color = brass;
|
||||
|
@@ -7,8 +7,8 @@
|
||||
//
|
||||
// Configuration file
|
||||
//
|
||||
bom = 2; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
|
||||
exploded = 0; // 1 for exploded view
|
||||
bom = $bom == undef ? 0: $bom; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
|
||||
exploded = $exploded == undef ? 0 : $exploded; // 1 for exploded view
|
||||
|
||||
show_jigs = true; // show printed jigs required to build the machine
|
||||
show_support = true; // show support structures, must be set when generating STLs
|
||||
@@ -98,6 +98,9 @@ thermistor_wires_hole_radius = wire_hole_radius(thermistor_wires);
|
||||
cnc_sheets = false; // If sheets are cut by CNC we can use slots, etc instead of just round holes
|
||||
base_nuts = false; // Need something under the base if using nuts
|
||||
pulley_type = T5x8_plastic_pulley;
|
||||
clip_handles = true;
|
||||
include_fan = false;
|
||||
part_fan = fan60x15;
|
||||
include <machine.scad> // this file is generated from the command line parameter to include one of the machine configs
|
||||
|
||||
screw_clearance_radius = screw_clearance_radius(cap_screw);
|
||||
@@ -115,7 +118,7 @@ axis_end_clearance = cnc_sheets ? 1 : 2;// how close we get to the end of an axi
|
||||
limit_switch_offset = 1; // the over travel to reach the limit switch
|
||||
X_carriage_clearance = 2; // how close the X carriage is to the XZ plane
|
||||
// how close the Y carriage is to the window in the XZ plane
|
||||
Y_carriage_clearance = 2 + bulldog_handle_length(small_bulldog) - (Y_carriage_width - bed_width) / 2;
|
||||
Y_carriage_clearance = 2 + (clip_handles ? (bulldog_handle_length(small_bulldog) - (Y_carriage_width - bed_width) / 2) : 0);
|
||||
Z_clearance = 10; // How close the top of the object gets to the gantry
|
||||
belt_clearance = 0.2; // clearance of belt clamp slots
|
||||
|
||||
|
@@ -28,7 +28,7 @@ bed_width = 214;
|
||||
bed_pillars = M3x20_pillar;
|
||||
bed_glass = glass2;
|
||||
bed_thickness = pcb_thickness + sheet_thickness(bed_glass); // PCB heater plus glass sheet
|
||||
bed_holes = 209;
|
||||
bed_holes = [209, 209];
|
||||
|
||||
base = DiBond; // Sheet material used for the base. Needs to be thick enough to screw into.
|
||||
base_corners = 25;
|
||||
@@ -58,8 +58,8 @@ Y_belt = T2p5x6;
|
||||
motor_shaft = 5;
|
||||
Z_screw_dia = 6; // Studding for Z axis
|
||||
|
||||
Y_carriage_depth = bed_holes + 7;
|
||||
Y_carriage_width = bed_holes + 7;
|
||||
Y_carriage_depth = bed_holes[1] + 7;
|
||||
Y_carriage_width = bed_holes[0] + 7;
|
||||
|
||||
Z_nut_radius = M6_nut_radius;
|
||||
Z_nut_depth = M6_nut_depth;
|
||||
|
@@ -17,18 +17,18 @@ X_motor = NEMA14;
|
||||
Y_motor = NEMA14;
|
||||
Z_motor = NEMA14;
|
||||
|
||||
hot_end = JHeadMk4;
|
||||
hot_end = JHeadMk5;
|
||||
|
||||
X_travel = 150;
|
||||
Y_travel = 150;
|
||||
Z_travel = 150;
|
||||
|
||||
bed_depth = 150 + 14;
|
||||
bed_width = 150 + 14;
|
||||
bed_depth = 164;
|
||||
bed_width = 114;
|
||||
bed_pillars = M3x20_pillar;
|
||||
bed_glass = glass2;
|
||||
bed_thickness = pcb_thickness + sheet_thickness(bed_glass); // PCB heater plus glass sheet
|
||||
bed_holes = bed_width - 5;
|
||||
bed_holes = [bed_width - 2 * 2.54, bed_depth - 2 * 2.54];
|
||||
|
||||
base = DiBond; // Sheet material used for the base. Needs to be thick enough to screw into.
|
||||
base_corners = 25;
|
||||
@@ -39,26 +39,31 @@ frame_corners = 25;
|
||||
frame_nuts = true;
|
||||
|
||||
case_fan = fan80x38;
|
||||
part_fan = fan40x11;
|
||||
|
||||
psu = External;
|
||||
controller = Melzi;
|
||||
|
||||
spool = spool_200x55;
|
||||
bottom_limit_switch = false;
|
||||
top_limit_switch = true;
|
||||
include_fan = true;
|
||||
|
||||
clip_handles = false;
|
||||
single_piece_frame = true;
|
||||
stays_from_window = false;
|
||||
cnc_sheets = true; // If sheets are cut by CNC we can use slots, etc instead of just round holes
|
||||
pulley_type = T2p5x16_metal_pulley;
|
||||
|
||||
Y_carriage = DiBond;
|
||||
|
||||
X_belt = T2p5x6;
|
||||
Y_belt = T2p5x6;
|
||||
motor_shaft = 5;
|
||||
Z_screw_dia = 6; // Studding for Z axis
|
||||
Z_screw_dia = 5; // Studding for Z axis
|
||||
|
||||
Y_carriage_depth = bed_holes + 7;
|
||||
Y_carriage_width = bed_holes + 7;
|
||||
Y_carriage_depth = bed_holes[1] + 7;
|
||||
Y_carriage_width = bed_holes[1] + 7;
|
||||
|
||||
Z_nut_radius = M6_nut_radius;
|
||||
Z_nut_depth = M6_nut_depth;
|
||||
|
@@ -28,7 +28,7 @@ bed_width = 214;
|
||||
bed_pillars = M3x20_pillar;
|
||||
bed_glass = glass2;
|
||||
bed_thickness = pcb_thickness + sheet_thickness(bed_glass); // PCB heater plus glass sheet
|
||||
bed_holes = 209;
|
||||
bed_holes = [209, 209];
|
||||
|
||||
base = PMMA10; // Sheet material used for the base. Needs to be thick enough to screw into.
|
||||
base_corners = 25;
|
||||
@@ -58,8 +58,8 @@ Y_belt = T5x6;
|
||||
motor_shaft = 5;
|
||||
Z_screw_dia = 8; // Studding for Z axis
|
||||
|
||||
Y_carriage_depth = bed_holes + 8;
|
||||
Y_carriage_width = bed_holes + 8;
|
||||
Y_carriage_depth = bed_holes[1] + 8;
|
||||
Y_carriage_width = bed_holes[0] + 8;
|
||||
|
||||
Z_nut_radius = M8_nut_radius;
|
||||
Z_nut_depth = M8_nut_depth;
|
||||
|
@@ -28,7 +28,7 @@ bed_width = 214;
|
||||
bed_pillars = M3x20_pillar;
|
||||
bed_glass = glass2;
|
||||
bed_thickness = pcb_thickness + sheet_thickness(bed_glass); // PCB heater plus glass sheet
|
||||
bed_holes = 209;
|
||||
bed_holes = [209, 209];
|
||||
|
||||
base = MDF12;
|
||||
base_corners = 0;
|
||||
@@ -57,8 +57,8 @@ Y_belt = T5x6;
|
||||
motor_shaft = 5;
|
||||
Z_screw_dia = 8; // Studding for Z axis
|
||||
|
||||
Y_carriage_depth = bed_holes + 8;
|
||||
Y_carriage_width = bed_holes + 8;
|
||||
Y_carriage_depth = bed_holes[1] + 8;
|
||||
Y_carriage_width = bed_holes[0] + 8;
|
||||
|
||||
Z_nut_radius = M8_nut_radius;
|
||||
Z_nut_depth = M8_nut_depth;
|
||||
|
@@ -22,8 +22,32 @@ module slot(h, r, l, center = true)
|
||||
circle(r = r, center = true);
|
||||
}
|
||||
|
||||
module hole_support(r, h, max_r = 999) {
|
||||
n = sides(r);
|
||||
cr = corrected_radius(r, n);
|
||||
ir = min(cr, max_r - 2.25 * filament_width);
|
||||
or = ir + 2 * filament_width;
|
||||
difference() {
|
||||
cylinder(r = or, h = h, $fn = n);
|
||||
translate([0, 0, -1])
|
||||
cylinder(r = ir, h = h + 2, $fn = n);
|
||||
}
|
||||
}
|
||||
|
||||
module nut_trap_support(h, r, r2 = 0) {
|
||||
ir = r;
|
||||
ir2 = r2 ? r2 : r;
|
||||
or = ir + 2 * filament_width;
|
||||
or2 = ir2 + 2 * filament_width;
|
||||
difference() {
|
||||
cylinder(r2 = or, r1 = or2, h = h, $fn = 6);
|
||||
translate([0, 0, -1])
|
||||
cylinder(r2 = ir, r1 = or2, h = h + 2, $fn = 6);
|
||||
}
|
||||
}
|
||||
|
||||
module nut_trap(screw_r, nut_r, depth, horizontal = false, supported = false) {
|
||||
union() {
|
||||
render(convexity = 5) union() {
|
||||
if(horizontal) {
|
||||
if(screw_r)
|
||||
teardrop_plus(r = screw_r, h = 200, center = true);
|
||||
@@ -141,22 +165,6 @@ module explode(v, offset = [0,0,0]) {
|
||||
child();
|
||||
}
|
||||
//
|
||||
// Same again as cant appear twice in the tree
|
||||
//
|
||||
module explode2(v, offset = [0,0,0]) {
|
||||
if(exploded) {
|
||||
translate(v)
|
||||
child();
|
||||
render() hull() {
|
||||
sphere(0.2);
|
||||
translate(v + offset)
|
||||
sphere(0.2);
|
||||
}
|
||||
}
|
||||
else
|
||||
child();
|
||||
}
|
||||
//
|
||||
// Restore the view point
|
||||
//
|
||||
module view(t,r,d = 1000)
|
||||
|
@@ -44,10 +44,10 @@ module fixing_block_h_holes(h)
|
||||
child();
|
||||
|
||||
|
||||
module fixing_block(front) {
|
||||
module fixing_block(upper, rear) {
|
||||
same = screw_clearance_radius(base_screw) == screw_clearance_radius(frame_screw) && (!cnc_sheets || (base_nuts == frame_nuts));
|
||||
stl((front && !same) ? "front_fixing_block" : "fixing_block");
|
||||
v_screw = front ? frame_screw : base_screw;
|
||||
stl((upper && !same) ? "upper_fixing_block" : (base_nuts && rear) ? "rear_fixing_block" : "fixing_block");
|
||||
v_screw = upper ? frame_screw : base_screw;
|
||||
|
||||
difference() {
|
||||
translate([-(width - 2 * corner_rad) / 2, 0, 0])
|
||||
@@ -66,14 +66,14 @@ module fixing_block(front) {
|
||||
|
||||
|
||||
fixing_block_v_hole(height - counter_bore_depth)
|
||||
if(cnc_sheets && (front? frame_nuts : base_nuts))
|
||||
if((cnc_sheets && (upper? frame_nuts : base_nuts)) && !rear)
|
||||
translate([0, 0, counter_bore_depth])
|
||||
nut_trap(screw_clearance_radius(v_screw), nut_radius(screw_nut(v_screw)), height - thickness);
|
||||
else
|
||||
rotate([0,0,90])
|
||||
union() {
|
||||
slot(h = 100, r = screw_clearance_radius(base_screw), l = slot, center = true);
|
||||
multmatrix(m = [ [1, 0, shear / counter_bore_depth, 0],
|
||||
multmatrix(m = [ [1, 0, (cnc_sheets ? 0 : shear) / counter_bore_depth, 0],
|
||||
[0, 1, 0, 0],
|
||||
[0, 0, 1, 0],
|
||||
[0, 0, 0, 1] ])
|
||||
@@ -97,17 +97,28 @@ module fixing_block(front) {
|
||||
}
|
||||
}
|
||||
|
||||
module fixing_block_stl() fixing_block(false);
|
||||
module fixing_block_stl() fixing_block(false, false);
|
||||
|
||||
module front_fixing_block_stl() fixing_block(true);
|
||||
module upper_fixing_block_stl() fixing_block(true, false);
|
||||
|
||||
module rear_fixing_block_stl() fixing_block(false, true);
|
||||
|
||||
module fixing_block_assembly(upper = false, rear = false) {
|
||||
t = tube_thickness(AL_square_tube);
|
||||
|
||||
color(fixing_block_color) render() fixing_block(upper, rear);
|
||||
|
||||
module fixing_block_assembly(front = false) {
|
||||
color(fixing_block_color) render() fixing_block(front);
|
||||
fixing_block_v_hole(height - counter_bore_depth)
|
||||
if(front)
|
||||
if(upper)
|
||||
frame_screw(thickness);
|
||||
else
|
||||
base_screw(thickness);
|
||||
if(base_nuts && rear)
|
||||
translate([0, 0, -sheet_thickness(base) - thickness - t])
|
||||
rotate([180, 0, 0])
|
||||
base_screw(thickness + t);
|
||||
else
|
||||
base_screw(thickness);
|
||||
|
||||
fixing_block_h_holes(depth - counter_bore_depth)
|
||||
frame_screw(thickness);
|
||||
}
|
||||
@@ -118,9 +129,9 @@ module fixing_blocks_stl()
|
||||
translate([(width + 2) * row, (depth + 2) * col, 0])
|
||||
rotate([0, 0, col ? col * 180 : 180])
|
||||
translate([0, -depth / 2, 0])
|
||||
fixing_block(col > 2);
|
||||
fixing_block(col > 2, col == 0);
|
||||
|
||||
if(1)
|
||||
if(0)
|
||||
fixing_blocks_stl();
|
||||
else
|
||||
fixing_block_assembly();
|
||||
|
203
scad/main.scad
203
scad/main.scad
@@ -79,17 +79,18 @@ module x_motor_assembly() {
|
||||
mirror([1,0,0])
|
||||
x_end_assembly(true);
|
||||
|
||||
translate([-x_motor_offset(),
|
||||
gantry_setback - sheet_thickness(frame) / 2 + ribbon_clamp_slot_depth() - cable_strip_thickness,
|
||||
ribbon_clamp_z - (Z + Z0) + ribbon_clamp_width(frame_screw) / 2])
|
||||
rotate([0, -90, 180])
|
||||
cable_strip(
|
||||
x_end_ways,
|
||||
z_cable_strip_depth,
|
||||
z_cable_travel,
|
||||
Z + Z0 + x_end_ribbon_clamp_z() - ribbon_clamp_z,
|
||||
z_cable_extra
|
||||
);
|
||||
if(!exploded)
|
||||
translate([-x_motor_offset(),
|
||||
gantry_setback - sheet_thickness(frame) / 2 + ribbon_clamp_slot_depth() - cable_strip_thickness,
|
||||
ribbon_clamp_z - (Z + Z0) + ribbon_clamp_width(frame_screw) / 2])
|
||||
rotate([0, -90, 180])
|
||||
cable_strip(
|
||||
x_end_ways,
|
||||
z_cable_strip_depth,
|
||||
z_cable_travel,
|
||||
Z + Z0 + x_end_ribbon_clamp_z() - ribbon_clamp_z,
|
||||
z_cable_extra
|
||||
);
|
||||
|
||||
elliptical_cable_strip(
|
||||
extruder_ways,
|
||||
@@ -106,7 +107,7 @@ module x_motor_assembly() {
|
||||
10 // Width of D type
|
||||
+ 12 // To back of shell
|
||||
+ elliptical_cable_strip_length(x_end_extruder_ribbon_clamp_offset(), pmax)
|
||||
+ 60 // Across the X motor bracket
|
||||
+ 68 // Across the X motor bracket
|
||||
+ cable_strip_length(z_cable_strip_depth, z_cable_travel, z_cable_extra)
|
||||
+ 5 // Through the slot
|
||||
+ 180 // Down back of gantry
|
||||
@@ -122,8 +123,8 @@ Z_motor_length = NEMA_length(Z_motor);
|
||||
Z_bar_length = height - Z_motor_length - base_clearance;
|
||||
|
||||
module z_end(motor_end) {
|
||||
Z_screw_length = Z0 + Z_travel + anti_backlash_height() + axis_end_clearance
|
||||
- (Z_motor_length + NEMA_shaft_length(Z_motor) + 2);
|
||||
Z_screw_length = Z0 + Z_travel + x_end_height() + axis_end_clearance
|
||||
- (Z_motor_length + NEMA_shaft_length(Z_motor) + z_coupling_gap());
|
||||
|
||||
if(!motor_end && bottom_limit_switch)
|
||||
translate([-z_bar_offset(), gantry_setback, Z0 - x_end_thickness() / 2])
|
||||
@@ -133,7 +134,7 @@ module z_end(motor_end) {
|
||||
|
||||
z_motor_assembly(gantry_setback, motor_end);
|
||||
|
||||
translate([0, 0, NEMA_shaft_length(Z_motor) + 2 + Z_screw_length / 2]) {
|
||||
translate([0, 0, NEMA_shaft_length(Z_motor) + z_coupling_gap() + Z_screw_length / 2]) {
|
||||
studding(d = Z_screw_dia, l = Z_screw_length);
|
||||
|
||||
translate([0, 0, -Z_screw_length / 2 + z_coupling_length() / 2 - 1])
|
||||
@@ -143,7 +144,7 @@ module z_end(motor_end) {
|
||||
//
|
||||
// lead nut
|
||||
//
|
||||
translate([0, 0, Z + Z0 - x_end_thickness() / 2 + nut_thickness(Z_nut) - Z_motor_length])
|
||||
translate([0, 0, Z + Z0 + x_end_z_nut_z() + nut_thickness(Z_nut) - Z_motor_length])
|
||||
rotate([180, 0, 0])
|
||||
nut(Z_nut, brass = true);
|
||||
|
||||
@@ -269,44 +270,51 @@ module y_carriage() {
|
||||
y_belt_anchor_holes()
|
||||
cylinder(r = M3_clearance_radius, h = 100, center = true);
|
||||
|
||||
for(x = [-bed_holes / 2, bed_holes / 2])
|
||||
for(y = [-bed_holes / 2, bed_holes / 2])
|
||||
for(x = [-bed_holes[0] / 2, bed_holes[0] / 2])
|
||||
for(y = [-bed_holes[1] / 2, bed_holes[1] / 2])
|
||||
translate([x, y, 0])
|
||||
cylinder(r = 2.5/2, h = 100, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
module y_heatshield() {
|
||||
layers = pillar_height(bed_pillars) / sheet_thickness(Cardboard);
|
||||
width = Y_carriage_width - 2 * bar_clamp_tab;
|
||||
difference() {
|
||||
group() {
|
||||
difference() {
|
||||
sheet(Cardboard, width, Y_carriage_depth);
|
||||
for(i = [0 : layers - 1])
|
||||
translate([0, 0, (sheet_thickness(Cardboard) + exploded * 50) * i]) {
|
||||
assign(k = ((i % 2) ? 0.9 : 1), c = sheet_colour(Cardboard))
|
||||
color([c[0] * k, c[1] * k, c[2] * k, c[3]])
|
||||
difference() {
|
||||
sheet(Cardboard, width, Y_carriage_depth);
|
||||
|
||||
translate([Y_bar_spacing / 2, 0, 0])
|
||||
rotate([0,180,0])
|
||||
bearing_mount_holes()
|
||||
cube([10,10, 100], center = true);
|
||||
if(i == 0) {
|
||||
translate([Y_bar_spacing / 2, 0, 0])
|
||||
rotate([0,180,0])
|
||||
bearing_mount_holes()
|
||||
cube([10,10, 100], center = true);
|
||||
|
||||
for(end = [-1, 1])
|
||||
translate([-Y_bar_spacing / 2, end * (Y_carriage_depth / 2 - Y_bearing_inset), 0])
|
||||
rotate([0,180,0])
|
||||
bearing_mount_holes()
|
||||
cube([10,10, 100], center = true);
|
||||
for(end = [-1, 1])
|
||||
translate([-Y_bar_spacing / 2, end * (Y_carriage_depth / 2 - Y_bearing_inset), 0])
|
||||
rotate([0,180,0])
|
||||
bearing_mount_holes()
|
||||
cube([10, 10, 100], center = true);
|
||||
|
||||
for(end = [[Y_belt_anchor_m, 0], [Y_belt_anchor_i, 180]])
|
||||
translate([Y_belt_line - X_origin, end[0], 0])
|
||||
rotate([0, 180, end[1]])
|
||||
hull()
|
||||
y_belt_anchor_holes()
|
||||
cube([10, 10, 100],center =true);
|
||||
}
|
||||
translate([0, 0, sheet_thickness(Cardboard) / 2])
|
||||
taped_area(FoilTape, 50, width, Y_carriage_depth, 5);
|
||||
}
|
||||
translate([0, Y_carriage_depth / 2, 0])
|
||||
cube([ribbon_clamp_length(bed_ways, cap_screw), 70, 100], center = true);
|
||||
}
|
||||
for(end = [[Y_belt_anchor_m, 0], [Y_belt_anchor_i, 180]])
|
||||
translate([Y_belt_line - X_origin, end[0], 0])
|
||||
rotate([0, 180, end[1]])
|
||||
hull()
|
||||
y_belt_anchor_holes()
|
||||
cube([10, 10, 100],center =true);
|
||||
}
|
||||
|
||||
if(i == layers - 1)
|
||||
translate([0, Y_carriage_depth / 2, 0])
|
||||
cube([15, 180, 100], center = true);
|
||||
|
||||
translate([0, Y_carriage_depth / 2, 0])
|
||||
cube([ribbon_clamp_length(bed_ways, cap_screw) + 5, 70, 100], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -343,7 +351,7 @@ module y_carriage_assembly(solid = true) {
|
||||
if(solid)
|
||||
y_carriage();
|
||||
else
|
||||
%y_carriage();
|
||||
%color([0.5,0.5,0.5,0.5]) y_carriage();
|
||||
|
||||
end("y_carriage_assembly");
|
||||
}
|
||||
@@ -473,12 +481,12 @@ module place_cable_clips(holes = false) {
|
||||
//
|
||||
window_corner_rad = 5;
|
||||
|
||||
module fixing_blocks(upper = false, holes = false) {
|
||||
module fixing_blocks(holes = false) {
|
||||
w = fixing_block_width();
|
||||
h = fixing_block_height();
|
||||
t = sheet_thickness(frame);
|
||||
|
||||
if(upper) { // all screws into frame
|
||||
assign($upper = true) { // all screws into frame
|
||||
translate([left_stay_x + t / 2, gantry_Y + t, stay_height - base_clearance - h - w / 2]) // top
|
||||
rotate([0,-90,-90])
|
||||
child();
|
||||
@@ -495,49 +503,50 @@ module fixing_blocks(upper = false, holes = false) {
|
||||
rotate([0,90, 90])
|
||||
child();
|
||||
}
|
||||
else { // one screw in the base
|
||||
for(x = [-base_width/2 + base_clearance + w /2,
|
||||
base_width/2 - base_clearance - w /2,
|
||||
-base_width/2 - base_clearance - w /2 + left_w,
|
||||
right_stay_x + sheet_thickness(frame) / 2 + w / 2 + base_clearance])
|
||||
translate([x, gantry_Y + t, 0])
|
||||
child();
|
||||
|
||||
translate([left_stay_x + t / 2, base_depth / 2 - base_clearance - w / 2, 0]) // back
|
||||
rotate([0, 0,-90])
|
||||
child();
|
||||
|
||||
translate([right_stay_x - t / 2, base_depth / 2 - base_clearance - w / 2, 0]) // back
|
||||
rotate([0,0, 90])
|
||||
child();
|
||||
|
||||
// extra holes for bars
|
||||
if(holes && base_nuts) {
|
||||
translate([left_stay_x + t / 2, -base_depth / 2 + base_clearance + w / 2, 0]) // front
|
||||
assign($upper = false) { // one screw in the base
|
||||
assign($rear = true) {
|
||||
translate([left_stay_x + t / 2, base_depth / 2 - base_clearance - w / 2, 0]) // back
|
||||
rotate([0, 0,-90])
|
||||
child();
|
||||
|
||||
translate([right_stay_x - t / 2, -base_depth / 2 + base_clearance + w / 2, 0]) // front
|
||||
rotate([0,0, 90])
|
||||
translate([right_stay_x - t / 2, base_depth / 2 - base_clearance - w / 2, 0]) // back
|
||||
rotate([0, 0, 90])
|
||||
child();
|
||||
}
|
||||
|
||||
assign($rear = false) {
|
||||
for(x = [-base_width/2 + base_clearance + w /2,
|
||||
base_width/2 - base_clearance - w /2,
|
||||
-base_width/2 - base_clearance - w /2 + left_w,
|
||||
right_stay_x + sheet_thickness(frame) / 2 + w / 2 + base_clearance])
|
||||
translate([x, gantry_Y + t, 0])
|
||||
child();
|
||||
|
||||
|
||||
// extra holes for bars
|
||||
if(holes && base_nuts) {
|
||||
translate([left_stay_x + t / 2, -base_depth / 2 + base_clearance + w / 2, 0]) // front
|
||||
rotate([0, 0,-90])
|
||||
child();
|
||||
|
||||
translate([right_stay_x - t / 2, -base_depth / 2 + base_clearance + w / 2, 0]) // front
|
||||
rotate([0,0, 90])
|
||||
child();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module fixing_block_holes() {
|
||||
fixing_blocks(upper = false, holes = true)
|
||||
fixing_blocks(holes = true)
|
||||
group() {
|
||||
fixing_block_v_hole(0)
|
||||
base_screw_hole();
|
||||
fixing_block_h_holes(0)
|
||||
frame_screw_hole();
|
||||
}
|
||||
if($upper)
|
||||
frame_screw_hole();
|
||||
else
|
||||
base_screw_hole();
|
||||
|
||||
fixing_blocks(upper = true, holes = true)
|
||||
group() {
|
||||
fixing_block_v_hole(0)
|
||||
frame_screw_hole();
|
||||
fixing_block_h_holes(0)
|
||||
frame_screw_hole();
|
||||
}
|
||||
@@ -590,8 +599,6 @@ module frame_base() {
|
||||
translate([Y_cable_clip_x - cable_clip_offset(base_screw, endstop_wires),
|
||||
Y_motor_stay_hole_y + motor_wires_hole_radius + hole_edge_clearance + endstop_wires_hole_radius, 0])
|
||||
wire_hole(endstop_wires_hole_radius);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -767,7 +774,7 @@ module bed_fan_assembly() {
|
||||
translate([left_stay_x, fan_y, fan_z])
|
||||
rotate([0, -90, 0]) {
|
||||
translate([0, 0, -(sheet_thickness(frame) + fan_depth(case_fan)) / 2])
|
||||
fan_assembly(case_fan, sheet_thickness(frame) + fan_guard_thickness());
|
||||
fan_assembly(case_fan, sheet_thickness(frame) + fan_guard_thickness(), include_fan);
|
||||
|
||||
translate([0, 0, sheet_thickness(frame) / 2])
|
||||
color(fan_guard_color) render() fan_guard(case_fan);
|
||||
@@ -807,10 +814,6 @@ module psu_assembly() {
|
||||
else
|
||||
screw_and_washer(frame_screw, frame_screw_length, true);
|
||||
}
|
||||
if(exploded)
|
||||
%psu(psu);
|
||||
else
|
||||
psu(psu);
|
||||
if(atx_psu(psu))
|
||||
rotate([0, 0, 180])
|
||||
atx_bracket_assembly();
|
||||
@@ -819,6 +822,10 @@ module psu_assembly() {
|
||||
translate([-psu_length(psu) / 2, psu_width(psu) / 2, 0])
|
||||
mains_inlet_assembly();
|
||||
|
||||
if(exploded)
|
||||
%color([0.5,0.5,0.5,0.5]) psu(psu);
|
||||
else
|
||||
psu(psu);
|
||||
}
|
||||
end("psu_assembly");
|
||||
}
|
||||
@@ -848,35 +855,15 @@ module frame_assembly(show_gantry = true) {
|
||||
if(base_nuts) {
|
||||
for(side = [ left_stay_x + fixing_block_height() / 2 + sheet_thickness(frame) / 2,
|
||||
right_stay_x - fixing_block_height() / 2 - sheet_thickness(frame) / 2])
|
||||
explode2([0, 0, -4])
|
||||
translate([side, 0, -sheet_thickness(base)]) {
|
||||
color("silver") render() base_tube();
|
||||
|
||||
for(end = [-1, 1])
|
||||
translate([0, end * (base_depth / 2 - AL_tube_inset + tube_cap_base_thickness() + eta), -tube_height(AL_square_tube) / 2])
|
||||
rotate([90, 0, 90 - 90 * end])
|
||||
explode([0, 0, -20])
|
||||
color("lime") render()
|
||||
tube_cap_stl();
|
||||
|
||||
|
||||
translate([0, -(base_depth / 2 - fixing_block_width() / 2 - base_clearance), sheet_thickness(base)]) {
|
||||
nut_and_washer(base_nut, true);
|
||||
|
||||
translate([0, 0, -sheet_thickness(base) - tube_thickness(AL_square_tube)])
|
||||
rotate([180, 0, 0])
|
||||
screw_and_washer(base_screw, base_screw_length);
|
||||
}
|
||||
}
|
||||
explode([0, 0, -15])
|
||||
translate([side, 0, -sheet_thickness(base)])
|
||||
tube_assembly();
|
||||
}
|
||||
|
||||
if(show_gantry) {
|
||||
|
||||
fixing_blocks()
|
||||
fixing_block_assembly();
|
||||
|
||||
fixing_blocks(true)
|
||||
fixing_block_assembly(true);
|
||||
fixing_block_assembly($upper, $rear);
|
||||
|
||||
frame_stay(true, eta);
|
||||
frame_stay(false);
|
||||
|
@@ -142,6 +142,7 @@ module ribbon_clamp_14_33_stl() ribbon_clamp_stl(14, M3_cap_screw);
|
||||
module ribbon_clamp_14_33NB_stl() ribbon_clamp_stl(14, M3_cap_screw, nutty = true, slotted = false);
|
||||
|
||||
module ribbon_clamp_20_33_stl() ribbon_clamp_stl(20, M3_cap_screw);
|
||||
module ribbon_clamp_20_33N_stl() ribbon_clamp_stl(20, M3_cap_screw, nutty = true);
|
||||
module ribbon_clamp_20_40_stl() ribbon_clamp_stl(20, No6_screw);
|
||||
module ribbon_clamp_20_44_stl() ribbon_clamp_stl(20, M4_cap_screw);
|
||||
module ribbon_clamp_20_44N_stl() ribbon_clamp_stl(20, M4_cap_screw, nutty = true);
|
||||
|
@@ -10,30 +10,42 @@ include <conf/config.scad>
|
||||
use <pcb_spacer.scad>
|
||||
use <wade.scad>
|
||||
use <z-screw_pointer.scad>
|
||||
use <tube_cap.scad>
|
||||
|
||||
tube_cap_pitch = (tube_height(AL_square_tube) + 1);
|
||||
use <y-belt-anchor.scad>
|
||||
use <x-carriage.scad>
|
||||
|
||||
module small_bits_stl() {
|
||||
translate([-Z_screw_dia/2 - 6, Z_screw_dia/ 2 + 12, 0])
|
||||
wades_gear_spacer_stl();
|
||||
pcb_spacer_pitch = 9;
|
||||
|
||||
translate([z_screw_pointer_radius() + 1, -z_screw_pointer_radius(), 0])
|
||||
rotate([0, 0, 12])
|
||||
z_screw_pointer_stl();
|
||||
rotate([0, 0, 90]) {
|
||||
translate([-washer_diameter(M8_washer) / 2, washer_diameter(M8_washer) / 2, 0])
|
||||
wades_gear_spacer_stl();
|
||||
|
||||
translate([-z_screw_pointer_radius() + tube_cap_pitch * 2 - 1, -z_screw_pointer_radius() * 2, 0])
|
||||
rotate([0, 0, 180 + 12])
|
||||
z_screw_pointer_stl();
|
||||
translate([z_screw_pointer_radius() + x_carriage_lug_width() + 3, z_screw_pointer_radius() + 1, 0])
|
||||
rotate([0, 0, 90])
|
||||
z_screw_pointer_stl();
|
||||
|
||||
for(x = [0 : 1])
|
||||
for(y = [0 : 1]) {
|
||||
translate([(x + 0.5) * tube_cap_pitch, (y + 0.5) * tube_cap_pitch, 0])
|
||||
tube_cap_stl();
|
||||
translate([z_screw_pointer_radius() + x_carriage_lug_width() + 3, -z_screw_pointer_radius() - 1, 0])
|
||||
rotate([0, 0, -90])
|
||||
z_screw_pointer_stl();
|
||||
|
||||
translate([-(x + 0.5) * 9, -y * 9, 0])
|
||||
pcb_spacer_stl();
|
||||
}
|
||||
for(x = [0 : 1])
|
||||
for(y = [0 : 1]) {
|
||||
translate([-(x + 0.5) * pcb_spacer_pitch, -(y + 0.5) * pcb_spacer_pitch, 0])
|
||||
pcb_spacer_stl();
|
||||
}
|
||||
|
||||
translate([-y_belt_anchor_width() / 2, -2 * pcb_spacer_pitch - y_belt_anchor_depth() / 2 - 1, 0])
|
||||
y_belt_clip_toothed_stl();
|
||||
|
||||
translate([-y_belt_anchor_width() / 2, y_belt_anchor_depth() / 2 + washer_diameter(M8_washer) + 2, 0])
|
||||
y_belt_clip_stl();
|
||||
|
||||
|
||||
translate([1, x_carriage_lug_depth() + 1, 0]) x_belt_clamp_stl();
|
||||
translate([1, -x_carriage_dowel() - 1, 0]) x_belt_grip_stl();
|
||||
|
||||
translate([x_belt_tensioner_radius() + 3, x_belt_tensioner_radius() + x_carriage_lug_depth() + 3.5 , 0]) rotate([0, 0, -90]) x_belt_tensioner_stl();
|
||||
}
|
||||
}
|
||||
|
||||
small_bits_stl();
|
||||
|
@@ -32,7 +32,7 @@ holes = psu_hole_list(psu);
|
||||
bearing_r = (spool_diameter(spool) + ball_bearing_diameter(bearing)) / 2;
|
||||
bearing_x = cos(angle) * bearing_r;
|
||||
bearing_z = spool_z - sin(angle) * bearing_r;
|
||||
bearing_y = spool_width(spool) / 2 + ball_bearing_width(bearing) / 2;
|
||||
bearing_y = spool_width(spool) / 2 + ball_bearing_width(bearing) / 2 - washer_thickness(M8_penny_washer);
|
||||
|
||||
bracket_width = right - (spool_x + bearing_x);
|
||||
bracket_height = height - bearing_z;
|
||||
@@ -298,21 +298,20 @@ module spool_bracket_male_stl() {
|
||||
module spool_bracket_assembly(male)
|
||||
{
|
||||
rotate([-90, 0, 0]) {
|
||||
translate([0, 0, exploded * 30])
|
||||
translate([0, 0, exploded * 15]) {
|
||||
ball_bearing(bearing);
|
||||
|
||||
translate([0, 0, ball_bearing_width(bearing) / 2])
|
||||
screw(M8_cap_screw, 30);
|
||||
translate([0, 0, ball_bearing_width(bearing) / 2 + exploded * 5])
|
||||
washer(M8_washer)
|
||||
translate([0, 0, exploded * 5])
|
||||
washer(M8_penny_washer)
|
||||
screw(M8_cap_screw, 30);
|
||||
}
|
||||
|
||||
rotate([180, 0, 0])
|
||||
translate([0, 0, ball_bearing_width(bearing) / 2]) {
|
||||
translate([0, 0, exploded * -10])
|
||||
washer(M8_washer);
|
||||
|
||||
translate([0, 0, washer_thickness(M8_washer)]) {
|
||||
washer(M8_penny_washer);
|
||||
|
||||
translate([0, 0, washer_thickness(M8_penny_washer)]) {
|
||||
washer(M8_washer) translate([0, 0, exploded * 5]) group() {
|
||||
if(male)
|
||||
color(plastic_part_color("lime")) render() mirror([0, 1, 0]) spool_bracket_male_stl();
|
||||
else
|
||||
@@ -320,13 +319,11 @@ module spool_bracket_assembly(male)
|
||||
|
||||
translate([0, 0, thickness]) {
|
||||
translate([0, 0, exploded * 5])
|
||||
washer(M8_washer);
|
||||
washer(M8_washer)
|
||||
nut(M8_nut, true);
|
||||
|
||||
translate([0, 0, washer_thickness(M8_washer)])
|
||||
nut(M8_nut, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(male)
|
||||
translate([right - (spool_x + bearing_x), height - bearing_z - tube_r, -bearing_y]) {
|
||||
@@ -437,7 +434,7 @@ module spool_holder_tall_brackets_x4_stl() {
|
||||
|
||||
}
|
||||
|
||||
if(0)
|
||||
if(1)
|
||||
translate([0, 0, - spool_z])
|
||||
spool_assembly();
|
||||
else
|
||||
|
@@ -10,42 +10,10 @@
|
||||
include <conf/config.scad>
|
||||
include <positions.scad>
|
||||
|
||||
wall = 3;
|
||||
clearance = 0.25;
|
||||
boss = washer_diameter(M3_washer) + 1;
|
||||
punch = 3;
|
||||
base_screw_offset = fixing_block_width() / 2 + base_clearance - AL_tube_inset;
|
||||
length = wall + base_screw_offset + 10;
|
||||
width = tube_width(AL_square_tube) + 2 * wall + clearance;
|
||||
tube_end_clearance = 1;
|
||||
|
||||
function tube_cap_base_thickness() = 3 * layer_height;
|
||||
function tube_jig_base_thickness() = wall;
|
||||
|
||||
module tube_jig(open) {
|
||||
stl("tube_jig");
|
||||
h = tube_height(AL_square_tube);
|
||||
w = tube_width(AL_square_tube);
|
||||
|
||||
translate([-wall, - width / 2, 0])
|
||||
difference() {
|
||||
union() {
|
||||
cube([length, width, h + tube_jig_base_thickness()]);
|
||||
hull()
|
||||
for(side = [-1, 1])
|
||||
translate([length / 2, side * (width + boss) / 2 + width / 2, 0])
|
||||
cylinder(r = boss / 2, h = wall);
|
||||
}
|
||||
translate([open ? -eta : wall, wall + clearance / 2, tube_jig_base_thickness()])
|
||||
cube([length + 1, w + clearance, h + tube_jig_base_thickness()]);
|
||||
|
||||
translate([wall + base_screw_offset, width / 2, -1])
|
||||
poly_cylinder(r = punch / 2, h = h);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([length / 2, side * (width + boss) / 2 + width / 2, 0])
|
||||
poly_cylinder(r = M3_clearance_radius, h = 100, center = true);
|
||||
}
|
||||
}
|
||||
wall = 2.5;
|
||||
function tube_cap_base_thickness() = wall + tube_end_clearance;
|
||||
|
||||
module base_tube() {
|
||||
difference() {
|
||||
@@ -53,10 +21,13 @@ module base_tube() {
|
||||
rotate([90, 0, 0])
|
||||
square_tube(AL_square_tube, base_depth - 2 * AL_tube_inset);
|
||||
|
||||
for(end = [-1,1])
|
||||
for(end = [-1, 1])
|
||||
translate([0, end * (base_depth / 2 - fixing_block_width() / 2 - base_clearance), -tube_height(AL_square_tube)]) {
|
||||
base_screw_hole();
|
||||
cylinder(r = screw_head_radius(base_screw) + 0.5, h = tube_thickness(AL_square_tube) * 2 + 1, center = true);
|
||||
difference() {
|
||||
base_screw_hole();
|
||||
// made negative to remove bottom hole without leaving top hole going all the way through
|
||||
cylinder(r = screw_head_radius(base_screw) + 0.5, h = tube_thickness(AL_square_tube) * 2 + 1, center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,73 +37,87 @@ module tube_cap_stl() {
|
||||
w = tube_height(AL_square_tube);
|
||||
h = tube_width(AL_square_tube);
|
||||
t = tube_thickness(AL_square_tube);
|
||||
clearance = 0.3;
|
||||
|
||||
clearance = 0.15;
|
||||
base_screw_offset = fixing_block_width() / 2 + base_clearance - AL_tube_inset;
|
||||
base_thickness = tube_cap_base_thickness();
|
||||
depth = 6;
|
||||
|
||||
w_outer = w - 1;
|
||||
|
||||
w_outer = w + 2 * (clearance + wall);
|
||||
h_outer = h - 1;
|
||||
w_inner_base = w - 2 * t;
|
||||
w_inner_top = w_inner_base - clearance;
|
||||
h_inner_base = h - 2 * t;
|
||||
h_inner_top = h_inner_base - clearance;
|
||||
w_inner = w - 2 * t - clearance;
|
||||
h_inner = h - 2 * t - clearance;
|
||||
|
||||
union() {
|
||||
translate([-w_outer / 2, - h_outer / 2, 0])
|
||||
cube([w_outer, h_outer, base_thickness]);
|
||||
rad = 2;
|
||||
layer_height = 0.25;
|
||||
height = base_thickness + base_screw_offset + nut_radius(base_nut) + 3;
|
||||
|
||||
hull() {
|
||||
translate([-w_inner_top / 2, - h_inner_top / 2, 0])
|
||||
cube([w_inner_top, h_inner_top, 5]);
|
||||
|
||||
translate([-w_inner_base / 2, - h_inner_base / 2, 0])
|
||||
cube([w_inner_base, h_inner_base, base_thickness + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module tube_jig_base() {
|
||||
w = tube_width(AL_square_tube) + 2 * wall + clearance + 2 * boss + 2;
|
||||
//echo(w_inner/2 - nut_radius(base_nut) * cos(30));
|
||||
|
||||
difference() {
|
||||
sheet(DiBond, base_depth, w, [5,5,5,5]);
|
||||
for(end = [-1,1]) {
|
||||
translate([end * (base_depth / 2 - fixing_block_width() / 2 - base_clearance), 0, 0])
|
||||
cylinder(r = punch / 2, h = 100, center = true);
|
||||
translate([-w_outer / 2, - h_outer / 2, 0])
|
||||
cube([w_outer, h_outer, height]);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([end * (base_depth / 2 - AL_tube_inset - length / 2 + wall), side * (width / 2 + boss / 2), 0])
|
||||
cylinder(r = M3_clearance_radius, h = 100, center = true);
|
||||
difference() {
|
||||
union() {
|
||||
translate([-(w_outer - 2 * wall) / 2, -h_outer / 2 - 1, wall])
|
||||
cube([w_outer - 2 * wall, h_outer + 2, height]);
|
||||
|
||||
translate([-w_outer / 2 - 1, -h_outer / 2 - 1, depth])
|
||||
cube([w_outer + 2, h_outer + 2, height]);
|
||||
}
|
||||
difference() {
|
||||
translate([-w_inner / 2, h / 2 - h_inner - clearance - t, -1])
|
||||
hull() {
|
||||
cube([w_inner, h_inner, height]);
|
||||
translate([0.5, 0.5, 0])
|
||||
cube([w_inner - 1, h_inner - 1, height + 1]);
|
||||
}
|
||||
|
||||
translate([0, h_inner / 2 - nut_thickness(base_nut, true) - 1.5, base_screw_offset + tube_end_clearance + wall])
|
||||
rotate([-90, 90, 0]) {
|
||||
hull()
|
||||
for(z = [-1, 1])
|
||||
translate([z * layer_height / 2, 0, 0])
|
||||
cylinder(r = nut_radius(base_nut), $fn = 6, h = 100);
|
||||
|
||||
rotate([0,0,90])
|
||||
teardrop_plus(r = screw_clearance_radius(base_screw), h = 100, center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module tube_jig_dxf() projection(cut = true) tube_jig_base();
|
||||
module tube_assembly() {
|
||||
|
||||
module tube_jig_assembly() {
|
||||
translate([0, 0, -tube_height(AL_square_tube) - wall - sheet_thickness(DiBond) / 2])
|
||||
rotate([0, 0, 90])
|
||||
tube_jig_base();
|
||||
color("silver") render() base_tube();
|
||||
|
||||
translate([0, -(base_depth / 2 - fixing_block_width() / 2 - base_clearance), sheet_thickness(base)]) {
|
||||
translate([0, 0, exploded * 20])
|
||||
washer(screw_washer(base_screw))
|
||||
translate([0, 0, exploded * 6])
|
||||
washer(screw_washer(base_screw))
|
||||
screw_and_washer(base_screw, base_screw_length);
|
||||
|
||||
translate([0, 0, -sheet_thickness(base) - tube_thickness(AL_square_tube)])
|
||||
rotate([180, 0, 90])
|
||||
explode([-25, 0, -20])
|
||||
nut(base_nut, true);
|
||||
}
|
||||
|
||||
base_tube();
|
||||
for(end = [-1, 1])
|
||||
translate([0, end * (base_depth / 2 - AL_tube_inset), -tube_height(AL_square_tube) - tube_jig_base_thickness() - eta])
|
||||
rotate([0, 0, -90 * end])
|
||||
color("lime") render()
|
||||
tube_jig(end == -1);
|
||||
|
||||
translate([0, end * (base_depth / 2 - AL_tube_inset + tube_cap_base_thickness() + eta), -tube_height(AL_square_tube) / 2])
|
||||
rotate([90, 0, 90 - 90 * end])
|
||||
explode([0, 0, -25])
|
||||
color("lime") render()
|
||||
tube_cap_stl();
|
||||
}
|
||||
|
||||
module tube_jigs_stl() {
|
||||
tube_jig(true);
|
||||
translate([25, 0, 0])
|
||||
tube_jig(false);
|
||||
}
|
||||
|
||||
if(0)
|
||||
tube_jig_dxf();
|
||||
tube_cap_stl();
|
||||
else
|
||||
if(1)
|
||||
tube_jig_assembly();
|
||||
else
|
||||
tube_jigs_stl();
|
||||
tube_assembly();
|
||||
|
@@ -8,7 +8,7 @@
|
||||
// See http://hydraraptor.blogspot.com/2011/02/polyholes.html
|
||||
//
|
||||
function sides(r) = max(round(4 *r),3);
|
||||
function corrected_radius(r,n) = 0.1 + r / cos(180 / n);
|
||||
function corrected_radius(r, n = 0) = 0.1 + r / cos(180 / (n ? n : sides(r)));
|
||||
function corrected_diameter(d) = 0.2 + d / cos(180 / sides(d / 2));
|
||||
|
||||
module poly_circle(r, center = false) {
|
||||
|
@@ -23,7 +23,7 @@ module teardrop_2D(r, truncate = true) {
|
||||
}
|
||||
|
||||
module teardrop(h, r, center, truncate = true)
|
||||
linear_extrude(height = h, convexity = 2, center = center)
|
||||
render(convexity = 5) linear_extrude(height = h, convexity = 2, center = center)
|
||||
teardrop_2D(r, truncate);
|
||||
|
||||
module teardrop_plus(h, r, center, truncate = true)
|
||||
|
@@ -27,3 +27,8 @@ module ball_bearing(type) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module bearing_ball(dia) {
|
||||
vitamin(str("SB",dia * 10,": Steel ball ",dia, "mm"));
|
||||
color(bearing_color) render() sphere(r = dia / 2);
|
||||
}
|
||||
|
@@ -7,8 +7,10 @@
|
||||
// based on http://www.thingiverse.com/thing:8063 by MiseryBot, CC license
|
||||
|
||||
fan80x38 = [80, 38, 75, 35.75, M4_cap_screw, 40, 4.3, 84];
|
||||
fan70x15 = [70, 15, 66, 30.75, M4_cap_screw, 29, 3.8, 70];
|
||||
fan60x25 = [60, 25, 57, 25, M4_cap_screw, 31.5, 3.6, 64];
|
||||
fan60x15 = [60, 15, 57, 25, M4_cap_screw, 29, 2.4, 60];
|
||||
fan40x11 = [40, 11, 37, 16, M3_cap_screw, 25, 10, 100];
|
||||
fan30x10 = [30, 10, 27, 12, M3_cap_screw, 17, 10, 100];
|
||||
|
||||
function fan_width(type) = type[0];
|
||||
|
@@ -55,7 +55,7 @@ function screw_shorter_than(x) = x > 20 ? floor(x / 5) * 5 :
|
||||
x > 12 ? 12 :
|
||||
10;
|
||||
|
||||
function screw_head_height(type) = type[2] == hs_cap ? type[4] :
|
||||
function screw_head_height(type) = type[2] == hs_cap ? type[3] :
|
||||
type[2] == hs_cs ? type[4] / 2 : type[5];
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@ module screw(type, length, hob_point = 0) {
|
||||
|
||||
module screw_and_washer(type, length, spring = false) {
|
||||
washer = screw_washer(type);
|
||||
translate([0, 0, exploded ? 6 : 0])
|
||||
translate([0, 0, exploded * 6])
|
||||
washer(washer);
|
||||
translate([0,0, washer_thickness(washer)]) {
|
||||
if(spring) {
|
||||
|
@@ -28,9 +28,9 @@ PMMA8 = [ "AC", "Acrylic sheet", 8, [1, 1, 1, 0.5 ], false];
|
||||
PMMA10 = [ "AC", "Acrylic sheet", 10, [1, 1, 1, 0.5 ], false]; // ~3/8"
|
||||
glass2 = [ "GL", "Glass sheet", 2, [1, 1, 1, 0.25 ], false];
|
||||
DiBond = [ "DB", "Dibond sheet", 3, "RoyalBlue", false];
|
||||
Cardboard= [ "CB", "Corrugated cardboard", 6, [0.6, 0.6, 0.2, 1 ], false];
|
||||
Cardboard= [ "CB", "Corrugated cardboard", 5, [0.8, 0.6, 0.3, 1 ], false];
|
||||
FoilTape = [ "AF", "Aluminium foil tape",0.05,[0.9, 0.9, 0.9, 1 ], false];
|
||||
Foam20 = [ "FM", "Foam sponge", 20, [0.3, 0.3, 0.3, 1 ], true];
|
||||
Foam20 = [ "FM", "Foam sponge", 20,[0.3, 0.3, 0.3, 1 ], true];
|
||||
|
||||
function sheet_thickness(type) = type[2];
|
||||
function sheet_colour(type) = type[3];
|
||||
|
@@ -63,6 +63,9 @@ module comp_spring(type, l = 0) {
|
||||
color(spring_color) render()
|
||||
coil(r1 = (spring_od(type) - spring_gauge(type)) / 2, r2 = spring_gauge(type) / 2, h = l, twists = spring_coils(type));
|
||||
|
||||
if($children)
|
||||
translate([0, 0, l])
|
||||
child();
|
||||
}
|
||||
|
||||
//comp_spring(extruder_spring);
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
// corner body boss boss shaft
|
||||
// side, length, radius, radius, radius, depth, shaft, length, holes
|
||||
NEMA17 = [42.3, 47.5, 53.6/2, 25, 11, 2, 5, 24, 31 ];
|
||||
NEMA17 = [42.3, 47, 53.6/2, 25, 11, 2, 5, 24, 31 ];
|
||||
NEMA17S = [42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31 ];
|
||||
NEMA14 = [35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26 ];
|
||||
|
||||
@@ -19,7 +19,9 @@ function NEMA_length(motor) = motor[1];
|
||||
function NEMA_radius(motor) = motor[2];
|
||||
function NEMA_holes(motor) = [-motor[8]/2, motor[8]/2];
|
||||
function NEMA_big_hole(motor) = motor[4] + 0.2;
|
||||
function NEMA_shaft_dia(motor) = motor[6];
|
||||
function NEMA_shaft_length(motor) = motor[7];
|
||||
function NEMA_hole_pitch(motor) = motor[8];
|
||||
|
||||
module NEMA(motor) {
|
||||
side = NEMA_width(motor);
|
||||
@@ -27,7 +29,7 @@ module NEMA(motor) {
|
||||
body_rad = motor[3];
|
||||
boss_rad = motor[4];
|
||||
boss_height = motor[5];
|
||||
shaft_rad = motor[6] / 2;
|
||||
shaft_rad = NEMA_shaft_dia(motor) / 2;
|
||||
cap = 8;
|
||||
vitamin(str("NEMA", round(motor[0] / 2.54), length * 10, ": NEMA", round(motor[0] / 2.54), " x ", length, "mm stepper motor"));
|
||||
union() {
|
||||
@@ -61,6 +63,16 @@ module NEMA(motor) {
|
||||
cylinder(r = 3/2, h = 9, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
translate([0, side / 2, -length + cap / 2])
|
||||
rotate([90, 0, 0])
|
||||
for(i = [0:3])
|
||||
rotate([0, 0, 225 + i * 90])
|
||||
color(["red", "blue","green","black"][i]) render()
|
||||
translate([1, 0, 0])
|
||||
cylinder(r = 1.5 / 2, h = 12, center = true);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,6 +9,8 @@
|
||||
//
|
||||
|
||||
PVC64 = ["PVC aquarium tubing", 6, 4, tubing_color];
|
||||
PVC85 = ["PVC aquarium tubing", 8, 5, tubing_color];
|
||||
NEOP85 = ["Neoprene tubing", 8, 5, [0.2,0.2,0.2]];
|
||||
PTFE07 = ["PTFE sleeving", 1.2, 0.71, tubing_color];
|
||||
PTFE20 = ["PTFE sleeving", 2.6, 2, tubing_color];
|
||||
PF7 = ["PTFE tubing", 46/10, 3.84, tubing_color];
|
||||
|
@@ -35,11 +35,12 @@ module washer(type) {
|
||||
else
|
||||
vitamin(str("WA", hole * 10, diameter, thickness * 10, ": Washer M", hole, " x ", diameter, "mm x ", thickness, "mm"));
|
||||
color(washer_color(type)) render() difference() {
|
||||
cylinder(r = diameter / 2, h = thickness);
|
||||
cylinder(r = diameter / 2, h = thickness - 0.05);
|
||||
cylinder(r = hole / 2, h = 2 * thickness + 1, center = true);
|
||||
}
|
||||
translate([0, 0, thickness])
|
||||
child();
|
||||
if($children)
|
||||
translate([0, 0, thickness])
|
||||
child();
|
||||
}
|
||||
|
||||
module star_washer(type) {
|
||||
@@ -59,6 +60,7 @@ module star_washer(type) {
|
||||
translate([inner + spoke / 2, 0, 0.5])
|
||||
cube([spoke, 2 * 3.142 * inner / 36, thickness + 1], center = true);
|
||||
}
|
||||
translate([0, 0, thickness])
|
||||
child();
|
||||
if($children)
|
||||
translate([0, 0, thickness])
|
||||
child();
|
||||
}
|
||||
|
@@ -278,7 +278,10 @@ function extruder_connector_height() = motor_y - d_motor_bracket_offset(NEMA17);
|
||||
|
||||
module wades_big_gear_stl() {
|
||||
stl("wades_big_gear");
|
||||
color(wades_big_gear_color) import("../imported_stls/39t17p.stl");
|
||||
color(wades_big_gear_color) difference() {
|
||||
import("../imported_stls/39t17p.stl", convexity = 10);
|
||||
poly_cylinder(r = 4, h = 100, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
module wades_small_gear_stl() {
|
||||
@@ -357,7 +360,8 @@ module extruder_motor_assembly(show_connector = true, exploded = exploded) {
|
||||
// motor and gear
|
||||
translate([motor_x, motor_y, thickness + eta])
|
||||
rotate([0,180,0]) {
|
||||
NEMA(NEMA17);
|
||||
rotate([0, 0, 180])
|
||||
NEMA(NEMA17);
|
||||
|
||||
translate([0,0, 2.5 + 30 * exploded])
|
||||
rotate([0, 0, 11])
|
||||
@@ -370,6 +374,9 @@ module extruder_motor_assembly(show_connector = true, exploded = exploded) {
|
||||
}
|
||||
|
||||
module wades_assembly(show_connector = true, show_drive = true) {
|
||||
spring_total = 10;
|
||||
spring_length = spring_total - 2 * washer_thickness(M4_washer);
|
||||
|
||||
assembly("extruder_assembly");
|
||||
|
||||
color(wades_block_color) render()
|
||||
@@ -390,10 +397,10 @@ module wades_assembly(show_connector = true, show_drive = true) {
|
||||
explode([12 - 24 * i, 0, 0])
|
||||
nut(M4_nut);
|
||||
|
||||
translate([0,0, 0]) {
|
||||
translate([0,0, -10 + 50 * exploded]) {
|
||||
comp_spring(extruder_spring, 10);
|
||||
}
|
||||
translate([0, 0, -spring_total + 53 * exploded]) {
|
||||
washer(M4_washer)
|
||||
comp_spring(extruder_spring, spring_length)
|
||||
washer(M4_washer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,7 +411,7 @@ module wades_assembly(show_connector = true, show_drive = true) {
|
||||
screw(M4_hex_screw, 20);
|
||||
|
||||
//idler
|
||||
translate([filament_x + 22 + 40 * exploded, driven_y, filament_z])
|
||||
translate([filament_x + 22 + 39 * exploded, driven_y, filament_z])
|
||||
rotate([90, 0, -90])
|
||||
wade_idler_assembly();
|
||||
|
||||
@@ -446,7 +453,7 @@ module wades_assembly(show_connector = true, show_drive = true) {
|
||||
translate([0, 0, 8])
|
||||
nut(M8_nut);
|
||||
}
|
||||
else explode([0, 0, 25]) group() {
|
||||
else explode([0, 0, 35]) group() {
|
||||
translate([0, 0, -15 * exploded])
|
||||
nut(M8_nut);
|
||||
|
||||
@@ -518,8 +525,22 @@ module wades_extruder_stl() {
|
||||
translate([motor_max, motor_y, 0]) wades_gear_spacer_stl();
|
||||
}
|
||||
|
||||
module wades_big_gear_x5_stl(){
|
||||
|
||||
pitch = 44;
|
||||
wades_big_gear_stl();
|
||||
for(x = [-1,1])
|
||||
for(y = [-1,1])
|
||||
translate([x * pitch, y * pitch, 0])
|
||||
wades_big_gear_stl();
|
||||
}
|
||||
|
||||
|
||||
if(1)
|
||||
rotate([90, 0, 0])
|
||||
wades_assembly(true);
|
||||
else
|
||||
wades_extruder_stl();
|
||||
if(1)
|
||||
wades_extruder_stl();
|
||||
else
|
||||
wades_big_gear_x5_stl();
|
||||
|
@@ -58,6 +58,10 @@ dowel_height = 2;
|
||||
tension_screw_pos = 8;
|
||||
tension_screw_length = 25;
|
||||
|
||||
function x_carriage_lug_width() = lug_width;
|
||||
function x_carriage_lug_depth() = lug_depth;
|
||||
function x_carriage_dowel() = dowel;
|
||||
|
||||
module belt_lug(motor_end) {
|
||||
height = motor_end ? x_carriage_offset() - pulley_inner_radius:
|
||||
x_carriage_offset() - ball_bearing_diameter(X_idler_bearing) / 2;
|
||||
@@ -194,14 +198,17 @@ module x_belt_grip_stl()
|
||||
}
|
||||
}
|
||||
belt_tensioner_rim = X_carriage_clearance;
|
||||
belt_tensioner_rim_r = 2;
|
||||
belt_tensioner_height = belt_tensioner_rim + belt_width(X_belt) + belt_clearance + belt_tensioner_rim;
|
||||
|
||||
function x_belt_tensioner_radius() = (x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) / 2;
|
||||
|
||||
module x_belt_tensioner_stl()
|
||||
{
|
||||
stl("x_belt_tensioner");
|
||||
|
||||
flat = 1;
|
||||
d = x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt);
|
||||
d = 2 * x_belt_tensioner_radius();
|
||||
|
||||
module d(r, w) {
|
||||
difference() {
|
||||
@@ -221,7 +228,7 @@ module x_belt_tensioner_stl()
|
||||
d(d / 2, flat);
|
||||
|
||||
linear_extrude(height = belt_tensioner_rim)
|
||||
d(d / 2 + 2, flat);
|
||||
d(d / 2 + belt_tensioner_rim_r, flat);
|
||||
}
|
||||
translate([wall, 0, belt_tensioner_height / 2])
|
||||
rotate([90, 0, 90])
|
||||
@@ -229,7 +236,6 @@ module x_belt_tensioner_stl()
|
||||
}
|
||||
}
|
||||
|
||||
part_fan = fan60x15;
|
||||
duct_wall = 2 * 0.35 * 1.5;
|
||||
top_thickness = 2;
|
||||
fan_nut_trap_thickness = 4;
|
||||
@@ -245,7 +251,7 @@ fan_screw_boss_r = fan_width / 2 - fan_hole_pitch(part_fan);
|
||||
front_nut_width = 2 * nut_radius(M3_nut) + wall;
|
||||
front_nut_height = 2 * nut_radius(M3_nut) * cos(30) + wall;
|
||||
front_nut_depth = wall + nut_trap_depth(M3_nut);
|
||||
front_nut_pitch = (bar_x - bearing_holder_length(X_bearings) / 2 - nut_radius(M3_nut) - 0.3);
|
||||
front_nut_pitch = min((bar_x - bearing_holder_length(X_bearings) / 2 - nut_radius(M3_nut) - 0.3), fan_hole_pitch(part_fan) - 5);
|
||||
front_nut_z = 3;
|
||||
front_nut_y = - width / 2 + wall;
|
||||
|
||||
@@ -374,39 +380,70 @@ module x_carriage_fan_duct_stl() {
|
||||
nut_trap(screw_clearance_radius(fan_screw), nut_radius(screw_nut(fan_screw)), duct_height - fan_nut_trap_thickness, supported = true);
|
||||
nut_trap(0, nut_radius(screw_nut(fan_screw)) + 0.15, duct_height - fan_nut_trap_thickness - nut_trap_depth(fan_nut));
|
||||
}
|
||||
//
|
||||
// Cold end cooling vent
|
||||
//
|
||||
rotate([0, 0, atan2(-fan_x, -fan_y)])
|
||||
translate([0, ir + skew, duct_height - top_thickness - 3])
|
||||
rotate([90, 0, 0])
|
||||
teardrop(r = 4.5 / 2, h = 10, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
module x_carriage_fan_bracket_stl() {
|
||||
stl("x_carriage_fan_bracket");
|
||||
|
||||
t = fan_bracket_thickness;
|
||||
h = fan_z - fan_depth(part_fan) / 2;
|
||||
pitch = fan_hole_pitch(part_fan);
|
||||
boss_r = washer_diameter(fan_washer) / 2 + 1;
|
||||
w = front_nut_pitch * 2 + washer_diameter(M3_washer) + 5;
|
||||
w = front_nut_pitch * 2 + washer_diameter(M3_washer) + 2 * t;
|
||||
rad = sqrt(2) * pitch - boss_r;
|
||||
bodge = 54 - 51.2; // error in length of MK5 J-head
|
||||
dx = pitch - w / 2;
|
||||
dy = -(fan_y + width / 2) - pitch;
|
||||
hyp = sqrt(dx * dx + dy * dy);
|
||||
angle = atan2(dy, dx) - asin(boss_r / hyp);
|
||||
tangent = sqrt(hyp * hyp - boss_r * boss_r);
|
||||
gusset = tangent - sqrt(boss_r * boss_r - (boss_r - t) * (boss_r - t));
|
||||
gusset_pitch = front_nut_pitch - t / 2 - washer_diameter(M3_washer) / 2 - 1;
|
||||
gusset_spacing = gusset_pitch - t / 2;
|
||||
difference() {
|
||||
union() {
|
||||
hull() {
|
||||
translate([- w / 2, fan_y + width / 2, 0])
|
||||
cube([w, 1, fan_bracket_thickness]);
|
||||
cube([w, 1, t]);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([side * pitch, -pitch, 0])
|
||||
cylinder(r = boss_r, h = fan_bracket_thickness);
|
||||
cylinder(r = boss_r, h = t);
|
||||
}
|
||||
translate([- w / 2, fan_y + width / 2, eta])
|
||||
cube([w, fan_bracket_thickness, h]);
|
||||
cube([w, t, h]);
|
||||
|
||||
// gussets
|
||||
for(side = [-1, 1]) {
|
||||
translate([side * gusset_pitch, fan_y + width / 2 + t - eta, t - eta])
|
||||
rotate([90, 0, 90])
|
||||
right_triangle(width = -(fan_y + width / 2 + t) - sqrt(rad * rad - gusset_spacing * gusset_spacing) - eta, height = h - t, h = t);
|
||||
|
||||
translate([side * (w / 2), fan_y + width / 2 + eta, t - eta])
|
||||
rotate([90, 0, (90 + angle) * side - 90])
|
||||
translate([0, 0, -side * t / 2])
|
||||
linear_extrude(height = t, center = true)
|
||||
polygon([[0, 0], [0, h - t], [t * sin(angle), h - t], [gusset, 0]]);
|
||||
}
|
||||
}
|
||||
//
|
||||
// clear the fan
|
||||
//
|
||||
cylinder(r = sqrt(2) * pitch - boss_r, h = 100, center = true);
|
||||
cylinder(r = rad, h = 100, center = true);
|
||||
|
||||
for(side = [-1, 1]) {
|
||||
//
|
||||
// mounting screw holes
|
||||
//
|
||||
translate([side * front_nut_pitch, 0, h - top_thickness - front_nut_z + h / 2])
|
||||
translate([side * front_nut_pitch, 0, max(h - top_thickness - front_nut_z - bodge, fan_bracket_thickness + washer_diameter(M3_washer) / 2) + h / 2])
|
||||
rotate([90, 0, 0])
|
||||
vertical_tearslot(h = 100, l = h, r = M3_clearance_radius, center = true);
|
||||
//
|
||||
@@ -418,7 +455,6 @@ module x_carriage_fan_bracket_stl() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bearing_gap = 5;
|
||||
bearing_slit = 1;
|
||||
|
||||
@@ -692,11 +728,11 @@ module x_carriage_assembly(show_extruder = true, show_fan = true) {
|
||||
}
|
||||
|
||||
module x_carriage_parts_stl() {
|
||||
x_belt_clamp_stl();
|
||||
translate([-(lug_width + 2),0,0]) x_belt_grip_stl();
|
||||
x_carriage_stl();
|
||||
translate([6, 8, 0]) rotate([0, 0, -90]) x_belt_tensioner_stl();
|
||||
translate([fan_x, fan_y - 2, 0]) rotate([0, 0, 180]) x_carriage_fan_bracket_stl();
|
||||
//x_belt_clamp_stl();
|
||||
//translate([-(lug_width + 2),0,0]) x_belt_grip_stl();
|
||||
//translate([6, 8, 0]) rotate([0, 0, -90]) x_belt_tensioner_stl();
|
||||
}
|
||||
|
||||
|
||||
@@ -707,7 +743,6 @@ module x_carriage_fan_ducts_stl() {
|
||||
x_carriage_fan_duct_stl();
|
||||
}
|
||||
|
||||
|
||||
if(0)
|
||||
if(0) {
|
||||
intersection() {
|
||||
@@ -717,7 +752,7 @@ if(0)
|
||||
}
|
||||
}
|
||||
else
|
||||
if(1)
|
||||
if(0)
|
||||
x_carriage_fan_ducts_stl();
|
||||
else
|
||||
x_carriage_parts_stl();
|
||||
|
636
scad/x-end.scad
636
scad/x-end.scad
@@ -16,7 +16,7 @@ use <wade.scad>
|
||||
|
||||
bwall = 2.3;
|
||||
|
||||
bearing_dia = Z_bearings[1] + 0.2;
|
||||
bearing_dia = Z_bearings[1];
|
||||
bearing_width = bearing_dia + 2 * bwall;
|
||||
bearing_depth = bearing_width / 2 + 1;
|
||||
bearing_length = Z_bearings[0];
|
||||
@@ -32,13 +32,9 @@ shelves = [ shelf_thickness / 2,
|
||||
bearing_height - shelf_thickness / 2,
|
||||
bearing_height - (shelf_thickness + bearing_length + shelf_clearance + shelf_thickness / 2) ];
|
||||
|
||||
actuator_width = 4;
|
||||
actuator_depth = 3;
|
||||
actuator_height = 10;
|
||||
|
||||
module z_linear_bearings(motor_end) {
|
||||
rod_dia = Z_bearings[2];
|
||||
opening = 2 * bearing_dia / 15.4;
|
||||
opening = bearing_dia / 7;
|
||||
shelf_depth = bearing_depth - (rod_dia / 2 + 1);
|
||||
|
||||
union() {
|
||||
@@ -50,11 +46,6 @@ module z_linear_bearings(motor_end) {
|
||||
|
||||
cylinder(h = bearing_height, r = bearing_width / 2);
|
||||
|
||||
if(!motor_end)
|
||||
*translate([-bearing_depth + eta, 0, bearing_height - eta])
|
||||
rotate([-90, 0, 0])
|
||||
right_triangle(width = -actuator_depth, height = actuator_height, h = actuator_width, center = true);
|
||||
|
||||
}
|
||||
//hole for bearings
|
||||
translate([0, 0, -1])
|
||||
@@ -79,26 +70,29 @@ module z_linear_bearings(motor_end) {
|
||||
//z_linear_bearings();
|
||||
|
||||
wall = thick_wall; // 4mm on Mendel and Sturdy, 3mm on Huxley
|
||||
width = x_bar_spacing();
|
||||
web = 3;
|
||||
corner_rad = 3;
|
||||
|
||||
clamp_wall = 0.5 + washer_diameter(M3_washer) / 2 + M3_clearance_radius;
|
||||
|
||||
width = x_bar_spacing() + X_bar_dia + 2 * clamp_wall;
|
||||
back = -ceil(z_bar_offset() + Z_nut_radius + wall);
|
||||
front = -(Z_bar_dia / 2 + 1);
|
||||
length = front - back;
|
||||
thickness = X_bar_dia + 2 * wall;
|
||||
|
||||
clamp_wall = default_wall; // 4mm on Sturdy, 3mm on Mendel and Huxley
|
||||
clamp_hole_inset = clamp_wall;
|
||||
clamp_height = thickness / 2 - 0.4;
|
||||
clamp_width = X_bar_dia + 2 * clamp_wall;
|
||||
|
||||
nut_flat_radius = nut_radius * cos(30);
|
||||
clamp_width = 2 * (nut_radius + clamp_wall);
|
||||
clamp_height = washer_diameter(washer) / 2 + nut_flat_radius + clamp_wall;
|
||||
clamp_depth = wall + nut_trap_depth;
|
||||
clamp_thickness = 5;
|
||||
slit = 1;
|
||||
bar_y = x_bar_spacing() / 2;
|
||||
|
||||
belt_edge = -x_carriage_width() / 2 - X_carriage_clearance;
|
||||
function x_belt_offset() = belt_edge - belt_width(X_belt) / 2;
|
||||
|
||||
idler_stack = 2 * ball_bearing_width(BB624) + 2 * (washer_thickness(M4_washer) + washer_thickness(M5_penny_washer));
|
||||
idler_front = min(belt_edge - belt_width(X_belt) / 2 + idler_stack / 2, -bar_y - thickness / 2 - 0.25);
|
||||
idler_front = min(belt_edge - belt_width(X_belt) / 2 + idler_stack / 2, -bar_y - X_bar_dia / 2 - clamp_wall);
|
||||
idler_screw_length = 45;
|
||||
idler_depth = idler_screw_length - idler_stack - 1;
|
||||
idler_back = idler_front + idler_depth;
|
||||
@@ -109,13 +103,14 @@ mbracket_corner = 7;
|
||||
motor_angle = 45;
|
||||
motor_w = ceil(min(max(sin(motor_angle) + cos(motor_angle)) * NEMA_width(X_motor), NEMA_radius(X_motor) * 2) + 1);
|
||||
mbracket_width = motor_w + 2 * mbracket_thickness;
|
||||
mbracket_height = thickness / 2 + NEMA_radius(X_motor) + mbracket_thickness;
|
||||
mbracket_height = thickness / 2 + NEMA_radius(X_motor) + mbracket_thickness + 0.5;
|
||||
mbracket_front = belt_edge + 14;
|
||||
mbracket_depth = NEMA_length(X_motor) + 2 * mbracket_thickness + 1;
|
||||
mbracket_depth = NEMA_length(X_motor) + 3 * washer_thickness(M3_washer) + 2 * mbracket_thickness;
|
||||
mbracket_centre = mbracket_front + mbracket_depth / 2 - mbracket_thickness;
|
||||
nut_shelf = bearing_height -thickness / 2 - wall - nut_trap_depth(Z_nut);
|
||||
|
||||
switch_op_x = Z_bearings[1] / 2 + 3; // switch operates 2mm before carriage hits the bearing
|
||||
switch_op_z = x_carriage_offset() - x_carriage_thickness() / 2; // hit the edge of the carriage
|
||||
switch_op_x = Z_bearings[1] / 2 + 3; // switch operates 2mm before carriage hits the bearing
|
||||
switch_op_z = x_carriage_offset() - 2; // hit the edge of the carriage
|
||||
sbracket_top = switch_op_z + 12;
|
||||
sbracket_height = sbracket_top + thickness / 2;
|
||||
sbracket_depth = switch_op_x - 3 - front;
|
||||
@@ -131,30 +126,124 @@ function x_end_height() = bearing_height - thickness / 2;
|
||||
function x_end_thickness() = thickness;
|
||||
function x_motor_height() = mbracket_height - thickness / 2;
|
||||
function x_end_clearance() = switch_op_x;
|
||||
function x_end_z_nut_z() = nut_shelf;
|
||||
|
||||
ribbon_screw = M3_cap_screw;
|
||||
ribbon_nut = screw_nut(ribbon_screw);
|
||||
ribbon_nut_trap_depth = nut_trap_depth(ribbon_nut);
|
||||
ribbon_pillar_depth = 12;
|
||||
ribbon_pillar_thickness = wall + ribbon_nut_trap_depth;
|
||||
ribbon_clamp_x = back - ribbon_pillar_depth;
|
||||
ribbon_clamp_y = mbracket_front + washer_diameter(screw_washer(ribbon_screw)) / 2 + mbracket_corner + eta;
|
||||
ribbon_clamp_z = mbracket_height + ribbon_clamp_length(extruder_ways, ribbon_screw) / 2 - thickness / 2 + 0.5;
|
||||
ribbon_pillar_width = nut_radius(ribbon_nut) * 2 + 2 * wall + 0.5;
|
||||
ribbon_pillar_top = ribbon_clamp_z + ribbon_clamp_length(extruder_ways, ribbon_screw) / 2;
|
||||
mbracket_rim_width = max(ribbon_pillar_depth + eta, 15 * NEMA_width(X_motor) / NEMA_width(NEMA17));
|
||||
mbracket_rim_inner_rad = 5;
|
||||
ribbon_pillar_depth = ribbon_pillar_thickness;
|
||||
ribbon_pillar_width = nut_radius(ribbon_nut) * 2 + 2 * web + 0.5;
|
||||
ribbon_pillar_height = ribbon_clamp_length(extruder_ways, ribbon_screw);
|
||||
ribbon_clamp_x = back - mbracket_thickness + eta;
|
||||
ribbon_clamp_y = -bearing_width / 2 - ribbon_pillar_width / 2 + web - eta;
|
||||
ribbon_clamp_z = max(mbracket_height + ribbon_pillar_height / 2 - thickness / 2,
|
||||
bearing_height - ribbon_clamp_length(extruder_ways, ribbon_screw) / 2 - thickness / 2);
|
||||
ribbon_pillar_top = ribbon_clamp_z + ribbon_pillar_height / 2;
|
||||
|
||||
function anti_backlash_height() = 24 + thickness / 2;
|
||||
anti_backlash_radius = Z_nut_radius + 0.2;
|
||||
anti_backlash_wall = max(3, bearing_width / 2 - wall - cos(30) * anti_backlash_radius + 0.5);
|
||||
|
||||
function x_end_ribbon_clamp_y() = mbracket_front + mbracket_depth - mbracket_thickness;
|
||||
function x_end_ribbon_clamp_z() = mbracket_height - thickness / 2 - mbracket_thickness - nut_radius(ribbon_nut);
|
||||
function x_end_ribbon_clamp_y() = mbracket_front + NEMA_length(X_motor) + ribbon_bracket_thickness();
|
||||
function x_end_ribbon_clamp_z() = NEMA_hole_pitch(X_motor) / sqrt(2);
|
||||
|
||||
function x_end_extruder_ribbon_clamp_offset() = [-ribbon_clamp_x, ribbon_clamp_y + ribbon_clamp_width(ribbon_screw) / 2, ribbon_clamp_z];
|
||||
|
||||
module x_end_bracket(motor_end, assembly = false){
|
||||
module x_end_clamp_stl() {
|
||||
stl("x_end_clamp");
|
||||
|
||||
difference() {
|
||||
hull() {
|
||||
for(end = [-1, 1], side = [-1,1])
|
||||
translate([end * (length / 2 - corner_rad), side * (clamp_width / 2 - corner_rad), 0])
|
||||
if(side < 0)
|
||||
translate([0, 0, clamp_height / 2])
|
||||
cube([2 * corner_rad, 2 * corner_rad, clamp_height], center = true);
|
||||
else
|
||||
cylinder(r = corner_rad, h = clamp_height);
|
||||
}
|
||||
|
||||
translate([0, 0, thickness / 2])
|
||||
rotate([90, 0, 90])
|
||||
teardrop_plus(r = X_bar_dia / 2, h = length + 1, center = true);
|
||||
|
||||
for(end = [-1, 1]) {
|
||||
for(side = [-1,1])
|
||||
translate([end * (length / 2 - clamp_hole_inset), side * (X_bar_dia / 2 + M3_clearance_radius), 0])
|
||||
poly_cylinder(r = M3_clearance_radius, h = 100, center = true);
|
||||
|
||||
translate([end * (length / 2 - clamp_hole_inset), 0, thickness / 2])
|
||||
cube([M3_clearance_radius * 2 - eta, X_bar_dia + M3_clearance_radius * 2, X_bar_dia * 0.8], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ribbon_bracket_counterbore() = washer_thickness(M3_washer) + screw_head_height(M3_cap_screw) + 0.5;
|
||||
function ribbon_bracket_thickness() = ribbon_bracket_counterbore() + 2.4;
|
||||
|
||||
module x_motor_ribbon_bracket_stl(support = true) {
|
||||
stl("x_motor_ribbon_bracket");
|
||||
length = ribbon_clamp_length(x_end_ways, ribbon_screw) + 2;
|
||||
rad = ribbon_clamp_width(ribbon_screw) / 2 + 1;
|
||||
counterbore = ribbon_bracket_counterbore();
|
||||
height = ribbon_bracket_thickness();
|
||||
ridge_width = 5 * filament_width + eta; // angled same as infill so make sure whole number of filaments
|
||||
ridge_offset = (NEMA_width(X_motor) - NEMA_hole_pitch(X_motor)) / 2 + ridge_width / 2;
|
||||
ridge_height = 5;
|
||||
difference() {
|
||||
union() {
|
||||
hull() {
|
||||
for(side = [-1, 1])
|
||||
translate([side * (length / 2 - rad), 0, 0])
|
||||
cylinder(h = height, r = rad);
|
||||
|
||||
}
|
||||
for(side = [-1,1])
|
||||
intersection() {
|
||||
rotate([0, 0, side * 45])
|
||||
translate([ridge_offset * side, 0, height - 1 + ridge_height / 2])
|
||||
cube([ridge_width, 100, ridge_height + 1], center = true);
|
||||
cube([length, rad * 2 - 1, 100], center = true);
|
||||
}
|
||||
}
|
||||
//
|
||||
// counterbored hole for motor screw
|
||||
//
|
||||
difference() {
|
||||
union() {
|
||||
poly_cylinder(r = M3_clearance_radius, h = 100, center = true);
|
||||
poly_cylinder(r = washer_diameter(M3_washer) / 2 + 0.5, h = counterbore * 2, center = true);
|
||||
}
|
||||
if(support)
|
||||
hole_support(M3_clearance_radius, counterbore);
|
||||
}
|
||||
//
|
||||
// ribbon clamp holes
|
||||
//
|
||||
translate([0, 0, height])
|
||||
ribbon_clamp_holes(x_end_ways, ribbon_screw)
|
||||
nut_trap(screw_clearance_radius(ribbon_screw), nut_radius(ribbon_nut), ribbon_nut_trap_depth);
|
||||
}
|
||||
}
|
||||
|
||||
nut_trap_support_height = 10;
|
||||
|
||||
module x_idler_support_stl() {
|
||||
color("grey") {
|
||||
translate([-z_bar_offset(), 0, 0])
|
||||
hole_support(r = (Z_screw_dia + 1) / 2, h = bearing_height - wall);
|
||||
|
||||
translate([-z_bar_offset(), 0, nut_shelf + thickness / 2 - nut_trap_support_height])
|
||||
nut_trap_support(r = Z_nut_radius, h = nut_trap_support_height + eta, r2 = (Z_screw_dia + 1) / 2);
|
||||
|
||||
for(side = [-1,1])
|
||||
for(x = [front - clamp_hole_inset, back + clamp_hole_inset])
|
||||
for(i = [-1,1])
|
||||
translate([x, side * bar_y + i * (X_bar_dia / 2 + M3_clearance_radius), 0])
|
||||
hole_support(r = M3_clearance_radius, h = M3_nut_trap_depth, max_r = nut_flat_radius(M3_nut));
|
||||
}
|
||||
}
|
||||
|
||||
module x_motor_support_stl() mirror([1,0,0]) x_idler_support_stl();
|
||||
|
||||
module x_end_bracket(motor_end, integral_support = false){
|
||||
|
||||
if(motor_end)
|
||||
stl("x_motor_bracket");
|
||||
@@ -168,252 +257,183 @@ module x_end_bracket(motor_end, assembly = false){
|
||||
union(){
|
||||
// base
|
||||
translate([front - length / 2, 0, 0])
|
||||
cube([length, width, thickness], center = true);
|
||||
rounded_rectangle([length, width, thickness], corner_rad);
|
||||
|
||||
//
|
||||
// Anti-backlash nut holder
|
||||
//
|
||||
translate([-z_bar_offset(), 0, thickness / 2 - eta]) union() {
|
||||
cylinder(r = anti_backlash_radius + anti_backlash_wall, h = anti_backlash_height() - thickness / 2 - eta, $fn = 6);
|
||||
translate([0, -(bearing_width - 2 * wall + 1) / 2, 0])
|
||||
cube([z_bar_offset() - bearing_depth + eta, bearing_width - 2 * wall + 1, anti_backlash_height() - thickness / 2]);
|
||||
if(motor_end)
|
||||
translate([back + z_bar_offset(), -(bearing_width - 2 * wall + 1) / 2, 0])
|
||||
cube([-back - z_bar_offset(), bearing_width - 2 * wall + 1, mbracket_height - thickness - eta]);
|
||||
// nut holder tower
|
||||
difference() {
|
||||
translate([front - length / 2, 0, bearing_height / 2 - thickness / 2])
|
||||
cube([length, bearing_width, bearing_height], true);
|
||||
|
||||
translate([-bearing_depth - length / 2 - eta, 0, nut_shelf - bearing_height / 2])
|
||||
rounded_rectangle([length, bearing_width - 2 * web, bearing_height], 2);
|
||||
}
|
||||
//
|
||||
// Webs from bearing holder
|
||||
//
|
||||
for(side = [-1, 1])
|
||||
if(motor_end)
|
||||
translate([back - eta, (bearing_width - wall - eta) / 2 * side, thickness / 2 - eta])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = wall, center = true)
|
||||
polygon(points = [
|
||||
[0, 0],
|
||||
[-back - bearing_depth + 2 * eta, 0],
|
||||
[-back - bearing_depth + 2 * eta, bearing_height - thickness],
|
||||
[0, mbracket_height - thickness]
|
||||
],
|
||||
sides = [0, 1, 2, 3]
|
||||
);
|
||||
else
|
||||
translate([-bearing_depth + eta, (bearing_width - wall - eta) / 2 * side, thickness / 2 - eta])
|
||||
rotate([90, 0, 0])
|
||||
right_triangle(width = back + bearing_depth, height = bearing_height - thickness, h = wall);
|
||||
|
||||
for(side = [-1, 1]) {
|
||||
if(motor_end)
|
||||
//
|
||||
// Bar holders
|
||||
//
|
||||
union() {
|
||||
translate([front - length / 2, bar_y * side, 0]) {
|
||||
rotate([90, 0, 90])
|
||||
teardrop(r = thickness / 2, h = length, center = true);
|
||||
rotate([-90, 0, 90])
|
||||
teardrop(r = thickness / 2, h = length, center = true);
|
||||
|
||||
rotate([90, 0, 90 * side])
|
||||
linear_extrude(height = length - 4 * eta, center = true)
|
||||
hull() {
|
||||
translate([slit / 2 + eta, thickness / 2 - 1])
|
||||
square([clamp_thickness - 2 * eta, 0.5]);
|
||||
circle(r = thickness / 2 - eta);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// Bar clamps
|
||||
// limit switch bracket
|
||||
//
|
||||
difference() {
|
||||
group() {
|
||||
translate([front - length / 2, side * (bar_y - clamp_depth / 2 - slit / 2), thickness / 2 + clamp_height / 2 -eta])
|
||||
cube([clamp_width, clamp_depth, clamp_height], center = true);
|
||||
|
||||
translate([front - length / 2, side * (bar_y + clamp_thickness / 2 + slit / 2) -eta, thickness / 2])
|
||||
union() {
|
||||
translate([front - eta, sbracket_y, - thickness / 2])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = clamp_thickness, center = true)
|
||||
polygon(points = [
|
||||
[-length / 2 + eta, 0],
|
||||
[-length / 2 + eta, -thickness / 2],
|
||||
[ length / 2 - eta, -thickness / 2],
|
||||
[ length / 2 - eta, 0],
|
||||
[ clamp_width / 2, clamp_height],
|
||||
[-clamp_width / 2, clamp_height],
|
||||
]);
|
||||
linear_extrude(height = sbracket_thickness, center = true)
|
||||
polygon([
|
||||
[0, 0],
|
||||
[sbracket_depth, sbracket_height - microswitch_length() + 2],
|
||||
[sbracket_depth, sbracket_height],
|
||||
[-web, sbracket_height],
|
||||
[-web, thickness - eta]
|
||||
]);
|
||||
translate([front - web, sbracket_y, thickness / 2 - 1])
|
||||
cube([web, -bearing_width / 2 - sbracket_y + 1, sbracket_height - thickness + 1]);
|
||||
}
|
||||
//
|
||||
// Bar clamp nut traps
|
||||
//
|
||||
translate([front - length / 2, side * (bar_y - clamp_depth - slit / 2), thickness / 2 + washer_diameter(washer) / 2])
|
||||
rotate([90,0,0])
|
||||
nut_trap(screw_clearance_radius, nut_radius, nut_trap_depth, true);
|
||||
translate([switch_op_x, sbracket_y + sbracket_thickness / 2 + microswitch_thickness() / 2, switch_op_z])
|
||||
rotate([0, -90, -90])
|
||||
microswitch_holes(h = sbracket_thickness);
|
||||
}
|
||||
else {
|
||||
//
|
||||
// idler end
|
||||
//
|
||||
difference() {
|
||||
union() {
|
||||
translate([back - idler_width / 2 + eta + corner_rad, idler_back - idler_depth / 2, 0])
|
||||
rounded_rectangle([idler_width + 2 * corner_rad, idler_depth, thickness], r = corner_rad, center = true);
|
||||
|
||||
translate([back, idler_back, 0])
|
||||
rotate([0, 0, 90])
|
||||
fillet(h = thickness, r = idler_width / 2);
|
||||
}
|
||||
|
||||
translate([back - idler_width / 2, -bar_y, 0])
|
||||
rotate([90, 0, 90])
|
||||
teardrop(r = X_bar_dia / 2 + 0.5, h = 100, center = true);
|
||||
|
||||
assign(screw_angle = atan2(M4_clearance_radius - 3.9 / 2, idler_depth))
|
||||
translate([x_idler_offset(), idler_back, 0])
|
||||
rotate([90, 0, -screw_angle])
|
||||
nut_trap(M4_clearance_radius, M4_nut_radius, M4_nut_trap_depth);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// Cut out for bearing holder
|
||||
//
|
||||
cube([bearing_depth * 2 -eta, bearing_width - eta, thickness + 10], center = true);
|
||||
translate([0, 0, bearing_height / 2 - thickness / 2])
|
||||
cube([bearing_depth * 2 -eta, bearing_width - 1, bearing_height + 2], center = true);
|
||||
//
|
||||
// Hole for z leadscrew
|
||||
//
|
||||
translate([-z_bar_offset(), 0, -thickness / 2])
|
||||
nut_trap((Z_screw_dia + 1) / 2, Z_nut_radius, Z_nut_depth);
|
||||
difference() {
|
||||
translate([-z_bar_offset(), 0, - thickness / 2])
|
||||
nut_trap((Z_screw_dia + 1) / 2, Z_nut_radius, nut_shelf + thickness / 2 + nut_trap_depth(Z_nut), supported = integral_support);
|
||||
|
||||
translate([-z_bar_offset(), 0, thickness / 2 + eta])
|
||||
cylinder(r = anti_backlash_radius, h = bearing_height, $fn = 6);
|
||||
if(integral_support)
|
||||
translate([-z_bar_offset(), 0, nut_shelf])
|
||||
cylinder(r = Z_nut_radius + 1, h = layer_height);
|
||||
}
|
||||
|
||||
translate([-z_bar_offset(), 0, -thickness / 2 - 1])
|
||||
cylinder(r = Z_nut_radius + 1, h = thickness + 2, $fn = 6);
|
||||
|
||||
for(side = [-1, 1]) {
|
||||
//
|
||||
// Holes for x_bars
|
||||
//
|
||||
translate([front - length / 2, bar_y * side, 0]) {
|
||||
translate([0, 0, thickness / 2])
|
||||
cube([length + 1, slit, thickness + 1], center = true);
|
||||
rotate([90, 0, 90])
|
||||
teardrop_plus(r = X_bar_dia / 2, h = length + 1, center = true, truncate = false);
|
||||
teardrop_plus(r = X_bar_dia / 2, h = length + 1, center = true);
|
||||
}
|
||||
//
|
||||
// Remove clamp tops
|
||||
//
|
||||
translate([back + (length + 1) / 2 - 0.5, side * (bar_y - X_bar_dia / 2 - clamp_wall - 0.5 + 50), bearing_height / 2])
|
||||
cube([length + 1, 100, bearing_height], center = true);
|
||||
//
|
||||
// Clamp nut traps
|
||||
//
|
||||
for(x = [front - clamp_hole_inset, back + clamp_hole_inset]) {
|
||||
for(i = [-1,1])
|
||||
translate([x, side * bar_y + i * (X_bar_dia / 2 + M3_clearance_radius), -thickness / 2])
|
||||
nut_trap(M3_clearance_radius, M3_nut_radius, M3_nut_trap_depth, supported = integral_support);
|
||||
|
||||
translate([x, side * bar_y, 0])
|
||||
cube([M3_clearance_radius * 2 - eta, X_bar_dia + M3_clearance_radius * 2, X_bar_dia * 0.8], center = true);
|
||||
}
|
||||
}
|
||||
//
|
||||
// cut out for bottom microswitch contact
|
||||
//
|
||||
if(motor_end)
|
||||
translate([switch_op_x,
|
||||
sbracket_y - sbracket_thickness / 2 - microswitch_thickness() / 2,
|
||||
switch_op_z])
|
||||
rotate([0, -90, -90])
|
||||
microswitch_contact_space();
|
||||
|
||||
}
|
||||
//
|
||||
// support membrane
|
||||
//
|
||||
translate([-z_bar_offset(), 0, Z_nut_depth + layer_height / 2 - thickness / 2 + eta])
|
||||
cylinder(r = (Z_screw_dia + 2) /2, h = layer_height, center = true);
|
||||
|
||||
if(motor_end) {
|
||||
difference() {
|
||||
//
|
||||
// Bracket
|
||||
//
|
||||
union() {
|
||||
//
|
||||
// Motor bracket
|
||||
//
|
||||
translate([back - mbracket_width / 2 + eta, mbracket_centre, mbracket_height / 2 - thickness / 2]) {
|
||||
difference() {
|
||||
rounded_rectangle([mbracket_width, mbracket_depth, mbracket_height], center = true, r = mbracket_corner); // outside
|
||||
cube([mbracket_width, mbracket_depth, mbracket_height], center = true); // outside
|
||||
translate([0, 0, -mbracket_thickness])
|
||||
difference() {
|
||||
cube([mbracket_width - 2 * mbracket_thickness, // inside
|
||||
mbracket_depth - 2 * mbracket_thickness, mbracket_height], center = true);
|
||||
cube([mbracket_width - 2 * mbracket_thickness, // inside
|
||||
mbracket_depth - 2 * mbracket_thickness, mbracket_height], center = true);
|
||||
|
||||
if(!assembly) union() {
|
||||
rounded_rectangle([mbracket_width - 2 * mbracket_rim_width + 4 * filament_width, // support tube
|
||||
mbracket_depth - 2 * mbracket_rim_width + 4 * filament_width, mbracket_height + 1],
|
||||
r = mbracket_rim_inner_rad + 2 * filament_width);
|
||||
translate([-M3_clearance_radius - wall - 100, -50, - 50]) // truncate front
|
||||
cube(100);
|
||||
|
||||
translate([0, 0, - mbracket_height / 2 + mbracket_thickness + layer_height])
|
||||
rounded_rectangle([mbracket_width - 2 * mbracket_rim_width + 8 * filament_width, // support base
|
||||
mbracket_depth - 2 * mbracket_rim_width + 8 * filament_width,
|
||||
layer_height * 2], r = mbracket_rim_inner_rad + 4 * filament_width);
|
||||
}
|
||||
}
|
||||
translate([0, 0, (mbracket_height - mbracket_thickness) / 2 + layer_height])
|
||||
rounded_rectangle([mbracket_width - 2 * mbracket_rim_width,
|
||||
mbracket_depth - 2 * mbracket_rim_width, 100], r = mbracket_rim_inner_rad); // open top
|
||||
translate([NEMA_big_hole(X_motor) * sqrt(2), 0, -mbracket_height / 2 + thickness / 2])
|
||||
rotate([0, 45, 180]) // slope front tangential to motor boss
|
||||
translate([0, 0, -50])
|
||||
cube(100);
|
||||
|
||||
translate([-100 - NEMA_holes(X_motor)[0] * sqrt(2) - screw_head_radius(M3_cap_screw) - wall, 0, - 50])
|
||||
cube(100); // truncate back
|
||||
|
||||
translate([-100 + mbracket_width / 2 + 1, -mbracket_centre - bearing_width / 2 + web,
|
||||
-mbracket_height / 2 + thickness - eta])
|
||||
cube(100); // truncate back
|
||||
|
||||
translate([-M3_clearance_radius - wall - eta, -mbracket_centre - bearing_width / 2 + web + eta, mbracket_height / 2])
|
||||
rotate([0, 0,-90])
|
||||
right_triangle(width = -mbracket_front - bearing_width / 2 + web,
|
||||
height = mbracket_width / 2 -mbracket_thickness + M3_clearance_radius + wall,
|
||||
h = 2 * mbracket_thickness + 1);
|
||||
}
|
||||
//
|
||||
// Fillet to anchor the end wall to the bed while being printed
|
||||
//
|
||||
translate([-mbracket_width / 2 + mbracket_thickness - eta, 0, -mbracket_height / 2])
|
||||
rotate([90, 0, 0])
|
||||
right_triangle(width = 4, height = 4, h = mbracket_depth - mbracket_thickness, center = true);
|
||||
}
|
||||
//
|
||||
// ribbon clamp pillar
|
||||
// Ribbon clamp pillar
|
||||
//
|
||||
translate([ribbon_clamp_x,
|
||||
translate([ribbon_clamp_x + ribbon_pillar_thickness / 2,
|
||||
ribbon_clamp_y,
|
||||
mbracket_height + (ribbon_pillar_top - mbracket_height - thickness / 2) / 2 - eta])
|
||||
{
|
||||
translate([ribbon_pillar_thickness / 2, 0, 0])
|
||||
ribbon_clamp_z - eta])
|
||||
hull() {
|
||||
cube([ribbon_pillar_thickness,
|
||||
ribbon_pillar_width,
|
||||
ribbon_pillar_top - mbracket_height + thickness / 2], center = true);
|
||||
for(side = [-1, 1])
|
||||
translate([ribbon_pillar_thickness - eta, side * (ribbon_pillar_width - wall) / 2,
|
||||
-(ribbon_pillar_top - mbracket_height + thickness / 2) / 2 - eta])
|
||||
rotate([90,0,0])
|
||||
right_triangle(width = ribbon_pillar_depth - ribbon_pillar_thickness,
|
||||
height = ribbon_pillar_top - mbracket_height + thickness / 2,
|
||||
h = wall);
|
||||
}
|
||||
//
|
||||
// Ribbon clamp nut traps
|
||||
//
|
||||
translate([x_motor_offset(), mbracket_front + mbracket_depth - 2 * mbracket_thickness + eta, x_end_ribbon_clamp_z()])
|
||||
rotate([90, 180, 0])
|
||||
ribbon_clamp_holes(x_end_ways, ribbon_screw)
|
||||
difference() {
|
||||
teardrop(r = nut_radius(ribbon_nut) + 2, h = ribbon_nut_trap_depth, truncate = false);
|
||||
translate([0, (nut_radius(ribbon_nut) + 2) * sqrt(2), ribbon_nut_trap_depth + eta])
|
||||
rotate([0, 90, 180])
|
||||
right_triangle(width = ribbon_nut_trap_depth, height = ribbon_nut_trap_depth, h = 20);
|
||||
}
|
||||
ribbon_pillar_height], center = true);
|
||||
|
||||
|
||||
}
|
||||
//
|
||||
// Slits to leave clamp free
|
||||
//
|
||||
for(side = [-1,1]) // both sides in case motor longer than bracket
|
||||
translate([back - slit / 2 + eta * 2, side * (-bar_y - thickness / 2 + slit / 2), 0])
|
||||
difference() {
|
||||
cube([slit, thickness, thickness + 2], center = true);
|
||||
translate([-1, 0, thickness / 2 + 1])
|
||||
rotate([0, 45, 0])
|
||||
cube([2, thickness + 1, 2], center = true);
|
||||
translate([+ribbon_pillar_thickness / 2 + 0.5 - mbracket_thickness + eta, 0,
|
||||
-(ribbon_pillar_thickness - mbracket_thickness) * 2])
|
||||
cube([1, ribbon_pillar_width / 2, ribbon_pillar_height], center = true);
|
||||
}
|
||||
}
|
||||
//
|
||||
// Holes
|
||||
//
|
||||
translate([x_motor_offset(), mbracket_front, 0]) {
|
||||
//
|
||||
// big hole for motor boss
|
||||
//
|
||||
translate([0, 0, -50/2])
|
||||
rotate([90,0,0])
|
||||
vertical_tearslot(r = NEMA_big_hole(X_motor), h = 2 * mbracket_thickness + 1, l = 50, center = true);
|
||||
//
|
||||
// small hole for second shaft
|
||||
//
|
||||
translate([0, mbracket_depth - mbracket_thickness, -50/2])
|
||||
rotate([90,0,0])
|
||||
vertical_tearslot(r = 4, h = 2 * mbracket_thickness + 1, l = 50, center = true);
|
||||
translate([x_motor_offset(), 0, 0]) {
|
||||
//
|
||||
// Mounting holes
|
||||
//
|
||||
for(x = NEMA_holes(X_motor)) // motor screw holes
|
||||
assign(screw_offset = M3_clearance_radius - 2.9 / 2)
|
||||
for(x = NEMA_holes(X_motor)) // motor screw holes
|
||||
for(z = NEMA_holes(X_motor))
|
||||
rotate([0, motor_angle, 0])
|
||||
translate([x,0,z])
|
||||
rotate([90, -motor_angle, 0])
|
||||
teardrop_plus(r = M3_clearance_radius, h = 2 * mbracket_thickness + 1, center = true);
|
||||
translate([x, 0, z])
|
||||
rotate([90, -motor_angle, 0]) {
|
||||
translate([-screw_offset, 0, 0])
|
||||
teardrop_plus(r = M3_clearance_radius, h = 100); // front holes
|
||||
|
||||
translate([0, 0, -100])
|
||||
teardrop_plus(r = screw_head_radius(M3_cap_screw), h = 100);// back hole
|
||||
}
|
||||
}
|
||||
//
|
||||
// ribbon clamp holes
|
||||
//
|
||||
translate([x_motor_offset(),
|
||||
mbracket_front + mbracket_depth - 2 * mbracket_thickness - ribbon_nut_trap_depth,
|
||||
mbracket_height - thickness / 2 - mbracket_thickness - nut_radius(ribbon_nut)])
|
||||
rotate([90, 0, 0])
|
||||
ribbon_clamp_holes(x_end_ways, ribbon_screw)
|
||||
difference() {
|
||||
nut_trap(screw_clearance_radius(ribbon_screw), nut_radius(ribbon_nut), ribbon_nut_trap_depth, true);
|
||||
translate([0,0, 5])
|
||||
cylinder(r = 10, h =100);
|
||||
}
|
||||
|
||||
translate([ribbon_clamp_x + ribbon_pillar_thickness, ribbon_clamp_y, ribbon_clamp_z])
|
||||
rotate([-90,90,90])
|
||||
@@ -423,57 +443,11 @@ module x_end_bracket(motor_end, assembly = false){
|
||||
//
|
||||
// Hole for switch wires
|
||||
//
|
||||
translate([back, -bearing_width / 2 - 3, thickness / 2 + 10])
|
||||
translate([back, -bearing_width / 2 - 4, thickness / 2 + 4])
|
||||
rotate([90, 0, 90])
|
||||
teardrop(r = 3, h = 2 * mbracket_thickness + 1, center = true);
|
||||
|
||||
}
|
||||
//
|
||||
// limit switch bracket
|
||||
//
|
||||
difference() {
|
||||
translate([front - eta, sbracket_y, - thickness / 2])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = sbracket_thickness, center = true)
|
||||
polygon([
|
||||
[0, 0],
|
||||
[sbracket_depth, sbracket_height - microswitch_length() + 2],
|
||||
[sbracket_depth, sbracket_height],
|
||||
[sbracket_depth - 10, sbracket_height],
|
||||
//[-length / 2 + clamp_width / 2 - eta, thickness + clamp_height],
|
||||
[-length / 2 + clamp_width / 2 - eta, thickness - eta]
|
||||
]);
|
||||
translate([switch_op_x, sbracket_y + sbracket_thickness / 2 + microswitch_thickness() / 2, switch_op_z])
|
||||
rotate([0, -90, -90])
|
||||
microswitch_holes(h = sbracket_thickness);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//
|
||||
// idler end
|
||||
//
|
||||
difference() {
|
||||
union() {
|
||||
translate([back - idler_width / 2 + eta - slit / 2, idler_back - idler_depth / 2, 0])
|
||||
rounded_rectangle([idler_width - slit, idler_depth, thickness], r = 2, center = true);
|
||||
|
||||
translate([back - 5, idler_back - (idler_back + bar_y - slit / 2) / 2, 0])
|
||||
cube([10, idler_back + bar_y - slit / 2, thickness], center = true);
|
||||
|
||||
translate([back, idler_back, 0])
|
||||
rotate([0, 0, 90])
|
||||
fillet(h = thickness, r = idler_width / 2);
|
||||
}
|
||||
|
||||
translate([back - idler_width / 2, -bar_y, 0])
|
||||
rotate([90, 0, 90])
|
||||
teardrop(r = X_bar_dia / 2 + 0.5, h = idler_width + 1, center = true);
|
||||
|
||||
translate([x_idler_offset(), idler_back, 0])
|
||||
rotate([90, 0, 0])
|
||||
nut_trap(M4_clearance_radius, M4_nut_radius, M4_nut_trap_depth);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -483,9 +457,14 @@ module x_end_assembly(motor_end) {
|
||||
if(!motor_end)
|
||||
assembly("x_idler_assembly");
|
||||
//
|
||||
// RP bit
|
||||
// RP bits
|
||||
//
|
||||
color(x_end_bracket_color) render() x_end_bracket(motor_end, true);
|
||||
color(x_end_bracket_color) render() x_end_bracket(motor_end);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([(front + back) / 2, side * bar_y, thickness / 2])
|
||||
rotate([180, 0, 90 + 90 * side])
|
||||
color("red") render() x_end_clamp_stl();
|
||||
//
|
||||
// bearings
|
||||
//
|
||||
@@ -496,23 +475,40 @@ module x_end_assembly(motor_end) {
|
||||
//
|
||||
// bearing clamp fasteners
|
||||
//
|
||||
for(side = [-1, 1]) {
|
||||
translate([front - length / 2, side * (bar_y + clamp_thickness + slit / 2), thickness / 2 + washer_diameter(washer) / 2])
|
||||
rotate([-90 * side,0,0])
|
||||
screw_and_washer(hex_screw, 16);
|
||||
for(side = [-1, 1])
|
||||
for(x = [front - clamp_hole_inset, back + clamp_hole_inset])
|
||||
for(i = [-1,1])
|
||||
translate([x, side * bar_y + i * (X_bar_dia / 2 + M3_clearance_radius), 0]) {
|
||||
translate([0, 0, - thickness / 2 + M3_nut_trap_depth])
|
||||
rotate([180, 0, 0])
|
||||
nut(M3_nut, true);
|
||||
|
||||
translate([0, 0, thickness / 2])
|
||||
washer(M3_washer)
|
||||
screw(M3_cap_screw,
|
||||
screw_longer_than(thickness + washer_thickness(M3_washer) + nut_thickness(M3_nut, true) - nut_trap_depth(M3_nut)));
|
||||
}
|
||||
|
||||
translate([front - length / 2, side * (bar_y - clamp_depth - slit / 2 + nut_trap_depth), thickness / 2 + washer_diameter(washer) / 2])
|
||||
rotate([90 * side,0,0])
|
||||
nut(nut, true);
|
||||
}
|
||||
if(motor_end) {
|
||||
translate([x_motor_offset(), mbracket_front + eta, 0]) {
|
||||
rotate([90, motor_angle, 0]) {
|
||||
rotate([90, motor_angle - 90, 0]) {
|
||||
NEMA(X_motor);
|
||||
translate([0,0, mbracket_thickness])
|
||||
NEMA_screws(X_motor, 3);
|
||||
rotate([0, 0, -90])
|
||||
NEMA_screws(X_motor, 2);
|
||||
|
||||
rotate([0, 0, -180]) translate(NEMA_holes(X_motor)) translate([0, 0, -NEMA_length(X_motor)])
|
||||
rotate([180, 0, 0])
|
||||
washer(M3_washer) washer(M3_washer) washer(M3_washer) screw(M3_cap_screw, 45);
|
||||
|
||||
translate([0, 0, 4])
|
||||
pulley_assembly();
|
||||
//
|
||||
// Heatshrink for motor connections
|
||||
//
|
||||
for(i = [-1.5 : 1.5])
|
||||
translate([i * 5, NEMA_width(X_motor) / 2 + 2, -NEMA_length(X_motor) / 2])
|
||||
tubing(HSHRNK24);
|
||||
}
|
||||
}
|
||||
translate([switch_op_x, sbracket_y - sbracket_thickness / 2 - microswitch_thickness() / 2, switch_op_z])
|
||||
@@ -526,20 +522,24 @@ module x_end_assembly(motor_end) {
|
||||
//
|
||||
// ribbon clamps
|
||||
//
|
||||
translate([x_motor_offset(), x_end_ribbon_clamp_y(), x_end_ribbon_clamp_z()])
|
||||
rotate([-90, 0, 0])
|
||||
ribbon_clamp_assembly(x_end_ways, M3_hex_screw, 16, mbracket_thickness);
|
||||
translate([x_motor_offset(), x_end_ribbon_clamp_y(), x_end_ribbon_clamp_z()]) {
|
||||
rotate([90, 0, 0]) {
|
||||
color(x_end_bracket_color) render() x_motor_ribbon_bracket_stl(false);
|
||||
|
||||
translate([0, 0, ribbon_bracket_counterbore() - exploded * 7])
|
||||
rotate([180, 0, 0])
|
||||
washer(M3_washer)
|
||||
screw(M3_cap_screw, 45);
|
||||
}
|
||||
explode([0, 8, 0])
|
||||
rotate([-90, 0, 0])
|
||||
ribbon_clamp_assembly(x_end_ways, M3_cap_screw, 16, ribbon_bracket_thickness() - M3_nut_trap_depth);
|
||||
}
|
||||
|
||||
|
||||
translate([ribbon_clamp_x, ribbon_clamp_y, ribbon_clamp_z])
|
||||
rotate([-90, 90, 90])
|
||||
ribbon_clamp_assembly(extruder_ways, ribbon_screw, 16, wall, true);
|
||||
//
|
||||
// Heatshrink for motor connections
|
||||
//
|
||||
for(i = [-1.5 : 1.5])
|
||||
translate([i * 5 + back - mbracket_width / 2, 0, mbracket_height - thickness / 2])
|
||||
rotate([90, 0, 0])
|
||||
tubing(HSHRNK24);
|
||||
}
|
||||
else {
|
||||
translate([x_idler_offset(), idler_front - idler_stack / 2 - shift * 4, 0]) {
|
||||
@@ -568,41 +568,34 @@ module x_end_assembly(motor_end) {
|
||||
end("x_idler_assembly");
|
||||
}
|
||||
|
||||
module x_motor_bracket_stl() {
|
||||
translate([0, 0, thickness / 2]) mirror ([1,0,0]) x_end_bracket(true);
|
||||
for(side = [-1, 1])
|
||||
translate([-back + mbracket_width, mbracket_centre + side * mbracket_depth / 2, 0])
|
||||
rotate([0, 0, 135 + side * 45]) corner_shield(20, mbracket_height - 1 - 2 * eta, mbracket_corner);
|
||||
}
|
||||
module x_motor_bracket_stl(integral_support = true)
|
||||
translate([0, 0, thickness / 2]) mirror ([1,0,0]) x_end_bracket(true, integral_support);
|
||||
|
||||
module x_idler_bracket_stl()
|
||||
module x_idler_bracket_stl(integral_support = true)
|
||||
translate([0, 0, thickness / 2])
|
||||
x_end_bracket(false);
|
||||
x_end_bracket(false, integral_support);
|
||||
|
||||
module x_ends_stl() {
|
||||
x_motor_bracket_stl();
|
||||
translate([-5, bearing_width / 2, 0])
|
||||
translate([-bearing_width / 4, bearing_width / 2, 0])
|
||||
x_idler_bracket_stl();
|
||||
}
|
||||
|
||||
module x_motor_bracket_x2_stl() {
|
||||
translate([back - mbracket_width / 2 - 1, -mbracket_centre + mbracket_depth / 2 + 1, thickness / 2]) mirror ([1,0,0]) x_end_bracket(true);
|
||||
translate([mbracket_width / 2 - 1, mbracket_depth + 1, 0])
|
||||
module facing_pair(dir = 1) {
|
||||
child();
|
||||
translate([-dir * bearing_width / 4, dir * bearing_width / 2, 0])
|
||||
rotate([0, 0, 180])
|
||||
corner_shield(20, mbracket_height - 1 - 2 * eta, mbracket_corner);
|
||||
|
||||
translate([mbracket_width / 2 - back, mbracket_centre - mbracket_depth / 2 - 1, thickness / 2]) rotate([0, 0, 180]) mirror ([1,0,0]) x_end_bracket(true);
|
||||
translate([-mbracket_width / 2, -mbracket_depth - 1, 0])
|
||||
corner_shield(20, mbracket_height - 1 - 2 * eta, mbracket_corner);
|
||||
|
||||
child();
|
||||
}
|
||||
|
||||
module x_idler_bracket_x2_stl() {
|
||||
for(a = [0, 180])
|
||||
rotate([0, 0, a])
|
||||
translate([-x_idler_offset() + 1, 0, 0])
|
||||
x_idler_bracket_stl();
|
||||
}
|
||||
|
||||
module x_motor_bracket_x2_stl() facing_pair() x_motor_bracket_stl(false);
|
||||
|
||||
module x_motor_support_x2_stl() facing_pair() x_motor_support_stl();
|
||||
|
||||
module x_idler_bracket_x2_stl() facing_pair(-1) x_idler_bracket_stl(false);
|
||||
|
||||
module x_idler_support_x2_stl() facing_pair(-1) x_idler_support_stl();
|
||||
|
||||
|
||||
if(0)
|
||||
@@ -614,3 +607,4 @@ else
|
||||
mirror ([1,0,0]) x_end_assembly(true);
|
||||
|
||||
//x_motor_bracket_stl();
|
||||
//x_motor_ribbon_bracket_stl();
|
||||
|
86
scad/x_idler_clamp.scad
Normal file
86
scad/x_idler_clamp.scad
Normal file
@@ -0,0 +1,86 @@
|
||||
//
|
||||
// Mendel90
|
||||
//
|
||||
// GNU GPL v2
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// Bodge to stop x_idler slipping
|
||||
//
|
||||
include <conf/config.scad>
|
||||
|
||||
shaft_dia = 8;
|
||||
|
||||
|
||||
holeR = M3_clearance_radius;
|
||||
nutR = M3_nut_radius;
|
||||
nutH = M3_nut_trap_depth;
|
||||
wall = 2;
|
||||
rad = M3_nut_radius + wall;
|
||||
|
||||
holeX1 = rad;
|
||||
holeY1 = shaft_dia / 2 + M3_clearance_radius;
|
||||
|
||||
depth = 8;
|
||||
centre_line = depth / 2 + 0.5;
|
||||
|
||||
module x_idler_clamp_stl(){
|
||||
stl("x_idler_clamp");
|
||||
|
||||
translate([0, 0, depth / 2]) union() {
|
||||
difference(){
|
||||
linear_extrude(height = depth, center = true, convexity = 5) {
|
||||
hull() {
|
||||
translate([holeX1, holeY1])
|
||||
circle(r = rad, center = true);
|
||||
translate([holeX1, -holeY1])
|
||||
circle(r = rad, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
//nut holes
|
||||
translate([holeX1, holeY1, nutH/2 - 4.01]) rotate([0,0, 30]) cylinder(h = nutH, r=nutR, $fn=6, center=true);
|
||||
|
||||
//shaft groves
|
||||
translate([holeX1, 0, centre_line]) rotate([0,90,0]) cylinder(h = 2 * rad + 1, r = shaft_dia / 2, center = true);
|
||||
|
||||
//screw holes
|
||||
for(y = [-1, 1])
|
||||
translate([holeX1, y * holeY1, -10]) rotate([0,0, y * 360/28]) poly_cylinder(h = 20, r=holeR);
|
||||
|
||||
//slots to prevent screw holes beading into the shaft holes
|
||||
translate([holeX1, 0, centre_line])
|
||||
cube([2 * holeR, 2 * holeY1, shaft_dia], center = true);
|
||||
}
|
||||
// support bridge
|
||||
translate([holeX1, holeY1, nutH-3.9]) cylinder(h = 0.4, r=nutR+0.1, $fn=6, center=true);
|
||||
}
|
||||
}
|
||||
|
||||
module x_idler_clamp_assembly() {
|
||||
|
||||
for(side = [-1, 1])
|
||||
explode([10 * side, 0, 0])
|
||||
translate([centre_line * side, 0, 0])
|
||||
rotate([0, 90, 90 * side + 90]) {
|
||||
color(z_coupling_color) render() translate([0, 0, -depth/2]) x_idler_clamp_stl();
|
||||
for(pos = [[holeX1, -holeY1]])
|
||||
translate([pos[0], pos[1], -depth/2])
|
||||
rotate([180, 0, 0])
|
||||
screw_and_washer(M3_cap_screw, 20);
|
||||
|
||||
for(pos = [[holeX1, holeY1]])
|
||||
translate([pos[0], pos[1], -depth/2 + nutH])
|
||||
rotate([180, 0, 90])
|
||||
nut(M3_nut, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(0) {
|
||||
x_idler_clamp_stl();
|
||||
translate([- 2 * rad - 2, 0, 0])
|
||||
x_idler_clamp_stl();
|
||||
}
|
||||
else
|
||||
x_idler_clamp_assembly();
|
@@ -42,7 +42,7 @@ module y_belt_anchor(height, toothed) {
|
||||
recess = length - depth;
|
||||
|
||||
stl(str("y_belt_anchor", toothed ? "_toothed" : ""));
|
||||
color(y_belt_anchor_color) union() {
|
||||
union() {
|
||||
difference() {
|
||||
union() {
|
||||
translate([0, depth / 2, h / 2]) // tall bit
|
||||
@@ -90,7 +90,7 @@ module y_belt_anchor(height, toothed) {
|
||||
module y_belt_clip(toothed) {
|
||||
stl(str("y_belt_clip", toothed ? "_toothed" : ""));
|
||||
|
||||
color(y_belt_clip_color) union() {
|
||||
union() {
|
||||
translate([0, 0, clamp_thickness / 2]) difference() {
|
||||
rounded_rectangle([width, depth, clamp_thickness], r = rad);
|
||||
|
||||
@@ -146,8 +146,8 @@ module y_belt_clip_toothed_stl() y_belt_clip(true);
|
||||
module y_belt_anchors_stl() {
|
||||
translate([0, 0, 0]) y_belt_anchor_toothed_stl();
|
||||
translate([0, 25, 0]) y_belt_anchor_stl();
|
||||
translate([15, 5, 0]) rotate([0,0,90])y_belt_clip_toothed_stl();
|
||||
translate([15,30, 0]) rotate([0,0,90]) y_belt_clip_stl();
|
||||
// translate([15, 5, 0]) rotate([0,0,90])y_belt_clip_toothed_stl();
|
||||
// translate([15,30, 0]) rotate([0,0,90]) y_belt_clip_stl();
|
||||
}
|
||||
|
||||
if(1)
|
||||
|
@@ -95,7 +95,8 @@ module y_motor_assembly() {
|
||||
//
|
||||
// Motor and screws
|
||||
//
|
||||
NEMA(Y_motor);
|
||||
rotate([0, 0, 180])
|
||||
NEMA(Y_motor);
|
||||
translate([0,0, thickness])
|
||||
NEMA_screws(Y_motor);
|
||||
//
|
||||
|
@@ -9,33 +9,40 @@
|
||||
//
|
||||
include <conf/config.scad>
|
||||
|
||||
studding_dia = Z_screw_dia;
|
||||
shaft_dia = 7; // includes tubing
|
||||
actual_dia = [ undef, undef, undef, undef, undef, 4.82, 5.65, undef, 7.8]; // measured, doesn't match standard thread data
|
||||
|
||||
studding_dia = actual_dia[Z_screw_dia];
|
||||
|
||||
shaft_dia = 7.75; // includes tubing
|
||||
squeeze = 0.5; // how much holes undersized
|
||||
holeR = M3_clearance_radius;
|
||||
nutR = M3_nut_radius;
|
||||
nutH = M3_nut_trap_depth;
|
||||
corner_cut = 26;
|
||||
wall = 2;
|
||||
gap = wall;
|
||||
|
||||
holeX = 7.5;
|
||||
holeY2 = studding_dia / 2 + M3_clearance_radius;
|
||||
holeY1 = shaft_dia / 2 + M3_clearance_radius;
|
||||
holeY1 = shaft_dia / 2 + M3_clearance_radius;
|
||||
|
||||
nut_flat_radius = M3_nut_radius * cos(30);
|
||||
width = 2 * (max(holeY2, holeY1) + nut_flat_radius + wall);
|
||||
length = 30;
|
||||
tubing_length = (length - gap) / 2 + 2;
|
||||
|
||||
function z_coupling_length() = length;
|
||||
function z_coupling_gap() = gap;
|
||||
|
||||
depth = 8;
|
||||
centre_line = depth / 2 + 0.5;
|
||||
centre_line = depth / 2;
|
||||
|
||||
rad = M3_nut_radius + wall;
|
||||
|
||||
module z_coupling_stl(){
|
||||
stl("z_coupling");
|
||||
|
||||
color(z_coupling_color) translate([0, 0, depth / 2]) union() {
|
||||
translate([0, 0, depth / 2]) union() {
|
||||
difference(){
|
||||
linear_extrude(height = depth, center = true)
|
||||
hull() {
|
||||
@@ -56,12 +63,12 @@ module z_coupling_stl(){
|
||||
}
|
||||
|
||||
//nut holes
|
||||
translate([ holeX, holeY1, nutH/2 - 4.01]) rotate([0,0, 30]) cylinder(h = nutH, r=nutR, $fn=6, center=true);
|
||||
translate([-holeX, holeY2, nutH/2 - 4.01]) rotate([0,0,-30]) cylinder(h = nutH, r=nutR, $fn=6, center=true);
|
||||
translate([ holeX, -holeY1, - depth / 2]) rotate([0,0, 30]) cylinder(h = nutH * 2, r=nutR, $fn=6, center=true);
|
||||
translate([-holeX, holeY2, - depth / 2]) rotate([0,0,-30]) cylinder(h = nutH * 2, r=nutR, $fn=6, center=true);
|
||||
|
||||
//shaft groves
|
||||
translate([ -17, 0, centre_line]) rotate([0,90,0]) cylinder(h = 16, r=studding_dia / 2);
|
||||
translate([ 1, 0, centre_line]) rotate([0,90,0]) cylinder(h = 16, r=shaft_dia / 2);
|
||||
translate([-gap / 2, 0, centre_line]) rotate([0,-90,0]) cylinder(h = length, r = (studding_dia - squeeze) / 2);
|
||||
translate([ gap / 2, 0, centre_line]) rotate([0, 90,0]) cylinder(h = length, r = (shaft_dia - squeeze) / 2);
|
||||
|
||||
//screw holes
|
||||
for(y = [-1, 1]) {
|
||||
@@ -77,8 +84,8 @@ module z_coupling_stl(){
|
||||
|
||||
}
|
||||
// bridge
|
||||
translate([ holeX, holeY1, nutH-3.9]) cylinder(h = 0.4, r=nutR+0.1, $fn=6, center=true);
|
||||
translate([-holeX, holeY2, nutH-3.9]) cylinder(h = 0.4, r=nutR+0.1, $fn=6, center=true);
|
||||
translate([ holeX, -holeY1, nutH - depth / 2]) cylinder(h = 0.4, r=nutR+0.1, center=true);
|
||||
translate([-holeX, holeY2, nutH - depth / 2]) cylinder(h = 0.4, r=nutR+0.1, center=true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,23 +94,23 @@ module z_coupler_assembly() {
|
||||
|
||||
for(side = [-1, 1])
|
||||
explode([10 * side, 0, 0])
|
||||
translate([centre_line * side, 0, 0])
|
||||
translate([(centre_line + 0.05) * side, 0, 0])
|
||||
rotate([0, 90, 90 * side + 90]) {
|
||||
color(z_coupling_color) render() translate([0, 0, -depth/2]) z_coupling_stl();
|
||||
for(pos = [[holeX, -holeY1], [-holeX, -holeY2]])
|
||||
for(pos = [[holeX, holeY1], [-holeX, -holeY2]])
|
||||
translate([pos[0], pos[1], -depth/2])
|
||||
rotate([180, 0, 0])
|
||||
screw_and_washer(M3_cap_screw, 20);
|
||||
|
||||
for(pos = [[holeX, holeY1], [-holeX, holeY2]])
|
||||
for(pos = [[holeX, -holeY1], [-holeX, holeY2]])
|
||||
translate([pos[0], pos[1], -depth/2 + nutH])
|
||||
rotate([180, 0, 0])
|
||||
rotate([180, 0, 30])
|
||||
nut(M3_nut, true);
|
||||
|
||||
}
|
||||
|
||||
translate([0, 0, -9])
|
||||
tubing(PVC64, 16, shaft_dia);
|
||||
translate([0, 0, -tubing_length / 2 - gap / 2])
|
||||
tubing(NEOP85, tubing_length, NEMA_shaft_dia(Z_motor));
|
||||
|
||||
//end("z_coupler_assembly");
|
||||
}
|
||||
|
@@ -136,7 +136,7 @@ module z_motor_bracket_holes(gantry_setback)
|
||||
frame_screw_hole();
|
||||
|
||||
|
||||
module z_motor_assembly(gantry_setback, rhs, standalone = false) {
|
||||
module z_motor_assembly(gantry_setback, rhs, rotated = true) {
|
||||
assembly("z_motor_assembly");
|
||||
|
||||
color(z_motor_bracket_color) render() z_motor_bracket(gantry_setback, rhs);
|
||||
@@ -156,9 +156,8 @@ module z_motor_assembly(gantry_setback, rhs, standalone = false) {
|
||||
//
|
||||
// Mounting screws
|
||||
//
|
||||
if(!standalone)
|
||||
z_motor_bracket_hole_positions(gantry_setback)
|
||||
frame_screw(part_base_thickness);
|
||||
z_motor_bracket_hole_positions(gantry_setback)
|
||||
frame_screw(part_base_thickness);
|
||||
//
|
||||
// Motor and screws
|
||||
//
|
||||
@@ -170,8 +169,8 @@ module z_motor_assembly(gantry_setback, rhs, standalone = false) {
|
||||
// The coupling assembly
|
||||
//
|
||||
explode([0, 0, 30])
|
||||
translate([0, 0, NEMA_shaft_length(Z_motor) + 1])
|
||||
rotate([0,0,45])
|
||||
translate([0, 0, NEMA_shaft_length(Z_motor)])
|
||||
rotate([0, 0, rotated ? 45 : 0])
|
||||
z_coupler_assembly();
|
||||
|
||||
end("z_motor_assembly");
|
||||
|
@@ -10,16 +10,18 @@
|
||||
include <conf/config.scad>
|
||||
|
||||
wall = 2.4;
|
||||
inner_rad = (((Z_screw_dia == 6) ? M6_tap_radius : M8_tap_radius) + Z_screw_dia / 2) / 2; // half depth thread
|
||||
tap_rad = (Z_screw_dia == 6) ? M6_tap_radius : ((Z_screw_dia == 5) ? M5_tap_radius : M8_tap_radius);
|
||||
inner_rad = (tap_rad + Z_screw_dia / 2) / 2; // half depth thread
|
||||
outer_rad = inner_rad + wall;
|
||||
|
||||
function z_screw_pointer_height() = 5;
|
||||
function z_screw_pointer_radius() = outer_rad;
|
||||
function z_screw_pointer_length() = z_bar_offset() - Z_bar_dia / 2 - 1;
|
||||
|
||||
module z_screw_pointer_stl() {
|
||||
height = z_screw_pointer_height();
|
||||
|
||||
pointer = z_bar_offset() - Z_bar_dia / 2 - 1;
|
||||
pointer =z_screw_pointer_length();
|
||||
|
||||
stl("z_screw_pointer");
|
||||
difference() {
|
||||
|
Reference in New Issue
Block a user