summaryrefslogtreecommitdiff
path: root/mixer.scad
blob: c2984825546d3084336b62afa689ddf078663e13 (plain)
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
146
layer_height=0.2; extrusion_width=0.45;
epsilon=0.01;
$fs=0.125;

draft=true;

use <threads.scad>;
module pushfit_thread(h=10) {
 thr = 3/8 + .5/25.4;
 slit = 25.4*thr/2 + 0.2;
 if(draft) cylinder(d=thr*25.4,h=h);
 else english_thread(diameter=thr,threads_per_inch=28,length=h/25.4,internal=true);
 translate([-2,-slit,0]) cube([4,2*slit,h]);
}

module the_mixer(
 pushfit_d = 10, pushfit_h = 10,
 pushfit_id = 6,
 pushfit_type = "threaded", // threaded|embedded|embeddest
 pushfit_ring_h = 4.7, // height of embedded pushfit ring
 pushfit_insert_d = 8, // diameter of pushfit insert legs hole
 pushfit_legspace_h = 3.2, // the height of legspace for embeddest variant
 pushfit_inlet_ch = 1, // inlet chamfer
 liner_d = 4, liner_id = 2, // ptfe liner inner and outer diameters
 filament_d = 1.75,
 join_angle = 30,
 joint = "wide", // wide|narrow

 interpushfit = 2*extrusion_width, // space between two pushfit holes
 pushfit_s = 2, // shell around pushfit holes
 output_l = 4, // length of output liner after before pushfit
 outer_r = 3, // outer radius

 liner_d_tolerance = .2,
 filament_d_tolerance = .25
) {
 fnd = PI*2*2; fnr = fnd*2;

 ld = liner_d+liner_d_tolerance;
 fd = filament_d+filament_d_tolerance;
 linero = ld/2/tan(join_angle/2); // liner offset

 jd = (joint=="narrow") ? fd : ld; // joint diameter
 jo = (joint=="narrow") ? jd/2/tan(join_angle/2) : linero; // joint offset

 pfrx = interpushfit/2/cos(join_angle/2); // radial margin
 pfR = pushfit_d/2+pfrx;      // radius of pushfit with margin
 // offset of pushfit offset
 pfoo = (pushfit_type=="threaded") ? 0 :
        (pushfit_type=="embedded") ? (pushfit_h-pushfit_ring_h) :
        (pushfit_type=="embeddest") ? 0 : undef;
 pfo = pfR/tan(join_angle/2)-pfoo; // pushfit thread ofset

 h = pushfit_d+pushfit_s*2;
 
 module liner(l,in,offset=0,linero) {
  lo = linero==undef ? l/2 : linero;
  translate([0,0,offset])
  if(joint=="narrow") {
   $fn = max(fd,ld,jd)*fnd;
   cylinder(d=fd,h=l);
   //if(in=="top") cylinder(d1=jd,d2=fd,h=(jd-fd)/2);
   translate([0,0,lo])
   cylinder(d=ld,h=l-lo);
   if(in=="bottom") translate([0,0,lo+epsilon]) mirror([0,0,1])
    cylinder(d1=(liner_id+ld)/2,d2=fd,h=(liner_id+ld-fd)/2);
  }else{
   inh=ld-liner_id;
   union() {
    translate([0,0,inh])
    cylinder(d=ld,h=l-inh,$fn=ld*fnd);
    translate([0,0,-epsilon])
    cylinder(d1=ld+epsilon,d2=liner_id-epsilon,h=inh+2*epsilon,$fn=ld*fnd);
   }
  }
 }
 module pushfit() {
  if(pushfit_type=="threaded") {
   pushfit_thread(h=pushfit_h);
  }else if(pushfit_type=="embedded") {
   translate([0,0,pushfit_h-pushfit_ring_h])
   cylinder(d=pushfit_d,h=pushfit_ring_h,$fn=fnd);
   cylinder(d=pushfit_insert_d,h=pushfit_h,$fn=pushfit_insert_d*fnd);
  }else if(pushfit_type=="embeddest") {
   cylinder(d=pushfit_id,h=pushfit_h+1,$fn=pushfit_insert_d*fnd);
   cylinder(d=pushfit_d,h=pushfit_legspace_h,$fn=pushfit_d*fnd);
   dd = (pushfit_d-pushfit_id)/2;
   translate([0,0,pushfit_legspace_h-epsilon])
   cylinder(d1=pushfit_d,d2=pushfit_id-2*epsilon,h=dd+epsilon,$fn=pushfit_d*fnd);
   translate([0,0,pushfit_h-pushfit_inlet_ch-epsilon])
   cylinder(d1=pushfit_id-2*epsilon,d2=pushfit_id+2*pushfit_inlet_ch+2,h=pushfit_inlet_ch+epsilon+1,$fn=(pushfit_id+2*pushfit_inlet_ch+2)*fnd);
  }
 }
 
 difference() {
  hull() {
   for(s=[-1,1]) {
    rotate([0,0,s*join_angle/2])
    for(ss=[-1,1])
    translate([ss*pushfit_d/2,pfo+pushfit_h-outer_r-epsilon])
    cylinder(r=outer_r,h=h,center=true,$fn=outer_r*fnr);
    translate([s*pushfit_d/2,-output_l-pushfit_h+outer_r+epsilon,0])
    cylinder(r=outer_r,h=h,center=true,$fn=outer_r*fnr);
   }
  }
  for(s=[-1,1]) rotate([0,0,s*join_angle/2]) {
   rotate([-90,0,0])
   liner(l=pfo-jo+epsilon,in="bottom",offset=jo);
   translate([0,pfo,0]) rotate([-90,0,0])
   pushfit();
  }
  rotate([90,0,0]) {
   liner(l=output_l+epsilon,in="top",linero=0);
   //cylinder(d=ld,h=output_l+1,$fn=ld*fnd);
   translate([0,0,output_l])
   pushfit();
  }
  hull() {
   for(s=[-1,1]) rotate([0,0,s*join_angle/2]) {
    rotate([-90,0,0])
    translate([0,0,jo])
    cylinder(d=jd,h=epsilon,$fn=jd*fnd);
   }
   rotate([90,0,0])
   cylinder(d=jd,h=epsilon,$fn=jd*fnd);
  }
 }
}

module this() {
 the_mixer(
  pushfit_type="embeddest",
  pushfit_d = 8,
  pushfit_h = 7,
  interpushfit = extrusion_width,
  joint = "narrow"
 );
}

if(!false) {
 difference() {
  this();
  cylinder(d=100,h=100);
 }
}else
 this();