1
0
mirror of https://github.com/nophead/Mendel90.git synced 2025-08-31 08:45:34 +02:00

Mods to support e3d in the main branch.

Tweaks to the huxley extruder.
Now shows hot end filament diameter on the BOM.
Moved huxley spool holder back to give more room for lighting.
Updated README.md.
Added huxley to command line usage messages.
This commit is contained in:
Chris Palmer
2016-01-16 10:47:25 +00:00
parent 321c77ca0d
commit ad21323ec6
52 changed files with 9573 additions and 6599 deletions

View File

@@ -53,7 +53,7 @@ pcb_thickness = 1.6;
feed_tube_rad = 5 / 2; // Filament feed tube
feed_tube_tape_rad = 6.2 / 2;
feed_tube_tape = 12;
nozzle_length = 54; // how far nozzle is below top of carriage
function nozzle_length(hot_end) = max(54, hot_end_length(hot_end)); // how far nozzle extends below top of carriage
include <colors.scad>
include <utils.scad>

View File

@@ -49,9 +49,9 @@ part_fan = fan40x11;
psu = External;
controller = Melzi;
raspberry_pi = true;
raspberry_pi_camera = true;
light_strip = RIGID5050_208;
//raspberry_pi = true;
//raspberry_pi_camera = true;
//light_strip = RIGID5050_208;
spool = spool_200x55;
bottom_limit_switch = false;

View File

@@ -1 +1 @@
include <sturdy_config.scad>
include <dibond_config.scad>

View File

@@ -64,41 +64,45 @@ spring = peg_spring;
compressed_spring = 9.5;
motor_thickness = 5;
motor_screw_depth = 3;
min_base_thickness = 8;
extension_clearance = 0.5;
extension = max(extension_clearance, nozzle_length(hot_end) - hot_end_length(hot_end));
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);
hot_end_groove_dia(hot_end) / 2 + washer_diameter(jhead_washer) / 2);
jhead_nut_slot = nut_thickness(screw_nut(jhead_screw)) + 0.3;
angle = 30;
jhead_screw_angles = [angle, -angle, 180 - angle, -180 + angle];
extension = max(0, nozzle_length - hot_end_length(hot_end));
extension_width = extruder_hole(d_extruder)[0] - 1;
extension_rad = jhead_screw_pitch + 5;
extension_clearance = 1;
width = extruder_width(d_extruder);
length = extruder_length(d_extruder);
motor_thickness = 5;
base_thickness = max(8, jhead_screw_length - extension - 2 * washer_thickness(M3_washer) - washer_thickness(M4_washer));
length = min(extruder_length(d_extruder), 64);
base_thickness = max(min_base_thickness, jhead_screw_length - extension - 2 * washer_thickness(M3_washer) - washer_thickness(M4_washer));
height = base_thickness + NEMA_width(motor) + 1;
jhead_nut_offset = -(extension + base_thickness - 2 - jhead_nut_slot); // offset of nut from screw head
filament_r = 1.75 / 2;
filament_r = extruder_filament(d_extruder) / 2;
filament_x = 0;
filament_z = width / 2;
filament_path_r = 1;
filament_path_r = filament_r + 0.125;
motor_y = height - NEMA_width(motor) / 2 - 1;
motor_x = filament_x + filament_r + hobbed_hob_id(pulley) / 2;
motor_z = 0;
motor_screw_length = 8;
motor_screw_z = motor_screw_length - 2 * washer_thickness(M3_washer) - motor_screw_depth;
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;
@@ -114,6 +118,9 @@ 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);
pivot_screw_length = 25;
pivot_screw_z = min(pivot_screw_length - washer_thickness(M3_washer) - motor_screw_depth, width + eta);
lever_bottom_y = base_thickness + 1;
lever_width = 2 * motor_plate_rad + 1;
@@ -199,16 +206,20 @@ module direct_block_stl(include_support = true) {
// base
hull()
for(end = [-1 , 1])
translate([end * (length / 2 - base_rad), base_thickness / 2, filament_z])
translate([end * (length / 2 - base_rad), min_base_thickness / 2, filament_z])
intersection() {
union() {
union()
for(a = [-90, 90])
rotate([a, 0, 0])
teardrop(r = base_rad, h = base_thickness, truncate = false, center = true);
}
teardrop(r = base_rad, h = min_base_thickness, truncate = false, center = true);
cube([width * 2, base_thickness + 1, width], center = true);
}
if(base_thickness > min_base_thickness) // nut housing
translate([motor_x - motor_plate_width / 2, 1, 0])
cube([2 * (filament_x - (motor_x - motor_plate_width / 2)), base_thickness - 1, width]);
if(extension)
translate([filament_x - extension_width / 2, -extension + extension_clearance + eta, 0])
intersection() {
@@ -248,14 +259,8 @@ module direct_block_stl(include_support = true) {
}
// 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);
}
translate([filament_x, min_base_thickness, filament_z])
extruder_mounting_holes(true);
//
// holes for motor
//
@@ -266,10 +271,13 @@ module direct_block_stl(include_support = true) {
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);
for(x = NEMA_holes(motor), y = NEMA_holes(motor)) // motor screw holes
translate([x, y, motor_screw_z]) {
poly_cylinder(r = M3_clearance_radius, h = 100, center = true);
if(x > 0 || y < 0)
poly_cylinder(r = washer_diameter(M3_washer) / 2 + 0.5, h = 100, center = false);
}
}
//
// Hole for hot end
@@ -278,8 +286,8 @@ module direct_block_stl(include_support = true) {
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 + hot_end_inset(hot_end) / 2]) // slot for the flange
keyhole(insulator / 2, hot_end_inset(hot_end), width - filament_z);
*translate([0, 0, -insulator_depth + relief / 2])
keyhole(insulator / 2 + 0.5, relief, width - filament_z); // relief to avoid corner radius
@@ -364,8 +372,13 @@ module direct_idler_lever_stl() {
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_x - idler_pivot_x, idler_pivot_y - idler_y, width - pivot_screw_z]) {
translate([0, 0, width > pivot_screw_z ? layer_height : -1]) // support membrane if needed
poly_cylinder(r = 3/2, h = 100, center = false); // pivot hole
rotate([180, 0, 0])
poly_cylinder(r = washer_diameter(M3_washer) / 2 + 0.5, h = 10); // counterbore
}
translate([idler_closed_x - spring_x, spring_y - idler_y, width - spring_z])
rotate([90, 0, 90])
@@ -422,9 +435,8 @@ module direct_assembly(show_connector = true, show_drive = true) {
if(show_drive) {
// mounting screws
for(side = [-1, 1])
translate([filament_x + mount_pitch * side, 0, base_thickness - 3])
screw(M4_hex_screw, 20);
translate([filament_x, 0, min_base_thickness])
extruder_mounting_screws();
// motor
translate([0, -40 * exploded, 0])
@@ -433,26 +445,27 @@ module direct_assembly(show_connector = true, show_drive = true) {
direct_motor_assembly(show_connector, 0);
// motor screws
translate([-motor_x, -width / 2 + motor_thickness, motor_y])
translate([-motor_x, -width / 2 + motor_screw_z, motor_y])
rotate([-90, 0, 0])
NEMA_screws(motor, 3, 8, M3_pan_screw);
NEMA_screws(motor, 3, motor_screw_length, M3_pan_screw);
// idler axle
translate([-idler_pivot_x, width / 2, idler_pivot_y])
translate([-idler_pivot_x, -width / 2, idler_pivot_y])
rotate([-90, 0, 0]) {
explode([0, 0, 50])
screw_and_washer(M3_cap_screw, 25);
translate([0, 0, pivot_screw_z])
explode([0, 0, 50])
screw_and_washer(M3_cap_screw, pivot_screw_length);
translate([0, 0, -width + motor_thickness])
explode([0, 0, 5])
washer(M3_washer)
explode([0, 0, 2])
star_washer(M3_washer)
explode([0, 0, 2])
nut(M3_nut)
explode([0, 0, 2])
washer(M3_washer);
}
translate([0, 0, motor_thickness])
explode([0, 0, 5])
washer(M3_washer)
explode([0, 0, 2])
star_washer(M3_washer)
explode([0, 0, 2])
nut(M3_nut)
explode([0, 0, 2])
washer(M3_washer);
}
//
// Filament
//

View File

@@ -5,7 +5,7 @@
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// Virual extruder
// Virtual extruder
//
include <conf/config.scad>
use <wade.scad>

View File

@@ -5,22 +5,29 @@
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// Virual extruder
// Virtual hot end
//
include <conf/config.scad>
use <vitamins/m90_hot_end.scad>
use <vitamins/stoffel_hot_end.scad>
use <vitamins/jhead_hot_end.scad>
use <vitamins/e3d_hot_end.scad>
module hot_end_assembly() {
filament = extruder_filament(extruder);
assembly("hot_end_assembly");
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);
jhead_hot_end(hot_end, filament, exploded = 0);
if(hot_end_style(hot_end) == e3d)
e3d_hot_end(hot_end, filament);
end("hot_end_assembly");
}

View File

@@ -15,7 +15,7 @@ include <positions.scad>
wall = 2;
light = light_strip ? light_strip : RIGID5050_290;
light = light_strip ? light_strip : (right_stay_x - left_stay_x) > 300 ? RIGID5050_290 : RIGID5050_208;
use_screws = light_strip_has_holes(light);
use_clips = !use_screws;

View File

@@ -23,7 +23,7 @@ Y_carriage_height = y_motor_bracket_height() + X_carriage_clearance + sheet_thic
bed_height = Y_carriage_height + sheet_thickness(Y_carriage) / 2 + pillar_height(bed_pillars) + washer_thickness(M3_washer) + bed_thickness;
Z0 = floor(bed_height + nozzle_length - x_carriage_offset());
Z0 = floor(bed_height + nozzle_length(hot_end) - x_carriage_offset());
height = ceil(Z0 + Z_travel + limit_switch_offset + x_end_height() + bar_clamp_depth + axis_end_clearance + base_clearance);

View File

@@ -12,7 +12,10 @@ include <positions.scad>
use <light_strip_clip.scad>
use <frame_edge_clamp.scad>
light = light_strip ? light_strip : RIGID5050_290;
left = left_stay_x + sheet_thickness(frame) / 2;
right = right_stay_x - sheet_thickness(frame) / 2;
light = light_strip ? light_strip : (right - left) > 300 ? RIGID5050_290 : RIGID5050_208;
light2 = light_strip == RIGID5050_290 ? RIGID5050_208 : false;
wall = 2;
@@ -50,9 +53,6 @@ pi_cam_front_depth = pi_cam_back_depth + pi_cam_thickness + pi_cam_front_clearan
pi_cam_front_length = pi_cam_back_length + 2 * (pi_cam_front_wall + clearance);
pi_cam_front_width = pi_cam_back_width + 2 * (pi_cam_front_wall + clearance);
left = left_stay_x + sheet_thickness(frame) / 2;
right = right_stay_x - sheet_thickness(frame) / 2;
X_build = min(X_travel, bed_holes[0] - screw_head_radius(M3_cap_screw) * 2); // sturdy travel exceeds the bed so max object is smaller
Y_build = min(Y_travel, bed_holes[1] - screw_head_radius(M3_cap_screw) * 2);

View File

@@ -32,7 +32,7 @@ hook_r = 3;
left = left_stay_x + sheet_thickness(frame) / 2;
right = right_stay_x - sheet_thickness(frame) / 2;
spool_x = (left + right) / 2;
spool_y = gantry_Y + sheet_thickness(frame) + 10 + spool_height(spool) / 2;
spool_y = gantry_Y + sheet_thickness(frame) + (squeeze ? 15 : 10) + spool_height(spool) / 2;
bearing_r = (spool_diameter(spool) + ball_bearing_diameter(bearing)) / 2;
bearing_x = cos(angle) * bearing_r;
@@ -54,6 +54,7 @@ tube_spacing = sqrt(dx * dx + dy * dy);
width = bearing_y * 2 - 2 * (thickness + washer_thickness(spool_washer) + ball_bearing_width(bearing) / 2);
function spool_holder_gap() = spool_y - width / 2 - thickness - (gantry_Y + sheet_thickness(frame));
function spool_holder_view_pos() = [spool_x - bearing_x, spool_y, bearing_z]; // for assembly view
sponge_length = 15;
sponge_depth = 15;
@@ -386,7 +387,7 @@ module spool_assembly(show_spool = true) {
}
vitamin("PLA3040: PLA sample 3mm ~50m");
vitamin(extruder_filament(extruder) == 3 ? "PLA3050: PLA sample 3mm ~50m" : "PLA1750: PLA sample 1.75mm ~50m");
end("spool_holder_assembly");
}

View File

@@ -0,0 +1,161 @@
//
// Mendel90
//
include <../conf/config.scad>
rad_dia = 22; // Diam of the part with ailettes
rad_nb_ailettes = 11;
rad_len = 26;
nozzle_h = 5;
module e3d_nozzle(type) {
color("gold")
difference() {
union() {
cylinder(d1 = 1.3, d2 = 3, h = 2);
translate([0, 0, 2])
cylinder(d = 8, h = nozzle_h - 2, $fn=6);
}
translate([0, 0, -eta]) cylinder(d = 0.5, h = nozzle_h + 2 * eta);
}
}
resistor_len = 22;
resistor_dia = 6;
heater_width = 16;
heater_length = 20;
heater_height = 11.5;
heater_x = 4.5;
heater_y = heater_width / 2;
fan_x_offset = rad_dia / 2 + 4;
module e3d_resistor(type) {
translate([11 - heater_x, -3 - heater_y, heater_height / 2 + nozzle_h]) {
color("grey")
rotate([-90, 0, 0])
cylinder(r = resistor_dia / 2, h = resistor_len);
color("red")
translate([-3.5/2, resistor_len + 3.5/2 + 1, 0]) {
cylinder(d = 3.5, h = 36);
translate([3.5, 0, 0])
cylinder(r = 3.5 / 2, h = 36);
}
}
}
module heater_block(type) {
translate([0, 0, -hot_end_length(type)]) {
translate([0, 0, nozzle_h]) difference() {
color("lightgrey") union() {
// Heat break
cylinder(r = 2, h = heater_height + 10);
translate([-heater_x, -heater_y, 0])
cube([heater_length, heater_width, heater_height]);
}
cylinder(d=3, h = heater_height + 10 + eta); // Filament hole
}
e3d_resistor(type);
e3d_nozzle(type);
}
}
module e3d_rad(type) {
h_ailettes = rad_len / (2 * rad_nb_ailettes - 1);
difference() {
cylinder(d = rad_dia, h = rad_len);
translate([0, 0, -eta])
cylinder(r = hot_end_insulator_diameter(type) / 2 - eta, h = rad_len + 2 * eta);
for (i = [0 : rad_nb_ailettes -2 ] )
translate([0, 0, (2 * i + 1) * h_ailettes])
cylinder(r = rad_dia, h = h_ailettes);
}
}
module e3d_fan_duct(type) {
color("DeepSkyBlue")
render(convexity = 3) difference() {
hull() {
translate([-8, -23 / 2, 0])
cube([eta, 23, 26]);
translate([fan_x_offset, -30 / 2, 0])
cube([eta, 30, 30]);
}
cylinder(h = 70, d = rad_dia + 0.1, center = true); // For rad
translate([0, 0, 15])
rotate([0, 90, 0])
cylinder(d = rad_dia, h = 50);
}
}
module e3d_fan(type) {
e3d_fan_duct(type);
translate([fan_x_offset + 5, 0, 15])
rotate([0, 90, 0])
color("darkgrey")
fan(fan30x10);
}
module e3d_hot_end(type, filament) {
insulator_length = hot_end_insulator_length(type);
inset = hot_end_inset(type);
bundle = 3.2;
tape_thickness = 0.8;
vitamin(str(hot_end_part(type)," ",filament,"mm"));
translate([0, 0, inset - insulator_length]) {
color(hot_end_insulator_colour(type)) render(convexity = 10) {
difference() {
cylinder(d = hot_end_insulator_diameter(type), h = insulator_length);
cylinder(d = 3.2, h = insulator_length * 2 + 1, center = true); // Filament hole
translate([0, 0, insulator_length - hot_end_inset(type) - hot_end_groove(type) / 2])
tube(ir = hot_end_groove_dia(type) / 2, or = hot_end_insulator_diameter(type) / 2 + eta, h = hot_end_groove(type));
}
e3d_rad(type);
}
}
// Wire and ziptie
rotate([0, 0, 10]) {
scale([1, (bundle + hot_end_insulator_diameter(type)) / hot_end_insulator_diameter(type)])
translate([0, -bundle / 2, -7])
rotate([0, 0, -110])
ziptie(small_ziptie, hot_end_insulator_diameter(type) / 2);
translate([0, -hot_end_insulator_diameter(type) / 2 - bundle / 2, 20])
scale([0.7, bundle / 6.4])
difference() {
tubing(HSHRNK64, 60);
translate([0, 0, 20])
cube([10, 10, 60], center = true);
}
}
rotate([0, 0, 90])
heater_block(type);
translate([0, 0, inset - insulator_length])
e3d_fan();
}
e3d_hot_end(e3d_clone);

View File

@@ -8,9 +8,9 @@
//
extruder_mount_pitch = 50;
Wades = [96, 16, 26, [36, 36, 5], NEMA17, 45];
Direct14 = [63, 0, 20, [28, 26, 3], NEMA14, 35];
Direct17 = [63, 0, 20, [28, 26, 3], NEMA17, 35];
Wades = [96, 16, 26, [36, 36, 5], NEMA17, 45, 3];
Direct14 = [63, 0, 20, [28, 26, 3], NEMA14, 35, 1.75];
Direct17 = [96, 16, 24, [29, 34, 3], NEMA17, 35, 1.75];
function extruder_length(type) = type[0];
function extruder_x_offset(type) = type[1];
@@ -18,3 +18,22 @@ function extruder_width(type) = type[2];
function extruder_hole(type) = type[3];
function extruder_motor(type) = type[4];
function extruder_d_screw_length(type) = type[5];
function extruder_filament(type) = type[6];
module extruder_mounting_screws()
for(side = [-1, 1])
translate([extruder_mount_pitch * side / 2, 0, 0])
if(side > 0 && hot_end_invert_screw(hot_end))
nut_and_washer(M4_nut);
else
translate([0, 0, -3])
screw(M4_hex_screw, 20);
module extruder_mounting_holes(reversed = false)
rotate([90, 0, 0])
for(side = [-1, 1])
translate([side * extruder_mount_pitch / 2, 0, 0])
if((reversed ? side < 0 : side > 0) && hot_end_invert_screw(hot_end))
poly_cylinder(r = M4_clearance_radius, h = 100, center = true);
else
nut_trap(M4_clearance_radius, M4_nut_radius, 3, true);

View File

@@ -9,20 +9,18 @@
Stoffel = 1;
m90 = 2;
jhead = 3;
e3d = 4;
function jhead_groove() = 4.64;
function jhead_groove_offset() = 5.1; //4.76;
function jhead_groove_dia() = 12;
m90_hot_end_12mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12, 40, "tan", 6.5, false];
m90_hot_end_12p5mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12.5, 40, "tan", 6.75, false];
m90_hot_end_12p75mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12.75, 40, "tan", 6.875, false];
jhead_inset = jhead_groove_offset();
m90_hot_end_12mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12, 40, "tan", 6 + 3/2 - 1, false];
m90_hot_end_12p5mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12.5, 40, "tan", 6.25 + 3/2 - 1, false];
m90_hot_end_12p75mm = [m90, "HEM90340: Mendel 90 hot end", 57, 10, 12.75, 40, "tan", 6.375 + 3/2 - 1, false];
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]];
JHeadMk4 = [jhead, "HEJH16340: JHead MK4 hot end", 64, 5.1, 16, 50, "black", 12, 4.64, 14, [0, 2.94, -5], 20, 20];
JHeadMk5 = [jhead, "HEJH16340: JHead MK5 hot end", 54, 5.1, 16, 40, "black", 12, 4.64, 13, [0, 2.38, -5], 20, 20];
JHeadMk5x = [jhead, "HEJH16340: JHead MK5 hot end", 51.2, 5.1, 16, 40, "black", 12, 4.64, 13, [0, 2.38, -5], 20, 20];
e3dv5 = [e3d, "HEE3DV5NB: E3D V5 direct", 70, 3.7, 16, 50.1, "lightgrey", 12, 6, 15, [1, 5, -4.5], 14.5, 28];
e3dv6 = [e3d, "HEE3DV6NB: E3D V6 direct", 62, 3.7, 16, 42.7, "lightgrey", 12, 6, 15, [1, 5, -4.5], 14, 21];
e3d_clone = [e3d, "HEE3DCLNB: E3D clone aliexpress",66, 6.8, 16, 46, "lightgrey", 12, 5.6, 15, [1, 5, -4.5], 14.5, 21];
function hot_end_style(type) = type[0];
function hot_end_part(type) = type[1];
@@ -31,11 +29,15 @@ function hot_end_inset(type) = type[3];
function hot_end_insulator_diameter(type) = type[4];
function hot_end_insulator_length(type) = type[5];
function hot_end_insulator_colour(type) = type[6];
function hot_end_screw_pitch(type) = type[7];
function hot_end_groove_mount(type) = type[8];
function hot_end_screw_pitch(type) = type[7]; // hot ends without a groove
function hot_end_groove_dia(type) = type[7]; // hot ends with groove mount
function hot_end_groove(type) = type[8];
function hot_end_duct_radius(type) = type[9];
function hot_end_duct_offset(type) = type[10];
function hot_end_invert_screw(type) = hot_end_style(type) == e3d; // do we need to invert one screw to avoid the fan
function hot_end_need_cooling(type) = hot_end_style(type) != e3d; // has own fan so don't need cooling hole
function hot_end_duct_height_nozzle(type) = type[11]; // duct height at nozzle end
function hot_end_duct_height_fan(type) = type[12]; // duct heigth at fan end
//
// 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

View File

@@ -42,7 +42,7 @@ module heater_block(type, resistor, thermistor) {
module jhead_hot_end(type, exploded = exploded) {
module jhead_hot_end(type, filament, exploded = exploded) {
resistor = RIE1212UB5C5R6;
thermistor = Epcos;
heater = type == JHeadMk4 ? MK4_heater : MK5_heater;
@@ -59,7 +59,7 @@ module jhead_hot_end(type, exploded = exploded) {
tape_overlap = 10;
tape_thickness = 0.8;
vitamin(hot_end_part(type));
vitamin(str(hot_end_part(type)," ",filament,"mm"));
vitamin("ST25110: 110mm x 25mm self amalgamating silicone tape");
//
// silcone tape
@@ -86,8 +86,8 @@ module jhead_hot_end(type, exploded = exploded) {
difference() {
cylinder(r = hot_end_insulator_diameter(type) / 2, h = insulator_length);
cylinder(r = 3.2 / 2, h = insulator_length * 2 + 1, center = true);
translate([0, 0, insulator_length - jhead_groove_offset() - jhead_groove() / 2])
tube(ir = jhead_groove_dia() / 2, or = 17 / 2, h = jhead_groove());
translate([0, 0, insulator_length - hot_end_inset(type) - hot_end_groove(type) / 2])
tube(ir = hot_end_groove_dia(type) / 2, or = 17 / 2, h = hot_end_groove(type));
}
//
// nozzle

View File

@@ -27,23 +27,23 @@ thickness = 5;
base_thickness = 6;
width = 26;
height = 52;
mount_pitch = 25;
filament_x = 75;
filament_z = 13;
feed_tube_socket = 4;
extension = max(0, nozzle_length - hot_end_length(hot_end));
extension_clearance = hot_end_style(hot_end) == e3d ? 0.5 : 1;
extension = max(extension_clearance, nozzle_length(hot_end) - hot_end_length(hot_end));
extension_width = 30;
jhead_screw = M3_cap_screw;
jhead_screw_length = 16;
jhead_screw_length = screw_longer_than(extension + base_thickness + nut_thickness(M3_nut)
+ washer_thickness(M3_washer) + washer_thickness(M4_washer));
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);
hot_end_groove_dia(hot_end) / 2 + washer_diameter(jhead_washer) / 2);
extension_rad = jhead_screw_pitch + 5;
extension_clearance = 1;
pscrew_y = [17.5, 45.5];
pscrew_z = [filament_z - 6.5, filament_z + 6.5];
@@ -95,7 +95,6 @@ module wades_block_stl() {
nut_slot = nut_thickness(M4_nut) + 0.3;
difference(){
union(){
cube([81, height, thickness]); // motor plate
@@ -137,17 +136,15 @@ module wades_block_stl() {
translate([filament_x, 20, filament_z])
rotate([90,0,0])
teardrop_plus(h = 70, r=3.5/2, center=true); // filament
teardrop_plus(h = 70, r = (extruder_filament(extruder) + 0.5) / 2, center=true); // filament
translate([filament_x, height, filament_z])
rotate([90,0,0])
teardrop_plus(h = feed_tube_socket * 2, r = tubing_od(PF7) / 2, center = true); // feed tube socket
// mounting holes
for(side = [-1, 1])
translate([filament_x + mount_pitch * side, base_thickness, filament_z])
rotate([90,0,0])
nut_trap(M4_clearance_radius, M4_nut_radius, 3, true);
translate([filament_x, base_thickness, filament_z])
extruder_mounting_holes();
// pressure screws
for(i = [0, 1]) {
@@ -222,11 +219,11 @@ module wades_block_stl() {
//
translate([filament_x, -extension + eta, filament_z])
rotate([90,0,0]) {
if(hot_end_groove_mount(hot_end)) {
if(hot_end_groove(hot_end)) {
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 + hot_end_inset(hot_end) / 2 + eta]) // slot for the flange
keyhole(insulator / 2, hot_end_inset(hot_end), width - filament_z);
translate([0, 0, -insulator_depth + relief / 2])
keyhole(insulator / 2 + 0.5, relief, width - filament_z); // relief to avoid corner radius
@@ -238,7 +235,9 @@ module wades_block_stl() {
translate([jhead_screw_pitch, 0, 0])
rotate([0, 0, -i * 120 - jhead_screw_angle]) {
w = nut_flat_radius(screw_nut(jhead_screw));
teardrop_plus(r = screw_clearance_radius(jhead_screw), h = jhead_screw_length * 2, center = true);
translate([0, 0, -base_thickness - extension - jhead_nut_slot / 2]) {
rotate([0, 0, [0, 30, 30][i]])
nut_trap(0, nut_radius(screw_nut(jhead_screw)), jhead_nut_slot / 2, horizontal = true);
@@ -258,7 +257,7 @@ module wades_block_stl() {
}
}
if(!hot_end_groove_mount(hot_end))
if(!hot_end_groove(hot_end))
for(side = [-1, 1])
translate([filament_x + screw_pitch * side, screw_depth - extension, -1])
rotate([0, 0, -90 + 90 * side])
@@ -411,10 +410,9 @@ module wades_assembly(show_connector = true, show_drive = true) {
}
// mounting screws
for(side = [-1, 1])
translate([filament_x + mount_pitch * side, base_thickness - 3, filament_z])
rotate([-90,0,0])
screw(M4_hex_screw, 20);
translate([filament_x, base_thickness, filament_z])
rotate([-90, 0, 0])
extruder_mounting_screws();
//idler
translate([filament_x + 22 + 39 * exploded, driven_y, filament_z])
@@ -483,7 +481,7 @@ module wades_assembly(show_connector = true, show_drive = true) {
rotate([-90, 0, 0])
hot_end_assembly();
if(!hot_end_groove_mount(hot_end))
if(!hot_end_groove(hot_end))
for(side = [-1, 1])
translate([filament_x + hot_end_screw_pitch(hot_end) * side, screw_depth - extension, width])
screw(M3_cap_screw, 30);

View File

@@ -263,7 +263,8 @@ front_nut_y = - width / 2 + wall;
gap = 6;
taper_angle = 30;
nozzle_height = 6;
duct_height = 20;
duct_height_nozzle = hot_end_duct_height_nozzle(hot_end); // Thickness on the exit side
duct_height_fan = hot_end_duct_height_fan(hot_end); // Thickness on the fan side
ir = hot_end_duct_radius(hot_end);
or = ir + duct_wall + gap + duct_wall;
skew = nozzle_height * tan(taper_angle);
@@ -273,7 +274,7 @@ 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;
fan_z = nozzle_length(hot_end) + hot_end_duct_offset(hot_end)[2] - duct_height_fan - fan_depth(part_fan) / 2;
fan_y_duct = -fan_y + hot_end_duct_offset(hot_end)[1];
@@ -281,20 +282,20 @@ 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) - duct_top_thickness]);
cube([throat_width - 2 * duct_wall, 2 * eta, (duct_height_nozzle - nozzle_height) - duct_top_thickness]);
else
translate([-throat_width / 2, y - duct_wall, 0])
cube([throat_width, 2 * eta, duct_height]);
cube([throat_width, 2 * eta, duct_height_nozzle]);
}
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 - duct_top_thickness]);
cube([iw, 2 * eta, duct_height_fan - 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]);
cube([fan_width, 2 * eta, duct_height_fan]);
}
module x_carriage_fan_duct_stl() {
@@ -308,7 +309,7 @@ module x_carriage_fan_duct_stl() {
hull() {
for(side = [-1, 1])
translate([fan_x + side * fan_hole_pitch(part_fan), fan_y_duct + fan_hole_pitch(part_fan), 0])
cylinder(r = fan_screw_boss_r, h = duct_height);
cylinder(r = fan_screw_boss_r, h = duct_height_fan);
neck(false);
}
// neck
@@ -322,7 +323,7 @@ module x_carriage_fan_duct_stl() {
union() {
cylinder(r1 = or, r2 = or + skew, h = nozzle_height);
translate([0, 0, nozzle_height - eta])
cylinder(r = or + skew, h = duct_height - nozzle_height);
cylinder(r = or + skew, h = duct_height_nozzle - nozzle_height);
}
throat(false);
}
@@ -331,20 +332,20 @@ module x_carriage_fan_duct_stl() {
translate([0, 0, -2 * eta])
cylinder(r1 = ir, r2 = ir + skew, h = nozzle_height + 4 * eta);
translate([0, 0, nozzle_height - 2 * eta])
cylinder(r = ir + skew, h = duct_height - nozzle_height + 4 * eta);
cylinder(r = ir + skew, h = duct_height_nozzle - nozzle_height + 4 * eta);
// fan entrance
hull() {
translate([fan_x, fan_y_duct, duct_wall + duct_height - duct_wall - duct_top_thickness])
translate([fan_x, fan_y_duct, duct_wall + duct_height_fan - duct_wall - duct_top_thickness])
rotate([180, 0, 0])
rounded_cylinder(r = fan_bore(part_fan) / 2, h = duct_height - duct_wall - duct_top_thickness, r2 = duct_height / 2);
rounded_cylinder(r = fan_bore(part_fan) / 2, h = duct_height_fan - duct_wall - duct_top_thickness, r2 = duct_height_fan / 2);
neck(true);
}
translate([0, 0, duct_height - duct_wall - duct_top_thickness - 1])
translate([0, 0, duct_height_fan - 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 - duct_top_thickness);
cylinder(r = fan_bore(part_fan) / 2, h = duct_height_fan - duct_wall - duct_top_thickness);
neck(true);
}
@@ -362,7 +363,7 @@ module x_carriage_fan_duct_stl() {
cylinder(r1 = or - duct_wall, r2 = or + skew - duct_wall, h = nozzle_height);
hull() {
translate([0, 0, nozzle_height - 2 * eta])
cylinder(r = or + skew - duct_wall, h = duct_height - nozzle_height - 5 * layer_height);
cylinder(r = or + skew - duct_wall, h = duct_height_nozzle - nozzle_height - 5 * layer_height);
throat(true);
}
}
@@ -371,29 +372,30 @@ module x_carriage_fan_duct_stl() {
cylinder(r1 = ir + duct_wall, r2 = ir + skew + duct_wall, h = nozzle_height + 4 * eta);
translate([0, 0, nozzle_height - 2 * eta])
cylinder(r = ir + skew + duct_wall, h = duct_height - nozzle_height + 4 * eta);
cylinder(r = ir + skew + duct_wall, h = duct_height_nozzle - nozzle_height + 4 * eta);
}
}
for(side = [-1, 1])
translate([fan_x + side * fan_hole_pitch(part_fan), fan_y_duct - fan_hole_pitch(part_fan), 0])
cylinder(r = fan_screw_boss_r, h = duct_height);
cylinder(r = fan_screw_boss_r, h = duct_height_fan);
}
//
// Fan screw nut traps
//
translate([fan_x, fan_y_duct, -fan_depth(part_fan) / 2])
fan_hole_positions(part_fan) group() {
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));
nut_trap(screw_clearance_radius(fan_screw), nut_radius(screw_nut(fan_screw)), duct_height_fan - fan_nut_trap_thickness, supported = true);
nut_trap(0, nut_radius(screw_nut(fan_screw)) + 0.15, duct_height_fan - 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 - duct_top_thickness - 3])
rotate([90, 0, 0])
teardrop(r = 4.5 / 2, h = 10, center = true);
if(hot_end_need_cooling(hot_end))
rotate([0, 0, atan2(-fan_x, -fan_y)])
translate([0, ir + skew, duct_height_nozzle - duct_top_thickness - 3])
rotate([90, 0, 0])
teardrop(r = 4.5 / 2, h = 10, center = true);
}
}
@@ -620,7 +622,7 @@ module x_carriage_stl(){
module x_carriage_fan_assembly() {
assembly("x_carriage_fan_assembly");
translate([0, 0, nozzle_length + exploded * 15] + hot_end_duct_offset(hot_end))
translate([0, 0, nozzle_length(hot_end) + exploded * 15] + hot_end_duct_offset(hot_end))
rotate([180, 0, 0])
color(plastic_part_color("lime")) render() x_carriage_fan_duct_stl();

View File

@@ -16,8 +16,12 @@ module x_carriage_assembly(show_extruder = true, show_fan = true) {
for(end = [-1, 1])
translate([extruder_mount_pitch / 2 * end, 0, nut_trap_thickness])
rotate([0, 0, 45])
wingnut(M4_wingnut);
if(end < 0 && hot_end_invert_screw(hot_end))
translate([0, 0, - screw_head_height(M4_hex_screw)])
screw(M4_hex_screw, 20);
else
rotate([0, 0, 45])
wingnut(M4_wingnut);
}
//
// Fan assembly