1
0
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:
Chris Palmer
2013-09-25 01:28:24 +01:00
parent 9345a5b85a
commit 4849e642e2
488 changed files with 564970 additions and 587239 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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