uilleann

3d printable Uilleann bagpipes
git clone https://git.woozle.org/neale/uilleann.git

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 
D attic/daye/chanter/cap.scad
+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-}
M blowpipe.scad
+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();
A chanter-cap.scad
+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+}
M stock-blowpipe.scad
+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 
M stock-chanter.scad
+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);
M stock.scad
+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 }