1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
screw_tolerance=0.1; slide_tolerance=.3; play_tolerance=.8;
draft=true;
use <e3dchimera.scad>;
assembly_height = 49.5; // the height of e3d chimera assembly in e3dchimera.scad
hs_nozzles_from_back = 6; // the distance from nozzles from the back of the heatsink
hs_size = [30,18,30]; // the heatsink size
mounting_holes_from_top = [ // the offsets of mounting holes on the back
[0, 20], [-4.5,10], [4.5,10]
];
mounting_holes_on_top = [ // the offsets of mounting holes on the top
[0,-3], [-17/2,9], [17/2,9]
];
feeds_apart = 18; // the distance between nozzles (and, therefore filament feeds)
feed_shell_d = 17; // the shell diameter around filament feed, pushfit's diameter
screw_shell_d = 8; // the shell diameter around screws
thread_h = 10.5; // the height of the pushfit's thread
hinge_s = 6; // hinges thickness
screwhead_d = 5.5; // the diameter of the screw head
screwhead_h = 3; // the height of the screw head
ms_size = [19.8,6,10]; // microswitch dimensions
ms_screws_apart = 9.5; // distance between microswitch mounting screws
ms_switch_offset = 2.5; // the offset of the switch from the center
ms_bump = ms_size[1]; // how far from hinge microswitch is mounted
lower_by = 15; // lower hotend from the original intention by this long
gap = 5; // gap between microswitch and heatsink
ps_offset = 3+3; // pushscrew offset from the hinge
back_thickness = 8; // thickness of the part behind the hinge
nut_thickness = 2.5; // intelligent guess should suffice
nut_width = 5.5; // intelligent guess should suffice
use <threads.scad>;
/* the internal thread for e3d bowden coupling: http://e3d-online.com/E3D-v6/Spares/Threaded-Bowden-Coupling-1.75mm-Filament */
module pushfit_thread(h=thread_h) {
thr = 3/8 + .5/25.4;
slit = 25.4*thr/2 + 0.4;
translate([0,0,-1]) if(draft) cylinder(d=thr*25.4,h=h+2);
else english_thread(diameter=thr,threads_per_inch=28,length=(h+2)/25.4,internal=true);
translate([-2,-slit,-1]) cube([4,slit,h+2]);
}
sff = hs_nozzles_from_back+gap; // switch from feeds
hff = sff+ms_size[1]+ms_bump+thread_h/2; // hinges from feeds
module holder() {
translate([0,0,0]) difference() {
union() {
hull() {
rs = 3; drs = screw_shell_d/2-rs;
rf = 6; drf = feed_shell_d/2-rf;
for(sx=[-1,1]) translate([sx*feeds_apart/2,0,0]) {
translate([0,0,drf])
cylinder(d=feed_shell_d,h=thread_h-drf,$fn=60);
cylinder(r=rf,h=thread_h,$fn=30);
}
for(mhot = mounting_holes_on_top) translate([mhot[0],mhot[1],0]) {
translate([0,0,drs])
cylinder(d=screw_shell_d,h=thread_h-drs,$fn=30);
cylinder(r=rs,h=thread_h,$fn=30);
}
}
hull() {
translate([0,0,thread_h/2]) cube(size=[hs_size[0]-2*hinge_s-2*slide_tolerance,feed_shell_d,thread_h],center=true);
translate([0,-hff,thread_h/2])
rotate([0,90,0])
cylinder(d=thread_h,h=hs_size[0]-2*hinge_s-2*slide_tolerance,center=true,$fn=60);
}
}//union
for(sx=[-1,1]) translate([sx*feeds_apart/2,0,0])
pushfit_thread();
for(mhot = mounting_holes_on_top) translate([mhot[0],mhot[1],0]) {
translate([0,0,-1]) cylinder(d=3,h=thread_h+2,$fn=12); // TODO: sink heads
translate([0,0,thread_h/2]) cylinder(d=screwhead_d+slide_tolerance,h=thread_h/2+1,$fn=30);
}
// hinge
translate([0,-hff,thread_h/2])
rotate([0,90,0]) cylinder(d=3+slide_tolerance,h=hs_size[0],center=true,$fn=12);
// push screw
hull() for(oy=[-1,1]) translate([0,-hff+ps_offset+oy,-1]) cylinder(d=3+play_tolerance,h=thread_h+2,$fn=30);
// tune screw
translate([0,-sff-ms_size[1]/2,-1]) cylinder(d=3,h=thread_h+2);
}//difference
}
module base() {
us = 2*ms_size[2];
translate([0,-hff,0]) difference() {
union() {
for(sx=[-1,1]) translate([sx*(hs_size[0]-hinge_s)/2,0,0]) hull() {
translate([0,0,thread_h/2])
rotate([0,90,0]) cylinder(d=thread_h,h=hinge_s,center=true,$fn=60);
cube(size=[hinge_s,thread_h,thread_h],center=true);
translate([-hinge_s/2,0,-1]) mirror([0,1,0]) cube(size=[hinge_s,thread_h/2+back_thickness,thread_h+1]);
} // hull for
hull() {
translate([0,0,-us/2-slide_tolerance]) cube(size=[hs_size[0],thread_h+1,us],center=true);
for(sx=[-1,1]) translate([sx*(hs_size[0]/2-ms_bump),thread_h/2,-us-slide_tolerance])
cylinder(r=ms_bump,h=us+slide_tolerance,$fn=30);
}
translate([-hs_size[0]/2,-thread_h/2-slide_tolerance,-us-slide_tolerance])
mirror([0,1,0]) cube(size=[hs_size[0],back_thickness,us+slide_tolerance+thread_h]);
} // union
translate([0,0,thread_h/2])
rotate([0,90,0]) cylinder(d=3+screw_tolerance,h=hs_size[0]+2,center=true,$fn=12);
for(smx=[0,1]) mirror([smx,0,0])
translate([hs_size[0]/2+1,0,thread_h/2]) rotate([0,-90,0]) cylinder(d=screwhead_d+slide_tolerance,h=screwhead_h+1,$fn=30);
/* changed my mind; for(srx=[-1,1]) rotate([srx*15,0,0])
translate([0,0,thread_h/2-slide_tolerance])
cube(size=[hs_size[0]-2*hinge_s,thread_h*sqrt(2)+2,thread_h],center=true); */
// switch mount
for(sx=[-1,1]) translate([sx*ms_screws_apart/2+ms_switch_offset,thread_h/2,-ms_size[2]])
rotate([90,0,0])
cylinder(d=2.5,h=ms_size[1]*2,center=true,$fn=12);
// thing mount
translate([0,-thread_h/2-back_thickness,lower_by])
for(mhft = mounting_holes_from_top) translate([mhft[0],0,-mhft[1]]) {
rotate([-90,0,0])
translate([0,0,-1])
cylinder(d=3,h=back_thickness+1);
translate([0,back_thickness/2,0])
cube(size=[2*hs_size[0],nut_thickness+slide_tolerance,nut_width+slide_tolerance],center=true);
} // translate for
mirror([0,0,1]) translate([0,ps_offset,-1]) cylinder(d=3,h=hs_size[2]+1);
} // difference
}
view="*";
if(view=="holder") {
holder();
}else if(view=="base") {
base();
}else {
% translate([0,0,-assembly_height]) chimera_assembly();
color("lightgreen",0.7) holder();
color("darkgreen",0.7) base();
}
|