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:
@@ -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>
|
||||
|
@@ -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;
|
||||
|
@@ -1 +1 @@
|
||||
include <sturdy_config.scad>
|
||||
include <dibond_config.scad>
|
||||
|
107
scad/direct.scad
107
scad/direct.scad
@@ -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
|
||||
//
|
||||
|
@@ -5,7 +5,7 @@
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// Virual extruder
|
||||
// Virtual extruder
|
||||
//
|
||||
include <conf/config.scad>
|
||||
use <wade.scad>
|
||||
|
@@ -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");
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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");
|
||||
}
|
||||
|
161
scad/vitamins/e3d_hot_end.scad
Normal file
161
scad/vitamins/e3d_hot_end.scad
Normal 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);
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user