//tri-bumbler //Holland Hopson //http://hollandhopson.com //build in 2D in order to export as STL file for laser cutting //cut 3 for each tri-bumbler //globals $fn = 100; //make high resolution //define radius, height, etc. here rubberBandWidth = 7; //mm unstretched width. Gets narrower when stretched stringHole = 1.5; //hole for string in mm hubDiameter = 50; mortiseHeight = 10; mortiseWidth = 6; //must be exact thickness of material armLength = 100; armWidth = 25; tolerance = 0.25; //add/subtract a little to make things fit better //derived dimensions supportArmLength = armLength * 0.3333; supportArmWidth = armWidth * 0.3333; module hub() //begin our module { difference() { union() { //put objects that need to be added to the design here //main hub circle(d = hubDiameter); } union() { //put objects that need to be subtracted from the design here //mortises - holes for (i = [0:2]){ echo(i); rotate(i*360/3 + 60){ //offset prevents arms from intersecting mortises translate([mortiseHeight, mortiseWidth*-0.5, 0]) //add slight tolerance to this so the tenons fit better square([mortiseHeight, mortiseWidth+tolerance]); } } } } } module arm() //begin our module { difference() { union() { //put objects that need to be added to the design here //main arm translate([hubDiameter*0.25,armWidth*-0.5,0]) //move away from center of hub and center the arms square([armLength, armWidth]); //circle at end of arm translate([hubDiameter*0.25+armLength,0,0]){ //move away from center of hub+arm length circle(d = hubDiameter); } } union() { //put objects that need to be subtracted from the design here //rubber band slit - left side translate([hubDiameter*0.25+armLength,0,0]){ //move away from center of hub+arm length rotate(45) translate([hubDiameter*0.10,0,0]){ //move away from center of end circle square([supportArmLength, supportArmWidth]); //create support arm 1/3 of } } //rubber band slit - right side translate([hubDiameter*0.25+armLength,0,0]){ mirror([0,1,0]) //mirror what we do on the left side. This is helpful because rotating in other direction leaves a gap due to the different origin on this side vs the left side. rotate(45) translate([hubDiameter*0.10,0,0]){ //move away from center of end circle square([supportArmLength, supportArmWidth]); } } //cutout curve for end of arm translate([hubDiameter*0.25+armLength,0,0]) //move away from center of hub+arm length circle(hubDiameter*0.20); //string hole translate([(hubDiameter*0.25+armLength)*0.85,0,0]) circle(stringHole); } } } module tri_bumbler() //begin our module { difference() { union() { //put objects that need to be added to the design here hub(); arm(); } union() { //put objects that need to be subtracted from the design here } } } module tenon() //begin our module { translate([hubDiameter*2,hubDiameter*2,0]){ //move entire module away from the hub and the arms difference() { union() { //put objects that need to be added to the design here //part of tenon that gets inserted square([mortiseHeight, (mortiseWidth*3)+2]); //multiply by three because tenon needs to go through 3 layers. Plus a small offset //part of tenon that sticks out translate([-1*mortiseHeight*0.25,(mortiseWidth*3)+2,0]) //move to end of tenon part that gets inserted, plus a small offset //made the 'tab' that sticks out on the end half the height square([mortiseHeight*1.5,5]); } union() { //put objects that need to be subtracted from the design here //slit in tenon to provide flexibility translate([mortiseHeight*0.5,0,0]) //move to end of tenon part that gets inserted square([1, (mortiseWidth*3)+2]); //subtract small slit. Length includes a small offset } } } } //render the objects tri_bumbler(); tenon(); ////uncomment this block to render all three arms at once for visualizing the finished assembly ////diable this before exporting SVG //for (i = [0:2]){ // echo(i); // rotate(i*360/3){ // tri_bumbler(); // } // }