1
0
mirror of https://github.com/nophead/Mendel90.git synced 2025-01-16 20:38:15 +01:00

Mods to carriage for Huxley.

Fan duct bracket screws longer for easier removal and replacement.
Direct 1.75mm drive extruder for Huxley.
MK5B J-head model length corrected to match reality.
This commit is contained in:
Chris Palmer 2016-01-10 21:11:17 +00:00
parent 4f56561bb7
commit eeb12dd3cb
35 changed files with 6077 additions and 5930 deletions

View File

@ -32,8 +32,8 @@ Vitamins:
| | | | | | | | | | | | | | | | 1| | | | | | 1 Belt T2 x 6mm x 662mm
| | | | | | | | | | | 1| | | | | | | | | | | 1 Belt T2 x 6mm x 860mm
| | | | | | | | 4| | | | | | | | | | | | | | 4 Corrugated cardboard 201mm x 216mm x 5mm
| | | | | | | | 4| | | | 2| | | | | | | | | | 6 M3 cap screw x 10mm
| 4| 3| | | | | | | | | | | | | 6| 4|14| | | 2| 2| 35 M3 cap screw x 16mm
| | | | | | | | 4| | | | | | | | | | | | | | 4 M3 cap screw x 10mm
| 4| 3| | | | | | | | | | 2| | | 6| 4|14| | | 2| 2| 37 M3 cap screw x 16mm
| | | | | | | | | | | | 1| | 8|10| | 2| | | | 8| 29 M3 cap screw x 20mm
| | | | | | | | | | | | 2| | | | | | | | | | 2 M3 cap screw x 25mm
| | | | 2| | | | | | | | | | | 2| | | | | | | 4 M3 cap screw x 45mm

View File

@ -1,6 +1,6 @@
x_carriage_assembly:
Vitamins:
2 M3 cap screw x 10mm
2 M3 cap screw x 16mm
1 M3 cap screw x 20mm
2 M3 cap screw x 25mm
3 LM8UU linear bearing

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 KiB

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

@ -75,6 +75,7 @@ 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;
squeeze = false; // Bodge to make Huxley as small as possible without affecting dibond kits
@ -106,9 +107,9 @@ Y_carriage_rad = 3; // corner radius
Z_clearance = 10; // How close the top of the object gets to the gantry
belt_clearance = 0.2; // clearance of belt clamp slots
X_bar_dia = X_bearings[2]; // rod sizes to match the bearings
Y_bar_dia = Y_bearings[2];
Z_bar_dia = Z_bearings[2];
X_bar_dia = bearing_rod_dia(X_bearings); // rod sizes to match the bearings
Y_bar_dia = bearing_rod_dia(Y_bearings);
Z_bar_dia = bearing_rod_dia(Z_bearings);
Y_idler_bearing = BB624;
X_idler_bearing = BB624;

View File

@ -17,32 +17,41 @@ X_motor = NEMA14;
Y_motor = NEMA14;
Z_motor = NEMA14;
hot_end = JHeadMk5;
hot_end = JHeadMk5x;
extruder = Direct14;
X_travel = 150;
X_travel = 152;
Y_travel = 150;
Z_travel = 150;
bed_depth = 164;
bed_width = 114;
vero_bed = true;
x_holes = round(150 / 2.54) + 6;
y_holes = round(Y_travel / 2.54) + 4;
bed_depth = 160; // 59 + 4 holes
bed_width = 165; // 59 + 6 holes
bed_pillars = M3x20_pillar;
bed_glass = glass2;
bed_thickness = pcb_thickness + sheet_thickness(bed_glass); // PCB heater plus glass sheet
bed_holes = [bed_width - 2 * 2.54, bed_depth - 2 * 2.54];
bed_holes = [(x_holes - 3) * 2.54, (y_holes - 3) * 2.54];
base = DiBond; // Sheet material used for the base. Needs to be thick enough to screw into.
base_corners = 25;
base_nuts = true;
squeeze = true;
frame = DiBond;
frame_corners = 25;
frame_nuts = true;
case_fan = fan80x38;
case_fan = fan80x25;
part_fan = fan40x11;
psu = External;
controller = Melzi;
raspberry_pi = true;
raspberry_pi_camera = true;
light_strip = RIGID5050_208;
spool = spool_200x55;
bottom_limit_switch = false;
@ -53,23 +62,21 @@ 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;
pulley_type = GT2x20_metal_pulley;
Y_carriage = DiBond;
pulley_type = GT2x20_metal_pulley;
X_belt = GT2x6;
Y_belt = GT2x6;
motor_shaft = 5;
Z_screw_dia = 5; // Studding for Z axis
Y_carriage_depth = bed_holes[1] + 7;
Y_carriage_width = bed_holes[1] + 7;
Y_carriage_width = bed_holes[0] + 7;
Z_nut_radius = M6_nut_radius;
Z_nut_depth = M6_nut_depth;
Z_nut = M6_nut;
Z_nut_radius = M5_nut_radius;
Z_nut_depth = M5_nut_depth;
Z_nut = M5_nut;
//
// Default screw use where size doesn't matter
@ -85,5 +92,5 @@ frame_thick_screw = M3_pan_screw; // Used with tapped holes when sheet
//
// Feature sizes
//
default_wall = 3;
default_wall = 2;
thick_wall = 3;

512
scad/direct.scad Normal file
View File

@ -0,0 +1,512 @@
//
// Mendel90
//
// GNU GPL v2
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// Direct drive extruder
//
include <conf/config.scad>
use <d-motor_bracket.scad>
use <vitamins/jhead_hot_end.scad>
MiniHyena = [5, 8, 13, 4, 6.3, 5.3, 1.5, 9, M3_grub_screw, 3];
function hobbed_id(type) = type[0];
function hobbed_od(type) = type[1];
function hobbed_length(type) = type[2];
function hobbed_offset(type) = type[3];
function hobbed_hob_od(type) = type[4];
function hobbed_hob_id(type) = type[5];
function hobbed_hob_radius(type) = type[6];
function hobbed_screw_z(type) = type[7];
function hobbed_screw_type(type) = type[8];
function hobbed_screw_l(type) = type[9];
module hobbed_pulley(type) {
od = hobbed_od(type);
id = hobbed_id(type);
len = hobbed_length(type);
vitamin(str("HOB",od, id, len, ": hobbed pulley ", od, ,"x", id));
color("DarkGoldenrod") render() difference() {
cylinder(r = od / 2, h = len);
cylinder(r = id / 2, h = len * 2 + 1, center = true);
translate([0, 0, hobbed_offset(type)])
rotate_extrude(a = 360)
translate([hobbed_hob_od(type) / 2 + hobbed_hob_radius(type), 0])
circle(r = hobbed_hob_radius(type));
translate([0, 0, hobbed_screw_z(type)])
rotate([-90, 0, 0])
cylinder(r = screw_radius(hobbed_screw_type(type)), h = od / 2 + 1);
}
}
module hobbed_pulley_assembly(type) {
hobbed_pulley(type);
translate([0, hobbed_id(type) / 2 + hobbed_screw_l(type) - 0.5, hobbed_screw_z(type)])
rotate([-90, 0, 0])
screw(hobbed_screw_type(type), hobbed_screw_l(type));
}
peg_spring = [ 6.5, 0.96, 16, 8];
pulley = MiniHyena;
idler = BB624;
motor = extruder_motor(extruder);
spring = peg_spring;
compressed_spring = 9.5;
width = extruder_width(extruder);
length = extruder_length(extruder);
motor_thickness = 5;
base_thickness = 8;
height = base_thickness + NEMA_width(motor) + 1;
filament_r = 1.75 / 2;
filament_x = 0;
filament_z = width / 2;
filament_path_r = 1;
motor_y = height - NEMA_width(motor) / 2 - 1;
motor_x = filament_x + filament_r + hobbed_hob_id(pulley) / 2;
motor_z = 0;
motor_plate_width = NEMA_width(motor) + 2;
motor_plate_rad = (motor_plate_width - NEMA_hole_pitch(motor)) / 2;
mount_pitch = 25;
idler_closed_x = motor_x - hobbed_od(pulley) / 2 - ball_bearing_diameter(idler) / 2;
idler_x = filament_x - filament_r - ball_bearing_diameter(idler) / 2;
idler_z = filament_z;
idler_y = motor_y;
idler_clearance = 1;
motor_screw_offset = NEMA_hole_pitch(motor) / 2;
idler_pivot_x = motor_x - motor_screw_offset;
idler_pivot_y = motor_y + motor_screw_offset;
idler_swing_r = sqrt(sqr(idler_x -idler_pivot_x) + sqr(idler_y - idler_pivot_y));
idler_max_swing = atan((idler_closed_x - idler_pivot_x) / idler_swing_r);
lever_bottom_y = base_thickness + 1;
lever_width = 2 * motor_plate_rad + 1;
spring_x = idler_pivot_x - lever_width / 2;
spring_z = filament_z + filament_path_r + 3 * layer_height + screw_clearance_radius(M3_cap_screw);
spring_y = lever_bottom_y + 5;
jhead_screw = M3_cap_screw;
jhead_screw_length = 16;
jhead_washer = M4_washer;
jhead_screw_pitch = max(hot_end_insulator_diameter(hot_end) / 2 + screw_head_radius(jhead_screw),
jhead_groove_dia() / 2 + washer_diameter(jhead_washer) / 2);
angle = 30;
jhead_screw_angles = [angle, -angle, 180 - angle, -180 + angle];
jhead_nut_slot = nut_thickness(screw_nut(jhead_screw)) + 0.3;
extension = max(0, nozzle_length - hot_end_length(hot_end));
extension_width = extruder_hole(extruder)[0] - 1;
extension_rad = jhead_screw_pitch + 5;
extension_clearance = 1;
jhead_nut_pos = -extension - base_thickness + 2 + jhead_nut_slot;
filament_top_guide_r = tubing_od(PF7) / 2 + 2;
function direct_extruder_connector_offset() = [-motor_x, -width / 2, motor_y] + d_motor_connector_offset();
idler_clearance_r = ball_bearing_diameter(idler) / 2 + idler_closed_x - idler_x;
filament_bottom_guide_w = 2 * (filament_path_r + layer_height / 4 + min_wall);
filament_lower_gap = sqrt(sqr(idler_clearance_r) - sqr(idler_x - filament_x + filament_bottom_guide_w / 2));
filament_bottom_guide_length = idler_y - filament_lower_gap;
filament_botton_guide_height = filament_z - hobbed_offset(pulley) + hobbed_screw_z(pulley) - screw_radius(hobbed_screw_type(pulley)) - 0.5;
filament_bottom_guide_x = filament_x - filament_bottom_guide_w / 2;
bulkhead_x = filament_bottom_guide_x;
bulkhead_depth = filament_x + cos(angle) * jhead_screw_pitch - nut_trap_flat_radius(screw_nut(jhead_screw)) - bulkhead_x;
grub_screw_clearance_r = NEMA_shaft_dia(motor) / 2 + hobbed_screw_l(pulley);
module keyhole(r, h, l) {
R = r + layer_height / 4;
waist = 2 * R - 1;
entrance = 2 * R + 0.5;
y = sqrt(R * R - waist * waist / 4);
teardrop(h = h, r = R, center = true);
}
module direct_block_stl(include_support = true) {
stl("direct_block");
feed_tube_socket = 5;
insulator = hot_end_insulator_diameter(hot_end);
screw_pitch = hot_end_screw_pitch(hot_end);
insulator_depth = hot_end_inset(hot_end);
base_rad = 10.6;
filament_top_guide_length = feed_tube_socket + 2;
filament_top_guide_top = height + filament_top_guide_length - eta;
nut_channel_width = 2 * nut_radius(M4_nut) + 0.2;
nut_channel_z = idler_z - ball_bearing_width(idler) / 2 - nut_thickness(M4_nut) - layer_height;
difference(){
union(){
//
// motor plate
//
translate([motor_x - motor_plate_width / 2, 0, 0]){
hull() {
cube([motor_plate_width, 1, motor_thickness]);
for(x = [motor_plate_rad, motor_plate_width - motor_plate_rad])
translate([x, height - motor_plate_rad, 0])
cylinder(r = motor_plate_rad, h = motor_thickness);
}
}
//
// Filament guide
//
translate([bulkhead_x, 0, 0])
cube([bulkhead_depth, motor_y - grub_screw_clearance_r, width]);
translate([filament_bottom_guide_x, 0, 0])
cube([filament_bottom_guide_w, filament_bottom_guide_length, filament_botton_guide_height]);
hull() {
translate([filament_x, filament_top_guide_top - filament_top_guide_length, filament_z])
rotate([-90, 0, 0])
cylinder(r = filament_top_guide_r, h = filament_top_guide_length);
translate([filament_x - filament_top_guide_r, filament_top_guide_top - filament_top_guide_length, 0])
cube([filament_top_guide_r * 2, filament_top_guide_length, 1]);
}
// base
hull()
for(end = [-1 , 1])
translate([end * (length / 2 - base_rad), base_thickness / 2, filament_z])
intersection() {
union() {
for(a = [-90, 90])
rotate([a, 0, 0])
teardrop(r = base_rad, h = base_thickness, truncate = false, center = true);
}
cube([width * 2, base_thickness + 1, width], center = true);
}
if(extension)
translate([filament_x - extension_width / 2, -extension + extension_clearance + eta, 0])
intersection() {
cube([extension_width, extension - extension_clearance, width]);
translate([extension_width / 2, extension / 2, filament_z])
rotate([-90, 0, 0])
teardrop(r = extension_rad, h = extension + 1, center = true);
}
}
// filament path
translate([filament_x, 0, filament_z])
rotate([90,0,0]) {
teardrop_plus(h = 2 * filament_top_guide_top + 1, r = filament_path_r, center=true); // filament
translate([0, 0, -filament_top_guide_top])
teardrop_plus(h = feed_tube_socket * 2, r = tubing_od(PF7) / 2, center = true); // feed tube
}
//
// idler tension screw
//
translate([bulkhead_x + bulkhead_depth, spring_y, spring_z])
rotate([90, 0, 90])
nut_trap(screw_clearance_radius(M4_cap_screw), nut_radius(M4_nut), nut_thickness(M4_nut), horizontal = true);
//
// Bearing nut channel
//
translate([idler_pivot_x, idler_pivot_y, nut_channel_z])
linear_extrude(height = 100)
hull() {
translate([0, -idler_swing_r])
circle(nut_channel_width / 2);
rotate([0, 0, idler_max_swing])
translate([0, -idler_swing_r])
circle(nut_channel_width / 2);
}
// mounting holes
for(side = [-1, 1])
translate([filament_x + mount_pitch * side, base_thickness, filament_z])
rotate([90,0,0])
intersection () {
nut_trap(M4_clearance_radius, M4_nut_radius, 3, true);
translate([0, 0, base_thickness / 2])
cylinder(r = 20, h = base_thickness + 1, center = true);
}
//
// holes for motor
//
translate([motor_x, motor_y, 0]) {
hub_recess = round_to_layer(NEMA_boss_height(motor)) + layer_height;
poly_cylinder(r = NEMA_big_hole(motor), h = hub_recess * 2, center = true); // motor hub slot
translate([0, 0, hub_recess + (include_support ? layer_height : -1)])
poly_cylinder(r = hobbed_od(pulley) / 2 + 0.5, h = width, center = false); // hole for shaft and pulley
for(x = NEMA_holes(motor)) // motor screw slots
for(y = NEMA_holes(motor))
translate([x, y, -1])
poly_cylinder(r = M3_clearance_radius, h = 100, center = false);
}
//
// Hole for hot end
//
translate([filament_x, -extension + eta, filament_z])
rotate([90,0,0]) {
relief = 0.5;
translate([0, 0, -insulator_depth + jhead_groove_offset() / 2 + eta]) // slot for the flange
keyhole(insulator / 2, jhead_groove_offset(), width - filament_z);
*translate([0, 0, -insulator_depth + relief / 2])
keyhole(insulator / 2 + 0.5, relief, width - filament_z); // relief to avoid corner radius
//
// Screw holes and nut traps
//
for(i = [0 : len(jhead_screw_angles) - 1])
rotate([0, 0, jhead_screw_angles[i]])
translate([jhead_screw_pitch, 0, 0])
rotate([0, 0, -jhead_screw_angles[i]]) {
translate([0, 0, washer_thickness(M4_washer) + washer_thickness(M3_washer) - extension_clearance])
teardrop_plus(r = screw_clearance_radius(jhead_screw), h = jhead_screw_length * 2, center = true);
translate([0, 0, jhead_nut_pos - jhead_nut_slot / 2]) {
w = nut_flat_radius(screw_nut(jhead_screw));
rotate([0, 0, 90])
nut_trap(0, nut_radius(screw_nut(jhead_screw)), jhead_nut_slot / 2, horizontal = true);
rotate([0, 0, jhead_screw_angles[i] < 0 ? 180 : 0])
translate([-w, -1, -jhead_nut_slot / 2])
cube([w * 2, 100, jhead_nut_slot], center = false);
}
}
}
}
}
module extruder_motor_assembly(show_connector = true, exploded = exploded) {
assembly("extruder_motor_assembly");
// motor and gear
translate([-motor_x, motor_z - width / 2, motor_y])
rotate([90,0,180]) {
rotate([0, 0, 180]) {
NEMA(motor);
translate([0, 0, filament_z - hobbed_offset(pulley)])
rotate([0, 0, -90])
hobbed_pulley_assembly(pulley);
}
if(show_connector)
d_motor_bracket_assembly();
}
end("extruder_motor_assembly");
}
module idler_lever_stl() {
w = lever_width;
h = width - motor_thickness - nut_thickness(M3_nut) - 3 * washer_thickness(M3_washer);
h2 = width - idler_z - ball_bearing_width(idler) / 2 - washer_thickness(M4_washer);
//h3 = width - motor_thickness - screw_head_height(M3_cap_screw) - 3 * washer_thickness(M3_washer);
h4 = width / 2 - filament_path_r - 0.5;
difference() {
union() {
linear_extrude(height = h, convexity = 10) {
union() {
hull() {
circle(ball_bearing_diameter(idler) / 2 - 0.5); // idler boss
translate([idler_x - idler_pivot_x, idler_pivot_y - idler_y]) // pivot boss
circle(w / 2);
}
hull() {
translate([idler_x - idler_pivot_x, idler_pivot_y - idler_y]) // idler boss
circle(w / 2);
translate([idler_x - idler_pivot_x - w / 2, lever_bottom_y - idler_y]) // bottom of lever
square([w, 1]);
}
}
}
*linear_extrude(height = h4) // release handle
hull() {
translate([idler_x - idler_pivot_x, idler_pivot_y - idler_y])
circle(w / 2 - 2);
translate([idler_x - idler_pivot_x - 2 * motor_screw_offset, idler_pivot_y - idler_y])
circle(w / 2 - 2);
}
}
translate([0, 0, h2])
poly_cylinder(r = ball_bearing_diameter(idler) / 2 + 0.5, h = 10); // bearing socket
*translate([idler_x - idler_pivot_x - w / 2 - 1, lever_bottom_y - idler_y - 1, h3])
cube([w + 2, 2 * (motor_y - motor_screw_offset - lever_bottom_y) + 1, 10]); // miss the bottom motor screw
rotate([0, 0, 90])
nut_trap(2, nut_trap_radius(M4_nut, horizontal = false, snug = false), nut_trap_depth(M4_nut), supported = true); // nut trap for axle
translate([idler_x - idler_pivot_x, idler_pivot_y - idler_y, 0])
poly_cylinder(r = 3/2, h = 100, center = true); // pivot hole
translate([idler_closed_x - spring_x, spring_y - idler_y, width - spring_z])
rotate([90, 0, 90])
tearslot(100, M4_clearance_radius, 1, true); // Tension screw slot
translate([idler_x - motor_x,
motor_y - idler_y,
width - (filament_z - hobbed_offset(pulley) + hobbed_screw_z(pulley))]) // clearance for grub screw
cylinder(r =grub_screw_clearance_r,
h = 2 * screw_radius(hobbed_screw_type(pulley)) + 1, center = true);
}
}
module direct_idler_assembly() {
translate([-idler_x, idler_z - width / 2, idler_y]) {
rotate([90, 0, 0]) {
translate([0, 0, idler_z - width])
color("lime") render() idler_lever_stl();
ball_bearing(idler)
screw(M4_hex_screw, 16);
translate([0, 0, -ball_bearing_width(idler) / 2])
rotate([180, 0, 0])
washer(M4_washer);
translate([0, 0, idler_z - width + nut_trap_depth(M4_nut)])
rotate([180, 0, 90])
nut(M4_nut, true);
}
}
translate([-spring_x, spring_z - width / 2, spring_y])
rotate([0, 90, 0])
washer(M4_washer)
comp_spring(spring, compressed_spring)
washer(M4_washer)
screw(M4_cap_screw, 35);
}
module direct_assembly(show_connector = true, show_drive = true) {
assembly("extruder_assembly");
color(wades_block_color) render()
difference() {
translate([0, -filament_z, 0])
rotate([90, 0, 180])
direct_block_stl(false);
*translate([-1,-10, filament_z]) // cross section
cube([200,100,100]);
}
if(show_drive) {
// mounting screws
for(side = [-1, 1])
translate([filament_x + mount_pitch * side, 0, base_thickness - 3])
screw(M4_hex_screw, 20);
// motor
translate([0, 0, 50 * exploded])
extruder_motor_assembly(show_connector, 0);
translate([-motor_x, -width / 2 + motor_thickness, motor_y]) {
rotate([-90, 0, 0])
NEMA_screws(motor, 3, 8, M3_pan_screw);
}
translate([-idler_pivot_x, width / 2, idler_pivot_y])
rotate([-90, 0, 0]) {
screw_and_washer(M3_cap_screw, 25);
translate([0, 0, -(width - motor_thickness)])
washer(M3_washer)
star_washer(M3_washer)
nut(M3_nut)
washer(M3_washer);
}
//
// Filament
//
color("lime") render() cylinder(r = filament_r, h = 100);
//
// Idler
//
direct_idler_assembly();
translate([-bulkhead_x - bulkhead_depth, spring_z - width / 2, spring_y])
rotate([0, 90, 0])
nut(M4_nut);
}
//
// Hot end
//
assembly("hot_end_assembly");
translate([filament_x, 0, -extension])
rotate([0, 0, 0]) {
if(hot_end_style(hot_end) == m90)
m90_hot_end(hot_end);
if(hot_end_style(hot_end) == Stoffel)
stoffel_hot_end(hot_end);
if(hot_end_style(hot_end) == jhead)
jhead_hot_end(hot_end, exploded = 0);
}
end("hot_end_assembly");
//
// Hot end screws
//
translate([filament_x, 0, -extension])
for(i = [0 : len(jhead_screw_angles) - 1]) {
a = jhead_screw_angles[i];
rotate([180, 0, a]) {
translate([jhead_screw_pitch, 0, 0])
washer(jhead_washer)
screw_and_washer(jhead_screw, jhead_screw_length, true);
translate([jhead_screw_pitch, 0, jhead_nut_pos - jhead_nut_slot / 2 + nut_thickness(screw_nut(jhead_screw)) / 2])
explode([ [ 10 * cos(a), 10 * sin(a), 0],
[ 10 * sin(a), -10 * cos(a), 0],
[-10 * sin(a), 10 * cos(a), 0] ][i])
rotate([180, 0, -a + 90])
nut(screw_nut(jhead_screw));
}
}
end("extruder_assembly");
}
module direct_extruder_stl() {
direct_block_stl();
translate([34, 37, 0])
idler_lever_stl();
}
if(1)
direct_assembly(true);
else
direct_extruder_stl();

View File

@ -30,11 +30,12 @@ use <raspberry_pi.scad>
use <raspberry_pi_camera.scad>
use <light_strip.scad>
include <positions.scad>
use <x-carriage_assembly.scad>
X = 0 * X_travel / 2; // - limit_switch_offset;
Y = 0 * Y_travel / 2; // - limit_switch_offset;
Z = 0.5 * Z_travel;
Z = 0.5 * (Z_travel + limit_switch_offset) - hot_end_bodge(hot_end);
//
// X axis
@ -52,7 +53,7 @@ module x_axis_assembly(show_extruder) {
translate([-X + X_origin, 0, Z + Z0 + x_carriage_offset()])
rotate([180, 0, 180])
x_carriage_assembly(show_extruder);
x_carriage_assembly(show_extruder, show_fan = true);
color(belt_color)
translate([0, x_belt_offset(), Z + Z0])

View File

@ -21,6 +21,7 @@ m90_hot_end_12p75mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10,
JHeadMk4 = [jhead, "HEJH16340: JHead MK4 hot end", 64, jhead_inset, 16, 50, "black", 12, true, 10.19 + 4, [0, 2.94, -5]];
JHeadMk5 = [jhead, "HEJH16340: JHead MK5 hot end", 54, jhead_inset, 16, 40, "black", 12, true, 9 + 4, [0, 2.38, -5]];
JHeadMk5x = [jhead, "HEJH16340: JHead MK5 hot end", 51.2,jhead_inset,16, 40, "black", 12, true, 9 + 4, [0, 2.38, -5]];
function hot_end_style(type) = type[0];
function hot_end_part(type) = type[1];
@ -34,4 +35,11 @@ function hot_end_groove_mount(type) = type[8];
function hot_end_duct_radius(type) = type[9];
function hot_end_duct_offset(type) = type[10];
//
// The actual length of a JHeadMk5 is 51.2 but at the time the kit was designed I thought it was 54. The effect of this is that the
// extension on the Wades block is shorter than it should be so the tip of the hot end is higher so the fan duct needs to be
// fitted a bit higher. This bodge allows the model to reflect reality without correcting the extruder block and changing the firmware.
//
function hot_end_bodge(type) = type == JHeadMk5 ? 54 - 51.2 : 0;
function hot_end_length(type) = hot_end_total_length(type) - hot_end_inset(type);

View File

@ -6,8 +6,8 @@
//
include <../conf/config.scad>
MK4_heater = [ 12.76, 15.88, 8.22, (15.88 / 2 - 4.5), (12.76 / 2 - 0.5 - 2.5 / 2), (-15.88 / 2 + 5), 9.5];
MK5_heater = [ 12.76, 12.76, 8.22, (12.76 / 2 - 3.75), (12.76 / 2 - 0.5 - 2.5 / 2), (-12.76 / 2 + 4), 7.5];
MK4_heater = [ 12.76, 15.88, 8.22, (15.88 / 2 - 4.5), (12.76 / 2 - 0.5 - 2.5 / 2), (-15.88 / 2 + 5), 9.5, 3];
MK5_heater = [ 12.76, 12.76, 8.22, (12.76 / 2 - 3.75), (12.76 / 2 - 0.5 - 2.5 / 2), (-12.76 / 2 + 4), 8, 2];
function heater_width(type) = type[0];
function heater_length(type) = type[1];
@ -16,6 +16,7 @@ function resistor_x(type) = type[3];
function thermistor_y(type) = type[4];
function nozzle_x(type) = type[5];
function nozzle_cone(type) = type[6];
function nozzle_cone_length(type) = type[7];
barrel_tap_dia = 5;
@ -46,12 +47,13 @@ module heater_block(type, resistor, thermistor) {
module jhead_hot_end(type, exploded = exploded) {
resistor = RIE1212UB5C5R6;
thermistor = Epcos;
heater = type == JHeadMk5 ? MK5_heater : MK4_heater;
heater = type == JHeadMk4 ? MK4_heater : MK5_heater;
insulator_length = hot_end_insulator_length(type);
inset = hot_end_inset(type);
barrel_length = hot_end_total_length(type) - insulator_length;
cone_length = 3;
length = hot_end_total_length(type) - hot_end_bodge(type);
barrel_length = length - insulator_length;
cone_length = nozzle_cone_length(heater);
cone_end = 1;
cone_start = nozzle_cone(heater);
bundle = 3.2;
@ -61,7 +63,9 @@ module jhead_hot_end(type, exploded = exploded) {
vitamin(hot_end_part(type));
vitamin("ST25110: 110mm x 25mm self amalgamating silicone tape");
//
// silcone tape
//
color("red")
if(exploded)
translate([0, max(hot_end_insulator_diameter(type) / 2, heater_length(heater) / 2 - nozzle_x(heater)),
@ -72,12 +76,14 @@ module jhead_hot_end(type, exploded = exploded) {
translate([0, 0, + inset - insulator_length])
cylinder(r = hot_end_insulator_diameter(type) / 2 + 2 * tape_thickness, h = tape_overlap);
translate([0, -nozzle_x(heater), -hot_end_length(type) + cone_length + 1 + heater_height(heater) / 2 + eta])
translate([0, -nozzle_x(heater), inset - length + cone_length + 1 + heater_height(heater) / 2 + eta])
cube([heater_width(heater) + 4 * tape_thickness,
heater_length(heater) + 4 * tape_thickness, heater_height(heater)], center = true);
}
translate([0, 0, inset - insulator_length]) {
//
// insulator
//
translate([0, 0, inset - insulator_length])
color(hot_end_insulator_colour(type)) render(convexity = 10)
difference() {
cylinder(r = hot_end_insulator_diameter(type) / 2, h = insulator_length);
@ -85,16 +91,18 @@ module jhead_hot_end(type, exploded = exploded) {
translate([0, 0, insulator_length - jhead_groove_offset() - jhead_groove() / 2])
tube(ir = jhead_groove_dia() / 2, or = 17 / 2, h = jhead_groove());
}
//
// nozzle
//
translate([0, 0, inset - length + cone_length])
color("gold") render(convexity = 10) union() {
translate([0, 0, -barrel_length + cone_length + eta]) {
cylinder(r = cone_start / 2, h = barrel_length - cone_length);
translate([0, 0, -cone_length + eta])
cylinder(r1 = cone_end / 2, r = cone_start / 2, h = cone_length);
}
cylinder(r = cone_start / 2, h = barrel_length - cone_length);
translate([0, 0, -cone_length + eta])
cylinder(r1 = cone_end / 2, r = cone_start / 2, h = cone_length);
}
}
//
// Zip tie and heatshrink
//
rotate([0, 0, 10]) {
scale([1, (bundle + hot_end_insulator_diameter(type)) / hot_end_insulator_diameter(type)])
translate([0, -bundle / 2, -7])
@ -113,9 +121,11 @@ module jhead_hot_end(type, exploded = exploded) {
}
wire("Red PTFE", 16, 170);
wire("Red PTFE", 16, 170);
//
// heater block
//
rotate([0, 0, 90])
translate([-nozzle_x(heater), 0, -hot_end_length(type) + cone_length + 1 + heater_height(heater) / 2]) {
translate([-nozzle_x(heater), 0, inset - length + heater_height(heater) / 2 + cone_length + 1]) {
heater_block(heater, resistor, thermistor);
intersection() {
@ -134,4 +144,4 @@ module jhead_hot_end(type, exploded = exploded) {
}
}
jhead_hot_end(JHeadMk5);
jhead_hot_end(hot_end);

View File

@ -65,7 +65,7 @@ bearing_housing_bulge = driven_x - bearing_housing_x + 1;
pscrew_length = 50;
pscrew_x = bearing_housing_x + pscrew_length;
function extruder_connector_offset() = [-filament_x + motor_x, filament_z - thickness, motor_y] + d_motor_connector_offset();
function wades_extruder_connector_offset() = [-filament_x + motor_x, filament_z - thickness, motor_y] + d_motor_connector_offset();
module keyhole(r, h, l) {
R = r + layer_height / 4;

View File

@ -11,32 +11,40 @@
include <conf/config.scad>
use <bearing-holder.scad>
use <wade.scad>
use <direct.scad>
hole = 36;
width = hole + 2 * bearing_holder_width(X_bearings);
function extruder_connector_offset() = extruder == Wades ? wades_extruder_connector_offset() : direct_extruder_connector_offset();
extruder_width = 26;
function nozzle_x_offset() = 16; // offset from centre of the extruder
hole = extruder_hole(extruder);
width = hole[1] + 2 * bearing_holder_width(X_bearings);
extruder_width = extruder_width(extruder);
function nozzle_x_offset() = extruder_x_offset(extruder); // offset from centre of the extruder
length = 97;
top_thickness = 3;
length = extruder_length(extruder) + 1;
top_thickness = 2.8;
min_top_thickness = 2; // recesses for probe and fan screws
rim_thickness = 8;
nut_trap_thickness = 8;
corner_radius = 5;
wall = 2; //2.8;
wall = 2;
nut_flat_rad = squeeze ? nut_trap_flat_radius(M3_nut) : nut_radius(M3_nut); // bodge for backwards compatibility
base_offset = nozzle_x_offset(); // offset of base from centre
bar_offset = ceil(max(X_bearings[2] / 2 + rim_thickness + 1, // offset of carriage origin from bar centres
nut_radius(M3_nut) * 2 + belt_thickness(X_belt) + pulley_inner_radius + 6 * layer_height));
bar_offset = ceil(max(bearing_rod_dia(X_bearings) / 2 + rim_thickness + 1, // z offset of carriage origin from bar centres
nut_flat_rad * 2 + belt_thickness(X_belt) + pulley_inner_radius + 6 * layer_height));
mounting_holes = [[-25, 0], [25, 0], /*[57, 7]*/];
mounting_holes = [[-25, 0], [25, 0]];
function x_carriage_offset() = bar_offset;
function x_bar_spacing() = hole + bearing_holder_width(X_bearings);
function x_bar_spacing() = hole[1] + bearing_holder_width(X_bearings);
function x_carriage_width() = width;
function x_carriage_length() = length;
function x_carriage_thickness() = rim_thickness;
function x_carriage_top_thickness() = top_thickness;
function x_carriage_min_top_thickness() = min_top_thickness;
bar_y = x_bar_spacing() / 2;
bar_x = (length - bearing_holder_length(X_bearings)) / 2;
@ -49,6 +57,8 @@ lug_depth = X_carriage_clearance + belt_width(X_belt) + belt_clearance + M3_clea
lug_screw = -(X_carriage_clearance + belt_width(X_belt) + belt_clearance + M3_clearance_radius);
slot_y = -X_carriage_clearance - (belt_width(X_belt) + belt_clearance) / 2;
echo(bar_x, zip_x);
function x_carriage_belt_gap() = length - lug_width;
clamp_thickness = 3;
@ -237,7 +247,7 @@ module x_belt_tensioner_stl()
}
duct_wall = 2 * 0.35 * 1.5;
top_thickness = 2;
duct_top_thickness = 2;
fan_nut_trap_thickness = 4;
fan_bracket_thickness = 3;
@ -248,11 +258,11 @@ fan_screw_length = screw_longer_than(fan_depth(part_fan) + fan_bracket_thickness
fan_width = max(2 * fan_hole_pitch(part_fan) + screw_boss_diameter(fan_screw), fan_bore(part_fan) + 2 * wall);
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 = 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_width = 2 * nut_radius(M3_nut) + wall + ((2 * front_nut_pitch < 2 * nut_radius(M3_nut) + 3 * wall) ? wall : 0);
front_nut_height = 2 * nut_radius(M3_nut) * cos(30) + wall + top_thickness - min_top_thickness;
front_nut_depth = min(bearing_holder_width(X_bearings) - 2 * wall - nut_thickness(M3_nut, true) - 1, nut_trap_depth(M3_nut) + 6);
front_nut_z = 5;
front_nut_y = - width / 2 + wall;
gap = 6;
@ -264,6 +274,8 @@ or = ir + duct_wall + gap + duct_wall;
skew = nozzle_height * tan(taper_angle);
throat_width = (or + skew) * 2;
zip_x = min(length / 2 - lug_width - zipslot_width() / 2 - eta, bar_x);
fan_x = base_offset;
fan_y = -(width / 2 + fan_width(part_fan) / 2) - (X_carriage_clearance + belt_width(X_belt) + belt_clearance);
fan_z = nozzle_length + hot_end_duct_offset(hot_end)[2] - duct_height - fan_depth(part_fan) / 2;
@ -274,7 +286,7 @@ module throat(inner) {
y = or + skew - duct_wall;
if(inner)
translate([-throat_width / 2 + duct_wall, y, nozzle_height])
cube([throat_width - 2 * duct_wall, 2 * eta, (duct_height - nozzle_height) - top_thickness]);
cube([throat_width - 2 * duct_wall, 2 * eta, (duct_height - nozzle_height) - duct_top_thickness]);
else
translate([-throat_width / 2, y - duct_wall, 0])
cube([throat_width, 2 * eta, duct_height]);
@ -284,7 +296,7 @@ module neck(inner) {
iw = 2 * (fan_hole_pitch(part_fan) - fan_screw_boss_r) - 3;
if(inner)
translate([fan_x - iw / 2, fan_y_duct - fan_bore(part_fan) / 2, duct_wall])
cube([iw, 2 * eta, duct_height - duct_wall - top_thickness]);
cube([iw, 2 * eta, duct_height - duct_wall - duct_top_thickness]);
else
translate([fan_x - fan_width / 2, fan_y_duct - fan_width / 2, 0])
cube([fan_width, 2 * eta, duct_height]);
@ -328,16 +340,16 @@ module x_carriage_fan_duct_stl() {
// fan entrance
hull() {
translate([fan_x, fan_y_duct, duct_wall + duct_height - duct_wall - top_thickness])
translate([fan_x, fan_y_duct, duct_wall + duct_height - duct_wall - duct_top_thickness])
rotate([180, 0, 0])
rounded_cylinder(r = fan_bore(part_fan) / 2, h = duct_height - duct_wall - top_thickness, r2 = duct_height / 2);
rounded_cylinder(r = fan_bore(part_fan) / 2, h = duct_height - duct_wall - duct_top_thickness, r2 = duct_height / 2);
neck(true);
}
translate([0, 0, duct_height - duct_wall - top_thickness - 1])
translate([0, 0, duct_height - duct_wall - duct_top_thickness - 1])
hull() {
translate([fan_x, fan_y_duct, duct_wall])
cylinder(r = fan_bore(part_fan) / 2, h = duct_height - duct_wall - top_thickness);
cylinder(r = fan_bore(part_fan) / 2, h = duct_height - duct_wall - duct_top_thickness);
neck(true);
}
@ -384,7 +396,7 @@ module x_carriage_fan_duct_stl() {
// Cold end cooling vent
//
rotate([0, 0, atan2(-fan_x, -fan_y)])
translate([0, ir + skew, duct_height - top_thickness - 3])
translate([0, ir + skew, duct_height - duct_top_thickness - 3])
rotate([90, 0, 0])
teardrop(r = 4.5 / 2, h = 10, center = true);
}
@ -394,12 +406,19 @@ module x_carriage_fan_bracket_stl() {
stl("x_carriage_fan_bracket");
t = fan_bracket_thickness;
h = fan_z - fan_depth(part_fan) / 2;
function local_z(z) = fan_z - fan_depth(part_fan) / 2 - z; // convert to local z
belt_x = -length / 2 - tension_screw_pos + tension_screw_length + wall + belt_tensioner_rim_r;
belt_z = local_z((x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) / 2);
screw_z = local_z(front_nut_z); // convert to local z
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) + 2 * t;
w = front_nut_pitch * 2 + washer_diameter(M3_washer) + t * 2;
crop_w = (belt_x > -w / 2) ? washer_diameter(M3_washer) / 2 - M3_clearance_radius : 0;
rad = sqrt(2) * pitch - boss_r;
bodge = 54 - 51.2; // error in length of MK5 J-head
bodge = hot_end_bodge(hot_end); // error in length of MK5 J-head
dx = pitch - w / 2;
dy = -(fan_y + width / 2) - pitch;
hyp = sqrt(dx * dx + dy * dy);
@ -411,27 +430,34 @@ module x_carriage_fan_bracket_stl() {
difference() {
union() {
hull() {
translate([- w / 2, fan_y + width / 2, 0])
cube([w, 1, t]);
translate([- w / 2 + crop_w, fan_y + width / 2, 0])
cube([w - crop_w, 1, t]);
for(side = [-1, 1])
translate([side * pitch, -pitch, 0])
cylinder(r = boss_r, h = t);
}
translate([- w / 2, fan_y + width / 2, eta])
cube([w, t, h]);
translate([- w / 2 + crop_w, fan_y + width / 2, eta])
cube([w - crop_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);
if(gusset_pitch > 0)
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);
else
if(2 * front_nut_pitch - washer_diameter(M3_washer) - 1 >= min_wall)
translate([0, fan_y + width / 2 + t - eta, t - eta])
rotate([90, 0, 90])
right_triangle(width = -(fan_y + width / 2 + t) - rad - eta, height = h - t, h = 2 * front_nut_pitch - washer_diameter(M3_washer) - 1);
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]]);
if(side > 0 || !crop_w)
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]]);
}
}
//
@ -443,7 +469,7 @@ module x_carriage_fan_bracket_stl() {
//
// mounting screw holes
//
translate([side * front_nut_pitch, 0, max(h - top_thickness - front_nut_z - bodge, fan_bracket_thickness + washer_diameter(M3_washer) / 2) + h / 2])
translate([side * front_nut_pitch, 0, max(screw_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);
//
@ -456,10 +482,10 @@ module x_carriage_fan_bracket_stl() {
}
bearing_gap = 5;
bearing_slit = 1;
bearing_slit = squeeze ? 0.5 : 1;
hole_width = hole - wall - bearing_slit;
hole_offset = (hole - hole_width) / 2;
hole_width = hole[1] - wall - bearing_slit;
hole_offset = (hole[1] - hole_width) / 2;
module base_shape() {
@ -489,21 +515,6 @@ module base_shape() {
}
}
module inner_base_shape() {
difference() {
square([length - 2 * wall, width - 2 * wall], center = true);
minkowski() {
difference() {
square([length + 1, width + 1], center = true);
translate([10,0])
square([length + 1, 2 * wall + eta], center = true);
base_shape();
}
circle(r = wall, center = true);
}
}
}
module x_carriage_stl(){
stl("x_carriage");
@ -522,24 +533,24 @@ module x_carriage_stl(){
translate([0, 0, top_thickness])
linear_extrude(height = rim_thickness, center = true, convexity = 5)
difference() {
inner_base_shape();
translate([-base_offset, -hole_offset])
rounded_square(hole + 2 * wall, hole_width + 2 * wall, corner_radius + wall);
offset(-wall)
base_shape();
translate([-base_offset, -hole_offset])
rounded_square(hole[0] + 2 * wall, hole_width + 2 * wall, hole[2] + wall);
}
}
// ribs between bearing holders
for(side = [-1,1])
assign(rib_height = bar_offset - X_bar_dia / 2 - 2)
for(side = [-1,1]) {
rib_height = bar_offset - X_bar_dia / 2 - 2;
translate([0, - bar_y + side * (bearing_holder_width(X_bearings) / 2 - (wall + eta) / 2), rib_height / 2 - top_thickness + eta])
cube([2 * bar_x - bearing_holder_length(X_bearings) + eta, wall + eta, rib_height], center = true);
}
// Front nut traps for large fan mount
for(end = [-1, 1])
translate([end * (bar_x - bearing_holder_length(X_bearings) / 2 - front_nut_width / 2 + eta) - front_nut_width / 2,
-width / 2 + wall, -top_thickness - eta])
cube([front_nut_width, front_nut_depth, front_nut_height]);
}
//Holes for bearing holders
translate([0, bar_y, rim_thickness - top_thickness - eta])
@ -573,15 +584,16 @@ module x_carriage_stl(){
belt_lug(false);
//Bearing holders
translate([0, bar_y, bar_offset - top_thickness]) rotate([0,0,90]) bearing_holder(X_bearings, bar_offset - eta);
translate([- bar_x, -bar_y, bar_offset - top_thickness]) rotate([0,0,90]) bearing_holder(X_bearings, bar_offset - eta);
translate([+ bar_x, -bar_y, bar_offset - top_thickness]) rotate([0,0,90]) bearing_holder(X_bearings, bar_offset - eta);
for(end = [-1, 0, 1])
translate([end * bar_x, end ? -bar_y : bar_y, bar_offset - top_thickness])
rotate([0, 0, 90])
bearing_holder(X_bearings, bar_offset - eta, tie_offset = end * (zip_x - bar_x));
}
translate([-base_offset, 0, 0]) {
// hole to clear the hot end
translate([0, - hole_offset])
rounded_rectangle([hole, hole_width, 2 * rim_thickness], corner_radius);
rounded_rectangle([hole[0], hole_width, 2 * rim_thickness], hole[2]);
// holes for connecting extruder
for(xy = mounting_holes)
@ -599,12 +611,13 @@ module x_carriage_stl(){
//
for(end = [-1, 1])
translate([end * front_nut_pitch,
-width / 2 + front_nut_depth,
front_nut_z])
-width / 2 + wall + front_nut_depth,
front_nut_z - top_thickness])
rotate([90, 0, 0])
intersection() {
nut_trap(screw_clearance_radius(M3_cap_screw), M3_nut_radius, M3_nut_trap_depth, true);
cylinder(r = M3_nut_radius + 1, h = bearing_holder_width(X_bearings), center = true);
nut_trap(screw_clearance_radius(M3_cap_screw), M3_nut_radius, front_nut_depth, true);
translate([0, 0, -(bearing_holder_width(X_bearings) - 2 * wall - front_nut_depth - 2 * eta)])
cylinder(r = M3_nut_radius + 1, h = 100);
}
}
}
@ -625,7 +638,7 @@ module x_carriage_fan_assembly() {
screw_and_washer(fan_screw, fan_screw_length);
fan_hole_positions(part_fan) group() {
rotate([180, 0, 0])
translate([0, 0, fan_depth(part_fan) + top_thickness + 30 * exploded])
translate([0, 0, fan_depth(part_fan) + duct_top_thickness + 30 * exploded])
nut(fan_nut, true);
}
translate([0, 0, fan_depth(part_fan) / 2])
@ -635,97 +648,6 @@ module x_carriage_fan_assembly() {
end("x_carriage_fan_assembly");
}
module x_carriage_assembly(show_extruder = true, show_fan = true) {
if(show_extruder) {
translate([75, extruder_width / 2, eta])
rotate([-90,0,180])
wades_assembly();
for(end = [-1, 1])
translate([25 * end, 0, nut_trap_thickness])
rotate([0, 0, 45])
wingnut(M4_wingnut);
}
//
// Fan assembly
//
if(show_fan)
x_carriage_fan_assembly();
assembly("x_carriage_assembly");
color(x_carriage_color) render() x_carriage_stl();
//
// Fan bracket screws
//
for(side = [-1, 1])
translate([fan_x + side * front_nut_pitch, -width / 2 - fan_bracket_thickness, front_nut_z + top_thickness]) {
rotate([90, 0, 0])
screw_and_washer(M3_cap_screw, 10);
translate([0, fan_bracket_thickness + wall, 0])
rotate([-90, 0, 0])
nut(M3_nut, true);
}
translate([base_offset, bar_y, bar_offset]) {
linear_bearing(X_bearings);
rotate([0,-90,0])
scale([bearing_radius(X_bearings) / bearing_ziptie_radius(X_bearings), 1])
ziptie(small_ziptie, bearing_ziptie_radius(X_bearings));
}
for(end = [-1,1])
translate([base_offset + bar_x * end, -bar_y, bar_offset]) {
linear_bearing(X_bearings);
rotate([90,-90,90])
scale([bearing_radius(X_bearings) / bearing_ziptie_radius(X_bearings), 1])
ziptie(small_ziptie, bearing_ziptie_radius(X_bearings));
}
//
// Idler end belt clamp
//
translate([length / 2 + base_offset, -width / 2, x_carriage_offset() - ball_bearing_diameter(X_idler_bearing) / 2]) {
mirror([1,0,0])
color(x_belt_clamp_color) render() x_belt_clamp_stl();
translate([-lug_width / 2, lug_screw, clamp_thickness])
nut(M3_nut, true);
}
translate([length / 2 + base_offset - lug_width / 2, -width / 2 + lug_screw, 0])
rotate([180, 0, 0])
screw_and_washer(M3_cap_screw, 20);
//
// Motor end belt clamp
//
translate([-length / 2 + base_offset, -width / 2, x_carriage_offset() - pulley_inner_radius])
translate([lug_width / 2, lug_screw, clamp_thickness])
nut(M3_nut, true);
translate([-length / 2 + base_offset, -width / 2, -(clamp_thickness + belt_thickness(X_belt))]) {
color(x_belt_clamp_color) render() x_belt_grip_stl();
translate([lug_width / 2, lug_screw, 0])
rotate([180, 0, 0])
screw_and_washer(M3_cap_screw, 25);
}
translate([-length / 2 + base_offset - tension_screw_pos, -width / 2 + slot_y, (x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) /2]) {
rotate([0, -90, 0])
screw(M3_cap_screw, tension_screw_length); // tensioning screw
translate([tension_screw_length + wall, belt_tensioner_height / 2, 0])
rotate([90, 180, 0])
color(x_belt_clamp_color) render() x_belt_tensioner_stl();
translate([tension_screw_length + wall, 0, 0])
rotate([90, 180, 0])
belt_loop();
}
translate([-length / 2 + base_offset + lug_width - M3_nut_trap_depth, -width / 2 + slot_y, (x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) /2])
rotate([90, 0, 90])
nut(M3_nut, false); // tensioning nut
end("x_carriage_assembly");
}
module x_carriage_parts_stl() {
x_carriage_stl();
@ -742,19 +664,3 @@ module x_carriage_fan_ducts_stl() {
rotate([0, 0, 180])
x_carriage_fan_duct_stl();
}
if(0)
if(0) {
intersection() {
x_carriage_fan_duct_stl();
*translate([0, 0, -10])
cube(200);
}
}
else
if(0)
x_carriage_fan_ducts_stl();
else
x_carriage_parts_stl();
else
x_carriage_assembly(true);

View File

@ -0,0 +1,122 @@
//
// Mendel90
//
// GNU GPL v2
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// X carriage, carries the extruder
//
include <x-carriage.scad>
module x_carriage_assembly(show_extruder = true, show_fan = true) {
if(show_extruder) {
if(extruder == Wades)
translate([75, extruder_width / 2, eta])
rotate([-90,0,180])
wades_assembly();
if(extruder == Direct14)
rotate([180, 0, 180])
direct_assembly();
for(end = [-1, 1])
translate([extruder_mount_pitch / 2 * end, 0, nut_trap_thickness])
rotate([0, 0, 45])
wingnut(M4_wingnut);
}
//
// Fan assembly
//
if(show_fan)
translate([0, 0, -hot_end_bodge(hot_end)])
x_carriage_fan_assembly();
assembly("x_carriage_assembly");
color(x_carriage_color) render() x_carriage_stl();
//
// Fan bracket screws
//
for(side = [-1, 1])
translate([fan_x + side * front_nut_pitch, -width / 2 - fan_bracket_thickness, front_nut_z]) {
rotate([90, 0, 0])
screw_and_washer(M3_cap_screw, 16);
translate([0, fan_bracket_thickness + wall, 0])
rotate([-90, 0, 0])
nut(M3_nut, true);
}
//
// Bearings
//
for(end = [-1, 0, 1])
translate([base_offset + bar_x * end, end ? -bar_y : bar_y, bar_offset]) {
linear_bearing(X_bearings);
translate([end * (zip_x - bar_x), 0, 0])
rotate([0, -90, end ? 180 : 0])
scale([bearing_radius(X_bearings) / bearing_ziptie_radius(X_bearings), 1])
ziptie(small_ziptie, bearing_ziptie_radius(X_bearings));
}
//
// Idler end belt clamp
//
translate([length / 2 + base_offset, -width / 2, x_carriage_offset() - ball_bearing_diameter(X_idler_bearing) / 2]) {
mirror([1,0,0])
color(x_belt_clamp_color) render() x_belt_clamp_stl();
translate([-lug_width / 2, lug_screw, clamp_thickness])
nut(M3_nut, true);
}
translate([length / 2 + base_offset - lug_width / 2, -width / 2 + lug_screw, 0])
rotate([180, 0, 0])
screw_and_washer(M3_cap_screw, 20);
//
// Motor end belt clamp
//
translate([-length / 2 + base_offset, -width / 2, x_carriage_offset() - pulley_inner_radius])
translate([lug_width / 2, lug_screw, clamp_thickness])
nut(M3_nut, true);
translate([-length / 2 + base_offset, -width / 2, -(clamp_thickness + belt_thickness(X_belt))]) {
color(x_belt_clamp_color) render() x_belt_grip_stl();
translate([lug_width / 2, lug_screw, 0])
rotate([180, 0, 0])
screw_and_washer(M3_cap_screw, 25);
}
translate([-length / 2 + base_offset - tension_screw_pos, -width / 2 + slot_y, (x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) /2]) {
rotate([0, -90, 0])
screw(M3_cap_screw, tension_screw_length); // tensioning screw
translate([tension_screw_length + wall, belt_tensioner_height / 2, 0])
rotate([90, 180, 0])
color(x_belt_clamp_color) render() x_belt_tensioner_stl();
translate([tension_screw_length + wall, 0, 0])
rotate([90, 180, 0])
belt_loop();
}
translate([-length / 2 + base_offset + lug_width - M3_nut_trap_depth, -width / 2 + slot_y, (x_carriage_offset() - pulley_inner_radius - belt_thickness(X_belt)) /2])
rotate([90, 0, 90])
nut(M3_nut, false); // tensioning nut
end("x_carriage_assembly");
}
if(0)
if(0) {
intersection() {
x_carriage_fan_duct_stl();
*translate([0, 0, -10])
cube(200);
}
}
else
if(0)
x_carriage_fan_ducts_stl();
else
x_carriage_parts_stl();
else
x_carriage_assembly(true, true);