uilleann

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

commit
4ebc81a
parent
3b984bc
author
Neale Pickett
date
2025-02-20 08:20:26 -0700 MST
Further tuning of chanter
5 files changed,  +73, -15
M daye/Makefile
+2, -0
1@@ -5,3 +5,5 @@ clean:
2 
3 %.stl: %.scad
4 	openscad -o $@ $<
5+
6+chanter/chanter-%.stl: chanter/chanter-%.scad chanter/chanter.scad
M daye/chanter/chanter-bottom.scad
+2, -2
1@@ -1,6 +1,6 @@
2+include <../common.scad>
3 use <./chanter.scad>
4 
5-intersection() {
6+tenon(top=false) {
7   chanter();
8-  cut();
9 }
M daye/chanter/chanter-top.scad
+1, -2
1@@ -1,6 +1,5 @@
2 use <./chanter.scad>
3 
4-difference() {
5+tenon(top=true) {
6   chanter();
7-  cut();
8 }
M daye/chanter/chanter.scad
+67, -10
  1@@ -1,41 +1,81 @@
  2 include <../common.scad>
  3 
  4+height = 360.0;
  5 od = 16.0;
  6+od_derlin = od + 0.5;
  7+id_bot = 13.2;
  8+id_top = 5.51;
  9+cut_height = 155; // Where to cut it in half
 10 
 11 module tonehole(h=10, d=10, undercut=0) {
 12+  rotate([0, 0, -90])
 13   translate([od/2, 0, h]) {
 14     rotate([0, -90+undercut, 0]) {
 15       // Scoot it down a hair so it will penetrate the entire tube when rotated
 16-      translate([0, 0, -3]) {
 17-        cylinder(h=od/2, d=d);
 18+      translate([0, 0, -od/2]) {
 19+        cylinder(h=od, d=d);
 20       }
 21     }
 22   }
 23 }
 24 
 25+
 26+// Something like David Daye's Penny Chanter,
 27+// based on my measurements and undercut hints on David's web site.
 28+// This is symmetrical, so both pieces can be printed at the same time,
 29+// with color changes
 30 module chanter() {
 31   difference () {
 32     union() {
 33       // The core part of the instrument is this brass tube
 34-      brass() cylinder(h=360.0, d=od);
 35+      difference() {
 36+        brass() cylinder(h=height, d=od);
 37+
 38+        // Seam guides
 39+        translate([0, od/2, 0]) cylinder(d=1, h=400);
 40+      }
 41 
 42       // David adds this outer Derlin tube as an upgrade option
 43-      derlin() translate([0, 0, 40.0]) cylinder(h=290, d=16.5);
 44+      difference() {
 45+        derlin() translate([0, 0, 40.0]) cylinder(h=290, d=od_derlin);
 46+
 47+        // The slits up the sides serve three purposes:
 48+        // 1. directs the slicer to place seams in it (and not on the face)
 49+        // 2. provides alignment guides for attaching the two pieces
 50+        // 3. looks like an intentional stylistic thing
 51+        rotate([0, 0, 85]) translate([0, od_derlin/2, 0]) cylinder(d=1, h=cut_height+20); // overlap
 52+        rotate([0, 0, -85]) translate([0, od_derlin/2, cut_height-20]) cylinder(d=1, h=400);
 53+      }
 54 
 55       // These little doodads are probably just to hide the Derlin seam
 56       ivory() translate([0, 0, 30.0]) cylinder(h=12, d=22.0);
 57-      ivory() translate([0, 0, 322.0]) cylinder(h=10, d=22.0);
 58+      ivory() translate([0, 0, height - 30.0 - 12]) cylinder(h=12, d=22.0);
 59     }
 60 
 61-    // The bore for the reed: no harm in running this the entire length
 62-    cylinder(h=400, d=6.3);
 63+    // Seam guides
 64+    translate([0, 11, 0]) cylinder(d=1, h=400);
 65 
 66     // Inner bore, which runs up to the place where the reed drops in
 67-    cylinder(h=327, d=13.5);
 68+    translate([0, 0,   0]) cylinder(h=337.01, d1=id_bot, d2=id_top);
 69+    translate([0, 0, 337]) cylinder(h=23.1, d1=id_top, d2=7.1);
 70 
 71     // I totally dig David's minimalist aesthetic
 72     translate([0, 0, 3]) rings(d=16.0);
 73 
 74+    // Stamp my name on it
 75+    difference() {
 76+      translate([0, 0, 307]) {
 77+        rotate([90, 0, 180]) {
 78+          linear_extrude(50) {
 79+            translate([0, 5]) text("neale", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
 80+            translate([0, 0]) text("2024-2", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
 81+          }
 82+        }
 83+      }
 84+      cylinder(h=360, d=od-0.5);
 85+    }
 86+
 87+
 88     // Tone Holes!
 89     // XXX: Undercut angle should be taken into account here
 90     tonehole(h=57.1, d=6.68); // E-
 91@@ -50,8 +90,25 @@ module chanter() {
 92   }
 93 }
 94 
 95-module cut() {
 96-    rotate([0, 45, 0]) cube(240, center=true);
 97+module tenon(top=false, h=cut_height, od=od, depth=20, thickness=2) {
 98+  module cut() {
 99+        cylinder(h=cut_height+depth, d=od-thickness-clearance);
100+        cylinder(h=cut_height, d=50);
101+  }
102+
103+  if (top) {
104+    difference() {
105+      children();
106+      cut();
107+    }
108+  } else {
109+    intersection() {
110+      children();
111+      cut();
112+    }
113+  }
114 }
115 
116 chanter();
117+//translate([0, 50, 360]) rotate([180, 0, 0]) chanter();
118+
M daye/common.scad
+1, -1
1@@ -2,7 +2,7 @@
2 $fn = $preview ? 0 : 60;
3 
4 // clearance in a permanent tenon/mortise joint
5-clearance = 0.04;
6+clearance = 0.03;
7 
8 module brass() {
9   color("gold") children();