Compare commits

...

3 Commits

8 changed files with 162 additions and 27214 deletions

View File

@ -1,7 +1,4 @@
default: chanter.stl button-container.stl button-cup.stl
button-%.stl: button-%.scad button.scad
openscad -o $@ $<
default: chanter.stl
%.stl: %.scad
openscad -o $@ $<

View File

@ -1,7 +0,0 @@
include <button.scad>;
cup();
translate([0, 0, wall]) magnet();
translate([40, 0, 0]) container();
translate([40, 0, wall]) magnet();

View File

@ -1,3 +0,0 @@
include <button.scad>;
translate([0, 0, 0]) container();

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +0,0 @@
include <button.scad>;
cup();

File diff suppressed because it is too large Load Diff

View File

@ -1,103 +0,0 @@
// This is the button on the bottom of the chanter.
// You put a magnet in the bottom of it,
// then jam a unipolar linear hall effect sensor in the body,
// and you have a cheap and reliable way to detect insertion depth.
// Make circles lovely and round
$fa = 1; $fs = 0.5;
magnet_od = 17.5; // Outside diameter of the magnet you're using
magnet_id = 7;
magnet_h = 6; // I use two ceramic magnets stacked together, to increase the field strength
throw = 15; // How far you can depress the button
gap = 2; // How much space we need for the gap. OH59E is 1.57mm thick
wall = 1.6; // Wall depth
leg_angle = 30; // How wide a leg should be, in degrees
tab_w = 2; // Tab height
module magnet() {
color("SlateGray") {
difference() {
cylinder(h=magnet_h, d=magnet_od);
translate([0, 0, -0.1]) cylinder(h=magnet_h+0.2, d=magnet_id);
}
}
}
// Cup to hold the magnets on the bottom
magnet_cup_tolerance = 1;
cup_id = magnet_od + magnet_cup_tolerance;
cup_od = cup_id + wall*2;
cup_leg_h = wall + throw;
peg_d = magnet_id - 0.3;
module cup() {
union() {
cylinder(h=wall, d=cup_od);
// A peg in the middle to make it easier to assemble.
// This goes all the way so we can print without supports
cylinder(h=wall+magnet_h, d=peg_d);
// The tabs on the sides
for (i = [0, 120, 240]) {
rotate(i) {
rotate_extrude(angle=leg_angle) {
translate([cup_id/2, 0, 0]) square([wall, cup_leg_h]);
}
}
rotate(i + leg_angle*0.1) {
rotate_extrude(angle=leg_angle*0.8) {
translate([cup_od/2, cup_leg_h-tab_w, 0]) square(tab_w);
}
}
}
}
}
// The thing the cup slides into
cup_container_tolerance = 0.5;
container_id = cup_od + cup_container_tolerance;
container_od = container_id + wall*4;
container_h = wall + throw + gap + wall; // Height of the container that the cup goes into
module channel(h) {
rotate_extrude(angle=leg_angle) {
translate([cup_od/2, 0, 0]) square([tab_w, h]);
}
}
module container() {
difference() {
union() {
difference() {
cylinder(h=container_h, d=container_od);
// Carve out space for the cup
translate([0, 0, wall]) cylinder(h=container_h, d=container_id);
// Carve out channels for the tabs
channel_w = tab_w + 0.5;
for(i = [0, 120, 240]) {
translate([0, 0, wall]) {
// Channel for the throw
rotate(i) channel(throw + wall);
// Channel for the screw-in.
// This is going to droop when printing, so we make it a bit wider
rotate(i+leg_angle) channel(tab_w*1.5);
// Channel for insertion
rotate(i+leg_angle+leg_angle) channel(container_h);
}
}
}
// Another post to help center magnets
cylinder(h=wall+magnet_h, d=peg_d);
}
// Now drill holes for the sensors
for (x = [-1.27, 0, 1.27]) {
translate([x, 2, 0]) cube([0.8,0.8, container_h], center=true);
}
}
}

161
model/simple.scad Normal file
View File

@ -0,0 +1,161 @@
// Based on O'Flynn Rowsome Chanter Measurements
// http://pipers.ie/source/media/?mediaId=31307&galleryId=1353
// DIameter of screw hole
Screwhole = 4; // [1:10]
// Part to generate
Part = "all"; // [all, top-front, top-back, bottom-front, bottom-back]
module metal() {
color("silver") children();
}
module leather() {
color("sienna") children();
}
module ivory() {
color("wheat") children();
}
module wood() {
color("saddlebrown") children();
}
// A shape like a hamburger patty
module patty(h, d) {
intersection() {
cylinder(h=h, d=d);
translate([0, 0, h/2]) {
resize([d, d, h*3]) {
sphere(d=d);
}
}
}
}
// A cylinder with something like a compression fitting around it
module ringyding(h, id, od) {
margin = h * 0.1;
union() {
leather() cylinder(h=h, d=id);
translate([0, 0, margin]) ivory() patty(h=h*0.8, d=od);
}
}
// A fillet is a sort of trumpet bell shape
module fillet(h, d1, d2) {
r = abs(d1-d2)/2;
resize([d1, d1, h]) {
rotate_extrude() {
translate([d2/2, 0, 0]) {
difference() {
square([r, r]);
translate([r, r]) circle(r=r);
}
}
}
}
}
// An upside-down fillet
module tellif(h, d2, d1) {
translate([0, 0, h]) mirror([0, 0, 1]) fillet(h, d1, d2);
}
// Absolutely nothing: helps make the code look better
module nothing(h) {
}
// Just a rotated cylinder
// h: height of the *top* of the protrusion
// d: height of the protrusion (diameter?)
// protrusion: amount of protrusion
module bumpout(h, d, protrusion) {
intersection() {
translate([0, -protrusion, h-d]) {
cylinder(h=d, d=20.4);
}
translate([0, -protrusion, h-d/2]) {
sphere(d=protrusion*4);
}
translate([0, 0, h-d]) {
cylinder(h=d, d1=19, d2=50);
}
}
}
// A tonehole with :
// * height=h
module tonehole(h) {
translate([0, 5, h]) {
rotate(a=90, v=[1, 0, 0]) {
resize([Screwhole, Screwhole, 100]) {
cylinder(h=100, d=100);
}
}
}
}
module chanter() {
difference() {
union() {
translate([0, 0, 0]) metal() cylinder(h=22.0, d=17.1);
translate([0, 0, 22]) wood() cylinder(h=23.5, d=17.1); // Rings go around this
// Decorative stuff on the bottom
translate([0, 0, 32]) {
translate([0, 0, 0.0]) ivory() patty(h=3.4, d=28.7);
translate([0, 0, 3.4]) leather() fillet(h=1.8, d1=27, d2=22);
translate([0, 0, 4.1]) ringyding(h=4.1, id=21, od=24);
translate([0, 0, 8.2]) ringyding(h=5.3, id=21, od=24);
}
// A taper on that bottom ring so it will print nicely
translate([0, 0, 12]) wood() tellif(h=20, d1=25.5, d2=100);
// Main body
translate([0, 0, 45.5]) wood() cylinder(h=244.9, d1=20.4, d2=18);
// Top decoration
translate([0, 0, 290.4]) {
color("silver") cylinder(h=40.8, d=17);
translate([0, 0, 0.0]) ringyding(h=5.5, id=19, od=21);
translate([0, 0, 5.5]) nothing(h=9.7); // metal
translate([0, 0, 15.2]) ringyding(h=4.3, id=18, od=20.7);
translate([0, 0, 19.5]) nothing(h=6.7); // metal
translate([0, 0, 26.2]) ivory() patty(h=2, d=20.2);
translate([0, 0, 28.2]) leather() tellif(h=8, d2=19, d1=23);
translate([0, 0, 36.2]) ivory() patty(h=4.6, d=25.4);
}
// I presume this protects the reed and provides a place for tubing to connect
translate([0, 0, 324.5]) metal() cylinder(h=32.7, d=14.8);
// Bumpouts
// These angles are my best guess based on photos
rotate(220) wood() bumpout(161.2, 14.8, 6); // protrusion guessed
}
// Tone Holes!
translate([0, 0, 5]) { // This offset is specified nowhere. I'm guessing to make it fit the bumpouts.
rotate(180) tonehole(263.0); // back D
rotate(0) tonehole(246.4); // C
rotate(0) tonehole(216.2); // B
rotate(0) tonehole(182.0); // A
rotate(0) tonehole(147.4); // G
rotate(0) tonehole(116.2); // F
rotate(0) tonehole(84.7); // E
rotate(-10) tonehole(53.3); // E
}
}
}
intersection() {
chanter();
cube(400);
}