Commit | Line | Data |
---|---|---|
28ef71df CE |
1 | // Threads for acorn model |
2 | // Copyright (c) 2017 Clinton Ebadi <clinton@unknownlamer.org> | |
3 | ||
0cbf5490 | 4 | use <screw_threads.scad> // http://www.thingiverse.com/thing:1686322 |
28ef71df | 5 | |
244fc8f0 | 6 | AUTO_CALCULATE = -1; |
28ef71df | 7 | |
5d6b539a CE |
8 | acorn_parts = [ "body", "cap", "gasket" ]; |
9 | ||
0cbf5490 CE |
10 | internal_thread_tolerance = 0.3; |
11 | external_thread_tolerance = 0.2; | |
12 | thread_angle = 50; | |
28ef71df | 13 | |
5d6b539a CE |
14 | |
15 | function contains (x, lst) = len([ for (i = lst) if (x == i) i]) > 0; | |
16 | ||
b097fbc1 CE |
17 | // dome module from https://github.com/Sembiance/common/blob/master/openscad/dome.scad, Public Domain |
18 | module dome(d=5, h=2, hollow=false, wallWidth=0.5) { | |
19 | sphereRadius = (pow(h, 2) + pow((d/2), 2) ) / (2*h); | |
20 | translate([0, 0, (sphereRadius-h)*-1]) { | |
21 | difference() { | |
22 | sphere(sphereRadius); | |
23 | translate([0, 0, -h]) cube([2*sphereRadius, 2*sphereRadius, 2*sphereRadius], center=true); | |
24 | if(hollow) sphere(sphereRadius-wallWidth); | |
25 | } | |
26 | } | |
27 | } | |
28 | ||
244fc8f0 CE |
29 | module acorn (thread_pitch = 3.0, |
30 | thread_size = 2.5, | |
31 | thread_height = 3.5, | |
32 | thread_tooth_height = AUTO_CALCULATE, | |
28ef71df | 33 | |
244fc8f0 CE |
34 | inner_d = 24.5, |
35 | base_height = AUTO_CALCULATE, | |
36 | wall_thickness = AUTO_CALCULATE, | |
37 | outer_d = AUTO_CALCULATE, | |
28ef71df | 38 | |
244fc8f0 CE |
39 | keychain = true) { |
40 | ||
41 | // derived settings | |
42 | wall_thickness = (wall_thickness == AUTO_CALCULATE) ? thread_size : wall_thickness; | |
43 | outer_d = (outer_d == AUTO_CALCULATE) ? inner_d + wall_thickness*2 : outer_d; | |
44 | thread_tooth_height = (thread_tooth_height == AUTO_CALCULATE) ? ((thread_pitch - 0.4 > 0) ? thread_pitch - 0.4 : thread_pitch) : thread_tooth_height; | |
45 | base_height = (base_height == AUTO_CALCULATE) ? inner_d : base_height; | |
46 | ||
b097fbc1 CE |
47 | echo ("outer_d = ", outer_d); |
48 | ||
244fc8f0 CE |
49 | |
50 | module acorn_thread (outer_d = outer_d, internal = false, ring = true) { | |
51 | if (internal) { | |
52 | outer_ring_d = outer_d+max(thread_size, wall_thickness)+1; | |
53 | echo ("outer ring = ", outer_ring_d); | |
54 | ScrewHole (outer_diam=outer_d, height = thread_height, pitch = thread_pitch, tooth_height = thread_tooth_height, tooth_angle = thread_angle, tolerance=internal_thread_tolerance) { | |
55 | if (ring) cylinder (d = outer_ring_d, h = thread_height); | |
56 | } | |
28ef71df | 57 | } |
28ef71df | 58 | |
244fc8f0 CE |
59 | if (!internal) { |
60 | difference () { | |
61 | ScrewThread (outer_diam=outer_d, height = thread_height, pitch = thread_pitch, tooth_height = thread_tooth_height, tooth_angle = thread_angle, tolerance=external_thread_tolerance); | |
62 | cylinder (d = outer_d-wall_thickness-thread_size-0.01, h = thread_height * 4, center=true); | |
63 | } | |
28ef71df CE |
64 | } |
65 | } | |
28ef71df | 66 | |
244fc8f0 CE |
67 | module nut_body (h = base_height, d = outer_d, nub = false) { |
68 | translate ([0 ,0, h]) { | |
69 | intersection () { | |
70 | union () { | |
71 | resize ([d, d, h*2]) sphere (d=h*2); | |
72 | if (nub) { | |
73 | translate ([0, d/2-wall_thickness/2, -thread_height]) sphere (d=wall_thickness*2, $fs = 0.1); | |
74 | } | |
0cbf5490 | 75 | } |
244fc8f0 | 76 | translate ([0 ,0, -h/2]) cube ([d*2, d*2, h], center=true); |
0cbf5490 | 77 | } |
0cbf5490 | 78 | } |
28ef71df | 79 | } |
28ef71df | 80 | |
244fc8f0 CE |
81 | module nut () { |
82 | difference () { | |
83 | nut_body (); | |
84 | translate ([0, 0, wall_thickness + 0.01]) nut_body (d=outer_d-wall_thickness*2, nub=false); | |
85 | } | |
28ef71df | 86 | |
244fc8f0 CE |
87 | translate ([0, 0, base_height-0.1]) acorn_thread (outer_d = outer_d); |
88 | } | |
28ef71df | 89 | |
28ef71df | 90 | |
b097fbc1 | 91 | module cap_keychain_holes (hole_d=3, spacing=12) { |
244fc8f0 CE |
92 | h=100; |
93 | translate ([-spacing/2, 0, 0]) cylinder (d=hole_d, h=h, $fs=0.1); | |
94 | translate ([spacing/2, 0, 0]) cylinder (d=hole_d, h=h, $fs=0.1); | |
95 | } | |
28ef71df | 96 | |
b097fbc1 CE |
97 | module cap (model="3D/RaleighAcorn_Filled_simple.stl", native_d = 168) { |
98 | scale_f = outer_d / native_d; //168; | |
99 | echo ("scale_f = ", scale_f); | |
244fc8f0 CE |
100 | difference () { |
101 | scale ([scale_f, scale_f, scale_f]) { | |
102 | difference () { | |
103 | union () { | |
b097fbc1 | 104 | translate ([0, 0, -1]) import (model); |
244fc8f0 | 105 | echo ("h = ", thread_height/scale_f); |
244fc8f0 | 106 | } |
b097fbc1 | 107 | // todo: only makes sense for RaleighAcorn, fix in original model... |
244fc8f0 | 108 | translate ([0, 0, -0.51]) cube ([200, 200, 1], center=true); |
0cbf5490 | 109 | } |
0cbf5490 | 110 | } |
244fc8f0 | 111 | if (keychain) cap_keychain_holes (); |
b097fbc1 CE |
112 | |
113 | // hollow it out (make parametric later, this is pretty ugly now, but calc seems to be ok for RaleighAcorn) | |
114 | diam_to_height_ratio = 3.2; | |
115 | dome_h = outer_d / diam_to_height_ratio - thread_height; | |
116 | echo ("dome_h = ", dome_h); | |
117 | difference () { | |
118 | translate ([0, 0, thread_height-0.01]) dome (d=outer_d, h=dome_h); | |
119 | } | |
120 | ||
121 | ||
122 | translate ([0, 0, -0.01]) acorn_thread (internal = true, ring = false); | |
0cbf5490 | 123 | } |
0cbf5490 | 124 | } |
28ef71df | 125 | |
244fc8f0 CE |
126 | module gasket (gasket_height=0.9) { |
127 | cylinder (d = outer_d, h = gasket_height, center=true); | |
28ef71df CE |
128 | } |
129 | ||
244fc8f0 | 130 | module nuts () { |
5d6b539a CE |
131 | if (contains ("body", acorn_parts)) |
132 | translate ([outer_d+10, 0, 0,]) nut (); | |
133 | if (contains ("cap", acorn_parts)) | |
b097fbc1 | 134 | cap (native_d=167);//model="3D/RaleighAcorn_ExaggeratedCap_Decimated.stl", native_d = 178); |
5d6b539a CE |
135 | if (contains ("gasket", acorn_parts)) |
136 | translate ([-(outer_d+10), 0, 0,]) gasket (); | |
244fc8f0 | 137 | } |
28ef71df | 138 | |
244fc8f0 | 139 | nuts (); |
28ef71df | 140 | } |
244fc8f0 | 141 | |
b097fbc1 CE |
142 | //$fs = 1; |
143 | //$fa = 1; | |
244fc8f0 | 144 | |
b097fbc1 CE |
145 | acorn_parts = [ "cap"]; |
146 | ||
147 | //acorn (); | |
148 | huge_acorn (); | |
149 | ||
150 | module huge_acorn () { | |
151 | acorn (inner_d=100, base_height=80, | |
152 | thread_size=4, thread_pitch=4, thread_height=8, | |
153 | keychain=false); | |
154 | } |