- commit
- 7588e51
- parent
- 640c22c
- author
- Neale Pickett
- date
- 2026-04-05 07:10:54 -0600 MDT
blowpipe with membrane check valve
7 files changed,
+114,
-136
M
Makefile
+10,
-0
1@@ -1,7 +1,17 @@
2+all: stocks chanter
3+
4+chanter: chanter-top.3mf
5+chanter: chanter-bottom.3mf
6+chanter: chanter-cap.3mf
7+
8 stocks: stock-chanter.3mf
9 stocks: stock-blowpipe.3mf
10 stocks: stock-main.3mf
11
12+stock-blowpipe.3mf: stock.scad
13+stock-chanter.3mf: stock.scad
14+stock-main.3mf: stock.scad
15+
16 %.3mf: %.scad
17 openscad -o $@ $<
18
+0,
-33
1@@ -1,33 +0,0 @@
2-include <BOSL2/std.scad>
3-
4-$fa = 1;
5-$fs = $preview ? 2 : 0.5;
6-
7-module rings(id) {
8- tag("remove") {
9- for (z = [-2, 2]) {
10- up(z) tube(id=id-1, od=id+1, h=1);
11- }
12- }
13-}
14-
15-angle = 45;
16-
17-diff() cyl(h=150, d=20, anchor=BOTTOM) {
18- position(TOP) down(15) rings(20);
19- position(BOTTOM) up(15) rings(20);
20- position(TOP) {
21- cyl(h=10, d=24);
22- down(20) yrot(90+angle) {
23- cyl(h=60, d=12, anchor=BOTTOM) {
24- position(TOP) down(10) rings(12);
25- }
26- }
27- }
28-
29- tag("remove") cyl(h=150, d=18) {
30- position(TOP) {
31- down(20) yrot(90+angle) cyl(h=60, d=10, anchor=BOTTOM);
32- }
33- }
34-}
+45,
-6
1@@ -1,12 +1,51 @@
2 include <BOSL2/std.scad>
3+include <BOSL2/threading.scad>
4
5 $fn = 180;
6+$slop = 0.2;
7
8-difference() {
9- union() {
10- tube(h=90, od=16.5, id=12.5, rounding2=0.5, anchor=BOTTOM);
11- translate([0, 0, 38]) tube(h=25, od=22, id=12.5, rounding=0.5, anchor=BOTTOM);
12- tube(h=7, od=16.5, id=9.5, chamfer2=1.5, anchor=BOTTOM);
13+module top() {
14+ id = 12;
15+ diff() tube(h=45, od=5/8*INCH, id=id, anchor=BOTTOM) {
16+ // Cross through the inside
17+ for (spin = [0, 90]) {
18+ attach(BOTTOM, BOTTOM, spin=spin, inside=true) tag("") cuboid([1.6, 13, 45]);
19+ }
20+
21+ // Fat base
22+ attach(BOTTOM, BOTTOM, inside=true) tag("") tube(h=15, od=25, id=id+2, $fn=12);
23+
24+ // Screw threads, and nubbin in the middle for attaching the diaphragm
25+ attach(BOTTOM, BOTTOM, inside=true) {
26+ threaded_rod(d=20, height=9, pitch=2, internal=true) {
27+ // This is the height of the nubbin and the depth of the diaphragm chamber
28+ attach(TOP, BOTTOM) tube(h=4, od=20, id=2);
29+ }
30+ }
31+
32+ // Cutout for securing the tubing
33+ tag("remove") up(7) tube(h=15, id=5/8*INCH-1, wall=2, chamfer=1);
34+ }
35+}
36+
37+module bottom() {
38+ diff() cyl(h=45, d=5/8*INCH, anchor=BOTTOM) {
39+ hole_d = 4.2;
40+ tag("remove") cyl(h=50, d=hole_d);
41+ for (spin = [0 : 360/6: 360]) {
42+ tag("remove") zrot(spin) right(5) cyl(h=50, d=hole_d);
43+ }
44+
45+ // Screw threads
46+ attach(BOTTOM, BOTTOM, inside=true) {
47+ tag("") threaded_rod(d=20, height=10, pitch=2) {
48+ // Fat base
49+ attach(TOP, BOTTOM) cyl(h=5, d=25, $fn=12);
50+ }
51+ }
52 }
53- translate([0, 16.5/2, 0]) rotate([-1, 0, 0]) cuboid([20, 1, 50]);
54 }
55+
56+top();
57+//up(10) zflip() bottom();
58+right(30) bottom();
+47,
-0
1@@ -0,0 +1,47 @@
2+include <BOSL2/std.scad>
3+
4+$fn = $preview ? 0 : 180;
5+
6+module rings(id) {
7+ for (z = [-1, 1]) {
8+ up(z) tube(id=id, wall=20, h=1);
9+ }
10+}
11+
12+// Angle off perpendicular of the bag into your cap.
13+// If you want it to go exactly perpendicular, set this to 0°.
14+// My David Daye cap is at about 20°,
15+// but I seem to play at about 45°.
16+// Calculating this involves measuring pitch and yaw against the floor,
17+// but it always winds up with a single angle against the body of the cap.
18+angle = 45;
19+
20+// Inside diameter of the cap
21+id = 17.8;
22+
23+od = id + 4.8;
24+
25+lowpoly = 12;
26+
27+diff() cyl(h=150, d=od, anchor=BOTTOM) {
28+
29+ // Décor
30+ ring_d = od+1;
31+ position(TOP) down(8) cyl(d=ring_d, h=2, $fn=lowpoly);
32+ position(CENTER) cyl(d=ring_d, h=2, $fn=lowpoly);
33+ position(BOTTOM) up(8) cyl(d=ring_d, h=2, $fn=lowpoly);
34+
35+ // Hat
36+ // We cut the hat off at a angle, to minimize supports
37+ position(TOP) color("black") diff() cyl(h=50, d=od+4, anchor=BOTTOM, $fn=lowpoly);
38+ tag("remove") up(10) position(TOP+RIGHT) xrot(angle-45) cuboid(100, anchor=BOTTOM);
39+
40+ // Schnozz
41+ position(TOP) down(15) xrot(90+angle) {
42+ cyl(h=60, d=10, anchor=BOTTOM);
43+ tag("remove") up(0.001) cyl(h=61, d=8, anchor=BOTTOM);
44+ }
45+
46+ // Inner bore
47+ tag("remove") down(0.001) cyl(h=150, d=id, rounding=-1);
48+}
+1,
-1
1@@ -2,5 +2,5 @@ use <stock.scad>
2
3 $fn = $preview ? 0 : 180;
4
5-stock(h=60, id=17.6);
6+stock(h=60, id=18.25);
7
+2,
-51
1@@ -1,54 +1,5 @@
2-include <BOSL2/std.scad>
3+include <stock.scad>
4
5 $fn = $preview ? 40 : 180;
6
7-h = 50;
8-id = 12.5;
9-od = 30;
10-
11-difference() {
12- base_h = h - (od/2) + 2; // fudge up by 2mm so we can lop off the top of the sphere
13-
14- union() {
15- hull() {
16- up(base_h) {
17- sphere(d=od);
18- back(25) up(od/4) sphere(d=3);
19- }
20- cyl(h=base_h, d=od, rounding=1, anchor=BOTTOM);
21- back(25) cyl(h=base_h, d=3, rounding=1, anchor=BOTTOM);
22- }
23- }
24-
25- // Binding rings
26- for (z = [5, 10, 15]) {
27- up(z) difference() {
28- hull() {
29- cyl(h=2, d=od+1);
30- back(25) cyl(h=2, d=3+1);
31- }
32- hull() {
33- cyl(h=2, d=od-1);
34- back(25) cyl(h=2, d=3-1);
35- }
36- }
37- }
38-
39- // Chop the top off the sphere
40- up(h) cuboid(100, anchor=BOTTOM);
41- // Inner bore
42- down(0.001) cyl(h=h+0.002, d=id, rounding=-3, anchor=BOTTOM);
43-}
44-
45-/* diff() */
46-/* cyl(h=h-head_h, d=od, rounding=1/2, anchor=BOTTOM) { */
47-/* for (z = [5, 10, 15]) { */
48-/* tag("remove") up(z) attach(BOTTOM) tube(h=2, id=od-1, od=od+1, chamfer=0.2); */
49-/* } */
50-/* attach(TOP) cyl(d=head_d, h=10, anchor=BOTTOM) { */
51-/* attach(TOP) cyl(h=head_h-10, d1=head_d, d2=id+10, anchor=BOTTOM); */
52-/* } */
53-/* tag("remove") attach(BOTTOM) cyl(h=h, d=id, chamfer=-1, anchor=TOP); */
54-/* } */
55-
56-
57+stock(h=50, id=12.5);
+9,
-45
1@@ -1,51 +1,15 @@
2 include <BOSL2/std.scad>
3
4-module stock(h, id, od=0) {
5- od2 = (od > 0) ? od : (id + 4.8);
6- od1 = od2 + 4;
7- difference() {
8- union() {
9- // Main tube
10- tube(h=h, id=id, od=od2, rounding2=0.5, anchor=BOTTOM);
11-
12- // Base
13- tube(h=14, id=id, od=od1, orounding2=1, anchor=BOTTOM);
14-
15- // Flare
16- translate([0, 0, 14+6]) tube(h=h-14-6-14, id=id, od1=od1, od2=od2, orounding1=1, anchor=BOTTOM);
17-
18- // Ferrule at the top
19- translate([0, 0, h-14]) torus(d_maj=od2, r_min=1.4);
20-
21- }
22-
23- // Those damned rings everything has
24- for (d = [6, 8]) {
25- translate([0, 0, h-d]) tube(h=0.5, id=od2-1);
26- }
27-
28- // Ruby
29- translate([0, 0, 20]) {
30- intersection() {
31- rotate([90, 0, -90]) {
32- linear_extrude(height=20, convexity=4) {
33- translate([0, 8]) import("../../ruby.svg", center=true);
34- // XXX: when this is in openscad prod, add center to import and remove translate
35- }
36- }
37- tube(h=h-14-6-14, id1=od1-0.4, id2=od2-0.4, wall=8, anchor=BOTTOM);
38- }
39- }
40- }
41-}
42-
43-module stock_daye(h, id, inset_h=0, inset_z=0) {
44- inset_h = inset_h ? inset_h : h/3;
45+module stock(h, id, inset_h=0, inset_z=0) {
46+ inset_h = inset_h ? inset_h : 10;
47 inset_z = inset_z ? inset_z : 15;
48- od = id + 4;
49+ od = id + 4.8;
50
51- difference() {
52- tube(h=h, id=id, od=od, rounding2=0.6, anchor=BOTTOM);
53- translate([0, 0, inset_z]) tube(h=inset_h, id=od-2, wall=5, chamfer=1);
54+ diff() tube(h=h, id=id, od=od, rounding2=1, anchor=BOTTOM) {
55+ tag("remove") up(10) attach(BOTTOM) tube(h=inset_h, id=od-1.2, wall=5, chamfer=1);
56+ tag("remove") down(10) attach(TOP) intersection() {
57+ tube(h=10, id=od-0.4, wall=8);
58+ xrot(90) linear_extrude(height=20, convexity=4) up(8) import("ruby.svg", center=true);
59+ }
60 }
61 }